diff --git a/100-bugow-js.html b/100-bugow-js.html index 98af246a9..3429e26c9 100644 --- a/100-bugow-js.html +++ b/100-bugow-js.html @@ -6,14 +6,14 @@ 100 Bugów JS | Codisity - - - + + +
Przejdź do głównej zawartości

100 Bugów JS 🪲

Poznaj lepiej JavaScript, odnajdując drobne błędy w kodzie.

Zapisz się podając swój email, a przez 100 dni będziesz otrzymywał na swoją skrzynkę krótki fragment kodu JavaScript z ukrytym błędem.

Każda wiadomość będzie zawierać również link do rozwiązania.

- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html index bbe1650b7..6affd40ee 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #098

🪲 Znajdź buga

function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
b = 0
}
}
}

console.log(nested(1)(2)(3)(4))

Jak wartość zostanie zalogowana do konsoli?

Czy cały kod w przykładzie jest napisany prawidłowo?

🧪 Rozwiązanie

function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
// b = 0
}
}
}

console.log(nested(1)(2)(3)(4)) // 9

JavaScript umożliwia zamykanie funkcji wewnątrz innej. Umożliwia też zwracanie funkcji z funkcji.

Jest to przydatny sposób np. na przechowywanie informacji w zmiennych, które nie ulegają zniszczeniu po wykonaniu funkcji.

Jest to też efektywny sposób na tworzenie fabryki funkcji, które mogą różnić się stanem początkowym, ale współdzielić tą samą logikę.

Te dwa koncepty w JavaScript'u nazywamy closure czyli domknięcia oraz currying czyli wyprawianie.

Przejdźmy do odnalezienia błędu w kodzie. W naszym przypadku błąd w występuje w postaci próby nadpisania parametru b.

Jest to niemożliwe ze względu na wystąpienie tego fragmentu kodu po wyrażeniu return.

Każde wyrażenie return wewnątrz funkcji zakańcza wykonywanie dalszego jej kodu (z wyjątkiem użycia return w try/catch gdy dodatkowo użyte zostanie finally).

b = 0 jest więc martwym kodem, który nigdy nie zostaje wykonany.

a = 0 jest już jednak skuteczne i nadpisuje przekazany w głównej funkcji nested() parametr a, zmieniając jego wartość na 0.

Sam zapis nested(1)(2)(3)(4) to po prostu ciąg wywołań zagnieżdżonych funkcji, jedna po drugiej.

Wywołanie nested(1) zwraca funkcję zagnieżdżoną na pierwszym poziomie. Funkcja ta z kolei zwraca kolejną funkcję, którą znów możemy wykonać.

Moglibyśmy zapisać to również jako const fn1 = nested(1), a następnie wywołać fn1(2) przypisując zwróconą z takiego wywołania funkcję do kolejnej stałej const fn2 = fn1(2), itd.

Finalnie, wywołanie ostatniej funkcji z całego ciągu zagnieżdżeń, powoduje zsumowanie argumentów przekazanych do każdej z tych funkcji.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html index a8aa79245..7df556332 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
b = 0
}
}
}

console.log(nested(1)(2)(3)(4))
- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html index a88636463..69387c1c6 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jak wartość zostanie zalogowana do konsoli?

Czy cały kod w przykładzie jest napisany prawidłowo?

- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html index ab5a5e905..eecd536c2 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html index 31f9f032e..0edbf18e8 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function nested(a) {
return function (b) {
return function (c) {
return function (d) {
a = 0
return a + b + c + d
}
// b = 0
}
}
}

console.log(nested(1)(2)(3)(4)) // 9
- - + + \ No newline at end of file diff --git a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html index 291ae3eab..93521e2bd 100644 --- a/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html +++ b/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

JavaScript umożliwia zamykanie funkcji wewnątrz innej. Umożliwia też zwracanie funkcji z funkcji.

Jest to przydatny sposób np. na przechowywanie informacji w zmiennych, które nie ulegają zniszczeniu po wykonaniu funkcji.

Jest to też efektywny sposób na tworzenie fabryki funkcji, które mogą różnić się stanem początkowym, ale współdzielić tą samą logikę.

Te dwa koncepty w JavaScript'u nazywamy closure czyli domknięcia oraz currying czyli wyprawianie.

Przejdźmy do odnalezienia błędu w kodzie. W naszym przypadku błąd w występuje w postaci próby nadpisania parametru b.

Jest to niemożliwe ze względu na wystąpienie tego fragmentu kodu po wyrażeniu return.

Każde wyrażenie return wewnątrz funkcji zakańcza wykonywanie dalszego jej kodu (z wyjątkiem użycia return w try/catch gdy dodatkowo użyte zostanie finally).

b = 0 jest więc martwym kodem, który nigdy nie zostaje wykonany.

a = 0 jest już jednak skuteczne i nadpisuje przekazany w głównej funkcji nested() parametr a, zmieniając jego wartość na 0.

Sam zapis nested(1)(2)(3)(4) to po prostu ciąg wywołań zagnieżdżonych funkcji, jedna po drugiej.

Wywołanie nested(1) zwraca funkcję zagnieżdżoną na pierwszym poziomie. Funkcja ta z kolei zwraca kolejną funkcję, którą znów możemy wykonać.

Moglibyśmy zapisać to również jako const fn1 = nested(1), a następnie wywołać fn1(2) przypisując zwróconą z takiego wywołania funkcję do kolejnej stałej const fn2 = fn1(2), itd.

Finalnie, wywołanie ostatniej funkcji z całego ciągu zagnieżdżeń, powoduje zsumowanie argumentów przekazanych do każdej z tych funkcji.

- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html index 363b3792d..316bfe60a 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #029

🪲 Znajdź buga

let booleanValue = false

if (booleanValue = !false) {
console.log("It's not false!")
}

Czy w powyższym przykładzie konsola coś zaloguje, czy nie?

🧪 Rozwiązanie

let booleanValue = false

if (booleanValue === !false) {
console.log("It's not false!")
}

W przykładzie z błędem, w konsoli zostanie zalogowana wartość It's not false!

W kodzie pojawił się błąd wewnątrz instrukcji warunkowej. Zamiast operatora porównania użyty został operator przypisania.

W przypadku operatora przypisania, domyślnie zwracana jest wartość przypisywana.

booleanValue = !false to po prostu przypisanie zanegowanej wartości false, czyli wartości true.

Przypisanie true do zmiennej booleanValue zwraca wartość true, więc instrukcja warunkowa się wykonuje i console.log() zostaje wywołany.

Naprawienie błędu polega na poprawieniu błędnie użytego operatora przypisania i zastąpieniu go operatorem porównania.

Możemy też użyć alternatywnej konstrukcji i zamiast === !false, zapisać to jako !== false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html index 0b8a7b250..a0fb9402d 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let booleanValue = false

if (booleanValue = !false) {
console.log("It's not false!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html index 45a63684b..52e0e1b90 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy w powyższym przykładzie konsola coś zaloguje, czy nie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html index 60707cc5b..4341697ee 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html index 1833f3af6..e041c744c 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let booleanValue = false

if (booleanValue === !false) {
console.log("It's not false!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html index a2267b8b6..9460a7aee 100644 --- a/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html +++ b/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli zostanie zalogowana wartość It's not false!

W kodzie pojawił się błąd wewnątrz instrukcji warunkowej. Zamiast operatora porównania użyty został operator przypisania.

W przypadku operatora przypisania, domyślnie zwracana jest wartość przypisywana.

booleanValue = !false to po prostu przypisanie zanegowanej wartości false, czyli wartości true.

Przypisanie true do zmiennej booleanValue zwraca wartość true, więc instrukcja warunkowa się wykonuje i console.log() zostaje wywołany.

Naprawienie błędu polega na poprawieniu błędnie użytego operatora przypisania i zastąpieniu go operatorem porównania.

Możemy też użyć alternatywnej konstrukcji i zamiast === !false, zapisać to jako !== false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html index b68ebbb77..8d43a36da 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #003

🪲 Znajdź buga

const numA = "8"
const numB = "4"

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)

Jakie wyniki powyższych działań zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const numA = 8
const numB = 4

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)

W przykładzie z błędem, wszystkie działania oprócz "8" + "4" zwrócą poprawne wyniki. Jedynie "8" + "4" zwróci "84".

Aby naprawić ten błąd musimy zapisywać liczby w formacie liczbowym, zamiast jako ciągi znaków.

Wystarczy więc pozbyć się cudzysłowu, zapisując liczby jako 8 i 4.

W przedstawionych działaniach tylko dodawanie zwraca błędny wynik, ponieważ w odróżnieniu od pozostałych operatorów, + ma dwojakie działanie. Sumuje wartości liczbowe lub łączy ciągi znaków.

Jeśli któryś ze składników działania dodawania jest ciągiem znaków, JavaScript zamienia również pozostałe składniki na ciągi znaków i łączy je ze sobą.

"text" + 1 (string + number) zwróci "text1" (string)

5 + "5" (number + string) zwróci "55" (string)

5 + 5 (number + number) zwróci 10 (number)

Pozostałe operatory, przed wykonaniem działania, dokonują konwersji typów danych na typ liczbowy.

Przykładowo, "5" - 5 (string - number) będzie skonwertowane na 5 - 5 (number - number) i zwróci 0 (number).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html index b6b114e7d..c6b796c8c 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numA = "8"
const numB = "4"

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)
- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html index f5b147dbe..7ff683ff3 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wyniki powyższych działań zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html index bc561ee9e..af2c659fb 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html index e836b474f..5f6169e66 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numA = 8
const numB = 4

console.log(numA * numB)
console.log(numA / numB)
console.log(numA + numB)
console.log(numA - numB)
- - + + \ No newline at end of file diff --git a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html index f0eb6368d..a0d316256 100644 --- a/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html +++ b/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, wszystkie działania oprócz "8" + "4" zwrócą poprawne wyniki. Jedynie "8" + "4" zwróci "84".

Aby naprawić ten błąd musimy zapisywać liczby w formacie liczbowym, zamiast jako ciągi znaków.

Wystarczy więc pozbyć się cudzysłowu, zapisując liczby jako 8 i 4.

W przedstawionych działaniach tylko dodawanie zwraca błędny wynik, ponieważ w odróżnieniu od pozostałych operatorów, + ma dwojakie działanie. Sumuje wartości liczbowe lub łączy ciągi znaków.

Jeśli któryś ze składników działania dodawania jest ciągiem znaków, JavaScript zamienia również pozostałe składniki na ciągi znaków i łączy je ze sobą.

"text" + 1 (string + number) zwróci "text1" (string)

5 + "5" (number + string) zwróci "55" (string)

5 + 5 (number + number) zwróci 10 (number)

Pozostałe operatory, przed wykonaniem działania, dokonują konwersji typów danych na typ liczbowy.

Przykładowo, "5" - 5 (string - number) będzie skonwertowane na 5 - 5 (number - number) i zwróci 0 (number).

- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html index 6f0bde7e3..60a7c04ad 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #069

🪲 Znajdź buga

let a
let { a: b = "foo" } = { a }

console.log(a)
console.log(b)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

let a
let { a: b = "foo" } = { a }

console.log(a) // undefined
console.log(b) // "foo"

Przejdźmy po kolei przez operacje jakie wykonuje JavaScript.

Utworzona zostaje zmienna a bez przypisania wartości, czyli jej wartość to undefined.

Operator przypisania = przechodzi do ewaluacji wartości po prawej stronie operatora.

Utworzony zostaje obiekt z własnością a, której wartość to undefined.

Destrukturyzując obiekt, przemianowujemy własność obiektu o nazwie a na nazwę b, tworząc tym samym zmienną b.

Wprowadzony zostaje domyślny parametr "foo", który zostaje przypisany jako wartość zmiennej, w przypadku gdy wartość destrukturyzowanej własności obiektu okazałaby się fałszywa.

Z uwagi na to, że obiekt ma kształt { a: undefined }, to rozbijając go na zmienną a, przemianowaną na b, wartość własności a jest fałszywa, zostaje więc użyty parametr domyślny "foo".

Finalnie utworzona zostaje więc zmienna b z wartością "foo".

Zmienna a nie ulega po drodze żadnym modyfikacjom i zachowuje swoją początkową wartość undefined.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html index ac19b2ac6..89909ab79 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let a
let { a: b = "foo" } = { a }

console.log(a)
console.log(b)
- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html index 26591bcb6..2d073e8f1 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html index 0ac5befa5..96e8f6dde 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html index 315fac9de..a438b8b9a 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let a
let { a: b = "foo" } = { a }

console.log(a) // undefined
console.log(b) // "foo"
- - + + \ No newline at end of file diff --git a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html index 0b92e9d5c..e9f8e0871 100644 --- a/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html +++ b/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Przejdźmy po kolei przez operacje jakie wykonuje JavaScript.

Utworzona zostaje zmienna a bez przypisania wartości, czyli jej wartość to undefined.

Operator przypisania = przechodzi do ewaluacji wartości po prawej stronie operatora.

Utworzony zostaje obiekt z własnością a, której wartość to undefined.

Destrukturyzując obiekt, przemianowujemy własność obiektu o nazwie a na nazwę b, tworząc tym samym zmienną b.

Wprowadzony zostaje domyślny parametr "foo", który zostaje przypisany jako wartość zmiennej, w przypadku gdy wartość destrukturyzowanej własności obiektu okazałaby się fałszywa.

Z uwagi na to, że obiekt ma kształt { a: undefined }, to rozbijając go na zmienną a, przemianowaną na b, wartość własności a jest fałszywa, zostaje więc użyty parametr domyślny "foo".

Finalnie utworzona zostaje więc zmienna b z wartością "foo".

Zmienna a nie ulega po drodze żadnym modyfikacjom i zachowuje swoją początkową wartość undefined.

- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html index a82c58bd2..045bbf07c 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #054

🪲 Znajdź buga

const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar")
func2("foo", "bar")
func3("foo", "bar")
func4("foo", "bar")

Czy powyższe wywołania funkcji, zalogują do konsoli przekazane argumenty?

🧪 Rozwiązanie

const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar") // ["foo", "bar"]
func2("foo", "bar") // ["foo", "bar"]
func3("foo", "bar") // { 0: "foo", 1: "bar"}
func4("foo", "bar") // arguments is not defined

Wywołania func1() i func2() zalogują do konsoli to samo, czyli tablice z listą przekazanych argumentów.

Nazwę parametru reszty (występującego po wielokropku) możemy zdefiniować dowolnie, nie musi nazywać się arguments.

Następnie w tak zdefiniowanym parametrze reszty otrzymujemy dostęp do tablicy z pozostałymi parametrami przekazanymi do funkcji.

Pozostałymi, czyli jeśli w funkcji zdefiniujemy np. func(a, ...rest), to w rest będziemy mieli dostęp do tablicy z resztą parametrów, bez parametru a.

W kolejnych funkcjach, func3() i func4() wywołane zostały predefiniowane obiekty arguments.

Funkcje mają dostęp do takiego obiektu, mimo, że nie jest on wyraźnie zadeklarowany. Podobna sytuacja ma miejsce np. z this.

Analogicznie do this, obiekt arguments jest dostępny tylko w przypadku deklaracji funkcji z użyciem słowa kluczowego function. Jeśli zdefiniowana funkcja jest funkcją strzałkową, wtedy obiekt arguments nie jest dostępny.

W wywołaniu func4() JavaScript wyrzuci więc błąd ReferenceError: arguments is not defined.

Jeśli jednak sprawdzisz kod w środowisku StackBlitz (Plac zabaw poniżej), obiekt arguments wewnątrz funkcji strzałkowej zwróci dziwne rzeczy.

Jest to spowodowane zdefiniowaniem obiektu arguments w globalnym zakresie poprzez StackBlitz i to samo zostanie zwrócone gdy wywołamy console.log(arguments) bezpośrednio w globalnym polu, bez zagnieżdżania go w funkcji

Podsumowując, preferowane jest używanie parametru reszty, zamiast predefiniowanego obiektu arguments.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html index 195830d29..c5f3535e2 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar")
func2("foo", "bar")
func3("foo", "bar")
func4("foo", "bar")
- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html index cdac3af2d..a05b23a6e 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy powyższe wywołania funkcji, zalogują do konsoli przekazane argumenty?

- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html index c9b602d2d..ace3f9b78 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html index ff11e554d..d225f8cdf 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const func1 = function (...arguments) {
console.log(arguments)
}
const func2 = (...arguments) => {
console.log(arguments)
}

const func3 = function (a, b) {
console.log(arguments)
}
const func4 = (a, b) => {
console.log(arguments)
}

func1("foo", "bar") // ["foo", "bar"]
func2("foo", "bar") // ["foo", "bar"]
func3("foo", "bar") // { 0: "foo", 1: "bar"}
func4("foo", "bar") // arguments is not defined
- - + + \ No newline at end of file diff --git a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html index 60206d5f1..cf3ab5dd9 100644 --- a/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html +++ b/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wywołania func1() i func2() zalogują do konsoli to samo, czyli tablice z listą przekazanych argumentów.

Nazwę parametru reszty (występującego po wielokropku) możemy zdefiniować dowolnie, nie musi nazywać się arguments.

Następnie w tak zdefiniowanym parametrze reszty otrzymujemy dostęp do tablicy z pozostałymi parametrami przekazanymi do funkcji.

Pozostałymi, czyli jeśli w funkcji zdefiniujemy np. func(a, ...rest), to w rest będziemy mieli dostęp do tablicy z resztą parametrów, bez parametru a.

W kolejnych funkcjach, func3() i func4() wywołane zostały predefiniowane obiekty arguments.

Funkcje mają dostęp do takiego obiektu, mimo, że nie jest on wyraźnie zadeklarowany. Podobna sytuacja ma miejsce np. z this.

Analogicznie do this, obiekt arguments jest dostępny tylko w przypadku deklaracji funkcji z użyciem słowa kluczowego function. Jeśli zdefiniowana funkcja jest funkcją strzałkową, wtedy obiekt arguments nie jest dostępny.

W wywołaniu func4() JavaScript wyrzuci więc błąd ReferenceError: arguments is not defined.

Jeśli jednak sprawdzisz kod w środowisku StackBlitz (Plac zabaw poniżej), obiekt arguments wewnątrz funkcji strzałkowej zwróci dziwne rzeczy.

Jest to spowodowane zdefiniowaniem obiektu arguments w globalnym zakresie poprzez StackBlitz i to samo zostanie zwrócone gdy wywołamy console.log(arguments) bezpośrednio w globalnym polu, bez zagnieżdżania go w funkcji

Podsumowując, preferowane jest używanie parametru reszty, zamiast predefiniowanego obiektu arguments.

- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html index bbdb82bd3..f9532a083 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #008

🪲 Znajdź buga

function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = (distance) => {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)

Chcemy stworzyć obiekt samochodu, który będzie zwiększał swój przebieg (mileage) podczas jazdy, o wartość przekazaną w argumencie metody drive().

Jaki przebieg zostanie zalogowany do konsoli dla obiektu myCar?

🧪 Rozwiązanie

function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = function (distance) {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)

W przykładzie z błędem, wartość mileage obiektu myCar wyniesie 0.

Niedziałanie zwiększania wartości przez this.mileage += distance wynika z tego, że funkcje strzałkowe nie mają własnego this i nie powinny być używane jako metody obiektów.

this.milage nie odnosi się więc do obiektu, tak jakbyśmy tego chcieli.

Aby naprawić ten problem, musimy zamienić funkcję strzałkową drive na zwykłą funkcję.

Po tej zmianie, obiekt myCar zwróci już wartość mileage równą 1000.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html index 0f9122c17..6a40824e6 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = (distance) => {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)
- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html index 0e118bb87..91fe43f9b 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy stworzyć obiekt samochodu, który będzie zwiększał swój przebieg (mileage) podczas jazdy, o wartość przekazaną w argumencie metody drive().

Jaki przebieg zostanie zalogowany do konsoli dla obiektu myCar?

- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html index 5d9a75377..f1b427058 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html index c768360fb..ea19abf62 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function Car(color) {
this.color = color
this.mileage = 0
}

Car.prototype.drive = function (distance) {
this.mileage += distance
}

const myCar = new Car("red")
myCar.drive(1000)

console.log(myCar)
- - + + \ No newline at end of file diff --git a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html index 8242e4c94..35c6b2274 100644 --- a/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html +++ b/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, wartość mileage obiektu myCar wyniesie 0.

Niedziałanie zwiększania wartości przez this.mileage += distance wynika z tego, że funkcje strzałkowe nie mają własnego this i nie powinny być używane jako metody obiektów.

this.milage nie odnosi się więc do obiektu, tak jakbyśmy tego chcieli.

Aby naprawić ten problem, musimy zamienić funkcję strzałkową drive na zwykłą funkcję.

Po tej zmianie, obiekt myCar zwróci już wartość mileage równą 1000.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html index 7fcc81fe1..700fcc87d 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #048

🪲 Znajdź buga

console.log({} instanceof Object)

console.log([] instanceof Array)
console.log([] instanceof Object)

console.log((() => {}) instanceof Function)
console.log((() => {}) instanceof Object)

console.log("foo" instanceof String)
console.log(String("foo") instanceof String)
console.log(new String("foo") instanceof String)

console.log("foo" instanceof Object)
console.log(String("foo") instanceof Object)
console.log(new String("foo") instanceof Object)

Czy w JavaScript wszystko jest obiektem?

Jakie wartości logiczne zostaną zalogowane do konsoli dla poszczególnych wywołań instanceof ?

🧪 Rozwiązanie

console.log({} instanceof Object) // true

console.log([] instanceof Array) // true
console.log([] instanceof Object) // true

console.log((() => {}) instanceof Function) // true
console.log((() => {}) instanceof Object) // true

console.log("foo" instanceof String) // false
console.log(String("foo") instanceof String) // false
console.log(new String("foo") instanceof String) // true

console.log("foo" instanceof Object) // false
console.log(String("foo") instanceof Object) // false
console.log(new String("foo") instanceof Object) // true

Można by błędnie założyć, że instanceof sprawdza czy obiekt został utworzony przez dany konstruktor, czyli, czy jego instancja została utworzona poprzez wywołanie new na funkcji konstruującej obiekt.

W rzeczywistości instanceof sprawdza jednak, czy utworzona instancja obiektu ma w całym swoim łańcuchu prototypów dany konstruktor.

W JavaScript obiekty dziedziczą po sobie przekazując swoje prototypy, jednocześnie tworząc łańcuch, w którym "foo".__proto__.constructor zwróci String, a "foo".__proto__.__proto__.constructor zwróci Object.

Ciąg znaków dziedziczy więc w łańcuchu prototypów zarówno konstruktor String, jak i Object.

Podobnie wygląda sytuacja w przypadku innych typów danych.

Obiekt daty będzie miał w swoim łańcuchu prototypów zarówno konstruktor Date, jak i Object.

Tablica (array) również będzie miała w swoim łańcuchu prototypów konstruktor Array, jak i Object.

Funkcja również, Function i Object.

Nie bez powodu mówi się, że w JavaScript wszystko jest obiektem.

Typy prymitywne (jak np. ciąg znaków) z użyciem instanceof nie będą się jednak przedstawiały jako instancje Object, mimo, że w łańcuchu prototypów jasno widać, że "foo".__proto__.__proto__.constructor to Object.

NaN również nie przedstawi się jako instancja obiektu, ale w swoim łańcuchu prototypów ma konstruktor Number i Object.

Podobnie w przypadku wartości logicznych true i false. Tak jak wartości prymitywne, nie zgłoszą się one jako instancja obiektu, ale mają w swoim łańcuchu prototypów konstruktory Boolean i Object.

Jedynie wartości null i undefined nie mają swoich prototypów i konstruktorów, ale żeby było śmieszniej typeof null zwróci object. Jest to jednak uznawane za znany bug w języku JavaScript i ze względu na zachowanie kompatybilności wstecznej, nie zostaje naprawiany.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html index 67a59e88d..7a11cd830 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log({} instanceof Object)

console.log([] instanceof Array)
console.log([] instanceof Object)

console.log((() => {}) instanceof Function)
console.log((() => {}) instanceof Object)

console.log("foo" instanceof String)
console.log(String("foo") instanceof String)
console.log(new String("foo") instanceof String)

console.log("foo" instanceof Object)
console.log(String("foo") instanceof Object)
console.log(new String("foo") instanceof Object)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html index b07a16afe..891cbb643 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy w JavaScript wszystko jest obiektem?

Jakie wartości logiczne zostaną zalogowane do konsoli dla poszczególnych wywołań instanceof ?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html index 30cb94054..4c0c9a1a7 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html index 146f39a1c..f78266347 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log({} instanceof Object) // true

console.log([] instanceof Array) // true
console.log([] instanceof Object) // true

console.log((() => {}) instanceof Function) // true
console.log((() => {}) instanceof Object) // true

console.log("foo" instanceof String) // false
console.log(String("foo") instanceof String) // false
console.log(new String("foo") instanceof String) // true

console.log("foo" instanceof Object) // false
console.log(String("foo") instanceof Object) // false
console.log(new String("foo") instanceof Object) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html index 1aba8030e..e092770e7 100644 --- a/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html +++ b/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Można by błędnie założyć, że instanceof sprawdza czy obiekt został utworzony przez dany konstruktor, czyli, czy jego instancja została utworzona poprzez wywołanie new na funkcji konstruującej obiekt.

W rzeczywistości instanceof sprawdza jednak, czy utworzona instancja obiektu ma w całym swoim łańcuchu prototypów dany konstruktor.

W JavaScript obiekty dziedziczą po sobie przekazując swoje prototypy, jednocześnie tworząc łańcuch, w którym "foo".__proto__.constructor zwróci String, a "foo".__proto__.__proto__.constructor zwróci Object.

Ciąg znaków dziedziczy więc w łańcuchu prototypów zarówno konstruktor String, jak i Object.

Podobnie wygląda sytuacja w przypadku innych typów danych.

Obiekt daty będzie miał w swoim łańcuchu prototypów zarówno konstruktor Date, jak i Object.

Tablica (array) również będzie miała w swoim łańcuchu prototypów konstruktor Array, jak i Object.

Funkcja również, Function i Object.

Nie bez powodu mówi się, że w JavaScript wszystko jest obiektem.

Typy prymitywne (jak np. ciąg znaków) z użyciem instanceof nie będą się jednak przedstawiały jako instancje Object, mimo, że w łańcuchu prototypów jasno widać, że "foo".__proto__.__proto__.constructor to Object.

NaN również nie przedstawi się jako instancja obiektu, ale w swoim łańcuchu prototypów ma konstruktor Number i Object.

Podobnie w przypadku wartości logicznych true i false. Tak jak wartości prymitywne, nie zgłoszą się one jako instancja obiektu, ale mają w swoim łańcuchu prototypów konstruktory Boolean i Object.

Jedynie wartości null i undefined nie mają swoich prototypów i konstruktorów, ale żeby było śmieszniej typeof null zwróci object. Jest to jednak uznawane za znany bug w języku JavaScript i ze względu na zachowanie kompatybilności wstecznej, nie zostaje naprawiany.

- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html index 39be68327..9e95e51b4 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #088

🪲 Znajdź buga

const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000)
console.log(date_1999_ < date_2001)
console.log(date_1999 < date_1999)
console.log(date_1999 < date_1999_)
console.log(date_1999 == date_1999)
console.log(date_1999 == date_1999_)
console.log(date_1999 <= date_1999_)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000) // true
console.log(date_1999_ < date_2001) // true
console.log(date_1999 < date_1999) // false
console.log(date_1999 < date_1999_) // false
console.log(date_1999 == date_1999) // true
console.log(date_1999 == date_1999_) // false
console.log(date_1999 <= date_1999_) // true

Daty przypisane do stałych date_1999 i date_1999_ są takie same.

Są jednak różnymi obiektami i porównywanie ich za pomocą operatora == lub === zawsze zwróci fałsz.

Prawda z takiego porównania zostanie zwrócona tylko wtedy, gdy porównywany ze sobą będzie ten sam referencyjny obiekt.

Moglibyśmy stworzyć alias np. const date_1999_x = date_1999.

Wtedy porównanie date_1999_x == date_1999 zwróciłoby prawdę.

Wiązałoby się to jednak też i z innymi implikacjami jakie niosą za sobą aliasy obiektów w JavaScript.

Mutując taki alias lub referencyjny obiekt, zmieniałby się on jednocześnie w obu stałych/zmiennych.

Operator <, ale również i <= oraz ich odwrotności > i >=, działają na podstawie innego algorytmu niż ==

Porównywane są tutaj wartości liczbowe, do których zostaną sprowadzone operandy (w naszym przypadku obiekty dat).

Nie ma znaczenia czy wartości są przekazywane jako referencja.

Jeśli chcemy więc porównać dwie daty pod kątem, która data jest wcześniejsza (mniejsza) lub późniejsza (większa), to używanie operatorów <, <=, >, >= nadaje się bardzo dobrze.

Jeśli chcemy jednak dowiedzieć się, czy dwie daty są identyczne, musimy najpierw samodzielnie sprowadzić je do wartości liczbowych np. metodą getTime().

Dopiero tak zaprezentowane daty w postaci wartości liczbowych możemy porównywać za pomocą == lub ===.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html index 5b2d87cd7..39ae21b26 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000)
console.log(date_1999_ < date_2001)
console.log(date_1999 < date_1999)
console.log(date_1999 < date_1999_)
console.log(date_1999 == date_1999)
console.log(date_1999 == date_1999_)
console.log(date_1999 <= date_1999_)
- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html index 3cdd3c455..79a473c40 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html index 28165496f..ef308286b 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html index 373e6a2de..b78495695 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const date_1999 = new Date("1999-01-01")
const date_1999_ = new Date("1999-01-01")
const date_2000 = new Date("2000-01-01")
const date_2001 = new Date("2001-01-01")

console.log(date_1999 < date_2000) // true
console.log(date_1999_ < date_2001) // true
console.log(date_1999 < date_1999) // false
console.log(date_1999 < date_1999_) // false
console.log(date_1999 == date_1999) // true
console.log(date_1999 == date_1999_) // false
console.log(date_1999 <= date_1999_) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html index 24e21550c..4f4a44b32 100644 --- a/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html +++ b/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Daty przypisane do stałych date_1999 i date_1999_ są takie same.

Są jednak różnymi obiektami i porównywanie ich za pomocą operatora == lub === zawsze zwróci fałsz.

Prawda z takiego porównania zostanie zwrócona tylko wtedy, gdy porównywany ze sobą będzie ten sam referencyjny obiekt.

Moglibyśmy stworzyć alias np. const date_1999_x = date_1999.

Wtedy porównanie date_1999_x == date_1999 zwróciłoby prawdę.

Wiązałoby się to jednak też i z innymi implikacjami jakie niosą za sobą aliasy obiektów w JavaScript.

Mutując taki alias lub referencyjny obiekt, zmieniałby się on jednocześnie w obu stałych/zmiennych.

Operator <, ale również i <= oraz ich odwrotności > i >=, działają na podstawie innego algorytmu niż ==

Porównywane są tutaj wartości liczbowe, do których zostaną sprowadzone operandy (w naszym przypadku obiekty dat).

Nie ma znaczenia czy wartości są przekazywane jako referencja.

Jeśli chcemy więc porównać dwie daty pod kątem, która data jest wcześniejsza (mniejsza) lub późniejsza (większa), to używanie operatorów <, <=, >, >= nadaje się bardzo dobrze.

Jeśli chcemy jednak dowiedzieć się, czy dwie daty są identyczne, musimy najpierw samodzielnie sprowadzić je do wartości liczbowych np. metodą getTime().

Dopiero tak zaprezentowane daty w postaci wartości liczbowych możemy porównywać za pomocą == lub ===.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html index f52e56515..d9c3aa758 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #016

🪲 Znajdź buga

const myDog = new Dog()
const myCat = new Cat()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

console.log(myDog.name)
console.log(myCat.name)

Czy przedstawiony kod zadziała poprawnie? Jeśli nie, to gdzie kryje się błąd?

🧪 Rozwiązanie

const myDog = new Dog()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

const myCat = new Cat()

console.log(myDog.name)
console.log(myCat.name)

Uruchomienie kodu z błędem wyrzuci nam do konsoli błąd Cannot access 'Cat' before initialization.

W JavaScript deklaracje funkcji oraz zmiennych definiowanych wyrażeniem var są podciągane na początek wykonywanego kodu. Własność tą z j. angielskiego nazywamy hoisting.

Hoisting w JS oznacza, że możemy najpierw wywołać funkcję, a dopiero w dalszej części kodu ją zdefiniować.

Nie możemy jednak zrobić tego samego z klasą. Deklaracja class nie jest podciągana, przez co nie możemy jej wywołać przed jej zdeklarowaniem.

I dokładnie to jest powodem wystąpienia błędu w wcześniej przedstawionym błędnym kodzie.

Aby naprawić błąd, musimy po prostu przenieść wywołanie new Cat() do dalszej części kodu, aby wywołanie nastąpiło już po deklaracji klasy.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html index b0eca6630..67be559f1 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myDog = new Dog()
const myCat = new Cat()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

console.log(myDog.name)
console.log(myCat.name)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html index ff0dfe427..9146b01a1 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy przedstawiony kod zadziała poprawnie? Jeśli nie, to gdzie kryje się błąd?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html index 31059c9a3..7fb1dc84d 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html index 9a94aa549..ea79329dc 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myDog = new Dog()

function Dog() {
this.name = "Pluto"
}

class Cat {
constructor() {
this.name = "Garfield"
}
}

const myCat = new Cat()

console.log(myDog.name)
console.log(myCat.name)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html index 77cca05c6..744f62c85 100644 --- a/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html +++ b/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Uruchomienie kodu z błędem wyrzuci nam do konsoli błąd Cannot access 'Cat' before initialization.

W JavaScript deklaracje funkcji oraz zmiennych definiowanych wyrażeniem var są podciągane na początek wykonywanego kodu. Własność tą z j. angielskiego nazywamy hoisting.

Hoisting w JS oznacza, że możemy najpierw wywołać funkcję, a dopiero w dalszej części kodu ją zdefiniować.

Nie możemy jednak zrobić tego samego z klasą. Deklaracja class nie jest podciągana, przez co nie możemy jej wywołać przed jej zdeklarowaniem.

I dokładnie to jest powodem wystąpienia błędu w wcześniej przedstawionym błędnym kodzie.

Aby naprawić błąd, musimy po prostu przenieść wywołanie new Cat() do dalszej części kodu, aby wywołanie nastąpiło już po deklaracji klasy.

- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html index 8f56ab313..a626076a0 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #049

🪲 Znajdź buga

const numbers = [43, 12, 1, 5, 26]

console.log(numbers.sort())

Chcemy posortować tablicę z liczbami od najmniejszej do największej.

Czy do konsoli zostanie zalogowana właściwa kolejność?

🧪 Rozwiązanie

const numbers = [43, 12, 1, 5, 26]
const compareNumbers = (a, b) => a - b

console.log(numbers.sort(compareNumbers))

W przykładzie z błędem zostanie zalogowana tablica 1,12,26,43,5.

Wyraźnie została ona zmieniona względem oryginału, ale sortowanie nastąpiło nie według wartości liczbowych, a alfabetycznych.

Domyślne działanie metody sort() polega na sprowadzeniu porównywanych wartości do ciągów znaków i posortowaniu ich według tablicy kodowania znaków UTF-16.

1 występuje przed 2 tak samo jak a przed b.

Kolejność 1,12,26... można więc porównać np. do a,ab,bf....

Aby posortować wartości z tablicy pod kątem liczbowym, musimy samodzielnie napisać funkcję porównującą i przekazać ją jako argument do funkcji sort().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html index 7ee522f7a..e3df4629d 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [43, 12, 1, 5, 26]

console.log(numbers.sort())
- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html index fe97bc345..0fe4d9554 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy posortować tablicę z liczbami od najmniejszej do największej.

Czy do konsoli zostanie zalogowana właściwa kolejność?

- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html index 55f279166..cdf08edfe 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html index 4341cecfc..ca6699443 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [43, 12, 1, 5, 26]
const compareNumbers = (a, b) => a - b

console.log(numbers.sort(compareNumbers))
- - + + \ No newline at end of file diff --git a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html index d75b94322..dbe00575a 100644 --- a/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html +++ b/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem zostanie zalogowana tablica 1,12,26,43,5.

Wyraźnie została ona zmieniona względem oryginału, ale sortowanie nastąpiło nie według wartości liczbowych, a alfabetycznych.

Domyślne działanie metody sort() polega na sprowadzeniu porównywanych wartości do ciągów znaków i posortowaniu ich według tablicy kodowania znaków UTF-16.

1 występuje przed 2 tak samo jak a przed b.

Kolejność 1,12,26... można więc porównać np. do a,ab,bf....

Aby posortować wartości z tablicy pod kątem liczbowym, musimy samodzielnie napisać funkcję porównującą i przekazać ją jako argument do funkcji sort().

- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html index c004d66c8..629377247 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #025

🪲 Znajdź buga

function sum(a, b) {
return a + b
}

function sum(a, b, c) {
return a + b + c
}

console.log(sum(1, 2))

Chcemy przeciążyć funkcję, tj. zdefiniować kolejną funkcję o tej samej nazwie, ale z innymi parametrami.

Jaki będzie efekt wywołania powyższego kodu?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

function sum(a, b, c) {
return a + b + c
}

function sum(a, b) {
return a + b
}

console.log(sum(1, 2))

W błędnym przykładzie, wywołanie funkcji sum(1, 2) zaloguje do konsoli wartość NaN.

JavaScript w przeciwieństwie do innych języków np. C++, Java, Swift, nie pozwala na przeciążanie funkcji, czyli deklarowania ich używając tej samej nazwy funkcji ale z innymi parametrami.

Co ciekawe TypeScript zezwala na definiowanie funkcji przeciążających.

O ile przeciążanie funkcji nie jest możliwe w JavaScript, to nadpisywanie ich już jak najbardziej tak.

Nie dostajemy więc błędu o zdefiniowaniu funkcji z nazwą, która już istnieje, bo jest to dozwolone.

Do konsoli zostaje zalogowane NaN (skrót od Not-A-Number), bo JavaScript nie może wykonywać operacji matematycznych na typach danych innych niż Number.

Nadpisując funkcję sum(), nadpisujemy ją deklarując w jej nowej wersji trzy parametry.

Wywołując sum() przekazujemy tylko dwa argumenty. Trzeci, brakujący, używany wewnątrz funkcji jako parametr pozostaje niezdefiniowany.

Operacja wewnątrz funkcji 1 + 2 + undefined zwraca więc NaN.

Aby rozwiązać problem, najprościej będzie nam nadpisać funkcję w odwrotnej kolejności, lub kompletnie pozbyć się deklaracji funkcji sum() z trzema parametrami.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html index 287cd22de..edc876b00 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function sum(a, b) {
return a + b
}

function sum(a, b, c) {
return a + b + c
}

console.log(sum(1, 2))
- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html index 500a21f47..48a15a315 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy przeciążyć funkcję, tj. zdefiniować kolejną funkcję o tej samej nazwie, ale z innymi parametrami.

Jaki będzie efekt wywołania powyższego kodu?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html index 1d7f4b979..2f9edd22b 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html index 4190ef1ed..2a3ff21e8 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function sum(a, b, c) {
return a + b + c
}

function sum(a, b) {
return a + b
}

console.log(sum(1, 2))
- - + + \ No newline at end of file diff --git a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html index ee19135f7..feb181825 100644 --- a/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html +++ b/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W błędnym przykładzie, wywołanie funkcji sum(1, 2) zaloguje do konsoli wartość NaN.

JavaScript w przeciwieństwie do innych języków np. C++, Java, Swift, nie pozwala na przeciążanie funkcji, czyli deklarowania ich używając tej samej nazwy funkcji ale z innymi parametrami.

Co ciekawe TypeScript zezwala na definiowanie funkcji przeciążających.

O ile przeciążanie funkcji nie jest możliwe w JavaScript, to nadpisywanie ich już jak najbardziej tak.

Nie dostajemy więc błędu o zdefiniowaniu funkcji z nazwą, która już istnieje, bo jest to dozwolone.

Do konsoli zostaje zalogowane NaN (skrót od Not-A-Number), bo JavaScript nie może wykonywać operacji matematycznych na typach danych innych niż Number.

Nadpisując funkcję sum(), nadpisujemy ją deklarując w jej nowej wersji trzy parametry.

Wywołując sum() przekazujemy tylko dwa argumenty. Trzeci, brakujący, używany wewnątrz funkcji jako parametr pozostaje niezdefiniowany.

Operacja wewnątrz funkcji 1 + 2 + undefined zwraca więc NaN.

Aby rozwiązać problem, najprościej będzie nam nadpisać funkcję w odwrotnej kolejności, lub kompletnie pozbyć się deklaracji funkcji sum() z trzema parametrami.

- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html index 94f375fd4..d99351092 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #061

🪲 Znajdź buga

const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1)
console.log(promise2)

promise2.then((value) => {
console.log(value)
console.log(value === promise1)
})

Mamy 2 obietnice: promise1 rozwiązuje się zwracając wartość foo, a promise2 rozwiązuje się zwracając promise1.

Co zostanie zalogowane do konsoli w poszczególnych miejscach?

Czy rozwiązanie promise2 poprzez then zwróci w value tą samą obietnicę, która została przekazana w resolve()?

🧪 Rozwiązanie

const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1) // Promise {}
console.log(promise2) // Promise {}

promise2.then((value) => {
console.log(value) // foo
console.log(value === promise1) // false
})

promise1 i promise2 to obiekty Promise, co jest wyraźnie logowane do konsoli w liniach 8 i 9.

promise2, mimo że w założeniu rozwiązuje się do obiektu promise1, finalnie zostaje rozwiązane do wartości foo.

resolve() spłaszcza przekazane obietnice jeśli takie zostają przekazane jako wartość rozwiązania obietnicy i rozwiązuje je wszystkie.

value po rozwiązaniu promise2, będzie więc wartością przekazaną w resolve() w promise1.

value === promise1 zwróci więc fałsz, bo value to foo, a nie obiekt obietnicy promise1.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html index 09bb19185..cf4a94030 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1)
console.log(promise2)

promise2.then((value) => {
console.log(value)
console.log(value === promise1)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html index 8c3528f66..e4334f79d 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Mamy 2 obietnice: promise1 rozwiązuje się zwracając wartość foo, a promise2 rozwiązuje się zwracając promise1.

Co zostanie zalogowane do konsoli w poszczególnych miejscach?

Czy rozwiązanie promise2 poprzez then zwróci w value tą samą obietnicę, która została przekazana w resolve()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html index 608ea000a..bc3b53f94 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html index 3af410051..a1b746b8a 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1) // Promise {}
console.log(promise2) // Promise {}

promise2.then((value) => {
console.log(value) // foo
console.log(value === promise1) // false
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html index 7bf3399e4..ed2541486 100644 --- a/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html +++ b/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

promise1 i promise2 to obiekty Promise, co jest wyraźnie logowane do konsoli w liniach 8 i 9.

promise2, mimo że w założeniu rozwiązuje się do obiektu promise1, finalnie zostaje rozwiązane do wartości foo.

resolve() spłaszcza przekazane obietnice jeśli takie zostają przekazane jako wartość rozwiązania obietnicy i rozwiązuje je wszystkie.

value po rozwiązaniu promise2, będzie więc wartością przekazaną w resolve() w promise1.

value === promise1 zwróci więc fałsz, bo value to foo, a nie obiekt obietnicy promise1.

- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html index b71033332..e7bd60673 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #041

🪲 Znajdź buga

const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4 === "Hello World")

Czy wszystkie porównania zalogują do konsoli wartość true?

🧪 Rozwiązanie

const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4.toString() === "Hello World")

W przykładzie z błędem, do konsoli zostanie zalogowana wartość false dla ostatniego porównania z str4.

Użycie operatora new tworzy nową instancję obiektu. Zwracana wartość jest więc obiektem, a nie typem prymitywnym string.

Operator new służy do stworzenia instancji obiektu w oparciu o konstruktor. W języku JavaScript konstruktorem może być funkcja o nazwie constructor, znajdująca się wewnątrz definicji klasy (class), ale nie musi. Może to być też samodzielna funkcja o dowolnej nazwie.

Ścisłe porównanie obiektu z wartością prymitywną prowadzi więc do zwrócenia fałszu.

Aby w czwartym porównaniu uzyskać true musimy na utworzonym obiekcie String wywołać metodę toString(), która wyciągnie z obiektu wartość prymitywną "Hello World" typu string.

Sytuacja z odrębnym zachowaniem się funkcji w zależności od tego czy została ona wywołana z, czy bez operatora new wygląda podobnie również w przypadku innych funkcji, w tym tych predefiniowanych jak String, Number, czy Boolean.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html index 94cc1b689..823ddd11f 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4 === "Hello World")
- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html index 44c0fa6ac..ca8b526e7 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy wszystkie porównania zalogują do konsoli wartość true?

- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html index 909c2aae5..c23fab0b7 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html index 9e65c446a..353a458a9 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const str1 = "Hello World"
const str2 = `${"Hello World"}`
const str3 = String("Hello World")
const str4 = new String("Hello World")

console.log(str1 === "Hello World")
console.log(str2 === "Hello World")
console.log(str3 === "Hello World")
console.log(str4.toString() === "Hello World")
- - + + \ No newline at end of file diff --git a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html index feb631a71..79498ddb5 100644 --- a/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html +++ b/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie zalogowana wartość false dla ostatniego porównania z str4.

Użycie operatora new tworzy nową instancję obiektu. Zwracana wartość jest więc obiektem, a nie typem prymitywnym string.

Operator new służy do stworzenia instancji obiektu w oparciu o konstruktor. W języku JavaScript konstruktorem może być funkcja o nazwie constructor, znajdująca się wewnątrz definicji klasy (class), ale nie musi. Może to być też samodzielna funkcja o dowolnej nazwie.

Ścisłe porównanie obiektu z wartością prymitywną prowadzi więc do zwrócenia fałszu.

Aby w czwartym porównaniu uzyskać true musimy na utworzonym obiekcie String wywołać metodę toString(), która wyciągnie z obiektu wartość prymitywną "Hello World" typu string.

Sytuacja z odrębnym zachowaniem się funkcji w zależności od tego czy została ona wywołana z, czy bez operatora new wygląda podobnie również w przypadku innych funkcji, w tym tych predefiniowanych jak String, Number, czy Boolean.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html index d1f619c88..cd30948e4 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #097

🪲 Znajdź buga

const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2)
console.log(sym1 === sym1)

console.log(obj1 === obj2)
console.log(obj1 === obj1)

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1])
console.log(test[sym2])

console.log(test[obj1])
console.log(test[obj2])

console.log(test)

Jaki wartości zostaną zalogowane do konsoli?

Czy są jakieś różnice pomiędzy użyciem obiektu, a symbolu jako nazwy własności innego obiektu?

🧪 Rozwiązanie

const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2) // false
console.log(sym1 === sym1) // true

console.log(obj1 === obj2) // false
console.log(obj1 === obj1) // true

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1]) // "Foo"
console.log(test[sym2]) // "Bar"

console.log(test[obj1]) // "Qux"
console.log(test[obj2]) // "Qux"

console.log(test) // {[object Object]: "Qux"}

Porównywanie ze sobą symboli oraz obiektów, które zostały zdefiniowane niezależnie, da nam ten same efekt - fałsz.

Jedynie porównywanie tych samych stałych, które przechowują dany obiekt lub symbol zwróci prawdę.

Wówczas porównywane będą rzeczywiście te same obiekty/symbole, przechowywane w pamięci pod adresem na który wskazuje dana stała.

Na tym etapie podobieństwa obiektów i symboli z grubsza się kończą.

Symbole z natury służą do utworzenia unikalnej wartości.

Nie są też konwertowane do ciągu znaków w sytuacjach wymuszających tego typu operację.

test[sym1] i test[sym2] zalogują do konsoli "Foo" i "Bar".

Co ważne, test[Symbol()] zwróci undefined, bo jak już wcześniej ustaliliśmy, każdy nowo utworzony symbol jest unikalny.

Jednocześnie własności zdefiniowane za pomocą symboli nie będą widoczne po zalogowania do konsoli obiektu test (będą prywatne).

Nazwy własności w test[obj1] i test[obj2] ulegną konwersji do ciągu znaków "[object Object]".

Istotne jest aby omyłkowo nie zinterpretować takiego zapisu jako tablicy z elementami object i Object.

"[object Object]" to zwykły ciąg znaków powstający w wyniku konwersji ({}).toString()

Ten sam ciąg znaków użyty dwukrotnie jako nazwa własności obiektu test powoduje, że każde kolejne jego użycie nadpisuje poprzednio zdefiniowaną własność o tej samej nazwie.

test[obj1] i test[obj2] logują do konsoli "Qux" bo taka wartość została przypisana jako ostatnia dla test["[object Object]"].

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html index 4c138ae2b..ca4a3a69a 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2)
console.log(sym1 === sym1)

console.log(obj1 === obj2)
console.log(obj1 === obj1)

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1])
console.log(test[sym2])

console.log(test[obj1])
console.log(test[obj2])

console.log(test)
- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html index 04990ed04..c23e73513 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jaki wartości zostaną zalogowane do konsoli?

Czy są jakieś różnice pomiędzy użyciem obiektu, a symbolu jako nazwy własności innego obiektu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html index 7ddf4803e..1a5b4c3cc 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html index 7fe79636b..54bdf6a21 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const sym1 = Symbol()
const sym2 = Symbol()

const obj1 = {}
const obj2 = {}

console.log(sym1 === sym2) // false
console.log(sym1 === sym1) // true

console.log(obj1 === obj2) // false
console.log(obj1 === obj1) // true

const test = {}

test[sym1] = "Foo"
test[sym2] = "Bar"

test[obj1] = "Baz"
test[obj2] = "Qux"

console.log(test[sym1]) // "Foo"
console.log(test[sym2]) // "Bar"

console.log(test[obj1]) // "Qux"
console.log(test[obj2]) // "Qux"

console.log(test) // {[object Object]: "Qux"}
- - + + \ No newline at end of file diff --git a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html index ae7d7aea6..f2922fab1 100644 --- a/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html +++ b/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Porównywanie ze sobą symboli oraz obiektów, które zostały zdefiniowane niezależnie, da nam ten same efekt - fałsz.

Jedynie porównywanie tych samych stałych, które przechowują dany obiekt lub symbol zwróci prawdę.

Wówczas porównywane będą rzeczywiście te same obiekty/symbole, przechowywane w pamięci pod adresem na który wskazuje dana stała.

Na tym etapie podobieństwa obiektów i symboli z grubsza się kończą.

Symbole z natury służą do utworzenia unikalnej wartości.

Nie są też konwertowane do ciągu znaków w sytuacjach wymuszających tego typu operację.

test[sym1] i test[sym2] zalogują do konsoli "Foo" i "Bar".

Co ważne, test[Symbol()] zwróci undefined, bo jak już wcześniej ustaliliśmy, każdy nowo utworzony symbol jest unikalny.

Jednocześnie własności zdefiniowane za pomocą symboli nie będą widoczne po zalogowania do konsoli obiektu test (będą prywatne).

Nazwy własności w test[obj1] i test[obj2] ulegną konwersji do ciągu znaków "[object Object]".

Istotne jest aby omyłkowo nie zinterpretować takiego zapisu jako tablicy z elementami object i Object.

"[object Object]" to zwykły ciąg znaków powstający w wyniku konwersji ({}).toString()

Ten sam ciąg znaków użyty dwukrotnie jako nazwa własności obiektu test powoduje, że każde kolejne jego użycie nadpisuje poprzednio zdefiniowaną własność o tej samej nazwie.

test[obj1] i test[obj2] logują do konsoli "Qux" bo taka wartość została przypisana jako ostatnia dla test["[object Object]"].

- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html index 04596c922..1d9819d52 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #009

🪲 Znajdź buga

function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer)

console.log(sum)

Chcemy zsumować wszystkie elementy z tablicy numbers, jednocześnie zwiększając każdą z wartości tablicy o 1.

Jaka wartość zostanie zalogowana do konsoli jako sum?

🧪 Rozwiązanie

function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer, 0)

console.log(sum)

W przykładzie z błędem, wartość zwrócona z sum wyniesie 8 zamiast 9.

Działanie metody reduce() polega na zredukowaniu wielu wartości z tablicy (array) do jednej, zgodnie z zasadami zdefiniowanymi w funkcji callback, którą w naszym przykładzie nazwaliśmy reducer.

Pułapka myślowa w przykładzie, polega na tym, że możemy błędnie założyć, że reduce() wywoła funkcję reducer tyle razy, ile elementów zawiera tablica numbers.

W rzeczywistości jednak tak się nie dzieje.

Gdy do metody reduce(), oprócz funkcji callback, nie przekażemy drugiego argumentu, definiującego wartość początkową reduktora, to reduce() użyje jako wartości początkowej, pierwszej wartości z tablicy, pomijając tym samym pierwsze wywołanie callbacku.

reduce() ustawi więc wartość początkową na 1, a następnie wykona w pętli działania kumulujące dla kolejnych 2 elementów.

Można to zapisać w formie równania 1 + (2 + 1) + (3 + 1).

Aby naprawić ten problem, musimy w metodzie reduce() przekazać drugi argument, który będzie wartością początkową. W naszym przykładzie, gdy zależy nam na zsumowaniu wartości, powinniśmy przekazać tam po prostu 0.

Z wyraźnym ustawieniem wartości początkowej, będziemy mieli do czynienia z równaniem 0 + (1 + 1) + (2 + 1) + (3 + 1).

W takim przypadku funkcja reducer() zostanie wywołana trzykrotnie.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html index 0e34f649d..698663c3e 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer)

console.log(sum)
- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html index 1a99c20c7..c548c6965 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy zsumować wszystkie elementy z tablicy numbers, jednocześnie zwiększając każdą z wartości tablicy o 1.

Jaka wartość zostanie zalogowana do konsoli jako sum?

- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html index 3e408d1f6..717aac4af 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html index 6866ffead..473ad7884 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function reducer(accumulator, currentValue) {
currentValue += 1

return accumulator + currentValue
}

const numbers = [1, 2, 3]
const sum = numbers.reduce(reducer, 0)

console.log(sum)
- - + + \ No newline at end of file diff --git a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html index d2b356a0c..c2320a250 100644 --- a/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html +++ b/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, wartość zwrócona z sum wyniesie 8 zamiast 9.

Działanie metody reduce() polega na zredukowaniu wielu wartości z tablicy (array) do jednej, zgodnie z zasadami zdefiniowanymi w funkcji callback, którą w naszym przykładzie nazwaliśmy reducer.

Pułapka myślowa w przykładzie, polega na tym, że możemy błędnie założyć, że reduce() wywoła funkcję reducer tyle razy, ile elementów zawiera tablica numbers.

W rzeczywistości jednak tak się nie dzieje.

Gdy do metody reduce(), oprócz funkcji callback, nie przekażemy drugiego argumentu, definiującego wartość początkową reduktora, to reduce() użyje jako wartości początkowej, pierwszej wartości z tablicy, pomijając tym samym pierwsze wywołanie callbacku.

reduce() ustawi więc wartość początkową na 1, a następnie wykona w pętli działania kumulujące dla kolejnych 2 elementów.

Można to zapisać w formie równania 1 + (2 + 1) + (3 + 1).

Aby naprawić ten problem, musimy w metodzie reduce() przekazać drugi argument, który będzie wartością początkową. W naszym przykładzie, gdy zależy nam na zsumowaniu wartości, powinniśmy przekazać tam po prostu 0.

Z wyraźnym ustawieniem wartości początkowej, będziemy mieli do czynienia z równaniem 0 + (1 + 1) + (2 + 1) + (3 + 1).

W takim przypadku funkcja reducer() zostanie wywołana trzykrotnie.

- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html index d5eb796bc..b9d7bd434 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #081

🪲 Znajdź buga

if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}

Czy któreś z instrukcji warunkowych zostaną wykonane i zalogują swoją wartość do konsoli?

🧪 Rozwiązanie

if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}

Instrukcja warunkowa if (new Boolean(false)) zostanie wykonana i do konsoli zostanie zalogowana wartość "Third".

Pozostałe instrukcje nie wykonają się.

if (false) powinno być oczywiste. Instrukcja nie wykonuje się, bo przekazany warunek jest fałszywy.

Funkcja Boolean zwraca wartość logiczną true lub false w zależności od przekazanego argumentu i jego ewentualnej konwersji na wartość logiczną, jeśli jest innego typu.

Boolean(false) zwraca wartość false więc tutaj mamy tą samą sytuację co w pierwszej instrukcji.

new Boolean(false) może wydawać się ekwiwalentem Boolean(false), ale użycie słowa kluczowego new powoduje utworzenie nowego obiektu, traktując funkcję Boolean() jako konstruktor obiektu,

new Boolean() zwraca więc obiekt, a nie wartość logiczną.

Obiekty z natury są wartościami prawdziwymi (nie ma znaczenia, że wprowadziliśmy do konstruktora wartość false), więc trzecia instrukcja warunkowa zostaje wykonana.

Czwarta i ostatnia instrukcja nie zostaje wykonana bo podwójny wykrzyknij działa tak samo, jak funkcja Boolean().

Z !false generowana jest wartość przeciwna true, a następnie z !true, wartość przeciwna, czyli false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html index 9774eb53c..c3f8b4f53 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html index 4dd88ae87..7ad648c51 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy któreś z instrukcji warunkowych zostaną wykonane i zalogują swoją wartość do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html index 4e47a1db5..fd97acb8d 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html index ff7958ac4..75248c702 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
if (false) {
console.log("First")
}

if (Boolean(false)) {
console.log("Second")
}

if (new Boolean(false)) {
console.log("Third")
}

if (!!false) {
console.log("Fourth")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html index 98f907ac9..24e15e49c 100644 --- a/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html +++ b/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Instrukcja warunkowa if (new Boolean(false)) zostanie wykonana i do konsoli zostanie zalogowana wartość "Third".

Pozostałe instrukcje nie wykonają się.

if (false) powinno być oczywiste. Instrukcja nie wykonuje się, bo przekazany warunek jest fałszywy.

Funkcja Boolean zwraca wartość logiczną true lub false w zależności od przekazanego argumentu i jego ewentualnej konwersji na wartość logiczną, jeśli jest innego typu.

Boolean(false) zwraca wartość false więc tutaj mamy tą samą sytuację co w pierwszej instrukcji.

new Boolean(false) może wydawać się ekwiwalentem Boolean(false), ale użycie słowa kluczowego new powoduje utworzenie nowego obiektu, traktując funkcję Boolean() jako konstruktor obiektu,

new Boolean() zwraca więc obiekt, a nie wartość logiczną.

Obiekty z natury są wartościami prawdziwymi (nie ma znaczenia, że wprowadziliśmy do konstruktora wartość false), więc trzecia instrukcja warunkowa zostaje wykonana.

Czwarta i ostatnia instrukcja nie zostaje wykonana bo podwójny wykrzyknij działa tak samo, jak funkcja Boolean().

Z !false generowana jest wartość przeciwna true, a następnie z !true, wartość przeciwna, czyli false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html index 1de1687a1..c67ad3e5d 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #067

🪲 Znajdź buga

console.log("".split(" "))
console.log("".split(""))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log("".split(" ")) // [""]
console.log("".split("")) // []

Metoda split() dzieli ciąg znaków formując tablicę z fragmentami ciągów znaków.

Podział zostaje wykonany na podstawie wartości rozdzielacza, przekazanego jako argument metody.

Przykładowo, "a b c".split(" "), podzieli ciąg znaków "a b c" używając białego znaku spacji jako rozdzielacza.

Uformowana zostanie tablica ["a", "b", "c"].

"".split(" ") zwraca tablicę z jednym elementem pustego ciągu znaków [""].

Mimo, że nie ma czego dzielić (pusty ciąg znaków), przekazanie rozdzielacza powoduje, że następuje podział, którego efektem jest pusty ciąg znaków.

W przypadku próby podziału pustego ciągu znaków, element rozdzielacza jest nieistotny, zawsze wygeneruje tablicę z jednym elementem pustego ciągi znaków.

"".split("?"), "".split("asd"), "".split("-"), bez znaczenia, zawsze zwróci [""].

Z kolei "".split("") to próba podzielenia pustego ciągu znaków za pomocą pustego znaku rozdzielacza.

Jest to jedyna sytuacja, w której w efekcie działania metody split(), zostaje zwrócona pusta tablica.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html index fb099d5dc..9bfcecf9d 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("".split(" "))
console.log("".split(""))
- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html index 862ca7d92..5b817d2f2 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html index d4bb9b905..8b218d0eb 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html index 780141273..4764a8234 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("".split(" ")) // [""]
console.log("".split("")) // []
- - + + \ No newline at end of file diff --git a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html index 2566d089d..ea265d37b 100644 --- a/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html +++ b/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Metoda split() dzieli ciąg znaków formując tablicę z fragmentami ciągów znaków.

Podział zostaje wykonany na podstawie wartości rozdzielacza, przekazanego jako argument metody.

Przykładowo, "a b c".split(" "), podzieli ciąg znaków "a b c" używając białego znaku spacji jako rozdzielacza.

Uformowana zostanie tablica ["a", "b", "c"].

"".split(" ") zwraca tablicę z jednym elementem pustego ciągu znaków [""].

Mimo, że nie ma czego dzielić (pusty ciąg znaków), przekazanie rozdzielacza powoduje, że następuje podział, którego efektem jest pusty ciąg znaków.

W przypadku próby podziału pustego ciągu znaków, element rozdzielacza jest nieistotny, zawsze wygeneruje tablicę z jednym elementem pustego ciągi znaków.

"".split("?"), "".split("asd"), "".split("-"), bez znaczenia, zawsze zwróci [""].

Z kolei "".split("") to próba podzielenia pustego ciągu znaków za pomocą pustego znaku rozdzielacza.

Jest to jedyna sytuacja, w której w efekcie działania metody split(), zostaje zwrócona pusta tablica.

- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html index c61245a89..033a9c453 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #089

🪲 Znajdź buga

function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

console.log(iterate(array).next().value)
console.log(iterate(array).next().value)
console.log(iterate(array).next().value)

Chcemy stworzyć generator, który przy wywołaniu będzie zwracał nam kolejne wartości z tablicy.

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

const numbersIterator = iterate(array)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)

W błędnym przykładzie wszystkie trzy wywołania zalogują do konsoli wartość 1.

Funkcja generatora (z gwiazdką *) zwraca obiekt generatora, który możemy iterować wywołując metodę next().

Wywołując funkcję iterate(array), zwrócony zostaje nowy obiekt generatora.

Wywołując wielokrotnie iterate(array).next() za każdym razem dostajemy nowy obiekt, więc wywoływanie na nim metody next() zawsze zwraca tylko pierwszą iterację z tablicy.

Aby to naprawić, musimy zwracany z funkcji obiekt generatora przypisać do stałej (lub zmiennej) i dopiero wtedy wywoływać metody next() na tym obiekcie.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html index 81c6dfbeb..f3e20b27a 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

console.log(iterate(array).next().value)
console.log(iterate(array).next().value)
console.log(iterate(array).next().value)
- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html index f579d4df3..bde63d9cb 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy stworzyć generator, który przy wywołaniu będzie zwracał nam kolejne wartości z tablicy.

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html index 079e45b56..ac87676d0 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html index 539ed8c90..0268f1ca5 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

const numbersIterator = iterate(array)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)
- - + + \ No newline at end of file diff --git a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html index 64b7857f7..b97af41fd 100644 --- a/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html +++ b/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W błędnym przykładzie wszystkie trzy wywołania zalogują do konsoli wartość 1.

Funkcja generatora (z gwiazdką *) zwraca obiekt generatora, który możemy iterować wywołując metodę next().

Wywołując funkcję iterate(array), zwrócony zostaje nowy obiekt generatora.

Wywołując wielokrotnie iterate(array).next() za każdym razem dostajemy nowy obiekt, więc wywoływanie na nim metody next() zawsze zwraca tylko pierwszą iterację z tablicy.

Aby to naprawić, musimy zwracany z funkcji obiekt generatora przypisać do stałej (lub zmiennej) i dopiero wtedy wywoływać metody next() na tym obiekcie.

- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html index 934fb207f..e27a8305f 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #060

🪲 Znajdź buga

function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true))
console.log(js(false))
console.log(js(null))

console.log(js(NaN))
console.log(js(Infinity))

console.log(js([1, 2, 3]))
console.log(js(new Set([1, 2, 3])))

console.log(js(undefined))
console.log(js([undefined]))
console.log(js({ prop: undefined }))

console.log(js(() => "foo"))
console.log(js([() => "foo"]))
console.log(js({ prop: () => "foo" }))

console.log(js(Symbol("foo")))
console.log(js([Symbol("foo")]))
console.log(js({ prop: Symbol("foo") }))

Dla jakich typów danych nie możemy polegać na konwersji z użyciem JSON.stringify()?

Co zostanie zalogowane do konsoli w powyższych przykładach?

🧪 Rozwiązanie

function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true)) // true
console.log(js(false)) // false
console.log(js(null)) // null

console.log(js(NaN)) // null
console.log(js(Infinity)) // null

console.log(js([1, 2, 3])) // [1,2,3]
console.log(js(new Set([1, 2, 3]))) // {}

console.log(js(undefined)) // undefined
console.log(js([undefined])) // [null]
console.log(js({ prop: undefined })) // {}

console.log(js(() => "foo")) // undefined
console.log(js([() => "foo"])) // [null]
console.log(js({ prop: () => "foo" })) // {}

console.log(js(Symbol("foo"))) // undefined
console.log(js([Symbol("foo")])) // [null]
console.log(js({ prop: Symbol("foo") })) // {}

Do formatu JSON możemy skonwertować jedynie niektóre typy danych.

Ciągi znaków i wartości liczbowe nie stanowią problemu.

Podobnie wartości logiczne, true/false.

Wartość null również zostanie poprawnie skonwertowana.

Do nulla skonwertowane zostaną także wartości NaN i Infinity.

Tablice [] zostaną poprawnie skonwertowane do formatu JSON, ale kolekcje Map i Set zostaną skonwertowane do pustego obiektu {}.

Funkcje, symbole oraz wartość undefined, konwertują się różnie, w zależności od kontekstu wystąpienia.

Samodzielne wystąpienia zamieniane są na undefined. Jako elementy tablicy, stają się nullem, a jako elementy obiektu, zostają pominięte.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html index a0b187ff3..89e5df939 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true))
console.log(js(false))
console.log(js(null))

console.log(js(NaN))
console.log(js(Infinity))

console.log(js([1, 2, 3]))
console.log(js(new Set([1, 2, 3])))

console.log(js(undefined))
console.log(js([undefined]))
console.log(js({ prop: undefined }))

console.log(js(() => "foo"))
console.log(js([() => "foo"]))
console.log(js({ prop: () => "foo" }))

console.log(js(Symbol("foo")))
console.log(js([Symbol("foo")]))
console.log(js({ prop: Symbol("foo") }))
- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html index 86fcadfce..3c7a5b951 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Dla jakich typów danych nie możemy polegać na konwersji z użyciem JSON.stringify()?

Co zostanie zalogowane do konsoli w powyższych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html index 2c8a8ea22..7dea52829 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html index a1cb4c45d..914d441a6 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function js(...params) {
return JSON.stringify(...params)
}

console.log(js(true)) // true
console.log(js(false)) // false
console.log(js(null)) // null

console.log(js(NaN)) // null
console.log(js(Infinity)) // null

console.log(js([1, 2, 3])) // [1,2,3]
console.log(js(new Set([1, 2, 3]))) // {}

console.log(js(undefined)) // undefined
console.log(js([undefined])) // [null]
console.log(js({ prop: undefined })) // {}

console.log(js(() => "foo")) // undefined
console.log(js([() => "foo"])) // [null]
console.log(js({ prop: () => "foo" })) // {}

console.log(js(Symbol("foo"))) // undefined
console.log(js([Symbol("foo")])) // [null]
console.log(js({ prop: Symbol("foo") })) // {}
- - + + \ No newline at end of file diff --git a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html index c8c0766a9..34fa21b61 100644 --- a/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html +++ b/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Do formatu JSON możemy skonwertować jedynie niektóre typy danych.

Ciągi znaków i wartości liczbowe nie stanowią problemu.

Podobnie wartości logiczne, true/false.

Wartość null również zostanie poprawnie skonwertowana.

Do nulla skonwertowane zostaną także wartości NaN i Infinity.

Tablice [] zostaną poprawnie skonwertowane do formatu JSON, ale kolekcje Map i Set zostaną skonwertowane do pustego obiektu {}.

Funkcje, symbole oraz wartość undefined, konwertują się różnie, w zależności od kontekstu wystąpienia.

Samodzielne wystąpienia zamieniane są na undefined. Jako elementy tablicy, stają się nullem, a jako elementy obiektu, zostają pominięte.

- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html index 4cfedc3b3..cfe444b89 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #013

🪲 Znajdź buga

document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.map((li) => {
const updatedText =
li
.innerText
.replace("Item", "Element")

li.innerText = updatedText
})

W dokumencie mamy listę <ul> z elementami <li>. Chcemy zaktualizować tekst w tych elementach, zamieniając wyrazy Item na Element.

Gdzie w przedstawionym przykładzie wkradł się błąd?

🧪 Rozwiązanie

document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.forEach((li) => {
const updatedText = li.innerText.replace("Item", "Element")

li.innerText = updatedText
})

Próbując wykonać kod z przykładu z błędem, ujrzymy w konsoli Error: lis.map is not a function.

Do stałej lis chcieliśmy przypisać listę z elementami li i do tego momentu kod wykonywany jest poprawnie.

Jednak document.querySelector() nie tworzy kolekcji w formie Array, a jako NodeList.

Obiekt NodeList w przeciwieństwie do obiektu Array nie zawiera metody map, więc wyrzucany jest błąd.

NodeList zawiera jednak metodę forEach, której możemy użyć zamiast map.

Użycie map było tutaj bezzasadne. Nie potrzebujemy wygenerować nowej tablicy z elementami na podstawie istniejącej.

Jeśli jednak mielibyśmy faktyczną potrzebę użycia map na obiekcie NodeList to musimy go skonwertować do Array, najprościej za pomocą konstrukcji Array.from(lis).

Po takiej konwersji, lista węzłów (node'ów) będzie już obiektem Array razem ze wszystkimi dostępnymi w tym obiekcie metodami (jak np. map).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html index 15886a2b7..54bc6e13d 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.map((li) => {
const updatedText =
li
.innerText
.replace("Item", "Element")

li.innerText = updatedText
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html index 7d7726ef4..855a9b97c 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W dokumencie mamy listę <ul> z elementami <li>. Chcemy zaktualizować tekst w tych elementach, zamieniając wyrazy Item na Element.

Gdzie w przedstawionym przykładzie wkradł się błąd?

- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html index 333299683..847b28b39 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html index 0387b56fe..dac92d4f6 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
document.body.innerHTML = `
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
`

const lis = document.querySelectorAll("li")

lis.forEach((li) => {
const updatedText = li.innerText.replace("Item", "Element")

li.innerText = updatedText
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html index 97f560681..fca171953 100644 --- a/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html +++ b/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Próbując wykonać kod z przykładu z błędem, ujrzymy w konsoli Error: lis.map is not a function.

Do stałej lis chcieliśmy przypisać listę z elementami li i do tego momentu kod wykonywany jest poprawnie.

Jednak document.querySelector() nie tworzy kolekcji w formie Array, a jako NodeList.

Obiekt NodeList w przeciwieństwie do obiektu Array nie zawiera metody map, więc wyrzucany jest błąd.

NodeList zawiera jednak metodę forEach, której możemy użyć zamiast map.

Użycie map było tutaj bezzasadne. Nie potrzebujemy wygenerować nowej tablicy z elementami na podstawie istniejącej.

Jeśli jednak mielibyśmy faktyczną potrzebę użycia map na obiekcie NodeList to musimy go skonwertować do Array, najprościej za pomocą konstrukcji Array.from(lis).

Po takiej konwersji, lista węzłów (node'ów) będzie już obiektem Array razem ze wszystkimi dostępnymi w tym obiekcie metodami (jak np. map).

- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html index 785593926..c319196ef 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #086

🪲 Znajdź buga

console.log(/^[A-z]+$/.test("ABCD"))
console.log(/^[A-z]+$/.test("wxyz"))
console.log(/^[A-z]+$/.test("QwEr"))
console.log(/^[A-z]+$/.test("\\[]"))
console.log(/^[A-z]+$/.test("^_``"))
console.log(/^[A-z]+$/.test("1234"))
console.log(/^[A-z]+$/.test("a1b2"))
console.log(/^[A-z]+$/.test("\nnn"))
console.log(/^[A-z]+$/.test("a b "))

Chcemy przetestować różne ciągi znaków za pomocą wyrażenia regularnego ^[A-z]+$.

^ oznacza początek ciągu znaków.

[A-z] oznacza dowolny znak z zakresu od A do z.

+ oznacza jeden lub więcej znaków.

$ oznacza koniec ciągu znaków.

Metoda test() wykonana na wyrażeniu regularnym zwraca wartość logiczną true/false w zależności od tego czy przekazany w argumencie ciąg znaków jest zgodny z wyrażeniem regularnym.

Jakie wartości zostaną zalogowane do konsoli dla przykładowych testów?

🧪 Rozwiązanie

console.log(/^[A-z]+$/.test("ABCD")) // true
console.log(/^[A-z]+$/.test("wxyz")) // true
console.log(/^[A-z]+$/.test("QwEr")) // true
console.log(/^[A-z]+$/.test("\\[]")) // true
console.log(/^[A-z]+$/.test("^_``")) // true
console.log(/^[A-z]+$/.test("1234")) // false
console.log(/^[A-z]+$/.test("a1b2")) // false
console.log(/^[A-z]+$/.test("\nnn")) // false
console.log(/^[A-z]+$/.test("a b ")) // false

Wartości false zostają zwracane dla ciągów znaków, w których występują liczby, ponieważ zakres od A do z nie zawiera liczb.

Białe znaki jak spacje czy przejścia do nowej linii (\n) również nie wchodzą w skład zakresu z wyrażenia regularnego, więc ich obecność w ciągu znaków również poskutkuje zwróceniem wartości false.

Ciągi znaków składające się wyłącznie ze znaków z zakresu od A do z zwracają true.

Duża niespodzianka czeka na nas gdy w ciągu znaków pojawią się znaki\ [ \ ] ^ _ `

Okazuje się, że są one również elementem zakresu [A-z] w wyrażeniach regularnych.

Tablica kodowania znaków Unicode plasuje te znaki dokładnie pomiędzy zakresem [A-Z] a [a-z].

Tworząc więc wyrażenie regularne dla zakresu znaków [A-z] niejawnie szukamy też znaków [ \ ] ^ _ `.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html index ca0475a5a..3a771528d 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(/^[A-z]+$/.test("ABCD"))
console.log(/^[A-z]+$/.test("wxyz"))
console.log(/^[A-z]+$/.test("QwEr"))
console.log(/^[A-z]+$/.test("\\[]"))
console.log(/^[A-z]+$/.test("^_``"))
console.log(/^[A-z]+$/.test("1234"))
console.log(/^[A-z]+$/.test("a1b2"))
console.log(/^[A-z]+$/.test("\nnn"))
console.log(/^[A-z]+$/.test("a b "))
- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html index 0d46f0191..7fb9c3f62 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy przetestować różne ciągi znaków za pomocą wyrażenia regularnego ^[A-z]+$.

^ oznacza początek ciągu znaków.

[A-z] oznacza dowolny znak z zakresu od A do z.

+ oznacza jeden lub więcej znaków.

$ oznacza koniec ciągu znaków.

Metoda test() wykonana na wyrażeniu regularnym zwraca wartość logiczną true/false w zależności od tego czy przekazany w argumencie ciąg znaków jest zgodny z wyrażeniem regularnym.

Jakie wartości zostaną zalogowane do konsoli dla przykładowych testów?

- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html index f472c1dcd..81fde172a 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html index 3e2c02608..e819f1b96 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(/^[A-z]+$/.test("ABCD")) // true
console.log(/^[A-z]+$/.test("wxyz")) // true
console.log(/^[A-z]+$/.test("QwEr")) // true
console.log(/^[A-z]+$/.test("\\[]")) // true
console.log(/^[A-z]+$/.test("^_``")) // true
console.log(/^[A-z]+$/.test("1234")) // false
console.log(/^[A-z]+$/.test("a1b2")) // false
console.log(/^[A-z]+$/.test("\nnn")) // false
console.log(/^[A-z]+$/.test("a b ")) // false
- - + + \ No newline at end of file diff --git a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html index 6b92c752c..63fd1e4e7 100644 --- a/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html +++ b/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wartości false zostają zwracane dla ciągów znaków, w których występują liczby, ponieważ zakres od A do z nie zawiera liczb.

Białe znaki jak spacje czy przejścia do nowej linii (\n) również nie wchodzą w skład zakresu z wyrażenia regularnego, więc ich obecność w ciągu znaków również poskutkuje zwróceniem wartości false.

Ciągi znaków składające się wyłącznie ze znaków z zakresu od A do z zwracają true.

Duża niespodzianka czeka na nas gdy w ciągu znaków pojawią się znaki\ [ \ ] ^ _ `

Okazuje się, że są one również elementem zakresu [A-z] w wyrażeniach regularnych.

Tablica kodowania znaków Unicode plasuje te znaki dokładnie pomiędzy zakresem [A-Z] a [a-z].

Tworząc więc wyrażenie regularne dla zakresu znaków [A-z] niejawnie szukamy też znaków [ \ ] ^ _ `.

- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html index 49aba2325..d278cdf9f 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #036

🪲 Znajdź buga

async function getData() {
const url =
"https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = getData()
console.log(data)
}

processData()

Czy dane zostaną poprawnie pobrane z API i przetworzone?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

async function getData() {
const url = "https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = await getData()
console.log(data)
}

processData()

W błędnym przykładzie do konsoli zostanie zalogowany obiekt Promise.

Nie mamy w nim dostępu do danych, bo obietnica nie została wypełniona.

Aby rozwiązać ten problem musimy dodać brakujące słowo kluczowe await przed wywołaniem getData().

Moglibyśmy się też dostać do pobranych danych poprzez wywołanie metody then() na obiekcie Promise.

getData().then(resp => console.log(resp)) zwróciłoby nam dane, ale nie zostałyby one przypisane do stałej data.

Poprzez użycie konstrukcji await getData(), wykonywanie kodu zaczeka na pobranie danych i przypisze je do stałej data. Dzięki temu będziemy je mogli przetworzyć w dalszej części funkcji np. logując je do konsoli.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html index 1e9a8746f..e44727a2c 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
async function getData() {
const url =
"https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = getData()
console.log(data)
}

processData()
- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html index 7a42efc00..23a7ae49c 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy dane zostaną poprawnie pobrane z API i przetworzone?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html index 4d5eacf8f..1bbb5beae 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html index 85985f54d..6cb10e673 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
async function getData() {
const url = "https://api.spacexdata.com/v4/history"
const response = await fetch(url)
const json = await response.json()

return json
}

async function processData() {
const data = await getData()
console.log(data)
}

processData()
- - + + \ No newline at end of file diff --git a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html index 7159b0426..5503fb7d0 100644 --- a/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html +++ b/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W błędnym przykładzie do konsoli zostanie zalogowany obiekt Promise.

Nie mamy w nim dostępu do danych, bo obietnica nie została wypełniona.

Aby rozwiązać ten problem musimy dodać brakujące słowo kluczowe await przed wywołaniem getData().

Moglibyśmy się też dostać do pobranych danych poprzez wywołanie metody then() na obiekcie Promise.

getData().then(resp => console.log(resp)) zwróciłoby nam dane, ale nie zostałyby one przypisane do stałej data.

Poprzez użycie konstrukcji await getData(), wykonywanie kodu zaczeka na pobranie danych i przypisze je do stałej data. Dzięki temu będziemy je mogli przetworzyć w dalszej części funkcji np. logując je do konsoli.

- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html index 0fbd72a93..edaa26a36 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #027

🪲 Znajdź buga

if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()

Czy wywołanie funkcji w powyższym kodzie zadziała poprawnie?

Czy nie zmieniając logiki kodu, można wymusić zmianę jego działania?

🧪 Rozwiązanie

"use strict"

if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()

W przykładzie z błędem, w konsoli zalogowana zostanie wartość 1 jako efekt wywołania funkcji getFirst().

Zostanie zalogowany też błąd, getSecond is not a function.

Błąd ten mówi nam, że nazwa getSecond jest dostępna w miejscu jej wywołania, nie jest jednak typem funkcji.

Dostępność nazwy getSecond jest efektem podnoszenia (hoisting) deklaracji funkcji na początek wykonywanego kodu.

W naszym przykładzie getSecond jest jednak deklarowane warunkowo.

Interpreter JavaScript podnosi nazwę zadeklarowanej funkcji na początek wykonywanego kodu, ale nie przypisuje jej konkretnej wartości. Nazwa getSecond jest więc zdefiniowana jako undefined, ponieważ nie zostaje spełniony warunek w instrukcji warunkowej if.

Tego typu sposób interpretowania kodu jest mylący i może prowadzić do powstawania błędów. Aby tego uniknąć, możemy aktywować tryb ścisły.

Możemy to zrobić np. poprzez wywołanie "use strict".

W trybie ścisłym, kod z naszego przykładu będzie interpretowany inaczej.

Deklaracje funkcji zostaną podniesione tylko na początek bloku, w którym zostały zdefiniowane.

Zagnieżdżając więc deklaracje funkcji wewnątrz bloku instrukcji warunkowej, pętli, lub innej funkcji, zadeklarowana w ten sposób funkcja nie będzie dostępna na zewnątrz bloku, który ograniczają nawiasy klamrowe {}.

Po aktywowaniu trybu ścisłego, w konsoli zalogowany zostanie błąd getFirst is not defined. Oznacza to, że dla interpretera JavaScript, funkcje getFirst i getSecond są niezdefiniowane w globalnym zakresie, w których są wywoływane.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html index 4e196d476..06c50bdb9 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()
- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html index 9cd9d4a5c..43f61aa21 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy wywołanie funkcji w powyższym kodzie zadziała poprawnie?

Czy nie zmieniając logiki kodu, można wymusić zmianę jego działania?

- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html index e3270d020..f150007eb 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html index 6ed3909ab..8f51e8388 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
"use strict"

if (true) {
function getFirst() {
console.log(1)
}
}

if (false) {
function getSecond() {
console.log(2)
}
}

getFirst()
getSecond()
- - + + \ No newline at end of file diff --git a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html index 379c9936e..65cb5251e 100644 --- a/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html +++ b/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli zalogowana zostanie wartość 1 jako efekt wywołania funkcji getFirst().

Zostanie zalogowany też błąd, getSecond is not a function.

Błąd ten mówi nam, że nazwa getSecond jest dostępna w miejscu jej wywołania, nie jest jednak typem funkcji.

Dostępność nazwy getSecond jest efektem podnoszenia (hoisting) deklaracji funkcji na początek wykonywanego kodu.

W naszym przykładzie getSecond jest jednak deklarowane warunkowo.

Interpreter JavaScript podnosi nazwę zadeklarowanej funkcji na początek wykonywanego kodu, ale nie przypisuje jej konkretnej wartości. Nazwa getSecond jest więc zdefiniowana jako undefined, ponieważ nie zostaje spełniony warunek w instrukcji warunkowej if.

Tego typu sposób interpretowania kodu jest mylący i może prowadzić do powstawania błędów. Aby tego uniknąć, możemy aktywować tryb ścisły.

Możemy to zrobić np. poprzez wywołanie "use strict".

W trybie ścisłym, kod z naszego przykładu będzie interpretowany inaczej.

Deklaracje funkcji zostaną podniesione tylko na początek bloku, w którym zostały zdefiniowane.

Zagnieżdżając więc deklaracje funkcji wewnątrz bloku instrukcji warunkowej, pętli, lub innej funkcji, zadeklarowana w ten sposób funkcja nie będzie dostępna na zewnątrz bloku, który ograniczają nawiasy klamrowe {}.

Po aktywowaniu trybu ścisłego, w konsoli zalogowany zostanie błąd getFirst is not defined. Oznacza to, że dla interpretera JavaScript, funkcje getFirst i getSecond są niezdefiniowane w globalnym zakresie, w których są wywoływane.

- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html index 860927b6f..02d0f9f6d 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #043

🪲 Znajdź buga

const object = {}
object?.property = "value";

console.log(object)

Chcemy dodać własność do obiektu. Zależy nam jednak na obsłużeniu sytuacji, w której obiekt jest niezdefiniowany, lub zamiast obiektu, zwracana jest wartość null.

Jak zadziała powyższy kod? Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

const object = {}
if (object) {
object.property = "value"
}

console.log(object)

Operator opcjonalnego łańcuchowania ?. działa poprawnie przy odczycie własności obiektów.

W przykładzie z błędem użyliśmy go do przypisania wartości, a w takim kontekście nie może on zostać użyty. Konsola zaloguje więc błąd Invalid left-hand side in assignment.

Operacja przypisania nie zostanie zrealizowana ze względu na błąd składniowy po lewej stronie operatora przypisania =.

Używanie ?. zapobiega wystąpieniu błędu krytycznego Cannot read properties of undefined w sytuacji gdy obiekt, z którego chcemy odczytać wartość jest niezdefiniowany lub jest nullem.

Gdy chcemy przypisać własność do obiektu, ale nie jesteśmy pewni czy obiekt istnieje, rozsądnie będzie użyć instrukcji warunkowej if.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html index fd52ee874..db6fe6080 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const object = {}
object?.property = "value";

console.log(object)
- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html index a56025add..e39e4be43 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy dodać własność do obiektu. Zależy nam jednak na obsłużeniu sytuacji, w której obiekt jest niezdefiniowany, lub zamiast obiektu, zwracana jest wartość null.

Jak zadziała powyższy kod? Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html index 405e776af..b3dab3900 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html index 4a6304ca5..23fe41a5f 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const object = {}
if (object) {
object.property = "value"
}

console.log(object)
- - + + \ No newline at end of file diff --git a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html index c40919f52..6eded0c08 100644 --- a/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html +++ b/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Operator opcjonalnego łańcuchowania ?. działa poprawnie przy odczycie własności obiektów.

W przykładzie z błędem użyliśmy go do przypisania wartości, a w takim kontekście nie może on zostać użyty. Konsola zaloguje więc błąd Invalid left-hand side in assignment.

Operacja przypisania nie zostanie zrealizowana ze względu na błąd składniowy po lewej stronie operatora przypisania =.

Używanie ?. zapobiega wystąpieniu błędu krytycznego Cannot read properties of undefined w sytuacji gdy obiekt, z którego chcemy odczytać wartość jest niezdefiniowany lub jest nullem.

Gdy chcemy przypisać własność do obiektu, ale nie jesteśmy pewni czy obiekt istnieje, rozsądnie będzie użyć instrukcji warunkowej if.

- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html index c997a04ab..1563757e1 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #066

🪲 Znajdź buga

console.log("A" || alert("B") && alert("C"))

Co zostanie zalogowane do konsoli?

Czy funkcje alert() zostaną wykonane?

🧪 Rozwiązanie

console.log("A" || alert("B") && alert("C")) // A

Do konsoli zostanie zalogowany wyłącznie ciąg znaków A.

Bug polega na założeniu, że funkcja alert("B") powinna zostać wykonana, jako efekt pierwszeństwa działania operatora &&.

Tak się jednak nie stanie. Poniżej wyjaśnienie dlaczego.

Tablica pierwszeństwa wykonywania operatorów plasuje operator logiczny AND && ponad operatorem OR ||.

Analogicznie, w przypadku operatorów arytmetycznych, operator mnożenia * plasuje się ponad operatorem dodawania +.

Wykonując działanie 1 + 2 * 3 otrzymamy więc 7 a nie 9.

Najpierw zostanie wykonane mnożenie operandów 2 i 3. Dopiero później dodawanie 1 z otrzymaną wartością 6 z mnożenia.

Wykonane jest tutaj bardzo istotnym słowem.

Skoro operator && ma wyższy priorytet wykonywania od operatora ||, można oczekiwać od JavaScript, że wykona funkcje, które są operandami && aby poznać zwracane z nich wartości w celu ewaluacji operacji logicznej AND.

Tak się jednak nie dzieje. JavaScript nie wykonuje operacji logicznej AND ze względu na efekt zwarcia operatora OR.

Zwarcie (short circuiting) polega na tym, że jeśli pierwszy z operandów użytych z operatorami || lub && zwraca wartość, która przesądza o końcowej wartości, drugi operand nie jest już w ogóle sprawdzany (ani wykonywany).

W naszym przykładzie dla || drugim operandem byłby efekt działania operatora && czyli (alert("B") && alert("C")).

Nie ma on jednak żadnego znaczenia, ponieważ algorytm OR dąży w pierwszej kolejności do zwrócenia wartości pierwszego operandu, jeśli ta wartość jest prawdziwa.

W sytuacji gdy pierwsza wartość okaże się fałszywa, wtedy, i tylko wtedy, sprawdzany (wykonywany) jest drugi operand i zwracana jest jego (niezależnie jaka) wartość.

Odwrotnie jest w przypadku algorytmu operatora AND, który w pierwszej kolejności dąży do zwrócenia wartości fałszywej z pierwszego operandu, a tylko wtedy, gdy ta wartość okaże się prawdziwa, zostanie sprawdzony (wykonany) drugi operand oraz zwrócona zostanie z niego (niezależnie jaka) wartość.

"A" || alert("B") && alert("C") mimo, że według kolejności wykonywania operatorów, powinien sprawdzić najpierw co zwrócą operandy operatora &&, w rzeczywistości ignoruje je, ponieważ pierwszy operand operatora || jest prawdziwy.

Niezależnie więc od tego co zwróciłyby funkcje alert("B") i alert("C"), końcowy wynik operacji logicznej zawsze wyniesie A.

Efekt zwarcia występuje w operatorach &&, ||, ??, ?., ale nie występuje w pozostałych.

W przypadku wspomnianych działań matematycznych, nawet jeśli wynik jest przesądzony przez pierwszy operand (np. w mnożeniu 0 lub NaN z innymi liczbami), to pozostałe operandy i tak zostaną wykonane.

Taka tam lekka niekonsekwencja 🤷‍♂️.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html index ffce240b7..3f4c57109 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("A" || alert("B") && alert("C"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html index 38f57760c..4bb8ecd61 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli?

Czy funkcje alert() zostaną wykonane?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html index 5b575a803..86f6c5e13 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html index 11f66016b..380faa4eb 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("A" || alert("B") && alert("C")) // A
- - + + \ No newline at end of file diff --git a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html index 9c496887d..808c5dde3 100644 --- a/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html +++ b/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Do konsoli zostanie zalogowany wyłącznie ciąg znaków A.

Bug polega na założeniu, że funkcja alert("B") powinna zostać wykonana, jako efekt pierwszeństwa działania operatora &&.

Tak się jednak nie stanie. Poniżej wyjaśnienie dlaczego.

Tablica pierwszeństwa wykonywania operatorów plasuje operator logiczny AND && ponad operatorem OR ||.

Analogicznie, w przypadku operatorów arytmetycznych, operator mnożenia * plasuje się ponad operatorem dodawania +.

Wykonując działanie 1 + 2 * 3 otrzymamy więc 7 a nie 9.

Najpierw zostanie wykonane mnożenie operandów 2 i 3. Dopiero później dodawanie 1 z otrzymaną wartością 6 z mnożenia.

Wykonane jest tutaj bardzo istotnym słowem.

Skoro operator && ma wyższy priorytet wykonywania od operatora ||, można oczekiwać od JavaScript, że wykona funkcje, które są operandami && aby poznać zwracane z nich wartości w celu ewaluacji operacji logicznej AND.

Tak się jednak nie dzieje. JavaScript nie wykonuje operacji logicznej AND ze względu na efekt zwarcia operatora OR.

Zwarcie (short circuiting) polega na tym, że jeśli pierwszy z operandów użytych z operatorami || lub && zwraca wartość, która przesądza o końcowej wartości, drugi operand nie jest już w ogóle sprawdzany (ani wykonywany).

W naszym przykładzie dla || drugim operandem byłby efekt działania operatora && czyli (alert("B") && alert("C")).

Nie ma on jednak żadnego znaczenia, ponieważ algorytm OR dąży w pierwszej kolejności do zwrócenia wartości pierwszego operandu, jeśli ta wartość jest prawdziwa.

W sytuacji gdy pierwsza wartość okaże się fałszywa, wtedy, i tylko wtedy, sprawdzany (wykonywany) jest drugi operand i zwracana jest jego (niezależnie jaka) wartość.

Odwrotnie jest w przypadku algorytmu operatora AND, który w pierwszej kolejności dąży do zwrócenia wartości fałszywej z pierwszego operandu, a tylko wtedy, gdy ta wartość okaże się prawdziwa, zostanie sprawdzony (wykonany) drugi operand oraz zwrócona zostanie z niego (niezależnie jaka) wartość.

"A" || alert("B") && alert("C") mimo, że według kolejności wykonywania operatorów, powinien sprawdzić najpierw co zwrócą operandy operatora &&, w rzeczywistości ignoruje je, ponieważ pierwszy operand operatora || jest prawdziwy.

Niezależnie więc od tego co zwróciłyby funkcje alert("B") i alert("C"), końcowy wynik operacji logicznej zawsze wyniesie A.

Efekt zwarcia występuje w operatorach &&, ||, ??, ?., ale nie występuje w pozostałych.

W przypadku wspomnianych działań matematycznych, nawet jeśli wynik jest przesądzony przez pierwszy operand (np. w mnożeniu 0 lub NaN z innymi liczbami), to pozostałe operandy i tak zostaną wykonane.

Taka tam lekka niekonsekwencja 🤷‍♂️.

- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html index fadd8de5c..704ffe40c 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #046

🪲 Znajdź buga

const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj))
console.log("".concat(myObj))
console.log("" + myObj)
console.log(`${myObj}`)

Chcemy dokonać konwersji obiektu na ciąg znaków.

Co zalogują do konsoli zaproponowane sposoby?

🧪 Rozwiązanie

const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj)) // orange
console.log("".concat(myObj)) // orange
console.log("" + myObj) // apple
console.log(`${myObj}`) // orange

Wszystkie sposoby, oprócz "" + myObj, zwrócą wartość orange.

Operator +, jeśli zostanie użyty na typach danych, z których choć jeden jest różny niż number, działa jako operator łączenia ciągów znaków.

"" + myObj jest więc operacją łączenia ciągów znaków za pomocą operatora +, czyli de facto konwersją myObj na ciąg znaków.

Okazuje się jednak, że algorytm konwersji danych na ciąg znaków, który stosuje operator +, różni się od pozostałych sposobów.

Operator + dokonując konwersji danych na ciąg znaków, zamiast wywołać metodę toString() na obiekcie, który konwertuje, w pierwszej kolejności wywołuje na nim metodę valueOf().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html index 41ce5a3e5..309e73010 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj))
console.log("".concat(myObj))
console.log("" + myObj)
console.log(`${myObj}`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html index 7df9eb30d..4b0b27407 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy dokonać konwersji obiektu na ciąg znaków.

Co zalogują do konsoli zaproponowane sposoby?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html index 132e5de2a..955fe14e0 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html index c2af15609..7c9a5aafe 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myObj = {
toString: () => "orange",
valueOf: () => "apple",
}

console.log(String(myObj)) // orange
console.log("".concat(myObj)) // orange
console.log("" + myObj) // apple
console.log(`${myObj}`) // orange
- - + + \ No newline at end of file diff --git a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html index b0ac95533..b9b0729d1 100644 --- a/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html +++ b/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wszystkie sposoby, oprócz "" + myObj, zwrócą wartość orange.

Operator +, jeśli zostanie użyty na typach danych, z których choć jeden jest różny niż number, działa jako operator łączenia ciągów znaków.

"" + myObj jest więc operacją łączenia ciągów znaków za pomocą operatora +, czyli de facto konwersją myObj na ciąg znaków.

Okazuje się jednak, że algorytm konwersji danych na ciąg znaków, który stosuje operator +, różni się od pozostałych sposobów.

Operator + dokonując konwersji danych na ciąg znaków, zamiast wywołać metodę toString() na obiekcie, który konwertuje, w pierwszej kolejności wywołuje na nim metodę valueOf().

- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html index f908ee046..960e0337a 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #093

🪲 Znajdź buga

let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length)
console.log(arr2.length)
console.log(arr3.length)

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length) // 5
console.log(arr2.length) // 5
console.log(arr3.length) // 5

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i)) // 0 2 4

Rozsiane tablice (sparse arrays) to takie, które zawierają puste miejsca (slot'y).

Tablice rezerwują w pamięci miejsce na dane, ale żadnych danych w tych miejscach nie przechowują.

Nie są to wartości undefined czy null. To dosłownie puste miejsca.

Sprawdzenie własności length na takiej rozsianej tablicy zwróci całkowitą liczbę miejsc, które tablica rezerwuje w pamięci.

Wszystkie trzy tablice arr1, arr2, arr3, zwracają wartość length równą 5.

Wywołanie metody forEach() na tych tablicach nie iteruje jednak pustych miejsc.

Dla tablic arr1 i arr2 nie zostaną zwrócone żadne indeksy i z takich iteracji.

Tablica arr3 ma 3 elementy zajęte i 2 puste.

Zgłoszą się tylko zajęte elementy, logując do konsoli indeksy 0, 2, 4.

JavaScript zachowuje się tutaj niespójnie. Część metod pomija puste miejsca, np. forEach(), map(), sort(), ale część traktuje puste miejsca jako wartość undefined, np. entries(), fill(), find().

Przykładowo arr1.find((e, i) => console.log(i))\ zwróciłoby 0, 1, 2, 3, 4.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html index cff23f8e6..8de82cf41 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length)
console.log(arr2.length)
console.log(arr3.length)

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i))
- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html index 5910e1d43..3af43f696 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html index 24ec50c6b..47f5d2508 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html index 9539b85d7..a68fff1a2 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length) // 5
console.log(arr2.length) // 5
console.log(arr3.length) // 5

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i)) // 0 2 4
- - + + \ No newline at end of file diff --git a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html index ffe2ceeb5..1e76c95af 100644 --- a/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html +++ b/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Rozsiane tablice (sparse arrays) to takie, które zawierają puste miejsca (slot'y).

Tablice rezerwują w pamięci miejsce na dane, ale żadnych danych w tych miejscach nie przechowują.

Nie są to wartości undefined czy null. To dosłownie puste miejsca.

Sprawdzenie własności length na takiej rozsianej tablicy zwróci całkowitą liczbę miejsc, które tablica rezerwuje w pamięci.

Wszystkie trzy tablice arr1, arr2, arr3, zwracają wartość length równą 5.

Wywołanie metody forEach() na tych tablicach nie iteruje jednak pustych miejsc.

Dla tablic arr1 i arr2 nie zostaną zwrócone żadne indeksy i z takich iteracji.

Tablica arr3 ma 3 elementy zajęte i 2 puste.

Zgłoszą się tylko zajęte elementy, logując do konsoli indeksy 0, 2, 4.

JavaScript zachowuje się tutaj niespójnie. Część metod pomija puste miejsca, np. forEach(), map(), sort(), ale część traktuje puste miejsca jako wartość undefined, np. entries(), fill(), find().

Przykładowo arr1.find((e, i) => console.log(i))\ zwróciłoby 0, 1, 2, 3, 4.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html index 6bf7d7c1c..318ba6ddb 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #083

🪲 Znajdź buga

console.log(typeof NaN)

console.log(isNaN("foo"))
console.log(Number.isNaN("foo"))

console.log(isNaN(() => {}))
console.log(Number.isNaN(() => {}))

console.log(isNaN({}))
console.log(Number.isNaN({}))

console.log(isNaN([1, 2]))
console.log(Number.isNaN([1, 2]))

console.log(isNaN(undefined))
console.log(Number.isNaN(undefined))

console.log(isNaN(NaN))
console.log(isNaN("NaN"))

console.log(isNaN(123))
console.log(isNaN("123"))
console.log(isNaN([]))
console.log(isNaN(true))
console.log(isNaN(false))
console.log(isNaN(null))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(typeof NaN) // number

console.log(isNaN("foo")) // true
console.log(Number.isNaN("foo")) // false

console.log(isNaN(() => {})) // true
console.log(Number.isNaN(() => {})) // false

console.log(isNaN({})) // true
console.log(Number.isNaN({})) // false

console.log(isNaN([1, 2])) // true
console.log(Number.isNaN([1, 2])) // false

console.log(isNaN(undefined)) // true
console.log(Number.isNaN(undefined)) // false

console.log(isNaN(NaN)) // true
console.log(isNaN("NaN")) // true

console.log(isNaN(123)) // false
console.log(isNaN("123")) // false (?)
console.log(isNaN([])) // false (?!)
console.log(isNaN(true)) // false (?!)
console.log(isNaN(false)) // false (?!)
console.log(isNaN(null)) // false (?!)

Po pierwsze isNaN() i Number.isNaN() nie są ze sobą zgodne 🤯.

Teoretycznie założeniem isNaN() jest sprawdzenie czy wartość przekazana w argumencie nie jest wartością liczbową.

W praktyce isNaN() sprawdza jednak czy wartość z argumentu jest ekwiwalentna wartości NaN po konwersji do wartości liczbowej.

Co więcej, dokumentacja Mozilli zachęca do korzystania z Number.isNaN() jako bardziej niezawodnego odpowiednika.

Tak, isNan() i Number.isNaN() potrafią zwracać różną wartość dla tego samego argumentu wejściowego.

Mimo deklarowanej większej niezawodności, Number.isNaN() wciąż jest bardzo nieintuicyjną metodą w celu sprawdzania, czy wartość wejściowa nie jest wartością liczbową.

Dla uzyskania niezawodności i intuicyjności najlepiej skorzystać z porównania typeof x === "number".

Mamy wtedy pewność, że dostaniemy true tylko wtedy, gdy x będzie typu liczbowego.

Pułapką może okazać się wtedy typeof NaN === "number", który zwróci true, ponieważ typ wartości NaN to... number.

Największe (moim zdaniem) pułapki w kwesti isNaN() i Number.isNaN() (gdy są ze sobą zgodne), to:

  • Sprawdzanie ciągu znaków, który zawiera liczbę np. "123"
  • Pustej tablicy []
  • Wartości logicznych true/false
  • null

Wszystkie z powyższych wartości ulegają konwersji do wartości liczbowych.

Ciąg znaków "123" zostaje skonwertowany do wartości liczbowej 123 więc isNaN("123"), tak samo jak Number.isNaN("123"), zwraca false.

Pusta tablica również jest konwertowana do wartości liczbowej, 0.

Wartości logiczne true/false są konwertowane do 1/0.

null również ulega konwersji do wartości 0.

Z tego względu, powyższe wartości po konwersji do wartości liczbowej nie stają się wartością NaN, więc isNaN() dla nich zwraca false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html index a0cafea2a..51801434c 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(typeof NaN)

console.log(isNaN("foo"))
console.log(Number.isNaN("foo"))

console.log(isNaN(() => {}))
console.log(Number.isNaN(() => {}))

console.log(isNaN({}))
console.log(Number.isNaN({}))

console.log(isNaN([1, 2]))
console.log(Number.isNaN([1, 2]))

console.log(isNaN(undefined))
console.log(Number.isNaN(undefined))

console.log(isNaN(NaN))
console.log(isNaN("NaN"))

console.log(isNaN(123))
console.log(isNaN("123"))
console.log(isNaN([]))
console.log(isNaN(true))
console.log(isNaN(false))
console.log(isNaN(null))
- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html index 912de20b1..ca0150241 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html index db2e5c58d..734189e3f 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html index a7a258071..d69ecbd52 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(typeof NaN) // number

console.log(isNaN("foo")) // true
console.log(Number.isNaN("foo")) // false

console.log(isNaN(() => {})) // true
console.log(Number.isNaN(() => {})) // false

console.log(isNaN({})) // true
console.log(Number.isNaN({})) // false

console.log(isNaN([1, 2])) // true
console.log(Number.isNaN([1, 2])) // false

console.log(isNaN(undefined)) // true
console.log(Number.isNaN(undefined)) // false

console.log(isNaN(NaN)) // true
console.log(isNaN("NaN")) // true

console.log(isNaN(123)) // false
console.log(isNaN("123")) // false (?)
console.log(isNaN([])) // false (?!)
console.log(isNaN(true)) // false (?!)
console.log(isNaN(false)) // false (?!)
console.log(isNaN(null)) // false (?!)
- - + + \ No newline at end of file diff --git a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html index 48fe6793c..5cff164f8 100644 --- a/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html +++ b/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Po pierwsze isNaN() i Number.isNaN() nie są ze sobą zgodne 🤯.

Teoretycznie założeniem isNaN() jest sprawdzenie czy wartość przekazana w argumencie nie jest wartością liczbową.

W praktyce isNaN() sprawdza jednak czy wartość z argumentu jest ekwiwalentna wartości NaN po konwersji do wartości liczbowej.

Co więcej, dokumentacja Mozilli zachęca do korzystania z Number.isNaN() jako bardziej niezawodnego odpowiednika.

Tak, isNan() i Number.isNaN() potrafią zwracać różną wartość dla tego samego argumentu wejściowego.

Mimo deklarowanej większej niezawodności, Number.isNaN() wciąż jest bardzo nieintuicyjną metodą w celu sprawdzania, czy wartość wejściowa nie jest wartością liczbową.

Dla uzyskania niezawodności i intuicyjności najlepiej skorzystać z porównania typeof x === "number".

Mamy wtedy pewność, że dostaniemy true tylko wtedy, gdy x będzie typu liczbowego.

Pułapką może okazać się wtedy typeof NaN === "number", który zwróci true, ponieważ typ wartości NaN to... number.

Największe (moim zdaniem) pułapki w kwesti isNaN() i Number.isNaN() (gdy są ze sobą zgodne), to:

  • Sprawdzanie ciągu znaków, który zawiera liczbę np. "123"
  • Pustej tablicy []
  • Wartości logicznych true/false
  • null

Wszystkie z powyższych wartości ulegają konwersji do wartości liczbowych.

Ciąg znaków "123" zostaje skonwertowany do wartości liczbowej 123 więc isNaN("123"), tak samo jak Number.isNaN("123"), zwraca false.

Pusta tablica również jest konwertowana do wartości liczbowej, 0.

Wartości logiczne true/false są konwertowane do 1/0.

null również ulega konwersji do wartości 0.

Z tego względu, powyższe wartości po konwersji do wartości liczbowej nie stają się wartością NaN, więc isNaN() dla nich zwraca false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html index 6919fd15c..d74d0c148 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #068

🪲 Znajdź buga

const numbers = [11, 2, 27, 1]
const sorted = numbers.sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const numbers = [11, 2, 27, 1]
const sorted = [...numbers].sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)

W przykładzie z błędem, stała numbers oraz sorted zwróci tą samą tablicę [100, 2, 11, 27].

Sortowanie działa poprawnie, problem leży jednak w mutowaniu oryginalnej tablicy poprzez metodę sort().

Metoda sort(), nie wykonuje kopii tablicy, na której zostanie wykonana. Modyfikuje oryginalną tablicę i zwraca efekt tej modyfikacji.

Po posortowaniu liczb, tablica sorted, na pozycji 0 posiada wartość 1.

Ta wartość jest jednak podmieniona na wartość 100 za pomocą sorted[0] = 100.

Z uwagi na wspomnianą wcześniej cechę działania sort(), kolejnym modyfikacjom tablicy sorted, ulega również tablica numbers.

Dobrze o tym pamiętać, szczególnie, że JavaScript jest tutaj niespójny.

Niektóre metody, takie jak np. slice(), map(), concat(), zwracają kopię oryginalnej tablicy, przez co późniejsze modyfikacje nie dotykają oryginału (nie mutują).

Inne, jak np. push(), reverse(), sort(), modyfikują oryginalną tablice (mutują).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html index 6fc82ca30..d0f2deabf 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [11, 2, 27, 1]
const sorted = numbers.sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)
- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html index cf3399097..8f00320b3 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html index 0f5c38aea..81e3d419d 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html index c12f53bcd..63b34427e 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [11, 2, 27, 1]
const sorted = [...numbers].sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)
- - + + \ No newline at end of file diff --git a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html index aae0e19df..d5e5e0293 100644 --- a/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html +++ b/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, stała numbers oraz sorted zwróci tą samą tablicę [100, 2, 11, 27].

Sortowanie działa poprawnie, problem leży jednak w mutowaniu oryginalnej tablicy poprzez metodę sort().

Metoda sort(), nie wykonuje kopii tablicy, na której zostanie wykonana. Modyfikuje oryginalną tablicę i zwraca efekt tej modyfikacji.

Po posortowaniu liczb, tablica sorted, na pozycji 0 posiada wartość 1.

Ta wartość jest jednak podmieniona na wartość 100 za pomocą sorted[0] = 100.

Z uwagi na wspomnianą wcześniej cechę działania sort(), kolejnym modyfikacjom tablicy sorted, ulega również tablica numbers.

Dobrze o tym pamiętać, szczególnie, że JavaScript jest tutaj niespójny.

Niektóre metody, takie jak np. slice(), map(), concat(), zwracają kopię oryginalnej tablicy, przez co późniejsze modyfikacje nie dotykają oryginału (nie mutują).

Inne, jak np. push(), reverse(), sort(), modyfikują oryginalną tablice (mutują).

- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html index 5aede5956..25e96e829 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #050

🪲 Znajdź buga

console.log(123.toString())
console.log(123..toString())
console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())

Chcemy zamienić typ wartości liczbowej na ciąg znaków.

Który z powyższych sposobów wywołania toString() nie zadziała?

🧪 Rozwiązanie

// console.log(123.toString())
console.log(123..toString())
// console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())

Pierwszy i trzeci sposób nie zadziała.

Pojawienie się kropki bezpośrednio po wartości liczbowej w 123.toString() zostaje zinterpretowane jako liczba zmiennoprzecinkowa. Wystąpienie toString() po kropce, nie jest wartością liczbową, której JavaScript się spodziewa w liczbie zmiennoprzecinkowej np. 123.456.

Sytuację naprawia umieszczenie liczby w nawiasie (123).toString(), przez co nawias zamykający wyraźnie blokuje możliwość interpretacji kropki jako części liczby zmiennoprzecinkowej.

Innym wariantem może być wyraźne zadeklarowanie liczby zmiennoprzecinkowej z zerową wartością dziesiętną 123.0.toString() i taka konstrukcja również zadziała prawidłowo.

Zaskoczeniem może być poprawne działanie poniższych przykładów:

123..toString()
123 .toString()
123 . toString()

Warto zwrócić uwagę, że 123. toString() już poprawnie nie zadziała.

123. jest poprawną liczbą, tak samo jak 123.0.

123 . poprawną liczbą nie jest podobnie jak 123 .0.

Wywołując 123. toString() przekazujemy więc do metody log() dwa parametry: liczbę oraz samodzielne wywołanie funkcji toString().

JavaScript spodziewa się więc console.log(123., toString()).

123..toString() daje nam zapis poprawnej liczby 123. oraz wywołanie na niej metody toString().

123 .toString() dla JavaScript oznacza wystąpienie liczby całkowitej, bo liczby zmiennoprzecinkowe nie mogą mieć białych znaków pomiędzy separatorem dziesiętnym.

Skoro jest to liczba całkowita to wywołanie toString() zostaje już poprawnie zinterpretowane. Nieważna jest też ilość białych znaków, które występują po liczbie całkowitej oraz, uwaga, po akcesorze (kropce), dającym dostęp do metody.

123   .   toString() wszystko gra 🤯

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html index ce74887a5..f34ac45c5 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(123.toString())
console.log(123..toString())
console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())
- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html index 1b43b3c59..01e3c1113 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy zamienić typ wartości liczbowej na ciąg znaków.

Który z powyższych sposobów wywołania toString() nie zadziała?

- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html index 2ab398009..9354aa739 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html index 31111b721..323e6112f 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
// console.log(123.toString())
console.log(123..toString())
// console.log(123. toString())
console.log(123 .toString())
console.log(123 . toString())
console.log(123.0.toString())
console.log((123).toString())
- - + + \ No newline at end of file diff --git a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html index 85a368e95..5ebc4d1f6 100644 --- a/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html +++ b/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Pierwszy i trzeci sposób nie zadziała.

Pojawienie się kropki bezpośrednio po wartości liczbowej w 123.toString() zostaje zinterpretowane jako liczba zmiennoprzecinkowa. Wystąpienie toString() po kropce, nie jest wartością liczbową, której JavaScript się spodziewa w liczbie zmiennoprzecinkowej np. 123.456.

Sytuację naprawia umieszczenie liczby w nawiasie (123).toString(), przez co nawias zamykający wyraźnie blokuje możliwość interpretacji kropki jako części liczby zmiennoprzecinkowej.

Innym wariantem może być wyraźne zadeklarowanie liczby zmiennoprzecinkowej z zerową wartością dziesiętną 123.0.toString() i taka konstrukcja również zadziała prawidłowo.

Zaskoczeniem może być poprawne działanie poniższych przykładów:

123..toString()
123 .toString()
123 . toString()

Warto zwrócić uwagę, że 123. toString() już poprawnie nie zadziała.

123. jest poprawną liczbą, tak samo jak 123.0.

123 . poprawną liczbą nie jest podobnie jak 123 .0.

Wywołując 123. toString() przekazujemy więc do metody log() dwa parametry: liczbę oraz samodzielne wywołanie funkcji toString().

JavaScript spodziewa się więc console.log(123., toString()).

123..toString() daje nam zapis poprawnej liczby 123. oraz wywołanie na niej metody toString().

123 .toString() dla JavaScript oznacza wystąpienie liczby całkowitej, bo liczby zmiennoprzecinkowe nie mogą mieć białych znaków pomiędzy separatorem dziesiętnym.

Skoro jest to liczba całkowita to wywołanie toString() zostaje już poprawnie zinterpretowane. Nieważna jest też ilość białych znaków, które występują po liczbie całkowitej oraz, uwaga, po akcesorze (kropce), dającym dostęp do metody.

123   .   toString() wszystko gra 🤯

- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html index 081c7fb17..12eb77bcb 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #024

🪲 Znajdź buga

const numbers = [1, 2, 3]

console.log(
numbers.map(n => { value: n })
)

Mamy tablicę z liczbami przypisanymi do stałej numbers. Chcemy zwrócić tablicę z obiektami, w których każdy z obiektów będzie miał przypisaną wartość do własności value.

Czy powyższy kod spełni to zadanie?

🧪 Rozwiązanie

const numbers = [1, 2, 3]

console.log(
numbers.map(n => ({ value: n }))
)

Błędny przykład zwróci nam tablicę [undefined, undefined, undefined].

Funkcje strzałkowe domyślnie zwracają zawartość funkcji (domniemany return) tylko jeśli nie jest ono w formie blokowej.

Użycie nawiasów klamrowych { i } tworzy ciało funkcji w formie blokowej i tym samym wymaga wyraźnego zwrócenia wartości z takiego ciała poprzez wyrażenie return.

W funkcji strzałkowej chcąc zwrócić obiekt musielibyśmy ciało funkcji zapisać jako { return { value: n } }.

Możemy jednak użyć formy zwięzłej i pominąć return, umieszczając obiekt wewnątrz nawiasów ( i ).

Tym samym funkcja strzałkowa potraktuje taką konstrukcję jako zwięzłe ciało funkcji i zwróci je bez konieczności użycia return.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html index 45394b0c9..3a808ba2b 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [1, 2, 3]

console.log(
numbers.map(n => { value: n })
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html index 8d6632f0f..67189211c 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Mamy tablicę z liczbami przypisanymi do stałej numbers. Chcemy zwrócić tablicę z obiektami, w których każdy z obiektów będzie miał przypisaną wartość do własności value.

Czy powyższy kod spełni to zadanie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html index 556fd112b..feaac5c97 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html index 38cdef60d..498bf8c16 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [1, 2, 3]

console.log(
numbers.map(n => ({ value: n }))
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html index cb79eeb81..f704d3c3f 100644 --- a/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html +++ b/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Błędny przykład zwróci nam tablicę [undefined, undefined, undefined].

Funkcje strzałkowe domyślnie zwracają zawartość funkcji (domniemany return) tylko jeśli nie jest ono w formie blokowej.

Użycie nawiasów klamrowych { i } tworzy ciało funkcji w formie blokowej i tym samym wymaga wyraźnego zwrócenia wartości z takiego ciała poprzez wyrażenie return.

W funkcji strzałkowej chcąc zwrócić obiekt musielibyśmy ciało funkcji zapisać jako { return { value: n } }.

Możemy jednak użyć formy zwięzłej i pominąć return, umieszczając obiekt wewnątrz nawiasów ( i ).

Tym samym funkcja strzałkowa potraktuje taką konstrukcję jako zwięzłe ciało funkcji i zwróci je bez konieczności użycia return.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html index f916ebc56..bd4ef9120 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #092

🪲 Znajdź buga

const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])

Chcemy skopiować obiekt w sposób głęboki (deep clone).

W jaki sposób zadziałają różne metody kopiowania?

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

// console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])

Wywołanie metody getTime() na copy1.birthdate zwróci błąd informujący, że getTime nie jest funkcją.

Mimo, że serializacja i parsowanie formatu JSON działa jako głęboka kopia obiektu, to przez konwersję do formatu JSON tracimy niektóre pierwotne własności obiektu jak funkcje.

Skopiowana data zostaje skonwertowana do ciągu znaków. Nie możemy więc wywoływać na niej metody getTime().

Głęboka kopia copy2 poprzez operator rozkładu { ...person } nie kopiuje zagnieżdżonych obiektów (w tym tablic), a jedynie przekazuje referencję do nich.

Modyfikując imię dziecka w oryginalnym obiekcie po wcześniejszym wykonaniu kopi poprzez rozkład, wpływamy na zmianę tego imienia również w skopiowanym obiekcie.

Ostatni, trzeci sposób jest najskuteczniejszy dla tworzenia głębokich kopi.

Dla copy3 globalna funkcja structuredClone() wykonuje głęboką kopię, zachowując funkcjonalności oraz kopiując zagnieżdżone obiekty.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html index 7ac4fb3d8..503441fa0 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])
- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html index b32e4d53a..65a06575b 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy skopiować obiekt w sposób głęboki (deep clone).

W jaki sposób zadziałają różne metody kopiowania?

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html index 3d11ea9e2..dfb8a1f43 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html index fda88a75a..9136a5dd5 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const person = {
name: "John",
height: 178,
birthdate: new Date("1999-12-31"),
children: [
{
name: "John Junior",
height: 132,
birthdate: new Date("2022-02-22"),
},
],
}

const copy1 = JSON.parse(JSON.stringify(person))
const copy2 = { ...person }
const copy3 = structuredClone(person)

person.children[0].name = "Susan"

console.log(person.birthdate.getTime())
console.log(person.children[0])

// console.log(copy1.birthdate.getTime())
console.log(copy1.children[0])

console.log(copy2.birthdate.getTime())
console.log(copy2.children[0])

console.log(copy3.birthdate.getTime())
console.log(copy3.children[0])
- - + + \ No newline at end of file diff --git a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html index e4923fe36..ab55d16fb 100644 --- a/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html +++ b/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wywołanie metody getTime() na copy1.birthdate zwróci błąd informujący, że getTime nie jest funkcją.

Mimo, że serializacja i parsowanie formatu JSON działa jako głęboka kopia obiektu, to przez konwersję do formatu JSON tracimy niektóre pierwotne własności obiektu jak funkcje.

Skopiowana data zostaje skonwertowana do ciągu znaków. Nie możemy więc wywoływać na niej metody getTime().

Głęboka kopia copy2 poprzez operator rozkładu { ...person } nie kopiuje zagnieżdżonych obiektów (w tym tablic), a jedynie przekazuje referencję do nich.

Modyfikując imię dziecka w oryginalnym obiekcie po wcześniejszym wykonaniu kopi poprzez rozkład, wpływamy na zmianę tego imienia również w skopiowanym obiekcie.

Ostatni, trzeci sposób jest najskuteczniejszy dla tworzenia głębokich kopi.

Dla copy3 globalna funkcja structuredClone() wykonuje głęboką kopię, zachowując funkcjonalności oraz kopiując zagnieżdżone obiekty.

- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html index 74145e964..5fd1c74e8 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #084

🪲 Znajdź buga

console.log(4 < 5)

console.log("4" < "5")
console.log("34" < "5")
console.log("347" < "5")
console.log("347" < "50")

console.log("a" < "b")
console.log("b" < "bz")
console.log("bxz" < "bz")
console.log("bar" < "baz")

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(4 < 5) // true

console.log("4" < "5") // true
console.log("34" < "5") // true
console.log("347" < "5") // true
console.log("347" < "50") // true

console.log("a" < "b") // true
console.log("b" < "bz") // true
console.log("bxz" < "bz") // true
console.log("bar" < "baz") // true

Wszystkie porównania zwrócą wartość true.

Nie są to jednak wartości, których intuicyjnie moglibyśmy się spodziewać po użyciu operatora <.

Porównanie mniej niż oraz analogicznie przeciwstawne więcej niż działa intuicyjnie poprawnie dla wartości liczbowych.

Dla porównania ciągów znaków intuicja mija się jednak z algorytmem, który odpowiada za faktyczne porównania.

Jeśli operandami są ciągi znaków, porównywane są wartości liczbowe przypisane do znaków w kodowaniu Unicode.

Znak "a" w kodowaniu Unicode to liczba 97.

Znak "b", odpowiada liczbie 98.

97 < 98 jest więc twierdzeniem prawdziwym.

Gdy ciągi znaków składają się z większej ilości znaków są one porównywane ze sobą kolejno, znak po znaku.

"b" < "b" zwróciłoby fałsz, bo fałszywe jest stwierdzenie 98 < 98.

"b" < "bz" zwraca prawdę, bo kolejny znak, "z" jest większy niż brak znaku po lewej stronie porównania.

"bxz" < "bz" zwraca prawdę bo "x" w kodowaniu Unicode ma niższą wartość (kod 120) niż "z" (kod 122), innymi słowy występuje wcześniej w alfabecie. Trzecie z zostaje pominięte.

Gdy zamiast liter użyjemy liczb, ale będą one zapisane w postaci ciągu znaków, to sytuacja będzie wyglądała tak samo.

"34" < "5" jest prawdziwe, bo "3" (kod 51) jest mniejsze niż "5" (kod 53). "4" zostaje znakiem pominiętym w porównaniu.

Nie ma znaczenia ile kolejnych znaków dodamy oraz jakie to będą znaki, "3499999999" < "5".

Zwróci tak samo prawdę, ponieważ Unicode "3" (51) jest mniejszy niż Unicode "5" (53).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html index 1e8503062..7b2fe82b1 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(4 < 5)

console.log("4" < "5")
console.log("34" < "5")
console.log("347" < "5")
console.log("347" < "50")

console.log("a" < "b")
console.log("b" < "bz")
console.log("bxz" < "bz")
console.log("bar" < "baz")
- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html index 19a0f99f9..d69ddcbbc 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html index 4e68130bf..5fb296118 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html index 4d3eb0474..53fd7acd3 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(4 < 5) // true

console.log("4" < "5") // true
console.log("34" < "5") // true
console.log("347" < "5") // true
console.log("347" < "50") // true

console.log("a" < "b") // true
console.log("b" < "bz") // true
console.log("bxz" < "bz") // true
console.log("bar" < "baz") // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html index c8ad3fe21..bedc274d7 100644 --- a/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html +++ b/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wszystkie porównania zwrócą wartość true.

Nie są to jednak wartości, których intuicyjnie moglibyśmy się spodziewać po użyciu operatora <.

Porównanie mniej niż oraz analogicznie przeciwstawne więcej niż działa intuicyjnie poprawnie dla wartości liczbowych.

Dla porównania ciągów znaków intuicja mija się jednak z algorytmem, który odpowiada za faktyczne porównania.

Jeśli operandami są ciągi znaków, porównywane są wartości liczbowe przypisane do znaków w kodowaniu Unicode.

Znak "a" w kodowaniu Unicode to liczba 97.

Znak "b", odpowiada liczbie 98.

97 < 98 jest więc twierdzeniem prawdziwym.

Gdy ciągi znaków składają się z większej ilości znaków są one porównywane ze sobą kolejno, znak po znaku.

"b" < "b" zwróciłoby fałsz, bo fałszywe jest stwierdzenie 98 < 98.

"b" < "bz" zwraca prawdę, bo kolejny znak, "z" jest większy niż brak znaku po lewej stronie porównania.

"bxz" < "bz" zwraca prawdę bo "x" w kodowaniu Unicode ma niższą wartość (kod 120) niż "z" (kod 122), innymi słowy występuje wcześniej w alfabecie. Trzecie z zostaje pominięte.

Gdy zamiast liter użyjemy liczb, ale będą one zapisane w postaci ciągu znaków, to sytuacja będzie wyglądała tak samo.

"34" < "5" jest prawdziwe, bo "3" (kod 51) jest mniejsze niż "5" (kod 53). "4" zostaje znakiem pominiętym w porównaniu.

Nie ma znaczenia ile kolejnych znaków dodamy oraz jakie to będą znaki, "3499999999" < "5".

Zwróci tak samo prawdę, ponieważ Unicode "3" (51) jest mniejszy niż Unicode "5" (53).

- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html index 209b39967..079cdd01b 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #026

🪲 Znajdź buga

let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)

Które z powyższych porównań zwrócą prawdę, a które fałsz?

Dla jakiej wartości działanie typeof zwróci błędną informację?\ (oficjalny bug JavaScript)

🧪 Rozwiązanie

let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)

Większość wyrażeń porównania z typem object zaloguje do konsoli wartości true. Wyjątkami będą lastName, nothing, i greet.

Zmienna firstName zawiera obiekt utworzony za pomocą wywołania konstruktora String z użyciem operatora new. Powoduje to zwrócenie obiektu String który jest typem obiektu.

Zmienna lastName zawiera ciąg znaków o podstawowym typie string, stworzonego poprzez wywołanie funkcji String bez użycia operatora new, czyli bez intencji tworzenia nowego obiektu.

Zmienna user otrzymuje wartość typowego JavaScriptowego obiektu definiowanego za pomocą nawiasów klamrowych. Nie jest zaskoczeniem, że typeof zwraca dla takiej wartości object.

Zmienna numbers zawiera tablicę, czyli Array, a w JavaScript Array jest obiektem.

Zmienna nothing jest zadeklarowana bez przypisania wartości. Wywołanie jej zwraca więc wartość undefined, która jest jednocześnie typem podstawowym. typeof undefined zwraca więc undefined.

Zmienna empty zawiera wartość null. Działanie typeof dla wartości null zwróci object i jest to powszechnie uznane za błąd języka JavaScript (patrz podlinkowany artykuł The history of “typeof null”).

Bug ten celowo nie jest jednak naprawiany w działaniu języka ze względu na zachowanie kompatybilności wstecznej z wieloma istniejącymi skryptami, które polegają na tym błędnym działaniu.

Zmienna greet jest funkcją i mimo, że funkcje są też pierwszorzędnymi obiektami w JavaScript, to jednak poprzez typeof zgłaszają swój typ danych jako function.

Zmienna greeting przechowuje obiekt, utworzony poprzez użycie operatora new wywołującego funkcję greet jako konstruktora obiektu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html index e52fa4ddc..b8e1b9ada 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)
- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html index 82acce61c..431084529 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Które z powyższych porównań zwrócą prawdę, a które fałsz?

Dla jakiej wartości działanie typeof zwróci błędną informację?\ (oficjalny bug JavaScript)

- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html index b3313357e..f126a95dc 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html index 568efa3c1..83958c3c0 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let firstName = new String("Brendan")
let lastName = String("Eich")
let user = { id: 1, admin: true }
let numbers = [1, 2, 3]
let nothing
let empty = null
let greet = function () { return "Hi!" }
let greeting = new greet()

console.log("object" === typeof firstName)
console.log("object" === typeof lastName)
console.log("object" === typeof user)
console.log("object" === typeof numbers)
console.log("object" === typeof empty)
console.log("object" === typeof nothing)
console.log("object" === typeof greet)
console.log("object" === typeof greeting)
- - + + \ No newline at end of file diff --git a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html index 02671ab28..d898e9064 100644 --- a/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html +++ b/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Większość wyrażeń porównania z typem object zaloguje do konsoli wartości true. Wyjątkami będą lastName, nothing, i greet.

Zmienna firstName zawiera obiekt utworzony za pomocą wywołania konstruktora String z użyciem operatora new. Powoduje to zwrócenie obiektu String który jest typem obiektu.

Zmienna lastName zawiera ciąg znaków o podstawowym typie string, stworzonego poprzez wywołanie funkcji String bez użycia operatora new, czyli bez intencji tworzenia nowego obiektu.

Zmienna user otrzymuje wartość typowego JavaScriptowego obiektu definiowanego za pomocą nawiasów klamrowych. Nie jest zaskoczeniem, że typeof zwraca dla takiej wartości object.

Zmienna numbers zawiera tablicę, czyli Array, a w JavaScript Array jest obiektem.

Zmienna nothing jest zadeklarowana bez przypisania wartości. Wywołanie jej zwraca więc wartość undefined, która jest jednocześnie typem podstawowym. typeof undefined zwraca więc undefined.

Zmienna empty zawiera wartość null. Działanie typeof dla wartości null zwróci object i jest to powszechnie uznane za błąd języka JavaScript (patrz podlinkowany artykuł The history of “typeof null”).

Bug ten celowo nie jest jednak naprawiany w działaniu języka ze względu na zachowanie kompatybilności wstecznej z wieloma istniejącymi skryptami, które polegają na tym błędnym działaniu.

Zmienna greet jest funkcją i mimo, że funkcje są też pierwszorzędnymi obiektami w JavaScript, to jednak poprzez typeof zgłaszają swój typ danych jako function.

Zmienna greeting przechowuje obiekt, utworzony poprzez użycie operatora new wywołującego funkcję greet jako konstruktora obiektu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html index 8759d83af..4cd0fc6f1 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #072

🪲 Znajdź buga

console.log(false ? true : false)
console.log(null ? true : false)
console.log(undefined ? true : false)
console.log(0 ? true : false)
console.log("" ? true : false)
console.log([] ? true : false)
console.log("0" ? true : false)
console.log(" \n " ? true : false)

console.log(null == undefined)
console.log(undefined == false)
console.log(null == false)

console.log("" == false)
console.log("" == 0)
console.log("" == [])
console.log([] == false)
console.log("0" == 0)
console.log(" \n " == 0)

Zagrajmy w prawda czy fałsz.

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(false ? true : false) // false
console.log(null ? true : false) // false
console.log(undefined ? true : false) // false
console.log(0 ? true : false) // false
console.log("" ? true : false) // false
console.log([] ? true : false) // true
console.log("0" ? true : false) // true
console.log(" \n " ? true : false) // true

console.log(null == undefined) // true
console.log(undefined == false) // false (!)
console.log(null == false) // false (!)

console.log("" == false) // true
console.log("" == 0) // true
console.log("" == []) // true (!)
console.log([] == false) // true (!)
console.log("0" == 0) // true (!)
console.log(" \n " == 0) // true (!)

W komentarzach obok zwracanych wartości dodałem wykrzykniki dla rozwiązań, które w mojej ocenie są najbardziej nielogiczne.

JavaScript nie jest spójny w kwesti działania operatora porównania == w porównaniu do ewaluacji wyrażeń warunkowych.

Porównując ze sobą dwa elementy, które mają różne typy i oczekując zwrócenia wartości logicznej true/false, intuicyjnie możemy zakładać (błędnie), że algorytm porównania będzie dążył do sprowadzenia odmiennych typów danych do wartości logicznych.

Tak robi instrukcja warunkowa, która przyjmując typ danych inny od wartości logicznej, konwertuje ją na taką.

Operator == przypadku porównywanie różniących się typów danych, najczęściej dąży jednak do sprowadzenia różnych typów danych do wartości liczbowych.

Stąd też powszechna opinia, aby unikać używania operatora ==, gdyż zwraca on wartość logiczną, ale sam nie dąży do konwersji odmiennych typów danych na wartości logiczne przed ich porównaniem.

Algorytm stojący za ==, jeśli porównuje różne typy danych, w pierwszej kolejności dąży on do sprowadzenia ich do wartości prymitywnych (konwertując obiekty do wartości liczbowych lub ciągi znaków).

Następnie, jeśli typy porównywanych danych dalej się różnicą, algorytm dąży on do sprowadzenia wartości prymitywnych do wartości liczbowych.

Algorytm konwersji do wartości liczbowych wprowadza dodatkowe zamieszanie, konwertując wartości, które z definicji w języku JavaScript są prawdziwe (jak np. ciąg białych znaków, puste tablice), do wartości liczbowych 0, które to z kolei, z definicji są fałszywe.

Gdy porównujemy różne typy danych za pomocą operatora porównania ==, bliskie prawdy jest zapisanie takiego porównania z użyciem konwersji porównywanych danych do wartości liczbowych oraz operatora ścisłego porównania Number(a) === Number(b).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html index e4b9bb1f7..e269864e9 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(false ? true : false)
console.log(null ? true : false)
console.log(undefined ? true : false)
console.log(0 ? true : false)
console.log("" ? true : false)
console.log([] ? true : false)
console.log("0" ? true : false)
console.log(" \n " ? true : false)

console.log(null == undefined)
console.log(undefined == false)
console.log(null == false)

console.log("" == false)
console.log("" == 0)
console.log("" == [])
console.log([] == false)
console.log("0" == 0)
console.log(" \n " == 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html index 487e01596..cd6d64864 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Zagrajmy w prawda czy fałsz.

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html index d95bd42d6..79d56452b 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html index c91cb0a51..772e22d05 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(false ? true : false) // false
console.log(null ? true : false) // false
console.log(undefined ? true : false) // false
console.log(0 ? true : false) // false
console.log("" ? true : false) // false
console.log([] ? true : false) // true
console.log("0" ? true : false) // true
console.log(" \n " ? true : false) // true

console.log(null == undefined) // true
console.log(undefined == false) // false (!)
console.log(null == false) // false (!)

console.log("" == false) // true
console.log("" == 0) // true
console.log("" == []) // true (!)
console.log([] == false) // true (!)
console.log("0" == 0) // true (!)
console.log(" \n " == 0) // true (!)
- - + + \ No newline at end of file diff --git a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html index 54dd3a430..37e14d4b7 100644 --- a/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html +++ b/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W komentarzach obok zwracanych wartości dodałem wykrzykniki dla rozwiązań, które w mojej ocenie są najbardziej nielogiczne.

JavaScript nie jest spójny w kwesti działania operatora porównania == w porównaniu do ewaluacji wyrażeń warunkowych.

Porównując ze sobą dwa elementy, które mają różne typy i oczekując zwrócenia wartości logicznej true/false, intuicyjnie możemy zakładać (błędnie), że algorytm porównania będzie dążył do sprowadzenia odmiennych typów danych do wartości logicznych.

Tak robi instrukcja warunkowa, która przyjmując typ danych inny od wartości logicznej, konwertuje ją na taką.

Operator == przypadku porównywanie różniących się typów danych, najczęściej dąży jednak do sprowadzenia różnych typów danych do wartości liczbowych.

Stąd też powszechna opinia, aby unikać używania operatora ==, gdyż zwraca on wartość logiczną, ale sam nie dąży do konwersji odmiennych typów danych na wartości logiczne przed ich porównaniem.

Algorytm stojący za ==, jeśli porównuje różne typy danych, w pierwszej kolejności dąży on do sprowadzenia ich do wartości prymitywnych (konwertując obiekty do wartości liczbowych lub ciągi znaków).

Następnie, jeśli typy porównywanych danych dalej się różnicą, algorytm dąży on do sprowadzenia wartości prymitywnych do wartości liczbowych.

Algorytm konwersji do wartości liczbowych wprowadza dodatkowe zamieszanie, konwertując wartości, które z definicji w języku JavaScript są prawdziwe (jak np. ciąg białych znaków, puste tablice), do wartości liczbowych 0, które to z kolei, z definicji są fałszywe.

Gdy porównujemy różne typy danych za pomocą operatora porównania ==, bliskie prawdy jest zapisanie takiego porównania z użyciem konwersji porównywanych danych do wartości liczbowych oraz operatora ścisłego porównania Number(a) === Number(b).

- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html index f22dadf31..1ce1c0191 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #006

🪲 Znajdź buga

for (var i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

for (let i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}

W przykładzie z błędem do konsoli zostanie zalogowana 10 x wartość 10.

Dzieje się tak, ponieważ deklaracja zmiennej za pomocą var tworzy zmienną globalną (dostępną również poza pętlą).

setTimeout() bez podania wartości opóźnienia w drugim argumencie, domyślnie przyjmuje wartości delay jako 0.

Użycie setTimeout() nawet z zerowym opóźnieniem oddelegowuje kod do wykonania go asynchronicznie tj. na końcu kolejki w danej pętli zdarzeń (event loop).

Finalnie 10 wywołań console.log() nastąpi więc dopiero po wykonaniu wszystkich iteracji z pętli.

Ostatnia iteracja pętli ustawi wartość zmiennej i na 10, więc wszystkie 10 wywołań console.log() będzie logowało wartość 10 przypisaną do globalnej zmiennej i.

Aby naprawić ten problem, musimy użyć wyrażenia let zamiast var.

Spowoduje to utworzenie lokalnej zmiennej, dostępnej jedynie w obrębie bloku pętli, bez efektu nadpisywania jej, jak to ma miejsce w przypadku zmiennej globalnej.

for (let i = 0; i < 10; i++) utworzy więc pętlę ze zmienną lokalną i setTimeout() nawet przy wykonaniu logowań do konsoli już po wykonaniu wszystkich iteracji pętli, będzie cały czas miało dostęp do wartości lokalnych użytych w każdej z iteracji.

Zalogowane zostaną wtedy wartości 0, 1, 2, ... zamiast 10, 10, 10, ...

Użycie var wewnątrz pętli będzie miało więc taki sam efekt, jak użycie deklaracji let poza pętlą, tworzącą zmienną globalną.

Deklarując let i, a następie używając tej zmiennej w pętli for (i = 0; i < 10; i++) otrzymamy taki sam (problematyczny) efekt, jak w przypadku użycia for (var i = 0; i < 10; i++).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html index 6905fcc9d..fd743db7c 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
for (var i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html index eb2e50d00..9172a1f68 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html index 9d21621fc..2952c68ce 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html index f06367e0a..e3cd9ab95 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
for (let i = 0; i < 10; i++) {
setTimeout(() => console.log(i))
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html index 30b61ead9..381d9cf47 100644 --- a/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html +++ b/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem do konsoli zostanie zalogowana 10 x wartość 10.

Dzieje się tak, ponieważ deklaracja zmiennej za pomocą var tworzy zmienną globalną (dostępną również poza pętlą).

setTimeout() bez podania wartości opóźnienia w drugim argumencie, domyślnie przyjmuje wartości delay jako 0.

Użycie setTimeout() nawet z zerowym opóźnieniem oddelegowuje kod do wykonania go asynchronicznie tj. na końcu kolejki w danej pętli zdarzeń (event loop).

Finalnie 10 wywołań console.log() nastąpi więc dopiero po wykonaniu wszystkich iteracji z pętli.

Ostatnia iteracja pętli ustawi wartość zmiennej i na 10, więc wszystkie 10 wywołań console.log() będzie logowało wartość 10 przypisaną do globalnej zmiennej i.

Aby naprawić ten problem, musimy użyć wyrażenia let zamiast var.

Spowoduje to utworzenie lokalnej zmiennej, dostępnej jedynie w obrębie bloku pętli, bez efektu nadpisywania jej, jak to ma miejsce w przypadku zmiennej globalnej.

for (let i = 0; i < 10; i++) utworzy więc pętlę ze zmienną lokalną i setTimeout() nawet przy wykonaniu logowań do konsoli już po wykonaniu wszystkich iteracji pętli, będzie cały czas miało dostęp do wartości lokalnych użytych w każdej z iteracji.

Zalogowane zostaną wtedy wartości 0, 1, 2, ... zamiast 10, 10, 10, ...

Użycie var wewnątrz pętli będzie miało więc taki sam efekt, jak użycie deklaracji let poza pętlą, tworzącą zmienną globalną.

Deklarując let i, a następie używając tej zmiennej w pętli for (i = 0; i < 10; i++) otrzymamy taki sam (problematyczny) efekt, jak w przypadku użycia for (var i = 0; i < 10; i++).

- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html index be7697390..43fccf18c 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #038

🪲 Znajdź buga

const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
[7, "Sunday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth()))
console.log(weekdays.get(now.getDay()))

Czy powyższy kod zaloguje do konsoli poprawny dzień miesiąca, nazwę miesiąca i nazwę dnia tygodnia?

🧪 Rozwiązanie

const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[0, "Sunday"],
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth() + 1))
console.log(weekdays.get(now.getDay()))

W przykładzie z błędem, poprawność działania kodu częściowo zależy od dnia, w którym zostanie uruchomiony.

new Date() generuje aktualną datę w lokalnej strefie czasowej.

Polska leży w strefie czasowej +1h (czas zimowy) lub +2h (czas letni) w stosunku do strefy UTC.

Metoda toISOString() zwraca datę w formacie UTC. Jeśli więc kod zostanie uruchomiony np. o godz. 00:30 w polskiej stefie czasowej, to toISOString() zwróci w odpowiedzi datę z dnia poprzedniego polskiej strefy czasowej.

Pozostałe metody występują w dwóch wariantach.

Pierwsze, bez UTC w nazwie metody, zwracają datę czasu lokalnego (tego, w którym został uruchomiony kod). Drugie, z UTC w nazwie metody, zwracają datę ze strefy czasowej UTC.

Przykładowo, wariant getDate() zwróci dzień miesiąca czasu lokalnego, a wariant getUTCDate() dzień miesiąca czasu UTC.

Metoda getDate() nie sprawia niespodzianek, zwracając dzień miesiąca w formie liczbowej (w przedziale od 1 do 31).

Metoda getMonth() jest już nieco mniej intuicyjna. Zwraca bowiem numer miesiąca, ale numeracja miesięcy zaczyna się od 0.

Styczeń to 0, grudzień to 11.

Jeśli chcemy przypisać nazwy miesięcy do wartości z zakresu od 1 do 12, to wywołując getMonth() musimy pamiętać, aby zawsze dodawać do zwracanej wartości +1.

Metoda getDay() zwraca numer dnia tygodnia w zakresie liczbowym od 0 do 6. Dodatkowo musimy jednak pamiętać, że numerowanie dni tygodnia zaczyna się od niedzieli (0), a kończy na sobocie (6).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html index 601331073..6b7e7a48b 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
[7, "Sunday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth()))
console.log(weekdays.get(now.getDay()))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html index 87380a5fe..a9c0fe67a 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy powyższy kod zaloguje do konsoli poprawny dzień miesiąca, nazwę miesiąca i nazwę dnia tygodnia?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html index a98b42ca3..c8e14128a 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html index 98943cce0..6db129ff7 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const now = new Date()

const months = new Map([
[1, "January"],
[2, "February"],
[3, "March"],
[4, "April"],
[5, "May"],
[6, "June"],
[7, "July"],
[8, "August"],
[9, "September"],
[10, "October"],
[11, "November"],
[12, "December"],
])

const weekdays = new Map([
[0, "Sunday"],
[1, "Monday"],
[2, "Tuesday"],
[3, "Wednesday"],
[4, "Thursday"],
[5, "Friday"],
[6, "Saturday"],
])

console.log(now.toISOString())
console.log(now.getDate())
console.log(months.get(now.getMonth() + 1))
console.log(weekdays.get(now.getDay()))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html index 0a5567c2a..282a82d55 100644 --- a/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html +++ b/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, poprawność działania kodu częściowo zależy od dnia, w którym zostanie uruchomiony.

new Date() generuje aktualną datę w lokalnej strefie czasowej.

Polska leży w strefie czasowej +1h (czas zimowy) lub +2h (czas letni) w stosunku do strefy UTC.

Metoda toISOString() zwraca datę w formacie UTC. Jeśli więc kod zostanie uruchomiony np. o godz. 00:30 w polskiej stefie czasowej, to toISOString() zwróci w odpowiedzi datę z dnia poprzedniego polskiej strefy czasowej.

Pozostałe metody występują w dwóch wariantach.

Pierwsze, bez UTC w nazwie metody, zwracają datę czasu lokalnego (tego, w którym został uruchomiony kod). Drugie, z UTC w nazwie metody, zwracają datę ze strefy czasowej UTC.

Przykładowo, wariant getDate() zwróci dzień miesiąca czasu lokalnego, a wariant getUTCDate() dzień miesiąca czasu UTC.

Metoda getDate() nie sprawia niespodzianek, zwracając dzień miesiąca w formie liczbowej (w przedziale od 1 do 31).

Metoda getMonth() jest już nieco mniej intuicyjna. Zwraca bowiem numer miesiąca, ale numeracja miesięcy zaczyna się od 0.

Styczeń to 0, grudzień to 11.

Jeśli chcemy przypisać nazwy miesięcy do wartości z zakresu od 1 do 12, to wywołując getMonth() musimy pamiętać, aby zawsze dodawać do zwracanej wartości +1.

Metoda getDay() zwraca numer dnia tygodnia w zakresie liczbowym od 0 do 6. Dodatkowo musimy jednak pamiętać, że numerowanie dni tygodnia zaczyna się od niedzieli (0), a kończy na sobocie (6).

- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html index a33887af8..8647f3b27 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #064

🪲 Znajdź buga

console.log(Number(undefined))
console.log(Number(null))
console.log(Number(false))
console.log(Number(true))
console.log(Number({}))
console.log(Number([]))

console.log(Number("a"))
console.log(Number("\f"))
console.log(Number("\n"))
console.log(Number("\r"))
console.log(Number("\t"))
console.log(Number("\v"))
console.log(Number("\b"))

console.log(Number(["a"]))
console.log(Number([0]))
console.log(Number(["0"]))
console.log(Number([0, 0]))
console.log(Number([1]))
console.log(Number(["1"]))
console.log(Number([0, 1]))

console.log(Number(""))
console.log(Number(" "))
console.log(Number(" \n \t \f \v "))
console.log(Number(" \n \t \f \v 1 "))

console.log(Number("1e2"))
console.log(Number(1e2))
console.log(Number("0x64"))
console.log(Number(0x64))
console.log(Number("0b01100100"))
console.log(Number(0b01100100))
console.log(Number("\u0031\u0030\u0030"))
console.log(Number("\x31\x30\x30"))

Funkcja Number konwertuje przekazany argument do wartości liczbowej.

Jakie wartości zostaną zalogowane do konsoli w powyższych przykładach?

🧪 Rozwiązanie

console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
console.log(Number(false)) // 0
console.log(Number(true)) // 1
console.log(Number({})) // NaN
console.log(Number([])) // 0

console.log(Number("a")) // NaN
console.log(Number("\f")) // 0
console.log(Number("\n")) // 0
console.log(Number("\r")) // 0
console.log(Number("\t")) // 0
console.log(Number("\v")) // 0
console.log(Number("\b")) // NaN

console.log(Number(["a"])) // NaN
console.log(Number([0])) // 0
console.log(Number(["0"])) // 0
console.log(Number([0, 0])) // NaN
console.log(Number([1])) // 1
console.log(Number(["1"])) // 1
console.log(Number([0, 1])) // NaN

console.log(Number("")) // 0
console.log(Number(" ")) // 0
console.log(Number(" \n \t \f \v ")) // 0
console.log(Number(" \n \t \f \v 1 ")) // 1

console.log(Number("1e2")) // 100
console.log(Number(1e2)) // 100
console.log(Number("0x64")) // 100
console.log(Number(0x64)) // 100
console.log(Number("0b01100100")) // 100
console.log(Number(0b01100100)) // 100
console.log(Number("\u0031\u0030\u0030")) // 100
console.log(Number("\x31\x30\x30")) // 100

Próba konwersji undefined za pomocą funkcji Number zwróci NaN.

Dla wartości null zostanie jednak zwrócona już wartość liczbowa 0.

Jest to dość powszechnie niespójne zachowanie JavaScriptu, który w różnych sytuacjach różnie konwertuje wartości null i undefined.

Wartości logiczne false/true są konwertowane do liczbowych odpowiedników tj. 0/1.

Mimo, że tablice są również obiektami w języku JavaScript, pusty obiekt zostanie skonwertowany do wartości NaN, a pusta tablica do wartości liczbowej 0.

Ciągi znaków nie zawierających liczb, są konwertowane do wartości NaN.

Poprzedzenie litery znakiem wstecznego ukośnika powoduje tzw. ucieczkę (escape) danego znaku.

Znaki f, n, r, t, v, b poprzedzone \ generują białe znaki (podobnie jak np. spacja).

W zależności od znaku może to być np. wstawienie tabulatora, przejście do nowej linii, itp..

Funkcja Number konwertuje białe znaki (w tym standardowe spacje), do wartości liczbowej 0.

Wyjątkiem jest \b, który oznacza wstawienie wstecznej spacji (backspace) i jest konwertowane do wartości NaN.

W przypadku tablic, jeśli składają się tylko z jednego elementu, Number konwertuje je tak samo, jak gdyby wartości nie były elementem tablicy.

Gdy jednak tablica zawiera więcej niż jeden element, w efekcie konwersji zwracana jest wartość NaN.

Białe znaki łączone w ciąg białych znaków zachowują się tak samo jak pojedyncze, tj. są w całości konwertowane do wartości 0.

Jeśli jednak wśród białych znaków wystąpi wartość liczbowa, jest ona konwertowana do wartości liczbowej, ignorując wszystkie występujące sąsiadujące białe znaki.

Ostatnią grupą są wartości liczbowe zapisywane w innych notacjach lub systemach liczbowych.

1e2 to zapis liczby w notacji naukowej. Litera e jest skrótem od exponential czyli notacji wykładniczej, czyli potęgowania liczby 10. Wartość po literze e to wielkość wykładnika potęgi.

1e2 to więc to samo co 1 * 10 ** 2 (gdzie ** to w JavaScript operator potęgowania).

Upraszczając do zapisu tekstowego, 1 razy 10 do potęgi 2.

Liczba występująca po e oznacza więc ilość zer, które należałoby zapisać stosując standardowy zapis liczby dziesiętnej.

1e2 daje nam więc w standardowym zapisie liczbę dziesiętną 100.

W przypadku konwersji poprzez Number() nie ma znaczenia czy przekażemy taką notację jako ciąg znaków, czyli z użyciem cudzysłowu, czy bez, jako wartość liczbową.

Podobnie sytuacja wygląda w przypadku innych typów oraz systemów zapisu liczb.

0x64 to zapis w systemie szesnastkowym (heksadecymalny) oznaczający liczbę dziesiętną 100.

0x to prefix mówiący o typie notacji, a 64 to faktyczna liczba w systemie szesnastkowym.

0b01100100 to podobna sytuacja. 0b to prefix dla zapisu liczby w systemie binarnym (dwójkowym).

01100100 to faktyczna liczba w systemie dwójkowym, odpowiadająca liczbie 100 w systemie dziesiętnym.

\u0031\u0030\u0030 to ciąg znaków w standardzie kodowania unicode w zapisie szesnastkowym. Każda z liczb odpowiada znakowi z tablicy znaków.

0031 to liczba szesnastkowa, odpowiadająca liczbie dziesiętnej 49, która z kolei jest przypisana do znaku liczby 1 z tablicy znaków.

0030 w zapisie szesnastkowym to 48 w zapisie dziesiętnym i odpowiada mu z tablicy znaków liczba 0.

\u0031\u0030\u0030 to więc finalnie to samo co zapis liczby 100.

Analogicznie wygląda sytuacja z zapisem liczb z prefiksem \x.

Oznacza on również zapis szesnastkowy, jednak w skróconej dwu-znakowej wersji.

Zapis ten daje tym samym do dyspozycji mniejszy zakres z tablicy znaków (bazowe kodowanie, bez rozszerzonych znaków, jak chociażby polskie znaki alfabetu typu ą, ę, itp.).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html index 79ecbaf67..2fd2212f8 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(Number(undefined))
console.log(Number(null))
console.log(Number(false))
console.log(Number(true))
console.log(Number({}))
console.log(Number([]))

console.log(Number("a"))
console.log(Number("\f"))
console.log(Number("\n"))
console.log(Number("\r"))
console.log(Number("\t"))
console.log(Number("\v"))
console.log(Number("\b"))

console.log(Number(["a"]))
console.log(Number([0]))
console.log(Number(["0"]))
console.log(Number([0, 0]))
console.log(Number([1]))
console.log(Number(["1"]))
console.log(Number([0, 1]))

console.log(Number(""))
console.log(Number(" "))
console.log(Number(" \n \t \f \v "))
console.log(Number(" \n \t \f \v 1 "))

console.log(Number("1e2"))
console.log(Number(1e2))
console.log(Number("0x64"))
console.log(Number(0x64))
console.log(Number("0b01100100"))
console.log(Number(0b01100100))
console.log(Number("\u0031\u0030\u0030"))
console.log(Number("\x31\x30\x30"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html index cfd44e103..8f081e2b3 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Funkcja Number konwertuje przekazany argument do wartości liczbowej.

Jakie wartości zostaną zalogowane do konsoli w powyższych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html index 2900c77ee..be41d63f6 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html index 36fd9bc37..d3090618b 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
console.log(Number(false)) // 0
console.log(Number(true)) // 1
console.log(Number({})) // NaN
console.log(Number([])) // 0

console.log(Number("a")) // NaN
console.log(Number("\f")) // 0
console.log(Number("\n")) // 0
console.log(Number("\r")) // 0
console.log(Number("\t")) // 0
console.log(Number("\v")) // 0
console.log(Number("\b")) // NaN

console.log(Number(["a"])) // NaN
console.log(Number([0])) // 0
console.log(Number(["0"])) // 0
console.log(Number([0, 0])) // NaN
console.log(Number([1])) // 1
console.log(Number(["1"])) // 1
console.log(Number([0, 1])) // NaN

console.log(Number("")) // 0
console.log(Number(" ")) // 0
console.log(Number(" \n \t \f \v ")) // 0
console.log(Number(" \n \t \f \v 1 ")) // 1

console.log(Number("1e2")) // 100
console.log(Number(1e2)) // 100
console.log(Number("0x64")) // 100
console.log(Number(0x64)) // 100
console.log(Number("0b01100100")) // 100
console.log(Number(0b01100100)) // 100
console.log(Number("\u0031\u0030\u0030")) // 100
console.log(Number("\x31\x30\x30")) // 100
- - + + \ No newline at end of file diff --git a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html index 7793c37a6..3879e4e7d 100644 --- a/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html +++ b/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Próba konwersji undefined za pomocą funkcji Number zwróci NaN.

Dla wartości null zostanie jednak zwrócona już wartość liczbowa 0.

Jest to dość powszechnie niespójne zachowanie JavaScriptu, który w różnych sytuacjach różnie konwertuje wartości null i undefined.

Wartości logiczne false/true są konwertowane do liczbowych odpowiedników tj. 0/1.

Mimo, że tablice są również obiektami w języku JavaScript, pusty obiekt zostanie skonwertowany do wartości NaN, a pusta tablica do wartości liczbowej 0.

Ciągi znaków nie zawierających liczb, są konwertowane do wartości NaN.

Poprzedzenie litery znakiem wstecznego ukośnika powoduje tzw. ucieczkę (escape) danego znaku.

Znaki f, n, r, t, v, b poprzedzone \ generują białe znaki (podobnie jak np. spacja).

W zależności od znaku może to być np. wstawienie tabulatora, przejście do nowej linii, itp..

Funkcja Number konwertuje białe znaki (w tym standardowe spacje), do wartości liczbowej 0.

Wyjątkiem jest \b, który oznacza wstawienie wstecznej spacji (backspace) i jest konwertowane do wartości NaN.

W przypadku tablic, jeśli składają się tylko z jednego elementu, Number konwertuje je tak samo, jak gdyby wartości nie były elementem tablicy.

Gdy jednak tablica zawiera więcej niż jeden element, w efekcie konwersji zwracana jest wartość NaN.

Białe znaki łączone w ciąg białych znaków zachowują się tak samo jak pojedyncze, tj. są w całości konwertowane do wartości 0.

Jeśli jednak wśród białych znaków wystąpi wartość liczbowa, jest ona konwertowana do wartości liczbowej, ignorując wszystkie występujące sąsiadujące białe znaki.

Ostatnią grupą są wartości liczbowe zapisywane w innych notacjach lub systemach liczbowych.

1e2 to zapis liczby w notacji naukowej. Litera e jest skrótem od exponential czyli notacji wykładniczej, czyli potęgowania liczby 10. Wartość po literze e to wielkość wykładnika potęgi.

1e2 to więc to samo co 1 * 10 ** 2 (gdzie ** to w JavaScript operator potęgowania).

Upraszczając do zapisu tekstowego, 1 razy 10 do potęgi 2.

Liczba występująca po e oznacza więc ilość zer, które należałoby zapisać stosując standardowy zapis liczby dziesiętnej.

1e2 daje nam więc w standardowym zapisie liczbę dziesiętną 100.

W przypadku konwersji poprzez Number() nie ma znaczenia czy przekażemy taką notację jako ciąg znaków, czyli z użyciem cudzysłowu, czy bez, jako wartość liczbową.

Podobnie sytuacja wygląda w przypadku innych typów oraz systemów zapisu liczb.

0x64 to zapis w systemie szesnastkowym (heksadecymalny) oznaczający liczbę dziesiętną 100.

0x to prefix mówiący o typie notacji, a 64 to faktyczna liczba w systemie szesnastkowym.

0b01100100 to podobna sytuacja. 0b to prefix dla zapisu liczby w systemie binarnym (dwójkowym).

01100100 to faktyczna liczba w systemie dwójkowym, odpowiadająca liczbie 100 w systemie dziesiętnym.

\u0031\u0030\u0030 to ciąg znaków w standardzie kodowania unicode w zapisie szesnastkowym. Każda z liczb odpowiada znakowi z tablicy znaków.

0031 to liczba szesnastkowa, odpowiadająca liczbie dziesiętnej 49, która z kolei jest przypisana do znaku liczby 1 z tablicy znaków.

0030 w zapisie szesnastkowym to 48 w zapisie dziesiętnym i odpowiada mu z tablicy znaków liczba 0.

\u0031\u0030\u0030 to więc finalnie to samo co zapis liczby 100.

Analogicznie wygląda sytuacja z zapisem liczb z prefiksem \x.

Oznacza on również zapis szesnastkowy, jednak w skróconej dwu-znakowej wersji.

Zapis ten daje tym samym do dyspozycji mniejszy zakres z tablicy znaków (bazowe kodowanie, bez rozszerzonych znaków, jak chociażby polskie znaki alfabetu typu ą, ę, itp.).

- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html index 49150d2e0..baffbe1f0 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #077

🪲 Znajdź buga

const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters)
console.log(letters.length)
console.log(letters[letters.indexOf(9)])

Jaki efekt będzie miało przypisanie wartości do ujemnego indeksu tablicy? Czy wpłynie to na jej długość?

Co zostanie zalogowane do konsoli w poszczególnych wywołaniach?

🧪 Rozwiązanie

const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters) // ["a", "b", undefined, "d"]
console.log(letters.length) // 4
console.log(letters[letters.indexOf(9)]) // "z"

Przypisanie wartości do ujemnych indeksów w tablicy powoduje ukrycie tych elementów dla większości metod w prototypie Array.

Przypisując wartości do ujemnych indeksów tablicy, nie zobaczymy tych wartości logując do konsoli tablicę, czy sprawdzając jej długość.

Możemy jednak ręcznie wyciągać wartości odwołując się do tych indeksów np. letters[-2].

Indeks -1 jest zwracany przez niektóre metody (w tym indexOf()) jako informacja o braku szukanej wartości w tablicy.

Wywołując przykładowo letters.indexOf("x") szukalibyśmy ciągu znaków "x" w tablicy letters z zamiarem otrzymania indeksu szukanego elementu.

Jeśli nie zostaje on znaleziony, metoda indexOf() zwraca -1.

Możemy skorzystać z tej własności zacieniając jednocześnie faktyczne działanie kodu.

Wywołując letters.indexOf(9) szukamy indeksu elementu o wartości 9, czyli nie istniejącego w naszej tablicy.

Nie ma znaczenia co przekażemy jako argument do metody indexOf(), tak długo jak będzie to wartość, która w tablicy nie występuje, zwrócony zostanie indeks -1.

letters[letters.indexOf(9)] to tak naprawdę letters[-1], czyli pobranie elementu z tablicy o indeksie -1.

Domyślnie w tablicy nie powinno być elementu pod takim indeksem, ale my przypisaliśmy wcześniej wartość z to tego indeksu.

Być może lepiej byłoby gdyby metoda indexOf() zwracała np. undefined w momencie gdy szukana wartość nie zostaje odnaleziona.

Nie byłoby wtedy furtki dla nie do końca intuicyjne działającego kodu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html index eb2ec0f84..3ca740227 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters)
console.log(letters.length)
console.log(letters[letters.indexOf(9)])
- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html index 0657f22b8..03151762b 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jaki efekt będzie miało przypisanie wartości do ujemnego indeksu tablicy? Czy wpłynie to na jej długość?

Co zostanie zalogowane do konsoli w poszczególnych wywołaniach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html index 4895f714e..b13ab46b4 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html index 1be317972..8ee89b081 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const letters = []
letters[0] = "a"
letters[1] = "b"
letters[3] = "d"
letters[-1] = "z"
letters[-2] = "y"

console.log(letters) // ["a", "b", undefined, "d"]
console.log(letters.length) // 4
console.log(letters[letters.indexOf(9)]) // "z"
- - + + \ No newline at end of file diff --git a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html index f1d84d31c..87f8e2568 100644 --- a/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html +++ b/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Przypisanie wartości do ujemnych indeksów w tablicy powoduje ukrycie tych elementów dla większości metod w prototypie Array.

Przypisując wartości do ujemnych indeksów tablicy, nie zobaczymy tych wartości logując do konsoli tablicę, czy sprawdzając jej długość.

Możemy jednak ręcznie wyciągać wartości odwołując się do tych indeksów np. letters[-2].

Indeks -1 jest zwracany przez niektóre metody (w tym indexOf()) jako informacja o braku szukanej wartości w tablicy.

Wywołując przykładowo letters.indexOf("x") szukalibyśmy ciągu znaków "x" w tablicy letters z zamiarem otrzymania indeksu szukanego elementu.

Jeśli nie zostaje on znaleziony, metoda indexOf() zwraca -1.

Możemy skorzystać z tej własności zacieniając jednocześnie faktyczne działanie kodu.

Wywołując letters.indexOf(9) szukamy indeksu elementu o wartości 9, czyli nie istniejącego w naszej tablicy.

Nie ma znaczenia co przekażemy jako argument do metody indexOf(), tak długo jak będzie to wartość, która w tablicy nie występuje, zwrócony zostanie indeks -1.

letters[letters.indexOf(9)] to tak naprawdę letters[-1], czyli pobranie elementu z tablicy o indeksie -1.

Domyślnie w tablicy nie powinno być elementu pod takim indeksem, ale my przypisaliśmy wcześniej wartość z to tego indeksu.

Być może lepiej byłoby gdyby metoda indexOf() zwracała np. undefined w momencie gdy szukana wartość nie zostaje odnaleziona.

Nie byłoby wtedy furtki dla nie do końca intuicyjne działającego kodu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html index 3c3d51767..6912947c8 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #018

🪲 Znajdź buga

function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))

Czy funkcja sum() zostanie wykonana? Jeśli tak, to jaki zwróci wynik?

🧪 Rozwiązanie

"use strict"

function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))

W przykładzie z błędem, do konsoli zostanie zalogowany wynik 35.

Zdublowanie nazwy parametru w deklaracji funkcji prowadzi do nadpisania wartości przez ostatni nadpisujący parametr.

W naszym przypadku a + a + c z przekazanymi argumentami 5, 10, 15 prowadzi do wykonania działania 10 + 10 + 15.

Wystąpienie takiej sytuacji powinno być jednak zgłoszone przez JavaScript jako błąd składniowy.

Nie otrzymujemy jednak takiego błędu, ponieważ kod z przykładu działa w trybie nieścisłym.

Aby aktywować tryb ścisły, musimy użyć deklaracji "use strict".

Stosuje się ją na początku pliku, jeśli chcemy aktywować tryb ścisły w całym pliku, lub na początku wnętrza definiowanej funkcji, jeśli tryb ścisły ma być aktywny tylko dla danej funkcji.

Tryb ścisły jest też domyślnie aktywowany w JavaScriptowych modułach. Używając więc eksportu lub importu np. export function sum(a, a, c) też aktywujemy tryb ścisły.

Ważne: brak zgłoszonego błędu w przypadku nadpisywania parametrów funkcji to nie jedyna sytuacja, w której wykonywany kod może zachować się inaczej w zależności od aktywnego, bądź nie, trybu ścisłego.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html index 183e4fa91..058a93318 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html index 1d80aadd3..ea0ba0cc5 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy funkcja sum() zostanie wykonana? Jeśli tak, to jaki zwróci wynik?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html index 93365d3af..117327d36 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html index 9663adda2..8a7268bbe 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
"use strict"

function sum(a, a, c) {
return a + a + c
}

console.log(sum(5, 10, 15))
- - + + \ No newline at end of file diff --git a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html index 9c62a136a..bd1affceb 100644 --- a/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html +++ b/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie zalogowany wynik 35.

Zdublowanie nazwy parametru w deklaracji funkcji prowadzi do nadpisania wartości przez ostatni nadpisujący parametr.

W naszym przypadku a + a + c z przekazanymi argumentami 5, 10, 15 prowadzi do wykonania działania 10 + 10 + 15.

Wystąpienie takiej sytuacji powinno być jednak zgłoszone przez JavaScript jako błąd składniowy.

Nie otrzymujemy jednak takiego błędu, ponieważ kod z przykładu działa w trybie nieścisłym.

Aby aktywować tryb ścisły, musimy użyć deklaracji "use strict".

Stosuje się ją na początku pliku, jeśli chcemy aktywować tryb ścisły w całym pliku, lub na początku wnętrza definiowanej funkcji, jeśli tryb ścisły ma być aktywny tylko dla danej funkcji.

Tryb ścisły jest też domyślnie aktywowany w JavaScriptowych modułach. Używając więc eksportu lub importu np. export function sum(a, a, c) też aktywujemy tryb ścisły.

Ważne: brak zgłoszonego błędu w przypadku nadpisywania parametrów funkcji to nie jedyna sytuacja, w której wykonywany kod może zachować się inaczej w zależności od aktywnego, bądź nie, trybu ścisłego.

- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html index 0aed71dbf..e2a99ea25 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #010

🪲 Znajdź buga

function returnDummyObject() {
return
{
foo: "bar"
}
}

console.log(returnDummyObject())

Chcemy stworzyć prostą funkcję, która zwraca obiekt. Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

function returnDummyObject() {
return {
foo: "bar"
}
}

console.log(returnDummyObject())

W przykładzie z błędem, w konsoli zobaczymy zalogowaną wartość undefined.

Winowajcom takiego efektu jest mechanizm ASI (skrót z ang. od Automatic Semicolon Insertion).

Język JavaScript nie wymaga wyraźnego stawiania średników na końcu wierszy. Dzieje się to automatycznie w momencie interpretowania kodu.

Są jednak pewne sytuacje, w których musimy wyraźnie postawić średnik (np. chcąc umieścić więcej niż 1 wyrażenie w jednym wierszu).

Są też takie, w których nie możemy rozdzielić kodu na wiele wierszy.

I w naszym przykładzie mamy tą drugą sytuację.

Automatyczne wstawianie średników przez JavaScript, w przykładzie z błędem, automatycznie wstawia średnik na końcu drugiego wiersza, przez co jest on interpretowany jako return;.

To z kolei wpływa na całkowite pominięcie obiektu { foo: "bar" }, gdyż jest on zdefiniowany już po deklaracji zakańczającej wykonywanie funkcji.

Przenosząc znak otwarcia klamrowego nawiasu do wiersza z return, otrzymamy pożądany efekt. Z funkcji zwrócony zostanie obiekt, a nie undefined.

Pewnym ułatwieniem w wychwyceniu tego błędu jest automatyczne kolorowanie składni w edytorze kodu. Kod, który nie zostanie wykonany w funkcji ze względu na wystąpienie wyrażenia return, zostaje wizualnie oznaczony przyciemnieniem kolorystyki kodu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html index 1723fb6c2..1fc0413a9 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function returnDummyObject() {
return
{
foo: "bar"
}
}

console.log(returnDummyObject())
- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html index 9b4cfba8e..4774ee2e2 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy stworzyć prostą funkcję, która zwraca obiekt. Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html index 7da686872..d0cb94521 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html index 7b78873ce..0f4c90265 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function returnDummyObject() {
return {
foo: "bar"
}
}

console.log(returnDummyObject())
- - + + \ No newline at end of file diff --git a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html index 27ed5431b..3128cbc02 100644 --- a/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html +++ b/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli zobaczymy zalogowaną wartość undefined.

Winowajcom takiego efektu jest mechanizm ASI (skrót z ang. od Automatic Semicolon Insertion).

Język JavaScript nie wymaga wyraźnego stawiania średników na końcu wierszy. Dzieje się to automatycznie w momencie interpretowania kodu.

Są jednak pewne sytuacje, w których musimy wyraźnie postawić średnik (np. chcąc umieścić więcej niż 1 wyrażenie w jednym wierszu).

Są też takie, w których nie możemy rozdzielić kodu na wiele wierszy.

I w naszym przykładzie mamy tą drugą sytuację.

Automatyczne wstawianie średników przez JavaScript, w przykładzie z błędem, automatycznie wstawia średnik na końcu drugiego wiersza, przez co jest on interpretowany jako return;.

To z kolei wpływa na całkowite pominięcie obiektu { foo: "bar" }, gdyż jest on zdefiniowany już po deklaracji zakańczającej wykonywanie funkcji.

Przenosząc znak otwarcia klamrowego nawiasu do wiersza z return, otrzymamy pożądany efekt. Z funkcji zwrócony zostanie obiekt, a nie undefined.

Pewnym ułatwieniem w wychwyceniu tego błędu jest automatyczne kolorowanie składni w edytorze kodu. Kod, który nie zostanie wykonany w funkcji ze względu na wystąpienie wyrażenia return, zostaje wizualnie oznaczony przyciemnieniem kolorystyki kodu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html index 60fd3231b..14379b8c5 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #021

🪲 Znajdź buga

fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.status === 404) {
return console.error("Page not found")
}

return console.error(error)
})

Chcemy odpytać API za pomocą fetch(), ale endpoint zwraca nam stronę błędu 404. Jaki będzie efekt działania powyższego kodu?

🧪 Rozwiązanie

fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
if (!response.ok) {
throw new Error("Response not ok", {
cause: response,
})
}

return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.cause.status === 404) {
return console.error("Page not found")
}

console.error(error)
})

Po uruchomieniu kodu z przykładu z błędem, w konsoli ujrzymy Error: Unexpected token 'N', "Not Found" is not valid JSON.

API, którego użyłem do tego przykładu zwraca strony z błędem (404) w formie czystego tekstu. Tekst Not Found nie jest więc prawidłowym formatem JSON, więc wywołanie response.json() wyrzuca błąd, który zostaje przechwycony w sekcji catch().

W sekcji catch() założyłem, że wyrzucony obiekt błędu, może w jakiś sposób znać status z obiektu response.

Moglibyśmy co prawda stworzyć stałą i przypisać do niej obiekt błędu const myError = Error, a następnie dodać własność status i przypisać do niej wartość z response, dodając kod myError.status = response.status.

Musielibyśmy jednak sami obsłużyć wyrzucanie takiego błędu przez throw myError.

Po pierwsze dodajemy więc sprawdzanie własność ok w obiekcie response. Jeśli jest to wartość fałszywa, to znaczy, że kod odpowiedzi z odpytywanej strony był inny niż z zakresu 200-299.

Dodajemy więc instrukcję warunkową, która sprawdza poprzez negację if (!response.ok). Jeśli warunek zostanie spełniony to samodzielnie wyrzucamy błąd, aby później obsłużyć go w sekcji catch().

Aby w łatwy sposób uzyskać dostęp do obiektu response w wychwyconym błędzie, przekazujemy go do obiektu Error jako drugi argument z obiektem opcji i własnością cause.

Finalnie wychwycony błąd w error.cause będzie zawierał cały obiekt response. Możemy więc już łatwo obsłużyć kody błędów w catch() poprzez error.cause.status.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html index d33185383..147cc198c 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.status === 404) {
return console.error("Page not found")
}

return console.error(error)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html index 554ade876..a15536521 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy odpytać API za pomocą fetch(), ale endpoint zwraca nam stronę błędu 404. Jaki będzie efekt działania powyższego kodu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html index 7a4d29fa3..1b2eca8cf 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html index c02cffb36..9f1ab3f3c 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
fetch("https://api.spacexdata.com/v4/404")
.then((response) => {
if (!response.ok) {
throw new Error("Response not ok", {
cause: response,
})
}

return response.json()
})
.then((json) => {
console.log(json)
})
.catch((error) => {
if (error.cause.status === 404) {
return console.error("Page not found")
}

console.error(error)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html index c9a92157d..b6abf079e 100644 --- a/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html +++ b/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Po uruchomieniu kodu z przykładu z błędem, w konsoli ujrzymy Error: Unexpected token 'N', "Not Found" is not valid JSON.

API, którego użyłem do tego przykładu zwraca strony z błędem (404) w formie czystego tekstu. Tekst Not Found nie jest więc prawidłowym formatem JSON, więc wywołanie response.json() wyrzuca błąd, który zostaje przechwycony w sekcji catch().

W sekcji catch() założyłem, że wyrzucony obiekt błędu, może w jakiś sposób znać status z obiektu response.

Moglibyśmy co prawda stworzyć stałą i przypisać do niej obiekt błędu const myError = Error, a następnie dodać własność status i przypisać do niej wartość z response, dodając kod myError.status = response.status.

Musielibyśmy jednak sami obsłużyć wyrzucanie takiego błędu przez throw myError.

Po pierwsze dodajemy więc sprawdzanie własność ok w obiekcie response. Jeśli jest to wartość fałszywa, to znaczy, że kod odpowiedzi z odpytywanej strony był inny niż z zakresu 200-299.

Dodajemy więc instrukcję warunkową, która sprawdza poprzez negację if (!response.ok). Jeśli warunek zostanie spełniony to samodzielnie wyrzucamy błąd, aby później obsłużyć go w sekcji catch().

Aby w łatwy sposób uzyskać dostęp do obiektu response w wychwyconym błędzie, przekazujemy go do obiektu Error jako drugi argument z obiektem opcji i własnością cause.

Finalnie wychwycony błąd w error.cause będzie zawierał cały obiekt response. Możemy więc już łatwo obsłużyć kody błędów w catch() poprzez error.cause.status.

- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html index 17c9ff7c6..cb784f0b5 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #065

🪲 Znajdź buga

const c = "constructor"
c[c][c](`console.log("It's alive!")`)()

Czy powyższy kod zadziała poprawnie i do konsoli zostanie zalogowany tekst It's alive!?

🧪 Rozwiązanie

const c = "constructor"
c[c][c](`console.log("It's alive!")`)()

Tak! W kodzie nie ma buga, wszystko zadziała poprawnie.

Wyjaśnienia wymaga jednak kwestia, dlaczego ciąg znaków został wykonany.

W procesie tworzenia obiektów udział biorą funkcje nazywane konstruktorami.

W utworzonym obiekcie możemy dostać się do takiej funkcji uruchamiając na niej metodę o nazwie constructor.

"".constructor zwróci więc funkcję konstruktora obiektu ciągu znaków, czyli String.

Przypisując ciąg znaków "constructor" do stałej, a później używając jej w c[c][c], uzyskamy ten sam efekt co wywołując kod "constructor".constructor.constructor.

Wiemy już, że konstruktorem ciągu znaków jest funkcja String.

Idąc krok dalej, sprawdzamy jaki konstruktor bierze udział w procesie tworzenia obiektu ciągu znaków, czyli ekwiwalent wywołania String.constructor.

Okazuje się, że zwrócony zostaje konstruktor funkcji, czyli Function.

c[c][c]() to więc finalnie to samo co Function().

W JavaScript do tworzenia funkcji możemy użyć funkcji konstruktora obiektu funkcji, przekazując jako argument ciąg znaków, który zostanie wykonany jako ciało funkcji.

Function(`console.log("It's alive!")`) tworzy więc nową funkcję, której ciałem staje się przekazany ciąg znaków.

Działaniem przypomina to funkcję eval(), która również przetwarza przekazany w argumencie ciąg znaków do postaci wykonywanego kodu.

Finalnie wykonujemy nowo utworzoną funkcję poprzez dodanie nawiasów na końcu Function(`console.log("It's alive!")`)().

Otrzymujemy ten sam efekt, który dało nam wywołanie\ c[c][c](`console.log("It's alive!")`)().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html index e099491e0..fbd56ac12 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const c = "constructor"
c[c][c](`console.log("It's alive!")`)()
- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html index 852e82a8c..6da2c4c5a 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy powyższy kod zadziała poprawnie i do konsoli zostanie zalogowany tekst It's alive!?

- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html index d16ffeb45..b65ddadb7 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html index bf454b0f2..800b67725 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const c = "constructor"
c[c][c](`console.log("It's alive!")`)()
- - + + \ No newline at end of file diff --git a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html index de43f7e5e..9fc446887 100644 --- a/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html +++ b/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Tak! W kodzie nie ma buga, wszystko zadziała poprawnie.

Wyjaśnienia wymaga jednak kwestia, dlaczego ciąg znaków został wykonany.

W procesie tworzenia obiektów udział biorą funkcje nazywane konstruktorami.

W utworzonym obiekcie możemy dostać się do takiej funkcji uruchamiając na niej metodę o nazwie constructor.

"".constructor zwróci więc funkcję konstruktora obiektu ciągu znaków, czyli String.

Przypisując ciąg znaków "constructor" do stałej, a później używając jej w c[c][c], uzyskamy ten sam efekt co wywołując kod "constructor".constructor.constructor.

Wiemy już, że konstruktorem ciągu znaków jest funkcja String.

Idąc krok dalej, sprawdzamy jaki konstruktor bierze udział w procesie tworzenia obiektu ciągu znaków, czyli ekwiwalent wywołania String.constructor.

Okazuje się, że zwrócony zostaje konstruktor funkcji, czyli Function.

c[c][c]() to więc finalnie to samo co Function().

W JavaScript do tworzenia funkcji możemy użyć funkcji konstruktora obiektu funkcji, przekazując jako argument ciąg znaków, który zostanie wykonany jako ciało funkcji.

Function(`console.log("It's alive!")`) tworzy więc nową funkcję, której ciałem staje się przekazany ciąg znaków.

Działaniem przypomina to funkcję eval(), która również przetwarza przekazany w argumencie ciąg znaków do postaci wykonywanego kodu.

Finalnie wykonujemy nowo utworzoną funkcję poprzez dodanie nawiasów na końcu Function(`console.log("It's alive!")`)().

Otrzymujemy ten sam efekt, który dało nam wywołanie\ c[c][c](`console.log("It's alive!")`)().

- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html index bf3f642c2..00f2f99cd 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #051

🪲 Znajdź buga

const string = "code"
const stringified = JSON.stringify("code")

console.log(string === stringified)

Czy porównanie zaloguje do konsoli prawdę, czy fałsz?

🧪 Rozwiązanie

const string = '"code"'
const stringified = JSON.stringify("code")

console.log(string === stringified)

W przykładzie z błędem zostanie zalogowana wartość false.

JSON.stringify() zwraca ciąg znaków w formacie JSON (skrót od JavaScript Object Notation).

Możliwość odwrócenia tego procesu zapewnia JSON.parse().

Format JSON jest ciągiem znaków, więc wszelkie wartości z JavaScript muszą być zaprezentowane jako ciąg znaków.

Jak więc w JSON odróżnić np. ciąg znaków od wartości liczbowej, albo logicznej?

Ciąg znaków prezentowany jest w podwójnym cudzysłowie, podczas gdy inne wartości prymitywne, bez.

Do stałej stringified przypisany zostaje więc ciąg znaków "code".

Chcą przypisać taką wartość ręcznie, musielibyśmy użyć \ dla uniknięcia wewnętrznych cudzysłowów, definiując to jako "\"code\"", lub nieco prościej, używając pojedynczego cudzysłowu '"code"'.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html index 7865118c2..fe878b543 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const string = "code"
const stringified = JSON.stringify("code")

console.log(string === stringified)
- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html index 2b89fa112..0ce9127d5 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy porównanie zaloguje do konsoli prawdę, czy fałsz?

- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html index dc7158f39..f090085d2 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html index 1f9e7d8fa..9234d7e45 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const string = '"code"'
const stringified = JSON.stringify("code")

console.log(string === stringified)
- - + + \ No newline at end of file diff --git a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html index 402392603..43b3b4e1a 100644 --- a/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html +++ b/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem zostanie zalogowana wartość false.

JSON.stringify() zwraca ciąg znaków w formacie JSON (skrót od JavaScript Object Notation).

Możliwość odwrócenia tego procesu zapewnia JSON.parse().

Format JSON jest ciągiem znaków, więc wszelkie wartości z JavaScript muszą być zaprezentowane jako ciąg znaków.

Jak więc w JSON odróżnić np. ciąg znaków od wartości liczbowej, albo logicznej?

Ciąg znaków prezentowany jest w podwójnym cudzysłowie, podczas gdy inne wartości prymitywne, bez.

Do stałej stringified przypisany zostaje więc ciąg znaków "code".

Chcą przypisać taką wartość ręcznie, musielibyśmy użyć \ dla uniknięcia wewnętrznych cudzysłowów, definiując to jako "\"code\"", lub nieco prościej, używając pojedynczego cudzysłowu '"code"'.

- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html index 03af7f68e..9ac00ddaa 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #023

🪲 Znajdź buga

function getNumber() {
try {
// Some code that can throw an error
return 1
} catch {
return 2
} finally {
return 3
}
}

console.log(getNumber())

Zakładając, że wewnątrz funkcji wywołujemy kod, który może wyrzucić nam wyjątek, umieszczamy go w wyrażeniu try...catch. Jaka wartość zostanie zwrócona po wywołaniu funkcji? Czy gdyby wyrzucony został wyjątek w bloku try { ... } kod zachowałby się inaczej?

🧪 Rozwiązanie

function getNumber() {
try {
// Some code that can throw an error
//
} catch {
//
} finally {
return 3
}
}

console.log(getNumber())

W przykładzie z błędem zostanie zwrócona wartość 3.

Niezależnie od tego czy wewnątrz bloku try zostanie wyrzucony wyjątek, blok finally wykona się zawsze, w dodatku bezpośrednio przed wyrażeniami przepływu sterowania (return, throw, break, continue) w innych blokach.

Używając return w bloku finally nie ma sensu abyśmy używali return w pozostałych blokach, bo po prostu nie zostanie on wykonany.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html index f569dd471..f62b97e24 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function getNumber() {
try {
// Some code that can throw an error
return 1
} catch {
return 2
} finally {
return 3
}
}

console.log(getNumber())
- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html index 816c4d857..d476523d7 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Zakładając, że wewnątrz funkcji wywołujemy kod, który może wyrzucić nam wyjątek, umieszczamy go w wyrażeniu try...catch. Jaka wartość zostanie zwrócona po wywołaniu funkcji? Czy gdyby wyrzucony został wyjątek w bloku try { ... } kod zachowałby się inaczej?

- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html index 0dac4bdd6..1ca1c8f3a 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html index db0fda4d6..12bc1af6c 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function getNumber() {
try {
// Some code that can throw an error
//
} catch {
//
} finally {
return 3
}
}

console.log(getNumber())
- - + + \ No newline at end of file diff --git a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html index 7042059b1..df6df9ce2 100644 --- a/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html +++ b/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem zostanie zwrócona wartość 3.

Niezależnie od tego czy wewnątrz bloku try zostanie wyrzucony wyjątek, blok finally wykona się zawsze, w dodatku bezpośrednio przed wyrażeniami przepływu sterowania (return, throw, break, continue) w innych blokach.

Używając return w bloku finally nie ma sensu abyśmy używali return w pozostałych blokach, bo po prostu nie zostanie on wykonany.

- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html index 49cad5ee5..539176dc4 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #035

🪲 Znajdź buga

let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/i, "Jan")

console.log(twister)

W ciągu znaków chcemy zamienić wystąpienia słowa karol (niezależnie od wielkości liter) na słowo Jan.

Czy Karol zostanie zamieniony na Jan, a Karolina na Janina?

🧪 Rozwiązanie

let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/gi, "Jan")

console.log(twister)

W przykładzie z błędem, zamienione zostanie tylko pierwsze wystąpienie

Król Jan
kupił królowej Karolinie
korale koloru koralowego

Jeśli w metodzie replace() jako pierwszego argumentu (szukanego fragmentu) użylibyśmy ciągu znaków, możliwa byłaby zamiana tylko i wyłącznie pierwszego wystąpienia.

Chcąc zamienić wszystkie wystąpienia należałoby wtedy użyć metody replaceAll().

Jednak przekazując w pierwszym argumencie replace() wyrażenie regularne (zdefiniowane wewnątrz dwóch ukośników /), możemy ustawić w nim również flagi, takiej jak niewrażliwości na wielkość liter (i), czy działanie globalne (g).

Z flagą globalną (g) w wyrażeniu regularnym, działanie replace() będzie miało efekt w całym ciągu znaków.

Król Jan
kupił królowej Janinie
korale koloru koralowego

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html index 6e6e6f560..872c5e60b 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/i, "Jan")

console.log(twister)
- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html index c5895ec0b..77ad6f656 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W ciągu znaków chcemy zamienić wystąpienia słowa karol (niezależnie od wielkości liter) na słowo Jan.

Czy Karol zostanie zamieniony na Jan, a Karolina na Janina?

- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html index b5ffb13ff..96e225338 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html index 7e54a4cdf..6138cf9bb 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let twister = `
Król Karol
kupił królowej Karolinie
korale koloru koralowego
`
twister = twister.replace(/karol/gi, "Jan")

console.log(twister)
- - + + \ No newline at end of file diff --git a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html index ccd2521d8..0b63cc832 100644 --- a/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html +++ b/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, zamienione zostanie tylko pierwsze wystąpienie

Król Jan
kupił królowej Karolinie
korale koloru koralowego

Jeśli w metodzie replace() jako pierwszego argumentu (szukanego fragmentu) użylibyśmy ciągu znaków, możliwa byłaby zamiana tylko i wyłącznie pierwszego wystąpienia.

Chcąc zamienić wszystkie wystąpienia należałoby wtedy użyć metody replaceAll().

Jednak przekazując w pierwszym argumencie replace() wyrażenie regularne (zdefiniowane wewnątrz dwóch ukośników /), możemy ustawić w nim również flagi, takiej jak niewrażliwości na wielkość liter (i), czy działanie globalne (g).

Z flagą globalną (g) w wyrażeniu regularnym, działanie replace() będzie miało efekt w całym ciągu znaków.

Król Jan
kupił królowej Janinie
korale koloru koralowego
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html index 99de00791..eed97f96a 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #014

🪲 Znajdź buga

for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000)
}

Chcemy wykonać kod (console.log()) 10 razy z odstępami 1 sekundy pomiędzy wywołaniami kodu.

Czy przedstawiony kod zadziała zgodnie z tymi założeniami?

🧪 Rozwiązanie

for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000 * i)
}

Efektem działania błędnego kodu będzie zalogowanie tekstu do konsoli po upływie jednej sekundy, dziesięciokrotnie naraz.

Nasz błąd logiczny ukrył się w przekazanym argumencie opóźnienia w funkcji setTimeout().

Ustawione opóźnienie 1 sekundy (1000 milisekund) nie zmienia się w żadnej iteracji pętli.

Pętla for(), 10 razy wywołuje setTimeout(), który przy każdym wywołaniu ma ustawiane to samo opóźnienie.

Aby uzyskać pożądany efekt 1 sekundowych opóźnień pomiędzy wywołaniami kodu, musimy pomnożyć opóźnienie przez wartość indeksu (i) w każdej z iteracji pętli

Uzyskamy wtedy wywołania z rosnącą różnicą odstępu czasu:

  • setTimeout(() => {...}, 0)
  • setTimeout(() => {...}, 1000)
  • setTimeout(() => {...}, 2000)

I właśnie o taki efekt nam chodzi.

Pomiędzy każdym z wywołań kodu z anonimowej funkcji strzałkowej przekazanej jako callback do setTimeout(), różnica odstępu wykonania kodu w czasie będzie wynosiła 1000 milisekund.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html index afd97fa5e..45c7615a0 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000)
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html index 894b7b22a..0040f2e0c 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy wykonać kod (console.log()) 10 razy z odstępami 1 sekundy pomiędzy wywołaniami kodu.

Czy przedstawiony kod zadziała zgodnie z tymi założeniami?

- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html index fcc2374ff..8052f6367 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html index 9a95a99c8..623576eca 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log("Execute with delay")
}, 1000 * i)
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html index c0349cd6b..8f020a5e6 100644 --- a/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html +++ b/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Efektem działania błędnego kodu będzie zalogowanie tekstu do konsoli po upływie jednej sekundy, dziesięciokrotnie naraz.

Nasz błąd logiczny ukrył się w przekazanym argumencie opóźnienia w funkcji setTimeout().

Ustawione opóźnienie 1 sekundy (1000 milisekund) nie zmienia się w żadnej iteracji pętli.

Pętla for(), 10 razy wywołuje setTimeout(), który przy każdym wywołaniu ma ustawiane to samo opóźnienie.

Aby uzyskać pożądany efekt 1 sekundowych opóźnień pomiędzy wywołaniami kodu, musimy pomnożyć opóźnienie przez wartość indeksu (i) w każdej z iteracji pętli

Uzyskamy wtedy wywołania z rosnącą różnicą odstępu czasu:

  • setTimeout(() => {...}, 0)
  • setTimeout(() => {...}, 1000)
  • setTimeout(() => {...}, 2000)

I właśnie o taki efekt nam chodzi.

Pomiędzy każdym z wywołań kodu z anonimowej funkcji strzałkowej przekazanej jako callback do setTimeout(), różnica odstępu wykonania kodu w czasie będzie wynosiła 1000 milisekund.

- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html index 75d317ba4..e8c7c83f1 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #053

🪲 Znajdź buga

const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
})
.then((data) => {
console.log(data)
})

Chcemy pobrać dane z API (np. listę filmów Star Wars), przetworzyć te dane, a następnie zalogować je do konsoli.

Czy ten plan zadziała w powyższym przykładzie?

🧪 Rozwiązanie

const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
return data
})
.then((data) => {
console.log(data)
})

W przykładzie z błędem, do konsoli zalogowane zostanie undefined.

Dzieje się tak, ponieważ w poprzednim wywołaniu metody then(), nie zwróciliśmy żadnej wartości.

Obietnica (promise) wypełniła się zwracając wartość undefined, tak samo, jak gdybyśmy wywołali standardową funkcję, która nic nie zwraca.

Podobna sytuacja miałaby miejsce z res.json(), gdybyśmy nie zwrócili danych z tego wywołania. W kolejnym wywołaniu, tam gdzie chcemy dane przetworzyć, zamiast danych dostalibyśmy undefined.

Brak nawiasów w naszym przykładzie powoduje, że wartość z anonimowej funkcji strzałkowej (res) => res.json() jest automatycznie zwracana w przeciwieństwie do sytuacji (res) => { res.json() }.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html index 45a4b5dfe..cdc4cfd8a 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
})
.then((data) => {
console.log(data)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html index 0526220c4..623094e45 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy pobrać dane z API (np. listę filmów Star Wars), przetworzyć te dane, a następnie zalogować je do konsoli.

Czy ten plan zadziała w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html index 191941a3c..296bdb9ad 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html index 04a5779b3..bffda1e11 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const url =
"https://swapi.dev/api/films?format=json"

fetch(url)
.then((res) => res.json())
.then((data) => {
// do something with data
return data
})
.then((data) => {
console.log(data)
})
- - + + \ No newline at end of file diff --git a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html index 363eb8e2a..eaffd2c61 100644 --- a/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html +++ b/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zalogowane zostanie undefined.

Dzieje się tak, ponieważ w poprzednim wywołaniu metody then(), nie zwróciliśmy żadnej wartości.

Obietnica (promise) wypełniła się zwracając wartość undefined, tak samo, jak gdybyśmy wywołali standardową funkcję, która nic nie zwraca.

Podobna sytuacja miałaby miejsce z res.json(), gdybyśmy nie zwrócili danych z tego wywołania. W kolejnym wywołaniu, tam gdzie chcemy dane przetworzyć, zamiast danych dostalibyśmy undefined.

Brak nawiasów w naszym przykładzie powoduje, że wartość z anonimowej funkcji strzałkowej (res) => res.json() jest automatycznie zwracana w przeciwieństwie do sytuacji (res) => { res.json() }.

- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html index 0701e87f4..dbde273c4 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #045

🪲 Znajdź buga

const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers.indexOf(NaN))
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))

Chcemy sprawdzić czy w tablicy znajdują się różne wartości oraz chcemy poznać ich indeks (pozycję) w tablicy.

Co zostanie zalogowane do konsoli po wywołaniu powyższego kodu?

🧪 Rozwiązanie

const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers
.findIndex((number) => Number.isNaN(number))
)
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))

Wszystkie wywołania metody includes() zwrócą prawdę.

Wartości NaN oraz null zostaną poprawnie znalezione w tablicy.

Wywołując metodę indexOf() dostaniemy jednak wartość -1 dla próby odnalezienia indeksu dla wartości NaN.

Metoda indexOf() dla odnajdywania elementów używa tego samego algorytmu co operator porównania ścisłego ===.

Wartości NaN porównywane z jakąkolwiek wartością (nawet z wartością NaN) zawsze zwracają fałsz.

Wywołując indexOf() z argumentem NaN zwrócone zostanie zawsze -1 czyli informacja, że wartość nie została znaleziona w tablicy.

Aby rozwiązać ten problem musimy użyć innej metody np. findIndex() i samodzielnie skonstruować funkcję sprawdzającą pod kątem wystąpienia wartości NaN.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html index 64dabe11a..9179d564d 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers.indexOf(NaN))
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))
- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html index 9613d34b6..3bdf29846 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy sprawdzić czy w tablicy znajdują się różne wartości oraz chcemy poznać ich indeks (pozycję) w tablicy.

Co zostanie zalogowane do konsoli po wywołaniu powyższego kodu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html index 2e4e9b49d..8015e7cdd 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html index 35f6051c1..5fed04cab 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = [10, 20, NaN, 30, null]

console.log(numbers.includes(NaN))
console.log(numbers.includes(30))
console.log(numbers.includes(null))

console.log(numbers
.findIndex((number) => Number.isNaN(number))
)
console.log(numbers.indexOf(30))
console.log(numbers.indexOf(null))
- - + + \ No newline at end of file diff --git a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html index fdb7b9d63..2f43a324d 100644 --- a/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html +++ b/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wszystkie wywołania metody includes() zwrócą prawdę.

Wartości NaN oraz null zostaną poprawnie znalezione w tablicy.

Wywołując metodę indexOf() dostaniemy jednak wartość -1 dla próby odnalezienia indeksu dla wartości NaN.

Metoda indexOf() dla odnajdywania elementów używa tego samego algorytmu co operator porównania ścisłego ===.

Wartości NaN porównywane z jakąkolwiek wartością (nawet z wartością NaN) zawsze zwracają fałsz.

Wywołując indexOf() z argumentem NaN zwrócone zostanie zawsze -1 czyli informacja, że wartość nie została znaleziona w tablicy.

Aby rozwiązać ten problem musimy użyć innej metody np. findIndex() i samodzielnie skonstruować funkcję sprawdzającą pod kątem wystąpienia wartości NaN.

- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html index 75399c35d..eedfaad03 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #055

🪲 Znajdź buga

{
foo: {
console.log("first")
break foo
console.log("second")
}

break foo
console.log("third")
}

Czy powyższy kod zadziała poprawnie?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

bar: {
foo: {
console.log("first")
break foo
console.log("second")
}

break bar
console.log("third")
}

W przykładzie z błędem, do konsoli zostanie wyrzucony błąd Undefined label 'foo' w 8 linii.

Musimy go naprawić, dodając nazwę etykiety dla bloku nadrzędnego, nazywając go np. bar. Następnie możemy zatrzymać wykonywanie kodu wywołując nazwę zdefiniowanej etykiety, czyli break bar.

Wywołując przerwanie działania kodu poprzez break, możemy odnieść się do etykiety bloku tylko w obrębie bloku, którą dana etykieta definiuje.

Po naprawie tego błędu, w konsoli ujrzymy zalogowane jedynie first.

Logowania do konsoli second i third nie zostaną wykonane, ponieważ działanie kodu w blokach zostaje wcześniej przerwane poprzez break.

Etykiety (label) używa się zazwyczaj do zagnieżdżonych pętli, aby wywołując break lub continue, odwołać się do konkretnej pętli.

Etykietowanie samych bloków {} jest jednak również jak najbardziej poprawne pod względem semantyki języka JavaScript.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html index 8b1f51fd8..c954bb19b 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
{
foo: {
console.log("first")
break foo
console.log("second")
}

break foo
console.log("third")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html index 562d594a1..32548e216 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy powyższy kod zadziała poprawnie?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html index 76b1f1fdc..fa2412b01 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html index e5b48886c..2e9d219f0 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
bar: {
foo: {
console.log("first")
break foo
console.log("second")
}

break bar
console.log("third")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html index d96561214..c5bd373b4 100644 --- a/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html +++ b/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie wyrzucony błąd Undefined label 'foo' w 8 linii.

Musimy go naprawić, dodając nazwę etykiety dla bloku nadrzędnego, nazywając go np. bar. Następnie możemy zatrzymać wykonywanie kodu wywołując nazwę zdefiniowanej etykiety, czyli break bar.

Wywołując przerwanie działania kodu poprzez break, możemy odnieść się do etykiety bloku tylko w obrębie bloku, którą dana etykieta definiuje.

Po naprawie tego błędu, w konsoli ujrzymy zalogowane jedynie first.

Logowania do konsoli second i third nie zostaną wykonane, ponieważ działanie kodu w blokach zostaje wcześniej przerwane poprzez break.

Etykiety (label) używa się zazwyczaj do zagnieżdżonych pętli, aby wywołując break lub continue, odwołać się do konkretnej pętli.

Etykietowanie samych bloków {} jest jednak również jak najbardziej poprawne pod względem semantyki języka JavaScript.

- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html index af52b0ce7..0f0dc8077 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6.html @@ -6,9 +6,9 @@ Codisity - - - + + +
@@ -19,7 +19,7 @@ dostajemy\ 1.0000000000000004

1 + 5e-17 zwróci już tylko 1 i wraz ze zmniejszaniem liczby zmiennoprzecinkowej poprzez dopisywanie kolejnych miejsc po przecinku, będzie dalej otrzymywać zaokrąglony wynik dodawania, 1.

0 / 0 zwróci nam NaN, ale minVal / minVal zwróci 1, wyraźnie pokazując, że minVal zerem nie jest.

0 * 0 zwróci 0, niestety tak samo jak minVal * minVal, co może sugerować, że minVal zerem jednak jest.

W rzeczywistości jest to jednak pułapka i to ten sam problem, który dotyka operacji matematycznych wykonywanych na wszystkich zmiennoprzecinkowych liczbach, we wszystkich językach programowania.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html index cfdd93564..933fcdb1d 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const minVal = Number.MIN_VALUE

console.log(0 / 0)
console.log(minVal / minVal)

console.log(0 * 0)
console.log(minVal * minVal)

console.log(minVal + 1)
console.log(minVal - 1)

console.log(minVal)
- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html index 819f3a076..7f703acf3 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html index 3b6cb6868..45e8ec904 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html index ed6217d56..35476130f 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const minVal = Number.MIN_VALUE

console.log(0 / 0) // NaN
console.log(minVal / minVal) // 1

console.log(0 * 0) // 0
console.log(minVal * minVal) // 0

console.log(minVal + 1) // 1
console.log(minVal - 1) // -1

console.log(minVal) // 5e-324
- - + + \ No newline at end of file diff --git a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html index 8ae8c17a6..d020c9c3c 100644 --- a/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html +++ b/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.html @@ -6,9 +6,9 @@ Codisity - - - + + +
@@ -18,7 +18,7 @@ 1.0000000000000005\ dostajemy\ 1.0000000000000004

1 + 5e-17 zwróci już tylko 1 i wraz ze zmniejszaniem liczby zmiennoprzecinkowej poprzez dopisywanie kolejnych miejsc po przecinku, będzie dalej otrzymywać zaokrąglony wynik dodawania, 1.

0 / 0 zwróci nam NaN, ale minVal / minVal zwróci 1, wyraźnie pokazując, że minVal zerem nie jest.

0 * 0 zwróci 0, niestety tak samo jak minVal * minVal, co może sugerować, że minVal zerem jednak jest.

W rzeczywistości jest to jednak pułapka i to ten sam problem, który dotyka operacji matematycznych wykonywanych na wszystkich zmiennoprzecinkowych liczbach, we wszystkich językach programowania.

- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html index 24dc9bcb4..2ee1fe0da 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #090

🪲 Znajdź buga

const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar())

Obiekty (i klasy) w JavaScript mogą używać tzw. getter'ów.

Czy powyższa konstrukcja składniowa zadziała prawidłowo?

🧪 Rozwiązanie

const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar)

Getter'y służą do pobierania informacji i powinny być wywoływane jak własności obiektu, a nie metody (czyli bez nawiasów).

Getter'y nie obsługują też parametrów. Nie moglibyśmy stworzyć getter'a get bar(param).

W związku z powyższym, w przykładzie z błędem, w 11 linii zostanie wyrzucony błąd obj.bar is not a function.

Aby go naprawić, wystarczy, że usuniemy nawiasy z wywołania bar.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html index 5ef291fff..254fc8286 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar())
- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html index b47abf272..0ea221bbb 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Obiekty (i klasy) w JavaScript mogą używać tzw. getter'ów.

Czy powyższa konstrukcja składniowa zadziała prawidłowo?

- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html index 0c80dbf1f..5d264a4fb 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html index 9bc769d34..f2cd57972 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const obj = {
foo() {
return "foo"
},
get bar() {
return "bar"
},
}

console.log(obj.foo())
console.log(obj.bar)
- - + + \ No newline at end of file diff --git a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html index 2a8c7b4e1..b552dd48b 100644 --- a/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html +++ b/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Getter'y służą do pobierania informacji i powinny być wywoływane jak własności obiektu, a nie metody (czyli bez nawiasów).

Getter'y nie obsługują też parametrów. Nie moglibyśmy stworzyć getter'a get bar(param).

W związku z powyższym, w przykładzie z błędem, w 11 linii zostanie wyrzucony błąd obj.bar is not a function.

Aby go naprawić, wystarczy, że usuniemy nawiasy z wywołania bar.

- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html index b056d2c86..c54a46629 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #071

🪲 Znajdź buga

const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.hasOwnProperty("push"))
console.log("push" in myArray)

Czy wszystkie console.log() zalogują do konsoli wartość true?

🧪 Rozwiązanie

const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.__proto__.hasOwnProperty("push"))
console.log("push" in myArray)

W przykładzie z błędem, w 7 lini zostanie zalogowana wartość false.

Pozostałe wywołania zalogują wartość true.

Metoda hasOwnProperty() sprawdza czy obiekt zawiera własną własność o podanej nazwie. Własną, czyli nie odziedziczoną.

Tablice (Array) są obiektami, ale ich własności to indeksy elementów tablicy. Inne własności/metody są dziedziczone.

myArray.hasOwnProperty(0) zwróci true, ponieważ 0 jest istniejącą własnością obiektu tablicy (indeksem), pod którą przechowywana jest wartość 1.

W przypadku tablicy, byłby to ekwiwalent wywołania\ myArray[0] !== undefined.

Mimo, że tablica jako obiekt ma dostęp do metody push() to jednak nie jest to jej własna własność.

Metoda push() jest własnością prototypu obiektu tablicy.

Jej faktyczna deklaracja znajduje się w obiekcie prototypu myArray.__proto__.push.

Wywołując myArray.push() korzystamy z własności języka JavaScript jakim jest łańcuch prototypów.

JavaScript w celu wykonania danej metody, sprawdza najpierw metody zdefiniowane bezpośrednio w obiekcie, następnie metody prototypów oraz metody prototypów ich prototypów (łańcuch dziedziczenia), aż do momentu gdy znajdzie szukaną metodę lub skończy się łańcuch dziedziczonych prototypów.

hasOwnProperty() przydaje się gdy chcemy sprawdzić, czy dany obiekt ma konkretną własność zdefiniowaną jako swoją.

Gdy zależy nam na sprawdzeniu czy własność jest dostępna dla danego obiektu, uwzględniając dziedziczenie, wtedy lepiej użyć operatora in.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html index f6b1c5f2c..3e0842f88 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.hasOwnProperty("push"))
console.log("push" in myArray)
- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html index a08418c77..4396797d2 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy wszystkie console.log() zalogują do konsoli wartość true?

- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html index cb98b2563..485936f2b 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html index 345aa4a9d..a90645d57 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myObject = { push: function () {} }
const myArray = [1, 2, 3]

console.log(myObject.hasOwnProperty("push"))
console.log("push" in myObject)

console.log(myArray.__proto__.hasOwnProperty("push"))
console.log("push" in myArray)
- - + + \ No newline at end of file diff --git a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html index a37cbc1d9..89980c6af 100644 --- a/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html +++ b/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, w 7 lini zostanie zalogowana wartość false.

Pozostałe wywołania zalogują wartość true.

Metoda hasOwnProperty() sprawdza czy obiekt zawiera własną własność o podanej nazwie. Własną, czyli nie odziedziczoną.

Tablice (Array) są obiektami, ale ich własności to indeksy elementów tablicy. Inne własności/metody są dziedziczone.

myArray.hasOwnProperty(0) zwróci true, ponieważ 0 jest istniejącą własnością obiektu tablicy (indeksem), pod którą przechowywana jest wartość 1.

W przypadku tablicy, byłby to ekwiwalent wywołania\ myArray[0] !== undefined.

Mimo, że tablica jako obiekt ma dostęp do metody push() to jednak nie jest to jej własna własność.

Metoda push() jest własnością prototypu obiektu tablicy.

Jej faktyczna deklaracja znajduje się w obiekcie prototypu myArray.__proto__.push.

Wywołując myArray.push() korzystamy z własności języka JavaScript jakim jest łańcuch prototypów.

JavaScript w celu wykonania danej metody, sprawdza najpierw metody zdefiniowane bezpośrednio w obiekcie, następnie metody prototypów oraz metody prototypów ich prototypów (łańcuch dziedziczenia), aż do momentu gdy znajdzie szukaną metodę lub skończy się łańcuch dziedziczonych prototypów.

hasOwnProperty() przydaje się gdy chcemy sprawdzić, czy dany obiekt ma konkretną własność zdefiniowaną jako swoją.

Gdy zależy nam na sprawdzeniu czy własność jest dostępna dla danego obiektu, uwzględniając dziedziczenie, wtedy lepiej użyć operatora in.

- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html index 934b946b4..79179c2ca 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #030

🪲 Znajdź buga

console.log("b" + "a" + + "a" + "a")

Dziś bardziej na wesoło. Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log("b" + "a" + + "a" + "a")
// baNaNa

Konsola wyświetli baNaNa.

W JavaScript operator + ma kilka zastosowań.

Może działać jako operator matematycznego dodawania.

Może działać jako łącznik ciągów znaków.

Może przekształcać ciągi znaków na typ liczbowy, jeśli występuje z pojedynczym argumentem (wartością).

Przeanalizujmy krok po kroku, co dzieje się przy wywołaniu "b" + "a" + + "a" + "a".

Tak samo jak w matematyce, tak samo w JavaScript, operatory mają hierarchię pierwszeństwa wykonywania (precedence).

I tak jednoargumentowy (unary) operator + wykonywany jest przed operatorem dodawania +.

Jednoargumentowy operator działa wtedy, gdy po jego lewej stronie nie występuje żadna wartość.

Wystąpienie dwóch plusów + + oznacza, że drugi z nich zachowa się jako jednoargumentowy operator, ponieważ po jego lewej stronie nie ma wartości, jest tylko inny operator.

Sprawdzamy więc co znajduje się po prawej stronie jednoargumentowego operatora i jest to + + "a".

JavaScript poprzez + próbuje wykonać konwersji typu danych po prawej stronie tego operatora na typ liczbowy.

Wartość "a" nie jest jednak liczbą zapisaną jedynie jako ciąg znaków.

Operacja konwersji typu danych się nie udaje i zwrócona zostaje wartość NaN (Not a Number).

Tym samym otrzymujemy "b" + "a" + NaN + "a".

Znak dodawania pomiędzy "b" + "a" daje nam "ba" ponieważ + działa tu jako łącznik ciągów znaków.

Gdy operator + musi wybrać, czy wykonać działanie dodawania, czy łączenia ciągów znaków, wybiera to drugie jeśli którykolwiek z argumentów jest typem ciągu znaków (string).

Wartość NaN zostaje więc skonwertowana do ciągu znaków "NaN".

Finalnie daje nam to konstrukcję "ba" + "NaN" + "a", która złączona daje nam "baNaNa".

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html index ef5534fb5..68aacfc67 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("b" + "a" + + "a" + "a")
- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html index 5172b2877..dc4d81e8f 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Dziś bardziej na wesoło. Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html index 8e17b8a84..64865b72a 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html index 10f06c5d9..ad7de95f2 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("b" + "a" + + "a" + "a")
// baNaNa
- - + + \ No newline at end of file diff --git a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html index 2091055ce..942057fcb 100644 --- a/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html +++ b/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Konsola wyświetli baNaNa.

W JavaScript operator + ma kilka zastosowań.

Może działać jako operator matematycznego dodawania.

Może działać jako łącznik ciągów znaków.

Może przekształcać ciągi znaków na typ liczbowy, jeśli występuje z pojedynczym argumentem (wartością).

Przeanalizujmy krok po kroku, co dzieje się przy wywołaniu "b" + "a" + + "a" + "a".

Tak samo jak w matematyce, tak samo w JavaScript, operatory mają hierarchię pierwszeństwa wykonywania (precedence).

I tak jednoargumentowy (unary) operator + wykonywany jest przed operatorem dodawania +.

Jednoargumentowy operator działa wtedy, gdy po jego lewej stronie nie występuje żadna wartość.

Wystąpienie dwóch plusów + + oznacza, że drugi z nich zachowa się jako jednoargumentowy operator, ponieważ po jego lewej stronie nie ma wartości, jest tylko inny operator.

Sprawdzamy więc co znajduje się po prawej stronie jednoargumentowego operatora i jest to + + "a".

JavaScript poprzez + próbuje wykonać konwersji typu danych po prawej stronie tego operatora na typ liczbowy.

Wartość "a" nie jest jednak liczbą zapisaną jedynie jako ciąg znaków.

Operacja konwersji typu danych się nie udaje i zwrócona zostaje wartość NaN (Not a Number).

Tym samym otrzymujemy "b" + "a" + NaN + "a".

Znak dodawania pomiędzy "b" + "a" daje nam "ba" ponieważ + działa tu jako łącznik ciągów znaków.

Gdy operator + musi wybrać, czy wykonać działanie dodawania, czy łączenia ciągów znaków, wybiera to drugie jeśli którykolwiek z argumentów jest typem ciągu znaków (string).

Wartość NaN zostaje więc skonwertowana do ciągu znaków "NaN".

Finalnie daje nam to konstrukcję "ba" + "NaN" + "a", która złączona daje nam "baNaNa".

- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html index 512cc98a1..df7147579 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #070

🪲 Znajdź buga

console.log([, , ,].length)
console.log([, , ,].toString())

Jaka liczbowa długość tablicy i jaka ilość przecinków jako ciąg znaków zostanie zalogowana do konsoli?

🧪 Rozwiązanie

console.log([, , ,].length) // 3
console.log([, , ,].toString()) // ,,

Tablica [, , ,] to tablica z pustymi, niezdefiniowanymi slotami.

Tworząc tablicę np. [1, 2, , 4], definiujemy tablicę z 4 elementami, z czego trzecią wartością jest undefined.

Gdy dostawimy kolejny przecinek na końcu [1, 2, , 4,], nie spowoduje on utworzenie kolejnego, piątek elementu tablicy.

Zamiast tego zostanie zignorowany, ze względu na własność JavaScript zwaną końcowym przecinkiem (trailing comma).

Zapisując tą samą tablicę w inny sposób, umieszczając każdy element w nowej lini, końcowy przecinek nabiera więcej sensu.

[
1,
2,
,
4,
]

Dla wygody dopisywania kolejnych elementów w takim zapisie, końcowy przecinek nie wprowadza nowego elementu, a jest jedynie częścią spójnego zapisu każdego z elementów z tablicy.

JavaScript ignoruje więc końcowy przecinek i nie traktuje go jako rozdzielacz elementów.

Tablica [, , ,], ma więc długość (liczbę elementów) równą 3.

Taką samą długość będzie miała tablica bez pustych wartości, przykładowo [1, 2, 3,].

Dla uproszczenia można zadać sobie pytanie - ile przecinków jest potrzebnych do rozdzielenia N elementów.

Będzie to zawsze wartość o 1 mniejsza niż liczba elementów.

Konwersja tablicy [, , ,] do ciągu znaków wyraźnie to pokazuje, logując do konsoli ciąg znaków składający się z dwóch przecinków (w tablicy są 3 elementy, a 3 minus 1 daje nam 2 przecinki rozdzielające).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html index 797b1eee2..5539409ee 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log([, , ,].length)
console.log([, , ,].toString())
- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html index f1f365084..1ca35a0b4 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jaka liczbowa długość tablicy i jaka ilość przecinków jako ciąg znaków zostanie zalogowana do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html index 336e04c63..e2234b67a 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html index 71078907f..2dcd64ba0 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log([, , ,].length) // 3
console.log([, , ,].toString()) // ,,
- - + + \ No newline at end of file diff --git a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html index edc61aafb..ba584104d 100644 --- a/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html +++ b/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Tablica [, , ,] to tablica z pustymi, niezdefiniowanymi slotami.

Tworząc tablicę np. [1, 2, , 4], definiujemy tablicę z 4 elementami, z czego trzecią wartością jest undefined.

Gdy dostawimy kolejny przecinek na końcu [1, 2, , 4,], nie spowoduje on utworzenie kolejnego, piątek elementu tablicy.

Zamiast tego zostanie zignorowany, ze względu na własność JavaScript zwaną końcowym przecinkiem (trailing comma).

Zapisując tą samą tablicę w inny sposób, umieszczając każdy element w nowej lini, końcowy przecinek nabiera więcej sensu.

[
1,
2,
,
4,
]

Dla wygody dopisywania kolejnych elementów w takim zapisie, końcowy przecinek nie wprowadza nowego elementu, a jest jedynie częścią spójnego zapisu każdego z elementów z tablicy.

JavaScript ignoruje więc końcowy przecinek i nie traktuje go jako rozdzielacz elementów.

Tablica [, , ,], ma więc długość (liczbę elementów) równą 3.

Taką samą długość będzie miała tablica bez pustych wartości, przykładowo [1, 2, 3,].

Dla uproszczenia można zadać sobie pytanie - ile przecinków jest potrzebnych do rozdzielenia N elementów.

Będzie to zawsze wartość o 1 mniejsza niż liczba elementów.

Konwersja tablicy [, , ,] do ciągu znaków wyraźnie to pokazuje, logując do konsoli ciąg znaków składający się z dwóch przecinków (w tablicy są 3 elementy, a 3 minus 1 daje nam 2 przecinki rozdzielające).

- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html index 187180fe6..e40f289f4 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #031

🪲 Znajdź buga

console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
console.log(0b_1_0 + 0b_0_1)

Który z powyższych zapisów liczbowych będzie niedozwolony?

🧪 Rozwiązanie

console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
// console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
// console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
// console.log(0b_1_0 + 0b_0_1)

Błędy zostaną wyrzucone w trzech liniach:

8: Numeric separators are not allowed here.

11: Numeric separator can not be used after leading 0.

17: Numeric separators are not allowed here.

Pozostałe zapisy liczb i działań są poprawne.

Pomiędzy cyframi w liczbach dziesiętnych można umieszczać wizualny separator _.

Przydaje się to przy trzycyfrowych grupach, czyli liczebnikach potęgi tysiąca (tysiąc, milion, miliard, itd.).

W niektórych sytuacjach, nie możemy jednak zastosować podkreślenia w zapisach liczbowych.

Podkreślenie nie może pojawić się jako pierwszy znak, bo taki zapis odnosiłby się do definiowania nazwy np. zmiennej (_myVar, _123).

Podkreślenie nie może pojawić się na końcu liczby (np. 100_).

Podkreślenie nie może wystąpić po początkowym zerze (np. 0_1).

Podkreślenia nie można użyć w zapisach wykładniczych (np. 1_e2).

Podkreślenia nie można też użyć po początkowej definicji zapisów liczb w postaci binarnej, ósemkowej, czy szesnastkowej (np. 0b_001).

Przy użyciu _ możemy więc wizualnie separować liczby dziesiętne jak np. 125_4912_6824, jak również zapisy liczby w innych systemach liczbowych np. separując co 4 bity liczb binarnych np. 0b1010_1101.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html index 7149136fb..9b723ddad 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
console.log(0b_1_0 + 0b_0_1)
- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html index 205979bad..785a1118e 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Który z powyższych zapisów liczbowych będzie niedozwolony?

- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html index f6bc93edf..e4ba8c075 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html index bb30d6760..b7ef791f9 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(1000000)
console.log(1_000_000)

console.log(1000 + 100 + 10 + 1)
console.log(1_000 + 100 + 10 + 1)

console.log(1e3 + 1e2 + 1e1 + 1)
// console.log(1_e_3 + 1e_2 + 1_e1 + 1)

console.log(10 + 1)
// console.log(1_0 + 0_1)

console.log(0b00001000 + 0b0010)
console.log(0b0000_1000 + 0b0_0_1_0)

console.log(0b10 + 0b01)
// console.log(0b_1_0 + 0b_0_1)
- - + + \ No newline at end of file diff --git a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html index 4ec26e4dc..ef106a11d 100644 --- a/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html +++ b/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Błędy zostaną wyrzucone w trzech liniach:

8: Numeric separators are not allowed here.

11: Numeric separator can not be used after leading 0.

17: Numeric separators are not allowed here.

Pozostałe zapisy liczb i działań są poprawne.

Pomiędzy cyframi w liczbach dziesiętnych można umieszczać wizualny separator _.

Przydaje się to przy trzycyfrowych grupach, czyli liczebnikach potęgi tysiąca (tysiąc, milion, miliard, itd.).

W niektórych sytuacjach, nie możemy jednak zastosować podkreślenia w zapisach liczbowych.

Podkreślenie nie może pojawić się jako pierwszy znak, bo taki zapis odnosiłby się do definiowania nazwy np. zmiennej (_myVar, _123).

Podkreślenie nie może pojawić się na końcu liczby (np. 100_).

Podkreślenie nie może wystąpić po początkowym zerze (np. 0_1).

Podkreślenia nie można użyć w zapisach wykładniczych (np. 1_e2).

Podkreślenia nie można też użyć po początkowej definicji zapisów liczb w postaci binarnej, ósemkowej, czy szesnastkowej (np. 0b_001).

Przy użyciu _ możemy więc wizualnie separować liczby dziesiętne jak np. 125_4912_6824, jak również zapisy liczby w innych systemach liczbowych np. separując co 4 bity liczb binarnych np. 0b1010_1101.

- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html index 5afbcf691..caae44b23 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #095

🪲 Znajdź buga

console.log(
8 << 3
)
console.log(
8 << 35
)
console.log(
0b00000000000000000000000000001000
)
console.log(
0b00000000000000000000000001000000
)

Jakie wartości zostaną zalogowane do konsoli i dlaczego?

🧪 Rozwiązanie

console.log(
8 << 3
) // 64
console.log(
8 << 35
) // 64
console.log(
0b00000000000000000000000000001000
) // 8
console.log(
0b00000000000000000000000001000000
) // 64

Operator przesunięcia w lewo << pozwala na modyfikację bitów poprzez ich przesunięcie w lewo o zadaną wartość.

Zwracana wartość jest w postaci dziesiętnej (decymalnej).

Dziesiętna liczba 8 to w 32 bitowym zapisie binarnym 00000000000000000000000000001000.

W JavaScript, zapis binarny poprzedzany jest prefiksem 0b.

Binarny (dwójkowy) zapis 1000 jest więc równy decymalnej (dziesiętnej) liczbie 8.

W systemie dwójkowym podstawą do potęgowania liczby jest 2.

Każdy ze znaków liczby liczony od prawej, to potęgowanie o rosnącym o 1 wykładniku, zaczynając od 0.

Binarny 1000 to 23 czyli 8.

W systemie dziesiętnym podstawą do potęgowania liczby jest 10.

Decymalny 1000 to 103 czyli 1000.

8 << 3 oznacza chęć przesunięcia binarnego zapisu decymalnej ósemki w lewo o trzy bity.

Z 1000 powstaje więc 1000000.

Binarne 1000000 to 26 czyli decymalne 64.

Co ciekawe, 8 << 35 również zwraca 64.

Ponieważ standardowy zapis liczbowy w JavaScript jest zawarty w 32 bitach, chcąc przesunąć zapis liczbowy o 35 miejsc, dochodzimy do końca 32 bitowego zapisu i wracamy na początek.

Przesunięcie o 35 miejsc to tak naprawdę przesunięcie o 35 - 32, czyli de facto 3 miejsca.

8 << 3 jest więc równe 8 << 35, 8 << 67, 8 << 99, itd. ponieważ zwiększamy przesunięcie o 32 bity czyli pełny ciąg.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html index dcbd372f0..e2f585db0 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(
8 << 3
)
console.log(
8 << 35
)
console.log(
0b00000000000000000000000000001000
)
console.log(
0b00000000000000000000000001000000
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html index ded3d3124..305f760af 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli i dlaczego?

- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html index cc7315679..c551a27c4 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html index 96fbd2ffe..b07228490 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(
8 << 3
) // 64
console.log(
8 << 35
) // 64
console.log(
0b00000000000000000000000000001000
) // 8
console.log(
0b00000000000000000000000001000000
) // 64
- - + + \ No newline at end of file diff --git a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html index fd44eabcf..504e4c7d0 100644 --- a/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html +++ b/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Operator przesunięcia w lewo << pozwala na modyfikację bitów poprzez ich przesunięcie w lewo o zadaną wartość.

Zwracana wartość jest w postaci dziesiętnej (decymalnej).

Dziesiętna liczba 8 to w 32 bitowym zapisie binarnym 00000000000000000000000000001000.

W JavaScript, zapis binarny poprzedzany jest prefiksem 0b.

Binarny (dwójkowy) zapis 1000 jest więc równy decymalnej (dziesiętnej) liczbie 8.

W systemie dwójkowym podstawą do potęgowania liczby jest 2.

Każdy ze znaków liczby liczony od prawej, to potęgowanie o rosnącym o 1 wykładniku, zaczynając od 0.

Binarny 1000 to 23 czyli 8.

W systemie dziesiętnym podstawą do potęgowania liczby jest 10.

Decymalny 1000 to 103 czyli 1000.

8 << 3 oznacza chęć przesunięcia binarnego zapisu decymalnej ósemki w lewo o trzy bity.

Z 1000 powstaje więc 1000000.

Binarne 1000000 to 26 czyli decymalne 64.

Co ciekawe, 8 << 35 również zwraca 64.

Ponieważ standardowy zapis liczbowy w JavaScript jest zawarty w 32 bitach, chcąc przesunąć zapis liczbowy o 35 miejsc, dochodzimy do końca 32 bitowego zapisu i wracamy na początek.

Przesunięcie o 35 miejsc to tak naprawdę przesunięcie o 35 - 32, czyli de facto 3 miejsca.

8 << 3 jest więc równe 8 << 35, 8 << 67, 8 << 99, itd. ponieważ zwiększamy przesunięcie o 32 bity czyli pełny ciąg.

- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html index c891bf18c..d85868d7d 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed.html @@ -6,9 +6,9 @@ Codisity - - - + + +
@@ -16,7 +16,7 @@ !(sentence instanceof Number) zwróci false.

Innym sposobem mogłoby być użycie operatora porównania\ sentence instanceof Number === false.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html index b318eb55b..24503b7d2 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const sentence = new String("Lorem ipsum dolor")

console.log(sentence instanceof String)
console.log(!sentence instanceof Number)
- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html index 2b73e6dfa..be4b88720 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy sprawdzić czy obiekt jest lub nie jest instancją danej klasy.

Co zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html index f99ff689e..cfcd444f8 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html index 94fb81ad3..7840903c8 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const sentence = new String("Lorem ipsum dolor")

console.log(sentence instanceof String)
console.log(!(sentence instanceof Number))
- - + + \ No newline at end of file diff --git a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html index efd7e0a34..aedb8ae0f 100644 --- a/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html +++ b/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

sentence instanceof String zwróci prawdę.

Ciąg znaków został stworzony za pomocą konstruktora klasy String.

Zwróć uwagę na użycie operatora new. Bez niego ciąg znaków zostałby utworzony za pomocą funkcji String nie będącej konstruktorem klasy, więc instanceof zwróciłby w takiej sytuacji fałsz (ciąg znaków byłby wtedy typem prymitywnym, a nie obiektem).

!sentence instanceof Number zwróci fałsz.

I tutaj mamy naszego buga.

W intencji mamy zanegowanie wyniku działania operatora instanceof.

W rzeczywistości negujemy jednak wartość ze stałej sentence.

Ponieważ typ danych w sentence jest obiektem, zostaje on skonwertowany poprzez działanie operatora negacji najpierw do wartości logicznej true, a następnie odwrócony do wartości false.

Wartość false z pewnością nie jest instancją klasy Number, więc finalnie do konsoli zostaje zalogowana wartość false.

Jeśli zależy nam na sprawdzeniu czy dany obiekt nie jest instancją danej klasy, musimy całą operację sprawdzania instancji umieścić wewnątrz nawiasów i zanegować dopiero efekt takiego sprawdzenia.

sentence instanceof Number zwróci true.\ !(sentence instanceof Number) zwróci false.

Innym sposobem mogłoby być użycie operatora porównania\ sentence instanceof Number === false.

- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html index d647b9523..bcdf4c117 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #091

🪲 Znajdź buga

const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed)
console.log(objFreezed)

Czy w powyższym przykładzie istniejące własności obiektów mogą zostać usunięte, a nowe własności mogą zostać dodane?

Jakie wartości obiektów zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed) // { value: 22 }
console.log(objFreezed) // { value: 11 }

Obiekty można pieczętować (seal) oraz zamrażać (freeze).

Obie metody działają bardzo podobnie, blokując modyfikacje takie jak usuwanie czy dodawanie własności obiektu.

Obiekt zapieczętowany przez Object.seal() umożliwia jednak modyfikację istniejących własności w przeciwieństwie do obiektu zamrożonego przez Object.freeze().

objSealed zezwala na zaktualizowanie wartości do { value: 22 }.

objFreezed nie umożliwia takiej modyfikacji i zatrzymuje początkową wartość { value: 11 }.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html index 7c953e624..7081934b1 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed)
console.log(objFreezed)
- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html index 1e252d29b..6629c6c2f 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy w powyższym przykładzie istniejące własności obiektów mogą zostać usunięte, a nowe własności mogą zostać dodane?

Jakie wartości obiektów zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html index 018ec1fed..28ccdb70f 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html index c5a5c87ab..fefb8d7b3 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const objSealed = { value: 11 }
const objFreezed = { value: 11 }

Object.seal(objSealed)
Object.freeze(objFreezed)

objSealed.value = 22
objFreezed.value = 22

objSealed.foo = "bar"
objFreezed.foo = "bar"

delete objSealed.value
delete objFreezed.value

console.log(objSealed) // { value: 22 }
console.log(objFreezed) // { value: 11 }
- - + + \ No newline at end of file diff --git a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html index 57848ef5e..06e7bcfc7 100644 --- a/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html +++ b/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Obiekty można pieczętować (seal) oraz zamrażać (freeze).

Obie metody działają bardzo podobnie, blokując modyfikacje takie jak usuwanie czy dodawanie własności obiektu.

Obiekt zapieczętowany przez Object.seal() umożliwia jednak modyfikację istniejących własności w przeciwieństwie do obiektu zamrożonego przez Object.freeze().

objSealed zezwala na zaktualizowanie wartości do { value: 22 }.

objFreezed nie umożliwia takiej modyfikacji i zatrzymuje początkową wartość { value: 11 }.

- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html index 8b47ec9a6..c0ada32fe 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #011

🪲 Znajdź buga

const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
case "writer":
permission = "can write"
case "admin":
permission = "can everything"
}

return permission
}

console.log(getUserPermission(loggedUser))

Co zostanie zalogowane do konsoli? Jakie pozwolenie będzie miał zalogowany użytkownik?

🧪 Rozwiązanie

const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
break
case "writer":
permission = "can write"
break
case "admin":
permission = "can everything"
break
}

return permission
}

console.log(getUserPermission(loggedUser))

W przykładzie z błędem, do konsoli zostanie zalogowane can everything. Mimo, że zalogowany użytkownik ma ustawioną rolę na reader, instrukcja switch nie zatrzyma swojego działania na tym przypadku i finalnie użytkownik uzyska prawa admina.

Dzieje się tak, ponieważ domyślnie switch zaczynając od przypadku w którym nastąpi dopasowanie, wykonuje kod aż do pojawienia się deklaracji break.

W naszym błędnym przykładzie nie dodaliśmy break w żadnym z przypadków (case), więc kod wykonywał się po kolei, kończąc na przypisaniu do zmiennej permission wartości z ostatniego przypadku w switch.

Innym rozwiązaniem, unikającym wystąpienia błędu, mogłoby być pominięcie zmiennej permission i bezpośrednie zwracanie pożądanych wartości w każdy z przypadków (return "can ...").

Nie musielibyśmy wtedy używać wyrażeń break, ponieważ po wywołaniu return, dalszy kod w funkcji nie byłby wykonywany.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html index a5633d821..fd460e406 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
case "writer":
permission = "can write"
case "admin":
permission = "can everything"
}

return permission
}

console.log(getUserPermission(loggedUser))
- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html index 9adce83a7..b37111e2a 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli? Jakie pozwolenie będzie miał zalogowany użytkownik?

- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html index 204eb0ae7..fab237170 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html index fb07c89ae..6339d8b70 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
break
case "writer":
permission = "can write"
break
case "admin":
permission = "can everything"
break
}

return permission
}

console.log(getUserPermission(loggedUser))
- - + + \ No newline at end of file diff --git a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html index 3a42c2a9e..a76cc2a92 100644 --- a/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html +++ b/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostanie zalogowane can everything. Mimo, że zalogowany użytkownik ma ustawioną rolę na reader, instrukcja switch nie zatrzyma swojego działania na tym przypadku i finalnie użytkownik uzyska prawa admina.

Dzieje się tak, ponieważ domyślnie switch zaczynając od przypadku w którym nastąpi dopasowanie, wykonuje kod aż do pojawienia się deklaracji break.

W naszym błędnym przykładzie nie dodaliśmy break w żadnym z przypadków (case), więc kod wykonywał się po kolei, kończąc na przypisaniu do zmiennej permission wartości z ostatniego przypadku w switch.

Innym rozwiązaniem, unikającym wystąpienia błędu, mogłoby być pominięcie zmiennej permission i bezpośrednie zwracanie pożądanych wartości w każdy z przypadków (return "can ...").

Nie musielibyśmy wtedy używać wyrażeń break, ponieważ po wywołaniu return, dalszy kod w funkcji nie byłby wykonywany.

- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html index 669647d59..99b940819 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #080

🪲 Znajdź buga

const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log)
console.log(numbers.latest)

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log)
console.log(numbersCopy.latest)

Chcemy wykonać kopię obiektu, który ma getter'y i setter'y.

Czy kopia w powyższym przykładzie się powiedzie?

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log) // [5, 23]
console.log(numbers.latest) // 23

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log) // [5, 23]
console.log(numbersCopy.latest) // 23

Obiekt numbers sam w sobie działa poprawnie.

Umożliwia ustawianie liczby poprzez dodanie jej do tablicy log, a następnie pobranie ostatnio ustawionej liczby poprzez getter latest().

numbers.log zwraca więc [5, 23] ponieważ te dwie liczby zostały wcześniej ustawione poprzez setter current(), tym samym lądując w tablicy log.

numbers.latest zwraca ostatnio ustawioną liczbę, pobierając ją jako ostatni element z tablicy, czyli 23.

Skopiowanie obiektu za pomocą Object.assign() (ale również innymi metodami jak np. rozkład obiektu - spread), nie daje możliwości kopiowania metod w tym getter'ów, czy setter'ów.

numbersCopy.current przestaje działać i staje się niezdefiniowany.

numbersCopy.current = 11 tworzy nową własność, do której na sztywno zostaje przypisana wartość 11.

Operacja ta w żaden sposób nie wpływa już na tablicę log w skopiowanym obiekcie.

numbersCopy.log zwraca tą samą tablicę co numbers.log, ponieważ została ona skopiowana z oryginalnego obiektu.

Niespodzianką może być numbersCopy.latest, ponieważ zwraca 23.

Mimo, że metody obiektu nie są kopiowane, to w przypadku getter'a jest on wykonany w momencie kopiowania i wartość, którą zwraca, zostaje przypisana na stałe do własności w skopiowanym obiekcie.

numbersCopy.latest nie jest już więc metodą zwracającą dynamicznie ostatni element z tablicy log, a jedynie sztywną wartością, do której na stałe przypisana została wartość 23.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html index 46213bebb..6fae1ee51 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log)
console.log(numbers.latest)

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log)
console.log(numbersCopy.latest)
- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html index 132390747..13d8dfec1 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy wykonać kopię obiektu, który ma getter'y i setter'y.

Czy kopia w powyższym przykładzie się powiedzie?

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html index 40a460068..2edc28c9f 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html index 3f9c89107..aa8fc65c2 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const numbers = {
set current(number) {
this.log.push(number)
},
get latest() {
return this.log.at(-1)
},
log: [],
}

numbers.current = 5
numbers.current = 23

console.log(numbers.log) // [5, 23]
console.log(numbers.latest) // 23

const numbersCopy = Object.assign({}, numbers)

numbersCopy.current = 11

console.log(numbersCopy.log) // [5, 23]
console.log(numbersCopy.latest) // 23
- - + + \ No newline at end of file diff --git a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html index b0ae9001a..6978a290a 100644 --- a/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html +++ b/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Obiekt numbers sam w sobie działa poprawnie.

Umożliwia ustawianie liczby poprzez dodanie jej do tablicy log, a następnie pobranie ostatnio ustawionej liczby poprzez getter latest().

numbers.log zwraca więc [5, 23] ponieważ te dwie liczby zostały wcześniej ustawione poprzez setter current(), tym samym lądując w tablicy log.

numbers.latest zwraca ostatnio ustawioną liczbę, pobierając ją jako ostatni element z tablicy, czyli 23.

Skopiowanie obiektu za pomocą Object.assign() (ale również innymi metodami jak np. rozkład obiektu - spread), nie daje możliwości kopiowania metod w tym getter'ów, czy setter'ów.

numbersCopy.current przestaje działać i staje się niezdefiniowany.

numbersCopy.current = 11 tworzy nową własność, do której na sztywno zostaje przypisana wartość 11.

Operacja ta w żaden sposób nie wpływa już na tablicę log w skopiowanym obiekcie.

numbersCopy.log zwraca tą samą tablicę co numbers.log, ponieważ została ona skopiowana z oryginalnego obiektu.

Niespodzianką może być numbersCopy.latest, ponieważ zwraca 23.

Mimo, że metody obiektu nie są kopiowane, to w przypadku getter'a jest on wykonany w momencie kopiowania i wartość, którą zwraca, zostaje przypisana na stałe do własności w skopiowanym obiekcie.

numbersCopy.latest nie jest już więc metodą zwracającą dynamicznie ostatni element z tablicy log, a jedynie sztywną wartością, do której na stałe przypisana została wartość 23.

- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html index 437aad786..b5f167bf1 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #056

🪲 Znajdź buga

async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

numbers.forEach(async (num) => {
await sleep(1000)
store.push(num)
})

console.log(store)
}
main()

Chcemy zasymulować wykonanie asynchronicznych operacji na danych.

Funkcja sleep() zatrzymuje działanie kodu na określoną ilość milisekund symulując asynchroniczne operacje. Następnie przetworzone dane z pierwotnej tablicy numbers chcemy dodać do nowej store.

Czy powyższy kod zadziała prawidłowo?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

const promises = numbers.map(async (num) => {
await sleep(1000)
store.push(num)
})
await Promise.all(promises)

console.log(store)
}
main()

W przykładzie z błędem do konsoli zostanie zalogowana pusta tablica []. Nasz kod nie zadziała więc zgodnie z planem.

Metoda forEach(), wywołuje funkcję przekazaną w argumencie jako callback w sposób synchroniczny.

Działa to więc tak samo, jak gdybyśmy w zwykłej funkcji wywołali inną, zagnieżdżoną, asynchroniczną.

Kod wewnątrz takiej funkcji byłby oddelegowany do wykonania na później w pętli zdarzeń (jako microtask).

Nieco lepszy obraz sytuacji da nam zamiana forEach() na map() i zalogowanie do konsoli takiej mapy.

Okaże się wtedy, że nowa, zmapowana tablica będzie zawierać nierozwiązane obiekty Promise.

W celu rozwiązania tablicy z obietnicami, możemy użyć Promise.all().

Aby wykonać to synchronicznie i nie używać Promise.all().then(), dodajemy await przed wywołaniem Promise.all() i czekamy, aż wszystkie obietnice z tablicy zostaną rozwiązane.

Następnie logując do konsoli store, mamy już dostęp do wszystkich elementów. Wszystkie obietnice zostały rozwiązane i tym samym wykonane zostały wszystkie wywołania push() na tablicy store.

Alternatywnym rozwiązaniem może być wywołanie pętli for, która w przeciwieństwie do forEach() nie przyjmuje funkcji callback, a tym samym użycie await wewnątrz iteracji pętli zostaje wykonane zgodnie z oczekiwaniami.

for (const num of numbers) {
await sleep(1000)
store.push(num)
}

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html index 599f4314b..4886f3b34 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

numbers.forEach(async (num) => {
await sleep(1000)
store.push(num)
})

console.log(store)
}
main()
- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html index cbb50345b..e81f28f2b 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy zasymulować wykonanie asynchronicznych operacji na danych.

Funkcja sleep() zatrzymuje działanie kodu na określoną ilość milisekund symulując asynchroniczne operacje. Następnie przetworzone dane z pierwotnej tablicy numbers chcemy dodać do nowej store.

Czy powyższy kod zadziała prawidłowo?

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html index 1402f8033..be7752850 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html index 20b1ace7b..25c78f5fa 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
async function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}

async function main() {
const numbers = [1, 2, 3]
const store = []

const promises = numbers.map(async (num) => {
await sleep(1000)
store.push(num)
})
await Promise.all(promises)

console.log(store)
}
main()
- - + + \ No newline at end of file diff --git a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html index b65be7ff0..7e549ba25 100644 --- a/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html +++ b/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem do konsoli zostanie zalogowana pusta tablica []. Nasz kod nie zadziała więc zgodnie z planem.

Metoda forEach(), wywołuje funkcję przekazaną w argumencie jako callback w sposób synchroniczny.

Działa to więc tak samo, jak gdybyśmy w zwykłej funkcji wywołali inną, zagnieżdżoną, asynchroniczną.

Kod wewnątrz takiej funkcji byłby oddelegowany do wykonania na później w pętli zdarzeń (jako microtask).

Nieco lepszy obraz sytuacji da nam zamiana forEach() na map() i zalogowanie do konsoli takiej mapy.

Okaże się wtedy, że nowa, zmapowana tablica będzie zawierać nierozwiązane obiekty Promise.

W celu rozwiązania tablicy z obietnicami, możemy użyć Promise.all().

Aby wykonać to synchronicznie i nie używać Promise.all().then(), dodajemy await przed wywołaniem Promise.all() i czekamy, aż wszystkie obietnice z tablicy zostaną rozwiązane.

Następnie logując do konsoli store, mamy już dostęp do wszystkich elementów. Wszystkie obietnice zostały rozwiązane i tym samym wykonane zostały wszystkie wywołania push() na tablicy store.

Alternatywnym rozwiązaniem może być wywołanie pętli for, która w przeciwieństwie do forEach() nie przyjmuje funkcji callback, a tym samym użycie await wewnątrz iteracji pętli zostaje wykonane zgodnie z oczekiwaniami.

for (const num of numbers) {
await sleep(1000)
store.push(num)
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html index 428f07f76..6b7b7ecab 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #099

🪲 Znajdź buga

let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x)

Jaka wartość zostanie zalogowana do konsoli i dlaczego?

🧪 Rozwiązanie

let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x) // "foo"

Trójskładnikowy operator warunkowy jest jedynym operatorem w języku JavaScript, który przyjmuje trzy operandy.

  1. Warunek, po którym następuje znak zapytania ?
  2. Wyrażenie, które zostanie wykonane jeśli warunek jest prawdziwy, po którym następuje dwukropek :
  3. Wyrażenie, które zostanie wykonane jeśli warunek jest fałszywy

Jest to skrócona wersja deklaracji if...else, która umożliwia wykonanie tych samych operacji logicznych w skrócony sposób.

Co ciekawe, trójskładnikowy operatora warunkowy można zagnieżdżać jako wyrażenia, które zostają wykonane w innym trójskładnikowym operatorze warunkowym.

Przypomina to wtedy deklarację if...else if...else.

I właśnie taki zagnieżdżony ciąg znajduje się w naszym przykładzie.

Aby nieco ułatwić sobie jego zrozumienie, możemy pogrupować każde z wyrażeń używając nawiasów.

("" ? "ok" : (0 ? 1 : ([] ? "foo" : "bar")))

"" jest wartością fałszywą, więc pierwsze wyrażenie "ok" zostaje pominięte na rzecz drugiego wyrażenia, którym jest kolejna trójskładnikowa grupa.

0 również jest wartością fałszywą, więc wykonana jest kolejna, jeszcze głębiej zagnieżdżona trójskładnikowa grupa.

[] jest wartością prawdziwą, zwrócona zostaje więc wartość "foo", a "bar" zostaje pominięte.

W naszym przypadku kolejne grupy zostały zagnieżdżone jako wyrażenia wykonywane w przypadku fałszywego spełnienia warunku.

Nic nie stoi jednak na przeszkodzie aby używać ich jako wyrażeń dla ewaluacji warunku do prawdy, lub też w obu miejscach - prawdy i fałszu.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html index e37e08eb0..f51472c58 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x)
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html index 8d2415213..a8569ee49 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jaka wartość zostanie zalogowana do konsoli i dlaczego?

- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html index a5ec1ff77..889eae3da 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html index 5aba86325..61ef04ba6 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let x = "" ? "ok" : 0 ? 1 : [] ? "foo" : "bar"
console.log(x) // "foo"
- - + + \ No newline at end of file diff --git a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html index a966e4d81..84cc35710 100644 --- a/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html +++ b/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Trójskładnikowy operator warunkowy jest jedynym operatorem w języku JavaScript, który przyjmuje trzy operandy.

  1. Warunek, po którym następuje znak zapytania ?
  2. Wyrażenie, które zostanie wykonane jeśli warunek jest prawdziwy, po którym następuje dwukropek :
  3. Wyrażenie, które zostanie wykonane jeśli warunek jest fałszywy

Jest to skrócona wersja deklaracji if...else, która umożliwia wykonanie tych samych operacji logicznych w skrócony sposób.

Co ciekawe, trójskładnikowy operatora warunkowy można zagnieżdżać jako wyrażenia, które zostają wykonane w innym trójskładnikowym operatorze warunkowym.

Przypomina to wtedy deklarację if...else if...else.

I właśnie taki zagnieżdżony ciąg znajduje się w naszym przykładzie.

Aby nieco ułatwić sobie jego zrozumienie, możemy pogrupować każde z wyrażeń używając nawiasów.

("" ? "ok" : (0 ? 1 : ([] ? "foo" : "bar")))

"" jest wartością fałszywą, więc pierwsze wyrażenie "ok" zostaje pominięte na rzecz drugiego wyrażenia, którym jest kolejna trójskładnikowa grupa.

0 również jest wartością fałszywą, więc wykonana jest kolejna, jeszcze głębiej zagnieżdżona trójskładnikowa grupa.

[] jest wartością prawdziwą, zwrócona zostaje więc wartość "foo", a "bar" zostaje pominięte.

W naszym przypadku kolejne grupy zostały zagnieżdżone jako wyrażenia wykonywane w przypadku fałszywego spełnienia warunku.

Nic nie stoi jednak na przeszkodzie aby używać ich jako wyrażeń dla ewaluacji warunku do prawdy, lub też w obu miejscach - prawdy i fałszu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html index bc5fee26e..7251dda1f 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #028

🪲 Znajdź buga

const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title.subtitle)

Co zostanie zalogowane do konsoli po uruchomieniu powyższego kodu?

🧪 Rozwiązanie

const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title?.subtitle)

W przykładzie z błędem do konsoli zostanie zalogowana wartość null jako efekt wywołania ebook.title.

Zostanie jednak zwrócony też błąd Cannot read properties of null (reading 'subtitle'), który zatrzyma wykonywanie dalszego kodu.

null jest podstawowym typem danych (mimo, że typeof null błędnie zwraca wartość object).

Podstawowe typy danych nie są obiektami w JavaScript, nie zawierają więc żadnych własności czy metod.

Jakakolwiek próba zwrócenia własności domniemanego obiektu null wyrzuca więc błąd, który skutecznie zatrzymuje wykonywanie dalszego kodu aplikacji.

Opcjonalne łączenie łańcuchowe ?. pozwoli nam uniknąć wyrzucenia błędu, zamiast niego zwracając wartość undefined.

Operator ?. świetnie nadaje np. podczas pobierania danych z API, gdy nie jesteśmy do końca pewni struktury przychodzących danych i istnieje prawdopodobieństwo, że dane, które chcemy zwrócić z zagnieżdżonych własności obiektu, będą niezdefiniowane.

Opcjonalne łączenie łańcuchowe to też świetny skrót umożliwiający pominięcie wielokrotnego używania operatorów logicznych AND book && book.title && book.title.subtitle.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html index 470e79f42..bb8c7ed91 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title.subtitle)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html index ce37cfd1d..a09f01ff8 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli po uruchomieniu powyższego kodu?

- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html index 0472bca75..65e512c76 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html index 4477178a7..9828cafdc 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const book = { author: "Foo", title: null }

console.log(book.title)
console.log(book.title?.subtitle)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html index d7d1b694e..67c8e7dad 100644 --- a/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html +++ b/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem do konsoli zostanie zalogowana wartość null jako efekt wywołania ebook.title.

Zostanie jednak zwrócony też błąd Cannot read properties of null (reading 'subtitle'), który zatrzyma wykonywanie dalszego kodu.

null jest podstawowym typem danych (mimo, że typeof null błędnie zwraca wartość object).

Podstawowe typy danych nie są obiektami w JavaScript, nie zawierają więc żadnych własności czy metod.

Jakakolwiek próba zwrócenia własności domniemanego obiektu null wyrzuca więc błąd, który skutecznie zatrzymuje wykonywanie dalszego kodu aplikacji.

Opcjonalne łączenie łańcuchowe ?. pozwoli nam uniknąć wyrzucenia błędu, zamiast niego zwracając wartość undefined.

Operator ?. świetnie nadaje np. podczas pobierania danych z API, gdy nie jesteśmy do końca pewni struktury przychodzących danych i istnieje prawdopodobieństwo, że dane, które chcemy zwrócić z zagnieżdżonych własności obiektu, będą niezdefiniowane.

Opcjonalne łączenie łańcuchowe to też świetny skrót umożliwiający pominięcie wielokrotnego używania operatorów logicznych AND book && book.title && book.title.subtitle.

- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html index 1d9ac5dc8..7356ad6e5 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #004

🪲 Znajdź buga

var n = 1

if (n === 1) {
var n = 2
console.log(n)
}

console.log(n)

Jaka wartość zostanie zalogowana do konsoli w lini 5, a jaka w 8?

🧪 Rozwiązanie

let n = 1

if (n === 1) {
let n = 2
console.log(n)
}

console.log(n)

W przykładzie z błędem, zadeklarowanie zmiennej z użyciem wyrażenia var, spowoduje zalogowanie konsoli w obu miejscach wartość 2.

Nie jest to błąd per se, o ile jesteśmy świadomi własności działania deklaracji var, która to deklaruje zmienną o zasięgu globalnym.

Znacznie lepszym pomysłem dla deklaracji zmiennych będzie używanie wyrażenia let. Wtedy zasięg działania jest ograniczony do bloku kodu ({}), wewnątrz którego let zostało zdefiniowane.

Używając let, do konsoli zostaną zalogowane kolejno, wartości 2 i 1.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html index 830b1bf4a..a1b3f9e7b 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
var n = 1

if (n === 1) {
var n = 2
console.log(n)
}

console.log(n)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html index 06060417d..1c0b26e57 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jaka wartość zostanie zalogowana do konsoli w lini 5, a jaka w 8?

- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html index 8d65d3336..4dab0c498 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html index 0bc31a943..1e20e45ab 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let n = 1

if (n === 1) {
let n = 2
console.log(n)
}

console.log(n)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html index 8c4c8fdd6..4b89ccfc4 100644 --- a/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html +++ b/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, zadeklarowanie zmiennej z użyciem wyrażenia var, spowoduje zalogowanie konsoli w obu miejscach wartość 2.

Nie jest to błąd per se, o ile jesteśmy świadomi własności działania deklaracji var, która to deklaruje zmienną o zasięgu globalnym.

Znacznie lepszym pomysłem dla deklaracji zmiennych będzie używanie wyrażenia let. Wtedy zasięg działania jest ograniczony do bloku kodu ({}), wewnątrz którego let zostało zdefiniowane.

Używając let, do konsoli zostaną zalogowane kolejno, wartości 2 i 1.

- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html index 5a5a24ba7..3d8cfc40e 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #076

🪲 Znajdź buga

console.log(Object.is([1], [1]))
console.log([1] === [1])

console.log(Object.is(NaN, NaN))
console.log(NaN === NaN)

console.log(Object.is(NaN, 0 / 0))
console.log(NaN === 0 / 0)

console.log(Object.is(-0, +0))
console.log(-0 === +0)

Czy porównanie wartości poprzez Object.is() działa tak samo jak porównanie poprzez operator ===?

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(Object.is([1], [1])) // false
console.log([1] === [1]) // false

console.log(Object.is(NaN, NaN)) // true
console.log(NaN === NaN) // false

console.log(Object.is(NaN, 0 / 0)) // true
console.log(NaN === 0 / 0) // false

console.log(Object.is(-0, +0)) // false
console.log(-0 === +0) // true

Object.is() mimo, że swoją nazwą sugeruje porównywanie obiektów, w rzeczywistości porównuje dwie wartości przekazane jako argumenty do metody is().

Metoda działa bardzo podobnie do porównania, które wykonuje operator ===, ale z małymi wyjątkami.

Porównanie dwóch wartości NaN za pomocą Object.is() da prawdę.

Tego samego nie możemy się jednak spodziewać po działaniu operatora ===, który jeśli napotka operand NaN, to zawsze zwraca fałsz.

Nie ma tutaj znaczenia czy NaN jest przekazany bezpośrednio jako wartość, czy jest wynikiem działania, np. dzielenia 0 / 0.

Drugim wyjątkiem i nieścisłością pomiędzy Object.is(), a operatorem === jest porównanie zera ujemnego z zerem dodatnim.

W informatyce zapis liczb w pamięci w postaci binarnej wiąże się z użyciem dodatkowego bita (sign), który określa czy liczba jest dodatnia czy ujemna.

Bit ten może być użyty również dla liczby 0, tym samym rozgraniczając ją na dwie wartości: -0 i +0.

Dla Object.is() zero ujemne będzie różniło się od zera dodatniego więc porównanie ich zwróci false.

Dla operatora === oba zera będą takie same, zwracając w efekcie ich porównania wartość true.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html index 8fa82f5fc..cd858fd8e 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(Object.is([1], [1]))
console.log([1] === [1])

console.log(Object.is(NaN, NaN))
console.log(NaN === NaN)

console.log(Object.is(NaN, 0 / 0))
console.log(NaN === 0 / 0)

console.log(Object.is(-0, +0))
console.log(-0 === +0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html index 1591fc59d..337dd8a63 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy porównanie wartości poprzez Object.is() działa tak samo jak porównanie poprzez operator ===?

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html index 6a3be8d60..b63e4507c 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html index ae3e955f3..d864d3812 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(Object.is([1], [1])) // false
console.log([1] === [1]) // false

console.log(Object.is(NaN, NaN)) // true
console.log(NaN === NaN) // false

console.log(Object.is(NaN, 0 / 0)) // true
console.log(NaN === 0 / 0) // false

console.log(Object.is(-0, +0)) // false
console.log(-0 === +0) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html index 17144055d..1d1cb5164 100644 --- a/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html +++ b/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Object.is() mimo, że swoją nazwą sugeruje porównywanie obiektów, w rzeczywistości porównuje dwie wartości przekazane jako argumenty do metody is().

Metoda działa bardzo podobnie do porównania, które wykonuje operator ===, ale z małymi wyjątkami.

Porównanie dwóch wartości NaN za pomocą Object.is() da prawdę.

Tego samego nie możemy się jednak spodziewać po działaniu operatora ===, który jeśli napotka operand NaN, to zawsze zwraca fałsz.

Nie ma tutaj znaczenia czy NaN jest przekazany bezpośrednio jako wartość, czy jest wynikiem działania, np. dzielenia 0 / 0.

Drugim wyjątkiem i nieścisłością pomiędzy Object.is(), a operatorem === jest porównanie zera ujemnego z zerem dodatnim.

W informatyce zapis liczb w pamięci w postaci binarnej wiąże się z użyciem dodatkowego bita (sign), który określa czy liczba jest dodatnia czy ujemna.

Bit ten może być użyty również dla liczby 0, tym samym rozgraniczając ją na dwie wartości: -0 i +0.

Dla Object.is() zero ujemne będzie różniło się od zera dodatniego więc porównanie ich zwróci false.

Dla operatora === oba zera będą takie same, zwracając w efekcie ich porównania wartość true.

- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html index 2ebea0f5f..6fa9cd622 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #007

🪲 Znajdź buga

function addTax(price, tax) {
tax = tax || 0.23

return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)

Chcemy stworzyć funkcję, która będzie nam wyliczała cenę z podatkiem. Zależy nam też na ustawieniu domyślnej wartości podatku na 23%.

Jaka cena zostanie zalogowana do konsoli jako efekt wykonania funkcji addTax(100, 0)?

🧪 Rozwiązanie

function addTax(price, tax = 0.23) {
return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)

W przykładzie z błędem, do konsoli zostania zalogowana cena 123.

Mimo, że wywołując addTax() wyraźnie podajemy w drugim argumencie 0 jako wartość podatku, to używając wewnątrz funkcji logicznego operatora OR (||), wartość 0 traktowana jest jako wartość fałszywa (falsy). W procesie porównywania jest więc odrzucana na rzecz wartości prawdziwej (truthy) i finalnie do zmiennej tax przypisana zostaje wartość 0.23.

Aby naprawić ten błąd możemy np. bezpośrednio podać wartość domyślną dla parametru tax podczas deklarowania funkcji.

Unikniemy dzięki temu wykonywania operacji porównania i wewnątrz funkcji używana będzie dokładnie taka wartość, jaką przekażemy w argumencie wywołując funkcję. W przypadku braku przekazania argumentu tax, użyta zostanie wartość domyślna 0.23.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html index 961d915e8..f20e56408 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function addTax(price, tax) {
tax = tax || 0.23

return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html index 5abe12a72..a08c93c95 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy stworzyć funkcję, która będzie nam wyliczała cenę z podatkiem. Zależy nam też na ustawieniu domyślnej wartości podatku na 23%.

Jaka cena zostanie zalogowana do konsoli jako efekt wykonania funkcji addTax(100, 0)?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html index 0e970bf76..f2577a947 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html index 75d4ed869..c2692d1f1 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function addTax(price, tax = 0.23) {
return price + price * tax
}

const priceWithTax = addTax(100, 0)

console.log(priceWithTax)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html index 35815be24..4c431a19a 100644 --- a/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html +++ b/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, do konsoli zostania zalogowana cena 123.

Mimo, że wywołując addTax() wyraźnie podajemy w drugim argumencie 0 jako wartość podatku, to używając wewnątrz funkcji logicznego operatora OR (||), wartość 0 traktowana jest jako wartość fałszywa (falsy). W procesie porównywania jest więc odrzucana na rzecz wartości prawdziwej (truthy) i finalnie do zmiennej tax przypisana zostaje wartość 0.23.

Aby naprawić ten błąd możemy np. bezpośrednio podać wartość domyślną dla parametru tax podczas deklarowania funkcji.

Unikniemy dzięki temu wykonywania operacji porównania i wewnątrz funkcji używana będzie dokładnie taka wartość, jaką przekażemy w argumencie wywołując funkcję. W przypadku braku przekazania argumentu tax, użyta zostanie wartość domyślna 0.23.

- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html index fab95ea27..d93475c34 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #001

🪲 Znajdź buga

const dog = { paws: 4 }
const cat = dog

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}

Obiekt dog zawiera własność paws z wartością ustawioną na 4.

Przekładając na język ludzki, pies ma 4 łapy.

Chcemy utworzyć nowy obiekt cat, kopiując obiekt dog, bo oba zwierzęta mają 4 łapy.

Chcemy też dodać własność miauczenia do obiektu cat.

Czy w powyższym przykładzie instrukcja warunkowa zadziała i pies będzie mógł miauczeć?

🧪 Rozwiązanie

const dog = { paws: 4 }
const cat = { ...dog }

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}

Niestety tak. W przykładzie z błędem, obiekt dog i cat to ten sam obiekt, dog ma więc własność meow.

Dzieje się tak, ponieważ JavaScript wywołuje referencje obiektów (czyli ich adresy z tzw. sterty, przechowywanej w pamięci RAM, z ang. heap).

const cat = dog

Tworząc nową stałą cat wskazujemy nią na istniejący obiekt dog.

Finalnie tworzymy więc jedynie alias tego samego obiektu, który dostępny jest od teraz pod dwiema nazwami cat i dog.

Aby uniknąć sytuacji przypisania tego samego obiektu do stałej/zmiennej, musimy wyraźnie stworzyć kopię obiektu.

Możemy to zrobić np. przez destrukturyzację obiektu i przypisanie zdestrukturyzowanych elementów do nowego obiektu

const cat = { ...dog }

Lub przez przepisanie własności obiektu dog do nowego pustego obiektu {} używając Object.assign().

const cat = Object.assign({}, dog)

Uwaga! Powyższe metody tworzą jedynie "płytką" kopię. Kopiowany jest tylko pierwszy poziom własności. Zagnieżdżone obiekty (obiekt w obiekcie) są wciąż przekazywane w postaci referencji, a nie kopi.

const deepObject = { level: 1, nested: { level: 2 } }

Przy skopiowaniu powyższego obiektu za pomocą { ...deepObject } lub Object.assign({}, deepObject), obiekt nested wciąż będzie przekazany jako referencja.

Rozwiązaniem tego problemu jest użycie funkcji structuredClone() lub metody _.cloneDeep() z biblioteki Lodash.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html index 45c39f127..90bf83a4a 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const dog = { paws: 4 }
const cat = dog

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html index ee9b9cb26..aaded8d1a 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Obiekt dog zawiera własność paws z wartością ustawioną na 4.

Przekładając na język ludzki, pies ma 4 łapy.

Chcemy utworzyć nowy obiekt cat, kopiując obiekt dog, bo oba zwierzęta mają 4 łapy.

Chcemy też dodać własność miauczenia do obiektu cat.

Czy w powyższym przykładzie instrukcja warunkowa zadziała i pies będzie mógł miauczeć?

- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html index 629f341bd..80e517010 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html index 5e9e9d2cb..d0898d1b5 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const dog = { paws: 4 }
const cat = { ...dog }

cat.meow = true

if (dog.meow) {
console.log("That's not a dog!")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html index 87dd5c360..3f67affff 100644 --- a/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html +++ b/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Niestety tak. W przykładzie z błędem, obiekt dog i cat to ten sam obiekt, dog ma więc własność meow.

Dzieje się tak, ponieważ JavaScript wywołuje referencje obiektów (czyli ich adresy z tzw. sterty, przechowywanej w pamięci RAM, z ang. heap).

const cat = dog

Tworząc nową stałą cat wskazujemy nią na istniejący obiekt dog.

Finalnie tworzymy więc jedynie alias tego samego obiektu, który dostępny jest od teraz pod dwiema nazwami cat i dog.

Aby uniknąć sytuacji przypisania tego samego obiektu do stałej/zmiennej, musimy wyraźnie stworzyć kopię obiektu.

Możemy to zrobić np. przez destrukturyzację obiektu i przypisanie zdestrukturyzowanych elementów do nowego obiektu

const cat = { ...dog }

Lub przez przepisanie własności obiektu dog do nowego pustego obiektu {} używając Object.assign().

const cat = Object.assign({}, dog)

Uwaga! Powyższe metody tworzą jedynie "płytką" kopię. Kopiowany jest tylko pierwszy poziom własności. Zagnieżdżone obiekty (obiekt w obiekcie) są wciąż przekazywane w postaci referencji, a nie kopi.

const deepObject = { level: 1, nested: { level: 2 } }

Przy skopiowaniu powyższego obiektu za pomocą { ...deepObject } lub Object.assign({}, deepObject), obiekt nested wciąż będzie przekazany jako referencja.

Rozwiązaniem tego problemu jest użycie funkcji structuredClone() lub metody _.cloneDeep() z biblioteki Lodash.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html index 77decce1f..6928483e4 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #073

🪲 Znajdź buga

console.log([] + [])
console.log([] + {})
console.log({} + [])
console.log({} + {})

console.log([] + + [])
console.log([] + + {})
console.log({} + + [])
console.log({} + + {})

W języku JavaScript operator + ma kilka zastosowań.

Jakie z nich wezmą udział w powyższych przykładach i co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log([] + []) // ""
console.log([] + {}) // "[object Object]"
console.log({} + []) // "[object Object]"
console.log({} + {}) // "[object Object][object Object]"

console.log([] + + []) // 0
console.log([] + + {}) // NaN
console.log({} + + []) // "[object Object]0"
console.log({} + + {}) // "[object Object]NaN"

Zacznijmy od tego, że dwa znaki + + oddzielone od siebie spacją są interpretowane jako dwa osobne znaki (operatory).

Nie ma tu więc mowy o zadziałaniu operatora inkrementacji ++.

Znak + może działać jako jednoargumentowy operator, gdy występuje w sąsiedztwie tylko jednego operandu.

Jego działanie skutkuje wtedy konwersją wartości na wartość liczbową.

Przykładowo + true lub +true (białe znaki są tutaj ignorowane) zwróci wartość 1.

Kluczowe jest wystąpienie wyłącznie jednego operandu z prawej strony operatora +.

Gdyby pojawiły się dwa operandy np. true + true to operator + zadziała już jako operator dodawania (choć wcześniej nastąpi też konwersja wartości logicznych na wartości liczbowe).

Wystąpienie dwóch operatorów + + oznacza, że drugi z nich na pewno po swojej lewej stronie nie ma operandu, więc zadziała jako jednoargumentowy operator.

Jednoargumentowy operator + ma też pierwszeństwo wykonywania przed operatorem dodawania +.

Wracając do przykładów, pierwsze cztery będą operacjami dodawania.

Dodawanie nie oznacza jednak zawsze dodawania wartości liczbowych.

Gdy jeden z operandów jest ciągiem znaków, operator ten zachowuje się jako operator konkatenacji czyli łączenia ze sobą ciągów znaków.

Gdy dodawane są wartości nie prymitywne (obiekty), w pierwszej kolejności następuje zamiana na wartości prymitywne.

Tablice konwertowane są na ciągi znaków.

Jeśli są puste, to konwertowane są do pustych ciągów znaków "".

Dodanie do siebie dwóch pustych tablic [] to więc to samo co dodanie do siebie dwóch pustych ciągów znaków, co finalnie daje nam pusty ciąg znaków.

Puste obiekty, które nie są tablicami, skonwertowane do ciągu znaków, zwracają "[object Object]".

Na pierwszy rzut oka może to wyglądać jak tablica z dwoma wartościami object, Object.

W rzeczywistości jest to jednak ciąg znaków, który zawiera nawias kwadratowy.

Jeśli dodamy więc pustą tablicę i pusty obiekt, to operator + połączy ze sobą dwa ciągi znaków: "" oraz "[object Object]", co finalnie da nam ciąg znaków "[object Object]".

Dodanie do siebie dwóch pustych obiektów, da nam zdublowane\ "[object Object][object Object]".

Gdy do gry wkracza dodatkowo jednoargumentowy operator +, jego prawy operand konwertowany jest do wartości liczbowej.

Pusta tablica zwraca wartość 0. Pusty obiekt zwraca wartość NaN.

Finalnie zachodzi dodawanie (konkatenacja) tych wartości z ciągami znaków (pustej tablicy, albo pustego obiektu) razem z ciągiem znaków "0" lub "NaN".

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html index dee2af33c..91ae7d9c8 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log([] + [])
console.log([] + {})
console.log({} + [])
console.log({} + {})

console.log([] + + [])
console.log([] + + {})
console.log({} + + [])
console.log({} + + {})
- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html index c0b8755a1..62381c413 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W języku JavaScript operator + ma kilka zastosowań.

Jakie z nich wezmą udział w powyższych przykładach i co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html index 2eb66479f..6eef09bbb 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html index 6553033ed..23f7de93f 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log([] + []) // ""
console.log([] + {}) // "[object Object]"
console.log({} + []) // "[object Object]"
console.log({} + {}) // "[object Object][object Object]"

console.log([] + + []) // 0
console.log([] + + {}) // NaN
console.log({} + + []) // "[object Object]0"
console.log({} + + {}) // "[object Object]NaN"
- - + + \ No newline at end of file diff --git a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html index 9be5dc81d..fc565a999 100644 --- a/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html +++ b/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Zacznijmy od tego, że dwa znaki + + oddzielone od siebie spacją są interpretowane jako dwa osobne znaki (operatory).

Nie ma tu więc mowy o zadziałaniu operatora inkrementacji ++.

Znak + może działać jako jednoargumentowy operator, gdy występuje w sąsiedztwie tylko jednego operandu.

Jego działanie skutkuje wtedy konwersją wartości na wartość liczbową.

Przykładowo + true lub +true (białe znaki są tutaj ignorowane) zwróci wartość 1.

Kluczowe jest wystąpienie wyłącznie jednego operandu z prawej strony operatora +.

Gdyby pojawiły się dwa operandy np. true + true to operator + zadziała już jako operator dodawania (choć wcześniej nastąpi też konwersja wartości logicznych na wartości liczbowe).

Wystąpienie dwóch operatorów + + oznacza, że drugi z nich na pewno po swojej lewej stronie nie ma operandu, więc zadziała jako jednoargumentowy operator.

Jednoargumentowy operator + ma też pierwszeństwo wykonywania przed operatorem dodawania +.

Wracając do przykładów, pierwsze cztery będą operacjami dodawania.

Dodawanie nie oznacza jednak zawsze dodawania wartości liczbowych.

Gdy jeden z operandów jest ciągiem znaków, operator ten zachowuje się jako operator konkatenacji czyli łączenia ze sobą ciągów znaków.

Gdy dodawane są wartości nie prymitywne (obiekty), w pierwszej kolejności następuje zamiana na wartości prymitywne.

Tablice konwertowane są na ciągi znaków.

Jeśli są puste, to konwertowane są do pustych ciągów znaków "".

Dodanie do siebie dwóch pustych tablic [] to więc to samo co dodanie do siebie dwóch pustych ciągów znaków, co finalnie daje nam pusty ciąg znaków.

Puste obiekty, które nie są tablicami, skonwertowane do ciągu znaków, zwracają "[object Object]".

Na pierwszy rzut oka może to wyglądać jak tablica z dwoma wartościami object, Object.

W rzeczywistości jest to jednak ciąg znaków, który zawiera nawias kwadratowy.

Jeśli dodamy więc pustą tablicę i pusty obiekt, to operator + połączy ze sobą dwa ciągi znaków: "" oraz "[object Object]", co finalnie da nam ciąg znaków "[object Object]".

Dodanie do siebie dwóch pustych obiektów, da nam zdublowane\ "[object Object][object Object]".

Gdy do gry wkracza dodatkowo jednoargumentowy operator +, jego prawy operand konwertowany jest do wartości liczbowej.

Pusta tablica zwraca wartość 0. Pusty obiekt zwraca wartość NaN.

Finalnie zachodzi dodawanie (konkatenacja) tych wartości z ciągami znaków (pustej tablicy, albo pustego obiektu) razem z ciągiem znaków "0" lub "NaN".

- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html index 422707383..794dfebb3 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #012

🪲 Znajdź buga

const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(user1 == user2)

Co zostanie zalogowane do konsoli z operacji porównania dwóch obiektów user1 i user2?

Czy będzie to wartość true czy false? A może jeszcze coś innego?

🧪 Rozwiązanie

const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(JSON.stringify(user1) === JSON.stringify(user2))

Zacznijmy od tego, że użycie operatora == lub === nie ma tutaj żadnego znaczenia. Typ porównywanych danych jest taki sam, więc ścisłe porównanie (===) zadziałałoby identycznie jak zwykłe (==).

Jednak mimo, że wartości obiektów user1 i user2 są takie same, ich porównanie zwraca fałsz, ponieważ są to dwa różne obiekty.

W poprzednich bugach (np. #001) dowiedziałeś się, że przypisywanie obiektów do stałych/zmiennych polega na przypisaniu jedynie ich referencji tj. adresu z pamięci RAM.

Oznacza to, że porównując wartości przypisane do stałych user1 i user2, porównujemy tak naprawdę jedynie adresy w pamięci RAM, w których zapisane są te obiekty. A te w naszym przypadku są różne.

Sytuacja ma się inaczej w przypadku porównywania typów pierwotnych jak ciągi znaków (string), liczby (number), wartości logiczne (boolean).

Możemy więc użyć obejścia i za pomocą JSON.stringify() przekonwertować obiekty na ciągi znaków. Następnie możemy porównać ciągi znaków i otrzymać true, już zgodnie z naszymi oczekiwaniami.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html index 9785a2776..eb576f73d 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(user1 == user2)
- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html index 72c07df17..f0b054a56 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli z operacji porównania dwóch obiektów user1 i user2?

Czy będzie to wartość true czy false? A może jeszcze coś innego?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html index c3190ef93..719f55de3 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html index d890c3117..bb37eeaac 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const user1 = {
name: "John",
}
const user2 = {
name: "John",
}

console.log(JSON.stringify(user1) === JSON.stringify(user2))
- - + + \ No newline at end of file diff --git a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html index 5ea5de338..257b66d30 100644 --- a/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html +++ b/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Zacznijmy od tego, że użycie operatora == lub === nie ma tutaj żadnego znaczenia. Typ porównywanych danych jest taki sam, więc ścisłe porównanie (===) zadziałałoby identycznie jak zwykłe (==).

Jednak mimo, że wartości obiektów user1 i user2 są takie same, ich porównanie zwraca fałsz, ponieważ są to dwa różne obiekty.

W poprzednich bugach (np. #001) dowiedziałeś się, że przypisywanie obiektów do stałych/zmiennych polega na przypisaniu jedynie ich referencji tj. adresu z pamięci RAM.

Oznacza to, że porównując wartości przypisane do stałych user1 i user2, porównujemy tak naprawdę jedynie adresy w pamięci RAM, w których zapisane są te obiekty. A te w naszym przypadku są różne.

Sytuacja ma się inaczej w przypadku porównywania typów pierwotnych jak ciągi znaków (string), liczby (number), wartości logiczne (boolean).

Możemy więc użyć obejścia i za pomocą JSON.stringify() przekonwertować obiekty na ciągi znaków. Następnie możemy porównać ciągi znaków i otrzymać true, już zgodnie z naszymi oczekiwaniami.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html index e29e339f6..d7fe088b9 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #100

🪲 Znajdź buga

const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)

Co zostanie zalogowane do konsoli?

Jak jest różnica między splice(), a slice()?

🧪 Rozwiązanie

const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)
// ["a", "b", "c", "d", "e", "f"]

W konsoli ujrzymy ["a", "b", "c", "d", "e", "f"].

letters.splice(1, 1) usuwa z tablicy jeden element pod indeksem 1 (czyli "z").

letters.splice(3, 0, "d") dodaje do tablicy element o wartości "d" w indeksie 3, bez jego usuwania (nadpisywania) oraz bez usuwania następnych elementów w zadanej ilości (0).

Następuje więc "wepchnięcie" nowego elementu, spychając istniejące elementy od indeksu 3 na dalsze pozycje.

Metoda Array.prototype.splice() modyfikuje oryginalną tablicę.

Tablica pod stałą letters jest więc mutowana, dlatego po zalogowaniu jej do konsoli widzimy zaktualizowany układ elementów.

Jeśli chcielibyśmy uniknąć mutacji sugerowaną alternatywą jest Array.prototype.toSpliced().

Jest to jednak nowa metoda, w chwili pisania tego tekstu, nie zaimplementowana jeszcze przez wszystkie silniki JavaScript.

Aktualnie obsługują ją przeglądarki Chrome, Edge, Opera, Safari, ale nie Firefox i środowiska uruchomieniowe Node.js, Deno.

Druga, użyta w przykładzie metoda to Array.prototype.slice().

Tworzy ona płytką kopię modyfikowanej tablicy i zwraca nowy zmodyfikowany jej kształt.

Płytka kopia oznacza, że w przypadku zagnieżdżonych tablic, również mogą wystąpić mutacje, tak jak w przypadku użycia splice().

Wywołanie letters.slice(0, 3) oraz letters.slice(3) nie wpływa w naszym przykładzie na oryginalną tablicę letters.

Żeby zobaczyć wynik działania tych metod, musielibyśmy zalogować ich wykonanie do konsoli.

letters.slice(0, 3) zwróciłoby wtedy tylko pierwsze trzy elementy tablicy.

Cięcie tablicy odbywa się tutaj od indeksu 0 do 3 (nie włączając 3).

letters.slice(3) to z kolei odcięcie fragmentu tablicy rozpoczynając od indeksu 3 aż do końca tablicy.

W naszym przypadku byłyby to trzy ostatnie elementy tablicy.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html index dfc1815f1..755958e93 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)
- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html index 91d88edb4..b2a071eaa 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli?

Jak jest różnica między splice(), a slice()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html index 484ffe3de..eec38b7ab 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html index 192d6bac0..f382a20c2 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const letters = ["a", "z", "b", "c", "e", "f"]

letters.splice(1, 1)
letters.splice(3, 0, "d")

letters.slice(0, 3)
letters.slice(3)

console.log(letters)
// ["a", "b", "c", "d", "e", "f"]
- - + + \ No newline at end of file diff --git a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html index 89a1e4001..d4061cba7 100644 --- a/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html +++ b/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W konsoli ujrzymy ["a", "b", "c", "d", "e", "f"].

letters.splice(1, 1) usuwa z tablicy jeden element pod indeksem 1 (czyli "z").

letters.splice(3, 0, "d") dodaje do tablicy element o wartości "d" w indeksie 3, bez jego usuwania (nadpisywania) oraz bez usuwania następnych elementów w zadanej ilości (0).

Następuje więc "wepchnięcie" nowego elementu, spychając istniejące elementy od indeksu 3 na dalsze pozycje.

Metoda Array.prototype.splice() modyfikuje oryginalną tablicę.

Tablica pod stałą letters jest więc mutowana, dlatego po zalogowaniu jej do konsoli widzimy zaktualizowany układ elementów.

Jeśli chcielibyśmy uniknąć mutacji sugerowaną alternatywą jest Array.prototype.toSpliced().

Jest to jednak nowa metoda, w chwili pisania tego tekstu, nie zaimplementowana jeszcze przez wszystkie silniki JavaScript.

Aktualnie obsługują ją przeglądarki Chrome, Edge, Opera, Safari, ale nie Firefox i środowiska uruchomieniowe Node.js, Deno.

Druga, użyta w przykładzie metoda to Array.prototype.slice().

Tworzy ona płytką kopię modyfikowanej tablicy i zwraca nowy zmodyfikowany jej kształt.

Płytka kopia oznacza, że w przypadku zagnieżdżonych tablic, również mogą wystąpić mutacje, tak jak w przypadku użycia splice().

Wywołanie letters.slice(0, 3) oraz letters.slice(3) nie wpływa w naszym przykładzie na oryginalną tablicę letters.

Żeby zobaczyć wynik działania tych metod, musielibyśmy zalogować ich wykonanie do konsoli.

letters.slice(0, 3) zwróciłoby wtedy tylko pierwsze trzy elementy tablicy.

Cięcie tablicy odbywa się tutaj od indeksu 0 do 3 (nie włączając 3).

letters.slice(3) to z kolei odcięcie fragmentu tablicy rozpoczynając od indeksu 3 aż do końca tablicy.

W naszym przypadku byłyby to trzy ostatnie elementy tablicy.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html index 321adafd8..2e21d38f7 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #040

🪲 Znajdź buga

// 1
if ([]) {
console.log("[]")
}
if (["0"]) {
console.log('["0"]')
}

// 2
if ([] == false) {
console.log("[] == false")
}
if (["0"] == false) {
console.log('["0"] == false')
}

// 3
if ([] === false) {
console.log("[] === false")
}
if (["0"] === false) {
console.log('["0"] === false')
}

Chcemy wykonać jakiś kod, tylko w sytuacji gdy tablica będzie pusta. Którego z powyższych rozwiązań możemy do tego użyć?

🧪 Rozwiązanie

if ([].length === 0) {
console.log("Array is empty")
}

Żaden z trzech początkowych przykładów nie będzie się do nadawał do sprawdzenia, czy tablica jest pusta.

Po pierwsze, pusta tablica nie jest wartością fałszywą według listy wartości fałszywych w JavaScript, więc if ([]) odpada.

Po drugie, luźne porównanie == tablicy z wartością false jest najbliższe spełnieniu zadania, ale nie daje 100% pewności.

Po trzecie, ścisłe porównanie === odpada, bo porównywane typy danych [] i false się od siebie różnią.

W przypadku luźnego porównania tablicy z wartością logiczną, == sprowadzi najpierw wartości do jednego typu, którym będzie wartość liczbowa (tak działa algorytm tego operatora).

[] == false zamieni się na Number([]) === Number(false). Typy porównywanych danych się zgadzają, więc luźne porównanie zastosuje już algorytm porównania ścisłego.

Wartość liczbowa z pustej tablicy zostanie skonwertowana do wartości 0. Wartość liczbowa z wartości false da również 0.

Mamy zwycięzcę... prawie. Bo co jeśli zamiast pustej tablicy, pojawi się np. [0], albo ["0"]?

Funkcja Number() sprowadzi taką tablicę również do wartości 0. 🤯

Nie możemy więc polegać na porównaniu [] == false, jeśli zależy nam na wykonaniu instrukcji warunkowej tylko w przypadku gdy tablica jest pusta.

Rozsądną opcją może być użycie własności length na obiekcie tablicy. Zwrócona zostanie wtedy wartość liczbowa wskazująca na ilość elementów znajdujących się w tablicy.

Jeśli zwróconą wartością będzie wartość 0, to mamy wtedy pewność, że tablica nie zawiera żadnych elementów (jest pusta).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html index c88ec2df8..006d253d2 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
// 1
if ([]) {
console.log("[]")
}
if (["0"]) {
console.log('["0"]')
}

// 2
if ([] == false) {
console.log("[] == false")
}
if (["0"] == false) {
console.log('["0"] == false')
}

// 3
if ([] === false) {
console.log("[] === false")
}
if (["0"] === false) {
console.log('["0"] === false')
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html index 8e8ac5681..9cc86cd4d 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy wykonać jakiś kod, tylko w sytuacji gdy tablica będzie pusta. Którego z powyższych rozwiązań możemy do tego użyć?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html index a39a14d36..6dcd533ec 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html index be5030ff0..18984053d 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
if ([].length === 0) {
console.log("Array is empty")
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html index 97396312a..d3ad4b9fc 100644 --- a/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html +++ b/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Żaden z trzech początkowych przykładów nie będzie się do nadawał do sprawdzenia, czy tablica jest pusta.

Po pierwsze, pusta tablica nie jest wartością fałszywą według listy wartości fałszywych w JavaScript, więc if ([]) odpada.

Po drugie, luźne porównanie == tablicy z wartością false jest najbliższe spełnieniu zadania, ale nie daje 100% pewności.

Po trzecie, ścisłe porównanie === odpada, bo porównywane typy danych [] i false się od siebie różnią.

W przypadku luźnego porównania tablicy z wartością logiczną, == sprowadzi najpierw wartości do jednego typu, którym będzie wartość liczbowa (tak działa algorytm tego operatora).

[] == false zamieni się na Number([]) === Number(false). Typy porównywanych danych się zgadzają, więc luźne porównanie zastosuje już algorytm porównania ścisłego.

Wartość liczbowa z pustej tablicy zostanie skonwertowana do wartości 0. Wartość liczbowa z wartości false da również 0.

Mamy zwycięzcę... prawie. Bo co jeśli zamiast pustej tablicy, pojawi się np. [0], albo ["0"]?

Funkcja Number() sprowadzi taką tablicę również do wartości 0. 🤯

Nie możemy więc polegać na porównaniu [] == false, jeśli zależy nam na wykonaniu instrukcji warunkowej tylko w przypadku gdy tablica jest pusta.

Rozsądną opcją może być użycie własności length na obiekcie tablicy. Zwrócona zostanie wtedy wartość liczbowa wskazująca na ilość elementów znajdujących się w tablicy.

Jeśli zwróconą wartością będzie wartość 0, to mamy wtedy pewność, że tablica nie zawiera żadnych elementów (jest pusta).

- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html index 8bd3bcbe3..984f6b264 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #059

🪲 Znajdź buga

let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo)
console.log(bar)
console.log(foo.prop)

Co zostanie zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo) // { val: 2 }
console.log(bar) // { val: 1, prop: { val: 2 } }
console.log(foo.prop) // undefined

Logując zmienną foo, dostaniemy obiekt { val: 2 }, bo taki został do niej przypisany w 3 linii.

Zwróć uwagę, że ta operacja przypisania ma efekt nadpisania, tzn. przypisujemy nową wartość do zmiennej foo. Nie ma tu miejsca modyfikacja własności foo.val, więc nie wpływa to na początkowy obiekt przypisany (przez referencję) do zmiennej bar.

Zmienna bar zwiera więc obiekt z własnością val o wartości 1. Dodatkowo w obiekcie pojawia się też własność prop, bo zmienna bar to tak naprawdę jedynie alias początkowego obiektu ze zmiennej foo.

W 3 lini, przypisanie foo.prop działa też dla aliasu czyli, aktywuje przypisania też dla bar.prop.

Moglibyśmy więc to zapisać też jako bar.prop = foo = { val: 2 }.

W tym miejscu "ginie" też początkowa wartość zmiennej foo, którą nadpisujemy nowym obiektem, który nie jest już związany referencją z obiektem przypisanym do zmiennej bar.

Od tego momentu, obiekt w zmiennej foo jest już nowym obiektem, który nie ma pojęcia o własności prop, dlatego loguje undefined.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html index f7fb05c83..94e47b053 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo)
console.log(bar)
console.log(foo.prop)
- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html index a86c8a458..9707b207b 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html index c131e3af2..fd2152f87 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html index e16c27da5..3bb34e6c6 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let foo = { val: 1 }
let bar = foo
foo.prop = foo = { val: 2 }

console.log(foo) // { val: 2 }
console.log(bar) // { val: 1, prop: { val: 2 } }
console.log(foo.prop) // undefined
- - + + \ No newline at end of file diff --git a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html index 76e3fb108..362aa5ad7 100644 --- a/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html +++ b/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Logując zmienną foo, dostaniemy obiekt { val: 2 }, bo taki został do niej przypisany w 3 linii.

Zwróć uwagę, że ta operacja przypisania ma efekt nadpisania, tzn. przypisujemy nową wartość do zmiennej foo. Nie ma tu miejsca modyfikacja własności foo.val, więc nie wpływa to na początkowy obiekt przypisany (przez referencję) do zmiennej bar.

Zmienna bar zwiera więc obiekt z własnością val o wartości 1. Dodatkowo w obiekcie pojawia się też własność prop, bo zmienna bar to tak naprawdę jedynie alias początkowego obiektu ze zmiennej foo.

W 3 lini, przypisanie foo.prop działa też dla aliasu czyli, aktywuje przypisania też dla bar.prop.

Moglibyśmy więc to zapisać też jako bar.prop = foo = { val: 2 }.

W tym miejscu "ginie" też początkowa wartość zmiennej foo, którą nadpisujemy nowym obiektem, który nie jest już związany referencją z obiektem przypisanym do zmiennej bar.

Od tego momentu, obiekt w zmiennej foo jest już nowym obiektem, który nie ma pojęcia o własności prop, dlatego loguje undefined.

- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html index 258478ea2..1b4c2ff85 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #032

🪲 Znajdź buga

setTimeout(() => {
console.log("setTimeout")
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response)
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response)
})

queueMicrotask(() => {
console.log("Microtask")
})

console.log("Global context")

W jakiej kolejności do konsoli zostaną zalogowane odpowiedzi?

🧪 Rozwiązanie

setTimeout(() => {
console.log("setTimeout") // 4
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response) // 5
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response) // 2
})

queueMicrotask(() => {
console.log("Microtask") // 3
})

console.log("Global context") // 1

Do konsoli zostaną zalogowane odpowiedzi w następującej kolejności:

  1. Global context
  2. Promise
  3. Microtask
  4. setTimeout
  5. Promise setTimeout

JavaScript jest jednowątkowym językiem programowania. Nie możemy wykonać równolegle wielu fragmentów kodu poprzez wiele wątków procesora (chyba, że z pomocą Worker'ów, ale to osobny temat).

Nieporozumienie, które może wynikać z uznawania JavaScriptu jako języka wielowątkowego jest możliwość asynchroniczność.

W JavaScript asynchroniczność oznacza, że możemy oddelegować na później wykonywanie kodu, który do wykonania potrzebuje więcej czasu.

Każda interakcja na stronie internetowej, obsługiwana przez JavaScript, zawiesza działanie strony (zamrażając możliwość wykonywania na niej jakichkolwiek akcji) do czasu ukończenia wykonywania kodu przez procesor. Zazwyczaj dzieje się to jednak tak szybko, że nawet nie dostrzegamy wynikających z tego opóźnień.

Są jednak operacje, które wymagają więcej czasu do zrealizowania, nie tylko z uwagi na złożoność obliczeniową, ale także na opóźnienia wynikające z dostępu do danych (np. odpytując zewnętrzne API).

Gdyby tego typu operacje były wykonywane synchronicznie, strona kompletnie zawieszałaby się (przewijanie, czy klikanie w przyciski byłoby zamrożone), aż do momentu pobrania danych.

Rozwiązaniem tego problemu w JavaScript jest pętla zdarzeń (event loop), która regularnie wykonuje zadania, jakimi jest wykonanie kodu. Jednocześnie zadania wywołane asynchronicznie są umieszczane w kolejce do wykonania podczas kolejnego cyklu pętli zdarzeń.

Asynchroniczna kolejka zadań jest jeszcze dodatkowo podzielona na zwykłe zadania i zadania mikro.

Zadaniem zwykłym, które wpadnie do kolejki asynchronicznej jest np. setTimeout(), a mikro zadaniem Promise.

Mikro zadania z kolejki wykonywane są na końcu aktualnej iteracji pętli zdarzeń, natomiast standardowe zadania z kolejki, na początku kolejnej iteracji.

Kod z przykładu wykonuje się więc w następującej kolejności:

  1. Global context jest wywołany synchronicznie, czyli w pierwszej kolejności, w aktualnej iteracji pętli zdarzeń
  2. Promise i queueMicrotask() to mikro zadania, oddelegowane do wykonania na koniec aktualnej iteracji pętli zdarzeń, wykonywane w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw Promise, potem Microtask)
  3. setTimeout() to zadania oddelegowane do wykonania na początek kolejnej iteracji pętli zdarzeń, wykonywane również w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw setTimeout() wywołany wewnątrz mikro zadania Promise, następnie setTimeout() wywołany w globalnym kontekście)

Zdefiniowanie zadania setTimeout() w mikro zadaniu Promise oznacza, że wykonywane mikro zadanie Promise na początku aktualnej iteracji pętli zdarzeń, oddeleguje zadanie setTimeout() na początek kolejnej iteracji pętli. Efekt działania jest więc taki sam, jak gdyby setTimeout() było wywołane w globalnym kontekście, bez zagnieżdżenia wewnątrz mikro zadania Promise.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html index 7f9f99796..b92356520 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("setTimeout")
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response)
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response)
})

queueMicrotask(() => {
console.log("Microtask")
})

console.log("Global context")
- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html index 1db4a6b1f..d4d6d2fad 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W jakiej kolejności do konsoli zostaną zalogowane odpowiedzi?

- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html index 18b55facf..273e8745a 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html index 9a6787374..40bb682c2 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("setTimeout") // 4
})

new Promise((resolve) => {
setTimeout(() => {
resolve("Promise setTimeout")
})
}).then((response) => {
console.log(response) // 5
})

new Promise((resolve) => {
resolve("Promise")
}).then((response) => {
console.log(response) // 2
})

queueMicrotask(() => {
console.log("Microtask") // 3
})

console.log("Global context") // 1
- - + + \ No newline at end of file diff --git a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html index 6dfff540a..2ffac479a 100644 --- a/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html +++ b/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Do konsoli zostaną zalogowane odpowiedzi w następującej kolejności:

  1. Global context
  2. Promise
  3. Microtask
  4. setTimeout
  5. Promise setTimeout

JavaScript jest jednowątkowym językiem programowania. Nie możemy wykonać równolegle wielu fragmentów kodu poprzez wiele wątków procesora (chyba, że z pomocą Worker'ów, ale to osobny temat).

Nieporozumienie, które może wynikać z uznawania JavaScriptu jako języka wielowątkowego jest możliwość asynchroniczność.

W JavaScript asynchroniczność oznacza, że możemy oddelegować na później wykonywanie kodu, który do wykonania potrzebuje więcej czasu.

Każda interakcja na stronie internetowej, obsługiwana przez JavaScript, zawiesza działanie strony (zamrażając możliwość wykonywania na niej jakichkolwiek akcji) do czasu ukończenia wykonywania kodu przez procesor. Zazwyczaj dzieje się to jednak tak szybko, że nawet nie dostrzegamy wynikających z tego opóźnień.

Są jednak operacje, które wymagają więcej czasu do zrealizowania, nie tylko z uwagi na złożoność obliczeniową, ale także na opóźnienia wynikające z dostępu do danych (np. odpytując zewnętrzne API).

Gdyby tego typu operacje były wykonywane synchronicznie, strona kompletnie zawieszałaby się (przewijanie, czy klikanie w przyciski byłoby zamrożone), aż do momentu pobrania danych.

Rozwiązaniem tego problemu w JavaScript jest pętla zdarzeń (event loop), która regularnie wykonuje zadania, jakimi jest wykonanie kodu. Jednocześnie zadania wywołane asynchronicznie są umieszczane w kolejce do wykonania podczas kolejnego cyklu pętli zdarzeń.

Asynchroniczna kolejka zadań jest jeszcze dodatkowo podzielona na zwykłe zadania i zadania mikro.

Zadaniem zwykłym, które wpadnie do kolejki asynchronicznej jest np. setTimeout(), a mikro zadaniem Promise.

Mikro zadania z kolejki wykonywane są na końcu aktualnej iteracji pętli zdarzeń, natomiast standardowe zadania z kolejki, na początku kolejnej iteracji.

Kod z przykładu wykonuje się więc w następującej kolejności:

  1. Global context jest wywołany synchronicznie, czyli w pierwszej kolejności, w aktualnej iteracji pętli zdarzeń
  2. Promise i queueMicrotask() to mikro zadania, oddelegowane do wykonania na koniec aktualnej iteracji pętli zdarzeń, wykonywane w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw Promise, potem Microtask)
  3. setTimeout() to zadania oddelegowane do wykonania na początek kolejnej iteracji pętli zdarzeń, wykonywane również w kolejności w jakiej zostały dodane (w naszym przykładzie najpierw setTimeout() wywołany wewnątrz mikro zadania Promise, następnie setTimeout() wywołany w globalnym kontekście)

Zdefiniowanie zadania setTimeout() w mikro zadaniu Promise oznacza, że wykonywane mikro zadanie Promise na początku aktualnej iteracji pętli zdarzeń, oddeleguje zadanie setTimeout() na początek kolejnej iteracji pętli. Efekt działania jest więc taki sam, jak gdyby setTimeout() było wywołane w globalnym kontekście, bez zagnieżdżenia wewnątrz mikro zadania Promise.

- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html index 6660d176f..daeb6f927 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #057

🪲 Znajdź buga

console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log(null || undefined ?? "foo")

Jakie wartości zostaną zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log((null || undefined) ?? "foo")

W przykładzie z błędem, 7 linia wyrzuci do konsoli SyntaxError.

Treść błędu może się różnić w zależności od kontekstu, w którym kod zostanie wywołany.

W przypadku przekazania kodu jako argument do console.log(), dostaniemy informację o brakującym domknięciu nawiasu na liście argumentów.

SyntaxError sprowadza się jednak do niedozwolonej składni w języku JavaScript. Po prostu nie możemy użyć danej konstrukcji.

I taką niedozwoloną konstrukcją jest użycie operatora ?? na równi z operatorami || lub &&.

Po prostu nie możemy tego robić, musimy użyć nawiasów dla wyraźnego zgrupowania wyrażeń, które chcemy aby zostały wykonane w pierwszej kolejności.

Dokumentacja JavaScript od Mozilli (MDN), tłumaczy, że jednoczesne użycie ?? w połączeniu z || lub && mogłoby wprowadzać w kodzie błędy wynikające z wystąpienia zwarcia (short circuiting).

Warto zauważyć, że tabela priorytetów wykonywania operatorów plasuje && wyżej niż ||, ale ze względu na efekt zwarcia, który jeśli wystąpi, totalnie ignoruje drugi operand, co również może prowadzić do błędów w kodzie związanych z oczekiwaniem wywołania funkcji w takim wyrażeniu.

Przykładowo, przy wyrażeniu true || alert("bar") && false zadziała zwarcie na wartości true i cały dalszy kod nie zostanie wykonany, mimo że priorytet wykonywania operatorów mógłby sugerować, że funkcja alert("bar") powinna zostać wykonana w celu ewaluacji wartości operatora &&.

W tym kontekście, wyrzucanie błędu składniowego w momencie równoległego użycia ?? z && lub || wydaje się być naciągane.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html index d9258088b..a213b5f97 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log(null || undefined ?? "foo")
- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html index a74d7539a..d149a0b57 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html index 2268de142..3af846c78 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html index 0facfc458..6a997539b 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log((null || undefined) ?? "foo")
- - + + \ No newline at end of file diff --git a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html index 0f530f294..e1f6ff24d 100644 --- a/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html +++ b/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, 7 linia wyrzuci do konsoli SyntaxError.

Treść błędu może się różnić w zależności od kontekstu, w którym kod zostanie wywołany.

W przypadku przekazania kodu jako argument do console.log(), dostaniemy informację o brakującym domknięciu nawiasu na liście argumentów.

SyntaxError sprowadza się jednak do niedozwolonej składni w języku JavaScript. Po prostu nie możemy użyć danej konstrukcji.

I taką niedozwoloną konstrukcją jest użycie operatora ?? na równi z operatorami || lub &&.

Po prostu nie możemy tego robić, musimy użyć nawiasów dla wyraźnego zgrupowania wyrażeń, które chcemy aby zostały wykonane w pierwszej kolejności.

Dokumentacja JavaScript od Mozilli (MDN), tłumaczy, że jednoczesne użycie ?? w połączeniu z || lub && mogłoby wprowadzać w kodzie błędy wynikające z wystąpienia zwarcia (short circuiting).

Warto zauważyć, że tabela priorytetów wykonywania operatorów plasuje && wyżej niż ||, ale ze względu na efekt zwarcia, który jeśli wystąpi, totalnie ignoruje drugi operand, co również może prowadzić do błędów w kodzie związanych z oczekiwaniem wywołania funkcji w takim wyrażeniu.

Przykładowo, przy wyrażeniu true || alert("bar") && false zadziała zwarcie na wartości true i cały dalszy kod nie zostanie wykonany, mimo że priorytet wykonywania operatorów mógłby sugerować, że funkcja alert("bar") powinna zostać wykonana w celu ewaluacji wartości operatora &&.

W tym kontekście, wyrzucanie błędu składniowego w momencie równoległego użycia ?? z && lub || wydaje się być naciągane.

- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html index 8ba68ff41..bc654e0f7 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #079

🪲 Znajdź buga

const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}, 500)
},
}

myObject.showMessage()

Chcemy zalogować do konsoli, z lekkim opóźnieniem, wiadomość powitalną zdefiniowaną we własności obiektu.

Co dokładnie zostanie zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}.bind(myObject), 500)
},
}

myObject.showMessage()

W błędnym przykładzie do konsoli zostanie zalogowana wartość undefined.

Globalna funkcja setTimeout() to tak naprawdę metoda globalnego obiektu (window lub global).

Wywołanie this wewnątrz zwrotnej funkcji (callback) przekazanej do setTimeout() skutkuje więc wskazywaniem this na obiekt globalny, który nie ma zdefiniowanej własności message.

this jest zawsze zależne od kontekstu, w którym zostaje wywołane.

Aby przypisać interesujący nas kontekst obiektu myObject możemy użyć metody bind() na anonimowej funkcji przekazywanej jako callback do setTimeout().

Innym sposobem może być zamienienie deklaracji anonimowej funkcji callback na wyrażenie funkcji strzałkowej.

Dzięki temu this będzie odnosiło się do wyższego kontekstu, ponieważ funkcje strzałkowe nie mają własnego wiązania dla this.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html index 140ae72e9..ea91e81f6 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}, 500)
},
}

myObject.showMessage()
- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html index 874e18aea..4afad3400 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy zalogować do konsoli, z lekkim opóźnieniem, wiadomość powitalną zdefiniowaną we własności obiektu.

Co dokładnie zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html index 871dff5ec..4a32eb82f 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html index 04e9d5fe3..60fd9ec19 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const myObject = {
message: "Hello world!",
showMessage() {
setTimeout(function () {
console.log(this.message)
}.bind(myObject), 500)
},
}

myObject.showMessage()
- - + + \ No newline at end of file diff --git a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html index 7d95e5d1a..737e75667 100644 --- a/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html +++ b/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W błędnym przykładzie do konsoli zostanie zalogowana wartość undefined.

Globalna funkcja setTimeout() to tak naprawdę metoda globalnego obiektu (window lub global).

Wywołanie this wewnątrz zwrotnej funkcji (callback) przekazanej do setTimeout() skutkuje więc wskazywaniem this na obiekt globalny, który nie ma zdefiniowanej własności message.

this jest zawsze zależne od kontekstu, w którym zostaje wywołane.

Aby przypisać interesujący nas kontekst obiektu myObject możemy użyć metody bind() na anonimowej funkcji przekazywanej jako callback do setTimeout().

Innym sposobem może być zamienienie deklaracji anonimowej funkcji callback na wyrażenie funkcji strzałkowej.

Dzięki temu this będzie odnosiło się do wyższego kontekstu, ponieważ funkcje strzałkowe nie mają własnego wiązania dla this.

- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html index 6ae793f30..b88a144a2 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4.html @@ -6,9 +6,9 @@ Codisity - - - + + +
@@ -19,7 +19,7 @@ Zamiana true/false poprzez parseInt() zwraca NaN w obu przypadkach.

Konwersja liczb z innych systemów liczbowych np. binarnego (zapisywanego z prefiksem 0b), zwraca wartość liczbową w systemie dziesiętnym zarówno poprzez Number() jak i parseInt().

Różnica w wartości zwracanej pojawia się, gdy jako argument funkcji przekażemy liczbę wewnątrz ciągu znaków np. "0b0111".

Number() zwróci wartość w systemie dziesiętnym, jak poprzednio.\ parseInt() zachowa się już jednak inaczej i zwróci 0...

Tak jak we wcześniejszym przykładzie " 0 bar ", dla parseInt() liczy się tylko pierwsza liczba, którą rozpozna w ciągu znaków. Przykładowo parseInt("123abc") zwróci 123.

Warto zaznaczyć, że wartości można też konwertować na typ liczbowy za pomocą jednoargumentowego operatora +. Używa on tego samego algorytmu co Number() z jednym, małym wyjątkiem... 🙃

Dla dużych wartości liczbowych, konwersja wartości typu BigInt poprzez Number() zwróci przybliżoną wartość w postaci liczbowej.

Używając operatora + dla konwersji wartości BigInt otrzymamy błąd Cannot convert a BigInt value to a number.

Warto też wiedzieć, że parseInt() jest również dostępny jako metoda Number.parseInt(). Na szczęście nie ma między nimi różnic i obie działają tak samo.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html index 3e47a535c..812a325d2 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(Number("123"))
console.log(parseInt("123"))

console.log(Number(""))
console.log(parseInt(""))

console.log(Number(" 0 "))
console.log(parseInt(" 0 "))

console.log(Number(" 0 bar "))
console.log(parseInt(" 0 bar "))

console.log(Number(" foo 0 bar "))
console.log(parseInt(" foo 0 bar "))

console.log(Number(null))
console.log(parseInt(null))

console.log(Number(undefined))
console.log(parseInt(undefined))

console.log(Number(true))
console.log(parseInt(true))

console.log(Number(0b0111))
console.log(parseInt(0b0111))

console.log(Number("0b0111"))
console.log(parseInt("0b0111"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html index 9dff2280a..2fe9dbb02 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcąc zamienić jakąś nienumeryczną wartość na liczbę, możemy użyć kilku rozwiązań, m.in. funkcji Number() oraz parseInt().

Czy obie funkcje zwracają te same wartości dla tych samych argumentów?

- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html index d01e559f9..d2a634db6 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html index 32a657a76..4e3dcc912 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(Number("123")) // 123
console.log(parseInt("123")) // 123

console.log(Number("")) // 0
console.log(parseInt("")) // NaN

console.log(Number(" 0 ")) // 0
console.log(parseInt(" 0 ")) // 0

console.log(Number(" 0 bar ")) // NaN
console.log(parseInt(" 0 bar ")) // 0

console.log(Number(" foo 0 bar ")) // NaN
console.log(parseInt(" foo 0 bar ")) // NaN

console.log(Number(null)) // 0
console.log(parseInt(null)) // NaN

console.log(Number(undefined)) // NaN
console.log(parseInt(undefined)) // NaN

console.log(Number(true)) // 1
console.log(parseInt(true)) // NaN

console.log(Number(0b0111)) // 7
console.log(parseInt(0b0111)) // 7

console.log(Number("0b0111")) // 7
console.log(parseInt("0b0111")) // 0
- - + + \ No newline at end of file diff --git a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html index b01410e60..dc374bca8 100644 --- a/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html +++ b/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.html @@ -6,9 +6,9 @@ Codisity - - - + + +
@@ -18,7 +18,7 @@ Zamiana null poprzez praseInt() zwraca NaN.

Może to być bardzo mylące z uwagi na to, że dla wartości undefined, obie funkcje zwracają NaN.

Zamiana true/false poprzez Number() zwraca 1/0.\ Zamiana true/false poprzez parseInt() zwraca NaN w obu przypadkach.

Konwersja liczb z innych systemów liczbowych np. binarnego (zapisywanego z prefiksem 0b), zwraca wartość liczbową w systemie dziesiętnym zarówno poprzez Number() jak i parseInt().

Różnica w wartości zwracanej pojawia się, gdy jako argument funkcji przekażemy liczbę wewnątrz ciągu znaków np. "0b0111".

Number() zwróci wartość w systemie dziesiętnym, jak poprzednio.\ parseInt() zachowa się już jednak inaczej i zwróci 0...

Tak jak we wcześniejszym przykładzie " 0 bar ", dla parseInt() liczy się tylko pierwsza liczba, którą rozpozna w ciągu znaków. Przykładowo parseInt("123abc") zwróci 123.

Warto zaznaczyć, że wartości można też konwertować na typ liczbowy za pomocą jednoargumentowego operatora +. Używa on tego samego algorytmu co Number() z jednym, małym wyjątkiem... 🙃

Dla dużych wartości liczbowych, konwersja wartości typu BigInt poprzez Number() zwróci przybliżoną wartość w postaci liczbowej.

Używając operatora + dla konwersji wartości BigInt otrzymamy błąd Cannot convert a BigInt value to a number.

Warto też wiedzieć, że parseInt() jest również dostępny jako metoda Number.parseInt(). Na szczęście nie ma między nimi różnic i obie działają tak samo.

- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html index 7c761c76f..e57cecef9 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #033

🪲 Znajdź buga

console.log(!"")
console.log(!" ")
console.log(!!"")
console.log(!!" ")

console.log(Boolean(""))
console.log(Boolean(" "))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(!"") // true
console.log(!" ") // false
console.log(!!"") // false
console.log(!!" ") // true

console.log(Boolean("")) // false
console.log(Boolean(" ")) // true

Operator negacji (logiczne NIE !), odwraca prawdziwość/fałszywość i konwertuje ją do wartości logicznej.

Dl wartości !true zostanie zwrócona więc odwrotność, czyli false, a dla !false, true.

W przypadku gdy operator ! zostaje użyty z wartością inną niż logiczna (boolean), wtedy pod uwagę brana jest prawdziwość (truthy) lub fałszywość (falsy) operandu i zwracana jest jego odwrotność w postaci logicznej (false lub true).

Pusty ciąg znaków "" w JavaScript jest wartością fałszywą, więc jej zanegowanie da nam wartość logiczną true, a podwójne zanegowanie wartość false.

Użycie podwójnego operatora negacji (!!) jest równoznaczne z użyciem konstruktora (Boolean), czyli konwersją wartości prawdziwych/fałszywych na logiczne true/false.

Gdy jednak ciąg znaków nie jest pusty i zawiera choćby biały znak " " jest już wtedy interpretowany jako wartość prawdziwa, więc negacja takiej wartości da nam false.

Sytuacja z pustym ciągiem znaków i ciągiem znaków składającym się z białych znaków może być myląca, szczególnie gdy porównamy to z działaniem konstruktora Number, ale to już jest temat na innego buga...

Rozwiązaniem problematyczności tych zjawisk jest tylko i wyłącznie zapamiętanie w jaki sposób JavaScript interpretuje kod.

Mocno wskazane jest też testowanie kodu przed wdrożeniem go na produkcję.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html index 5baa133e1..d42e63024 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(!"")
console.log(!" ")
console.log(!!"")
console.log(!!" ")

console.log(Boolean(""))
console.log(Boolean(" "))
- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html index f01a3e26e..720ca2f51 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html index 5f920f32f..a8ef20be5 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html index ec8606f0a..2f5531009 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(!"") // true
console.log(!" ") // false
console.log(!!"") // false
console.log(!!" ") // true

console.log(Boolean("")) // false
console.log(Boolean(" ")) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html index d136ef2a0..e61e1339a 100644 --- a/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html +++ b/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Operator negacji (logiczne NIE !), odwraca prawdziwość/fałszywość i konwertuje ją do wartości logicznej.

Dl wartości !true zostanie zwrócona więc odwrotność, czyli false, a dla !false, true.

W przypadku gdy operator ! zostaje użyty z wartością inną niż logiczna (boolean), wtedy pod uwagę brana jest prawdziwość (truthy) lub fałszywość (falsy) operandu i zwracana jest jego odwrotność w postaci logicznej (false lub true).

Pusty ciąg znaków "" w JavaScript jest wartością fałszywą, więc jej zanegowanie da nam wartość logiczną true, a podwójne zanegowanie wartość false.

Użycie podwójnego operatora negacji (!!) jest równoznaczne z użyciem konstruktora (Boolean), czyli konwersją wartości prawdziwych/fałszywych na logiczne true/false.

Gdy jednak ciąg znaków nie jest pusty i zawiera choćby biały znak " " jest już wtedy interpretowany jako wartość prawdziwa, więc negacja takiej wartości da nam false.

Sytuacja z pustym ciągiem znaków i ciągiem znaków składającym się z białych znaków może być myląca, szczególnie gdy porównamy to z działaniem konstruktora Number, ale to już jest temat na innego buga...

Rozwiązaniem problematyczności tych zjawisk jest tylko i wyłącznie zapamiętanie w jaki sposób JavaScript interpretuje kod.

Mocno wskazane jest też testowanie kodu przed wdrożeniem go na produkcję.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html index bc3224577..6d178ed60 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #094

🪲 Znajdź buga

const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)

Wszystkie 6 wywołań zwróci te same wartości, tablicę ["a", "b", "c"].

Funkcja fn za pomocą operatora ... tworzy listę przekazanych do niej argumentów, a następnie zwraca utworzoną w ten sposób tablicę z wartościami przekazanymi w argumentach.

console.log(fn("a", "b", "c")) zaloguje do konsoli wartości zwrócone z wywołanej funkcji fn, co skutkuje stworzeniem z listy przekazanych argumentów, tablicy ["a", "b", "c"].

console.log.call(null, ["a", "b", "c"]) za pomocą metody call wywoływana jest funkcja console.log co stanowi ekwiwalent wywołania console.log(["a", "b", "c"]) z kontekstem null, czyli bez wskazywania na konkretny obiekt, który byłby dostępny pod this.

console.log(Function.call.call(fn, null, "a", "b", "c")) loguje do konsoli efekt wywołania metody call() na funkcji utworzonej przez wywołanie poprzedniej metody call(), która to tworzy anonimowy obiekt funkcji, tak samo jak gdybyśmy wywołali Function().

Początkowa funkcja w takim ciągu przestaje mieść znaczenie. Widać to na kolejnym przykładzie console.log(fn.call.call(fn, null, "a", "b", "c")), który zachowuje się tak samo.

Łańcuch .call.call mógłby zawierać znacznie więcej powtórzeń nie zmieniającą ostatecznego działania. Początkowa funkcja na której rozpoczyna się ciąg wielu wywołań .call traci wtedy na znaczeniu.

Finalnie liczą się tylko 2 ostatnie elementy. Wywołanie poprzez metodę call() funkcji, która również jest funkcją call i nie implementuje dodatkowego działania.

Następuje więc przesunięcie. Kontekst przekazany jako pierwszy argument do call() staje się implementacją wywoływanej funkcji.

Kolejny argument null staje się kontekstem dla ewentualnego wywołania this, a następne argumenty stają się argumentami przekazanymi już do docelowej funkcji (w naszym przypadku fn).

Ostatnim przykładem udowadniającym to działanie jest użycie setTimeout, który służy jedynie za "dawcę", na którym można rozpocząć wywoływanie ciągu .call.

Warto też wspomnieć o bliźniaczym odpowiedniku metody call(), apply().

Jedyna różnica pomiędzy tymi metodami jest taka, że call() przyjmuje listę argumentów (tak jak standardowa funkcja), a apply() przyjmuje tablicę zawierającą docelowe argumenty.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html index cdf54933c..eb7b34151 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html index b52ed4f6e..1b3bfd53d 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html index e70ad1840..73275e36b 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html index 9303a9bd5..9f5ebceea 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const fn = (...args) => args

console.log(
fn("a", "b", "c")
)
console.log.call(
null, ["a", "b", "c"]
)
console.log(
Function.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
fn.call.call(
fn, null, "a", "b", "c"
)
)
console.log(
setTimeout.call.call(
fn, null, "a", "b", "c"
)
)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html index a7532798e..5cf269654 100644 --- a/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html +++ b/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wszystkie 6 wywołań zwróci te same wartości, tablicę ["a", "b", "c"].

Funkcja fn za pomocą operatora ... tworzy listę przekazanych do niej argumentów, a następnie zwraca utworzoną w ten sposób tablicę z wartościami przekazanymi w argumentach.

console.log(fn("a", "b", "c")) zaloguje do konsoli wartości zwrócone z wywołanej funkcji fn, co skutkuje stworzeniem z listy przekazanych argumentów, tablicy ["a", "b", "c"].

console.log.call(null, ["a", "b", "c"]) za pomocą metody call wywoływana jest funkcja console.log co stanowi ekwiwalent wywołania console.log(["a", "b", "c"]) z kontekstem null, czyli bez wskazywania na konkretny obiekt, który byłby dostępny pod this.

console.log(Function.call.call(fn, null, "a", "b", "c")) loguje do konsoli efekt wywołania metody call() na funkcji utworzonej przez wywołanie poprzedniej metody call(), która to tworzy anonimowy obiekt funkcji, tak samo jak gdybyśmy wywołali Function().

Początkowa funkcja w takim ciągu przestaje mieść znaczenie. Widać to na kolejnym przykładzie console.log(fn.call.call(fn, null, "a", "b", "c")), który zachowuje się tak samo.

Łańcuch .call.call mógłby zawierać znacznie więcej powtórzeń nie zmieniającą ostatecznego działania. Początkowa funkcja na której rozpoczyna się ciąg wielu wywołań .call traci wtedy na znaczeniu.

Finalnie liczą się tylko 2 ostatnie elementy. Wywołanie poprzez metodę call() funkcji, która również jest funkcją call i nie implementuje dodatkowego działania.

Następuje więc przesunięcie. Kontekst przekazany jako pierwszy argument do call() staje się implementacją wywoływanej funkcji.

Kolejny argument null staje się kontekstem dla ewentualnego wywołania this, a następne argumenty stają się argumentami przekazanymi już do docelowej funkcji (w naszym przypadku fn).

Ostatnim przykładem udowadniającym to działanie jest użycie setTimeout, który służy jedynie za "dawcę", na którym można rozpocząć wywoływanie ciągu .call.

Warto też wspomnieć o bliźniaczym odpowiedniku metody call(), apply().

Jedyna różnica pomiędzy tymi metodami jest taka, że call() przyjmuje listę argumentów (tak jak standardowa funkcja), a apply() przyjmuje tablicę zawierającą docelowe argumenty.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html index c613a530d..3e55778df 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #087

🪲 Znajdź buga

console.log(037 - 027)

Jaki wynik działania zostanie zalogowany do konsoli?

🧪 Rozwiązanie

console.log(037 - 027) // 8
console.log(0o37 - 0o27) // 8

Działanie 037 - 027 w trybie nieścisłym zwróci wynik 8.

Tryb nieścisły pozwala na interpretację liczba zaczynających się zerem jako liczb oktalnych (ósemkowych).

037 w systemie ósemkowym to 31 w systemie dziesiętnym.

027 w systemie ósemkowym to 23 w systemie dziesiętnym.

31 - 23 daje wynik 8.

Aby zablokować interpretację liczb oktalnych poprzez sam prefiks 0, musimy uaktywnić tryb ścisły.

Można to zrobić np. poprzez deklarację "use strict".

Tryb ścisły automatycznie uaktywnia się też w modułach JavaScript w momencie gdy w kodzie pojawia się import lub export.

W trybie ścisłym zapis oktalny wymaga bardziej wyraźnego prefiksu 0o, a nie tylko samego 0.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html index 92052a44b..63c7a9eb1 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(037 - 027)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html index 6c11280bb..b540ed394 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jaki wynik działania zostanie zalogowany do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html index 7f098e29f..425f9c7f3 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html index b19df3610..12cb26b48 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(037 - 027) // 8
console.log(0o37 - 0o27) // 8
- - + + \ No newline at end of file diff --git a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html index 46c898d21..a8f222aed 100644 --- a/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html +++ b/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Działanie 037 - 027 w trybie nieścisłym zwróci wynik 8.

Tryb nieścisły pozwala na interpretację liczba zaczynających się zerem jako liczb oktalnych (ósemkowych).

037 w systemie ósemkowym to 31 w systemie dziesiętnym.

027 w systemie ósemkowym to 23 w systemie dziesiętnym.

31 - 23 daje wynik 8.

Aby zablokować interpretację liczb oktalnych poprzez sam prefiks 0, musimy uaktywnić tryb ścisły.

Można to zrobić np. poprzez deklarację "use strict".

Tryb ścisły automatycznie uaktywnia się też w modułach JavaScript w momencie gdy w kodzie pojawia się import lub export.

W trybie ścisłym zapis oktalny wymaga bardziej wyraźnego prefiksu 0o, a nie tylko samego 0.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html index b48dff7cb..b2b6d2299 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #022

🪲 Znajdź buga

const html = "
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
"

document.body
.insertAdjacentHTML("afterbegin", html)

Chcemy dodać zaraz na początku strony kod HTML za pomocą JavaScript. Czy powyższy kod nam to umożliwi?

🧪 Rozwiązanie

const html = `
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
`

document.body
.insertAdjacentHTML("afterbegin", html)

Przykład z błędem nie wykona poprawnie postawionego zadania. Powodem jest nie domknięcie cudzysłowu (bez znaczenia czy użyjemy pojedynczego czy podwójnego).

W kodzie jednak może nam się wydawać, że cudzysłów domykamy. Robimy to jednak nie w tej samej linii, w której go otworzyliśmy, a na to JavaScript już nie pozwala.

Mamy 2 możliwości naprawienia tego błędu.

Pierwszą z nich jest uniknięcie (escape) przejścia do nowej linii poprzez wstawienie wstecznego ukośnika (backslash \).

Backslash spowoduje, że biały znak przejścia do nowej linii zostanie "wyeskejpowany", czyli nie zostanie potraktowany jako znak kończący kod w danej linii, więc i nie wywoła błędu o niedomkniętym cudzysłowu.

\ musimy jednak wstawić na końcu każdej linii, w której przechodzimy do nowej linii wewnątrz cudzysłowów (1, 2, 3 linia).

Znacznie wygodniejszym rozwiązaniem będzie użycie Template literals (Template strings).

Zamiast używać cudzysłowu (" lub ') używamy grawisu (backtick `).

Możemy wtedy kompletnie pominąć \ na końcach wierszy i swobodnie przenosić kod do nowych linii.

Template literals ma jednak pewną istotną implikację. Kod HTML będzie preformatowany. Jeśli sprawdzimy źródło kodu w przeglądarce, zobaczymy, że wszystkie białe znaki będą zachowane, podobnie jakbyśmy kod zawarli w znacznikach <pre>.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html index 88ecff6bb..8fbfdda6c 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const html = "
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
"

document.body
.insertAdjacentHTML("afterbegin", html)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html index 0398796b6..d5edb290f 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy dodać zaraz na początku strony kod HTML za pomocą JavaScript. Czy powyższy kod nam to umożliwi?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html index 425a91fb0..5cb09eb77 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html index 767ac486e..6645133c5 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const html = `
<h1>Hello World!</h1>
<p>JavaScript is awesome!</p>
`

document.body
.insertAdjacentHTML("afterbegin", html)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html index 182dce6e0..7c4c28298 100644 --- a/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html +++ b/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Przykład z błędem nie wykona poprawnie postawionego zadania. Powodem jest nie domknięcie cudzysłowu (bez znaczenia czy użyjemy pojedynczego czy podwójnego).

W kodzie jednak może nam się wydawać, że cudzysłów domykamy. Robimy to jednak nie w tej samej linii, w której go otworzyliśmy, a na to JavaScript już nie pozwala.

Mamy 2 możliwości naprawienia tego błędu.

Pierwszą z nich jest uniknięcie (escape) przejścia do nowej linii poprzez wstawienie wstecznego ukośnika (backslash \).

Backslash spowoduje, że biały znak przejścia do nowej linii zostanie "wyeskejpowany", czyli nie zostanie potraktowany jako znak kończący kod w danej linii, więc i nie wywoła błędu o niedomkniętym cudzysłowu.

\ musimy jednak wstawić na końcu każdej linii, w której przechodzimy do nowej linii wewnątrz cudzysłowów (1, 2, 3 linia).

Znacznie wygodniejszym rozwiązaniem będzie użycie Template literals (Template strings).

Zamiast używać cudzysłowu (" lub ') używamy grawisu (backtick `).

Możemy wtedy kompletnie pominąć \ na końcach wierszy i swobodnie przenosić kod do nowych linii.

Template literals ma jednak pewną istotną implikację. Kod HTML będzie preformatowany. Jeśli sprawdzimy źródło kodu w przeglądarce, zobaczymy, że wszystkie białe znaki będą zachowane, podobnie jakbyśmy kod zawarli w znacznikach <pre>.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html index 23d6f5c31..c5f4850ea 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #042

🪲 Znajdź buga

console.log(1 < 2 < 3)
console.log(0 < 1 < 2)

console.log(3 > 2 > 1)
console.log(2 > 1 > 0)

Co zalogują do konsoli poszczególne ciągi porównań?

🧪 Rozwiązanie

console.log(1 < 2 < 3) // true
console.log(0 < 1 < 2) // true

console.log(3 > 2 > 1) // false
console.log(2 > 1 > 0) // true

Wszystkie przykłady oprócz 3 > 2 > 1 zalogują wartość true.

Dlaczego 3 > 2 > 1 zaloguje false? Przeanalizujmy to krok po kroku.

Operatory > (więcej niż) oraz < (mniej niż) porównują ze sobą dwa operandy, zwracając wartość logiczną z takiego porównania.

Gdy używamy ciągu kilku porównań, sytuacja wygląda analogicznie, jak w przypadku używania ciągu innych operatorów np. dodawania, mnożenia, porównania, koniunkcji itp.

Kolejność oraz kierunek wykonywania operacji wykonywanych przez operatory definiuje tabela pierwszeństwa operatorów (operator precedence).

Operatory > i < wykonują porównania po kolei, od lewej do prawej.

Dla 3 > 2 > 1 w pierwszej kolejności wykonane zostanie porównanie 3 > 2 i zwróci ono wartość true.

Ciąg porównań zostanie zredukowany i będzie w kolejnym kroku porównywał true > 1.

W przypadku gdy porównywane wartości nie są wartościami liczbowymi, zostają one sprowadzone do wartości liczbowej za pomocą algorytmu funkcji Number().

Wartość Number(true) zwraca wartość 1.

W językach programowania, wartości logiczne true/false są z reguły reprezentowane przez wartości liczbowe 1/0.

Finalnie true > 1 zostanie więc skonwertowane do 1 > 1. Wynikiem takiego porównania będzie rzecz jasna wartość false.

W pozostałych przykładach porównań zachodzi analogiczny proces.

Z początkowych porównań zwracana jest wartość logiczna. Następnie kolejne porównania konwertują wartości logiczne na wartości liczbowe i dokonują kolejnych porównań.

true < 3 to prawda, true < 2 to prawda i true > 0 to też prawda.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html index 174909719..2517bcd23 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(1 < 2 < 3)
console.log(0 < 1 < 2)

console.log(3 > 2 > 1)
console.log(2 > 1 > 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html index c11c8c148..d6d48bcff 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zalogują do konsoli poszczególne ciągi porównań?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html index 635dd2628..b3aae17ca 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html index 95d4cb61d..cb9b5a3e8 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(1 < 2 < 3) // true
console.log(0 < 1 < 2) // true

console.log(3 > 2 > 1) // false
console.log(2 > 1 > 0) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html index 84720c958..0f9c21a63 100644 --- a/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html +++ b/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Wszystkie przykłady oprócz 3 > 2 > 1 zalogują wartość true.

Dlaczego 3 > 2 > 1 zaloguje false? Przeanalizujmy to krok po kroku.

Operatory > (więcej niż) oraz < (mniej niż) porównują ze sobą dwa operandy, zwracając wartość logiczną z takiego porównania.

Gdy używamy ciągu kilku porównań, sytuacja wygląda analogicznie, jak w przypadku używania ciągu innych operatorów np. dodawania, mnożenia, porównania, koniunkcji itp.

Kolejność oraz kierunek wykonywania operacji wykonywanych przez operatory definiuje tabela pierwszeństwa operatorów (operator precedence).

Operatory > i < wykonują porównania po kolei, od lewej do prawej.

Dla 3 > 2 > 1 w pierwszej kolejności wykonane zostanie porównanie 3 > 2 i zwróci ono wartość true.

Ciąg porównań zostanie zredukowany i będzie w kolejnym kroku porównywał true > 1.

W przypadku gdy porównywane wartości nie są wartościami liczbowymi, zostają one sprowadzone do wartości liczbowej za pomocą algorytmu funkcji Number().

Wartość Number(true) zwraca wartość 1.

W językach programowania, wartości logiczne true/false są z reguły reprezentowane przez wartości liczbowe 1/0.

Finalnie true > 1 zostanie więc skonwertowane do 1 > 1. Wynikiem takiego porównania będzie rzecz jasna wartość false.

W pozostałych przykładach porównań zachodzi analogiczny proces.

Z początkowych porównań zwracana jest wartość logiczna. Następnie kolejne porównania konwertują wartości logiczne na wartości liczbowe i dokonują kolejnych porównań.

true < 3 to prawda, true < 2 to prawda i true > 0 to też prawda.

- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html index 54b6c7360..a7b069732 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #017

🪲 Znajdź buga

setTimeout(() => {
console.log("Infinity")
}, Infinity)

setTimeout(() => {
console.log("24.8 days")
}, 2147483648)

setTimeout(() => {
console.log("Immediately")
}, 0)

Z jakim opóźnieniem wykonają się poszczególne logowania do konsoli?

🧪 Rozwiązanie

setTimeout(() => {
console.log("24.8 days")
}, 2147483647)

W "zarobaczonym" przykładzie, wszystkie 3 logowania do konsoli wykonają się z tym samym, zerowym opóźnieniem.

Dzieje się tak, ponieważ aktualnie wszystkie najpopularniejsze przeglądarki przechowują w pamięci wartość opóźnienia z setTimeout() jako 32 bitową, podpisaną liczbę całkowitą.

Oznacza to, że w pamięci możemy zapisać w systemie binarnym wyłącznie liczby z zakresu od -2147483647 do 2147483647.

32 bity to 32 jednostki pamięci mogące przechowywać wartość 0 lub 1.

Pierwszy bit odpowiada za podpisanie liczby tj. zakomunikowanie czy jest ona dodatnia czy ujemna. W pozostałych 31 bitach możemy więc zapisać maksymalnie 31 jedynek.

31 jedynek w systemie binarnym to 2 147 483 647 w systemie dziesiętnym.

Użycie każdej liczby, która jest większa, jak np. 2 147 483 648 lub nieskończoności, spowoduje "przelanie" się dostępnego miejsca w pamięci i poskutkuje wykonaniem setTimeout() z zerowym opóźnieniem.

Środowisko uruchomieniowe Node.js w przeciwieństwie do przeglądarek informuje nas o tym błędzie. Do konsoli logowane jest ostrzeżenie, informujące, że wartości Infinity oraz 2147483648 nie mieszczą się w pamięci jako 32 bitowej podpisanej liczby całkowitej i z tego względu czas opóźnienia zostaje ustawiony na 1.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html index 533f59ad3..c93097767 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("Infinity")
}, Infinity)

setTimeout(() => {
console.log("24.8 days")
}, 2147483648)

setTimeout(() => {
console.log("Immediately")
}, 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html index b004f2354..c326041c2 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Z jakim opóźnieniem wykonają się poszczególne logowania do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html index 88c8f9454..c978a5f88 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html index 60eee2237..d54909860 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
setTimeout(() => {
console.log("24.8 days")
}, 2147483647)
- - + + \ No newline at end of file diff --git a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html index c8dfd562a..e7457f21a 100644 --- a/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html +++ b/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W "zarobaczonym" przykładzie, wszystkie 3 logowania do konsoli wykonają się z tym samym, zerowym opóźnieniem.

Dzieje się tak, ponieważ aktualnie wszystkie najpopularniejsze przeglądarki przechowują w pamięci wartość opóźnienia z setTimeout() jako 32 bitową, podpisaną liczbę całkowitą.

Oznacza to, że w pamięci możemy zapisać w systemie binarnym wyłącznie liczby z zakresu od -2147483647 do 2147483647.

32 bity to 32 jednostki pamięci mogące przechowywać wartość 0 lub 1.

Pierwszy bit odpowiada za podpisanie liczby tj. zakomunikowanie czy jest ona dodatnia czy ujemna. W pozostałych 31 bitach możemy więc zapisać maksymalnie 31 jedynek.

31 jedynek w systemie binarnym to 2 147 483 647 w systemie dziesiętnym.

Użycie każdej liczby, która jest większa, jak np. 2 147 483 648 lub nieskończoności, spowoduje "przelanie" się dostępnego miejsca w pamięci i poskutkuje wykonaniem setTimeout() z zerowym opóźnieniem.

Środowisko uruchomieniowe Node.js w przeciwieństwie do przeglądarek informuje nas o tym błędzie. Do konsoli logowane jest ostrzeżenie, informujące, że wartości Infinity oraz 2147483648 nie mieszczą się w pamięci jako 32 bitowej podpisanej liczby całkowitej i z tego względu czas opóźnienia zostaje ustawiony na 1.

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html index 121da0a72..923f9003e 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #082

🪲 Znajdź buga

function capitalize(str) {
str[0].toUpperCase()

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))

Chcemy w ciągu znaków zamieniać pierwszą z liter na dużą.

Czy powyższy kod spełni to zadanie?

🧪 Rozwiązanie

function capitalize(str) {
str = str[0].toUpperCase() + str.slice(1)

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))

Błędny kod opiera swoje założenia na mutowalności tablic.

Mimo, że ciągi znaków są z natury przechowywane w pamięci w postaci tablic (każda litera to osobna komórka, którą możemy pobrać tak samo jak komórki tablicy), to fundamentalnie ciągi znaków są niemutowalne.

Metoda toUpperCase() nie może więc zmodyfikować oryginalnego ciągu znaków. Może jedynie zwrócić efekt swojego działania tj. zwrócić przekazany w argumencie ciąg znaków w postaci dużych liter.

str[0].toUpperCase() pobiera pierwszy znak z ciągu str i zwraca go w formie dużej litery.

Nie przypisujemy jednak nigdzie tej zmiany, więc kod ten jest po prostu bezużyteczny.

str = str[0].toUpperCase() to nadpisanie początkowego ciągu znaków str pierwszym znakiem (indeks 0 z tablicy) zwróconym w postaci dużej litery.

W takim przypadku brakuje jednak dalszego ciągu znaków, który możemy dołączyć używając str.slice(1).

Metoda slice() działa tak samo dla ciągu znaków jak i dla tablic, wycinając żądany fragment.

W naszym przypadku wycinamy cały ciąg znaków rozpoczynając od indeksu 1, pozbywając się tym samym z str indeksu 0.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html index 827d201a1..5b16a71f0 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function capitalize(str) {
str[0].toUpperCase()

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html index b9dddb354..7d2105997 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy w ciągu znaków zamieniać pierwszą z liter na dużą.

Czy powyższy kod spełni to zadanie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html index f38438b0a..44e91ffc1 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html index e211e66f8..82f2c0a16 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function capitalize(str) {
str = str[0].toUpperCase() + str.slice(1)

return str
}

const sentence = "the quick brown fox"

console.log(capitalize(sentence))
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html index f869701cd..61765a633 100644 --- a/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html +++ b/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Błędny kod opiera swoje założenia na mutowalności tablic.

Mimo, że ciągi znaków są z natury przechowywane w pamięci w postaci tablic (każda litera to osobna komórka, którą możemy pobrać tak samo jak komórki tablicy), to fundamentalnie ciągi znaków są niemutowalne.

Metoda toUpperCase() nie może więc zmodyfikować oryginalnego ciągu znaków. Może jedynie zwrócić efekt swojego działania tj. zwrócić przekazany w argumencie ciąg znaków w postaci dużych liter.

str[0].toUpperCase() pobiera pierwszy znak z ciągu str i zwraca go w formie dużej litery.

Nie przypisujemy jednak nigdzie tej zmiany, więc kod ten jest po prostu bezużyteczny.

str = str[0].toUpperCase() to nadpisanie początkowego ciągu znaków str pierwszym znakiem (indeks 0 z tablicy) zwróconym w postaci dużej litery.

W takim przypadku brakuje jednak dalszego ciągu znaków, który możemy dołączyć używając str.slice(1).

Metoda slice() działa tak samo dla ciągu znaków jak i dla tablic, wycinając żądany fragment.

W naszym przypadku wycinamy cały ciąg znaków rozpoczynając od indeksu 1, pozbywając się tym samym z str indeksu 0.

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html index f399890b8..b2b72434f 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #096

🪲 Znajdź buga

// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)

Jakie wartości zostaną zalogowane do konsoli?

Czy aktywowanie use strict coś by zmieniło?

🧪 Rozwiązanie

// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)
// 3x {
// message1: "welcome",
// message2: "everybody"
// }

Proxy umożliwia ustanowienie pełnomocnictwa dla danego obiektu.

Oznacza to, że poprzez new Proxy(greeting, {}), tworzymy nowy obiekt proxy {}, który będzie zachowywał się tak jak obiekt greeting.

Wszystkie operacje na takim obiekcie w tym np. modyfikacje własności message2, będą miały odzwierciedlenie w oryginalnym obiekcie, czyli zmiany zajdą zarówno w obiekcie proxy1 jak i greeting.

Na tym etapie proxy przypomina stworzenie aliasu obiektu np. poprzez proxy1 = greeting.

Mamy więc przypisanie przez referencję i modyfikowanie obiektu proxy1 jest tożsame z modyfikowaniem obiektu greeting.

Proxy umożliwia jednak dodanie dodatkowej logiki, która zostanie wykonana w imieniu oryginalnego obiektu.

Możemy w ten sposób dodać np. walidację setter'ów, przez co przed modyfikacją oryginalnego obiektu, obiekt proxy najpierw wykona własny kod i dopiero w nim zdecyduje czy dana modyfikacja może zostać wykonana.

Tworząc obiekt validator i ustawiając go jako proxy dla obiektu greeting poprzez new Proxy(greeting, validator), blokujemy możliwość ustawienia własności message2 na wartość no one.

proxy2.message2 = "no one" staje się więc niedozwolone i nie zmodyfikuje ani obiektu proxy ani obiektu oryginalnego.

Jeśli aktywujemy tryb ścisły, to ze względu na taką niedozwoloną akcję, wyrzucony zostanie błąd 'set' on proxy: trap returned falsish for property 'message2'.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html index 52c3d7f1a..2a6748ba3 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html index 0839986d3..665b79a40 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

Czy aktywowanie use strict coś by zmieniło?

- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html index 7d5ce52f4..c590e941f 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html index fe67a3a8d..3c6082eb6 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
// "use strict"

const greeting = {
message1: "hello",
message2: "everyone",
}

const validator = {
set(obj, prop, value) {
if (prop === "message2") {
return value !== "no one"
}
obj[prop] = value

return true
},
}

const proxy1 = new Proxy(greeting, {})
proxy1.message2 = "everybody"

const proxy2 = new Proxy(greeting, validator)
proxy2.message2 = "no one"

greeting.message1 = "welcome"

console.log(greeting)
console.log(proxy1)
console.log(proxy2)
// 3x {
// message1: "welcome",
// message2: "everybody"
// }
- - + + \ No newline at end of file diff --git a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html index e9dafe6ed..ea770133e 100644 --- a/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html +++ b/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Proxy umożliwia ustanowienie pełnomocnictwa dla danego obiektu.

Oznacza to, że poprzez new Proxy(greeting, {}), tworzymy nowy obiekt proxy {}, który będzie zachowywał się tak jak obiekt greeting.

Wszystkie operacje na takim obiekcie w tym np. modyfikacje własności message2, będą miały odzwierciedlenie w oryginalnym obiekcie, czyli zmiany zajdą zarówno w obiekcie proxy1 jak i greeting.

Na tym etapie proxy przypomina stworzenie aliasu obiektu np. poprzez proxy1 = greeting.

Mamy więc przypisanie przez referencję i modyfikowanie obiektu proxy1 jest tożsame z modyfikowaniem obiektu greeting.

Proxy umożliwia jednak dodanie dodatkowej logiki, która zostanie wykonana w imieniu oryginalnego obiektu.

Możemy w ten sposób dodać np. walidację setter'ów, przez co przed modyfikacją oryginalnego obiektu, obiekt proxy najpierw wykona własny kod i dopiero w nim zdecyduje czy dana modyfikacja może zostać wykonana.

Tworząc obiekt validator i ustawiając go jako proxy dla obiektu greeting poprzez new Proxy(greeting, validator), blokujemy możliwość ustawienia własności message2 na wartość no one.

proxy2.message2 = "no one" staje się więc niedozwolone i nie zmodyfikuje ani obiektu proxy ani obiektu oryginalnego.

Jeśli aktywujemy tryb ścisły, to ze względu na taką niedozwoloną akcję, wyrzucony zostanie błąd 'set' on proxy: trap returned falsish for property 'message2'.

- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html index bda4f3e89..5292eb568 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #015

🪲 Znajdź buga

const price = 25.65
const shipping = 4.15
const total = price + shipping

console.log(total)

Załóżmy, że piszemy oprogramowanie dla sklepu internetowego. Obsługujemy ceny produktów oraz koszty wysyłki i chcemy je zaprezentować klientom w postaci zsumowanego kosztu zakupu.

Jaka cena zostanie zalogowana do konsoli jako total?

🧪 Rozwiązanie

const price = 2565
const shipping = 415
const total = (price + shipping) / 100

console.log(total)

Poprawny wynik dodawania z 25.65 i 4.15 wynosi 29.80. Jednak total zwraca liczbę 29.799999999999997.

Dzieje się tak, ponieważ komputerowe operacje matematyczne na liczbach zmiennoprzecinkowych mają ograniczoną precyzję ze względu na przetwarzanie ich w formie binarnej.

W JavaScript typem danych, który obsługuje zarówno liczby całkowite jak i zmiennoprzecinkowe jest typ Number.

Jest on zaimplementowany jako 64 bitowy format double-precision floating-point (znanego też jako float64).

Rozwiązaniem problemu może być użycie metody zaokrąglającej wynik Number.prototype.toFixed(). Nie jest to jednak rozwiązanie idealne i w przypadku wielu operacji matematycznych, końcowy wynik może być podany błędnie.

W przypadku operacji walutowych sugerowanym rozwiązaniem jest przetwarzanie wszystkich kwot w ujęciu najniższego nominału.

100 zł to 10 000 groszy
$100 to 10 000 centów

Operacje na liczbach całkowitych nie są obarczone problemami zmiennoprzecinkowych zaokrągleń, a chcąc zaprezentować ostateczną kwotę wystarczy podzielić ją przez 100.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html index 278988178..e4d99be65 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const price = 25.65
const shipping = 4.15
const total = price + shipping

console.log(total)
- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html index ec40c8250..12d6137cd 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Załóżmy, że piszemy oprogramowanie dla sklepu internetowego. Obsługujemy ceny produktów oraz koszty wysyłki i chcemy je zaprezentować klientom w postaci zsumowanego kosztu zakupu.

Jaka cena zostanie zalogowana do konsoli jako total?

- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html index 7efb92f74..c0d06c2b6 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html index 428131750..a741b525c 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const price = 2565
const shipping = 415
const total = (price + shipping) / 100

console.log(total)
- - + + \ No newline at end of file diff --git a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html index 1c8371b8b..05d9a47a1 100644 --- a/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html +++ b/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Poprawny wynik dodawania z 25.65 i 4.15 wynosi 29.80. Jednak total zwraca liczbę 29.799999999999997.

Dzieje się tak, ponieważ komputerowe operacje matematyczne na liczbach zmiennoprzecinkowych mają ograniczoną precyzję ze względu na przetwarzanie ich w formie binarnej.

W JavaScript typem danych, który obsługuje zarówno liczby całkowite jak i zmiennoprzecinkowe jest typ Number.

Jest on zaimplementowany jako 64 bitowy format double-precision floating-point (znanego też jako float64).

Rozwiązaniem problemu może być użycie metody zaokrąglającej wynik Number.prototype.toFixed(). Nie jest to jednak rozwiązanie idealne i w przypadku wielu operacji matematycznych, końcowy wynik może być podany błędnie.

W przypadku operacji walutowych sugerowanym rozwiązaniem jest przetwarzanie wszystkich kwot w ujęciu najniższego nominału.

100 zł to 10 000 groszy
$100 to 10 000 centów

Operacje na liczbach całkowitych nie są obarczone problemami zmiennoprzecinkowych zaokrągleń, a chcąc zaprezentować ostateczną kwotę wystarczy podzielić ją przez 100.

- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html index ba2873d4b..33c9a05c7 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #044

🪲 Znajdź buga

const dictionary = new Map()
dictionary.car = "samochód"
dictionary.dog = "pies"

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))

Chcemy skorzystać z obiektu Map do stworzenia prostego słownika.

Jakie odpowiedzi z wywołania metod zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const dictionary = new Map()
dictionary.set("car", "samochód")
dictionary.set("dog", "pies")

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))

W przykładzie z błędem wywołanie metody get() zwróci undefined, a wywołanie metody has() zwróci false.

Obiekt mapy definiuje metody, które umożliwiają interakcje z elementami mapy, ale tylko wtedy gdy elementy zostaną uprzednio wprowadzone w poprawny sposób.

Dodając własności do obiektu w sposób tradycyjny, możemy je wyciągnąć również jedynie tradycyjną metodą tj. wywołując np. dictionary.car.

Aby korzystać z mapy w sposób zgodny z przeznaczeniem, musimy dodawać nowe elementy za pomocą metody set().

Możemy też zdefiniować początkowe elementy przekazując je do konstruktora tworzącego nową mapę:

new Map([
["item1", "value2"],
["item2", "value2"],
])

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html index f73eae85a..5809f4dad 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const dictionary = new Map()
dictionary.car = "samochód"
dictionary.dog = "pies"

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html index ea466759e..c81371294 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy skorzystać z obiektu Map do stworzenia prostego słownika.

Jakie odpowiedzi z wywołania metod zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html index dda352801..7e556aecc 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html index 1808df322..0f76add75 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const dictionary = new Map()
dictionary.set("car", "samochód")
dictionary.set("dog", "pies")

console.log(dictionary.get("car"))
console.log(dictionary.has("dog"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html index c9da218bd..f94347e2d 100644 --- a/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html +++ b/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem wywołanie metody get() zwróci undefined, a wywołanie metody has() zwróci false.

Obiekt mapy definiuje metody, które umożliwiają interakcje z elementami mapy, ale tylko wtedy gdy elementy zostaną uprzednio wprowadzone w poprawny sposób.

Dodając własności do obiektu w sposób tradycyjny, możemy je wyciągnąć również jedynie tradycyjną metodą tj. wywołując np. dictionary.car.

Aby korzystać z mapy w sposób zgodny z przeznaczeniem, musimy dodawać nowe elementy za pomocą metody set().

Możemy też zdefiniować początkowe elementy przekazując je do konstruktora tworzącego nową mapę:

new Map([
["item1", "value2"],
["item2", "value2"],
])
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html index 7fb255c58..952443969 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #085

🪲 Znajdź buga

console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)

Pierwsze cztery przykłady zalogują ciągi znaków w ten sam sposób:

foo
bar
baz

Niespodzianką może być ostatni, piąty przykład, który zwróci:

foo \nbar \nbaz

String.raw() zwraca literał szablonu w oryginalnej formie, bez respektowania wstecznego ukośnika jako znaku ucieczki np. dla przejść do nowej linii poprzez \n.

String.raw() respektuje jednak zagnieżdżanie literałów szablonu za pomocą ${}, wykonując je już z uwzględnieniem znaków ucieczki, stąd też przykład z czwartej linii działa tak samo jak przykład z linii trzeciej.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html index f9699fcdb..be6ac1432 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html index e6a3d8226..16dacf737 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html index 92ad08df7..7056cea3f 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html index 456340a71..562515d8e 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log("foo \nbar\nbaz")
console.log('foo \nbar\nbaz')
console.log(`foo \nbar\nbaz`)
console.log(String.raw`foo ${`\nbar\nbaz`}`)
console.log(String.raw`foo \nbar \nbaz`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html index 7f1a3d734..bc8b55394 100644 --- a/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html +++ b/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Pierwsze cztery przykłady zalogują ciągi znaków w ten sam sposób:

foo
bar
baz

Niespodzianką może być ostatni, piąty przykład, który zwróci:

foo \nbar \nbaz

String.raw() zwraca literał szablonu w oryginalnej formie, bez respektowania wstecznego ukośnika jako znaku ucieczki np. dla przejść do nowej linii poprzez \n.

String.raw() respektuje jednak zagnieżdżanie literałów szablonu za pomocą ${}, wykonując je już z uwzględnieniem znaków ucieczki, stąd też przykład z czwartej linii działa tak samo jak przykład z linii trzeciej.

- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html index 954ba7432..cb0557b75 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #058

🪲 Znajdź buga

console.log(null == 0)
console.log(null > 0)
console.log(null >= 0)

Co zostanie zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

console.log(null == 0) // false
console.log(null > 0) // false
console.log(null >= 0) // true

Polegając na dedukcji w języku JavaScript, można wpaść w pułapkę.

Logicznym wydaje się, że jeśli null nie jest równy 0 i nie jest też większy > od 0, to nie powinien być większy lub równy 0, a jednak jest.

Powodem jest niespójność działania algorytmów porównania.

Algorytm porównania ==, jeśli napotka na operand null lub undefined to aby zwrócić prawdę z takiego porównania, wymaga aby drugi operand również był null albo undefined.

null może być równy tylko wartości null. Ten sam algorytm porównania == wprowadza jednak konwersję innych typów danych np. wartości logicznych true i false, sprowadzając je do wartości liczbowych 1 i 0.

Algorytm stojący za porównaniem większy niż > działa inaczej.

Najpierw podmienia on miejscami operandy i stosuje algorytm porównanie mniejszy niż < (co nie ma tutaj żadnego znaczenia).

Później natomiast, UWAGA, konwertuje wartości logiczne true/false na 1/0, ale TAKŻE wartość null na 0.

Wartość undefined konwertuje natomiast na NaN.

Operator większy lub równy >= robi z null to samo, więc finalnie wyrażenie zostaje zamienione na 0 >= 0, co staje się prawdą.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html index f8536fd45..e24210383 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(null == 0)
console.log(null > 0)
console.log(null >= 0)
- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html index bc53f35ec..a1b8bdcea 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli w powyższym przykładzie?

- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html index 158bafe4b..1fbb5f4bc 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html index 34f9b1e8d..fc43d44f8 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(null == 0) // false
console.log(null > 0) // false
console.log(null >= 0) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html index 696b16824..53bac2f34 100644 --- a/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html +++ b/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Polegając na dedukcji w języku JavaScript, można wpaść w pułapkę.

Logicznym wydaje się, że jeśli null nie jest równy 0 i nie jest też większy > od 0, to nie powinien być większy lub równy 0, a jednak jest.

Powodem jest niespójność działania algorytmów porównania.

Algorytm porównania ==, jeśli napotka na operand null lub undefined to aby zwrócić prawdę z takiego porównania, wymaga aby drugi operand również był null albo undefined.

null może być równy tylko wartości null. Ten sam algorytm porównania == wprowadza jednak konwersję innych typów danych np. wartości logicznych true i false, sprowadzając je do wartości liczbowych 1 i 0.

Algorytm stojący za porównaniem większy niż > działa inaczej.

Najpierw podmienia on miejscami operandy i stosuje algorytm porównanie mniejszy niż < (co nie ma tutaj żadnego znaczenia).

Później natomiast, UWAGA, konwertuje wartości logiczne true/false na 1/0, ale TAKŻE wartość null na 0.

Wartość undefined konwertuje natomiast na NaN.

Operator większy lub równy >= robi z null to samo, więc finalnie wyrażenie zostaje zamienione na 0 >= 0, co staje się prawdą.

- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html index e5012d731..acaf5f996 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #052

🪲 Znajdź buga

let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a)
console.log(x)

console.log("foo", "bar")
console.log(("foo", "bar"))

Co zostanie zalogowane do konsoli w poszczególnych przykładach?

🧪 Rozwiązanie

let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a) // 1
console.log(x) // 2

console.log("foo", "bar") // foo bar
console.log(("foo", "bar")) // bar

Operator przecinka (,) wykonuje operandy w kolejności od lewej do prawej, a następnie zwraca wartość ostatniego z nich.

Operator , ma najniższe pierwszeństwo wykonywania z wszystkich operatorów, niższe niż operator przypisania =.

Mylące może być występowanie przecinka również w innych, bardziej popularnych rolach jak np. rozdzielanie elementów w tablicy, własności w obiektach, parametrów i argumentów w funkcjach, liście deklaracji zmiennych, importach czy eksportach.

Przykładowo, a = b = 1, c = 2, wykona operacje przypisania 1 do zmiennej b oraz wartości z b do zmiennej a. Wykonane zostanie też przypisanie 2 do zmiennej c, ale już jako osobna operacja. Zwrócona z niej wartość 2 nie bierze udziału w przypisywaniu wartości do a.

Konsola logując wartość zmiennej a zwróci więc 1.

W przykładzie x = (y = 1, z = 2), pierwsze w kolejności wykonane zostaną wyrażenia w nawiasie. Najpierw dwie operacje przypisania, 1 do zmiennej y oraz 2 do zmiennej z, następnie zadziała operator przecinka, który zwróci wartość ostatniej z tych operacji, czyli 2

Finalnie wartość zmiennej x zostanie zalogowana jako 2.

Inny przykład, log("foo", "bar"), to wywołanie metody z przekazaniem dwóch argumentów. Metoda loguje do konsoli oba argumenty.

Gdy jednak argumenty zgrupujemy umieszczając je w nawiasie log(("foo", "bar")), to operator , zwróci ostatnią z wartości czyli bar i tylko ta wartość będzie argumentem dla metody log.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html index 798f5d02b..79e666f17 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a)
console.log(x)

console.log("foo", "bar")
console.log(("foo", "bar"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html index bb6c57f40..0a209a6c4 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli w poszczególnych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html index 1ba1df11d..81a0d6622 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html index 1f6e7c1da..f03ae25dc 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
let a, b, c
let x, y, z

a = b = 1, c = 2
x = (y = 1, z = 2)

console.log(a) // 1
console.log(x) // 2

console.log("foo", "bar") // foo bar
console.log(("foo", "bar")) // bar
- - + + \ No newline at end of file diff --git a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html index 15b768285..6faf78d2f 100644 --- a/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html +++ b/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Operator przecinka (,) wykonuje operandy w kolejności od lewej do prawej, a następnie zwraca wartość ostatniego z nich.

Operator , ma najniższe pierwszeństwo wykonywania z wszystkich operatorów, niższe niż operator przypisania =.

Mylące może być występowanie przecinka również w innych, bardziej popularnych rolach jak np. rozdzielanie elementów w tablicy, własności w obiektach, parametrów i argumentów w funkcjach, liście deklaracji zmiennych, importach czy eksportach.

Przykładowo, a = b = 1, c = 2, wykona operacje przypisania 1 do zmiennej b oraz wartości z b do zmiennej a. Wykonane zostanie też przypisanie 2 do zmiennej c, ale już jako osobna operacja. Zwrócona z niej wartość 2 nie bierze udziału w przypisywaniu wartości do a.

Konsola logując wartość zmiennej a zwróci więc 1.

W przykładzie x = (y = 1, z = 2), pierwsze w kolejności wykonane zostaną wyrażenia w nawiasie. Najpierw dwie operacje przypisania, 1 do zmiennej y oraz 2 do zmiennej z, następnie zadziała operator przecinka, który zwróci wartość ostatniej z tych operacji, czyli 2

Finalnie wartość zmiennej x zostanie zalogowana jako 2.

Inny przykład, log("foo", "bar"), to wywołanie metody z przekazaniem dwóch argumentów. Metoda loguje do konsoli oba argumenty.

Gdy jednak argumenty zgrupujemy umieszczając je w nawiasie log(("foo", "bar")), to operator , zwróci ostatnią z wartości czyli bar i tylko ta wartość będzie argumentem dla metody log.

- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html index 8538adc2f..50e0fa28e 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #074

🪲 Znajdź buga

console.log([1, 2, 3] + [4, 5, 6])

Chcemy połączyć (dodać) ze sobą kilka tablic.

Czy powyższy kod spełni to zadanie?\ Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log([...[1, 2, 3], ...[4, 5, 6]])
// "1,2,34,5,6"

Przykład błędnego kodu nie jest wymyślony przeze mnie. Znalazłem go w kursie JavaScript, który mianował się tytułem "Prawdopodobnie najlepszy darmowy kurs JavaScript".

W sekcji dodawania elementów do tablicy, użycie operatora + było zaproponowane przez autora, jako metoda dodawania do tablicy nowych elementów, lub łączenia ze sobą tablic.

+ jest przeładowanym operatorem dodawania, tzn. ma więcej niż jedną funkcjonalność, która zależy od typów danych, które zostaną podstawione jako operandy.

+ może matematycznie dodawać wartości liczbowe, ale może też łączyć ze sobą ciągi znaków.

W przypadku próby dodania do siebie dwóch tablic, w pierwszej kolejności algorytm operatora + wymusi konwersję tablic do ciągów znaków poprzez wywołanie metody toString().

[1, 2, 3].toString() zwróci ciąg znaków "1,2,3".

Analogicznie dla drugiej tablicy będzie to "4,5,6".

Połączenie tych dwóch ciągów znaków da nam więc ciąg znaków "1,2,34,5,6".

Nie uda się nam odwrócić tej operacji np. poprzez "1,2,34,5,6".split(","), bo nowa tablica otrzyma wtedy zlepiony element "34". Tracimy też informację o oryginalnym typie danych.

Aby połączyć, lub w sposób nienaruszający oryginalną tablicę (push(), patrzę na Ciebie), dodać nowe elementy, najwygodniej będzie użyć operatora rozkładu (spread), rozkładając tablicę wewnątrz nowej tablicy [...[1, 2, 3]].

W ten sposób możemy łączyć dowolną ilość tablic i dodawać do nich dowolną ilość nowych elementów.

Innym sposobem może być użycie np. Array.prototype.concat().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html index b3800f2ff..dcb282c1b 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log([1, 2, 3] + [4, 5, 6])
- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html index abd6d6b07..e89274f52 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy połączyć (dodać) ze sobą kilka tablic.

Czy powyższy kod spełni to zadanie?\ Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html index cc421bc2a..fe63e9e98 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html index 65399faf9..15fa5bcbc 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log([...[1, 2, 3], ...[4, 5, 6]])
// "1,2,34,5,6"
- - + + \ No newline at end of file diff --git a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html index cab034bb2..b44e194f9 100644 --- a/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html +++ b/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Przykład błędnego kodu nie jest wymyślony przeze mnie. Znalazłem go w kursie JavaScript, który mianował się tytułem "Prawdopodobnie najlepszy darmowy kurs JavaScript".

W sekcji dodawania elementów do tablicy, użycie operatora + było zaproponowane przez autora, jako metoda dodawania do tablicy nowych elementów, lub łączenia ze sobą tablic.

+ jest przeładowanym operatorem dodawania, tzn. ma więcej niż jedną funkcjonalność, która zależy od typów danych, które zostaną podstawione jako operandy.

+ może matematycznie dodawać wartości liczbowe, ale może też łączyć ze sobą ciągi znaków.

W przypadku próby dodania do siebie dwóch tablic, w pierwszej kolejności algorytm operatora + wymusi konwersję tablic do ciągów znaków poprzez wywołanie metody toString().

[1, 2, 3].toString() zwróci ciąg znaków "1,2,3".

Analogicznie dla drugiej tablicy będzie to "4,5,6".

Połączenie tych dwóch ciągów znaków da nam więc ciąg znaków "1,2,34,5,6".

Nie uda się nam odwrócić tej operacji np. poprzez "1,2,34,5,6".split(","), bo nowa tablica otrzyma wtedy zlepiony element "34". Tracimy też informację o oryginalnym typie danych.

Aby połączyć, lub w sposób nienaruszający oryginalną tablicę (push(), patrzę na Ciebie), dodać nowe elementy, najwygodniej będzie użyć operatora rozkładu (spread), rozkładając tablicę wewnątrz nowej tablicy [...[1, 2, 3]].

W ten sposób możemy łączyć dowolną ilość tablic i dodawać do nich dowolną ilość nowych elementów.

Innym sposobem może być użycie np. Array.prototype.concat().

- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html index 4cfaac953..9e5a57a7f 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #020

🪲 Znajdź buga

console.log(foo())
console.log(bar())

var foo = function () {
return "foo"
}

function bar() {
return "bar"
}

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log(bar())

var foo = function () {
return "foo"
}

console.log(foo())

function bar() {
return "bar"
}

W przykładzie z błędem, w konsoli ujrzymy Error: foo is not a function.

Podciągnięcie (hoisting) ma zastosowanie w obu przypadkach - deklaracji funkcji bar() oraz wyrażenia przypisania anonimowej funkcji do zmiennej foo zadeklarowanej z użyciem var.

Jeśli pozbędziemy się wywołania foo() generującego błąd, wywołanie bar() zadziała prawidłowo.

W przeciwieństwie do pociągania deklaracji funkcji bar(), w przypadku funkcji przypisanej do zmiennej foo podciągnięta zostaje tylko sama deklaracja zmiennej, bez przypisanej do niej wartości.

foo w momencie wywołania ma więc wartość undefined, a undefined funkcją nie jest, tak jak mówi nam treść błędu.

Patrząc na kod, możemy mieć jednak wrażenie, że foo funkcją jest i to treść błędu jest błędna.

Aby poprawić tą sytuację, możemy zamienić słowo kluczowe var na let lub const. Ujrzymy wtedy bardziej jasny komunikat błędu Error: Cannot access 'foo' before initialization.

Niemniej, żeby naprawić działanie kodu, musimy po prostu przenieść wywołanie funkcji za wyrażenie przypisywania funkcji do zmiennej.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html index f508058f7..2d68c3d25 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(foo())
console.log(bar())

var foo = function () {
return "foo"
}

function bar() {
return "bar"
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html index 0a1bc736c..32fddedbc 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html index c51e6ccad..5ee3bbb42 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html index 22ff50a77..7d5d1cb8d 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(bar())

var foo = function () {
return "foo"
}

console.log(foo())

function bar() {
return "bar"
}
- - + + \ No newline at end of file diff --git a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html index fa4400f5b..f38c703fd 100644 --- a/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html +++ b/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, w konsoli ujrzymy Error: foo is not a function.

Podciągnięcie (hoisting) ma zastosowanie w obu przypadkach - deklaracji funkcji bar() oraz wyrażenia przypisania anonimowej funkcji do zmiennej foo zadeklarowanej z użyciem var.

Jeśli pozbędziemy się wywołania foo() generującego błąd, wywołanie bar() zadziała prawidłowo.

W przeciwieństwie do pociągania deklaracji funkcji bar(), w przypadku funkcji przypisanej do zmiennej foo podciągnięta zostaje tylko sama deklaracja zmiennej, bez przypisanej do niej wartości.

foo w momencie wywołania ma więc wartość undefined, a undefined funkcją nie jest, tak jak mówi nam treść błędu.

Patrząc na kod, możemy mieć jednak wrażenie, że foo funkcją jest i to treść błędu jest błędna.

Aby poprawić tą sytuację, możemy zamienić słowo kluczowe var na let lub const. Ujrzymy wtedy bardziej jasny komunikat błędu Error: Cannot access 'foo' before initialization.

Niemniej, żeby naprawić działanie kodu, musimy po prostu przenieść wywołanie funkcji za wyrażenie przypisywania funkcji do zmiennej.

- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html index 250da61b9..6c4da537b 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf.html @@ -6,9 +6,9 @@ Codisity - - - + + +
@@ -18,7 +18,7 @@ 0 + 1 daje 1.

undefined jest już jednak konwertowany do wartości NaN.\ NaN + 1 daje NaN.

Jeśli typy danych nie są prymitywne, to algorytm sprowadza je do takich.

Obiekty (w tym tablice) nie są danymi typu prymitywnego. Dziedziczą z prototypu Object metodę valueOf(), która w pierwszej kolejności jest sprawdzana pod kątem konwersji do typu prymitywnego przez operację dodawania.

valueOf zwraca jednak obiekt, więc wartość jest ignorowana (nie jest prymitywna) i algorytm przechodzi do sprawdzenia drugiej metody toString(), która zwraca ciąg znaków.

Pusta tablica [] nie zostaje więc zamieniona na wartość liczbową 0, a na pusty ciąg znaków, który następnie jest łączony z wartością 1, również skonwertowaną na ciąg znaków.

Podobnie jest z obiektem {}. Jest on konwertowany do ciągu znaków [object Object], a następnie łączony z wartością 1, również skonwertowaną do ciągu znaków.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html index f64559c07..8e98de4a4 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(true + 1)
console.log(false + 1)
console.log(null + 1)
console.log(undefined + 1)
console.log([] + 1)
console.log({} + 1)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html index dd2b63f32..041dd0b56 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli w powyższych przykładach?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html index 7b7fc10e8..9ab7fc85a 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html index c64d3ae62..011e19e13 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(true + 1) // 2
console.log(false + 1) // 1
console.log(null + 1) // 1
console.log(undefined + 1) // NaN
console.log([] + 1) // "1"
console.log({} + 1) // [object Object]1
- - + + \ No newline at end of file diff --git a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html index 14be7ff01..c7fddb76f 100644 --- a/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html +++ b/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.html @@ -6,9 +6,9 @@ Codisity - - - + + +
@@ -17,7 +17,7 @@ 0 + 1 daje 1.

null jest konwertowany do wartości liczbowej 0.\ 0 + 1 daje 1.

undefined jest już jednak konwertowany do wartości NaN.\ NaN + 1 daje NaN.

Jeśli typy danych nie są prymitywne, to algorytm sprowadza je do takich.

Obiekty (w tym tablice) nie są danymi typu prymitywnego. Dziedziczą z prototypu Object metodę valueOf(), która w pierwszej kolejności jest sprawdzana pod kątem konwersji do typu prymitywnego przez operację dodawania.

valueOf zwraca jednak obiekt, więc wartość jest ignorowana (nie jest prymitywna) i algorytm przechodzi do sprawdzenia drugiej metody toString(), która zwraca ciąg znaków.

Pusta tablica [] nie zostaje więc zamieniona na wartość liczbową 0, a na pusty ciąg znaków, który następnie jest łączony z wartością 1, również skonwertowaną na ciąg znaków.

Podobnie jest z obiektem {}. Jest on konwertowany do ciągu znaków [object Object], a następnie łączony z wartością 1, również skonwertowaną do ciągu znaków.

- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html index 24887ec28..0800e4dda 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a.html @@ -6,16 +6,16 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #063

🪲 Znajdź buga

const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size)
console.log(set2.size)
console.log(set3.size)

Jakie wartości zostaną zalogowane dla poszczególnych zbiorów Set?

🧪 Rozwiązanie

const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size) // 3
console.log(set2.size) // 1
console.log(set3.size) // 4

Set w przeciwieństwie do Array to zbiór unikalnych wartości.

Wielkość zbioru set1 będzie wynosiła 3 elementy, mimo że na pierwszy rzut oka elementy wydają się nie być unikalne i zbiór powinien zawierać tylko 1 element.

W przypadku obiektów (w tym tablic) każdy traktowany jest jako unikalny element, bo o unikalności świadczą adresy referencyjne z pamięci RAM.

Gdybyśmy na początku przypisali tablicę do zmiennej np. poprzez \ const table = ["a", "b", "c"], to kilkukrotnie dodając ją poprzez referencję tj. set1.add(table), tablice nie duplikowałyby się w zbiorze i finalnie set1.size zwróciłoby wartość 1.

W set2 metoda join(), łączy elementy z tablic (domyślnie za pomocą przecinka), tym samym tworząc wartości prymitywne typu ciąg znaków.

Wartości prymitywne są porównywane poprzez wartość, a nie referencję, więc finalnie set2.size zwraca 1 jako łączą ilość elementów zbioru.

Aby nieco ułatwić sobie zrozumienie działania unikalności elementów w Set, można posłużyć się operatorem unikalnego porównania.

Jeśli któryś z elementów porównywany z innym elementem za pomocą operatora === zwróci prawdę, to znaczy, że taki element już jest w zbiorze i kolejny nie zostanie dodany.

["a","b","c"] === ["a","b","c"] zwróci false, więc elementy zostają dodawane do zbioru jako unikalne.

Wyjątkiem jest NaN, który jako jedyny w porównaniu z samym sobą zwraca fałsz, ale mimo to Set nie pozwala na umieszczenie więcej niż jednej wartości NaN w zbiorze.

Ostatni przykład set3.size zwraca wielkość zbioru jako 4 elementy, ponieważ bezpośrednie przekazanie ciągu znaków do funkcji konstruktora Set rozbija ciąg znaków na zbiór pojedynczych znaków.

Ciąg znaków można więc zapisać również jako ["t","r","a","l","a","l","a","l","a"].

Widać wtedy wyraźnie, że niektóre znaki się powtarzają, przez co zostają zignorowane i finalnie zbiór składa się jedynie z 4 unikalnych elementów ["t","r","a","l"].

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html index d93ae0fde..e85d3ae5a 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size)
console.log(set2.size)
console.log(set3.size)
- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html index 0bbcd4a43..da9e10a9c 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane dla poszczególnych zbiorów Set?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html index cfa8436d1..1f5ef6123 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html index 300766768..780315e34 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const set1 = new Set()
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])
set1.add(["a", "b", "c"])

const set2 = new Set()
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())
set2.add(["a", "b", "c"].join())

const set3 = new Set("tralalala")

console.log(set1.size) // 3
console.log(set2.size) // 1
console.log(set3.size) // 4
- - + + \ No newline at end of file diff --git a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html index d71ded2c7..618dd52c2 100644 --- a/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html +++ b/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Set w przeciwieństwie do Array to zbiór unikalnych wartości.

Wielkość zbioru set1 będzie wynosiła 3 elementy, mimo że na pierwszy rzut oka elementy wydają się nie być unikalne i zbiór powinien zawierać tylko 1 element.

W przypadku obiektów (w tym tablic) każdy traktowany jest jako unikalny element, bo o unikalności świadczą adresy referencyjne z pamięci RAM.

Gdybyśmy na początku przypisali tablicę do zmiennej np. poprzez \ const table = ["a", "b", "c"], to kilkukrotnie dodając ją poprzez referencję tj. set1.add(table), tablice nie duplikowałyby się w zbiorze i finalnie set1.size zwróciłoby wartość 1.

W set2 metoda join(), łączy elementy z tablic (domyślnie za pomocą przecinka), tym samym tworząc wartości prymitywne typu ciąg znaków.

Wartości prymitywne są porównywane poprzez wartość, a nie referencję, więc finalnie set2.size zwraca 1 jako łączą ilość elementów zbioru.

Aby nieco ułatwić sobie zrozumienie działania unikalności elementów w Set, można posłużyć się operatorem unikalnego porównania.

Jeśli któryś z elementów porównywany z innym elementem za pomocą operatora === zwróci prawdę, to znaczy, że taki element już jest w zbiorze i kolejny nie zostanie dodany.

["a","b","c"] === ["a","b","c"] zwróci false, więc elementy zostają dodawane do zbioru jako unikalne.

Wyjątkiem jest NaN, który jako jedyny w porównaniu z samym sobą zwraca fałsz, ale mimo to Set nie pozwala na umieszczenie więcej niż jednej wartości NaN w zbiorze.

Ostatni przykład set3.size zwraca wielkość zbioru jako 4 elementy, ponieważ bezpośrednie przekazanie ciągu znaków do funkcji konstruktora Set rozbija ciąg znaków na zbiór pojedynczych znaków.

Ciąg znaków można więc zapisać również jako ["t","r","a","l","a","l","a","l","a"].

Widać wtedy wyraźnie, że niektóre znaki się powtarzają, przez co zostają zignorowane i finalnie zbiór składa się jedynie z 4 unikalnych elementów ["t","r","a","l"].

- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html index a109f1787..e11119fff 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #034

🪲 Znajdź buga

console.log(NaN == NaN)
console.log(NaN === NaN)

console.log(Number.NaN == Number.NaN)
console.log(Number.NaN === Number.NaN)

console.log(isNaN(NaN))
console.log(Number.isNaN(NaN))

console.log(isNaN("123"))
console.log(Number.isNaN("123"))

console.log(isNaN("abc"))
console.log(Number.isNaN("abc"))

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123"))
console.log(valueIsNaN("abc"))

console.log(valueIsNaN(NaN))
console.log(valueIsNaN(Number.NaN))

Jakie wartości logiczne zostaną zalogowane do konsoli?

Czy metoda isNaN() działa tak samo jak metoda Number.isNaN()?

Czy funkcja valueIsNaN() spełni zadanie sprawdzania wartości NaN?

🧪 Rozwiązanie

console.log(NaN == NaN) // false
console.log(NaN === NaN) // false

console.log(Number.NaN == Number.NaN) // false
console.log(Number.NaN === Number.NaN) // false

console.log(isNaN(NaN)) // true
console.log(Number.isNaN(NaN)) // true

console.log(isNaN("123")) // false
console.log(Number.isNaN("123")) // false

console.log(isNaN("abc")) // true (!)
console.log(Number.isNaN("abc")) // false

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123")) // false
console.log(valueIsNaN("abc")) // false

console.log(valueIsNaN(NaN)) // true
console.log(valueIsNaN(Number.NaN)) // true

NaN jest wyjątkową wartością w JavaScript. Jako jedyna porównana sama ze sobą zwraca fałsz. Nie ma znaczenia, czy użyjemy ścisłego (===) czy luźnego (==) porównania.

Jedyną opcją na sprawdzenie, czy wartością jest NaN jest użycie dostępnej w globalnym kontekście metody isNaN() lub Number.isNaN.

Alternatywnie, możemy stworzyć własną funkcję, która porówna ścisłą nierówność (!==) przekazanej wartości. Prawda zwrócona zostanie tylko wtedy, gdy jako argument funkcji przekażemy NaN.

Na bardzo mocną uwagę zasługuje isNaN("abc").

"abc" === NaN w żaden sposób nie jest prawdziwe.

"abc" nie jest wartością NaN, dlaczego więc dostajemy z tej metody odpowiedź true?

Bo w JavaScript, metoda isNaN() działa inaczej niż Number.isNaN().

isNaN() zwraca true jeśli argument jest wartością NaN, lub jeśli będzie wartością NaN po jego konwersji na wartość liczbową 🤯.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html index 165ce57d1..6bfc353e6 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(NaN == NaN)
console.log(NaN === NaN)

console.log(Number.NaN == Number.NaN)
console.log(Number.NaN === Number.NaN)

console.log(isNaN(NaN))
console.log(Number.isNaN(NaN))

console.log(isNaN("123"))
console.log(Number.isNaN("123"))

console.log(isNaN("abc"))
console.log(Number.isNaN("abc"))

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123"))
console.log(valueIsNaN("abc"))

console.log(valueIsNaN(NaN))
console.log(valueIsNaN(Number.NaN))
- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html index b2ee21a3a..c9f485ea3 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości logiczne zostaną zalogowane do konsoli?

Czy metoda isNaN() działa tak samo jak metoda Number.isNaN()?

Czy funkcja valueIsNaN() spełni zadanie sprawdzania wartości NaN?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html index fabe2eada..1c754825f 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html index 19046d824..cbcade367 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(NaN == NaN) // false
console.log(NaN === NaN) // false

console.log(Number.NaN == Number.NaN) // false
console.log(Number.NaN === Number.NaN) // false

console.log(isNaN(NaN)) // true
console.log(Number.isNaN(NaN)) // true

console.log(isNaN("123")) // false
console.log(Number.isNaN("123")) // false

console.log(isNaN("abc")) // true (!)
console.log(Number.isNaN("abc")) // false

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123")) // false
console.log(valueIsNaN("abc")) // false

console.log(valueIsNaN(NaN)) // true
console.log(valueIsNaN(Number.NaN)) // true
- - + + \ No newline at end of file diff --git a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html index cb06c2f2e..654ea6da0 100644 --- a/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html +++ b/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

NaN jest wyjątkową wartością w JavaScript. Jako jedyna porównana sama ze sobą zwraca fałsz. Nie ma znaczenia, czy użyjemy ścisłego (===) czy luźnego (==) porównania.

Jedyną opcją na sprawdzenie, czy wartością jest NaN jest użycie dostępnej w globalnym kontekście metody isNaN() lub Number.isNaN.

Alternatywnie, możemy stworzyć własną funkcję, która porówna ścisłą nierówność (!==) przekazanej wartości. Prawda zwrócona zostanie tylko wtedy, gdy jako argument funkcji przekażemy NaN.

Na bardzo mocną uwagę zasługuje isNaN("abc").

"abc" === NaN w żaden sposób nie jest prawdziwe.

"abc" nie jest wartością NaN, dlaczego więc dostajemy z tej metody odpowiedź true?

Bo w JavaScript, metoda isNaN() działa inaczej niż Number.isNaN().

isNaN() zwraca true jeśli argument jest wartością NaN, lub jeśli będzie wartością NaN po jego konwersji na wartość liczbową 🤯.

- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html index 6745e9b02..13d952ee3 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #005

🪲 Znajdź buga

function addToArray(item, array) {
const newArray = array
newArray.push(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })

Chcemy stworzyć funkcję, która doda nowy element do tablicy, a następnie zwróci tą tablicę.

Array.prototype.push() domyślnie zwraca długość tablicy tj. łączną liczbę elementów.

W addToArray() wyraźnie zwracamy więc zaktualizowaną tablicę.

Jakie elementy zostaną zalogowane do konsoli jako fruits i favFruits po użyciu funkcji addToArray()?

🧪 Rozwiązanie

function addToArray(item, array) {
const newArray = array.concat(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })

W przykładzie z błędem okazuje się, że fruits i favFruits zwrócą ten sam zbiór 3 elementów ["apple", "orange", "banana"].

Powodem takiego efektu jest charakter działania metody push(). Mutuje ona tablicę, tj. zmienia jej oryginalną zawartość.

O funkcjach/metodach, które mają tego typu działanie, mówi się, że generują efekty uboczne. Jest to z reguły sytuacja niepożądana.

Dodatkową pułapką w błędnym kodzie, może być też fakt, że deklarujemy nową stałą newArray, komunikując chęć stworzenia kopi tablicy array.

W JavaScript odwoływanie do tablic odbywa się przez referencję, czyli przez adres, pod którym tablica została zapisana w pamięci RAM.

const newArray = array nie tworzy więc kopi tablicy, a jedynie alias (nową nazwę), wskazując na tą samą tablicę z pamięci.

Aby naprawić przykładowy kod, możemy użyć np. metody concat(), która nie generuje efektów ubocznych i zwraca nową tablicę.

Po takiej zamianie, fruits i favFruits zalogują do konsoli właściwe elementy z dwóch różnych tablic.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html index 58e81499f..7c19a656e 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function addToArray(item, array) {
const newArray = array
newArray.push(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html index 58925a762..efd366a28 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Chcemy stworzyć funkcję, która doda nowy element do tablicy, a następnie zwróci tą tablicę.

Array.prototype.push() domyślnie zwraca długość tablicy tj. łączną liczbę elementów.

W addToArray() wyraźnie zwracamy więc zaktualizowaną tablicę.

Jakie elementy zostaną zalogowane do konsoli jako fruits i favFruits po użyciu funkcji addToArray()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html index 4dabfab6c..62a8fca94 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html index 48d1d6126..aff0ed852 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
function addToArray(item, array) {
const newArray = array.concat(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html index fc66e3a35..2a1307a24 100644 --- a/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html +++ b/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem okazuje się, że fruits i favFruits zwrócą ten sam zbiór 3 elementów ["apple", "orange", "banana"].

Powodem takiego efektu jest charakter działania metody push(). Mutuje ona tablicę, tj. zmienia jej oryginalną zawartość.

O funkcjach/metodach, które mają tego typu działanie, mówi się, że generują efekty uboczne. Jest to z reguły sytuacja niepożądana.

Dodatkową pułapką w błędnym kodzie, może być też fakt, że deklarujemy nową stałą newArray, komunikując chęć stworzenia kopi tablicy array.

W JavaScript odwoływanie do tablic odbywa się przez referencję, czyli przez adres, pod którym tablica została zapisana w pamięci RAM.

const newArray = array nie tworzy więc kopi tablicy, a jedynie alias (nową nazwę), wskazując na tą samą tablicę z pamięci.

Aby naprawić przykładowy kod, możemy użyć np. metody concat(), która nie generuje efektów ubocznych i zwraca nową tablicę.

Po takiej zamianie, fruits i favFruits zalogują do konsoli właściwe elementy z dwóch różnych tablic.

- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html index b9063bdb2..6a68bca59 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #002

🪲 Znajdź buga

const now = new Date()
const future = new Date(
now.setHours(now.getHours() + 6)
)

console.log({ now, future })

Jaka data zostanie zalogowana do konsoli dla now, a jaka dla future?

🧪 Rozwiązanie

const now = new Date()
const future = new Date()

future.setHours(now.getHours() + 6)

console.log({ now, future })

W błędnym przykładzie zarówno now jak i future zalogują do konsoli tą samą datę, odległą o 6 godzin w przyszłość.

Metoda setHours() mutuje obiekt daty, na którym zostaje wykonana.

Aby rozwiązać ten problem, dla stałej future musimy utworzyć nowy obiekt daty, który następnie modyfikujemy metodą setHours().

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html index 10547951b..1bd8fb364 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const now = new Date()
const future = new Date(
now.setHours(now.getHours() + 6)
)

console.log({ now, future })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html index d4b309d95..10ca2389c 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jaka data zostanie zalogowana do konsoli dla now, a jaka dla future?

- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html index 9011aa907..3c29346f1 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html index fcaac9d08..89a0a6b3e 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const now = new Date()
const future = new Date()

future.setHours(now.getHours() + 6)

console.log({ now, future })
- - + + \ No newline at end of file diff --git a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html index d1b84df31..9ec05d8e6 100644 --- a/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html +++ b/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W błędnym przykładzie zarówno now jak i future zalogują do konsoli tą samą datę, odległą o 6 godzin w przyszłość.

Metoda setHours() mutuje obiekt daty, na którym zostaje wykonana.

Aby rozwiązać ten problem, dla stałej future musimy utworzyć nowy obiekt daty, który następnie modyfikujemy metodą setHours().

- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html index a60c80b28..5d571c632 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #019

🪲 Znajdź buga

const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive

driveMyCar()

Co zostanie zalogowane do konsoli jako efekt wywołania Car.drive() oraz driveMyCar()?

🧪 Rozwiązanie

const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive.bind(Car)

driveMyCar()

W przykładzie z błędem, Car.drive() zaloguje do konsoli obiekt Car, natomiast driveMyCar() zaloguje globalny obiekt lub undefined w zależności od tego, czy aktywny będzie tryb ścisły (strict mode).

Przypisując do stałej driveMyCar metodę Car.drive, przypisujemy ją w globalnym kontekście.

Wywołanie this będzie więc odnosiło się do globalnego obiektu (Window w przeglądarkach, global w Node.js), lub zwróci undefined jeśli będziemy w trybie ścisłym.

Jeśli chcemy to naprawić, musimy wyraźnie powiązać przypisywaną metodę drive z innym kontekstem, w którym chcemy aby została wykonana. Takie powiązanie uzyskamy korzystając z metody bind().

W naszym przypadku chcemy powiązać tą metodę z obiektem Car.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html index 7c93028fc..2162c83af 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive

driveMyCar()
- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html index 6cb44449a..cc097aa9f 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Co zostanie zalogowane do konsoli jako efekt wywołania Car.drive() oraz driveMyCar()?

- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html index 9cd45df69..e8d5be5d2 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html index f194f17eb..063ab76db 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const Car = {
color: "red",
drive() {
console.log(this)
},
}

Car.drive()

const driveMyCar = Car.drive.bind(Car)

driveMyCar()
- - + + \ No newline at end of file diff --git a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html index e22b3b0d3..773847076 100644 --- a/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html +++ b/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

W przykładzie z błędem, Car.drive() zaloguje do konsoli obiekt Car, natomiast driveMyCar() zaloguje globalny obiekt lub undefined w zależności od tego, czy aktywny będzie tryb ścisły (strict mode).

Przypisując do stałej driveMyCar metodę Car.drive, przypisujemy ją w globalnym kontekście.

Wywołanie this będzie więc odnosiło się do globalnego obiektu (Window w przeglądarkach, global w Node.js), lub zwróci undefined jeśli będziemy w trybie ścisłym.

Jeśli chcemy to naprawić, musimy wyraźnie powiązać przypisywaną metodę drive z innym kontekstem, w którym chcemy aby została wykonana. Takie powiązanie uzyskamy korzystając z metody bind().

W naszym przypadku chcemy powiązać tą metodę z obiektem Car.

- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html index e3de2c85c..0dd885b6b 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #039

🪲 Znajdź buga

console.log(false || true)
console.log(true || false)
console.log("false" || "true")

console.log(undefined || null)
console.log(null || undefined)

console.log(NaN || undefined)
console.log(undefined || NaN)

console.log("" || "not empty")
console.log(" " || "not empty")

console.log(0 || "not zero")
console.log("0" || "not zero")

console.log([] || "not empty array")

console.log(false || " " || alert("!"))

Jakie wartości zostaną zalogowane do konsoli?

Czy funkcja alert() zostanie wywołana?

🧪 Rozwiązanie

console.log(false || true) // true
console.log(true || false) // true
console.log("false" || "true") // "false"

console.log(undefined || null) // null
console.log(null || undefined) // undefined

console.log(NaN || undefined) // undefined
console.log(undefined || NaN) // NaN

console.log("" || "not empty") // "not empty"
console.log(" " || "not empty") // " "

console.log(0 || "not zero") // "not zero"
console.log("0" || "not zero") // "0"

console.log([] || "not empty array") // "[]"

console.log(false || " " || alert("!")) // " "

Operator logiczny LUB || porównuje wartości logiczne. Gdy operandy nie są wartościami logicznymi (true/false), sprowadza je do wartości logicznej. Następnie zwraca pierwszy z nich, jeśli jest on prawdziwy, lub drugi, w każdym innym przypadku.

Konwersja do wartości logicznej odbywa się za pomocą działania algorytmu, który odpowiada za konwersję w funkcji Boolean() lub podczas użycia podwójnego wykrzyknika !!.

Jeśli pierwszy operand po konwersji do wartości logicznej, jest wartością prawdziwą (true), to jest on zwracany w pierwotnej postaci.

Przykładowo, "to nie fałsz" || true zwróci "to nie fałsz"

Warto pamiętać, że występuje tutaj efekt zwarcia tzn. gdy pierwszy operand jest prawdziwy, drugi operand jest już całkowicie pomijany. Gdyby zamiast true pojawiło się np. wywołanie funkcji, to funkcja nie zostałaby w żaden sposób wywołana.

Jeśli natomiast pierwszy operand || jest wartością fałszywą, to automatycznie zwracany zostaje operand drugi. Nie ma znaczenia, czy jest on prawdziwy czy fałszywy.

Można w ten sposób stworzyć np. łańcuch wielu operatorów ||, który zwróci operand w momencie gdy napotka na taki, który jest prawdziwy, jednocześnie zatrzymując wykonywanie dalszej części kodu z łańcucha.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html index 7e233886e..f29dc7e75 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(false || true)
console.log(true || false)
console.log("false" || "true")

console.log(undefined || null)
console.log(null || undefined)

console.log(NaN || undefined)
console.log(undefined || NaN)

console.log("" || "not empty")
console.log(" " || "not empty")

console.log(0 || "not zero")
console.log("0" || "not zero")

console.log([] || "not empty array")

console.log(false || " " || alert("!"))
- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html index 38ff3f215..306866842 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Jakie wartości zostaną zalogowane do konsoli?

Czy funkcja alert() zostanie wywołana?

- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html index 7c3c2646f..827ea70e7 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html index f9bc13f02..9291bbc4e 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
console.log(false || true) // true
console.log(true || false) // true
console.log("false" || "true") // "false"

console.log(undefined || null) // null
console.log(null || undefined) // undefined

console.log(NaN || undefined) // undefined
console.log(undefined || NaN) // NaN

console.log("" || "not empty") // "not empty"
console.log(" " || "not empty") // " "

console.log(0 || "not zero") // "not zero"
console.log("0" || "not zero") // "0"

console.log([] || "not empty array") // "[]"

console.log(false || " " || alert("!")) // " "
- - + + \ No newline at end of file diff --git a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html index 185fa4e57..164f85657 100644 --- a/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html +++ b/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Operator logiczny LUB || porównuje wartości logiczne. Gdy operandy nie są wartościami logicznymi (true/false), sprowadza je do wartości logicznej. Następnie zwraca pierwszy z nich, jeśli jest on prawdziwy, lub drugi, w każdym innym przypadku.

Konwersja do wartości logicznej odbywa się za pomocą działania algorytmu, który odpowiada za konwersję w funkcji Boolean() lub podczas użycia podwójnego wykrzyknika !!.

Jeśli pierwszy operand po konwersji do wartości logicznej, jest wartością prawdziwą (true), to jest on zwracany w pierwotnej postaci.

Przykładowo, "to nie fałsz" || true zwróci "to nie fałsz"

Warto pamiętać, że występuje tutaj efekt zwarcia tzn. gdy pierwszy operand jest prawdziwy, drugi operand jest już całkowicie pomijany. Gdyby zamiast true pojawiło się np. wywołanie funkcji, to funkcja nie zostałaby w żaden sposób wywołana.

Jeśli natomiast pierwszy operand || jest wartością fałszywą, to automatycznie zwracany zostaje operand drugi. Nie ma znaczenia, czy jest on prawdziwy czy fałszywy.

Można w ten sposób stworzyć np. łańcuch wielu operatorów ||, który zwróci operand w momencie gdy napotka na taki, który jest prawdziwy, jednocześnie zatrzymując wykonywanie dalszej części kodu z łańcucha.

- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html index 0fc6f4570..d443fdc1e 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef.html @@ -6,15 +6,15 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Bug #047

🪲 Znajdź buga

const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1:
func1`first ${"val"}, second ${["a", "b"]}`

// 2:
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3:
func2`first ${"val"}, second ${["a", "b"]}`

// 4:
func2(`first ${"val"}, second ${["a", "b"]}`)

Czy potrafisz wskazać, w którym przykładzie (1, 2, 3, 4) zostanie zwrócona wartość first val, second a,b ?

🧪 Rozwiązanie

const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1: ["first ", ", second ", ""]
func1`first ${"val"}, second ${["a", "b"]}`

// 2: first val, second a,b
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3: [Array[3], "val", Array[2]]
func2`first ${"val"}, second ${["a", "b"]}`

// 4: ["first val, second a,b"]
func2(`first ${"val"}, second ${["a", "b"]}`)

first val, second a,b zostanie zwrócone w wywołaniu nr 2.

Przykłady 1 i 3 to wywołania tzw. etykietowanego szablonu (tagged template). Używając grawisów (backtick `) możemy wywoływać funkcje przekazując literał szablonu (template literal) jako argument.

Funkcja ma wtedy do dyspozycji goły tekst jako pierwszy parametr, a pod kolejnymi, dynamicznie generowanymi parametrami, dostępne są ewaluacje notacji ${} przekazane wewnątrz literału szablonu.

W przykładzie 1, w funkcji pod parametrem args mamy dostępną tylko tablicę z gołymi fragmentami tekstu z literału szablonu. Brakuje w niej elementów wywoływanych za pomocą notacji ${}, które dostępne są pod kolejnymi, dynamicznie tworzonymi parametrami funkcji.

Przykład 3 różni się od 1 tylko użyciem parametru reszty dla argumentów funkcji. Tym samym, wszystkie dynamicznie wygenerowane parametry dostępne są w tablicy args.

Pierwszy element tablicy zawiera 3 wartości gołego tekstu, te same, które zostały zalogowane w przykładzie 1.

Kolejne elementy tablicy to wartości wywołane wewnątrz notacji ${}, czyli val oraz tablica z 2 elementami ["a", "b"].

Przykład 2 zwraca nam ciąg znaków przekazany jako argument, już po ewaluacji kodu umieszczonego w notacjach ${}.

Przykład 4 robi to samo co 2, jednak z uwagi na użycie parametru reszty ...args, zwrócona zostaje tablica przekazanych argumentów. Przekazany został tylko 1 argument w postaci literału szablonu, więc tablica zawiera tylko 1 element, ciąg znaków, taki jak ten z przykładu nr 2.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js

- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html index a2763b464..428465347 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1:
func1`first ${"val"}, second ${["a", "b"]}`

// 2:
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3:
func2`first ${"val"}, second ${["a", "b"]}`

// 4:
func2(`first ${"val"}, second ${["a", "b"]}`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html index a497c9587..e349ff500 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

Czy potrafisz wskazać, w którym przykładzie (1, 2, 3, 4) zostanie zwrócona wartość first val, second a,b ?

- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html index ed2be973a..a9bf482fb 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html index 79b2834e2..f4b7ecafe 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości
const func1 = (args) => console.log(args)
const func2 = (...args) => console.log(args)

// 1: ["first ", ", second ", ""]
func1`first ${"val"}, second ${["a", "b"]}`

// 2: first val, second a,b
func1(`first ${"val"}, second ${["a", "b"]}`)

// 3: [Array[3], "val", Array[2]]
func2`first ${"val"}, second ${["a", "b"]}`

// 4: ["first val, second a,b"]
func2(`first ${"val"}, second ${["a", "b"]}`)
- - + + \ No newline at end of file diff --git a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html index 3a97744ff..6f9c2ae06 100644 --- a/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html +++ b/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.html @@ -6,14 +6,14 @@ Codisity - - - + + +
Przejdź do głównej zawartości

first val, second a,b zostanie zwrócone w wywołaniu nr 2.

Przykłady 1 i 3 to wywołania tzw. etykietowanego szablonu (tagged template). Używając grawisów (backtick `) możemy wywoływać funkcje przekazując literał szablonu (template literal) jako argument.

Funkcja ma wtedy do dyspozycji goły tekst jako pierwszy parametr, a pod kolejnymi, dynamicznie generowanymi parametrami, dostępne są ewaluacje notacji ${} przekazane wewnątrz literału szablonu.

W przykładzie 1, w funkcji pod parametrem args mamy dostępną tylko tablicę z gołymi fragmentami tekstu z literału szablonu. Brakuje w niej elementów wywoływanych za pomocą notacji ${}, które dostępne są pod kolejnymi, dynamicznie tworzonymi parametrami funkcji.

Przykład 3 różni się od 1 tylko użyciem parametru reszty dla argumentów funkcji. Tym samym, wszystkie dynamicznie wygenerowane parametry dostępne są w tablicy args.

Pierwszy element tablicy zawiera 3 wartości gołego tekstu, te same, które zostały zalogowane w przykładzie 1.

Kolejne elementy tablicy to wartości wywołane wewnątrz notacji ${}, czyli val oraz tablica z 2 elementami ["a", "b"].

Przykład 2 zwraca nam ciąg znaków przekazany jako argument, już po ewaluacji kodu umieszczonego w notacjach ${}.

Przykład 4 robi to samo co 2, jednak z uwagi na użycie parametru reszty ...args, zwrócona zostaje tablica przekazanych argumentów. Przekazany został tylko 1 argument w postaci literału szablonu, więc tablica zawiera tylko 1 element, ciąg znaków, taki jak ten z przykładu nr 2.

- - + + \ No newline at end of file diff --git a/100-bugow-js/sukces.html b/100-bugow-js/sukces.html index efbff1c75..4d469fbef 100644 --- a/100-bugow-js/sukces.html +++ b/100-bugow-js/sukces.html @@ -6,14 +6,14 @@ 100 Bugów JS | Codisity - - - + + +
Przejdź do głównej zawartości

Pomyślnie potwierdziłeś zapis 🎉

Pierwszy bug został właśnie wysłany do Twojej skrzynki. Sprawdź go.

Kolejne wiadomości będziesz otrzymywał w odstępach co 24 godziny.

Sprawdź też kanał na YouTube, jeśli nie chcesz przegapić nowych materiałów.

- - + + \ No newline at end of file diff --git a/100-bugow-js/wymagane-potwierdzenie.html b/100-bugow-js/wymagane-potwierdzenie.html index 311778b9e..2c551683c 100644 --- a/100-bugow-js/wymagane-potwierdzenie.html +++ b/100-bugow-js/wymagane-potwierdzenie.html @@ -6,16 +6,16 @@ 100 Bugów JS | Codisity - - - + + +
Przejdź do głównej zawartości

Sprawdź swoją skrzynkę 📩

Aby zacząć otrzymywać wiadomości z bugami,
kliknij w właśnie wysłany do Ciebie link aktywacyjny.

Sprawdź inne foldery w poczcie np. Oferty lub Spam.

Jeśli wiadomość tam trafiła, przenieś ją do głównego folderu,
aby kolejne wiadomości trafiały do Ciebie bez problemu.

- - + + \ No newline at end of file diff --git a/100-bugow-js/wypisanie.html b/100-bugow-js/wypisanie.html index 1a2e574f7..82cb37e47 100644 --- a/100-bugow-js/wypisanie.html +++ b/100-bugow-js/wypisanie.html @@ -6,14 +6,14 @@ 100 Bugów JS | Codisity - - - + + +
Przejdź do głównej zawartości

Zostałeś wypisany

Nie będziesz już otrzymywać wiadomości z seri 100 Bugów JS.

- - + + \ No newline at end of file diff --git a/404.html b/404.html index 3b3a178f3..9a821b800 100644 --- a/404.html +++ b/404.html @@ -6,14 +6,14 @@ Strona nie została znaleziona | Codisity - - - + + +
Przejdź do głównej zawartości

Strona nie została znaleziona

Nie mogliśmy znaleźć strony której szukasz.

Proszę skontaktuj się z właścielem strony, z której link doprowadził Cię tutaj i poinformuj go, że link jest nieprawidłowy.

- - + + \ No newline at end of file diff --git a/assets/css/styles.62701d21.css b/assets/css/styles.62701d21.css deleted file mode 100644 index 676b9e9eb..000000000 --- a/assets/css/styles.62701d21.css +++ /dev/null @@ -1 +0,0 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.button,.dropdown__link,.sr-only,.text--truncate,.whitespace-nowrap{white-space:nowrap}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.algolia-autocomplete .ds-dropdown-menu *,.searchbox,.searchbox__input{box-sizing:border-box}.searchbox__reset:focus,.searchbox__submit:focus,body:not(.navigation-with-keyboard) :not(input):focus{outline:0}pre,table{overflow:auto}.markdown li,body{word-wrap:break-word}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#533fee;--ifm-color-primary-dark:#3a23ec;--ifm-color-primary-darker:#2e16ea;--ifm-color-primary-darkest:#2511c2;--ifm-color-primary-light:#6c5bf0;--ifm-color-primary-lighter:#7868f2;--ifm-color-primary-lightest:#9d92f5;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--navbar-bg-color:#ffffffbf;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.items-center,.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size);margin-bottom:2rem}h2{font-size:var(--ifm-h2-font-size);margin-bottom:1.5rem}h3{font-size:var(--ifm-h3-font-size);margin-bottom:1rem}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol,ol ul,ul ol,ul ul{margin:0}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.capitalize,.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.cardContainer_S8oU :last-child,.collapsibleContent_i85q>:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child),.mt-1{margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.navbar__items--center .navbar__brand,body{margin:0}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.flex,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.inline-flex,.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#9d92f5;--ifm-color-primary-dark:#7d6ef2;--ifm-color-primary-darker:#6d5cf0;--ifm-color-primary-darkest:#3c27eb;--ifm-color-primary-light:#bdb6f8;--ifm-color-primary-lighter:#cdc8fa;--ifm-color-primary-lightest:#fefdff;--docusaurus-highlighted-code-line-bg:#0000004d;--navbar-bg-color:#333333bf}h1:not(:first-child){margin-top:4rem}.docusaurus-mt-lg,h2:not(:first-child){margin-top:3rem}h3:not(:first-child){margin-top:2rem}body{font-size:1.125rem;line-height:1.75rem}body,button,fieldset,input,textarea{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}button,fieldset,input,textarea{border-style:none;font-size:1rem;line-height:1.5rem}.max-w-prose,article p{max-width:65ch}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.static{position:static}.mx-auto{margin-left:auto;margin-right:auto}.my-16{margin-bottom:4rem;margin-top:4rem}.mb-12{margin-bottom:3rem}.block,.tocCollapsibleContent_vkbj a{display:block}.table{display:table}.min-h-\[75vh\]{min-height:75vh}.min-w-\[360px\]{min-width:360px}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-col{flex-direction:column}.justify-center,.mdxPageWrapper_j9I6{justify-content:center}.gap-2{gap:.5rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border-2{border-width:2px}.border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-hero-pattern{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='60' height='60' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z' fill='%237e22ce' fill-opacity='.05' fill-rule='evenodd'/%3E%3C/svg%3E")}.from-indigo-500{--tw-gradient-from:#6366f1 var(--tw-gradient-from-position);--tw-gradient-to:#6366f100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-indigo-700{--tw-gradient-to:#4338ca var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-2{padding:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-4{padding-bottom:1rem;padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-justify{text-align:justify}.text-5xl{font-size:3rem;line-height:1}.footer__copyright,.navbar__inner,.text-base,.theme-doc-sidebar-menu,.theme-edit-this-page{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem}.text-lg,.text-xl{line-height:1.75rem}.text-xl{font-size:1.25rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.tracking-tight{letter-spacing:-.025em}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-transparent{color:#0000}.hover\:text-white:hover,.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-300{transition-duration:.3s}.navbar__item:not(.dropdown){overflow:hidden;text-overflow:clip;white-space:nowrap}.navbar__logo{margin:0}.navbar-codisity-logo{margin-left:.5rem;width:6rem}.navbar-codisity-logo:hover,.navbar-youtube-logo:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.navbar-youtube-logo{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYzIiBoZWlnaHQ9IjM2LjM4OSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTE4OS40NiA3MTcuNjA1Yy0xMy45NyA1Mi4yNjYtNTUuMTMgOTMuNDM0LTEwNy40IDEwNy40MDMtOTQuNzQ0IDI1LjM4Ny00NzQuNjM4IDI1LjM4Ny00NzQuNjM4IDI1LjM4N3MtMzc5Ljg5MSAwLTQ3NC42MzMtMjUuMzg3Yy01Mi4yNjYtMTMuOTY5LTkzLjQzMy01NS4xMzctMTA3LjQwMi0xMDcuNDAzQzAgNjIyLjg2MyAwIDQyNS4xOTkgMCA0MjUuMTk5czAtMTk3LjY3MiAyNS4zODctMjkyLjQxQzM5LjM1NSA4MC41MjcgODAuNTIzIDM5LjM1NiAxMzIuNzg5IDI1LjM5MSAyMjcuNTMxLS4wMDQgNjA3LjQyMi0uMDA0IDYwNy40MjItLjAwNHMzNzkuODk0IDAgNDc0LjYzOCAyNS4zOTVjNTIuMjcgMTMuOTY1IDkzLjQzIDU1LjEzNiAxMDcuNCAxMDcuMzk4IDI1LjM5IDk0LjczOCAyNS4zOSAyOTIuNDEgMjUuMzkgMjkyLjQxczAgMTk3LjY2NC0yNS4zOSAyOTIuNDA2IiBzdHlsZT0iZmlsbDojZWQxZDI0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiB0cmFuc2Zvcm09Im1hdHJpeCguMDQyOCAwIDAgLS4wNDI4IDAgMzYuMzg5KSIvPjxwYXRoIGQ9Im00ODUuOTM4IDI0Mi45NjkgMzE1LjYxNyAxODIuMjI2LTMxNS42MTcgMTgyLjIzMVoiIHN0eWxlPSJmaWxsOiNmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIHRyYW5zZm9ybT0ibWF0cml4KC4wNDI4IDAgMCAtLjA0MjggMCAzNi4zODkpIi8+PHBhdGggZD0iTTE4OTguMDEgMTYwLjE2NGM2LjY1IDE3LjM2MyA5Ljk5IDQ1Ljc0MiA5Ljk5IDg1LjEyNXYxNjUuOTQ1YzAgMzguMjIzLTMuMzQgNjYuMTYxLTkuOTkgODMuODMyLTYuNjYgMTcuNjYxLTE4LjM5IDI2LjUtMzUuMTggMjYuNS0xNi4yMiAwLTI3LjY3LTguODM5LTM0LjMyLTI2LjUtNi42Ni0xNy42NzEtOS45OS00NS42MDktOS45OS04My44MzJWMjQ1LjI4OWMwLTM5LjM4MyAzLjE4LTY3Ljc2MiA5LjU2LTg1LjEyNSA2LjM2LTE3LjM4MyAxNy45NC0yNi4wNjIgMzQuNzUtMjYuMDYyIDE2Ljc5IDAgMjguNTIgOC42NzkgMzUuMTggMjYuMDYyem0tMTM0LjY1LTgzLjQwNmMtMjQuMDUgMTYuMTk5LTQxLjE0IDQxLjQwMi01MS4yNiA3NS41ODYtMTAuMTQgMzQuMTYtMTUuMiA3OS42MjktMTUuMiAxMzYuMzl2NzcuMzIxYzAgNTcuMzM2IDUuNzggMTAzLjM4NiAxNy4zNyAxMzguMTMzIDExLjU4IDM0Ljc1IDI5LjY3IDYwLjA4MiA1NC4zIDc2LjAxNSAyNC42MSAxNS45MjIgNTYuOSAyMy44OTEgOTYuODcgMjMuODkxIDM5LjM4IDAgNzAuOTQtOC4xMTQgOTQuNjktMjQuMzI0IDIzLjc0LTE2LjIxNSA0MS4xMi00MS41NjMgNTIuMTMtNzYuMDE2IDEwLjk5LTM0LjQ2NSAxNi41LTgwLjM2MyAxNi41LTEzNy42OTl2LTc3LjMyMWMwLTU2Ljc2MS01LjM2LTEwMi4zNzktMTYuMDctMTM2LjgzMi0xMC43Mi0zNC40NjEtMjguMS01OS42Ni01Mi4xMy03NS41NzgtMjQuMDQtMTUuOTI2LTU2LjYxLTIzLjg5NC05Ny43My0yMy44OTQtNDIuMjkgMC03NS40NSA4LjExNy05OS40NyAyNC4zMjhNMzYyMy43NiA1MTEuNjA5Yy02LjA3LTcuNTMxLTEwLjE0LTE5LjgzOS0xMi4xNi0zNi45MTgtMi4wNC0xNy4wODktMy4wMy00My4wMDMtMy4wMy03Ny43NTN2LTM4LjIyN2g4Ny43M3YzOC4yMjdjMCAzNC4xNjQtMS4xNiA2MC4wODItMy40NyA3Ny43NTMtMi4zMiAxNy42NjEtNi41MSAzMC4xMDYtMTIuNTkgMzcuMzUyLTYuMDkgNy4yNDItMTUuNSAxMC44NjMtMjguMjQgMTAuODYzLTEyLjc1IDAtMjIuMTYtMy43NzMtMjguMjQtMTEuMjk3em0tMTUuMTktMjI0LjE0di0yNi45MzRjMC0zNC4xOC45OS01OS44MDUgMy4wMy03Ni44ODMgMi4wMi0xNy4wODkgNi4yMS0yOS41NDMgMTIuNi0zNy4zNjcgNi4zNy03LjgwOCAxNi4yLTExLjcyNiAyOS41NC0xMS43MjYgMTcuOTQgMCAzMC4yNiA2Ljk1MyAzNi45MiAyMC44NTkgNi42NSAxMy44OTggMTAuMjcgMzcuMDYyIDEwLjg1IDY5LjUwNGwxMDMuMzktNi4wODZjLjU4LTQuNjQ4Ljg3LTExLjAxNi44Ny0xOS4xMDkgMC00OS4yMzktMTMuNDYtODYuMDItNDAuNC0xMTAuMzQ0LTI2LjkyLTI0LjMxNy02NS4wMi0zNi40ODUtMTE0LjI0LTM2LjQ4NS01OS4wNyAwLTEwMC40OSAxOC41MjgtMTI0LjIzIDU1LjYwNi0yMy43NiAzNy4wNTEtMzUuNjMgOTQuMzk0LTM1LjYzIDE3Mi4wMTJ2OTIuOTY0YzAgNzkuOTI2IDEyLjMxIDEzOC4yNjYgMzYuOTMgMTc1LjA1OSAyNC42MSAzNi43NzQgNjYuNzUgNTUuMTY0IDEyNi40MSA1NS4xNjQgNDEuMTEgMCA3Mi42OC03LjUzMSA5NC42OS0yMi41ODYgMjItMTUuMDcgMzcuNS0zOC41MjcgNDYuNDgtNzAuMzcxIDguOTgtMzEuODU5IDEzLjQ3LTc1Ljg4MyAxMy40Ny0xMzIuMDU1di05MS4yMjJoLTIwMC42OE0xNDcxLjQyIDI5Ny40NDFsLTEzNi40IDQ5Mi41OThoMTE5LjAybDQ3Ljc4LTIyMy4yNzdjMTIuMTctNTUuMDM1IDIxLjE0LTEwMS45NDYgMjYuOTMtMTQwLjczOWgzLjQ4YzQuMDUgMjcuNzk3IDEzLjAzIDc0LjQxNSAyNi45MyAxMzkuODY4bDQ5LjUyIDIyNC4xNDhoMTE5LjAybC0xMzguMTMtNDkyLjU5OFY2MS4xMjFoLTExOC4xNXYyMzYuMzJNMjQxNS44NiA1OTMuNjc2VjYxLjEyMWgtOTMuODNsLTEwLjQzIDY1LjE1NmgtMi42Yy0yNS40OS00OS4yMjYtNjMuNzItNzMuODM2LTExNC42OC03My44MzYtMzUuMzMgMC02MS4zOSAxMS41Ny03OC4xOSAzNC43NDYtMTYuOCAyMy4xNTMtMjUuMTkgNTkuMzY0LTI1LjE5IDEwOC41OTR2Mzk3Ljg5NWgxMTkuODlWMjAyLjczNGMwLTIzLjc2MSAyLjYxLTQwLjY5NSA3LjgyLTUwLjgyNCA1LjIxLTEwLjE0NCAxMy45LTE1LjIwMyAyNi4wNi0xNS4yMDMgMTAuNDMgMCAyMC40MiAzLjE3NiAyOS45NyA5LjU2MyA5LjU2IDYuMzY3IDE2LjY1IDE0LjQ2IDIxLjI5IDI0LjMxMnY0MjMuMDk0aDExOS44OU0zMDMwLjgyIDU5My42NzZWNjEuMTIxaC05My44M2wtMTAuNDMgNjUuMTU2aC0yLjU5Yy0yNS41MS00OS4yMjYtNjMuNzMtNzMuODM2LTExNC42OS03My44MzYtMzUuMzMgMC02MS4zOSAxMS41Ny03OC4xOSAzNC43NDYtMTYuOCAyMy4xNTMtMjUuMTkgNTkuMzY0LTI1LjE5IDEwOC41OTR2Mzk3Ljg5NWgxMTkuODlWMjAyLjczNGMwLTIzLjc2MSAyLjYtNDAuNjk1IDcuODEtNTAuODI0IDUuMjItMTAuMTQ0IDEzLjkxLTE1LjIwMyAyNi4wNy0xNS4yMDMgMTAuNDMgMCAyMC40MiAzLjE3NiAyOS45NyA5LjU2MyA5LjU2IDYuMzY3IDE2LjY1IDE0LjQ2IDIxLjI5IDI0LjMxMnY0MjMuMDk0aDExOS44OSIgc3R5bGU9ImZpbGw6IzI1MjMyMztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0MjggMCAwIC0uMDQyOCAwIDM2LjM4OSkiLz48cGF0aCBkPSJNMjc0MS42NCA2OTMuNTg2aC0xMTkuMDJWNjEuMTIxaC0xMTcuMjh2NjMyLjQ2NWgtMTE5LjAydjk2LjQzN2gzNTUuMzJ2LTk2LjQzN00zMzE3LjcyIDI5MS4zMTZjMC0zOC44MDgtMS42MS02OS4yMTgtNC43OS05MS4yMTgtMy4xOC0yMi4wMjQtOC41NC0zNy42NTctMTYuMDctNDYuOTE0LTcuNTMtOS4yNy0xNy42OC0xMy44OTktMzAuNC0xMy44OTktOS44NiAwLTE4Ljk4IDIuMzA1LTI3LjM3IDYuOTUzLTguNDEgNC42MjktMTUuMiAxMS41NzUtMjAuNDIgMjAuODUydjMwMi4zMjhjNC4wNSAxNC40NjkgMTEgMjYuMzQ4IDIwLjg1IDM1LjYxNyA5Ljg1IDkuMjU0IDIwLjU1IDEzLjg5OSAzMi4xNCAxMy44OTkgMTIuMTcgMCAyMS41Ny00Ljc4MiAyOC4yNC0xNC4zMzIgNi42NS05LjU1NSAxMS4yOS0yNS42MjkgMTMuOS00OC4yMjMgMi42MS0yMi41ODIgMy45Mi01NC43MjcgMy45Mi05Ni40MjZ6bTEwOS44OSAyMTcuMjMxYy03LjI1IDMzLjU4Mi0xOC45OCA1Ny45MDYtMzUuMTkgNzIuOTc2LTE2LjIyIDE1LjA0Ny0zOC41MiAyMi41ODItNjYuODkgMjIuNTgyLTIyLjAxIDAtNDIuNTctNi4yMy02MS42OC0xOC42NzUtMTkuMTEtMTIuNDU3LTMzLjg5LTI4LjgyMS00NC4zMS00OS4wOWgtLjg4bC4wMSAyODAuNjE3aC0xMTUuNTRWNjEuMTMzaDk5LjAzbDEyLjE3IDUwLjM3OWgyLjZjOS4yNi0xNy45NSAyMy4xNi0zMi4xNCA0MS43LTQyLjU2NyAxOC41My0xMC40MjIgMzkuMS0xNS42MzYgNjEuNjktMTUuNjM2IDQwLjUzIDAgNzAuMzYgMTguNjgzIDg5LjQ4IDU2LjAzNSAxOS4xMSAzNy4zNjMgMjguNjcgOTUuNzAzIDI4LjY3IDE3NS4wNTh2ODQuMjdjMCA1OS42NDgtMy42MyAxMDYuMjczLTEwLjg2IDEzOS44NzUiIHN0eWxlPSJmaWxsOiMyNTIzMjM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIHRyYW5zZm9ybT0ibWF0cml4KC4wNDI4IDAgMCAtLjA0MjggMCAzNi4zODkpIi8+PC9zdmc+);background-position:50%;background-repeat:no-repeat;background-size:contain;color:#0000;width:5rem}:is([data-theme=dark] .navbar-youtube-logo){background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYzIiBoZWlnaHQ9IjM2LjM4OSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTE4OS40NiA3MTcuNjA1Yy0xMy45NyA1Mi4yNjYtNTUuMTMgOTMuNDM0LTEwNy40IDEwNy40MDMtOTQuNzQ0IDI1LjM4Ny00NzQuNjM4IDI1LjM4Ny00NzQuNjM4IDI1LjM4N3MtMzc5Ljg5MSAwLTQ3NC42MzMtMjUuMzg3Yy01Mi4yNjYtMTMuOTY5LTkzLjQzMy01NS4xMzctMTA3LjQwMi0xMDcuNDAzQzAgNjIyLjg2MyAwIDQyNS4xOTkgMCA0MjUuMTk5czAtMTk3LjY3MiAyNS4zODctMjkyLjQxQzM5LjM1NSA4MC41MjcgODAuNTIzIDM5LjM1NiAxMzIuNzg5IDI1LjM5MSAyMjcuNTMxLS4wMDQgNjA3LjQyMi0uMDA0IDYwNy40MjItLjAwNHMzNzkuODk0IDAgNDc0LjYzOCAyNS4zOTVjNTIuMjcgMTMuOTY1IDkzLjQzIDU1LjEzNiAxMDcuNCAxMDcuMzk4IDI1LjM5IDk0LjczOCAyNS4zOSAyOTIuNDEgMjUuMzkgMjkyLjQxczAgMTk3LjY2NC0yNS4zOSAyOTIuNDA2IiBzdHlsZT0iZmlsbDojZWQxZDI0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiB0cmFuc2Zvcm09Im1hdHJpeCguMDQyOCAwIDAgLS4wNDI4IDAgMzYuMzg5KSIvPjxwYXRoIGQ9Im00ODUuOTM4IDI0Mi45NjkgMzE1LjYxNyAxODIuMjI2LTMxNS42MTcgMTgyLjIzMVpNMTg5OC4wMSAxNjAuMTY0YzYuNjUgMTcuMzYzIDkuOTkgNDUuNzQyIDkuOTkgODUuMTI1djE2NS45NDVjMCAzOC4yMjMtMy4zNCA2Ni4xNjEtOS45OSA4My44MzItNi42NiAxNy42NjEtMTguMzkgMjYuNS0zNS4xOCAyNi41LTE2LjIyIDAtMjcuNjctOC44MzktMzQuMzItMjYuNS02LjY2LTE3LjY3MS05Ljk5LTQ1LjYwOS05Ljk5LTgzLjgzMlYyNDUuMjg5YzAtMzkuMzgzIDMuMTgtNjcuNzYyIDkuNTYtODUuMTI1IDYuMzYtMTcuMzgzIDE3Ljk0LTI2LjA2MiAzNC43NS0yNi4wNjIgMTYuNzkgMCAyOC41MiA4LjY3OSAzNS4xOCAyNi4wNjJ6bS0xMzQuNjUtODMuNDA2Yy0yNC4wNSAxNi4xOTktNDEuMTQgNDEuNDAyLTUxLjI2IDc1LjU4Ni0xMC4xNCAzNC4xNi0xNS4yIDc5LjYyOS0xNS4yIDEzNi4zOXY3Ny4zMjFjMCA1Ny4zMzYgNS43OCAxMDMuMzg2IDE3LjM3IDEzOC4xMzMgMTEuNTggMzQuNzUgMjkuNjcgNjAuMDgyIDU0LjMgNzYuMDE1IDI0LjYxIDE1LjkyMiA1Ni45IDIzLjg5MSA5Ni44NyAyMy44OTEgMzkuMzggMCA3MC45NC04LjExNCA5NC42OS0yNC4zMjQgMjMuNzQtMTYuMjE1IDQxLjEyLTQxLjU2MyA1Mi4xMy03Ni4wMTYgMTAuOTktMzQuNDY1IDE2LjUtODAuMzYzIDE2LjUtMTM3LjY5OXYtNzcuMzIxYzAtNTYuNzYxLTUuMzYtMTAyLjM3OS0xNi4wNy0xMzYuODMyLTEwLjcyLTM0LjQ2MS0yOC4xLTU5LjY2LTUyLjEzLTc1LjU3OC0yNC4wNC0xNS45MjYtNTYuNjEtMjMuODk0LTk3LjczLTIzLjg5NC00Mi4yOSAwLTc1LjQ1IDguMTE3LTk5LjQ3IDI0LjMyOE0zNjIzLjc2IDUxMS42MDljLTYuMDctNy41MzEtMTAuMTQtMTkuODM5LTEyLjE2LTM2LjkxOC0yLjA0LTE3LjA4OS0zLjAzLTQzLjAwMy0zLjAzLTc3Ljc1M3YtMzguMjI3aDg3LjczdjM4LjIyN2MwIDM0LjE2NC0xLjE2IDYwLjA4Mi0zLjQ3IDc3Ljc1My0yLjMyIDE3LjY2MS02LjUxIDMwLjEwNi0xMi41OSAzNy4zNTItNi4wOSA3LjI0Mi0xNS41IDEwLjg2My0yOC4yNCAxMC44NjMtMTIuNzUgMC0yMi4xNi0zLjc3My0yOC4yNC0xMS4yOTd6bS0xNS4xOS0yMjQuMTR2LTI2LjkzNGMwLTM0LjE4Ljk5LTU5LjgwNSAzLjAzLTc2Ljg4MyAyLjAyLTE3LjA4OSA2LjIxLTI5LjU0MyAxMi42LTM3LjM2NyA2LjM3LTcuODA4IDE2LjItMTEuNzI2IDI5LjU0LTExLjcyNiAxNy45NCAwIDMwLjI2IDYuOTUzIDM2LjkyIDIwLjg1OSA2LjY1IDEzLjg5OCAxMC4yNyAzNy4wNjIgMTAuODUgNjkuNTA0bDEwMy4zOS02LjA4NmMuNTgtNC42NDguODctMTEuMDE2Ljg3LTE5LjEwOSAwLTQ5LjIzOS0xMy40Ni04Ni4wMi00MC40LTExMC4zNDQtMjYuOTItMjQuMzE3LTY1LjAyLTM2LjQ4NS0xMTQuMjQtMzYuNDg1LTU5LjA3IDAtMTAwLjQ5IDE4LjUyOC0xMjQuMjMgNTUuNjA2LTIzLjc2IDM3LjA1MS0zNS42MyA5NC4zOTQtMzUuNjMgMTcyLjAxMnY5Mi45NjRjMCA3OS45MjYgMTIuMzEgMTM4LjI2NiAzNi45MyAxNzUuMDU5IDI0LjYxIDM2Ljc3NCA2Ni43NSA1NS4xNjQgMTI2LjQxIDU1LjE2NCA0MS4xMSAwIDcyLjY4LTcuNTMxIDk0LjY5LTIyLjU4NiAyMi0xNS4wNyAzNy41LTM4LjUyNyA0Ni40OC03MC4zNzEgOC45OC0zMS44NTkgMTMuNDctNzUuODgzIDEzLjQ3LTEzMi4wNTV2LTkxLjIyMmgtMjAwLjY4TTE0NzEuNDIgMjk3LjQ0MWwtMTM2LjQgNDkyLjU5OGgxMTkuMDJsNDcuNzgtMjIzLjI3N2MxMi4xNy01NS4wMzUgMjEuMTQtMTAxLjk0NiAyNi45My0xNDAuNzM5aDMuNDhjNC4wNSAyNy43OTcgMTMuMDMgNzQuNDE1IDI2LjkzIDEzOS44NjhsNDkuNTIgMjI0LjE0OGgxMTkuMDJsLTEzOC4xMy00OTIuNTk4VjYxLjEyMWgtMTE4LjE1djIzNi4zMk0yNDE1Ljg2IDU5My42NzZWNjEuMTIxaC05My44M2wtMTAuNDMgNjUuMTU2aC0yLjZjLTI1LjQ5LTQ5LjIyNi02My43Mi03My44MzYtMTE0LjY4LTczLjgzNi0zNS4zMyAwLTYxLjM5IDExLjU3LTc4LjE5IDM0Ljc0Ni0xNi44IDIzLjE1My0yNS4xOSA1OS4zNjQtMjUuMTkgMTA4LjU5NHYzOTcuODk1aDExOS44OVYyMDIuNzM0YzAtMjMuNzYxIDIuNjEtNDAuNjk1IDcuODItNTAuODI0IDUuMjEtMTAuMTQ0IDEzLjktMTUuMjAzIDI2LjA2LTE1LjIwMyAxMC40MyAwIDIwLjQyIDMuMTc2IDI5Ljk3IDkuNTYzIDkuNTYgNi4zNjcgMTYuNjUgMTQuNDYgMjEuMjkgMjQuMzEydjQyMy4wOTRoMTE5Ljg5TTMwMzAuODIgNTkzLjY3NlY2MS4xMjFoLTkzLjgzbC0xMC40MyA2NS4xNTZoLTIuNTljLTI1LjUxLTQ5LjIyNi02My43My03My44MzYtMTE0LjY5LTczLjgzNi0zNS4zMyAwLTYxLjM5IDExLjU3LTc4LjE5IDM0Ljc0Ni0xNi44IDIzLjE1My0yNS4xOSA1OS4zNjQtMjUuMTkgMTA4LjU5NHYzOTcuODk1aDExOS44OVYyMDIuNzM0YzAtMjMuNzYxIDIuNi00MC42OTUgNy44MS01MC44MjQgNS4yMi0xMC4xNDQgMTMuOTEtMTUuMjAzIDI2LjA3LTE1LjIwMyAxMC40MyAwIDIwLjQyIDMuMTc2IDI5Ljk3IDkuNTYzIDkuNTYgNi4zNjcgMTYuNjUgMTQuNDYgMjEuMjkgMjQuMzEydjQyMy4wOTRoMTE5Ljg5IiBzdHlsZT0iZmlsbDojZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiB0cmFuc2Zvcm09Im1hdHJpeCguMDQyOCAwIDAgLS4wNDI4IDAgMzYuMzg5KSIvPjxwYXRoIGQ9Ik0yNzQxLjY0IDY5My41ODZoLTExOS4wMlY2MS4xMjFoLTExNy4yOHY2MzIuNDY1aC0xMTkuMDJ2OTYuNDM3aDM1NS4zMnYtOTYuNDM3TTMzMTcuNzIgMjkxLjMxNmMwLTM4LjgwOC0xLjYxLTY5LjIxOC00Ljc5LTkxLjIxOC0zLjE4LTIyLjAyNC04LjU0LTM3LjY1Ny0xNi4wNy00Ni45MTQtNy41My05LjI3LTE3LjY4LTEzLjg5OS0zMC40LTEzLjg5OS05Ljg2IDAtMTguOTggMi4zMDUtMjcuMzcgNi45NTMtOC40MSA0LjYyOS0xNS4yIDExLjU3NS0yMC40MiAyMC44NTJ2MzAyLjMyOGM0LjA1IDE0LjQ2OSAxMSAyNi4zNDggMjAuODUgMzUuNjE3IDkuODUgOS4yNTQgMjAuNTUgMTMuODk5IDMyLjE0IDEzLjg5OSAxMi4xNyAwIDIxLjU3LTQuNzgyIDI4LjI0LTE0LjMzMiA2LjY1LTkuNTU1IDExLjI5LTI1LjYyOSAxMy45LTQ4LjIyMyAyLjYxLTIyLjU4MiAzLjkyLTU0LjcyNyAzLjkyLTk2LjQyNnptMTA5Ljg5IDIxNy4yMzFjLTcuMjUgMzMuNTgyLTE4Ljk4IDU3LjkwNi0zNS4xOSA3Mi45NzYtMTYuMjIgMTUuMDQ3LTM4LjUyIDIyLjU4Mi02Ni44OSAyMi41ODItMjIuMDEgMC00Mi41Ny02LjIzLTYxLjY4LTE4LjY3NS0xOS4xMS0xMi40NTctMzMuODktMjguODIxLTQ0LjMxLTQ5LjA5aC0uODhsLjAxIDI4MC42MTdoLTExNS41NFY2MS4xMzNoOTkuMDNsMTIuMTcgNTAuMzc5aDIuNmM5LjI2LTE3Ljk1IDIzLjE2LTMyLjE0IDQxLjctNDIuNTY3IDE4LjUzLTEwLjQyMiAzOS4xLTE1LjYzNiA2MS42OS0xNS42MzYgNDAuNTMgMCA3MC4zNiAxOC42ODMgODkuNDggNTYuMDM1IDE5LjExIDM3LjM2MyAyOC42NyA5NS43MDMgMjguNjcgMTc1LjA1OHY4NC4yN2MwIDU5LjY0OC0zLjYzIDEwNi4yNzMtMTAuODYgMTM5Ljg3NSIgc3R5bGU9ImZpbGw6I2ZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0MjggMCAwIC0uMDQyOCAwIDM2LjM4OSkiLz48L3N2Zz4=)}.video iframe{aspect-ratio:16/9;width:100%}.placeholder\:text-slate-500::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.hover\:no-underline:hover{text-decoration-line:none}.enabled\:hover\:bg-blue-800:hover:enabled{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.disabled\:opacity-75:disabled{opacity:.75}:is([data-theme=dark] .dark\:text-slate-300){--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.searchbox,.searchbox__input,.tag_Nnez{display:inline-block}.cardContainer_S8oU{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_S8oU:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_HoSo{font-size:1.2rem}.cardDescription_c27F{font-size:.8rem}.tag_Nnez{margin:.5rem .5rem 0 1rem}.algolia-docsearch-suggestion{border-bottom-color:#3a3dd1}.algolia-docsearch-suggestion--category-header{background-color:#4b54de}.algolia-docsearch-suggestion--highlight{color:#3a33d1}.algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background-color:#4d47d5}.aa-cursor .algolia-docsearch-suggestion--content{color:#272296}.aa-cursor .algolia-docsearch-suggestion{background:#ebebfb}.searchbox{height:32px!important;position:relative;visibility:visible!important;white-space:nowrap;width:200px}.searchbox .algolia-autocomplete{display:block;height:100%;width:100%}.searchbox__wrapper{height:100%;position:relative;width:100%;z-index:999}.searchbox__input{-webkit-appearance:none;appearance:none;background:#fff!important;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;font-size:12px;height:100%;padding:0 26px 0 32px;transition:box-shadow .4s,background .4s;vertical-align:middle;white-space:normal;width:100%}.searchbox__reset,.searchbox__submit{font-size:inherit;-webkit-user-select:none;position:absolute}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{background:#fff;box-shadow:inset 0 0 0 1px #aaa;outline:0}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{background-color:#458ee100;border:0;border-radius:16px 0 0 16px;height:100%;left:0;margin:0;padding:0;right:inherit;text-align:center;top:0;user-select:none;vertical-align:middle;width:32px}.searchbox__submit:before{content:"";display:inline-block;height:100%;margin-right:-4px;vertical-align:middle}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion,.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit svg{fill:#6d7e96;height:14px;vertical-align:middle;width:14px}.searchbox__reset{fill:#00000080;background:none;border:0;cursor:pointer;display:block;margin:0;padding:0;right:8px;top:8px;user-select:none}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.searchbox__reset.hide{display:none}.searchbox__reset svg{display:block;height:8px;margin:4px;width:8px}.searchbox__input:valid~.searchbox__reset{animation-duration:.15s;animation-name:a;display:block}@keyframes a{0%{opacity:0;transform:translate3d(-20%,0,0)}to{opacity:1;transform:none}}.algolia-autocomplete .ds-dropdown-menu:before{background:#373940;border-radius:2px;border-right:1px solid #373940;border-top:1px solid #373940;content:"";display:block;height:14px;position:absolute;top:-7px;transform:rotate(-45deg);width:14px;z-index:1000}.algolia-autocomplete .ds-dropdown-menu{box-shadow:0 1px 0 0 #0003,0 2px 3px 0 #0000001a}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{background:#fff;border-radius:4px;overflow:auto;padding:0;position:relative}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;overflow:hidden;padding:0;position:relative;text-decoration:none}.algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--wrapper{background:#f1f1f1;box-shadow:inset -2px 0 0 #61dafb}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{background:#ffe564;padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight{background:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{background:inherit;box-shadow:inset 0 -2px 0 0 #458ee1cc;color:inherit;padding:0 0 1px}.algolia-autocomplete .algolia-docsearch-suggestion--content{cursor:pointer;display:block;float:right;padding:5.33333px 0 5.33333px 10.66667px;position:relative;width:70%}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{background:#ececec;content:"";display:block;height:100%;left:-1px;position:absolute;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{background-color:#373940;color:#fff;display:none;font-size:14px;font-weight:700;letter-spacing:.08em;margin:0;padding:5px 8px;position:relative;text-transform:uppercase}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{background-color:#fff;float:left;padding:8px 0 0;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{word-wrap:break-word;color:#777;display:none;float:left;font-size:.9em;padding:5.33333px 10.66667px;position:relative;text-align:right;width:30%}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{background:#ececec;content:"";display:block;height:100%;position:absolute;right:0;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before,.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--highlight{background-color:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--title{color:#02060c;font-size:.9em;font-weight:700;margin-bottom:4px}.algolia-autocomplete .algolia-docsearch-suggestion--text{color:#63676d;display:block;font-size:.85em;line-height:1.2em;padding-right:2px}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{background-color:#373940;font-size:1.2em;margin-top:-8px;padding:8px 0;text-align:center;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--no-results .algolia-docsearch-suggestion--text{color:#fff;margin-top:4px}.algolia-autocomplete .algolia-docsearch-suggestion code{background-color:#ebebeb;border:none;border-radius:3px;color:#222;font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace;font-size:90%;padding:1px 5px}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header{color:#fff;display:block}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary .algolia-docsearch-suggestion--subcategory-column{display:block}.algolia-autocomplete .algolia-docsearch-footer{background-color:#fff;float:right;font-size:0;height:30px;line-height:0;width:100%;z-index:2000}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 130 18'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='url(%2523a)' d='M59.4.02h13.3a2.37 2.37 0 0 1 2.38 2.37V15.6a2.37 2.37 0 0 1-2.38 2.36H59.4a2.37 2.37 0 0 1-2.38-2.36V2.38A2.37 2.37 0 0 1 59.4.02z'/%3E%3Cpath fill='%2523FFF' d='M66.26 4.56c-2.82 0-5.1 2.27-5.1 5.08 0 2.8 2.28 5.07 5.1 5.07 2.8 0 5.1-2.26 5.1-5.07 0-2.8-2.28-5.07-5.1-5.07zm0 8.65c-2 0-3.6-1.6-3.6-3.56 0-1.97 1.6-3.58 3.6-3.58 1.98 0 3.6 1.6 3.6 3.58a3.58 3.58 0 0 1-3.6 3.57zm0-6.4v2.66c0 .07.08.13.15.1l2.4-1.24c.04-.02.06-.1.03-.14a2.96 2.96 0 0 0-2.46-1.5.1.1 0 0 0-.1.1zm-3.33-1.96-.3-.3a.78.78 0 0 0-1.12 0l-.36.36a.77.77 0 0 0 0 1.1l.3.3c.05.05.13.04.17 0 .2-.25.4-.5.6-.7.23-.23.46-.43.7-.6.07-.04.07-.1.03-.16zm5-.8V3.4a.78.78 0 0 0-.78-.78h-1.83a.78.78 0 0 0-.78.78v.63c0 .07.06.12.14.1a5.74 5.74 0 0 1 1.58-.22c.52 0 1.04.07 1.54.2a.1.1 0 0 0 .13-.1z'/%3E%3Cpath fill='%2523182359' d='M102.16 13.76c0 1.46-.37 2.52-1.12 3.2-.75.67-1.9 1-3.44 1-.56 0-1.74-.1-2.67-.3l.34-1.7c.78.17 1.82.2 2.36.2.86 0 1.48-.16 1.84-.5.37-.36.55-.88.55-1.57v-.35a6.37 6.37 0 0 1-.84.3 4.15 4.15 0 0 1-1.2.17 4.5 4.5 0 0 1-1.6-.28 3.38 3.38 0 0 1-1.26-.82 3.74 3.74 0 0 1-.8-1.35c-.2-.54-.3-1.5-.3-2.2 0-.67.1-1.5.3-2.06a3.92 3.92 0 0 1 .9-1.43 4.12 4.12 0 0 1 1.45-.92 5.3 5.3 0 0 1 1.94-.37c.7 0 1.35.1 1.97.2a15.86 15.86 0 0 1 1.6.33v8.46zm-5.95-4.2c0 .9.2 1.88.6 2.3.4.4.9.62 1.53.62.34 0 .66-.05.96-.15a2.75 2.75 0 0 0 .73-.33V6.7a8.53 8.53 0 0 0-1.42-.17c-.76-.02-1.36.3-1.77.8-.4.5-.62 1.4-.62 2.23zm16.13 0c0 .72-.1 1.26-.32 1.85a4.4 4.4 0 0 1-.9 1.53c-.38.42-.85.75-1.4.98-.54.24-1.4.37-1.8.37-.43 0-1.27-.13-1.8-.36a4.1 4.1 0 0 1-1.4-.97 4.5 4.5 0 0 1-.92-1.52 5.04 5.04 0 0 1-.33-1.84c0-.72.1-1.4.32-2 .22-.6.53-1.1.92-1.5.4-.43.86-.75 1.4-.98a4.55 4.55 0 0 1 1.78-.34 4.7 4.7 0 0 1 1.8.34c.54.23 1 .55 1.4.97.38.42.68.92.9 1.5.23.6.35 1.3.35 2zm-2.2 0c0-.92-.2-1.7-.6-2.22-.38-.54-.94-.8-1.64-.8-.72 0-1.27.26-1.67.8-.4.54-.58 1.3-.58 2.22 0 .93.2 1.56.6 2.1.38.54.94.8 1.64.8s1.25-.26 1.65-.8c.4-.55.6-1.17.6-2.1zm6.97 4.7c-3.5.02-3.5-2.8-3.5-3.27L113.57.92l2.15-.34v10c0 .25 0 1.87 1.37 1.88v1.8zm3.77 0h-2.15v-9.2l2.15-.33v9.54zM119.8 3.74c.7 0 1.3-.58 1.3-1.3 0-.7-.58-1.3-1.3-1.3-.73 0-1.3.6-1.3 1.3 0 .72.58 1.3 1.3 1.3zm6.43 1c.7 0 1.3.1 1.78.27.5.18.88.42 1.17.73.28.3.5.74.6 1.18.13.46.2.95.2 1.5v5.47a25.24 25.24 0 0 1-1.5.25c-.67.1-1.42.15-2.25.15a6.83 6.83 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.37-.27-.9-.27-1.44 0-.52.1-.85.3-1.2.2-.37.48-.67.83-.9a3.6 3.6 0 0 1 1.23-.5 7.07 7.07 0 0 1 2.2-.1l.83.16V8.4c0-.25-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.18-.34-.3-.58-.4a2.54 2.54 0 0 0-.92-.17c-.5 0-.94.06-1.35.13-.4.08-.75.16-1 .25l-.27-1.74c.27-.1.67-.18 1.2-.28a9.34 9.34 0 0 1 1.65-.14zm.18 7.74c.66 0 1.15-.04 1.5-.1V10.2a5.1 5.1 0 0 0-2-.1c-.23.03-.45.1-.64.2a1.17 1.17 0 0 0-.47.38c-.13.17-.18.26-.18.52 0 .5.17.8.5.98.32.2.74.3 1.3.3zM84.1 4.8c.72 0 1.3.08 1.8.26.48.17.87.42 1.15.73.3.3.5.72.6 1.17.14.45.2.94.2 1.47v5.48a25.24 25.24 0 0 1-1.5.26c-.67.1-1.42.14-2.25.14a6.83 6.83 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.38-.27-.9-.27-1.44 0-.53.1-.86.3-1.22.2-.36.5-.65.84-.88a3.6 3.6 0 0 1 1.24-.5 7.07 7.07 0 0 1 2.2-.1c.26.03.54.08.84.15v-.35c0-.24-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.17-.34-.3-.58-.4a2.54 2.54 0 0 0-.9-.15c-.5 0-.96.05-1.37.12-.4.07-.75.15-1 .24l-.26-1.75c.27-.08.67-.17 1.18-.26a8.9 8.9 0 0 1 1.66-.15zm.2 7.73c.65 0 1.14-.04 1.48-.1v-2.17a5.1 5.1 0 0 0-1.98-.1c-.24.03-.46.1-.65.18a1.17 1.17 0 0 0-.47.4c-.12.17-.17.26-.17.52 0 .5.18.8.5.98.32.2.75.3 1.3.3zm8.68 1.74c-3.5 0-3.5-2.82-3.5-3.28L89.45.92 91.6.6v10c0 .25 0 1.87 1.38 1.88v1.8z'/%3E%3Cpath fill='%25231D3657' d='M5.03 11.03c0 .7-.26 1.24-.76 1.64-.5.4-1.2.6-2.1.6-.88 0-1.6-.14-2.17-.42v-1.2c.36.16.74.3 1.14.38.4.1.78.15 1.13.15.5 0 .88-.1 1.12-.3a.94.94 0 0 0 .35-.77.98.98 0 0 0-.33-.74c-.22-.2-.68-.44-1.37-.72-.72-.3-1.22-.62-1.52-1C.23 8.27.1 7.82.1 7.3c0-.65.22-1.17.7-1.55.46-.37 1.08-.56 1.86-.56.76 0 1.5.16 2.25.48l-.4 1.05c-.7-.3-1.32-.44-1.87-.44-.4 0-.73.08-.94.26a.9.9 0 0 0-.33.72c0 .2.04.38.12.52.08.15.22.3.42.4.2.14.55.3 1.06.52.58.24 1 .47 1.27.67.27.2.47.44.6.7.12.26.18.57.18.92zM9 13.27c-.92 0-1.64-.27-2.16-.8-.52-.55-.78-1.3-.78-2.24 0-.97.24-1.73.72-2.3.5-.54 1.15-.82 2-.82.78 0 1.4.25 1.85.72.46.48.7 1.14.7 1.97v.67H7.35c0 .58.17 1.02.46 1.33.3.3.7.47 1.24.47.36 0 .68-.04.98-.1a5.1 5.1 0 0 0 .98-.33v1.02a3.87 3.87 0 0 1-.94.32 5.72 5.72 0 0 1-1.08.1zm-.22-5.2c-.4 0-.73.12-.97.38s-.37.62-.42 1.1h2.7c0-.48-.13-.85-.36-1.1-.23-.26-.54-.38-.94-.38zm7.7 5.1-.26-.84h-.05c-.28.36-.57.6-.86.74-.28.13-.65.2-1.1.2-.6 0-1.05-.16-1.38-.48-.32-.32-.5-.77-.5-1.34 0-.62.24-1.08.7-1.4.45-.3 1.14-.47 2.07-.5l1.02-.03V9.2c0-.37-.1-.65-.27-.84-.17-.2-.45-.28-.82-.28-.3 0-.6.04-.88.13a6.68 6.68 0 0 0-.8.33l-.4-.9a4.4 4.4 0 0 1 1.05-.4 4.86 4.86 0 0 1 1.08-.12c.76 0 1.33.18 1.7.5.4.33.6.85.6 1.56v4h-.9zm-1.9-.87c.47 0 .83-.13 1.1-.38.3-.26.43-.62.43-1.08v-.52l-.76.03c-.6.03-1.02.13-1.3.3s-.4.45-.4.82c0 .26.08.47.24.6.16.16.4.23.7.23zm7.57-5.2c.25 0 .46.03.62.06l-.12 1.18a2.38 2.38 0 0 0-.56-.06c-.5 0-.92.16-1.24.5-.3.32-.47.75-.47 1.27v3.1h-1.27V7.23h1l.16 1.05h.05c.2-.36.45-.64.77-.85a1.83 1.83 0 0 1 1.02-.3zm4.12 6.17c-.9 0-1.58-.27-2.05-.8-.47-.52-.7-1.27-.7-2.25 0-1 .24-1.77.73-2.3.5-.54 1.2-.8 2.12-.8.63 0 1.2.1 1.7.34l-.4 1c-.52-.2-.96-.3-1.3-.3-1.04 0-1.55.68-1.55 2.05 0 .67.13 1.17.38 1.5.26.34.64.5 1.13.5a3.23 3.23 0 0 0 1.6-.4v1.1a2.53 2.53 0 0 1-.73.28 4.36 4.36 0 0 1-.93.08zm8.28-.1h-1.27V9.5c0-.45-.1-.8-.28-1.02-.18-.23-.47-.34-.88-.34-.53 0-.9.16-1.16.48-.25.3-.38.85-.38 1.6v2.94h-1.26V4.8h1.26v2.12c0 .34-.02.7-.06 1.1h.08a1.76 1.76 0 0 1 .72-.67c.3-.16.66-.24 1.07-.24 1.43 0 2.15.74 2.15 2.2v3.86zM42.2 7.1c.74 0 1.32.28 1.73.82.4.53.62 1.3.62 2.26 0 .97-.2 1.73-.63 2.27-.42.54-1 .82-1.75.82s-1.33-.27-1.75-.8h-.08l-.23.7h-.94V4.8h1.26v2l-.02.64-.03.56h.05c.4-.6 1-.9 1.78-.9zm-.33 1.04c-.5 0-.88.15-1.1.45-.22.3-.34.8-.35 1.5v.08c0 .72.12 1.24.35 1.57.23.32.6.48 1.12.48.44 0 .78-.17 1-.53.24-.35.36-.87.36-1.53 0-1.35-.47-2.03-1.4-2.03zm3.24-.92h1.4l1.2 3.37c.18.47.3.92.36 1.34h.04l.18-.72 1.37-4H51l-2.53 6.73c-.46 1.23-1.23 1.85-2.3 1.85-.3 0-.56-.03-.83-.1v-1c.2.05.4.08.65.08.6 0 1.03-.36 1.28-1.06l.22-.56-2.4-5.94z'/%3E%3C/g%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100%;display:block;height:100%;margin-left:auto;margin-right:5px;overflow:hidden;text-indent:-9000px;width:110px}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}@media (min-width:601px){.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{left:inherit!important;right:0!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete .ds-dropdown-menu{background:#0000;border:none;border-radius:4px;height:auto;margin:6px 0 0;max-width:600px;min-width:500px;padding:0;position:relative;text-align:left;top:-6px;z-index:999}}@media (min-width:640px){.sm\:text-7xl{font-size:4.5rem;line-height:1}}@media (min-width:768px){.algolia-docsearch-suggestion{border-bottom-color:#7671df}.algolia-docsearch-suggestion--subcategory-column{border-right-color:#7671df;color:#4e4726}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media (max-width:600px){.algolia-autocomplete .ds-dropdown-menu{display:block;left:auto!important;max-height:calc(100% - 5rem);max-width:calc(100% - 2rem);position:fixed!important;right:1rem!important;top:50px!important;width:600px;z-index:100}.algolia-autocomplete .ds-dropdown-menu:before{right:6rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.e92f25d7.css b/assets/css/styles.e92f25d7.css new file mode 100644 index 000000000..a54e9cd56 --- /dev/null +++ b/assets/css/styles.e92f25d7.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.button,.dropdown__link,.sr-only,.text--truncate,.whitespace-nowrap{white-space:nowrap}.group:hover .group-hover\:scale-110,.navbar-codisity-logo:hover,.navbar-youtube-logo:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.algolia-autocomplete .ds-dropdown-menu *,.searchbox,.searchbox__input{box-sizing:border-box}.searchbox__reset:focus,.searchbox__submit:focus,body:not(.navigation-with-keyboard) :not(input):focus{outline:0}pre,table{overflow:auto}.markdown li,body{word-wrap:break-word}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#533fee;--ifm-color-primary-dark:#3a23ec;--ifm-color-primary-darker:#2e16ea;--ifm-color-primary-darkest:#2511c2;--ifm-color-primary-light:#6c5bf0;--ifm-color-primary-lighter:#7868f2;--ifm-color-primary-lightest:#9d92f5;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--navbar-bg-color:#ffffffbf;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.items-center,.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size);margin-bottom:2rem}h2{font-size:var(--ifm-h2-font-size);margin-bottom:1.5rem}h3{font-size:var(--ifm-h3-font-size);margin-bottom:1rem}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol,ol ul,ul ol,ul ul{margin:0}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.capitalize,.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.cardContainer_S8oU :last-child,.collapsibleContent_i85q>:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child),.mt-1{margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.navbar__items--center .navbar__brand,body{margin:0}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.flex,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem}.h-full,.navbar__logo img,body,html{height:100%}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.group:hover .group-hover\:scale-110,.group:hover .group-hover\:translate-x-1,.navbar-codisity-logo:hover,.navbar-youtube-logo:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.inline-flex,.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.transition-all,.transition-shadow,.transition-transform{transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#9d92f5;--ifm-color-primary-dark:#7d6ef2;--ifm-color-primary-darker:#6d5cf0;--ifm-color-primary-darkest:#3c27eb;--ifm-color-primary-light:#bdb6f8;--ifm-color-primary-lighter:#cdc8fa;--ifm-color-primary-lightest:#fefdff;--docusaurus-highlighted-code-line-bg:#0000004d;--navbar-bg-color:#333333bf}h1:not(:first-child){margin-top:4rem}.docusaurus-mt-lg,h2:not(:first-child){margin-top:3rem}h3:not(:first-child){margin-top:2rem}body{font-size:1.125rem;line-height:1.75rem}body,button,fieldset,input,textarea{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}button,fieldset,input,textarea{border-style:none;font-size:1rem;line-height:1.5rem}article p{max-width:65ch}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.static{position:static}.m-0,.navbar__logo{margin:0}.mx-auto{margin-left:auto;margin-right:auto}.my-16{margin-bottom:4rem;margin-top:4rem}.mb-12{margin-bottom:3rem}.mr-2{margin-right:.5rem}.block,.tocCollapsibleContent_vkbj a{display:block}.table{display:table}.h-8{height:2rem}.min-h-\[60vh\]{min-height:60vh}.w-8{width:2rem}.w-full{width:100%}.min-w-\[360px\]{min-width:360px}.max-w-screen-sm{max-width:640px}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-col{flex-direction:column}.justify-center,.mdxPageWrapper_j9I6{justify-content:center}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-y-6{row-gap:1.5rem}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border-2{border-width:2px}.border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-hero-pattern{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='60' height='60' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z' fill='%237e22ce' fill-opacity='.05' fill-rule='evenodd'/%3E%3C/svg%3E")}.from-indigo-500{--tw-gradient-from:#6366f1 var(--tw-gradient-from-position);--tw-gradient-to:#6366f100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-indigo-700{--tw-gradient-to:#4338ca var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-2{padding:.5rem}.p-5{padding:1.25rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-4{padding-bottom:1rem;padding-top:1rem}.text-center{text-align:center}.text-justify{text-align:justify}.text-5xl{font-size:3rem;line-height:1}.footer__copyright,.navbar__inner,.text-base,.theme-doc-sidebar-menu,.theme-edit-this-page{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem}.text-lg,.text-xl{line-height:1.75rem}.text-xl{font-size:1.25rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.tracking-tight{letter-spacing:-.025em}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-transparent{color:#0000}.hover\:text-white:hover,.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.transition-all{transition-property:all}.transition-shadow{transition-property:box-shadow}.transition-transform{transition-property:transform}.duration-300{transition-duration:.3s}.navbar__item:not(.dropdown){overflow:hidden;text-overflow:clip;white-space:nowrap}.navbar-codisity-logo{margin-left:.5rem;width:6rem}.navbar-youtube-logo{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYzIiBoZWlnaHQ9IjM2LjM4OSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTE4OS40NiA3MTcuNjA1Yy0xMy45NyA1Mi4yNjYtNTUuMTMgOTMuNDM0LTEwNy40IDEwNy40MDMtOTQuNzQ0IDI1LjM4Ny00NzQuNjM4IDI1LjM4Ny00NzQuNjM4IDI1LjM4N3MtMzc5Ljg5MSAwLTQ3NC42MzMtMjUuMzg3Yy01Mi4yNjYtMTMuOTY5LTkzLjQzMy01NS4xMzctMTA3LjQwMi0xMDcuNDAzQzAgNjIyLjg2MyAwIDQyNS4xOTkgMCA0MjUuMTk5czAtMTk3LjY3MiAyNS4zODctMjkyLjQxQzM5LjM1NSA4MC41MjcgODAuNTIzIDM5LjM1NiAxMzIuNzg5IDI1LjM5MSAyMjcuNTMxLS4wMDQgNjA3LjQyMi0uMDA0IDYwNy40MjItLjAwNHMzNzkuODk0IDAgNDc0LjYzOCAyNS4zOTVjNTIuMjcgMTMuOTY1IDkzLjQzIDU1LjEzNiAxMDcuNCAxMDcuMzk4IDI1LjM5IDk0LjczOCAyNS4zOSAyOTIuNDEgMjUuMzkgMjkyLjQxczAgMTk3LjY2NC0yNS4zOSAyOTIuNDA2IiBzdHlsZT0iZmlsbDojZWQxZDI0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiB0cmFuc2Zvcm09Im1hdHJpeCguMDQyOCAwIDAgLS4wNDI4IDAgMzYuMzg5KSIvPjxwYXRoIGQ9Im00ODUuOTM4IDI0Mi45NjkgMzE1LjYxNyAxODIuMjI2LTMxNS42MTcgMTgyLjIzMVoiIHN0eWxlPSJmaWxsOiNmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIHRyYW5zZm9ybT0ibWF0cml4KC4wNDI4IDAgMCAtLjA0MjggMCAzNi4zODkpIi8+PHBhdGggZD0iTTE4OTguMDEgMTYwLjE2NGM2LjY1IDE3LjM2MyA5Ljk5IDQ1Ljc0MiA5Ljk5IDg1LjEyNXYxNjUuOTQ1YzAgMzguMjIzLTMuMzQgNjYuMTYxLTkuOTkgODMuODMyLTYuNjYgMTcuNjYxLTE4LjM5IDI2LjUtMzUuMTggMjYuNS0xNi4yMiAwLTI3LjY3LTguODM5LTM0LjMyLTI2LjUtNi42Ni0xNy42NzEtOS45OS00NS42MDktOS45OS04My44MzJWMjQ1LjI4OWMwLTM5LjM4MyAzLjE4LTY3Ljc2MiA5LjU2LTg1LjEyNSA2LjM2LTE3LjM4MyAxNy45NC0yNi4wNjIgMzQuNzUtMjYuMDYyIDE2Ljc5IDAgMjguNTIgOC42NzkgMzUuMTggMjYuMDYyem0tMTM0LjY1LTgzLjQwNmMtMjQuMDUgMTYuMTk5LTQxLjE0IDQxLjQwMi01MS4yNiA3NS41ODYtMTAuMTQgMzQuMTYtMTUuMiA3OS42MjktMTUuMiAxMzYuMzl2NzcuMzIxYzAgNTcuMzM2IDUuNzggMTAzLjM4NiAxNy4zNyAxMzguMTMzIDExLjU4IDM0Ljc1IDI5LjY3IDYwLjA4MiA1NC4zIDc2LjAxNSAyNC42MSAxNS45MjIgNTYuOSAyMy44OTEgOTYuODcgMjMuODkxIDM5LjM4IDAgNzAuOTQtOC4xMTQgOTQuNjktMjQuMzI0IDIzLjc0LTE2LjIxNSA0MS4xMi00MS41NjMgNTIuMTMtNzYuMDE2IDEwLjk5LTM0LjQ2NSAxNi41LTgwLjM2MyAxNi41LTEzNy42OTl2LTc3LjMyMWMwLTU2Ljc2MS01LjM2LTEwMi4zNzktMTYuMDctMTM2LjgzMi0xMC43Mi0zNC40NjEtMjguMS01OS42Ni01Mi4xMy03NS41NzgtMjQuMDQtMTUuOTI2LTU2LjYxLTIzLjg5NC05Ny43My0yMy44OTQtNDIuMjkgMC03NS40NSA4LjExNy05OS40NyAyNC4zMjhNMzYyMy43NiA1MTEuNjA5Yy02LjA3LTcuNTMxLTEwLjE0LTE5LjgzOS0xMi4xNi0zNi45MTgtMi4wNC0xNy4wODktMy4wMy00My4wMDMtMy4wMy03Ny43NTN2LTM4LjIyN2g4Ny43M3YzOC4yMjdjMCAzNC4xNjQtMS4xNiA2MC4wODItMy40NyA3Ny43NTMtMi4zMiAxNy42NjEtNi41MSAzMC4xMDYtMTIuNTkgMzcuMzUyLTYuMDkgNy4yNDItMTUuNSAxMC44NjMtMjguMjQgMTAuODYzLTEyLjc1IDAtMjIuMTYtMy43NzMtMjguMjQtMTEuMjk3em0tMTUuMTktMjI0LjE0di0yNi45MzRjMC0zNC4xOC45OS01OS44MDUgMy4wMy03Ni44ODMgMi4wMi0xNy4wODkgNi4yMS0yOS41NDMgMTIuNi0zNy4zNjcgNi4zNy03LjgwOCAxNi4yLTExLjcyNiAyOS41NC0xMS43MjYgMTcuOTQgMCAzMC4yNiA2Ljk1MyAzNi45MiAyMC44NTkgNi42NSAxMy44OTggMTAuMjcgMzcuMDYyIDEwLjg1IDY5LjUwNGwxMDMuMzktNi4wODZjLjU4LTQuNjQ4Ljg3LTExLjAxNi44Ny0xOS4xMDkgMC00OS4yMzktMTMuNDYtODYuMDItNDAuNC0xMTAuMzQ0LTI2LjkyLTI0LjMxNy02NS4wMi0zNi40ODUtMTE0LjI0LTM2LjQ4NS01OS4wNyAwLTEwMC40OSAxOC41MjgtMTI0LjIzIDU1LjYwNi0yMy43NiAzNy4wNTEtMzUuNjMgOTQuMzk0LTM1LjYzIDE3Mi4wMTJ2OTIuOTY0YzAgNzkuOTI2IDEyLjMxIDEzOC4yNjYgMzYuOTMgMTc1LjA1OSAyNC42MSAzNi43NzQgNjYuNzUgNTUuMTY0IDEyNi40MSA1NS4xNjQgNDEuMTEgMCA3Mi42OC03LjUzMSA5NC42OS0yMi41ODYgMjItMTUuMDcgMzcuNS0zOC41MjcgNDYuNDgtNzAuMzcxIDguOTgtMzEuODU5IDEzLjQ3LTc1Ljg4MyAxMy40Ny0xMzIuMDU1di05MS4yMjJoLTIwMC42OE0xNDcxLjQyIDI5Ny40NDFsLTEzNi40IDQ5Mi41OThoMTE5LjAybDQ3Ljc4LTIyMy4yNzdjMTIuMTctNTUuMDM1IDIxLjE0LTEwMS45NDYgMjYuOTMtMTQwLjczOWgzLjQ4YzQuMDUgMjcuNzk3IDEzLjAzIDc0LjQxNSAyNi45MyAxMzkuODY4bDQ5LjUyIDIyNC4xNDhoMTE5LjAybC0xMzguMTMtNDkyLjU5OFY2MS4xMjFoLTExOC4xNXYyMzYuMzJNMjQxNS44NiA1OTMuNjc2VjYxLjEyMWgtOTMuODNsLTEwLjQzIDY1LjE1NmgtMi42Yy0yNS40OS00OS4yMjYtNjMuNzItNzMuODM2LTExNC42OC03My44MzYtMzUuMzMgMC02MS4zOSAxMS41Ny03OC4xOSAzNC43NDYtMTYuOCAyMy4xNTMtMjUuMTkgNTkuMzY0LTI1LjE5IDEwOC41OTR2Mzk3Ljg5NWgxMTkuODlWMjAyLjczNGMwLTIzLjc2MSAyLjYxLTQwLjY5NSA3LjgyLTUwLjgyNCA1LjIxLTEwLjE0NCAxMy45LTE1LjIwMyAyNi4wNi0xNS4yMDMgMTAuNDMgMCAyMC40MiAzLjE3NiAyOS45NyA5LjU2MyA5LjU2IDYuMzY3IDE2LjY1IDE0LjQ2IDIxLjI5IDI0LjMxMnY0MjMuMDk0aDExOS44OU0zMDMwLjgyIDU5My42NzZWNjEuMTIxaC05My44M2wtMTAuNDMgNjUuMTU2aC0yLjU5Yy0yNS41MS00OS4yMjYtNjMuNzMtNzMuODM2LTExNC42OS03My44MzYtMzUuMzMgMC02MS4zOSAxMS41Ny03OC4xOSAzNC43NDYtMTYuOCAyMy4xNTMtMjUuMTkgNTkuMzY0LTI1LjE5IDEwOC41OTR2Mzk3Ljg5NWgxMTkuODlWMjAyLjczNGMwLTIzLjc2MSAyLjYtNDAuNjk1IDcuODEtNTAuODI0IDUuMjItMTAuMTQ0IDEzLjkxLTE1LjIwMyAyNi4wNy0xNS4yMDMgMTAuNDMgMCAyMC40MiAzLjE3NiAyOS45NyA5LjU2MyA5LjU2IDYuMzY3IDE2LjY1IDE0LjQ2IDIxLjI5IDI0LjMxMnY0MjMuMDk0aDExOS44OSIgc3R5bGU9ImZpbGw6IzI1MjMyMztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0MjggMCAwIC0uMDQyOCAwIDM2LjM4OSkiLz48cGF0aCBkPSJNMjc0MS42NCA2OTMuNTg2aC0xMTkuMDJWNjEuMTIxaC0xMTcuMjh2NjMyLjQ2NWgtMTE5LjAydjk2LjQzN2gzNTUuMzJ2LTk2LjQzN00zMzE3LjcyIDI5MS4zMTZjMC0zOC44MDgtMS42MS02OS4yMTgtNC43OS05MS4yMTgtMy4xOC0yMi4wMjQtOC41NC0zNy42NTctMTYuMDctNDYuOTE0LTcuNTMtOS4yNy0xNy42OC0xMy44OTktMzAuNC0xMy44OTktOS44NiAwLTE4Ljk4IDIuMzA1LTI3LjM3IDYuOTUzLTguNDEgNC42MjktMTUuMiAxMS41NzUtMjAuNDIgMjAuODUydjMwMi4zMjhjNC4wNSAxNC40NjkgMTEgMjYuMzQ4IDIwLjg1IDM1LjYxNyA5Ljg1IDkuMjU0IDIwLjU1IDEzLjg5OSAzMi4xNCAxMy44OTkgMTIuMTcgMCAyMS41Ny00Ljc4MiAyOC4yNC0xNC4zMzIgNi42NS05LjU1NSAxMS4yOS0yNS42MjkgMTMuOS00OC4yMjMgMi42MS0yMi41ODIgMy45Mi01NC43MjcgMy45Mi05Ni40MjZ6bTEwOS44OSAyMTcuMjMxYy03LjI1IDMzLjU4Mi0xOC45OCA1Ny45MDYtMzUuMTkgNzIuOTc2LTE2LjIyIDE1LjA0Ny0zOC41MiAyMi41ODItNjYuODkgMjIuNTgyLTIyLjAxIDAtNDIuNTctNi4yMy02MS42OC0xOC42NzUtMTkuMTEtMTIuNDU3LTMzLjg5LTI4LjgyMS00NC4zMS00OS4wOWgtLjg4bC4wMSAyODAuNjE3aC0xMTUuNTRWNjEuMTMzaDk5LjAzbDEyLjE3IDUwLjM3OWgyLjZjOS4yNi0xNy45NSAyMy4xNi0zMi4xNCA0MS43LTQyLjU2NyAxOC41My0xMC40MjIgMzkuMS0xNS42MzYgNjEuNjktMTUuNjM2IDQwLjUzIDAgNzAuMzYgMTguNjgzIDg5LjQ4IDU2LjAzNSAxOS4xMSAzNy4zNjMgMjguNjcgOTUuNzAzIDI4LjY3IDE3NS4wNTh2ODQuMjdjMCA1OS42NDgtMy42MyAxMDYuMjczLTEwLjg2IDEzOS44NzUiIHN0eWxlPSJmaWxsOiMyNTIzMjM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIHRyYW5zZm9ybT0ibWF0cml4KC4wNDI4IDAgMCAtLjA0MjggMCAzNi4zODkpIi8+PC9zdmc+);background-position:50%;background-repeat:no-repeat;background-size:contain;color:#0000;width:5rem}:is([data-theme=dark] .navbar-youtube-logo){background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYzIiBoZWlnaHQ9IjM2LjM4OSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTE4OS40NiA3MTcuNjA1Yy0xMy45NyA1Mi4yNjYtNTUuMTMgOTMuNDM0LTEwNy40IDEwNy40MDMtOTQuNzQ0IDI1LjM4Ny00NzQuNjM4IDI1LjM4Ny00NzQuNjM4IDI1LjM4N3MtMzc5Ljg5MSAwLTQ3NC42MzMtMjUuMzg3Yy01Mi4yNjYtMTMuOTY5LTkzLjQzMy01NS4xMzctMTA3LjQwMi0xMDcuNDAzQzAgNjIyLjg2MyAwIDQyNS4xOTkgMCA0MjUuMTk5czAtMTk3LjY3MiAyNS4zODctMjkyLjQxQzM5LjM1NSA4MC41MjcgODAuNTIzIDM5LjM1NiAxMzIuNzg5IDI1LjM5MSAyMjcuNTMxLS4wMDQgNjA3LjQyMi0uMDA0IDYwNy40MjItLjAwNHMzNzkuODk0IDAgNDc0LjYzOCAyNS4zOTVjNTIuMjcgMTMuOTY1IDkzLjQzIDU1LjEzNiAxMDcuNCAxMDcuMzk4IDI1LjM5IDk0LjczOCAyNS4zOSAyOTIuNDEgMjUuMzkgMjkyLjQxczAgMTk3LjY2NC0yNS4zOSAyOTIuNDA2IiBzdHlsZT0iZmlsbDojZWQxZDI0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiB0cmFuc2Zvcm09Im1hdHJpeCguMDQyOCAwIDAgLS4wNDI4IDAgMzYuMzg5KSIvPjxwYXRoIGQ9Im00ODUuOTM4IDI0Mi45NjkgMzE1LjYxNyAxODIuMjI2LTMxNS42MTcgMTgyLjIzMVpNMTg5OC4wMSAxNjAuMTY0YzYuNjUgMTcuMzYzIDkuOTkgNDUuNzQyIDkuOTkgODUuMTI1djE2NS45NDVjMCAzOC4yMjMtMy4zNCA2Ni4xNjEtOS45OSA4My44MzItNi42NiAxNy42NjEtMTguMzkgMjYuNS0zNS4xOCAyNi41LTE2LjIyIDAtMjcuNjctOC44MzktMzQuMzItMjYuNS02LjY2LTE3LjY3MS05Ljk5LTQ1LjYwOS05Ljk5LTgzLjgzMlYyNDUuMjg5YzAtMzkuMzgzIDMuMTgtNjcuNzYyIDkuNTYtODUuMTI1IDYuMzYtMTcuMzgzIDE3Ljk0LTI2LjA2MiAzNC43NS0yNi4wNjIgMTYuNzkgMCAyOC41MiA4LjY3OSAzNS4xOCAyNi4wNjJ6bS0xMzQuNjUtODMuNDA2Yy0yNC4wNSAxNi4xOTktNDEuMTQgNDEuNDAyLTUxLjI2IDc1LjU4Ni0xMC4xNCAzNC4xNi0xNS4yIDc5LjYyOS0xNS4yIDEzNi4zOXY3Ny4zMjFjMCA1Ny4zMzYgNS43OCAxMDMuMzg2IDE3LjM3IDEzOC4xMzMgMTEuNTggMzQuNzUgMjkuNjcgNjAuMDgyIDU0LjMgNzYuMDE1IDI0LjYxIDE1LjkyMiA1Ni45IDIzLjg5MSA5Ni44NyAyMy44OTEgMzkuMzggMCA3MC45NC04LjExNCA5NC42OS0yNC4zMjQgMjMuNzQtMTYuMjE1IDQxLjEyLTQxLjU2MyA1Mi4xMy03Ni4wMTYgMTAuOTktMzQuNDY1IDE2LjUtODAuMzYzIDE2LjUtMTM3LjY5OXYtNzcuMzIxYzAtNTYuNzYxLTUuMzYtMTAyLjM3OS0xNi4wNy0xMzYuODMyLTEwLjcyLTM0LjQ2MS0yOC4xLTU5LjY2LTUyLjEzLTc1LjU3OC0yNC4wNC0xNS45MjYtNTYuNjEtMjMuODk0LTk3LjczLTIzLjg5NC00Mi4yOSAwLTc1LjQ1IDguMTE3LTk5LjQ3IDI0LjMyOE0zNjIzLjc2IDUxMS42MDljLTYuMDctNy41MzEtMTAuMTQtMTkuODM5LTEyLjE2LTM2LjkxOC0yLjA0LTE3LjA4OS0zLjAzLTQzLjAwMy0zLjAzLTc3Ljc1M3YtMzguMjI3aDg3LjczdjM4LjIyN2MwIDM0LjE2NC0xLjE2IDYwLjA4Mi0zLjQ3IDc3Ljc1My0yLjMyIDE3LjY2MS02LjUxIDMwLjEwNi0xMi41OSAzNy4zNTItNi4wOSA3LjI0Mi0xNS41IDEwLjg2My0yOC4yNCAxMC44NjMtMTIuNzUgMC0yMi4xNi0zLjc3My0yOC4yNC0xMS4yOTd6bS0xNS4xOS0yMjQuMTR2LTI2LjkzNGMwLTM0LjE4Ljk5LTU5LjgwNSAzLjAzLTc2Ljg4MyAyLjAyLTE3LjA4OSA2LjIxLTI5LjU0MyAxMi42LTM3LjM2NyA2LjM3LTcuODA4IDE2LjItMTEuNzI2IDI5LjU0LTExLjcyNiAxNy45NCAwIDMwLjI2IDYuOTUzIDM2LjkyIDIwLjg1OSA2LjY1IDEzLjg5OCAxMC4yNyAzNy4wNjIgMTAuODUgNjkuNTA0bDEwMy4zOS02LjA4NmMuNTgtNC42NDguODctMTEuMDE2Ljg3LTE5LjEwOSAwLTQ5LjIzOS0xMy40Ni04Ni4wMi00MC40LTExMC4zNDQtMjYuOTItMjQuMzE3LTY1LjAyLTM2LjQ4NS0xMTQuMjQtMzYuNDg1LTU5LjA3IDAtMTAwLjQ5IDE4LjUyOC0xMjQuMjMgNTUuNjA2LTIzLjc2IDM3LjA1MS0zNS42MyA5NC4zOTQtMzUuNjMgMTcyLjAxMnY5Mi45NjRjMCA3OS45MjYgMTIuMzEgMTM4LjI2NiAzNi45MyAxNzUuMDU5IDI0LjYxIDM2Ljc3NCA2Ni43NSA1NS4xNjQgMTI2LjQxIDU1LjE2NCA0MS4xMSAwIDcyLjY4LTcuNTMxIDk0LjY5LTIyLjU4NiAyMi0xNS4wNyAzNy41LTM4LjUyNyA0Ni40OC03MC4zNzEgOC45OC0zMS44NTkgMTMuNDctNzUuODgzIDEzLjQ3LTEzMi4wNTV2LTkxLjIyMmgtMjAwLjY4TTE0NzEuNDIgMjk3LjQ0MWwtMTM2LjQgNDkyLjU5OGgxMTkuMDJsNDcuNzgtMjIzLjI3N2MxMi4xNy01NS4wMzUgMjEuMTQtMTAxLjk0NiAyNi45My0xNDAuNzM5aDMuNDhjNC4wNSAyNy43OTcgMTMuMDMgNzQuNDE1IDI2LjkzIDEzOS44NjhsNDkuNTIgMjI0LjE0OGgxMTkuMDJsLTEzOC4xMy00OTIuNTk4VjYxLjEyMWgtMTE4LjE1djIzNi4zMk0yNDE1Ljg2IDU5My42NzZWNjEuMTIxaC05My44M2wtMTAuNDMgNjUuMTU2aC0yLjZjLTI1LjQ5LTQ5LjIyNi02My43Mi03My44MzYtMTE0LjY4LTczLjgzNi0zNS4zMyAwLTYxLjM5IDExLjU3LTc4LjE5IDM0Ljc0Ni0xNi44IDIzLjE1My0yNS4xOSA1OS4zNjQtMjUuMTkgMTA4LjU5NHYzOTcuODk1aDExOS44OVYyMDIuNzM0YzAtMjMuNzYxIDIuNjEtNDAuNjk1IDcuODItNTAuODI0IDUuMjEtMTAuMTQ0IDEzLjktMTUuMjAzIDI2LjA2LTE1LjIwMyAxMC40MyAwIDIwLjQyIDMuMTc2IDI5Ljk3IDkuNTYzIDkuNTYgNi4zNjcgMTYuNjUgMTQuNDYgMjEuMjkgMjQuMzEydjQyMy4wOTRoMTE5Ljg5TTMwMzAuODIgNTkzLjY3NlY2MS4xMjFoLTkzLjgzbC0xMC40MyA2NS4xNTZoLTIuNTljLTI1LjUxLTQ5LjIyNi02My43My03My44MzYtMTE0LjY5LTczLjgzNi0zNS4zMyAwLTYxLjM5IDExLjU3LTc4LjE5IDM0Ljc0Ni0xNi44IDIzLjE1My0yNS4xOSA1OS4zNjQtMjUuMTkgMTA4LjU5NHYzOTcuODk1aDExOS44OVYyMDIuNzM0YzAtMjMuNzYxIDIuNi00MC42OTUgNy44MS01MC44MjQgNS4yMi0xMC4xNDQgMTMuOTEtMTUuMjAzIDI2LjA3LTE1LjIwMyAxMC40MyAwIDIwLjQyIDMuMTc2IDI5Ljk3IDkuNTYzIDkuNTYgNi4zNjcgMTYuNjUgMTQuNDYgMjEuMjkgMjQuMzEydjQyMy4wOTRoMTE5Ljg5IiBzdHlsZT0iZmlsbDojZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiB0cmFuc2Zvcm09Im1hdHJpeCguMDQyOCAwIDAgLS4wNDI4IDAgMzYuMzg5KSIvPjxwYXRoIGQ9Ik0yNzQxLjY0IDY5My41ODZoLTExOS4wMlY2MS4xMjFoLTExNy4yOHY2MzIuNDY1aC0xMTkuMDJ2OTYuNDM3aDM1NS4zMnYtOTYuNDM3TTMzMTcuNzIgMjkxLjMxNmMwLTM4LjgwOC0xLjYxLTY5LjIxOC00Ljc5LTkxLjIxOC0zLjE4LTIyLjAyNC04LjU0LTM3LjY1Ny0xNi4wNy00Ni45MTQtNy41My05LjI3LTE3LjY4LTEzLjg5OS0zMC40LTEzLjg5OS05Ljg2IDAtMTguOTggMi4zMDUtMjcuMzcgNi45NTMtOC40MSA0LjYyOS0xNS4yIDExLjU3NS0yMC40MiAyMC44NTJ2MzAyLjMyOGM0LjA1IDE0LjQ2OSAxMSAyNi4zNDggMjAuODUgMzUuNjE3IDkuODUgOS4yNTQgMjAuNTUgMTMuODk5IDMyLjE0IDEzLjg5OSAxMi4xNyAwIDIxLjU3LTQuNzgyIDI4LjI0LTE0LjMzMiA2LjY1LTkuNTU1IDExLjI5LTI1LjYyOSAxMy45LTQ4LjIyMyAyLjYxLTIyLjU4MiAzLjkyLTU0LjcyNyAzLjkyLTk2LjQyNnptMTA5Ljg5IDIxNy4yMzFjLTcuMjUgMzMuNTgyLTE4Ljk4IDU3LjkwNi0zNS4xOSA3Mi45NzYtMTYuMjIgMTUuMDQ3LTM4LjUyIDIyLjU4Mi02Ni44OSAyMi41ODItMjIuMDEgMC00Mi41Ny02LjIzLTYxLjY4LTE4LjY3NS0xOS4xMS0xMi40NTctMzMuODktMjguODIxLTQ0LjMxLTQ5LjA5aC0uODhsLjAxIDI4MC42MTdoLTExNS41NFY2MS4xMzNoOTkuMDNsMTIuMTcgNTAuMzc5aDIuNmM5LjI2LTE3Ljk1IDIzLjE2LTMyLjE0IDQxLjctNDIuNTY3IDE4LjUzLTEwLjQyMiAzOS4xLTE1LjYzNiA2MS42OS0xNS42MzYgNDAuNTMgMCA3MC4zNiAxOC42ODMgODkuNDggNTYuMDM1IDE5LjExIDM3LjM2MyAyOC42NyA5NS43MDMgMjguNjcgMTc1LjA1OHY4NC4yN2MwIDU5LjY0OC0zLjYzIDEwNi4yNzMtMTAuODYgMTM5Ljg3NSIgc3R5bGU9ImZpbGw6I2ZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoLjA0MjggMCAwIC0uMDQyOCAwIDM2LjM4OSkiLz48L3N2Zz4=)}.video iframe{aspect-ratio:16/9;width:100%}.placeholder\:text-slate-500::placeholder{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.hover\:no-underline:hover{text-decoration-line:none}.enabled\:hover\:bg-blue-800:hover:enabled{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.disabled\:opacity-75:disabled{opacity:.75}.group:hover .group-hover\:translate-x-1{--tw-translate-x:0.25rem}:is([data-theme=dark] .dark\:text-gray-200){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is([data-theme=dark] .dark\:text-slate-300){--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}:is([data-theme=dark] .dark\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is([data-theme=dark] .dark\:hover\:bg-white\/\[\.075\]:hover){background-color:hsla(0,0%,100%,.075)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.searchbox,.searchbox__input,.tag_Nnez{display:inline-block}.cardContainer_S8oU{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_S8oU:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_HoSo{font-size:1.2rem}.cardDescription_c27F{font-size:.8rem}.tag_Nnez{margin:.5rem .5rem 0 1rem}.algolia-docsearch-suggestion{border-bottom-color:#3a3dd1}.algolia-docsearch-suggestion--category-header{background-color:#4b54de}.algolia-docsearch-suggestion--highlight{color:#3a33d1}.algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background-color:#4d47d5}.aa-cursor .algolia-docsearch-suggestion--content{color:#272296}.aa-cursor .algolia-docsearch-suggestion{background:#ebebfb}.searchbox{height:32px!important;position:relative;visibility:visible!important;white-space:nowrap;width:200px}.searchbox .algolia-autocomplete{display:block;height:100%;width:100%}.searchbox__wrapper{height:100%;position:relative;width:100%;z-index:999}.searchbox__input{-webkit-appearance:none;appearance:none;background:#fff!important;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;font-size:12px;height:100%;padding:0 26px 0 32px;transition:box-shadow .4s,background .4s;vertical-align:middle;white-space:normal;width:100%}.searchbox__reset,.searchbox__submit{font-size:inherit;-webkit-user-select:none;position:absolute}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{background:#fff;box-shadow:inset 0 0 0 1px #aaa;outline:0}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{background-color:#458ee100;border:0;border-radius:16px 0 0 16px;height:100%;left:0;margin:0;padding:0;right:inherit;text-align:center;top:0;user-select:none;vertical-align:middle;width:32px}.searchbox__submit:before{content:"";display:inline-block;height:100%;margin-right:-4px;vertical-align:middle}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion,.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit svg{fill:#6d7e96;height:14px;vertical-align:middle;width:14px}.searchbox__reset{fill:#00000080;background:none;border:0;cursor:pointer;display:block;margin:0;padding:0;right:8px;top:8px;user-select:none}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.searchbox__reset.hide{display:none}.searchbox__reset svg{display:block;height:8px;margin:4px;width:8px}.searchbox__input:valid~.searchbox__reset{animation-duration:.15s;animation-name:a;display:block}@keyframes a{0%{opacity:0;transform:translate3d(-20%,0,0)}to{opacity:1;transform:none}}.algolia-autocomplete .ds-dropdown-menu:before{background:#373940;border-radius:2px;border-right:1px solid #373940;border-top:1px solid #373940;content:"";display:block;height:14px;position:absolute;top:-7px;transform:rotate(-45deg);width:14px;z-index:1000}.algolia-autocomplete .ds-dropdown-menu{box-shadow:0 1px 0 0 #0003,0 2px 3px 0 #0000001a}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{background:#fff;border-radius:4px;overflow:auto;padding:0;position:relative}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;overflow:hidden;padding:0;position:relative;text-decoration:none}.algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--wrapper{background:#f1f1f1;box-shadow:inset -2px 0 0 #61dafb}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{background:#ffe564;padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight{background:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{background:inherit;box-shadow:inset 0 -2px 0 0 #458ee1cc;color:inherit;padding:0 0 1px}.algolia-autocomplete .algolia-docsearch-suggestion--content{cursor:pointer;display:block;float:right;padding:5.33333px 0 5.33333px 10.66667px;position:relative;width:70%}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{background:#ececec;content:"";display:block;height:100%;left:-1px;position:absolute;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{background-color:#373940;color:#fff;display:none;font-size:14px;font-weight:700;letter-spacing:.08em;margin:0;padding:5px 8px;position:relative;text-transform:uppercase}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{background-color:#fff;float:left;padding:8px 0 0;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{word-wrap:break-word;color:#777;display:none;float:left;font-size:.9em;padding:5.33333px 10.66667px;position:relative;text-align:right;width:30%}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{background:#ececec;content:"";display:block;height:100%;position:absolute;right:0;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before,.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--highlight{background-color:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--title{color:#02060c;font-size:.9em;font-weight:700;margin-bottom:4px}.algolia-autocomplete .algolia-docsearch-suggestion--text{color:#63676d;display:block;font-size:.85em;line-height:1.2em;padding-right:2px}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{background-color:#373940;font-size:1.2em;margin-top:-8px;padding:8px 0;text-align:center;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--no-results .algolia-docsearch-suggestion--text{color:#fff;margin-top:4px}.algolia-autocomplete .algolia-docsearch-suggestion code{background-color:#ebebeb;border:none;border-radius:3px;color:#222;font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace;font-size:90%;padding:1px 5px}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header{color:#fff;display:block}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary .algolia-docsearch-suggestion--subcategory-column{display:block}.algolia-autocomplete .algolia-docsearch-footer{background-color:#fff;float:right;font-size:0;height:30px;line-height:0;width:100%;z-index:2000}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 130 18'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='url(%2523a)' d='M59.4.02h13.3a2.37 2.37 0 0 1 2.38 2.37V15.6a2.37 2.37 0 0 1-2.38 2.36H59.4a2.37 2.37 0 0 1-2.38-2.36V2.38A2.37 2.37 0 0 1 59.4.02z'/%3E%3Cpath fill='%2523FFF' d='M66.26 4.56c-2.82 0-5.1 2.27-5.1 5.08 0 2.8 2.28 5.07 5.1 5.07 2.8 0 5.1-2.26 5.1-5.07 0-2.8-2.28-5.07-5.1-5.07zm0 8.65c-2 0-3.6-1.6-3.6-3.56 0-1.97 1.6-3.58 3.6-3.58 1.98 0 3.6 1.6 3.6 3.58a3.58 3.58 0 0 1-3.6 3.57zm0-6.4v2.66c0 .07.08.13.15.1l2.4-1.24c.04-.02.06-.1.03-.14a2.96 2.96 0 0 0-2.46-1.5.1.1 0 0 0-.1.1zm-3.33-1.96-.3-.3a.78.78 0 0 0-1.12 0l-.36.36a.77.77 0 0 0 0 1.1l.3.3c.05.05.13.04.17 0 .2-.25.4-.5.6-.7.23-.23.46-.43.7-.6.07-.04.07-.1.03-.16zm5-.8V3.4a.78.78 0 0 0-.78-.78h-1.83a.78.78 0 0 0-.78.78v.63c0 .07.06.12.14.1a5.74 5.74 0 0 1 1.58-.22c.52 0 1.04.07 1.54.2a.1.1 0 0 0 .13-.1z'/%3E%3Cpath fill='%2523182359' d='M102.16 13.76c0 1.46-.37 2.52-1.12 3.2-.75.67-1.9 1-3.44 1-.56 0-1.74-.1-2.67-.3l.34-1.7c.78.17 1.82.2 2.36.2.86 0 1.48-.16 1.84-.5.37-.36.55-.88.55-1.57v-.35a6.37 6.37 0 0 1-.84.3 4.15 4.15 0 0 1-1.2.17 4.5 4.5 0 0 1-1.6-.28 3.38 3.38 0 0 1-1.26-.82 3.74 3.74 0 0 1-.8-1.35c-.2-.54-.3-1.5-.3-2.2 0-.67.1-1.5.3-2.06a3.92 3.92 0 0 1 .9-1.43 4.12 4.12 0 0 1 1.45-.92 5.3 5.3 0 0 1 1.94-.37c.7 0 1.35.1 1.97.2a15.86 15.86 0 0 1 1.6.33v8.46zm-5.95-4.2c0 .9.2 1.88.6 2.3.4.4.9.62 1.53.62.34 0 .66-.05.96-.15a2.75 2.75 0 0 0 .73-.33V6.7a8.53 8.53 0 0 0-1.42-.17c-.76-.02-1.36.3-1.77.8-.4.5-.62 1.4-.62 2.23zm16.13 0c0 .72-.1 1.26-.32 1.85a4.4 4.4 0 0 1-.9 1.53c-.38.42-.85.75-1.4.98-.54.24-1.4.37-1.8.37-.43 0-1.27-.13-1.8-.36a4.1 4.1 0 0 1-1.4-.97 4.5 4.5 0 0 1-.92-1.52 5.04 5.04 0 0 1-.33-1.84c0-.72.1-1.4.32-2 .22-.6.53-1.1.92-1.5.4-.43.86-.75 1.4-.98a4.55 4.55 0 0 1 1.78-.34 4.7 4.7 0 0 1 1.8.34c.54.23 1 .55 1.4.97.38.42.68.92.9 1.5.23.6.35 1.3.35 2zm-2.2 0c0-.92-.2-1.7-.6-2.22-.38-.54-.94-.8-1.64-.8-.72 0-1.27.26-1.67.8-.4.54-.58 1.3-.58 2.22 0 .93.2 1.56.6 2.1.38.54.94.8 1.64.8s1.25-.26 1.65-.8c.4-.55.6-1.17.6-2.1zm6.97 4.7c-3.5.02-3.5-2.8-3.5-3.27L113.57.92l2.15-.34v10c0 .25 0 1.87 1.37 1.88v1.8zm3.77 0h-2.15v-9.2l2.15-.33v9.54zM119.8 3.74c.7 0 1.3-.58 1.3-1.3 0-.7-.58-1.3-1.3-1.3-.73 0-1.3.6-1.3 1.3 0 .72.58 1.3 1.3 1.3zm6.43 1c.7 0 1.3.1 1.78.27.5.18.88.42 1.17.73.28.3.5.74.6 1.18.13.46.2.95.2 1.5v5.47a25.24 25.24 0 0 1-1.5.25c-.67.1-1.42.15-2.25.15a6.83 6.83 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.37-.27-.9-.27-1.44 0-.52.1-.85.3-1.2.2-.37.48-.67.83-.9a3.6 3.6 0 0 1 1.23-.5 7.07 7.07 0 0 1 2.2-.1l.83.16V8.4c0-.25-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.18-.34-.3-.58-.4a2.54 2.54 0 0 0-.92-.17c-.5 0-.94.06-1.35.13-.4.08-.75.16-1 .25l-.27-1.74c.27-.1.67-.18 1.2-.28a9.34 9.34 0 0 1 1.65-.14zm.18 7.74c.66 0 1.15-.04 1.5-.1V10.2a5.1 5.1 0 0 0-2-.1c-.23.03-.45.1-.64.2a1.17 1.17 0 0 0-.47.38c-.13.17-.18.26-.18.52 0 .5.17.8.5.98.32.2.74.3 1.3.3zM84.1 4.8c.72 0 1.3.08 1.8.26.48.17.87.42 1.15.73.3.3.5.72.6 1.17.14.45.2.94.2 1.47v5.48a25.24 25.24 0 0 1-1.5.26c-.67.1-1.42.14-2.25.14a6.83 6.83 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.38-.27-.9-.27-1.44 0-.53.1-.86.3-1.22.2-.36.5-.65.84-.88a3.6 3.6 0 0 1 1.24-.5 7.07 7.07 0 0 1 2.2-.1c.26.03.54.08.84.15v-.35c0-.24-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.17-.34-.3-.58-.4a2.54 2.54 0 0 0-.9-.15c-.5 0-.96.05-1.37.12-.4.07-.75.15-1 .24l-.26-1.75c.27-.08.67-.17 1.18-.26a8.9 8.9 0 0 1 1.66-.15zm.2 7.73c.65 0 1.14-.04 1.48-.1v-2.17a5.1 5.1 0 0 0-1.98-.1c-.24.03-.46.1-.65.18a1.17 1.17 0 0 0-.47.4c-.12.17-.17.26-.17.52 0 .5.18.8.5.98.32.2.75.3 1.3.3zm8.68 1.74c-3.5 0-3.5-2.82-3.5-3.28L89.45.92 91.6.6v10c0 .25 0 1.87 1.38 1.88v1.8z'/%3E%3Cpath fill='%25231D3657' d='M5.03 11.03c0 .7-.26 1.24-.76 1.64-.5.4-1.2.6-2.1.6-.88 0-1.6-.14-2.17-.42v-1.2c.36.16.74.3 1.14.38.4.1.78.15 1.13.15.5 0 .88-.1 1.12-.3a.94.94 0 0 0 .35-.77.98.98 0 0 0-.33-.74c-.22-.2-.68-.44-1.37-.72-.72-.3-1.22-.62-1.52-1C.23 8.27.1 7.82.1 7.3c0-.65.22-1.17.7-1.55.46-.37 1.08-.56 1.86-.56.76 0 1.5.16 2.25.48l-.4 1.05c-.7-.3-1.32-.44-1.87-.44-.4 0-.73.08-.94.26a.9.9 0 0 0-.33.72c0 .2.04.38.12.52.08.15.22.3.42.4.2.14.55.3 1.06.52.58.24 1 .47 1.27.67.27.2.47.44.6.7.12.26.18.57.18.92zM9 13.27c-.92 0-1.64-.27-2.16-.8-.52-.55-.78-1.3-.78-2.24 0-.97.24-1.73.72-2.3.5-.54 1.15-.82 2-.82.78 0 1.4.25 1.85.72.46.48.7 1.14.7 1.97v.67H7.35c0 .58.17 1.02.46 1.33.3.3.7.47 1.24.47.36 0 .68-.04.98-.1a5.1 5.1 0 0 0 .98-.33v1.02a3.87 3.87 0 0 1-.94.32 5.72 5.72 0 0 1-1.08.1zm-.22-5.2c-.4 0-.73.12-.97.38s-.37.62-.42 1.1h2.7c0-.48-.13-.85-.36-1.1-.23-.26-.54-.38-.94-.38zm7.7 5.1-.26-.84h-.05c-.28.36-.57.6-.86.74-.28.13-.65.2-1.1.2-.6 0-1.05-.16-1.38-.48-.32-.32-.5-.77-.5-1.34 0-.62.24-1.08.7-1.4.45-.3 1.14-.47 2.07-.5l1.02-.03V9.2c0-.37-.1-.65-.27-.84-.17-.2-.45-.28-.82-.28-.3 0-.6.04-.88.13a6.68 6.68 0 0 0-.8.33l-.4-.9a4.4 4.4 0 0 1 1.05-.4 4.86 4.86 0 0 1 1.08-.12c.76 0 1.33.18 1.7.5.4.33.6.85.6 1.56v4h-.9zm-1.9-.87c.47 0 .83-.13 1.1-.38.3-.26.43-.62.43-1.08v-.52l-.76.03c-.6.03-1.02.13-1.3.3s-.4.45-.4.82c0 .26.08.47.24.6.16.16.4.23.7.23zm7.57-5.2c.25 0 .46.03.62.06l-.12 1.18a2.38 2.38 0 0 0-.56-.06c-.5 0-.92.16-1.24.5-.3.32-.47.75-.47 1.27v3.1h-1.27V7.23h1l.16 1.05h.05c.2-.36.45-.64.77-.85a1.83 1.83 0 0 1 1.02-.3zm4.12 6.17c-.9 0-1.58-.27-2.05-.8-.47-.52-.7-1.27-.7-2.25 0-1 .24-1.77.73-2.3.5-.54 1.2-.8 2.12-.8.63 0 1.2.1 1.7.34l-.4 1c-.52-.2-.96-.3-1.3-.3-1.04 0-1.55.68-1.55 2.05 0 .67.13 1.17.38 1.5.26.34.64.5 1.13.5a3.23 3.23 0 0 0 1.6-.4v1.1a2.53 2.53 0 0 1-.73.28 4.36 4.36 0 0 1-.93.08zm8.28-.1h-1.27V9.5c0-.45-.1-.8-.28-1.02-.18-.23-.47-.34-.88-.34-.53 0-.9.16-1.16.48-.25.3-.38.85-.38 1.6v2.94h-1.26V4.8h1.26v2.12c0 .34-.02.7-.06 1.1h.08a1.76 1.76 0 0 1 .72-.67c.3-.16.66-.24 1.07-.24 1.43 0 2.15.74 2.15 2.2v3.86zM42.2 7.1c.74 0 1.32.28 1.73.82.4.53.62 1.3.62 2.26 0 .97-.2 1.73-.63 2.27-.42.54-1 .82-1.75.82s-1.33-.27-1.75-.8h-.08l-.23.7h-.94V4.8h1.26v2l-.02.64-.03.56h.05c.4-.6 1-.9 1.78-.9zm-.33 1.04c-.5 0-.88.15-1.1.45-.22.3-.34.8-.35 1.5v.08c0 .72.12 1.24.35 1.57.23.32.6.48 1.12.48.44 0 .78-.17 1-.53.24-.35.36-.87.36-1.53 0-1.35-.47-2.03-1.4-2.03zm3.24-.92h1.4l1.2 3.37c.18.47.3.92.36 1.34h.04l.18-.72 1.37-4H51l-2.53 6.73c-.46 1.23-1.23 1.85-2.3 1.85-.3 0-.56-.03-.83-.1v-1c.2.05.4.08.65.08.6 0 1.03-.36 1.28-1.06l.22-.56-2.4-5.94z'/%3E%3C/g%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100%;display:block;height:100%;margin-left:auto;margin-right:5px;overflow:hidden;text-indent:-9000px;width:110px}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}@media (min-width:601px){.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{left:inherit!important;right:0!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete .ds-dropdown-menu{background:#0000;border:none;border-radius:4px;height:auto;margin:6px 0 0;max-width:600px;min-width:500px;padding:0;position:relative;text-align:left;top:-6px;z-index:999}}@media (min-width:640px){.sm\:text-7xl{font-size:4.5rem;line-height:1}}@media (min-width:768px){.algolia-docsearch-suggestion{border-bottom-color:#7671df}.algolia-docsearch-suggestion--subcategory-column{border-right-color:#7671df;color:#4e4726}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media (max-width:600px){.algolia-autocomplete .ds-dropdown-menu{display:block;left:auto!important;max-height:calc(100% - 5rem);max-width:calc(100% - 2rem);position:fixed!important;right:1rem!important;top:50px!important;width:600px;z-index:100}.algolia-autocomplete .ds-dropdown-menu:before{right:6rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/1df93b7f.74855918.js b/assets/js/1df93b7f.74855918.js new file mode 100644 index 000000000..606dc69ba --- /dev/null +++ b/assets/js/1df93b7f.74855918.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodisity_pl=self.webpackChunkcodisity_pl||[]).push([[53237],{69754:(e,t,a)=>{a.r(t),a.d(t,{default:()=>i});var r=a(39960),l=a(84173),n=a(67294);function o(e){let{children:t,href:a=""}=e;return n.createElement(n.Fragment,null,n.createElement("a",{className:"group flex gap-y-6 w-full h-full hover:bg-gray-100 hover:no-underline rounded-lg p-5 transition-all dark:hover:bg-white/[.075]",href:a,target:"_blank",rel:"noopener"},n.createElement("div",{className:"flex gap-2 items-center"},t)))}function i(){return n.createElement(l.Z,{title:"\u0179r\xf3d\u0142o nauki tworzenia stron i aplikacji internetowych",description:"Kompendium wiedzy na temat web developmentu"},n.createElement("div",{className:"bg-hero-pattern flex-1"},n.createElement("div",{className:"min-h-[60vh] flex justify-center items-center"},n.createElement("header",null,n.createElement("h1",{className:"p-2 font-bold text-5xl sm:text-7xl text-center tracking-tight text-transparent bg-clip-text bg-gradient-to-br from-indigo-500 to-indigo-700"},"\u0179r\xf3d\u0142o nauki tworzenia stron",n.createElement("br",null)," i aplikacji internetowych"),n.createElement("p",{className:"text-slate-700 dark:text-slate-300 text-center"},"Mimo wysi\u0142ku wk\u0142adanego w tworzenie serwisu, materia\u0142y s\u0105 w pe\u0142ni darmowe!"),n.createElement("div",{className:"my-16 text-center"},n.createElement(r.Z,{className:"bg-indigo-500 hover:bg-indigo-600 text-xl font-semibold text-white hover:text-white py-4 px-8 rounded hover:no-underline",to:"/podstawy/informatyka"},"Rozpocznij Nauk\u0119")))),n.createElement("main",{className:"max-w-screen-sm mx-auto"},n.createElement("p",{className:"mb-12"},"Je\u015bli uznasz Codisity za warto\u015bciowy serwis, rozwa\u017c prosz\u0119 wsparcie:"),n.createElement("div",{className:"flex flex-col gap-4"},n.createElement(o,{href:"https://codisity.pl/youtube"},n.createElement("svg",{className:"w-8 h-8 text-gray-800 mr-2 dark:text-gray-200 group-hover:scale-110 transition-transform",xmlns:"http://www.w3.org/2000/svg",width:"36",height:"32",viewBox:"0 0 576 512"},n.createElement("path",{fill:"currentColor",d:"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597c-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821c11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205l-142.739 81.201z"})),n.createElement("p",{className:"m-0 block font-bold text-gray-800 dark:text-white group-hover:translate-x-1 transition-transform"},"Zasubskrybuj YouTube'owy kana\u0142 Codisity")),n.createElement(o,{href:"https://www.udemy.com/user/adrianbienias"},n.createElement("svg",{className:"w-8 h-8 text-gray-800 mr-2 dark:text-gray-200 group-hover:scale-110 transition-transform",xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",viewBox:"0 0 24 24"},n.createElement("path",{fill:"currentColor",d:"M12 0L5.81 3.573v3.574l6.189-3.574l6.191 3.574V3.573zM5.81 10.148v8.144c0 1.85.589 3.243 1.741 4.234S10.177 24 11.973 24s3.269-.482 4.448-1.474c1.179-.991 1.768-2.439 1.768-4.314v-8.064h-3.242v7.85c0 2.036-1.509 3.055-2.948 3.055c-1.428 0-2.947-.991-2.947-3.027v-7.878z"})),n.createElement("p",{className:"m-0 block font-bold text-gray-800 dark:text-white group-hover:translate-x-1 transition-transform"},"Kup jeden z moich kurs\xf3w, kt\xf3ry Ci\u0119 interesuje, na Udemy")),n.createElement(o,{href:"/100-bugow-js"},n.createElement("svg",{className:"w-8 h-8 text-gray-800 mr-2 dark:text-gray-200 group-hover:scale-110 transition-transform",xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",viewBox:"0 0 24 24"},n.createElement("g",{fill:"none","fill-rule":"evenodd"},n.createElement("path",{d:"M24 0v24H0V0h24ZM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035c-.01-.004-.019-.001-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427c-.002-.01-.009-.017-.017-.018Zm.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093c.012.004.023 0 .029-.008l.004-.014l-.034-.614c-.003-.012-.01-.02-.02-.022Zm-.715.002a.023.023 0 0 0-.027.006l-.006.014l-.034.614c0 .012.007.02.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01l-.184-.092Z"}),n.createElement("path",{fill:"currentColor",d:"M7.67 5.5A4.998 4.998 0 0 1 12 3a4.998 4.998 0 0 1 4.33 2.5L17.2 7H6.8l.869-1.5Zm-4.117.606a1 1 0 0 1 1.341.447c.147.293.5.674.973.99C6.353 7.867 6.781 8 7 8h10c.219 0 .647-.133 1.133-.457c.474-.316.826-.697.973-.99a1 1 0 1 1 1.788.894c-.353.707-1 1.326-1.652 1.76a5.48 5.48 0 0 1-.966.516A9.77 9.77 0 0 1 18.892 12H21a1 1 0 1 1 0 2h-2.012a9.995 9.995 0 0 1-.74 3.327c.572.33.963.86 1.209 1.35A5.5 5.5 0 0 1 20 21a1 1 0 1 1-2 0c0-.374-.101-.966-.332-1.428c-.13-.26-.26-.409-.385-.49c-1.056 1.486-2.539 2.54-4.283 2.835V13a1 1 0 1 0-2 0v8.917c-1.744-.295-3.227-1.35-4.283-2.834c-.126.08-.255.23-.385.49A3.513 3.513 0 0 0 6 21a1 1 0 1 1-2 0a5.5 5.5 0 0 1 .543-2.322c.246-.492.637-1.02 1.209-1.35A9.994 9.994 0 0 1 5.012 14H3a1 1 0 1 1 0-2h2.108a9.782 9.782 0 0 1 .616-2.277a5.483 5.483 0 0 1-.966-.516c-.651-.434-1.3-1.053-1.652-1.76a1 1 0 0 1 .447-1.341Z"}))),n.createElement("p",{className:"m-0 block font-bold text-gray-800 dark:text-white group-hover:translate-x-1 transition-transform"},'Zapisz si\u0119 na darmowy kurs emailowy "100 Bug\xf3w JS"')),n.createElement(o,{href:"/"},n.createElement("svg",{className:"w-8 h-8 text-gray-800 mr-2 dark:text-gray-200 group-hover:scale-110 transition-transform",xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",viewBox:"0 0 24 24"},n.createElement("path",{fill:"currentColor",d:"M18 9a3 3 0 1 0-2.977-2.63l-6.94 3.47a3 3 0 1 0 0 4.319l6.94 3.47a3 3 0 1 0 .895-1.789l-6.94-3.47a3.03 3.03 0 0 0 0-.74l6.94-3.47C16.456 8.68 17.19 9 18 9Z"})),n.createElement("p",{className:"m-0 block font-bold text-gray-800 dark:text-white group-hover:translate-x-1 transition-transform"},"Udost\u0119pnij link do tej strony swoimi znajomymi"))),n.createElement("p",{className:"my-16"},"Z g\xf3ry wielkie dzi\u0119ki! \ud83c\udf89"))))}}}]); \ No newline at end of file diff --git a/assets/js/1df93b7f.9709b9b7.js b/assets/js/1df93b7f.9709b9b7.js deleted file mode 100644 index 197f4f68e..000000000 --- a/assets/js/1df93b7f.9709b9b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodisity_pl=self.webpackChunkcodisity_pl||[]).push([[53237],{69754:(e,t,n)=>{n.r(t),n.d(t,{default:()=>r});var a=n(39960),i=n(84173),l=n(67294);function r(){return l.createElement(i.Z,{title:"\u0179r\xf3d\u0142o nauki tworzenia stron i aplikacji internetowych",description:"Kompendium wiedzy na temat web developmentu"},l.createElement("div",{className:"bg-hero-pattern flex-1"},l.createElement("div",{className:"min-h-[75vh] flex justify-center items-center"},l.createElement("header",null,l.createElement("h1",{className:"p-2 font-bold text-5xl sm:text-7xl text-center tracking-tight text-transparent bg-clip-text bg-gradient-to-br from-indigo-500 to-indigo-700"},"\u0179r\xf3d\u0142o nauki tworzenia stron",l.createElement("br",null)," i aplikacji internetowych"),l.createElement("div",{className:"text-slate-700 dark:text-slate-300 max-w-prose mx-auto text-left"},l.createElement("ul",null,l.createElement("li",null,"Serwis jest w trakcie rozwoju i tre\u015bci b\u0119d\u0105 pojawia\u0142y si\u0119 sukcesywnie"),l.createElement("li",null,"Sekcje linkuj\u0105 do zewn\u0119trznych \u017ar\xf3de\u0142 z informacjami na dany temat"),l.createElement("li",null,"Cz\u0119\u015b\u0107 sekcji zawiera dodatkowe materia\u0142y w formie wideo"))),l.createElement("div",{className:"my-16 text-center"},l.createElement(a.Z,{className:"bg-indigo-500 hover:bg-indigo-600 text-xl font-semibold text-white hover:text-white py-4 px-8 rounded hover:no-underline",to:"/podstawy/informatyka"},"Rozpocznij Nauk\u0119"))),l.createElement("main",null))))}}}]); \ No newline at end of file diff --git a/assets/js/main.a5d990a0.js b/assets/js/main.4de3269d.js similarity index 99% rename from assets/js/main.a5d990a0.js rename to assets/js/main.4de3269d.js index 93df0848e..ce24fab5f 100644 --- a/assets/js/main.a5d990a0.js +++ b/assets/js/main.4de3269d.js @@ -1,2 +1,2 @@ -/*! For license information please see main.a5d990a0.js.LICENSE.txt */ -(self.webpackChunkcodisity_pl=self.webpackChunkcodisity_pl||[]).push([[40179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(67294),o=n(87462),c=n(68356),i=n.n(c),s=n(16887);const r={"0004ba19":[()=>n.e(59228).then(n.t.bind(n,4010,19)),"~docs/default/tag-tags-cache-f9d.json",4010],"000665dd":[()=>n.e(85230).then(n.bind(n,16203)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription.md",16203],"003204f1":[()=>n.e(92011).then(n.bind(n,5189)),"@site/docs/040-backend/010-node-js/index.mdx",5189],"0147c202":[()=>n.e(61554).then(n.t.bind(n,31134,19)),"~docs/default/tag-tags-dev-tools-b4a.json",31134],"01c989ff":[()=>n.e(97736).then(n.t.bind(n,47116,19)),"~docs/default/tag-tags-docs-b19.json",47116],"01fa18ad":[()=>n.e(36376).then(n.bind(n,59748)),"@site/docs/010-podstawy/040-programowanie/080-dobre-praktyki.mdx",59748],"02e6af99":[()=>n.e(17384).then(n.bind(n,20386)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode.md",20386],"02ffdfe4":[()=>Promise.all([n.e(40532),n.e(3473),n.e(17119)]).then(n.bind(n,1657)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/index.mdx",1657],"03236927":[()=>n.e(55119).then(n.bind(n,60900)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode.md",60900],"034f1ed4":[()=>n.e(9929).then(n.bind(n,818)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription.md",818],"03892e34":[()=>n.e(8013).then(n.bind(n,51750)),"@site/docs/010-podstawy/130-dokumentacje/010-jak-czytac-dokumentacje.mdx",51750],"039c99a0":[()=>n.e(43191).then(n.bind(n,20803)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription.md",20803],"03faf0a9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(78309)]).then(n.bind(n,84047)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/index.mdx",84047],"0411acde":[()=>n.e(49583).then(n.bind(n,359)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode.md",359],"0418672b":[()=>n.e(92815).then(n.bind(n,67747)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription.md",67747],"0440d02f":[()=>n.e(96953).then(n.bind(n,76477)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links.md",76477],"0464ef27":[()=>n.e(54414).then(n.bind(n,5707)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode.md",5707],"048a21ad":[()=>n.e(89238).then(n.bind(n,94990)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links.md",94990],"051f438e":[()=>n.e(62982).then(n.bind(n,50684)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription.md",50684],"05add8f7":[()=>n.e(63364).then(n.bind(n,31613)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links.md",31613],"05c66f1b":[()=>n.e(67138).then(n.bind(n,68085)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode.md",68085],"05f0acd5":[()=>n.e(45442).then(n.bind(n,79366)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode.md",79366],"05f6c2f3":[()=>n.e(95798).then(n.t.bind(n,80409,19)),"~docs/default/tag-tags-wasm-7c9.json",80409],"062fd7e6":[()=>n.e(65596).then(n.t.bind(n,71016,19)),"~docs/default/tag-tags-auth-f79.json",71016],"0640dad6":[()=>n.e(24426).then(n.bind(n,71890)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode.md",71890],"0643aaf6":[()=>n.e(22629).then(n.t.bind(n,66674,19)),"~docs/default/tag-tags-java-script-e8e.json",66674],"0673ff60":[()=>Promise.all([n.e(40532),n.e(3473),n.e(70423)]).then(n.bind(n,72207)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/index.mdx",72207],"07cd6fa5":[()=>n.e(13366).then(n.bind(n,78706)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription.md",78706],"08bf3db3":[()=>n.e(29124).then(n.bind(n,22145)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links.md",22145],"093bf030":[()=>Promise.all([n.e(40532),n.e(3473),n.e(30999)]).then(n.bind(n,61094)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/index.mdx",61094],"095e46f4":[()=>n.e(58178).then(n.bind(n,28959)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/210-tablica-inspiracji.mdx",28959],"09d85903":[()=>n.e(20139).then(n.bind(n,17647)),"@site/docs/020-ux-ui/020-roznice-miedzy-ux-ui.mdx",17647],"0a7aa683":[()=>n.e(81442).then(n.bind(n,91985)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/060-deweloperski-serwer-webpack-i-gorace-przeladowania.mdx",91985],"0aa05009":[()=>n.e(14867).then(n.bind(n,49645)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode.md",49645],"0b1402ec":[()=>n.e(77196).then(n.bind(n,1917)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription.md",1917],"0b54690a":[()=>n.e(52643).then(n.bind(n,17053)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode.md",17053],"0b881017":[()=>n.e(30654).then(n.t.bind(n,59847,19)),"~docs/default/tag-tags-hosting-00f.json",59847],"0b93d927":[()=>n.e(92273).then(n.bind(n,61448)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode.md",61448],"0be52f91":[()=>n.e(38773).then(n.bind(n,85620)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode.md",85620],"0be807c8":[()=>n.e(7901).then(n.bind(n,72112)),"@site/docs/050-fullstack/030-paginacja/index.mdx",72112],"0bed0a80":[()=>n.e(49921).then(n.bind(n,2728)),"@site/docs/050-fullstack/045-powiadomienia-push/index.mdx",2728],"0c910f2c":[()=>n.e(47269).then(n.bind(n,25081)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode.md",25081],"0cb16f1a":[()=>n.e(6395).then(n.bind(n,51500)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links.md",51500],"0ce570b0":[()=>n.e(58172).then(n.bind(n,23618)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode.md",23618],"0ce5b853":[()=>n.e(14334).then(n.bind(n,26791)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode.md",26791],"0d0cfc9b":[()=>n.e(89731).then(n.bind(n,3323)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links.md",3323],"0e149194":[()=>n.e(1173).then(n.bind(n,70064)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode.md",70064],"0e30e5b5":[()=>n.e(94866).then(n.bind(n,18412)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links.md",18412],"0e839c7a":[()=>n.e(37827).then(n.bind(n,99975)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode.md",99975],"0e920236":[()=>n.e(23568).then(n.bind(n,90078)),"@site/docs/010-podstawy/040-programowanie/060-wzorce-projektowe.mdx",90078],"0ed29833":[()=>n.e(40609).then(n.bind(n,48817)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode.md",48817],"0f600836":[()=>n.e(60802).then(n.bind(n,36079)),"@site/docs/010-podstawy/120-hosting/030-darmowy-hosting-statycznych-stron-w-serwisie-github.mdx",36079],"0fc669ab":[()=>n.e(40078).then(n.bind(n,10927)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode.md",10927],"0fd0e493":[()=>n.e(27150).then(n.bind(n,96225)),"@site/docs/050-fullstack/010-autentykacja-i-autoryzacja/010-implementacja-autentykacji/050-wylogowanie.mdx",96225],"0fe87576":[()=>n.e(8756).then(n.bind(n,11227)),"@site/docs/050-fullstack/060-next-js/index.mdx",11227],"101401c2":[()=>n.e(55510).then(n.bind(n,34201)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription.md",34201],"107ec02c":[()=>n.e(91543).then(n.bind(n,18757)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription.md",18757],"10e8a4c3":[()=>n.e(41243).then(n.bind(n,57199)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription.md",57199],"11aee4d5":[()=>n.e(86813).then(n.bind(n,64340)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/410-tresci-tekstowe.mdx",64340],"11c922d6":[()=>n.e(3040).then(n.t.bind(n,33132,19)),"~docs/default/tag-tags-axios-bb7.json",33132],"11ec7ab7":[()=>Promise.all([n.e(40532),n.e(3473),n.e(63037)]).then(n.bind(n,93157)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/index.mdx",93157],"124f8898":[()=>n.e(28096).then(n.bind(n,99418)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode.md",99418],"125b4871":[()=>n.e(89830).then(n.bind(n,44301)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/522-formularzdostepnosci-uslugi.mdx",44301],"12a24e43":[()=>n.e(10781).then(n.bind(n,52634)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/030-ladowarki.mdx",52634],"12a26bf9":[()=>n.e(77922).then(n.bind(n,89892)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription.md",89892],"132ae864":[()=>Promise.all([n.e(40532),n.e(3473),n.e(93520)]).then(n.bind(n,51937)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/index.mdx",51937],"1348f3b9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(71154)]).then(n.bind(n,91790)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/index.mdx",91790],"136154f9":[()=>n.e(39227).then(n.bind(n,23039)),"@site/docs/040-backend/110-obsluga-emaili/020-darmowy-system-do-email-marketingu-osems.mdx",23039],"13716f07":[()=>n.e(81293).then(n.bind(n,95713)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/070-rozwiazywanie-sciezek-importu-plikow.mdx",95713],"139744d8":[()=>Promise.all([n.e(40532),n.e(3473),n.e(57052)]).then(n.bind(n,50503)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/index.mdx",50503],"140039fa":[()=>n.e(85873).then(n.bind(n,48514)),"@site/docs/040-backend/090-silniki-wyszukiwania/index.mdx",48514],14108782:[()=>n.e(31226).then(n.bind(n,8008)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links.md",8008],"143bde44":[()=>n.e(49444).then(n.bind(n,94148)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription.md",94148],"14953e46":[()=>n.e(6826).then(n.bind(n,35971)),"@site/docs/030-frontend/050-seo/index.mdx",35971],"14ede2c4":[()=>n.e(86972).then(n.t.bind(n,71520,19)),"~docs/default/tag-tags-security-95f.json",71520],"1512e94b":[()=>Promise.all([n.e(40532),n.e(3473),n.e(33427)]).then(n.bind(n,66701)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/index.mdx",66701],"1568ef07":[()=>n.e(10457).then(n.bind(n,41349)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode.md",41349],"156f22fa":[()=>n.e(97261).then(n.bind(n,21055)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/526-detale.mdx",21055],"15961e68":[()=>n.e(20765).then(n.bind(n,66640)),"@site/src/pages/facebook.ts",66640],"15dcd4d5":[()=>n.e(95028).then(n.bind(n,35209)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription.md",35209],"16090ce9":[()=>n.e(28714).then(n.bind(n,98858)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription.md",98858],"163a8872":[()=>n.e(57464).then(n.bind(n,92281)),"@site/docs/010-podstawy/040-programowanie/070-frameworki-i-biblioteki.mdx",92281],"168c3334":[()=>n.e(53414).then(n.bind(n,45456)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription.md",45456],"16a86f87":[()=>n.e(55327).then(n.bind(n,12755)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode.md",12755],"16dc8209":[()=>n.e(47391).then(n.bind(n,18096)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription.md",18096],"16e67a08":[()=>n.e(83770).then(n.bind(n,39661)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription.md",39661],"1729a1f6":[()=>n.e(21147).then(n.t.bind(n,76175,19)),"~docs/default/tag-tags-hardware-200.json",76175],"1762f0ac":[()=>n.e(65799).then(n.bind(n,64440)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription.md",64440],17896441:[()=>Promise.all([n.e(40532),n.e(3473),n.e(10817),n.e(27918)]).then(n.bind(n,49657)),"@theme/DocItem",49657],"17ad4c76":[()=>n.e(26440).then(n.bind(n,59764)),"@site/docs/010-podstawy/060-jezyki-programowania/050-php.mdx",59764],"180ed2a4":[()=>n.e(47373).then(n.bind(n,12115)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode.md",12115],"187e279e":[()=>n.e(35651).then(n.bind(n,55287)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription.md",55287],"18e1cb18":[()=>n.e(78920).then(n.bind(n,4399)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode.md",4399],"18ed0261":[()=>n.e(5926).then(n.bind(n,31374)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription.md",31374],"1946c1b0":[()=>n.e(34194).then(n.bind(n,84736)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode.md",84736],"196d4e6a":[()=>n.e(60901).then(n.bind(n,1822)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/010-przygotowanie-srodowiska-deweloperskiego.mdx",1822],"19b2d324":[()=>n.e(77618).then(n.bind(n,41621)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode.md",41621],"19c4e3e4":[()=>n.e(71717).then(n.t.bind(n,82039,19)),"~docs/default/tag-tags-cr-96a.json",82039],"19ebc4f2":[()=>n.e(55056).then(n.bind(n,70377)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode.md",70377],"1a030ce7":[()=>Promise.all([n.e(40532),n.e(3473),n.e(15198)]).then(n.bind(n,40947)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/index.mdx",40947],"1a214f7a":[()=>n.e(7078).then(n.bind(n,67391)),"@site/docs/050-fullstack/010-autentykacja-i-autoryzacja/index.mdx",67391],"1a4c811a":[()=>n.e(53720).then(n.t.bind(n,12188,19)),"~docs/default/tag-tags-tracking-193.json",12188],"1a6a286c":[()=>n.e(65893).then(n.bind(n,87652)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode.md",87652],"1a941675":[()=>n.e(12291).then(n.bind(n,35531)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links.md",35531],"1aa6d80f":[()=>n.e(31087).then(n.bind(n,75022)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode.md",75022],"1acfb591":[()=>n.e(68073).then(n.bind(n,1972)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription.md",1972],"1adb1ec9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(2268)]).then(n.bind(n,19949)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/index.mdx",19949],"1b3221f9":[()=>n.e(31775).then(n.bind(n,14013)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription.md",14013],"1bc64f73":[()=>n.e(54003).then(n.t.bind(n,21460,19)),"~docs/default/tag-tags-design-patterns-b95.json",21460],"1bcc8060":[()=>n.e(29779).then(n.t.bind(n,86859,19)),"~docs/default/tag-tags-vs-code-097.json",86859],"1be78505":[()=>Promise.all([n.e(40532),n.e(29514)]).then(n.bind(n,19963)),"@theme/DocPage",19963],"1c18c48f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(3918)]).then(n.bind(n,31833)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/index.mdx",31833],"1c64a88e":[()=>n.e(3951).then(n.bind(n,48579)),"@site/docs/030-frontend/010-html/060-zadanie-domowe.mdx",48579],"1d485327":[()=>n.e(41605).then(n.bind(n,92540)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription.md",92540],"1df25d8f":[()=>n.e(80160).then(n.bind(n,57198)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode.md",57198],"1df59a38":[()=>n.e(73595).then(n.bind(n,39980)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/340-prototyp.mdx",39980],"1df93b7f":[()=>n.e(53237).then(n.bind(n,69754)),"@site/src/pages/index.tsx",69754],"1dff7f70":[()=>n.e(73049).then(n.t.bind(n,7220,19)),"~docs/default/tag-tags-ci-7da.json",7220],"1e5c300d":[()=>n.e(26114).then(n.bind(n,28246)),"@site/docs/010-podstawy/200-architektura-oprogramowania/index.mdx",28246],"1e971022":[()=>n.e(43022).then(n.bind(n,82522)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode.md",82522],"1eab5aea":[()=>n.e(93799).then(n.t.bind(n,76557,19)),"~docs/default/tag-tags-js-d58.json",76557],"1ecfb6a1":[()=>Promise.all([n.e(40532),n.e(3473),n.e(49724)]).then(n.bind(n,63500)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/index.mdx",63500],"1ee67351":[()=>n.e(93107).then(n.bind(n,28173)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription.md",28173],"1f391b9e":[()=>Promise.all([n.e(40532),n.e(3473),n.e(10817),n.e(13085)]).then(n.bind(n,14247)),"@theme/MDXPage",14247],"1f8688ca":[()=>n.e(48783).then(n.bind(n,49764)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode.md",49764],"20c7be6f":[()=>n.e(32351).then(n.t.bind(n,94264,19)),"~docs/default/tag-tags-ia-c-e9b.json",94264],"20df82b0":[()=>n.e(74540).then(n.t.bind(n,83414,19)),"~docs/default/tag-tags-app-eef.json",83414],"20f76fe4":[()=>n.e(66018).then(n.bind(n,26215)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/050-zarzadzanie-wieloma-stanami.mdx",26215],"213c417c":[()=>n.e(73465).then(n.bind(n,19543)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/010-instalacja-niezbednego-oprogramowania.mdx",19543],"217f2f14":[()=>n.e(31109).then(n.t.bind(n,97676,19)),"~docs/default/tag-tags-bundle-085.json",97676],"219ef9cb":[()=>n.e(48723).then(n.bind(n,18913)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links.md",18913],"21daf841":[()=>n.e(12219).then(n.bind(n,29301)),"@site/src/pages/100-bugow-js/wymagane-potwierdzenie.md",29301],"21fbea38":[()=>n.e(77259).then(n.bind(n,37478)),"@site/docs/050-fullstack/060-next-js/010-warsztat-next-js-2022-12-20.mdx",37478],"221c2bc4":[()=>Promise.all([n.e(40532),n.e(3473),n.e(88066)]).then(n.bind(n,1977)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/index.mdx",1977],"22a036fd":[()=>n.e(23683).then(n.t.bind(n,55653,19)),"~docs/default/tag-tags-db-0ce.json",55653],"22a0c2c0":[()=>n.e(63585).then(n.bind(n,80138)),"@site/docs/010-podstawy/130-dokumentacje/020-jak-tworzyc-dokumentacje.mdx",80138],"23553ba2":[()=>n.e(37181).then(n.bind(n,246)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode.md",246],23568145:[()=>n.e(26654).then(n.bind(n,95273)),"@site/docs/010-podstawy/120-hosting/010-konfiguracja-wlasnego-serwera-wirtualnego-vps copy.mdx",95273],"23beba54":[()=>n.e(44090).then(n.bind(n,56299)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription.md",56299],"240efcf0":[()=>Promise.all([n.e(40532),n.e(3473),n.e(4955)]).then(n.bind(n,11668)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/index.mdx",11668],"2417b2dd":[()=>n.e(64343).then(n.bind(n,19593)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode.md",19593],"24185e05":[()=>n.e(16538).then(n.bind(n,40788)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links.md",40788],"243d8faa":[()=>n.e(87630).then(n.bind(n,94032)),"@site/docs/010-podstawy/060-jezyki-programowania/010-scratch.mdx",94032],24521656:[()=>n.e(58942).then(n.bind(n,99723)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription.md",99723],"24726fc0":[()=>n.e(98108).then(n.bind(n,3234)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode.md",3234],"2542a404":[()=>n.e(58387).then(n.bind(n,23791)),"@site/docs/030-frontend/030-javascript/060-wprowadzenie-w-typescript.mdx",23791],"256c42fd":[()=>n.e(12983).then(n.bind(n,32730)),"@site/docs/050-fullstack/010-autentykacja-i-autoryzacja/010-implementacja-autentykacji/040-obsluga-sesji.mdx",32730],"258699c7":[()=>n.e(9203).then(n.bind(n,14383)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode.md",14383],"25ebd437":[()=>Promise.all([n.e(40532),n.e(3473),n.e(44759)]).then(n.bind(n,95241)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/index.mdx",95241],"2605d115":[()=>n.e(8974).then(n.bind(n,31471)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/090-asynchroniczne-akcje.mdx",31471],"2610f6c0":[()=>n.e(1645).then(n.bind(n,77160)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode.md",77160],"262efa03":[()=>n.e(66714).then(n.t.bind(n,40878,19)),"~docs/default/tag-tags-vim-c55.json",40878],"2686a605":[()=>n.e(31963).then(n.t.bind(n,85663,19)),"~docs/default/tag-tags-frontend-94c.json",85663],"26a6d6fe":[()=>Promise.all([n.e(16214),n.e(13666)]).then(n.bind(n,8060)),"@site/src/pages/100-bugow-js/index.mdx",8060],"26d61991":[()=>Promise.all([n.e(40532),n.e(3473),n.e(352)]).then(n.bind(n,65613)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/index.mdx",65613],"26ddc48b":[()=>n.e(83706).then(n.bind(n,32502)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription.md",32502],"274aa25e":[()=>n.e(47457).then(n.bind(n,17343)),"@site/docs/050-fullstack/055-sledzenie/index.mdx",17343],"27ac0aac":[()=>n.e(91862).then(n.bind(n,8592)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription.md",8592],"27ba00b1":[()=>n.e(16667).then(n.bind(n,26276)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/080-podzial-kodu-na-mniejsze-pliki.mdx",26276],"27e62540":[()=>n.e(58039).then(n.bind(n,93829)),"@site/docs/040-backend/040-bazy-danych/010-mapowanie-obiektowo-relacyjne.mdx",93829],"2800bf0b":[()=>n.e(97288).then(n.bind(n,60791)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links.md",60791],"28ac91cf":[()=>Promise.all([n.e(40532),n.e(97398)]).then(n.bind(n,2305)),"@site/docs/020-ux-ui/020-praktyczne-szkolenie-projektowania-ux-ui/index.mdx",2305],"29256a58":[()=>n.e(68965).then(n.bind(n,53005)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links.md",53005],"29ad98c9":[()=>n.e(12493).then(n.bind(n,51118)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links.md",51118],"2a1cbcea":[()=>n.e(52622).then(n.bind(n,32205)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode.md",32205],"2a6a6bb2":[()=>n.e(39547).then(n.bind(n,10960)),"@site/docs/050-fullstack/000-fullstack/index.mdx",10960],"2ab483d6":[()=>Promise.all([n.e(40532),n.e(3473),n.e(29653)]).then(n.bind(n,79017)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/index.mdx",79017],"2b0866cd":[()=>n.e(37065).then(n.bind(n,24052)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription.md",24052],"2b14d38f":[()=>n.e(63012).then(n.bind(n,36716)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links.md",36716],"2b9af6db":[()=>n.e(88020).then(n.bind(n,77854)),"@site/docs/010-podstawy/050-systemy-operacyjne/index.mdx",77854],"2b9b2b66":[()=>n.e(84702).then(n.bind(n,73893)),"@site/src/pages/digitalocean.ts",73893],"2bd03153":[()=>n.e(15228).then(n.bind(n,35102)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/060-predefiniowane-typy-akcji-i-kreatory-akcji.mdx",35102],"2c0d42e6":[()=>n.e(21171).then(n.bind(n,34004)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode.md",34004],"2c3ac257":[()=>n.e(96581).then(n.bind(n,69075)),"@site/docs/030-frontend/080-zarzadzanie-stanem/index.mdx",69075],"2c3f2294":[()=>n.e(80697).then(n.bind(n,53383)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links.md",53383],"2c428535":[()=>n.e(91832).then(n.bind(n,92907)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription.md",92907],"2c71b8c7":[()=>n.e(80772).then(n.bind(n,26100)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription.md",26100],"2c860247":[()=>n.e(10437).then(n.bind(n,20227)),"@site/docs/040-backend/020-wierwsz-polecen/index.mdx",20227],"2ce9e165":[()=>n.e(79039).then(n.bind(n,70257)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription.md",70257],"2d50d312":[()=>n.e(87332).then(n.bind(n,34913)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription.md",34913],"2d9b47eb":[()=>n.e(53428).then(n.bind(n,28768)),"@site/docs/040-backend/100-brokery-wiadomosci/index.mdx",28768],"2e3c4440":[()=>n.e(30251).then(n.t.bind(n,4736,19)),"~docs/default/tag-tags-nginx-4be.json",4736],"2ebb811d":[()=>n.e(50114).then(n.bind(n,60050)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links.md",60050],"2eeb76f5":[()=>Promise.all([n.e(40532),n.e(3473),n.e(36942)]).then(n.bind(n,59203)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/index.mdx",59203],"2ef7432a":[()=>n.e(87022).then(n.bind(n,41436)),"@site/docs/030-frontend/040-dostepnosc/index.mdx",41436],"2fa374a5":[()=>n.e(71617).then(n.bind(n,76673)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/110-korzystanie-z-figmy.mdx",76673],"2fae5484":[()=>n.e(54707).then(n.bind(n,11024)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription.md",11024],"2faf5f8d":[()=>n.e(75333).then(n.bind(n,77171)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode.md",77171],"3002d84b":[()=>n.e(85363).then(n.t.bind(n,48236,19)),"~docs/default/tag-tags-vps-c0f.json",48236],"300c37de":[()=>n.e(33212).then(n.bind(n,88294)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription.md",88294],"303e47b6":[()=>n.e(56286).then(n.t.bind(n,95530,19)),"~docs/default/tag-tags-vite-488.json",95530],"304051a0":[()=>n.e(81930).then(n.bind(n,64937)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription.md",64937],"30be5cfe":[()=>Promise.all([n.e(40532),n.e(3473),n.e(11979)]).then(n.bind(n,64193)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/index.mdx",64193],"30d40704":[()=>n.e(49672).then(n.bind(n,16332)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode.md",16332],31816458:[()=>Promise.all([n.e(40532),n.e(3473),n.e(39304)]).then(n.bind(n,29754)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/index.mdx",29754],"31c250e4":[()=>Promise.all([n.e(40532),n.e(3473),n.e(56712)]).then(n.bind(n,25161)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/index.mdx",25161],"3299ddf7":[()=>n.e(63323).then(n.bind(n,81027)),"@site/docs/030-frontend/020-css/020-organizacja-styli-css-i-preprocesory.mdx",81027],"32b6cb06":[()=>n.e(99360).then(n.bind(n,28016)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode.md",28016],"32c84f75":[()=>n.e(58365).then(n.bind(n,13811)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode.md",13811],"3315e240":[()=>n.e(13069).then(n.bind(n,87066)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode.md",87066],"332a8094":[()=>n.e(4124).then(n.bind(n,26747)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode.md",26747],"335c931a":[()=>n.e(3036).then(n.bind(n,18304)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode.md",18304],"34696ee0":[()=>n.e(16279).then(n.bind(n,2255)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription.md",2255],"3482ea4d":[()=>n.e(23066).then(n.bind(n,41195)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links.md",41195],"3484e3da":[()=>n.e(93013).then(n.bind(n,29022)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription.md",29022],"34dc295a":[()=>n.e(92576).then(n.bind(n,98661)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/090-korzystanie-z-dokumentacji.mdx",98661],"34e24484":[()=>Promise.all([n.e(40532),n.e(3473),n.e(10679)]).then(n.bind(n,32164)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/index.mdx",32164],"35121e98":[()=>n.e(49501).then(n.bind(n,77271)),"@site/docs/020-ux-ui/020-praktyczne-szkolenie-projektowania-ux-ui/010-nagranie-z-webinaru-ux.mdx",77271],"355ae17e":[()=>n.e(39092).then(n.bind(n,58643)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode.md",58643],"358255f4":[()=>n.e(16617).then(n.t.bind(n,73712,19)),"~docs/default/tag-tags-os-e26.json",73712],"35acaae7":[()=>Promise.all([n.e(40532),n.e(3473),n.e(12126)]).then(n.bind(n,64832)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/index.mdx",64832],"35e8cbe2":[()=>n.e(95486).then(n.bind(n,43733)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode.md",43733],"35f22c59":[()=>n.e(86522).then(n.bind(n,15268)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links.md",15268],"35f61e76":[()=>n.e(2236).then(n.bind(n,74546)),"@site/docs/010-podstawy/190-edytory-kodu/010-formatowanie-kodu.mdx",74546],"360b6ef2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(1876)]).then(n.bind(n,16743)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/index.mdx",16743],"3683b838":[()=>Promise.all([n.e(40532),n.e(3473),n.e(6202)]).then(n.bind(n,61395)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/index.mdx",61395],"36daacc8":[()=>n.e(35202).then(n.t.bind(n,94999,19)),"~docs/default/tag-tags-libs-f5f.json",94999],"3720c009":[()=>Promise.all([n.e(40532),n.e(13751)]).then(n.bind(n,9861)),"@theme/DocTagsListPage",9861],"372d5953":[()=>n.e(68581).then(n.bind(n,38864)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links.md",38864],"380577eb":[()=>n.e(21744).then(n.bind(n,64206)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription.md",64206],"3897ba98":[()=>n.e(88155).then(n.bind(n,54233)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode.md",54233],"38e7d649":[()=>n.e(57570).then(n.bind(n,99868)),"@site/docs/030-frontend/010-html/010-wprowadzenie-do-htmla.mdx",99868],"3989dfa9":[()=>n.e(67158).then(n.bind(n,1322)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription.md",1322],"39e28333":[()=>n.e(66664).then(n.bind(n,23997)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode.md",23997],"3a826b7d":[()=>n.e(62623).then(n.bind(n,64923)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription.md",64923],"3a86717d":[()=>n.e(41686).then(n.bind(n,9321)),"@site/docs/030-frontend/030-javascript/020-node-js-na-frontendzie copy.mdx",9321],"3ad6bc89":[()=>Promise.all([n.e(40532),n.e(3473),n.e(59298)]).then(n.bind(n,107)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/index.mdx",107],"3aed7afa":[()=>Promise.all([n.e(40532),n.e(3473),n.e(11412)]).then(n.bind(n,87139)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/index.mdx",87139],"3af07524":[()=>n.e(49376).then(n.bind(n,60419)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links.md",60419],"3b350703":[()=>n.e(27656).then(n.bind(n,53435)),"@site/docs/030-frontend/000-frontend/index.mdx",53435],"3b35082a":[()=>n.e(3877).then(n.bind(n,87575)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode.md",87575],"3b7d4c88":[()=>n.e(42424).then(n.bind(n,18706)),"@site/docs/010-podstawy/070-kontrola-wersji/020-github.mdx",18706],"3bd3cc6c":[()=>n.e(45622).then(n.bind(n,15143)),"@site/docs/020-ux-ui/000-projektowanie-ux-ui.mdx",15143],"3c1a96f3":[()=>n.e(73299).then(n.t.bind(n,88608,19)),"~docs/default/tag-tags-bug-ba9.json",88608],"3c2a6dbe":[()=>n.e(66695).then(n.bind(n,18481)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode.md",18481],"3c6537df":[()=>n.e(16622).then(n.bind(n,11806)),"@site/src/pages/youtube.ts",11806],"3cc29c87":[()=>n.e(27703).then(n.t.bind(n,30892,19)),"~docs/default/tag-tags-mongo-db-67e.json",30892],"3ce88d35":[()=>n.e(98325).then(n.bind(n,32649)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription.md",32649],"3d92781a":[()=>n.e(51057).then(n.t.bind(n,45718,19)),"~docs/default/tag-tags-database-551.json",45718],"3dfe6802":[()=>n.e(12725).then(n.t.bind(n,5963,19)),"~docs/default/tag-tags-smtp-d95.json",5963],"3e763eb6":[()=>n.e(67754).then(n.bind(n,80287)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/100-redux-thunk.mdx",80287],"3ecc7b49":[()=>n.e(23334).then(n.bind(n,51028)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode.md",51028],"402ad4fa":[()=>Promise.all([n.e(40532),n.e(3473),n.e(35497)]).then(n.bind(n,99937)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/index.mdx",99937],"4050c730":[()=>n.e(48613).then(n.bind(n,25012)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links.md",25012],"40921b67":[()=>n.e(63215).then(n.bind(n,406)),"@site/docs/030-frontend/035-react/020-tworzenie-kopiarki-fragmentow-kodu-z-kolorowaniem-skladni.mdx",406],"409248a3":[()=>n.e(73860).then(n.t.bind(n,12683,19)),"~docs/default/tag-tags-self-hosting-d02.json",12683],"40b0947d":[()=>n.e(9625).then(n.bind(n,2181)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription.md",2181],"40dee476":[()=>n.e(40824).then(n.bind(n,98932)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode.md",98932],"40e5047b":[()=>n.e(48958).then(n.bind(n,67617)),"@site/docs/030-frontend/035-react/010-memoizowanie-cacheowanie-na-przykladzie-reacta.mdx",67617],"41027c2e":[()=>n.e(2817).then(n.bind(n,75023)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode.md",75023],"41154ebd":[()=>n.e(87175).then(n.bind(n,11464)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode.md",11464],"41239f1e":[()=>n.e(51876).then(n.bind(n,6846)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode.md",6846],42020487:[()=>n.e(96536).then(n.bind(n,52151)),"@site/docs/040-backend/120-infrastuktura/index.mdx",52151],"4217490a":[()=>n.e(7688).then(n.bind(n,43046)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links.md",43046],"422536d8":[()=>n.e(66079).then(n.bind(n,69963)),"@site/docs/030-frontend/010-html/030-tekst.mdx",69963],42417097:[()=>n.e(21536).then(n.bind(n,83680)),"@site/docs/010-podstawy/220-praca-w-it/030-backend-developer.mdx",83680],"433883a5":[()=>Promise.all([n.e(40532),n.e(3473),n.e(65204)]).then(n.bind(n,3169)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/index.mdx",3169],"435cbe30":[()=>n.e(15111).then(n.bind(n,64718)),"@site/docs/040-backend/030-api-zaplecza/010-restful-api.mdx",64718],"43ae16eb":[()=>n.e(9991).then(n.bind(n,19739)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode.md",19739],"43fe1f45":[()=>n.e(53554).then(n.bind(n,53656)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode.md",53656],"449a6de5":[()=>n.e(21724).then(n.bind(n,58515)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode.md",58515],"44aca286":[()=>n.e(85311).then(n.bind(n,31750)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode.md",31750],"454290ab":[()=>n.e(92429).then(n.bind(n,51545)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode.md",51545],"454dc8ce":[()=>n.e(92445).then(n.bind(n,70223)),"@site/docs/010-podstawy/070-kontrola-wersji/010-inspekcja-kodu.mdx",70223],"45805a7d":[()=>n.e(29964).then(n.bind(n,86400)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode.md",86400],"45aff26c":[()=>n.e(99606).then(n.bind(n,43294)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription.md",43294],"45c1aab2":[()=>n.e(74304).then(n.t.bind(n,70005,19)),"~docs/default/tag-tags-email-e39.json",70005],"45d22c4c":[()=>n.e(40718).then(n.t.bind(n,45261,19)),"~docs/default/tag-tags-routing-cfa.json",45261],"4618a95d":[()=>n.e(81932).then(n.bind(n,87709)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/331-przygotowanie-elementow-szkieletu.mdx",87709],"46476aff":[()=>n.e(81414).then(n.bind(n,69585)),"@site/docs/040-backend/110-obsluga-emaili/010-przekierowywanie-emaili-przez-cloudflare.mdx",69585],"467bf746":[()=>n.e(85137).then(n.t.bind(n,91675,19)),"~docs/default/tag-tags-uptime-c86.json",91675],"46c87ad9":[()=>n.e(36822).then(n.bind(n,81528)),"@site/docs/010-podstawy/050-systemy-operacyjne/040-chrome-os.mdx",81528],"46d7704f":[()=>n.e(7625).then(n.bind(n,83542)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription.md",83542],"46dfeda4":[()=>n.e(2819).then(n.bind(n,61130)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode.md",61130],"47b051b7":[()=>n.e(6010).then(n.bind(n,29899)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/040-modyfikowanie-stanu-pojedynczych-elementow.mdx",29899],"47e1c281":[()=>n.e(2575).then(n.bind(n,75579)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode.md",75579],"4831cb31":[()=>Promise.all([n.e(40532),n.e(3473),n.e(39706)]).then(n.bind(n,46233)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/index.mdx",46233],"483304b7":[()=>n.e(61238).then(n.bind(n,7842)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode.md",7842],"486ea28d":[()=>Promise.all([n.e(40532),n.e(3473),n.e(76393)]).then(n.bind(n,50529)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/index.mdx",50529],"4871ccb0":[()=>n.e(9965).then(n.t.bind(n,10801,19)),"~docs/default/tag-tags-iaa-s-04d.json",10801],"4896f5b9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(73061)]).then(n.bind(n,7804)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/index.mdx",7804],"48f78a0f":[()=>n.e(37949).then(n.t.bind(n,40358,19)),"~docs/default/tag-tags-binary-ca4.json",40358],"4968a63a":[()=>n.e(71600).then(n.bind(n,55816)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode.md",55816],"49d00c1e":[()=>n.e(48070).then(n.bind(n,70453)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode.md",70453],"4a2ee408":[()=>n.e(23838).then(n.bind(n,45345)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription.md",45345],"4a3b31c2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(43164)]).then(n.bind(n,92851)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/index.mdx",92851],"4a9578c3":[()=>n.e(78411).then(n.bind(n,74226)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links.md",74226],"4aa65195":[()=>n.e(43042).then(n.bind(n,71124)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode.md",71124],"4b0b58c4":[()=>n.e(98348).then(n.bind(n,5423)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links.md",5423],"4b71967f":[()=>n.e(25357).then(n.bind(n,22378)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription.md",22378],"4b7b9211":[()=>Promise.all([n.e(40532),n.e(3473),n.e(30836)]).then(n.bind(n,3058)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/index.mdx",3058],"4bee98d3":[()=>n.e(60262).then(n.bind(n,59345)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links.md",59345],"4c337b15":[()=>Promise.all([n.e(40532),n.e(3473),n.e(21944)]).then(n.bind(n,13859)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/index.mdx",13859],"4c37a2f9":[()=>n.e(48363).then(n.t.bind(n,30835,19)),"~docs/default/tag-tags-cms-bee.json",30835],"4c9f1066":[()=>n.e(15797).then(n.bind(n,78446)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription.md",78446],"4ccefd11":[()=>n.e(68636).then(n.bind(n,54081)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links.md",54081],"4d60d2e9":[()=>n.e(99585).then(n.bind(n,71600)),"@site/docs/040-backend/000-projektowanie-backendu/index.mdx",71600],"4d98f1ea":[()=>n.e(5945).then(n.bind(n,71780)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode.md",71780],"4db381fd":[()=>Promise.all([n.e(40532),n.e(3473),n.e(76080)]).then(n.bind(n,29971)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/index.mdx",29971],"4dd85953":[()=>Promise.all([n.e(40532),n.e(3473),n.e(85269)]).then(n.bind(n,62601)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/index.mdx",62601],"4e05102b":[()=>n.e(95719).then(n.bind(n,67546)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription.md",67546],"4e7f9ab0":[()=>n.e(80360).then(n.t.bind(n,23424,19)),"~docs/default/tag-tags-tdd-ea2.json",23424],"4e84773e":[()=>n.e(42458).then(n.bind(n,34286)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription.md",34286],"4eaca2fe":[()=>n.e(25385).then(n.bind(n,77391)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription.md",77391],"4ee797cf":[()=>n.e(97207).then(n.t.bind(n,8378,19)),"~docs/default/tag-tags-ux-3b2.json",8378],"4efe941e":[()=>n.e(49096).then(n.bind(n,24788)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription.md",24788],"4f499110":[()=>n.e(8649).then(n.bind(n,39300)),"@site/docs/010-podstawy/180-bezpieczenstwo/index.mdx",39300],"4f4efa3d":[()=>n.e(41563).then(n.bind(n,83896)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links.md",83896],"4f5b3fa9":[()=>n.e(4013).then(n.bind(n,75164)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode.md",75164],"4fcc4f38":[()=>n.e(43342).then(n.bind(n,43434)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription.md",43434],"4fe941f7":[()=>n.e(17858).then(n.bind(n,97511)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links.md",97511],"4ff7731a":[()=>n.e(10449).then(n.bind(n,54061)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription.md",54061],"504f1ec6":[()=>n.e(45018).then(n.t.bind(n,73529,19)),"~docs/default/tag-tags-ram-9cc.json",73529],"50c21f40":[()=>n.e(89885).then(n.bind(n,86042)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode.md",86042],"50ee47cf":[()=>n.e(31485).then(n.bind(n,97593)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/050-tymczasowe-przechowywanie-zmian.mdx",97593],"51157f77":[()=>n.e(40605).then(n.bind(n,75116)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/060-hosting-aplikacji-w-serwisie-vercel.mdx",75116],"5151f759":[()=>n.e(35083).then(n.bind(n,83360)),"@site/docs/030-frontend/060-komponenty/index.mdx",83360],51535747:[()=>n.e(79187).then(n.t.bind(n,99866,19)),"~docs/default/tag-tags-algorytm-ebf.json",99866],"518c9791":[()=>n.e(83310).then(n.bind(n,76004)),"@site/docs/010-podstawy/220-praca-w-it/020-frontend-developer.mdx",76004],"51f9fdd3":[()=>n.e(24434).then(n.bind(n,6744)),"@site/docs/010-podstawy/120-hosting/index.mdx",6744],"522d4eee":[()=>n.e(62563).then(n.bind(n,94887)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription.md",94887],"52385b6d":[()=>n.e(78624).then(n.bind(n,99466)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode.md",99466],"5243faf5":[()=>Promise.all([n.e(40532),n.e(3473),n.e(98289)]).then(n.bind(n,75461)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/index.mdx",75461],"52916f6f":[()=>n.e(40843).then(n.bind(n,45260)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription.md",45260],"5299bf45":[()=>n.e(65956).then(n.bind(n,53549)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/310-schemat-dzialan-uzytkownika.mdx",53549],"531e550b":[()=>n.e(62331).then(n.bind(n,57039)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode.md",57039],"5346f0db":[()=>n.e(82989).then(n.bind(n,31716)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links.md",31716],"539fe6c4":[()=>n.e(1080).then(n.bind(n,73422)),"@site/src/pages/instagram.ts",73422],"53ca6561":[()=>n.e(42342).then(n.bind(n,47929)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription.md",47929],"5455a04e":[()=>n.e(37249).then(n.bind(n,87264)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription.md",87264],"54986be2":[()=>n.e(71515).then(n.bind(n,42914)),"@site/docs/020-ux-ui/010-projektowanie-vs-kodowanie.mdx",42914],"549e43c4":[()=>n.e(46632).then(n.bind(n,97478)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links.md",97478],"54d23b05":[()=>n.e(68598).then(n.bind(n,98901)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode.md",98901],"54d4bf9a":[()=>n.e(49256).then(n.bind(n,50001)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode.md",50001],"55960ee5":[()=>n.e(74121).then(n.t.bind(n,37245,19)),"~docs/default/tags-list-current-prop-15a.json",37245],"55a313fe":[()=>n.e(12433).then(n.t.bind(n,54354,19)),"~docs/default/tag-tags-mocha-a7e.json",54354],"5617f217":[()=>n.e(10656).then(n.bind(n,28108)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription.md",28108],"563166a9":[()=>n.e(31712).then(n.t.bind(n,17447,19)),"~docs/default/tag-tags-backend-b14.json",17447],"56ebfa9f":[()=>n.e(14765).then(n.bind(n,97926)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription.md",97926],"580578b2":[()=>n.e(18903).then(n.t.bind(n,23376,19)),"~docs/default/tag-tags-ssd-ed7.json",23376],"580d32c1":[()=>n.e(74539).then(n.bind(n,77143)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode.md",77143],"5818cd7c":[()=>n.e(22603).then(n.bind(n,34263)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode.md",34263],58341650:[()=>n.e(52629).then(n.t.bind(n,50658,19)),"~docs/default/tag-tags-cd-444.json",50658],"584b5ba5":[()=>n.e(34481).then(n.bind(n,17519)),"@site/src/pages/100-bugow-js/wypisanie.mdx",17519],"587c2fe9":[()=>n.e(58053).then(n.bind(n,9020)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription.md",9020],"5925d5cc":[()=>n.e(14954).then(n.bind(n,83969)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode.md",83969],"593ee81a":[()=>n.e(1835).then(n.bind(n,51346)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode.md",51346],"59a1c7d6":[()=>n.e(92237).then(n.bind(n,84219)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/080-podzial-plikow-konfiguracyjnych.mdx",84219],"59b32e70":[()=>n.e(96888).then(n.bind(n,55010)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription.md",55010],"59d2fa7f":[()=>n.e(22180).then(n.t.bind(n,91389,19)),"~docs/default/tag-tags-solr-b7e.json",91389],"59ea7eb4":[()=>n.e(44921).then(n.bind(n,97057)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode.md",97057],"59ffd614":[()=>n.e(12899).then(n.bind(n,59880)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/040-generowanie-pliku-html-z-szablonu.mdx",59880],"5a273cd6":[()=>n.e(38893).then(n.bind(n,68076)),"@site/docs/030-frontend/020-css/030-debugowanie-css-przez-narzedzia-developerskie.mdx",68076],"5a2a6530":[()=>n.e(31665).then(n.bind(n,8529)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode.md",8529],"5a2e7027":[()=>n.e(69531).then(n.t.bind(n,24480,19)),"~docs/default/tag-tags-rabbit-mq-14d.json",24480],"5a3e2929":[()=>n.e(55257).then(n.bind(n,64829)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links.md",64829],"5a5a80ab":[()=>Promise.all([n.e(40532),n.e(3473),n.e(96643)]).then(n.bind(n,6935)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/index.mdx",6935],"5a5db26c":[()=>n.e(30554).then(n.bind(n,80863)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links.md",80863],"5a9db848":[()=>n.e(13462).then(n.bind(n,47869)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode.md",47869],"5adcdf96":[()=>n.e(23914).then(n.t.bind(n,11230,19)),"~docs/default/tag-tags-big-o-cbf.json",11230],"5ae73cbf":[()=>Promise.all([n.e(40532),n.e(3473),n.e(69762)]).then(n.bind(n,21863)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/index.mdx",21863],"5b9a35db":[()=>n.e(76196).then(n.bind(n,12612)),"@site/docs/010-podstawy/010-sprzet-komputerowy/000-system-binarny/010-podstawy-systemu-binarnego.mdx",12612],"5c06b674":[()=>n.e(651).then(n.bind(n,13705)),"@site/docs/010-podstawy/060-jezyki-programowania/030-python.mdx",13705],"5c30c7a9":[()=>n.e(20116).then(n.bind(n,43858)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode.md",43858],"5c73be13":[()=>n.e(32736).then(n.t.bind(n,68013,19)),"~docs/default/tag-tags-memo-269.json",68013],"5d33ff88":[()=>n.e(67812).then(n.t.bind(n,68943,19)),"~docs/default/tag-tags-rest-863.json",68943],"5db77b44":[()=>n.e(99807).then(n.t.bind(n,87683,19)),"~docs/default/tag-tags-rx-js-54b.json",87683],"5e014a9c":[()=>n.e(15164).then(n.bind(n,85465)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode.md",85465],"5e27c3f6":[()=>n.e(33280).then(n.t.bind(n,85462,19)),"~docs/default/tag-tags-windows-817.json",85462],"5e2a3367":[()=>n.e(92162).then(n.bind(n,68629)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links.md",68629],"5e39e38e":[()=>n.e(54307).then(n.bind(n,11903)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode.md",11903],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"5f48632d":[()=>n.e(19374).then(n.t.bind(n,3911,19)),"~docs/default/tag-tags-integration-6e4.json",3911],"5f5b5355":[()=>Promise.all([n.e(40532),n.e(3473),n.e(85233)]).then(n.bind(n,20701)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/index.mdx",20701],"5f5bb4ac":[()=>n.e(45874).then(n.t.bind(n,39060,19)),"~docs/default/tag-tags-pay-u-329.json",39060],"5fe6d715":[()=>n.e(54680).then(n.bind(n,15792)),"@site/docs/010-podstawy/220-praca-w-it/index.mdx",15792],"5fea0253":[()=>n.e(8276).then(n.bind(n,45279)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode.md",45279],"601f3968":[()=>n.e(26235).then(n.bind(n,32808)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode.md",32808],"60709d59":[()=>n.e(18842).then(n.t.bind(n,86068,19)),"~docs/default/tag-tags-kernel-0ca.json",86068],"60c17965":[()=>n.e(44156).then(n.t.bind(n,84489,19)),"~docs/default/tag-tags-web-components-961.json",84489],"60ea458f":[()=>n.e(1404).then(n.bind(n,13973)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription.md",13973],"60ee9a2b":[()=>n.e(58613).then(n.bind(n,70512)),"@site/docs/010-podstawy/010-sprzet-komputerowy/index.mdx",70512],"6178c87f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(94878)]).then(n.bind(n,20508)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/index.mdx",20508],"61ae6399":[()=>n.e(56674).then(n.t.bind(n,44660,19)),"~docs/default/tag-tags-ssh-b02.json",44660],"61b4440e":[()=>n.e(76150).then(n.bind(n,72328)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription.md",72328],"6220a0fe":[()=>n.e(72189).then(n.t.bind(n,7906,19)),"~docs/default/tag-tags-next-js-b85.json",7906],"62239b99":[()=>n.e(4603).then(n.bind(n,65822)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription.md",65822],"62ab293b":[()=>n.e(40370).then(n.t.bind(n,5909,19)),"~docs/default/tag-tags-notification-61b.json",5909],"62e3e103":[()=>n.e(13310).then(n.bind(n,93971)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription.md",93971],"6375d944":[()=>n.e(48040).then(n.bind(n,94407)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode.md",94407],"6429ca61":[()=>n.e(24805).then(n.bind(n,77150)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode.md",77150],"64df448d":[()=>n.e(62072).then(n.bind(n,63874)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription.md",63874],"6553856a":[()=>n.e(73006).then(n.bind(n,83450)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription.md",83450],"660a9e4e":[()=>n.e(81573).then(n.bind(n,36431)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription.md",36431],"6673f904":[()=>n.e(33484).then(n.bind(n,36655)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription.md",36655],"66a81bdd":[()=>n.e(92532).then(n.bind(n,80548)),"@site/docs/030-frontend/010-html/040-obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji.mdx",80548],"66e4e730":[()=>n.e(65553).then(n.t.bind(n,32426,19)),"~docs/default/tag-tags-cloudflare-d8f.json",32426],"672b19fc":[()=>n.e(26782).then(n.t.bind(n,74119,19)),"~docs/default/tag-tags-i-o-001.json",74119],"679161de":[()=>n.e(40941).then(n.t.bind(n,83769,19)),"/home/runner/work/codisity.pl/codisity.pl/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],"679c6249":[()=>n.e(63206).then(n.bind(n,96845)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription.md",96845],"67c73e4e":[()=>Promise.all([n.e(40532),n.e(29139)]).then(n.bind(n,54617)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/index.mdx",54617],"6833bf4e":[()=>n.e(9591).then(n.bind(n,22466)),"@site/docs/010-podstawy/160-testowanie/020-przyklady-testow-jednostkowych-integracyjnych-i-e2e.mdx",22466],"684344f5":[()=>n.e(77168).then(n.bind(n,90471)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode.md",90471],"68679b62":[()=>n.e(84574).then(n.bind(n,3105)),"@site/docs/020-ux-ui/020-praktyczne-szkolenie-projektowania-ux-ui/020-material-uzupelniajacy-ui.mdx",3105],"68dd6750":[()=>n.e(67183).then(n.bind(n,76732)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription.md",76732],"697a838c":[()=>n.e(76569).then(n.bind(n,51284)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links.md",51284],"69cfb56e":[()=>n.e(92966).then(n.bind(n,87588)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription.md",87588],"6a184817":[()=>n.e(43109).then(n.bind(n,29259)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode.md",29259],"6a677fa0":[()=>n.e(33050).then(n.bind(n,31668)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription.md",31668],"6ab7799b":[()=>n.e(33466).then(n.bind(n,51374)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription.md",51374],"6b2ba85f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(32320)]).then(n.bind(n,58368)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/index.mdx",58368],"6b66f5c6":[()=>n.e(59218).then(n.bind(n,66241)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode.md",66241],"6be2343b":[()=>n.e(11118).then(n.bind(n,98809)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode.md",98809],"6d0f3166":[()=>n.e(7295).then(n.bind(n,91375)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode.md",91375],"6d948a43":[()=>n.e(33180).then(n.bind(n,5710)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links.md",5710],"6dc651c7":[()=>n.e(28393).then(n.bind(n,89510)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription.md",89510],"6dd24dad":[()=>n.e(39930).then(n.t.bind(n,44559,19)),"~docs/default/tag-tags-network-a82.json",44559],"6e53e527":[()=>n.e(36073).then(n.bind(n,2904)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription.md",2904],"6e7a2422":[()=>n.e(77542).then(n.bind(n,32747)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode.md",32747],"6e8ed2cc":[()=>n.e(5034).then(n.bind(n,5780)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode.md",5780],"6fd2e06c":[()=>n.e(62740).then(n.bind(n,2641)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription.md",2641],"7040b27e":[()=>n.e(6450).then(n.t.bind(n,30359,19)),"~docs/default/tag-tags-ide-fff.json",30359],"7080ced1":[()=>n.e(81024).then(n.bind(n,59181)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription.md",59181],"70b23246":[()=>n.e(84220).then(n.bind(n,50136)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode.md",50136],"70ba2e6f":[()=>n.e(98441).then(n.bind(n,54967)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode.md",54967],"710733d9":[()=>n.e(47108).then(n.t.bind(n,44586,19)),"~docs/default/tag-tags-git-hub-1c6.json",44586],"7184ccab":[()=>Promise.all([n.e(40532),n.e(3473),n.e(58870)]).then(n.bind(n,65578)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/index.mdx",65578],"7186fb88":[()=>n.e(98200).then(n.bind(n,61151)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode.md",61151],"7208d235":[()=>n.e(66790).then(n.bind(n,20994)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription.md",20994],"7233e7af":[()=>n.e(78071).then(n.bind(n,18892)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription.md",18892],"7249f594":[()=>n.e(39161).then(n.bind(n,93747)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode.md",93747],"72c7414d":[()=>n.e(73510).then(n.bind(n,98707)),"@site/docs/010-podstawy/160-testowanie/010-wprowadzenie-do-testowania.mdx",98707],"73579a94":[()=>n.e(71752).then(n.bind(n,58191)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links.md",58191],"735c401f":[()=>n.e(30957).then(n.t.bind(n,70499,19)),"~docs/default/tag-tags-jest-57c.json",70499],"73760c40":[()=>n.e(72111).then(n.bind(n,69805)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode.md",69805],"73ebfa5d":[()=>n.e(42015).then(n.t.bind(n,90766,19)),"~docs/default/tag-tags-res-tful-498.json",90766],"741bccd0":[()=>n.e(16333).then(n.bind(n,49555)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode.md",49555],"744fb43a":[()=>n.e(15068).then(n.bind(n,5842)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription.md",5842],"74b8c826":[()=>n.e(41546).then(n.bind(n,94837)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription.md",94837],"74d00b75":[()=>n.e(86440).then(n.bind(n,37913)),"@site/docs/010-podstawy/190-edytory-kodu/index.mdx",37913],"75ce0515":[()=>n.e(71652).then(n.bind(n,36319)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links.md",36319],"75f9ec1a":[()=>n.e(79505).then(n.bind(n,19481)),"@site/docs/040-backend/110-obsluga-emaili/index.mdx",19481],"75fb086c":[()=>n.e(30206).then(n.bind(n,68029)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription.md",68029],"75fdfa1a":[()=>Promise.all([n.e(40532),n.e(3473),n.e(94083)]).then(n.bind(n,91476)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/index.mdx",91476],"76cfe10a":[()=>n.e(43053).then(n.t.bind(n,42083,19)),"~docs/default/tag-tags-sql-e00.json",42083],"7709181b":[()=>n.e(48924).then(n.bind(n,4230)),"@site/docs/030-frontend/100-webassembly/index.mdx",4230],"77afab95":[()=>n.e(46394).then(n.bind(n,4422)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links.md",4422],78106965:[()=>n.e(7835).then(n.bind(n,82863)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode.md",82863],"7845ab9e":[()=>Promise.all([n.e(40532),n.e(3473),n.e(95076)]).then(n.bind(n,33668)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/index.mdx",33668],"786f8550":[()=>n.e(74604).then(n.bind(n,60814)),"@site/docs/040-backend/050-systemy-zarzadzania-trescia/index.mdx",60814],"7896f7be":[()=>n.e(41202).then(n.bind(n,74072)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode.md",74072],"78d92bfa":[()=>n.e(53766).then(n.bind(n,60898)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode.md",60898],"78dae5bb":[()=>n.e(73986).then(n.t.bind(n,38387,19)),"~docs/default/tag-tags-css-b35.json",38387],"79bb56d5":[()=>n.e(30095).then(n.bind(n,46160)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/050-tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian.mdx",46160],"79c07e2c":[()=>n.e(81080).then(n.bind(n,51578)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/120-zapoznanie-z-interfejsem.mdx",51578],"79db7ad8":[()=>n.e(75167).then(n.bind(n,76614)),"@site/docs/050-fullstack/040-websocket/index.mdx",76614],"79f9d31c":[()=>n.e(91502).then(n.bind(n,60402)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription.md",60402],"7a464885":[()=>n.e(4167).then(n.bind(n,53275)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode.md",53275],"7a877d9a":[()=>n.e(81117).then(n.bind(n,22471)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links.md",22471],"7ac739e8":[()=>n.e(21850).then(n.bind(n,28088)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription.md",28088],"7b21172a":[()=>Promise.all([n.e(40532),n.e(3473),n.e(27536)]).then(n.bind(n,6840)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/index.mdx",6840],"7b98acb0":[()=>n.e(94648).then(n.bind(n,23247)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/510-identyfikacja-marki.mdx",23247],"7be384e2":[()=>n.e(48694).then(n.t.bind(n,44667,19)),"~docs/default/tag-tags-cpu-994.json",44667],"7bfa9b50":[()=>n.e(45198).then(n.bind(n,878)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links.md",878],"7c03907c":[()=>n.e(42011).then(n.bind(n,93077)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode.md",93077],"7c59c602":[()=>n.e(64239).then(n.bind(n,30354)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription.md",30354],"7c6e5e1c":[()=>n.e(38649).then(n.t.bind(n,74323,19)),"~docs/default/tag-tags-reg-ex-ac7.json",74323],"7cef7700":[()=>n.e(1229).then(n.bind(n,74276)),"@site/docs/010-podstawy/070-kontrola-wersji/index.mdx",74276],"7cf8d78f":[()=>n.e(85532).then(n.t.bind(n,92505,19)),"~docs/default/tag-tags-orm-291.json",92505],"7cfb0829":[()=>n.e(21218).then(n.bind(n,35010)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode.md",35010],"7cfdd17e":[()=>n.e(50510).then(n.bind(n,8543)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/000-czym-jest-git.mdx",8543],"7dac982a":[()=>n.e(36669).then(n.bind(n,56758)),"@site/docs/010-podstawy/100-siec/index.mdx",56758],"7db916a2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(14642)]).then(n.bind(n,13086)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/index.mdx",13086],"7dbdef65":[()=>n.e(30364).then(n.bind(n,54182)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription.md",54182],"7df43df9":[()=>n.e(583).then(n.t.bind(n,15745,19)),"/home/runner/work/codisity.pl/codisity.pl/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],"7e02c3d2":[()=>n.e(30984).then(n.t.bind(n,44741,19)),"~docs/default/tag-tags-agile-21f.json",44741],"7e1c5dce":[()=>n.e(85061).then(n.bind(n,6535)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links.md",6535],"7f1f28b5":[()=>n.e(98777).then(n.bind(n,70967)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription.md",70967],"7f676b5b":[()=>n.e(50896).then(n.bind(n,5279)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription.md",5279],"7f8f93b5":[()=>n.e(82208).then(n.bind(n,69481)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode.md",69481],"800ca0ac":[()=>n.e(75586).then(n.bind(n,99125)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links.md",99125],"8021a7ed":[()=>n.e(60370).then(n.bind(n,52035)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription.md",52035],"8042f440":[()=>n.e(80100).then(n.bind(n,69707)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription.md",69707],"80773c5f":[()=>n.e(46758).then(n.bind(n,50106)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/060-etykietowanie.mdx",50106],"807f5b68":[()=>n.e(28341).then(n.bind(n,5649)),"@site/docs/010-podstawy/050-systemy-operacyjne/050-free-bsd.mdx",5649],"80db1fb6":[()=>n.e(72503).then(n.bind(n,8178)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/080-praca-z-graficznym-interfejsem-git-w-visual-studio-code.mdx",8178],"80dd8e85":[()=>Promise.all([n.e(40532),n.e(3473),n.e(41493)]).then(n.bind(n,38868)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/index.mdx",38868],"8183696c":[()=>Promise.all([n.e(40532),n.e(3473),n.e(40616)]).then(n.bind(n,37702)),"@site/src/pages/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/index.mdx",37702],"81e6c770":[()=>n.e(51228).then(n.bind(n,43548)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription.md",43548],"82230cb9":[()=>n.e(80969).then(n.bind(n,67561)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode.md",67561],"8263abbd":[()=>Promise.all([n.e(40532),n.e(3473),n.e(34411)]).then(n.bind(n,98311)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/index.mdx",98311],82697623:[()=>n.e(22849).then(n.t.bind(n,53542,19)),"~docs/default/tag-tags-owasp-786.json",53542],"8284ef15":[()=>n.e(64161).then(n.bind(n,74789)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription.md",74789],"82f0b858":[()=>n.e(20786).then(n.bind(n,58027)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode.md",58027],"8305d111":[()=>n.e(42502).then(n.bind(n,25324)),"@site/docs/010-podstawy/190-edytory-kodu/030-visual-studio-code.mdx",25324],"8308c780":[()=>n.e(66508).then(n.bind(n,69998)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription.md",69998],"833ee563":[()=>n.e(37985).then(n.bind(n,23280)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links.md",23280],"8346b090":[()=>Promise.all([n.e(40532),n.e(3473),n.e(13267)]).then(n.bind(n,18003)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/index.mdx",18003],"8395e663":[()=>n.e(93193).then(n.bind(n,83260)),"@site/docs/030-frontend/030-javascript/index.mdx",83260],"839ae7ca":[()=>n.e(71960).then(n.bind(n,64900)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription.md",64900],"83af2250":[()=>n.e(72904).then(n.bind(n,1476)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode.md",1476],"83c03d41":[()=>Promise.all([n.e(40532),n.e(3473),n.e(6692)]).then(n.bind(n,771)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/index.mdx",771],"846695b0":[()=>n.e(42143).then(n.t.bind(n,16147,19)),"~docs/default/tag-tags-full-stack-e27.json",16147],"8476ee46":[()=>n.e(59113).then(n.bind(n,57988)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode.md",57988],"8490af85":[()=>n.e(88319).then(n.bind(n,5309)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links.md",5309],84991166:[()=>n.e(33130).then(n.bind(n,52810)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/230-scenariusze-uzytkownika.mdx",52810],"84d56036":[()=>n.e(75532).then(n.bind(n,20965)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription.md",20965],85009468:[()=>Promise.all([n.e(40532),n.e(3473),n.e(12594)]).then(n.bind(n,16106)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/index.mdx",16106],"853f4a25":[()=>n.e(15868).then(n.bind(n,40217)),"@site/docs/010-podstawy/050-systemy-operacyjne/020-macos-i-ios.mdx",40217],"8549fb15":[()=>n.e(68403).then(n.bind(n,62202)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/050-system-kontroli-wersji-git-i-serwis-github.mdx",62202],"856338c3":[()=>n.e(31199).then(n.bind(n,93125)),"@site/docs/010-podstawy/040-programowanie/065-wyrazenia-regularne.mdx",93125],"8565875c":[()=>n.e(96522).then(n.bind(n,69386)),"@site/docs/010-podstawy/210-zarzadzanie-projektami/index.mdx",69386],85745110:[()=>n.e(95425).then(n.bind(n,91184)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/523-glebia.mdx",91184],"8611eaf4":[()=>n.e(60510).then(n.t.bind(n,697,19)),"~docs/default/tag-tags-bsd-8ff.json",697],"861289f9":[()=>Promise.all([n.e(40532),n.e(3473),n.e(44473)]).then(n.bind(n,66395)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/index.mdx",66395],"8699b075":[()=>Promise.all([n.e(40532),n.e(3473),n.e(7898)]).then(n.bind(n,17628)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/index.mdx",17628],"86a46ae2":[()=>Promise.all([n.e(40532),n.e(3473),n.e(42372)]).then(n.bind(n,11979)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/index.mdx",11979],"86cec129":[()=>n.e(42781).then(n.bind(n,18868)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription.md",18868],"86e14a43":[()=>n.e(52865).then(n.bind(n,5550)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode.md",5550],"86f4bfe5":[()=>n.e(36298).then(n.t.bind(n,27007,19)),"~docs/default/tag-tags-web-server-d49.json",27007],"884a095c":[()=>n.e(80867).then(n.bind(n,86708)),"@site/src/pages/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode.md",86708],"884f9af5":[()=>n.e(88725).then(n.bind(n,32058)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription.md",32058],"88bff478":[()=>n.e(95128).then(n.bind(n,70188)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode.md",70188],"88db79f1":[()=>n.e(19612).then(n.bind(n,76968)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode.md",76968],"88fd2dc3":[()=>n.e(81121).then(n.bind(n,47916)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription.md",47916],"892e0442":[()=>n.e(47965).then(n.bind(n,71014)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode.md",71014],"89507eba":[()=>n.e(62502).then(n.bind(n,28680)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription.md",28680],"896a5d99":[()=>Promise.all([n.e(40532),n.e(3473),n.e(60069)]).then(n.bind(n,52673)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/index.mdx",52673],"8a12ef4f":[()=>Promise.all([n.e(40532),n.e(3473),n.e(58658)]).then(n.bind(n,14773)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/index.mdx",14773],"8a20b002":[()=>n.e(65421).then(n.bind(n,41888)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription.md",41888],"8aae1625":[()=>n.e(17050).then(n.bind(n,32318)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription.md",32318],"8aedfca1":[()=>n.e(55227).then(n.bind(n,69116)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/010-podstawowy-sposob-uzycia.mdx",69116],"8b1c1229":[()=>n.e(29730).then(n.bind(n,33583)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/420-tresci-graficzne.mdx",33583],"8b1fddd5":[()=>n.e(55442).then(n.t.bind(n,53506,19)),"~docs/default/tag-tags-redux-7a5.json",53506],"8b4b867e":[()=>Promise.all([n.e(40532),n.e(3473),n.e(44894)]).then(n.bind(n,65482)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/index.mdx",65482],"8b4d77e3":[()=>n.e(90960).then(n.bind(n,52575)),"@site/docs/010-podstawy/040-programowanie/040-algorytmy.mdx",52575],"8b6b92b4":[()=>n.e(55147).then(n.bind(n,88631)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription.md",88631],"8bab4b8f":[()=>n.e(64999).then(n.bind(n,71159)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription.md",71159],"8bbfc048":[()=>n.e(5405).then(n.bind(n,74364)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode.md",74364],"8c0d6f34":[()=>n.e(96829).then(n.bind(n,27805)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode.md",27805],"8c15db71":[()=>n.e(61056).then(n.bind(n,24445)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription.md",24445],"8c8f2acd":[()=>n.e(49713).then(n.bind(n,67680)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/070-praca-ze-zdalnym-repozytorium-github.mdx",67680],"8cebce07":[()=>Promise.all([n.e(40532),n.e(3473),n.e(49702)]).then(n.bind(n,35611)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/index.mdx",35611],"8d3ec686":[()=>n.e(21364).then(n.bind(n,55922)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription.md",55922],"8d63b9c8":[()=>n.e(29670).then(n.bind(n,63026)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription.md",63026],"8d790c4a":[()=>n.e(49071).then(n.bind(n,69985)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription.md",69985],"8d9cee02":[()=>n.e(16223).then(n.t.bind(n,25419,19)),"~docs/default/tag-tags-przelewy-24-27f.json",25419],"8db32de2":[()=>n.e(85769).then(n.t.bind(n,31708,19)),"~docs/default/tag-tags-ftp-119.json",31708],"8dc38c34":[()=>n.e(96851).then(n.t.bind(n,2958,19)),"~docs/default/tag-tags-type-script-50e.json",2958],"8de46d05":[()=>n.e(46422).then(n.bind(n,25669)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode.md",25669],"8e3c8fab":[()=>n.e(33991).then(n.bind(n,50290)),"@site/docs/050-fullstack/050-bramki-platnicze/index.mdx",50290],"8e7dd0aa":[()=>n.e(78126).then(n.bind(n,83632)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription.md",83632],"8f3da505":[()=>n.e(68526).then(n.bind(n,74233)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links.md",74233],"8f51add7":[()=>n.e(52828).then(n.bind(n,68426)),"@site/docs/010-podstawy/020-warstwy-abstrakcji/index.mdx",68426],"8f5b0fd5":[()=>n.e(51374).then(n.bind(n,27986)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links.md",27986],"8f6cb3fb":[()=>Promise.all([n.e(40532),n.e(3473),n.e(52237)]).then(n.bind(n,11606)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/index.mdx",11606],"8f828573":[()=>n.e(95618).then(n.bind(n,15613)),"@site/docs/030-frontend/030-javascript/050-automatyzacja-zadan-w-przegladarce-z-js.mdx",15613],"900d8e3a":[()=>n.e(26625).then(n.t.bind(n,36340,19)),"~docs/default/tag-tags-vercel-b92.json",36340],"900fb64b":[()=>n.e(59814).then(n.t.bind(n,34579,19)),"~docs/default/tag-tags-jasmine-1ba.json",34579],"9045d99b":[()=>n.e(60198).then(n.bind(n,51025)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription.md",51025],"90ef3553":[()=>n.e(44288).then(n.t.bind(n,16741,19)),"~docs/default/tag-tags-dns-50e.json",16741],"910c4c34":[()=>n.e(62736).then(n.bind(n,40861)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription.md",40861],"912a0ee3":[()=>n.e(99387).then(n.bind(n,81106)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription.md",81106],"917ba351":[()=>n.e(41283).then(n.bind(n,5838)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription.md",5838],"9192dbe6":[()=>n.e(34944).then(n.bind(n,62265)),"@site/docs/040-backend/080-ciagla-integracja-i-wdrazanie/index.mdx",62265],"91d624fa":[()=>n.e(17348).then(n.bind(n,61302)),"@site/docs/010-podstawy/220-praca-w-it/040-devops-qa-i-inne.mdx",61302],"91e0e43e":[()=>n.e(78296).then(n.bind(n,43454)),"@site/docs/040-backend/070-wirtualizacja-i-konteneryzacja/index.mdx",43454],"91f13cf4":[()=>n.e(76097).then(n.bind(n,2931)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode.md",2931],"9233eaff":[()=>n.e(74125).then(n.t.bind(n,62386,19)),"~docs/default/tag-tags-svg-31d.json",62386],"923b862e":[()=>n.e(71735).then(n.bind(n,11494)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription.md",11494],"9262547b":[()=>n.e(85819).then(n.t.bind(n,38457,19)),"~docs/default/tag-tags-stripe-9c8.json",38457],"92afe74c":[()=>n.e(27852).then(n.bind(n,53150)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/070-inne-serwisy-hostingowe-i-cloud-development.mdx",53150],"935f2afb":[()=>n.e(80053).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"937d2e3a":[()=>n.e(82414).then(n.t.bind(n,75045,19)),"~docs/default/tag-tags-html-9c5.json",75045],"93e41b29":[()=>n.e(91411).then(n.bind(n,16926)),"@site/src/pages/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription.md",16926],"93fa8556":[()=>n.e(47270).then(n.bind(n,46794)),"@site/docs/010-podstawy/060-jezyki-programowania/040-javascript.mdx",46794],"945fd741":[()=>n.e(84523).then(n.bind(n,8927)),"@site/src/pages/github.ts",8927],"94a69d92":[()=>n.e(48081).then(n.bind(n,63195)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/020-plik-konfiguracyjny.mdx",63195],"94fb7192":[()=>n.e(8025).then(n.bind(n,31568)),"@site/docs/030-frontend/020-css/010-wprowadzenie-w-css.mdx",31568],95240878:[()=>n.e(30717).then(n.t.bind(n,25638,19)),"~docs/default/tag-tags-lucene-244.json",25638],95356112:[()=>n.e(27571).then(n.bind(n,78730)),"@site/docs/040-backend/030-api-zaplecza/index.mdx",78730],"9551079d":[()=>n.e(64680).then(n.bind(n,3893)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links.md",3893],"957af57a":[()=>n.e(21320).then(n.bind(n,27542)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode.md",27542],"957d840c":[()=>Promise.all([n.e(40532),n.e(3473),n.e(51029)]).then(n.bind(n,38067)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/index.mdx",38067],"95b7f57f":[()=>n.e(93693).then(n.bind(n,46550)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode.md",46550],"95f84dda":[()=>n.e(81078).then(n.bind(n,70014)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode.md",70014],"961f392b":[()=>n.e(3272).then(n.bind(n,40408)),"@site/docs/010-podstawy/050-systemy-operacyjne/010-linux.mdx",40408],"96387deb":[()=>n.e(61590).then(n.t.bind(n,76562,19)),"~docs/default/tag-tags-designer-847.json",76562],"967d3173":[()=>n.e(24242).then(n.bind(n,28520)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription.md",28520],"96a923ee":[()=>n.e(43775).then(n.bind(n,6016)),"@site/docs/050-fullstack/010-autentykacja-i-autoryzacja/010-implementacja-autentykacji/030-logowanie.mdx",6016],"96b173c7":[()=>n.e(95610).then(n.bind(n,42227)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription.md",42227],"96c4889e":[()=>n.e(57880).then(n.bind(n,59476)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode.md",59476],"970793ad":[()=>n.e(99302).then(n.bind(n,10144)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode.md",10144],"975faa6f":[()=>n.e(22708).then(n.t.bind(n,94251,19)),"~docs/default/tag-tags-push-987.json",94251],"97aa5688":[()=>n.e(71887).then(n.bind(n,2458)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links.md",2458],"97c2df57":[()=>n.e(92577).then(n.t.bind(n,251,19)),"~docs/default/tag-tags-testing-library-d59.json",251],"97d74462":[()=>n.e(24471).then(n.bind(n,62859)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode.md",62859],"9835bd28":[()=>n.e(89699).then(n.t.bind(n,19409,19)),"~docs/default/tag-tags-pagination-e52.json",19409],"98ac5f78":[()=>n.e(30482).then(n.bind(n,74164)),"@site/docs/040-backend/060-serwery-internetowe/index.mdx",74164],"98f5acd1":[()=>n.e(91557).then(n.bind(n,61477)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription.md",61477],"9922a044":[()=>Promise.all([n.e(40532),n.e(3473),n.e(50286)]).then(n.bind(n,43005)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/index.mdx",43005],99431438:[()=>n.e(62691).then(n.bind(n,67855)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode.md",67855],"9a4c7541":[()=>n.e(26655).then(n.t.bind(n,55073,19)),"~docs/default/tag-tags-scss-cc5.json",55073],"9a4f33c7":[()=>n.e(74591).then(n.bind(n,57508)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode.md",57508],"9abc15c5":[()=>n.e(52306).then(n.bind(n,39988)),"@site/src/pages/twitter.ts",39988],"9c1e0711":[()=>n.e(76222).then(n.bind(n,43894)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode.md",43894],"9c2f9d25":[()=>n.e(62e3).then(n.bind(n,63287)),"@site/docs/030-frontend/010-html/index.mdx",63287],"9c4eca3e":[()=>n.e(71706).then(n.t.bind(n,45598,19)),"~docs/default/tag-tags-elasticsearch-a27.json",45598],"9cce491e":[()=>n.e(61378).then(n.bind(n,58045)),"@site/src/pages/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode.md",58045],"9ccf750f":[()=>n.e(36821).then(n.bind(n,72242)),"@site/docs/010-podstawy/170-debugowanie/index.mdx",72242],"9cfa293c":[()=>n.e(65142).then(n.bind(n,2983)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode.md",2983],"9d0e2c8d":[()=>n.e(58197).then(n.bind(n,61014)),"@site/src/pages/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription.md",61014],"9d94b6e3":[()=>n.e(157).then(n.bind(n,87047)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription.md",87047],"9db9b169":[()=>n.e(82026).then(n.t.bind(n,68485,19)),"~docs/default/tag-tags-e-2-e-823.json",68485],"9df91c1b":[()=>n.e(32996).then(n.bind(n,87322)),"@site/src/pages/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links.md",87322],"9e1dcc0e":[()=>n.e(22465).then(n.t.bind(n,49491,19)),"~docs/default/tag-tags-prettier-d95.json",49491],"9e978b7a":[()=>n.e(13651).then(n.bind(n,7907)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription.md",7907],"9e9a17b9":[()=>n.e(10462).then(n.t.bind(n,22160,19)),"~docs/default/tag-tags-ui-85c.json",22160],"9ea02cba":[()=>Promise.all([n.e(40532),n.e(3473),n.e(92441)]).then(n.bind(n,50700)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/index.mdx",50700],"9ecc835d":[()=>n.e(21623).then(n.bind(n,23578)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links.md",23578],"9ed914e7":[()=>n.e(41900).then(n.bind(n,36022)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links.md",36022],"9ede2c0e":[()=>n.e(75995).then(n.bind(n,40676)),"@site/docs/010-podstawy/040-programowanie/010-api.mdx",40676],"9f10ee4f":[()=>n.e(6205).then(n.bind(n,44204)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links.md",44204],"9f1a3f2d":[()=>n.e(3139).then(n.bind(n,85760)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription.md",85760],"9f37913d":[()=>n.e(74314).then(n.bind(n,9314)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription.md",9314],"9f803798":[()=>n.e(74609).then(n.t.bind(n,57092,19)),"~docs/default/tag-tags-docker-3d3.json",57092],"9fb36306":[()=>n.e(29888).then(n.bind(n,26191)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/040-korzystanie-z-bazy-danych-mongodb-i-prismy.mdx",26191],"9fe94d36":[()=>n.e(11764).then(n.bind(n,58673)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode.md",58673],"9ff70e8d":[()=>n.e(9094).then(n.bind(n,53603)),"@site/docs/010-podstawy/050-systemy-operacyjne/030-windows.mdx",53603],a0420386:[()=>n.e(98050).then(n.bind(n,43182)),"@site/docs/020-ux-ui/030-czy-do-zostania-designerem-ux-ui-potrzeba-10000-godzin.mdx",43182],a04ecd15:[()=>n.e(3721).then(n.bind(n,89868)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links.md",89868],a0c01147:[()=>n.e(46098).then(n.t.bind(n,46583,19)),"~docs/default/tag-tags-microsoft-3fb.json",46583],a0d9dc55:[()=>n.e(16940).then(n.bind(n,60174)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links.md",60174],a11c5b80:[()=>n.e(59949).then(n.bind(n,97079)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links.md",97079],a1c5878a:[()=>n.e(46991).then(n.bind(n,27958)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription.md",27958],a1e6e3bf:[()=>n.e(98890).then(n.bind(n,74214)),"@site/docs/010-podstawy/000-informatyka/index.mdx",74214],a295d51b:[()=>n.e(4134).then(n.bind(n,72751)),"@site/docs/010-podstawy/080-haszowanie/index.mdx",72751],a2ae1405:[()=>n.e(48762).then(n.bind(n,48045)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription.md",48045],a307b126:[()=>n.e(57575).then(n.bind(n,49162)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode.md",49162],a3689074:[()=>n.e(24075).then(n.bind(n,54748)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links.md",54748],a38548f8:[()=>n.e(57907).then(n.t.bind(n,71816,19)),"~docs/default/tag-tags-performance-877.json",71816],a3e8885c:[()=>n.e(51840).then(n.t.bind(n,97305,19)),"~docs/default/tag-tags-i-os-b3f.json",97305],a477f3e1:[()=>n.e(17234).then(n.t.bind(n,66568,19)),"~docs/default/tag-tags-internet-0e8.json",66568],a4dc21c3:[()=>n.e(68987).then(n.bind(n,21145)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links.md",21145],a5352ad5:[()=>n.e(79445).then(n.bind(n,78641)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode.md",78641],a53608ef:[()=>n.e(33177).then(n.bind(n,27870)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription.md",27870],a548a292:[()=>n.e(90885).then(n.bind(n,33568)),"@site/docs/050-fullstack/010-autentykacja-i-autoryzacja/010-implementacja-autentykacji/020-rejestracja.mdx",33568],a5bcb468:[()=>n.e(50944).then(n.bind(n,64257)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode.md",64257],a60499a2:[()=>n.e(35900).then(n.bind(n,46795)),"@site/docs/010-podstawy/030-aplikacje/index.mdx",46795],a68fff77:[()=>n.e(58113).then(n.bind(n,9012)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/020-podrozowanie-w-czasie.mdx",9012],a6d26d5d:[()=>n.e(4747).then(n.bind(n,44170)),"@site/docs/030-frontend/035-react/index.mdx",44170],a6dd96ff:[()=>Promise.all([n.e(40532),n.e(69203)]).then(n.bind(n,70157)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/index.mdx",70157],a79cfbf2:[()=>n.e(15034).then(n.bind(n,49163)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/521-dostosowanie-typografii-i-kolorow.mdx",49163],a8d6ad3d:[()=>n.e(4152).then(n.bind(n,59481)),"@site/docs/010-podstawy/120-hosting/020-serwuj-strony-internetowe-z-twojego-komputera copy.mdx",59481],a8fc05df:[()=>n.e(41232).then(n.bind(n,98739)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode.md",98739],a945daee:[()=>Promise.all([n.e(40532),n.e(3473),n.e(28584)]).then(n.bind(n,86332)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/index.mdx",86332],a96b0693:[()=>n.e(61267).then(n.bind(n,25112)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode.md",25112],a97c0255:[()=>n.e(96544).then(n.bind(n,96202)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links.md",96202],a9863ec3:[()=>n.e(33291).then(n.bind(n,40199)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links.md",40199],a989a199:[()=>n.e(85397).then(n.bind(n,69874)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode.md",69874],a99ff4f5:[()=>n.e(27080).then(n.bind(n,1402)),"@site/src/pages/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode.md",1402],a9e2a5f5:[()=>n.e(33577).then(n.bind(n,12242)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode.md",12242],aa23cbb1:[()=>n.e(36662).then(n.bind(n,83068)),"@site/src/pages/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription.md",83068],ab068eac:[()=>n.e(29544).then(n.bind(n,2537)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode.md",2537],ab3ac259:[()=>n.e(42349).then(n.bind(n,61388)),"@site/docs/030-frontend/110-aplikacje-mobilne/index.mdx",61388],ab6ff148:[()=>n.e(85382).then(n.bind(n,23533)),"@site/docs/030-frontend/020-css/index.mdx",23533],ab72c14f:[()=>n.e(30516).then(n.bind(n,19634)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription.md",19634],ab98e4e2:[()=>n.e(83245).then(n.bind(n,88923)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode.md",88923],ac0ce67e:[()=>n.e(60921).then(n.bind(n,92201)),"@site/src/pages/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription.md",92201],aca457c3:[()=>n.e(26390).then(n.t.bind(n,99724,19)),"~docs/default/tag-tags-tailwind-css-279.json",99724],acebbe6f:[()=>n.e(21646).then(n.bind(n,7966)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links.md",7966],ad0b0ce2:[()=>n.e(24128).then(n.t.bind(n,65786,19)),"~docs/default/tag-tags-webpack-137.json",65786],ada0e0fd:[()=>n.e(34540).then(n.t.bind(n,58896,19)),"~docs/default/tag-tags-web-socket-6fb.json",58896],ada3cb0c:[()=>n.e(25456).then(n.bind(n,53448)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode.md",53448],ae04b98c:[()=>n.e(25595).then(n.t.bind(n,28,19)),"~docs/default/tag-tags-chrome-798.json",28],aef2cd7d:[()=>n.e(99059).then(n.bind(n,68621)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode.md",68621],afa54125:[()=>n.e(57483).then(n.bind(n,20912)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/332-projektowanie-szkieletu.mdx",20912],afe2f6b5:[()=>n.e(97219).then(n.bind(n,30121)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode.md",30121],b0131d81:[()=>n.e(28746).then(n.t.bind(n,16277,19)),"~docs/default/tag-tags-ip-378.json",16277],b046cce8:[()=>n.e(6545).then(n.t.bind(n,45626,19)),"~docs/default/tag-tags-ddd-3be.json",45626],b05437ef:[()=>n.e(59777).then(n.t.bind(n,49680,19)),"~docs/default/tag-tags-hash-a2c.json",49680],b073d7cd:[()=>n.e(52499).then(n.t.bind(n,76140,19)),"~docs/default/tag-tags-pwa-4bc.json",76140],b0973ba4:[()=>n.e(45989).then(n.bind(n,11102)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links.md",11102],b12b33e9:[()=>Promise.all([n.e(40532),n.e(3473),n.e(68345)]).then(n.bind(n,87387)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/index.mdx",87387],b1698e34:[()=>n.e(89675).then(n.bind(n,54073)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode.md",54073],b1ba4cc6:[()=>n.e(25505).then(n.bind(n,94642)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode.md",94642],b1e87bbd:[()=>n.e(94747).then(n.t.bind(n,81975,19)),"~docs/default/tag-tags-prism-24e.json",81975],b218f480:[()=>n.e(56755).then(n.bind(n,42654)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links.md",42654],b2383198:[()=>n.e(65310).then(n.bind(n,97799)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription.md",97799],b2383bc8:[()=>Promise.all([n.e(40532),n.e(3473),n.e(72803)]).then(n.bind(n,12721)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/index.mdx",12721],b2cc28ad:[()=>n.e(8554).then(n.bind(n,93564)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription.md",93564],b2cf6952:[()=>n.e(7995).then(n.t.bind(n,66932,19)),"~docs/default/tag-tags-es-lint-238.json",66932],b2ea0aa3:[()=>n.e(82366).then(n.bind(n,36535)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription.md",36535],b31218dc:[()=>n.e(62280).then(n.bind(n,32367)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode.md",32367],b33c6ef0:[()=>n.e(61062).then(n.bind(n,41996)),"@site/docs/030-frontend/030-javascript/010-podstawy-javascript.mdx",41996],b35a5c8f:[()=>n.e(82785).then(n.t.bind(n,9845,19)),"~docs/default/tag-tags-npm-5d7.json",9845],b3b31dba:[()=>n.e(90626).then(n.t.bind(n,65437,19)),"~docs/default/tag-tags-mac-os-759.json",65437],b471f1aa:[()=>n.e(85326).then(n.bind(n,6754)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links.md",6754],b4839aa5:[()=>n.e(46650).then(n.bind(n,74015)),"@site/src/pages/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription.md",74015],b49b0f90:[()=>n.e(72087).then(n.bind(n,73244)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode.md",73244],b4ca7cd2:[()=>n.e(47128).then(n.bind(n,88802)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription.md",88802],b5f07768:[()=>n.e(82969).then(n.bind(n,95586)),"@site/src/pages/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription.md",95586],b6052b98:[()=>n.e(77518).then(n.bind(n,99565)),"@site/src/pages/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription.md",99565],b6264fc3:[()=>n.e(91995).then(n.bind(n,64856)),"@site/docs/030-frontend/010-html/020-rdzen-metadane-sekcje.mdx",64856],b651fca4:[()=>n.e(31289).then(n.bind(n,87995)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription.md",87995],b67bb9f8:[()=>n.e(92534).then(n.bind(n,10035)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode.md",10035],b766ccfd:[()=>n.e(56039).then(n.bind(n,2917)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links.md",2917],b76a165a:[()=>n.e(24293).then(n.t.bind(n,1906,19)),"~docs/default/tag-tags-react-5c0.json",1906],b773aa83:[()=>n.e(75035).then(n.bind(n,84893)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links.md",84893],b83483c6:[()=>n.e(95923).then(n.bind(n,88617)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode.md",88617],b85753b3:[()=>n.e(60299).then(n.bind(n,1395)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription.md",1395],b8c25d76:[()=>n.e(3354).then(n.bind(n,20921)),"@site/docs/010-podstawy/160-testowanie/index.mdx",20921],b92b9e7e:[()=>n.e(31022).then(n.bind(n,18453)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/524-dostosowanie-ilustracji.mdx",18453],b9c437a8:[()=>n.e(36248).then(n.bind(n,12212)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode.md",12212],b9c8e7c7:[()=>n.e(4259).then(n.bind(n,72353)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription.md",72353],ba33c47c:[()=>n.e(30061).then(n.bind(n,289)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links.md",289],ba3d1627:[()=>n.e(83743).then(n.bind(n,79917)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription.md",79917],ba412cf9:[()=>n.e(23716).then(n.bind(n,13115)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription.md",13115],ba6b2fd9:[()=>n.e(18678).then(n.bind(n,69446)),"@site/docs/030-frontend/010-html/050-tabele-formularze-elementy-interaktywne-komponenty.mdx",69446],bb0d8f28:[()=>n.e(39849).then(n.bind(n,7486)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/030-obsluga-formularza-i-api.mdx",7486],bbc80a75:[()=>n.e(15734).then(n.bind(n,54458)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode.md",54458],bc8dc425:[()=>n.e(7482).then(n.bind(n,46105)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription.md",46105],bcd37ac2:[()=>n.e(62090).then(n.bind(n,19821)),"@site/src/pages/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription.md",19821],bcd70e60:[()=>Promise.all([n.e(40532),n.e(3473),n.e(48587)]).then(n.bind(n,53737)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/index.mdx",53737],bcfe4bdc:[()=>Promise.all([n.e(40532),n.e(3473),n.e(96771)]).then(n.bind(n,12625)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/index.mdx",12625],bd5d6b23:[()=>n.e(51566).then(n.bind(n,54753)),"@site/docs/010-podstawy/130-dokumentacje/index.mdx",54753],bd5e77a8:[()=>n.e(42497).then(n.bind(n,40891)),"@site/src/pages/discord.ts",40891],bd786b82:[()=>Promise.all([n.e(40532),n.e(3473),n.e(79944)]).then(n.bind(n,35244)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/index.mdx",35244],bd840618:[()=>n.e(9753).then(n.bind(n,79701)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription.md",79701],bd8f4b90:[()=>n.e(90419).then(n.t.bind(n,43775,19)),"~docs/default/tag-tags-tpay-1b6.json",43775],bd9b6c5d:[()=>n.e(67471).then(n.t.bind(n,63238,19)),"~docs/default/tag-tags-state-d01.json",63238],bdddc7f5:[()=>n.e(92974).then(n.bind(n,49709)),"@site/src/pages/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription.md",49709],be531671:[()=>n.e(71524).then(n.bind(n,52164)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/010-instalacja.mdx",52164],be5bae9f:[()=>n.e(39979).then(n.bind(n,70719)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode.md",70719],be6c48cf:[()=>n.e(7233).then(n.bind(n,92075)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode.md",92075],be76e3a2:[()=>Promise.all([n.e(40532),n.e(3473),n.e(5616)]).then(n.bind(n,74906)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/index.mdx",74906],beaaf399:[()=>n.e(56130).then(n.bind(n,99269)),"@site/docs/010-podstawy/040-programowanie/index.mdx",99269],bee2906b:[()=>n.e(80161).then(n.bind(n,86569)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription.md",86569],bf0bae1a:[()=>n.e(65769).then(n.bind(n,90595)),"@site/src/pages/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription.md",90595],bf6af72d:[()=>n.e(37179).then(n.bind(n,61506)),"@site/src/pages/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription.md",61506],bf6db502:[()=>n.e(18268).then(n.bind(n,15341)),"@site/src/pages/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links.md",15341],bf8cb3eb:[()=>n.e(46645).then(n.t.bind(n,16922,19)),"~docs/default/tag-tags-linux-d59.json",16922],c007ecfe:[()=>n.e(45391).then(n.bind(n,2399)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode.md",2399],c10819ce:[()=>n.e(40583).then(n.bind(n,78483)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode.md",78483],c11e4322:[()=>n.e(30544).then(n.bind(n,59238)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links.md",59238],c188cb46:[()=>n.e(94117).then(n.bind(n,12338)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription.md",12338],c229b3fd:[()=>n.e(41244).then(n.bind(n,73681)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links.md",73681],c2b14adf:[()=>n.e(5796).then(n.bind(n,68825)),"@site/src/pages/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode.md",68825],c2be12b7:[()=>n.e(38863).then(n.bind(n,80559)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription.md",80559],c392861d:[()=>n.e(62562).then(n.bind(n,53543)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode.md",53543],c3b45d2c:[()=>n.e(64402).then(n.bind(n,37138)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription.md",37138],c3c2bd6c:[()=>n.e(81679).then(n.bind(n,20304)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription.md",20304],c3d20e95:[()=>Promise.all([n.e(40532),n.e(91952)]).then(n.bind(n,89954)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/010-webpack-4/index.mdx",89954],c3df5564:[()=>n.e(28023).then(n.bind(n,4259)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription.md",4259],c40960da:[()=>n.e(8484).then(n.bind(n,59313)),"@site/docs/030-frontend/070-pakiety-i-pakowarki/index.mdx",59313],c4a79712:[()=>n.e(1690).then(n.bind(n,68247)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription.md",68247],c5132abf:[()=>n.e(3826).then(n.bind(n,26388)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode.md",26388],c56402d8:[()=>n.e(64401).then(n.bind(n,244)),"@site/src/pages/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription.md",244],c63f55d5:[()=>n.e(82164).then(n.t.bind(n,16336,19)),"~docs/default/tag-tags-accessibility-874.json",16336],c673fddf:[()=>n.e(47115).then(n.bind(n,30849)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription.md",30849],c675cfeb:[()=>Promise.all([n.e(40532),n.e(3473),n.e(68148)]).then(n.bind(n,35677)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/index.mdx",35677],c6b42185:[()=>n.e(55418).then(n.bind(n,34694)),"@site/docs/030-frontend/025-svg/index.mdx",34694],c7855b86:[()=>n.e(46706).then(n.t.bind(n,9451,19)),"~docs/default/tag-tags-google-4d3.json",9451],c7cb25dc:[()=>n.e(76938).then(n.bind(n,88628)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links.md",88628],c7e62bb4:[()=>n.e(85830).then(n.bind(n,13668)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links.md",13668],c8291d21:[()=>Promise.all([n.e(40532),n.e(21059)]).then(n.bind(n,45385)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/index.mdx",45385],c9135948:[()=>n.e(1656).then(n.bind(n,96795)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links.md",96795],c924a973:[()=>n.e(18657).then(n.bind(n,61804)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode.md",61804],c925c4b1:[()=>n.e(77492).then(n.bind(n,76965)),"@site/docs/030-frontend/030-javascript/040-trawersowanie-drzewa-w-javascript-zadanie-rekrutacyjne.mdx",76965],c92adadf:[()=>n.e(6069).then(n.bind(n,4275)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/030-modyfikowanie-stanu-magazynu.mdx",4275],c9805ddd:[()=>n.e(41571).then(n.bind(n,11702)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/220-persona-uzytkownika.mdx",11702],c9c056cc:[()=>n.e(904).then(n.bind(n,19547)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription.md",19547],c9c54e87:[()=>n.e(89914).then(n.bind(n,99576)),"@site/src/pages/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription.md",99576],ca646102:[()=>n.e(26040).then(n.bind(n,50085)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links.md",50085],ca6f906e:[()=>n.e(54818).then(n.bind(n,63974)),"@site/src/pages/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription.md",63974],cac3cb0c:[()=>n.e(55217).then(n.t.bind(n,50045,19)),"~docs/default/tag-tags-http-1d4.json",50045],cacf64d3:[()=>n.e(30368).then(n.bind(n,96080)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links.md",96080],caf4b0ca:[()=>n.e(72951).then(n.bind(n,11141)),"@site/docs/050-fullstack/010-autentykacja-i-autoryzacja/010-implementacja-autentykacji/010-projekt-systemu-uwierzytelniania.mdx",11141],cb12a0f1:[()=>n.e(34123).then(n.bind(n,44491)),"@site/src/pages/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode.md",44491],cb2433f7:[()=>Promise.all([n.e(40532),n.e(3473),n.e(7015)]).then(n.bind(n,9311)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/index.mdx",9311],cb2834e6:[()=>n.e(4005).then(n.t.bind(n,95063,19)),"~docs/default/tag-tags-graph-ql-120.json",95063],cb50e0fd:[()=>n.e(31106).then(n.bind(n,78105)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode.md",78105],cbb3be21:[()=>n.e(40607).then(n.bind(n,97326)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/525-rozmieszczenie-grafik.mdx",97326],cbb989e8:[()=>n.e(15115).then(n.t.bind(n,46572,19)),"~docs/default/tag-tags-testing-974.json",46572],cbf62edd:[()=>n.e(97188).then(n.bind(n,55038)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/020-stworzenie-strony-glownej.mdx",55038],cbfa5c34:[()=>Promise.all([n.e(40532),n.e(3473),n.e(61126)]).then(n.bind(n,66599)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/index.mdx",66599],cc8d6db7:[()=>n.e(44365).then(n.t.bind(n,62065,19)),"~docs/default/tag-tags-sass-96e.json",62065],cc9c3941:[()=>n.e(95541).then(n.bind(n,49059)),"@site/docs/010-podstawy/040-programowanie/030-paradygmaty-programowania.mdx",49059],ccc4640b:[()=>n.e(11146).then(n.bind(n,75099)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links.md",75099],ccc500fc:[()=>n.e(56307).then(n.bind(n,54988)),"@site/docs/010-podstawy/220-praca-w-it/010-ux-ui-designer.mdx",54988],cd327e74:[()=>Promise.all([n.e(40532),n.e(3473),n.e(27620)]).then(n.bind(n,93021)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/index.mdx",93021],cd35f088:[()=>n.e(97637).then(n.bind(n,41807)),"@site/src/pages/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription.md",41807],cd3ad747:[()=>n.e(4423).then(n.bind(n,43070)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode.md",43070],cd706f04:[()=>n.e(73225).then(n.bind(n,22732)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/020-koncept-dzialania-redux-a.mdx",22732],cd894699:[()=>Promise.all([n.e(40532),n.e(3473),n.e(56883)]).then(n.bind(n,85948)),"@site/src/pages/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/index.mdx",85948],ce35f5d9:[()=>n.e(98525).then(n.bind(n,48885)),"@site/docs/010-podstawy/040-programowanie/050-struktury-i-bazy-danych.mdx",48885],ce61bece:[()=>n.e(56168).then(n.bind(n,27446)),"@site/docs/030-frontend/080-zarzadzanie-stanem/020-podstawy-reduxa/070-laczenie-reduktorow.mdx",27446],cedc390a:[()=>n.e(12953).then(n.t.bind(n,94610,19)),"~docs/default/tag-tags-seo-542.json",94610],cfa297a4:[()=>n.e(39586).then(n.t.bind(n,38069,19)),"~docs/default/tag-tags-a-11-y-c15.json",38069],cfb509c7:[()=>n.e(66822).then(n.bind(n,62478)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode.md",62478],cfdefec2:[()=>n.e(60950).then(n.bind(n,59479)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode.md",59479],d02ab91e:[()=>n.e(49044).then(n.bind(n,49806)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links.md",49806],d0359ea5:[()=>n.e(54054).then(n.t.bind(n,4838,19)),"~docs/default/tag-tags-sem-ver-10e.json",4838],d08b7dbc:[()=>n.e(31032).then(n.bind(n,54221)),"@site/docs/030-frontend/020-css/040-menu-mobilne-w-html-css-bez-javascript.mdx",54221],d11837e3:[()=>n.e(18673).then(n.bind(n,43861)),"@site/src/pages/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription.md",43861],d1398c67:[()=>n.e(81851).then(n.t.bind(n,51148,19)),"~docs/default/tag-tags-it-b92.json",51148],d13f3052:[()=>n.e(60269).then(n.bind(n,71204)),"@site/docs/050-fullstack/020-trasowanie/index.mdx",71204],d16bfa8b:[()=>n.e(48238).then(n.bind(n,56669)),"@site/src/pages/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription.md",56669],d1c3e56f:[()=>Promise.all([n.e(40532),n.e(3473),n.e(13043)]).then(n.bind(n,86345)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/index.mdx",86345],d26acc1c:[()=>n.e(74823).then(n.t.bind(n,6304,19)),"~docs/default/tag-tags-node-js-759.json",6304],d292be02:[()=>n.e(49936).then(n.bind(n,78438)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription.md",78438],d2aec923:[()=>Promise.all([n.e(40532),n.e(3473),n.e(95875)]).then(n.bind(n,62325)),"@site/src/pages/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/index.mdx",62325],d2b4e236:[()=>n.e(77675).then(n.bind(n,32381)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/000-wprowadzenie.mdx",32381],d2e2c39f:[()=>n.e(16860).then(n.bind(n,96179)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription.md",96179],d31e779f:[()=>n.e(98813).then(n.t.bind(n,4908,19)),"~docs/default/tag-tags-code-review-ed9.json",4908],d3844963:[()=>n.e(29413).then(n.bind(n,29639)),"@site/src/pages/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode.md",29639],d389b14e:[()=>n.e(48619).then(n.bind(n,23453)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription.md",23453],d484a575:[()=>n.e(58485).then(n.bind(n,57962)),"@site/docs/020-ux-ui/040-przeprojektowanie-interfejsu-strony-internetowej-gls.mdx",57962],d49f4d31:[()=>n.e(78959).then(n.bind(n,30090)),"@site/src/pages/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode.md",30090],d5875b60:[()=>n.e(18942).then(n.t.bind(n,40249,19)),"~docs/default/tag-tags-api-f4a.json",40249],d6bdfd6e:[()=>n.e(71747).then(n.bind(n,95776)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links.md",95776],d6d9252c:[()=>n.e(59350).then(n.bind(n,7800)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription.md",7800],d7f0470a:[()=>n.e(70789).then(n.bind(n,70256)),"@site/docs/040-backend/130-monitoring/index.mdx",70256],d7f390c8:[()=>n.e(62200).then(n.t.bind(n,18446,19)),"~docs/default/tag-tags-developer-439.json",18446],d84f392e:[()=>Promise.all([n.e(40532),n.e(3473),n.e(87228)]).then(n.bind(n,21540)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/index.mdx",21540],d8754a83:[()=>n.e(62368).then(n.bind(n,49502)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links.md",49502],d8756ba1:[()=>n.e(32353).then(n.bind(n,46409)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links.md",46409],d8a25ba0:[()=>Promise.all([n.e(40532),n.e(42193)]).then(n.bind(n,10892)),"@site/docs/050-fullstack/060-next-js/020-mini-projekt-z-next-js/index.mdx",10892],d8ed4f82:[()=>n.e(45352).then(n.bind(n,35311)),"@site/src/pages/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription.md",35311],d96bdff9:[()=>n.e(33278).then(n.t.bind(n,36174,19)),"~docs/default/tag-tags-ts-ddf.json",36174],d9b572bb:[()=>n.e(34298).then(n.t.bind(n,19057,19)),"~docs/default/tag-tags-cs-017.json",19057],da3c7939:[()=>n.e(57922).then(n.bind(n,67072)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription.md",67072],da9f8516:[()=>n.e(90243).then(n.bind(n,11548)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode.md",11548],db1cecfd:[()=>Promise.all([n.e(40532),n.e(3473),n.e(22214)]).then(n.bind(n,33191)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/index.mdx",33191],db523f3d:[()=>n.e(55534).then(n.bind(n,18268)),"@site/src/pages/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode.md",18268],db88d36c:[()=>n.e(89895).then(n.bind(n,54605)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links.md",54605],db9f9bb2:[()=>n.e(93343).then(n.bind(n,80080)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription.md",80080],dba55630:[()=>n.e(46609).then(n.t.bind(n,25745,19)),"~docs/default/tag-tags-git-925.json",25745],dbd503d3:[()=>n.e(85372).then(n.bind(n,59055)),"@site/src/pages/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links.md",59055],dce08ef6:[()=>Promise.all([n.e(40532),n.e(88935)]).then(n.bind(n,71936)),"@site/docs/050-fullstack/010-autentykacja-i-autoryzacja/010-implementacja-autentykacji/index.mdx",71936],ddb9fb9d:[()=>n.e(11878).then(n.t.bind(n,4778,19)),"~docs/default/tag-tags-scrum-117.json",4778],ddc43b58:[()=>Promise.all([n.e(40532),n.e(3473),n.e(27984)]).then(n.bind(n,39983)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/index.mdx",39983],ddc8cd89:[()=>n.e(11801).then(n.bind(n,24416)),"@site/docs/040-backend/030-api-zaplecza/020-graphql.mdx",24416],dddd2027:[()=>n.e(71257).then(n.bind(n,20733)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links.md",20733],ddff506f:[()=>n.e(10899).then(n.bind(n,94029)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription.md",94029],de0ea644:[()=>n.e(86700).then(n.bind(n,62430)),"@site/src/pages/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links.md",62430],de37878b:[()=>n.e(18987).then(n.t.bind(n,57851,19)),"~docs/default/tag-tags-marketing-4a6.json",57851],de75a204:[()=>n.e(10195).then(n.bind(n,89568)),"@site/src/pages/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode.md",89568],dea09956:[()=>n.e(22863).then(n.bind(n,37128)),"@site/docs/010-podstawy/190-edytory-kodu/020-vim.mdx",37128],ded9aecb:[()=>n.e(15967).then(n.bind(n,27789)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links.md",27789],dee91958:[()=>n.e(30359).then(n.bind(n,92891)),"@site/docs/010-podstawy/010-sprzet-komputerowy/000-system-binarny/020-system-binarny.mdx",92891],deff19d0:[()=>n.e(69816).then(n.bind(n,25392)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode.md",25392],df203c0f:[()=>n.e(99924).then(n.bind(n,97068)),"@theme/DocTagDocListPage",97068],df4d1eca:[()=>n.e(93049).then(n.bind(n,49841)),"@site/src/pages/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links.md",49841],dfad4e5b:[()=>n.e(67211).then(n.bind(n,61301)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode.md",61301],e082f5ea:[()=>n.e(55411).then(n.bind(n,9155)),"@site/src/pages/100-bugow-js/sukces.mdx",9155],e0c1c0cc:[()=>n.e(62946).then(n.bind(n,52545)),"@site/src/pages/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode.md",52545],e13c7883:[()=>Promise.all([n.e(40532),n.e(3473),n.e(43692)]).then(n.bind(n,19764)),"@site/src/pages/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/index.mdx",19764],e191101b:[()=>n.e(2705).then(n.bind(n,48995)),"@site/src/pages/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode.md",48995],e216f4da:[()=>n.e(19496).then(n.bind(n,99423)),"@site/src/pages/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription.md",99423],e225b845:[()=>n.e(86850).then(n.bind(n,46213)),"@site/docs/030-frontend/090-progresywne-aplikacje/index.mdx",46213],e27fbbe8:[()=>Promise.all([n.e(40532),n.e(3473),n.e(93985)]).then(n.bind(n,32505)),"@site/src/pages/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/index.mdx",32505],e28ff769:[()=>n.e(57417).then(n.t.bind(n,45314,19)),"~docs/default/tag-tags-osems-fe6.json",45314],e2a348e1:[()=>n.e(64911).then(n.bind(n,66386)),"@site/src/pages/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode.md",66386],e2f82b8d:[()=>n.e(38718).then(n.bind(n,58950)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription.md",58950],e30d710f:[()=>n.e(60166).then(n.bind(n,15633)),"@site/docs/010-podstawy/150-wydajnosc/index.mdx",15633],e3205e86:[()=>n.e(84313).then(n.bind(n,29014)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription.md",29014],e3921745:[()=>n.e(92922).then(n.bind(n,78963)),"@site/src/pages/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode.md",78963],e39def45:[()=>n.e(33385).then(n.bind(n,9323)),"@site/docs/010-podstawy/040-programowanie/020-typowanie-statyczne-i-dynamiczne.mdx",9323],e3c52b73:[()=>Promise.all([n.e(40532),n.e(3473),n.e(27879)]).then(n.bind(n,32762)),"@site/src/pages/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/index.mdx",32762],e408ddd1:[()=>n.e(57868).then(n.t.bind(n,28240,19)),"~docs/default/tag-tags-readme-681.json",28240],e41cc976:[()=>n.e(96293).then(n.bind(n,18238)),"@site/src/pages/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links.md",18238],e41cf7ed:[()=>Promise.all([n.e(40532),n.e(3473),n.e(14041)]).then(n.bind(n,7747)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/index.mdx",7747],e432597c:[()=>n.e(80389).then(n.bind(n,70859)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links.md",70859],e43f3435:[()=>Promise.all([n.e(40532),n.e(3473),n.e(86111)]).then(n.bind(n,51128)),"@site/src/pages/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/index.mdx",51128],e47104bd:[()=>Promise.all([n.e(40532),n.e(3473),n.e(13721)]).then(n.bind(n,33574)),"@site/src/pages/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/index.mdx",33574],e4e245d7:[()=>n.e(53302).then(n.bind(n,62685)),"@site/src/pages/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links.md",62685],e4e385e6:[()=>n.e(20827).then(n.bind(n,17120)),"@site/src/pages/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode.md",17120],e50fb3d1:[()=>Promise.all([n.e(40532),n.e(3473),n.e(53470)]).then(n.bind(n,49077)),"@site/src/pages/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/index.mdx",49077],e528424c:[()=>Promise.all([n.e(40532),n.e(3473),n.e(93583)]).then(n.bind(n,84598)),"@site/src/pages/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/index.mdx",84598],e5501d88:[()=>n.e(20005).then(n.bind(n,76800)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription.md",76800],e5ec689b:[()=>n.e(64741).then(n.bind(n,17980)),"@site/docs/030-frontend/035-react/005-react-i-jego-ekosystem.mdx",17980],e6036066:[()=>n.e(1983).then(n.bind(n,9677)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links.md",9677],e62e4577:[()=>n.e(31489).then(n.bind(n,4211)),"@site/src/pages/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links.md",4211],e6684714:[()=>n.e(66175).then(n.bind(n,67536)),"@site/docs/010-podstawy/110-dns-i-domeny/index.mdx",67536],e6bf88fd:[()=>n.e(17899).then(n.bind(n,61481)),"@site/src/pages/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription.md",61481],e6cad7e4:[()=>n.e(36682).then(n.bind(n,55047)),"@site/src/pages/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode.md",55047],e6f3dde7:[()=>n.e(25708).then(n.bind(n,15114)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription.md",15114],e6f8a6ef:[()=>n.e(4009).then(n.t.bind(n,20585,19)),"~docs/default/tag-tags-virtualbox-383.json",20585],e720185f:[()=>n.e(50916).then(n.bind(n,62909)),"@site/docs/010-podstawy/060-jezyki-programowania/020-c.mdx",62909],e7edc101:[()=>n.e(33902).then(n.bind(n,80747)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links.md",80747],e854041a:[()=>Promise.all([n.e(40532),n.e(3473),n.e(6551)]).then(n.bind(n,51410)),"@site/src/pages/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/index.mdx",51410],e85f022e:[()=>n.e(93636).then(n.bind(n,4891)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription.md",4891],e88156d1:[()=>Promise.all([n.e(40532),n.e(3473),n.e(10214)]).then(n.bind(n,84535)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/index.mdx",84535],e8aff1e0:[()=>Promise.all([n.e(40532),n.e(3473),n.e(13688)]).then(n.bind(n,70942)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/index.mdx",70942],e8f333dd:[()=>n.e(54456).then(n.t.bind(n,87665,19)),"~docs/default/tag-tags-vm-8a9.json",87665],e9077979:[()=>n.e(64049).then(n.bind(n,85327)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/040-ignorowanie-plikow-i-katalogow.mdx",85327],e91a71ff:[()=>n.e(3269).then(n.bind(n,91827)),"@site/src/pages/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription.md",91827],e96aa823:[()=>n.e(6071).then(n.bind(n,14431)),"@site/src/pages/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription.md",14431],e96ec661:[()=>n.e(70085).then(n.bind(n,5449)),"@site/docs/010-podstawy/100-siec/010-jak-dziala-internet.mdx",5449],e9b98b51:[()=>n.e(88342).then(n.bind(n,90399)),"@site/src/pages/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode.md",90399],eabad0ae:[()=>n.e(95359).then(n.bind(n,64296)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription.md",64296],eae4e405:[()=>n.e(86531).then(n.bind(n,61835)),"@site/docs/010-podstawy/090-pamiec-podreczna/index.mdx",61835],eb64c09b:[()=>n.e(56027).then(n.bind(n,82425)),"@site/src/pages/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode.md",82425],eb9ffec0:[()=>n.e(78729).then(n.bind(n,55880)),"@site/src/pages/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links.md",55880],ebbabef2:[()=>n.e(84395).then(n.bind(n,38380)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription.md",38380],ebe70892:[()=>Promise.all([n.e(40532),n.e(3473),n.e(53526)]).then(n.bind(n,59218)),"@site/src/pages/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/index.mdx",59218],ec6fef3a:[()=>Promise.all([n.e(40532),n.e(3473),n.e(10653)]).then(n.bind(n,10319)),"@site/src/pages/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/index.mdx",10319],ecc75780:[()=>n.e(79116).then(n.bind(n,90834)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription.md",90834],ed2f06be:[()=>n.e(55377).then(n.bind(n,61459)),"@site/src/pages/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode.md",61459],ed645329:[()=>n.e(14236).then(n.t.bind(n,42578,19)),"~docs/default/tag-tags-cloud-c13.json",42578],edf2427f:[()=>n.e(44890).then(n.bind(n,92164)),"@site/src/pages/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode.md",92164],ef00f9dc:[()=>n.e(60727).then(n.bind(n,91282)),"@site/src/pages/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode.md",91282],ef3b5271:[()=>n.e(53578).then(n.t.bind(n,88510,19)),"~docs/default/tag-tags-unit-945.json",88510],efa5fcef:[()=>n.e(95510).then(n.t.bind(n,98070,19)),"~docs/default/tag-tags-apple-d0b.json",98070],f042ee20:[()=>n.e(30259).then(n.bind(n,49884)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode.md",49884],f0522416:[()=>n.e(984).then(n.t.bind(n,36999,19)),"~docs/default/tag-tags-vcs-3fc.json",36999],f05655d5:[()=>n.e(30118).then(n.bind(n,7006)),"@site/src/pages/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription.md",7006],f0682135:[()=>n.e(33269).then(n.bind(n,44245)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode.md",44245],f0f3b84a:[()=>n.e(50080).then(n.bind(n,6262)),"@site/src/pages/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription.md",6262],f113a9ad:[()=>n.e(49319).then(n.bind(n,19006)),"@site/src/pages/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode.md",19006],f1b15f4f:[()=>n.e(12501).then(n.t.bind(n,59460,19)),"~docs/default/tag-tags-prisma-179.json",59460],f1c23ce2:[()=>n.e(1718).then(n.bind(n,54137)),"@site/src/pages/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription.md",54137],f21972b9:[()=>n.e(9478).then(n.bind(n,64736)),"@site/src/pages/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription.md",64736],f21fdbbb:[()=>n.e(43259).then(n.t.bind(n,66677,19)),"~docs/default/tag-tags-oop-c38.json",66677],f27731f5:[()=>n.e(70437).then(n.t.bind(n,76875,19)),"~docs/default/tag-tags-tcp-ip-e3d.json",76875],f2bf6a7e:[()=>n.e(40722).then(n.t.bind(n,99394,19)),"~docs/default/tag-tags-free-bsd-89d.json",99394],f3020eb8:[()=>Promise.all([n.e(40532),n.e(94818)]).then(n.bind(n,54998)),"@site/docs/010-podstawy/010-sprzet-komputerowy/000-system-binarny/index.mdx",54998],f35a7ead:[()=>n.e(72266).then(n.bind(n,75228)),"@site/src/pages/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links.md",75228],f36e7a87:[()=>n.e(94725).then(n.bind(n,22421)),"@site/src/pages/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode.md",22421],f415b733:[()=>n.e(46934).then(n.t.bind(n,74930,19)),"~docs/default/tag-tags-serverless-f69.json",74930],f430487a:[()=>n.e(20284).then(n.bind(n,73813)),"@site/src/pages/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links.md",73813],f44c625b:[()=>n.e(14615).then(n.bind(n,11881)),"@site/src/pages/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode.md",11881],f4530064:[()=>n.e(71584).then(n.bind(n,51483)),"@site/src/pages/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links.md",51483],f4568fd4:[()=>n.e(42895).then(n.bind(n,54234)),"@site/docs/010-podstawy/140-licencje/index.mdx",54234],f457aeaf:[()=>n.e(66434).then(n.bind(n,80505)),"@site/src/pages/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription.md",80505],f4689a72:[()=>n.e(16017).then(n.bind(n,50219)),"@site/src/pages/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode.md",50219],f4763366:[()=>n.e(53078).then(n.t.bind(n,83916,19)),"~docs/default/tag-tags-cli-09a.json",83916],f4fbc6cf:[()=>n.e(16508).then(n.bind(n,82427)),"@site/src/pages/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links.md",82427],f52b3e0c:[()=>Promise.all([n.e(40532),n.e(3473),n.e(15735)]).then(n.bind(n,14958)),"@site/src/pages/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/index.mdx",14958],f56d2877:[()=>n.e(98269).then(n.bind(n,24030)),"@site/src/pages/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links.md",24030],f5a94113:[()=>n.e(71723).then(n.bind(n,62752)),"@site/src/pages/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode.md",62752],f5d1779b:[()=>n.e(63665).then(n.t.bind(n,68452,19)),"~docs/default/tag-tags-no-sql-b20.json",68452],f65f218b:[()=>n.e(18453).then(n.bind(n,91958)),"@site/docs/020-ux-ui/010-projektowanie-interfejsu-i-doswiadczen-uzytkownikow/320-mapa-strony.mdx",91958],f6689e4c:[()=>n.e(98164).then(n.bind(n,27528)),"@site/docs/030-frontend/037-biblioteki/index.mdx",27528],f6692c73:[()=>n.e(17559).then(n.t.bind(n,96194,19)),"~docs/default/tag-tags-kafka-384.json",96194],f70aa095:[()=>n.e(79350).then(n.bind(n,11474)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription.md",11474],f7bae6de:[()=>n.e(5971).then(n.bind(n,57549)),"@site/src/pages/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription.md",57549],f84cd168:[()=>n.e(80514).then(n.bind(n,95666)),"@site/docs/010-podstawy/070-kontrola-wersji/010-podstawy-gita/030-galezie-laczenie-galezi-i-rozwiazywanie-konfliktow.mdx",95666],f8f47053:[()=>n.e(80812).then(n.bind(n,38223)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription.md",38223],f92ef410:[()=>Promise.all([n.e(40532),n.e(3473),n.e(28049)]).then(n.bind(n,93635)),"@site/src/pages/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/index.mdx",93635],f94c1a71:[()=>n.e(35987).then(n.bind(n,34897)),"@site/src/pages/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode.md",34897],f953a126:[()=>n.e(73736).then(n.bind(n,69277)),"@site/src/pages/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription.md",69277],f9625544:[()=>n.e(36359).then(n.t.bind(n,49399,19)),"~docs/default/tag-tags-mobile-277.json",49399],f989d062:[()=>n.e(4982).then(n.bind(n,86181)),"@site/src/pages/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription.md",86181],f9ce6cc8:[()=>n.e(76472).then(n.bind(n,17833)),"@site/src/pages/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode.md",17833],fa28ad03:[()=>n.e(48897).then(n.bind(n,25370)),"@site/src/pages/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode.md",25370],fa4fac62:[()=>n.e(42381).then(n.bind(n,32162)),"@site/src/pages/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription.md",32162],fa792f1c:[()=>n.e(15725).then(n.bind(n,45399)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription.md",45399],fa9af718:[()=>n.e(74105).then(n.bind(n,41437)),"@site/src/pages/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links.md",41437],fb2cd42c:[()=>n.e(16503).then(n.bind(n,10762)),"@site/src/pages/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription.md",10762],fb67979e:[()=>n.e(70847).then(n.bind(n,16679)),"@site/docs/010-podstawy/060-jezyki-programowania/index.mdx",16679],fb797052:[()=>Promise.all([n.e(40532),n.e(3473),n.e(31185)]).then(n.bind(n,33577)),"@site/src/pages/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/index.mdx",33577],fc059f5d:[()=>n.e(98577).then(n.bind(n,47490)),"@site/src/pages/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription.md",47490],fc262a50:[()=>n.e(18430).then(n.bind(n,53528)),"@site/src/pages/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription.md",53528],fc4340d2:[()=>n.e(62590).then(n.bind(n,47003)),"@site/docs/040-backend/040-bazy-danych/index.mdx",47003],fc6430c0:[()=>n.e(32771).then(n.bind(n,49727)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription.md",49727],fcc928cc:[()=>n.e(28553).then(n.t.bind(n,97434,19)),"~docs/default/tag-tags-php-67e.json",97434],fd08e427:[()=>n.e(69020).then(n.bind(n,70382)),"@site/src/pages/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links.md",70382],fd1f9f5e:[()=>n.e(32945).then(n.bind(n,74630)),"@site/src/pages/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode.md",74630],fde3afc6:[()=>n.e(20156).then(n.bind(n,7498)),"@site/src/pages/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode.md",7498],feacc639:[()=>n.e(43120).then(n.bind(n,32876)),"@site/src/pages/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription.md",32876],feb62326:[()=>n.e(54613).then(n.bind(n,6566)),"@site/src/pages/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode.md",6566],fee0f439:[()=>n.e(94741).then(n.bind(n,76764)),"@site/src/pages/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode.md",76764],fee641d5:[()=>n.e(42675).then(n.bind(n,38772)),"@site/docs/030-frontend/030-javascript/030-nie-uzywaj-luznego-porownania-w-javascript.mdx",38772],ff02220a:[()=>Promise.all([n.e(40532),n.e(3473),n.e(42640)]).then(n.bind(n,72997)),"@site/src/pages/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/index.mdx",72997]};function d(e){let{error:t,retry:n,pastDelay:o}=e;return t?a.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},a.createElement("p",null,String(t)),a.createElement("div",null,a.createElement("button",{type:"button",onClick:n},"Retry"))):o?a.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},a.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},a.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},a.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),a.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),a.createElement("circle",{cx:"22",cy:"22",r:"8"},a.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(99670),b=n(30226);function l(e,t){if("*"===e)return i()({loading:d,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return a.createElement(b.z,{value:{plugin:{name:"native",id:"default"}}},a.createElement(n,t))}});const c=s[`${e}-${t}`],l={},f=[],p=[],g=(0,u.Z)(c);return Object.entries(g).forEach((e=>{let[t,n]=e;const a=r[n];a&&(l[t]=a[0],f.push(a[1]),p.push(a[2]))})),i().Map({loading:d,loader:l,modules:f,webpack:()=>p,render(t,n){const i=JSON.parse(JSON.stringify(c));Object.entries(t).forEach((t=>{let[n,a]=t;const o=a.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(a).filter((e=>"default"!==e)).forEach((e=>{o[e]=a[e]}));let c=i;const s=n.split(".");s.slice(0,-1).forEach((e=>{c=c[e]})),c[s[s.length-1]]=o}));const s=i.__comp;delete i.__comp;const r=i.__context;return delete i.__context,a.createElement(b.z,{value:r},a.createElement(s,(0,o.Z)({},i,n)))}})}const f=[{path:"/100-bugow-js",component:l("/100-bugow-js","f7f"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6","537"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugCode","73f"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/bugDescription","253"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/links","fc2"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionCode","efd"),exact:!0},{path:"/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription",component:l("/100-bugow-js/05b581c3-2b7e-4ad7-b168-648f9849ebc6/solutionDescription","f49"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732","4b5"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugCode","54c"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/bugDescription","b3d"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/links","cb3"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionCode","b90"),exact:!0},{path:"/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription",component:l("/100-bugow-js/07a13b0b-35fe-4c30-90b0-1ef7527d7732/solutionDescription","d46"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b","871"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugCode","b9c"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/bugDescription","152"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/links","812"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionCode","338"),exact:!0},{path:"/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription",component:l("/100-bugow-js/0c3c689a-2e16-4c7a-b6c9-5333cc00289b/solutionDescription","011"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e","009"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugCode","ea4"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/bugDescription","ba2"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/links","36a"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionCode","7a9"),exact:!0},{path:"/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription",component:l("/100-bugow-js/0dd66a7d-2f2e-43ca-80f5-b9ffa606279e/solutionDescription","51d"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a","63f"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugCode","941"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/bugDescription","e58"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/links","853"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionCode","61c"),exact:!0},{path:"/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription",component:l("/100-bugow-js/0e1bfcac-da2c-4569-9dde-eb6c281eef1a/solutionDescription","609"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03","d88"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugCode","bb4"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/bugDescription","3be"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/links","288"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionCode","9a4"),exact:!0},{path:"/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription",component:l("/100-bugow-js/111bba83-a18f-4245-ae3d-66e71e46db03/solutionDescription","565"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885","a03"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugCode","48d"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/bugDescription","e26"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/links","bc3"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionCode","78e"),exact:!0},{path:"/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription",component:l("/100-bugow-js/1257df57-264f-4f1c-984c-89222207e885/solutionDescription","f6d"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211","149"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugCode","946"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/bugDescription","3bb"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/links","934"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionCode","803"),exact:!0},{path:"/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription",component:l("/100-bugow-js/12e5df98-c0ca-429c-a9e8-8517c1873211/solutionDescription","d64"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53","12c"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugCode","997"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/bugDescription","79b"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/links","4bd"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionCode","d46"),exact:!0},{path:"/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription",component:l("/100-bugow-js/1342370d-03e0-4f0b-aa22-69e05fc64d53/solutionDescription","ef2"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4","e7b"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugCode","1e6"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/bugDescription","30a"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/links","edc"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionCode","89d"),exact:!0},{path:"/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription",component:l("/100-bugow-js/13faa6fb-1dfe-41df-9f96-62618e9ca0c4/solutionDescription","2d2"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802","a19"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugCode","087"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/bugDescription","24d"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/links","042"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionCode","085"),exact:!0},{path:"/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription",component:l("/100-bugow-js/14a8fddb-055c-4504-841b-cb3f1ba5d802/solutionDescription","d34"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd","9bd"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugCode","d19"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/bugDescription","23f"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/links","e98"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionCode","e43"),exact:!0},{path:"/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription",component:l("/100-bugow-js/14c07311-04f4-48dd-b5a6-8ebdc0a9a6cd/solutionDescription","9f2"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f","654"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugCode","d35"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/bugDescription","18b"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/links","f0d"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionCode","a38"),exact:!0},{path:"/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription",component:l("/100-bugow-js/16de4343-9b81-49c5-92ea-e3e6b377132f/solutionDescription","9c8"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7","22d"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugCode","dbc"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/bugDescription","4f2"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/links","455"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionCode","1bc"),exact:!0},{path:"/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription",component:l("/100-bugow-js/1748706a-b38f-403a-ab65-6666bd6bede7/solutionDescription","087"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696","c3a"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugCode","567"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/bugDescription","c9c"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/links","258"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionCode","60b"),exact:!0},{path:"/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription",component:l("/100-bugow-js/17c27ac8-01d9-463d-84b4-f81cee835696/solutionDescription","96e"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b","cf2"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugCode","f7c"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/bugDescription","c4e"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/links","75b"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionCode","9b0"),exact:!0},{path:"/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription",component:l("/100-bugow-js/1be29c44-56a0-4d02-81e3-8c93f17b434b/solutionDescription","cc5"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776","771"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugCode","798"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/bugDescription","89f"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/links","44c"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionCode","131"),exact:!0},{path:"/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription",component:l("/100-bugow-js/28eab874-606d-49f2-bc6c-f8382476a776/solutionDescription","7c1"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a","95d"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugCode","73f"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/bugDescription","2b9"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/links","b3f"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionCode","d21"),exact:!0},{path:"/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription",component:l("/100-bugow-js/2b40ab53-0110-4a5a-b43e-92e4ab97fd2a/solutionDescription","0f2"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295","0db"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugCode","b70"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/bugDescription","69b"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/links","3e6"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionCode","7e7"),exact:!0},{path:"/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription",component:l("/100-bugow-js/2d8e841d-6b9b-4a0b-9a66-cf92bea23295/solutionDescription","fcd"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f","1a6"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugCode","198"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/bugDescription","5d5"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/links","a14"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionCode","1a4"),exact:!0},{path:"/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription",component:l("/100-bugow-js/2da281dc-b213-448d-b3d2-4b90f901b93f/solutionDescription","987"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143","ce5"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugCode","a61"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/bugDescription","0a6"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/links","f5f"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionCode","44e"),exact:!0},{path:"/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription",component:l("/100-bugow-js/31a6b892-4183-4589-a877-6c172e38d143/solutionDescription","aef"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0","1c5"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugCode","11d"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/bugDescription","46d"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/links","9da"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionCode","7e6"),exact:!0},{path:"/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription",component:l("/100-bugow-js/35bf86c2-709d-4277-ac0d-0c74937a59d0/solutionDescription","560"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc","140"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugCode","ddf"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/bugDescription","8c3"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/links","bff"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionCode","80e"),exact:!0},{path:"/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription",component:l("/100-bugow-js/39272e37-d6ce-4e24-bb1b-b8476234fdcc/solutionDescription","c93"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8","758"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugCode","2fd"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/bugDescription","a83"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/links","707"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionCode","36b"),exact:!0},{path:"/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription",component:l("/100-bugow-js/3bf409bd-9ebd-4cea-8666-c410aec718c8/solutionDescription","864"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7","61d"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugCode","b2c"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/bugDescription","433"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/links","85f"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionCode","901"),exact:!0},{path:"/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription",component:l("/100-bugow-js/3c9e16d8-b6bf-426a-9572-863deaced7c7/solutionDescription","669"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d","2ac"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugCode","e87"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/bugDescription","8c5"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/links","99a"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionCode","973"),exact:!0},{path:"/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription",component:l("/100-bugow-js/3d3e0d19-47d7-4f73-a43f-bc6deaf3cc5d/solutionDescription","427"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814","67b"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugCode","9f0"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/bugDescription","ed8"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/links","cbc"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionCode","c85"),exact:!0},{path:"/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription",component:l("/100-bugow-js/3f068db0-5299-4701-866c-36414d360814/solutionDescription","81a"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896","126"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugCode","ead"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/bugDescription","d29"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/links","997"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionCode","b1a"),exact:!0},{path:"/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription",component:l("/100-bugow-js/4049d287-c406-4bb7-926c-43627310b896/solutionDescription","967"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166","e9b"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugCode","cce"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/bugDescription","4d9"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/links","3a3"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionCode","a12"),exact:!0},{path:"/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription",component:l("/100-bugow-js/4090ba91-2b59-42f2-93d5-e1ecb4cc1166/solutionDescription","d50"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c","50b"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugCode","a6f"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/bugDescription","f7a"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/links","247"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionCode","d67"),exact:!0},{path:"/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription",component:l("/100-bugow-js/47183b47-e13d-4247-9ef5-a447a35e530c/solutionDescription","dd4"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1","b4e"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugCode","cdc"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/bugDescription","5e7"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/links","231"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionCode","01f"),exact:!0},{path:"/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription",component:l("/100-bugow-js/49405a75-e352-4a37-8afd-d231628e01e1/solutionDescription","681"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8","f25"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugCode","6e1"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/bugDescription","a51"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/links","f9f"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionCode","f2f"),exact:!0},{path:"/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription",component:l("/100-bugow-js/4a3a28c4-f782-4ef5-911f-4f08799f54b8/solutionDescription","ef6"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7","d31"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugCode","ff6"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/bugDescription","3a4"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/links","5b3"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionCode","f63"),exact:!0},{path:"/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription",component:l("/100-bugow-js/4fc04c98-b27d-4eb9-9a44-a69d790f60f7/solutionDescription","86b"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9","cb9"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugCode","611"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/bugDescription","584"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/links","a84"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionCode","d34"),exact:!0},{path:"/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription",component:l("/100-bugow-js/52fbfe20-45e9-4a02-adc1-cb03d30fb6e9/solutionDescription","d33"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d","e2c"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugCode","7e9"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/bugDescription","72e"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/links","df9"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionCode","09e"),exact:!0},{path:"/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription",component:l("/100-bugow-js/546817c4-7ea0-4bdb-90a3-438d4c17693d/solutionDescription","ddd"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59","19d"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugCode","bbd"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/bugDescription","f7d"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/links","27c"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionCode","e9c"),exact:!0},{path:"/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription",component:l("/100-bugow-js/574c299a-b9ec-4b8c-b2db-63e41365ae59/solutionDescription","3bb"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0","586"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugCode","7fe"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/bugDescription","3d2"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/links","07d"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionCode","375"),exact:!0},{path:"/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription",component:l("/100-bugow-js/5838b978-3b1c-433d-b118-9801923593e0/solutionDescription","fc1"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07","736"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugCode","451"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/bugDescription","223"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/links","8af"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionCode","852"),exact:!0},{path:"/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription",component:l("/100-bugow-js/5964c80d-0d4d-42ac-be8b-827cfc1a5a07/solutionDescription","ccf"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0","6e7"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugCode","4e3"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/bugDescription","82c"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/links","af6"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionCode","31a"),exact:!0},{path:"/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription",component:l("/100-bugow-js/5bdd1571-fc82-4acb-82e5-3280ff6344c0/solutionDescription","9ce"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb","dce"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugCode","3ee"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/bugDescription","698"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/links","6e2"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionCode","44c"),exact:!0},{path:"/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription",component:l("/100-bugow-js/5cc2e5b1-db79-420b-8820-67d4d5acaddb/solutionDescription","7be"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8","56c"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugCode","d46"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/bugDescription","511"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/links","491"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionCode","17e"),exact:!0},{path:"/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription",component:l("/100-bugow-js/5e53d805-c959-40a2-9acd-f85e690d58e8/solutionDescription","81b"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b","dcf"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugCode","491"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/bugDescription","993"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/links","189"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionCode","424"),exact:!0},{path:"/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription",component:l("/100-bugow-js/602b9a01-9e69-4966-9cc6-610bebf8466b/solutionDescription","98e"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6","c91"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugCode","572"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/bugDescription","c73"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/links","25b"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionCode","0a4"),exact:!0},{path:"/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription",component:l("/100-bugow-js/62d658b2-cf12-4c95-ab39-11a4d12acae6/solutionDescription","111"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815","dd9"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugCode","ed5"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/bugDescription","fae"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/links","a1c"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionCode","149"),exact:!0},{path:"/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription",component:l("/100-bugow-js/63408939-dd63-4ec2-9eca-719a80260815/solutionDescription","6af"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c","af9"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugCode","dcd"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/bugDescription","72c"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/links","f8e"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionCode","cca"),exact:!0},{path:"/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription",component:l("/100-bugow-js/64e0f8f8-ce00-4d01-bdf1-df6d85759a3c/solutionDescription","6d4"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7","e08"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugCode","35c"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/bugDescription","058"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/links","47f"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionCode","923"),exact:!0},{path:"/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription",component:l("/100-bugow-js/69dd4421-faf2-484d-ab27-26a65940faf7/solutionDescription","b64"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6","a47"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugCode","058"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/bugDescription","e12"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/links","fcb"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionCode","688"),exact:!0},{path:"/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription",component:l("/100-bugow-js/6bc1f45c-7f3e-4207-854f-e4ac9843f8b6/solutionDescription","0f1"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071","c30"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugCode","e36"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/bugDescription","0d0"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/links","4f0"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionCode","269"),exact:!0},{path:"/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription",component:l("/100-bugow-js/6eb2ef7d-4568-4481-b56d-868c1bcd4071/solutionDescription","3c2"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01","ecb"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugCode","b29"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/bugDescription","ebc"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/links","bd8"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionCode","f12"),exact:!0},{path:"/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription",component:l("/100-bugow-js/71c6322b-f4cb-4ab0-9497-0b618c975d01/solutionDescription","afd"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132","200"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugCode","ea3"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/bugDescription","a33"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/links","70d"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionCode","f4f"),exact:!0},{path:"/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription",component:l("/100-bugow-js/74f05a57-ccd6-44f8-a982-aacec55d6132/solutionDescription","f1c"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6","24d"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugCode","3d0"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/bugDescription","9b0"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/links","60b"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionCode","3f4"),exact:!0},{path:"/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription",component:l("/100-bugow-js/7a984008-730d-41bf-be00-1493e1c1cdc6/solutionDescription","e22"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6","077"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugCode","4df"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/bugDescription","347"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/links","ac4"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionCode","42e"),exact:!0},{path:"/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription",component:l("/100-bugow-js/855033cb-80dc-4fd0-9371-f770d65ea1d6/solutionDescription","265"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096","533"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugCode","b0e"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/bugDescription","2d2"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/links","d06"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionCode","668"),exact:!0},{path:"/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription",component:l("/100-bugow-js/86e9f1ca-3f32-445a-a15f-4ce1b6850096/solutionDescription","b28"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09","e76"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugCode","4ab"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/bugDescription","7c1"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/links","c91"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionCode","cf0"),exact:!0},{path:"/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription",component:l("/100-bugow-js/87616015-586b-4477-ac08-cb1bc0e28e09/solutionDescription","e54"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9","7d3"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugCode","996"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/bugDescription","d5a"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/links","846"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionCode","a9b"),exact:!0},{path:"/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription",component:l("/100-bugow-js/880c49ad-04a2-41f3-a4e0-bbc863aa5ec9/solutionDescription","0c9"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd","bc0"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugCode","166"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/bugDescription","96e"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/links","872"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionCode","440"),exact:!0},{path:"/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription",component:l("/100-bugow-js/88306d48-4df5-4c3e-9452-4fee2be681fd/solutionDescription","37e"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0","e6b"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugCode","cf5"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/bugDescription","20a"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/links","281"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionCode","e00"),exact:!0},{path:"/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription",component:l("/100-bugow-js/8bf80212-90d8-4c9b-b6af-3a60223e0fe0/solutionDescription","116"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed","765"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugCode","491"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/bugDescription","499"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/links","580"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionCode","43e"),exact:!0},{path:"/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription",component:l("/100-bugow-js/8c1883e7-6c29-41ff-938b-81d605c565ed/solutionDescription","126"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115","ecd"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugCode","a23"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/bugDescription","d36"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/links","d5f"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionCode","447"),exact:!0},{path:"/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription",component:l("/100-bugow-js/9040ce84-a478-468c-aca6-16b9f909e115/solutionDescription","b92"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961","929"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugCode","e5f"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/bugDescription","33f"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/links","e88"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionCode","f31"),exact:!0},{path:"/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription",component:l("/100-bugow-js/90b2a251-a246-4713-adfc-adf089197961/solutionDescription","c68"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2","755"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugCode","b0f"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/bugDescription","39c"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/links","ea3"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionCode","f88"),exact:!0},{path:"/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription",component:l("/100-bugow-js/967dd2e3-34d2-4e05-b56d-5c54782406d2/solutionDescription","37a"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03","a2d"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugCode","cef"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/bugDescription","ed9"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/links","dc9"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionCode","b52"),exact:!0},{path:"/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription",component:l("/100-bugow-js/979ce6b4-71f8-4d13-80ea-8ab3a2b99a03/solutionDescription","ad8"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153","e5a"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugCode","179"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/bugDescription","81e"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/links","afe"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionCode","349"),exact:!0},{path:"/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription",component:l("/100-bugow-js/98a75ad0-f321-4391-8167-a4dea7dfe153/solutionDescription","f75"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4","4fe"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugCode","73b"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/bugDescription","76b"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/links","646"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionCode","199"),exact:!0},{path:"/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription",component:l("/100-bugow-js/a06206c4-6029-4865-9d92-d2bfdd3a82c4/solutionDescription","597"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927","efa"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugCode","53b"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/bugDescription","2ce"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/links","d32"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionCode","6ea"),exact:!0},{path:"/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription",component:l("/100-bugow-js/a1ef5a9e-88dc-454f-9db1-9d21dbea6927/solutionDescription","bc2"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb","7f6"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugCode","a90"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/bugDescription","da9"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/links","ed4"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionCode","efd"),exact:!0},{path:"/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription",component:l("/100-bugow-js/a8adcbd8-2151-494e-b538-44c1503f3beb/solutionDescription","30a"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5","58d"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugCode","6f0"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/bugDescription","1d9"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/links","c7a"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionCode","4d0"),exact:!0},{path:"/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription",component:l("/100-bugow-js/ae0d38e8-00ed-416c-b87f-460de2a76ed5/solutionDescription","b93"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e","152"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugCode","960"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/bugDescription","bf0"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/links","50d"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionCode","3ad"),exact:!0},{path:"/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription",component:l("/100-bugow-js/aefeac4f-fef6-4b65-b2cf-bd41c4111a8e/solutionDescription","878"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed","182"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugCode","3c0"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/bugDescription","3af"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/links","47a"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionCode","cde"),exact:!0},{path:"/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription",component:l("/100-bugow-js/b18ad5f3-9589-4ff0-b9b2-43a9b5374aed/solutionDescription","9b6"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91","d45"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugCode","266"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/bugDescription","3be"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/links","e5f"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionCode","f6d"),exact:!0},{path:"/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription",component:l("/100-bugow-js/b2d2c3dc-7b6e-4d08-a448-193140af5c91/solutionDescription","696"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910","b65"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugCode","518"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/bugDescription","89b"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/links","877"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionCode","517"),exact:!0},{path:"/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription",component:l("/100-bugow-js/b625f893-5173-40ab-b1ce-257b5bff5910/solutionDescription","1a2"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2","5f6"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugCode","a23"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/bugDescription","72c"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/links","94d"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionCode","d89"),exact:!0},{path:"/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription",component:l("/100-bugow-js/b799ee88-187a-41d3-8a50-7e5b422aa2e2/solutionDescription","837"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050","f9d"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugCode","f7c"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/bugDescription","3cc"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/links","709"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionCode","d1b"),exact:!0},{path:"/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription",component:l("/100-bugow-js/b85b88a3-7e88-4091-a7f1-62ee08894050/solutionDescription","3bc"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2","830"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugCode","174"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/bugDescription","e82"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/links","b8e"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionCode","329"),exact:!0},{path:"/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription",component:l("/100-bugow-js/b99780c7-a6bb-486a-a223-b9fc7979d8a2/solutionDescription","490"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3","ca3"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugCode","86c"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/bugDescription","0a4"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/links","bd7"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionCode","863"),exact:!0},{path:"/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription",component:l("/100-bugow-js/bb05d968-36d2-4e0d-b17f-d60291b46bf3/solutionDescription","46b"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5","fab"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugCode","89a"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/bugDescription","46a"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/links","77e"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionCode","0d8"),exact:!0},{path:"/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription",component:l("/100-bugow-js/bc9e86bd-8ba9-4163-941f-b605d24e56a5/solutionDescription","0da"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4","b1e"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugCode","465"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/bugDescription","397"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/links","2bd"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionCode","5fd"),exact:!0},{path:"/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription",component:l("/100-bugow-js/bdf71c4c-20af-48f1-a556-386ecddf1fc4/solutionDescription","7eb"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe","d4a"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugCode","df3"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/bugDescription","18f"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/links","55c"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionCode","b6d"),exact:!0},{path:"/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription",component:l("/100-bugow-js/be9e0eb9-ec46-4b89-bfc2-04922a0381fe/solutionDescription","e3b"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6","3fe"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugCode","ac1"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/bugDescription","2c3"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/links","4fb"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionCode","9b7"),exact:!0},{path:"/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription",component:l("/100-bugow-js/c240b7f1-fb67-434c-9965-b41432f128c6/solutionDescription","5a6"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b","55d"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugCode","432"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/bugDescription","620"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/links","3cc"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionCode","a6f"),exact:!0},{path:"/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription",component:l("/100-bugow-js/c2dd5dbc-7e6b-4982-8b05-023ee03dfa8b/solutionDescription","f16"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000","9f3"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugCode","8f2"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/bugDescription","01e"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/links","208"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionCode","cc3"),exact:!0},{path:"/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription",component:l("/100-bugow-js/c4b37568-5a7d-44d1-89c8-b3f517b0c000/solutionDescription","b81"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4","3b1"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugCode","dc0"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/bugDescription","7db"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/links","90d"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionCode","c45"),exact:!0},{path:"/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription",component:l("/100-bugow-js/c58e01be-7092-47d4-ba65-cffd25192ba4/solutionDescription","2f5"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6","e79"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugCode","fea"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/bugDescription","f0e"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/links","382"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionCode","4bf"),exact:!0},{path:"/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription",component:l("/100-bugow-js/c5fc2e0b-19f9-47c2-8ba3-73ff395a3fd6/solutionDescription","57d"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1","904"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugCode","da0"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/bugDescription","306"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/links","a3e"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionCode","616"),exact:!0},{path:"/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription",component:l("/100-bugow-js/cdbf2526-11cb-4db7-ba4f-5d6e4d94c0d1/solutionDescription","46b"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179","3aa"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugCode","0f7"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/bugDescription","faf"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/links","22d"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionCode","7ee"),exact:!0},{path:"/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription",component:l("/100-bugow-js/cdc9845a-3304-4646-b257-3238bad1e179/solutionDescription","d2c"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff","09c"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugCode","550"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/bugDescription","196"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/links","1bf"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionCode","58c"),exact:!0},{path:"/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription",component:l("/100-bugow-js/cf71a652-cfb3-4406-b6c8-89594f7546ff/solutionDescription","ef5"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb","4bd"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugCode","990"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/bugDescription","cf0"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/links","71a"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionCode","966"),exact:!0},{path:"/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription",component:l("/100-bugow-js/d05d69bf-78ae-4c42-a213-81006fa7e6cb/solutionDescription","ae8"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e","fba"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugCode","f94"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/bugDescription","934"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/links","8e9"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionCode","f8e"),exact:!0},{path:"/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription",component:l("/100-bugow-js/dd95137e-f378-4224-a3e7-5db4b217508e/solutionDescription","bcf"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a","491"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugCode","2e4"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/bugDescription","cf8"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/links","59f"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionCode","fc9"),exact:!0},{path:"/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription",component:l("/100-bugow-js/df58179e-11c5-4987-9cf7-d513ef33ba6a/solutionDescription","021"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf","a60"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugCode","312"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/bugDescription","3cb"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/links","bca"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionCode","205"),exact:!0},{path:"/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription",component:l("/100-bugow-js/e5651472-8df9-4bec-bea5-f9d5afb419bf/solutionDescription","ad3"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645","017"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugCode","dd6"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/bugDescription","0c2"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/links","145"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionCode","bf9"),exact:!0},{path:"/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription",component:l("/100-bugow-js/e8edc07f-955c-4e36-b25f-7f49bcf55645/solutionDescription","a63"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e","b1c"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugCode","5ac"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/bugDescription","478"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/links","d5e"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionCode","34e"),exact:!0},{path:"/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription",component:l("/100-bugow-js/ed75ecab-2ac8-44e9-b9c1-a1cce72ee45e/solutionDescription","245"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf","c42"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugCode","a2f"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/bugDescription","f27"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/links","b5c"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionCode","01d"),exact:!0},{path:"/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription",component:l("/100-bugow-js/ee9b7199-3dfc-4496-be53-7c45a02e3ddf/solutionDescription","77e"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a","53c"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugCode","8df"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/bugDescription","e8c"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/links","a21"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionCode","ac6"),exact:!0},{path:"/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription",component:l("/100-bugow-js/f4493212-ffba-4a48-818a-b82a22bce47a/solutionDescription","886"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea","79d"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugCode","556"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/bugDescription","e79"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/links","484"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionCode","4a6"),exact:!0},{path:"/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription",component:l("/100-bugow-js/f681cf98-6d5a-4a0c-8245-0eddf7a6a7ea/solutionDescription","80d"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020","ae7"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugCode","231"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/bugDescription","52c"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/links","547"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionCode","464"),exact:!0},{path:"/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription",component:l("/100-bugow-js/f6dca2d4-892a-4b22-a34c-1c6ded328020/solutionDescription","184"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f","c85"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugCode","6c2"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/bugDescription","a6e"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/links","e1b"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionCode","ca5"),exact:!0},{path:"/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription",component:l("/100-bugow-js/f8fc4c9a-f11e-4205-99a3-19115d81b37f/solutionDescription","357"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0","6c4"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugCode","3ec"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/bugDescription","c30"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/links","6cc"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionCode","f5f"),exact:!0},{path:"/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription",component:l("/100-bugow-js/fa73295e-34e5-4f5c-9098-291e3770e4b0/solutionDescription","e72"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf","774"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugCode","ce3"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/bugDescription","53a"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/links","075"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionCode","620"),exact:!0},{path:"/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription",component:l("/100-bugow-js/fbd04755-cc69-4e14-ba17-5172fba6d6bf/solutionDescription","435"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef","2ea"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugCode","5e6"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/bugDescription","cb9"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/links","420"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionCode","a72"),exact:!0},{path:"/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription",component:l("/100-bugow-js/ffc67d5d-0437-493c-b712-e1e3571caaef/solutionDescription","084"),exact:!0},{path:"/100-bugow-js/sukces",component:l("/100-bugow-js/sukces","2a9"),exact:!0},{path:"/100-bugow-js/wymagane-potwierdzenie",component:l("/100-bugow-js/wymagane-potwierdzenie","877"),exact:!0},{path:"/100-bugow-js/wypisanie",component:l("/100-bugow-js/wypisanie","fdb"),exact:!0},{path:"/digitalocean",component:l("/digitalocean","6d8"),exact:!0},{path:"/discord",component:l("/discord","034"),exact:!0},{path:"/facebook",component:l("/facebook","9b4"),exact:!0},{path:"/github",component:l("/github","cbf"),exact:!0},{path:"/instagram",component:l("/instagram","057"),exact:!0},{path:"/tags",component:l("/tags","f4e"),exact:!0},{path:"/tags/a-11-y",component:l("/tags/a-11-y","dc4"),exact:!0},{path:"/tags/accessibility",component:l("/tags/accessibility","d15"),exact:!0},{path:"/tags/agile",component:l("/tags/agile","c76"),exact:!0},{path:"/tags/algorytm",component:l("/tags/algorytm","829"),exact:!0},{path:"/tags/api",component:l("/tags/api","496"),exact:!0},{path:"/tags/app",component:l("/tags/app","982"),exact:!0},{path:"/tags/apple",component:l("/tags/apple","99c"),exact:!0},{path:"/tags/auth",component:l("/tags/auth","18e"),exact:!0},{path:"/tags/axios",component:l("/tags/axios","c46"),exact:!0},{path:"/tags/backend",component:l("/tags/backend","17b"),exact:!0},{path:"/tags/big-o",component:l("/tags/big-o","06b"),exact:!0},{path:"/tags/binary",component:l("/tags/binary","2fb"),exact:!0},{path:"/tags/bsd",component:l("/tags/bsd","4ba"),exact:!0},{path:"/tags/bug",component:l("/tags/bug","604"),exact:!0},{path:"/tags/bundle",component:l("/tags/bundle","a57"),exact:!0},{path:"/tags/cache",component:l("/tags/cache","04c"),exact:!0},{path:"/tags/cd",component:l("/tags/cd","c74"),exact:!0},{path:"/tags/chrome",component:l("/tags/chrome","847"),exact:!0},{path:"/tags/ci",component:l("/tags/ci","077"),exact:!0},{path:"/tags/cli",component:l("/tags/cli","84c"),exact:!0},{path:"/tags/cloud",component:l("/tags/cloud","a58"),exact:!0},{path:"/tags/cloudflare",component:l("/tags/cloudflare","86c"),exact:!0},{path:"/tags/cms",component:l("/tags/cms","f60"),exact:!0},{path:"/tags/code-review",component:l("/tags/code-review","b6b"),exact:!0},{path:"/tags/cpu",component:l("/tags/cpu","ae4"),exact:!0},{path:"/tags/cr",component:l("/tags/cr","b65"),exact:!0},{path:"/tags/cs",component:l("/tags/cs","e61"),exact:!0},{path:"/tags/css",component:l("/tags/css","272"),exact:!0},{path:"/tags/database",component:l("/tags/database","861"),exact:!0},{path:"/tags/db",component:l("/tags/db","078"),exact:!0},{path:"/tags/ddd",component:l("/tags/ddd","adb"),exact:!0},{path:"/tags/design-patterns",component:l("/tags/design-patterns","9a0"),exact:!0},{path:"/tags/designer",component:l("/tags/designer","e12"),exact:!0},{path:"/tags/dev-tools",component:l("/tags/dev-tools","83e"),exact:!0},{path:"/tags/developer",component:l("/tags/developer","db3"),exact:!0},{path:"/tags/dns",component:l("/tags/dns","2b9"),exact:!0},{path:"/tags/docker",component:l("/tags/docker","9a6"),exact:!0},{path:"/tags/docs",component:l("/tags/docs","52b"),exact:!0},{path:"/tags/e-2-e",component:l("/tags/e-2-e","7a0"),exact:!0},{path:"/tags/elasticsearch",component:l("/tags/elasticsearch","5a7"),exact:!0},{path:"/tags/email",component:l("/tags/email","309"),exact:!0},{path:"/tags/es-lint",component:l("/tags/es-lint","f22"),exact:!0},{path:"/tags/free-bsd",component:l("/tags/free-bsd","77d"),exact:!0},{path:"/tags/frontend",component:l("/tags/frontend","1f4"),exact:!0},{path:"/tags/ftp",component:l("/tags/ftp","d86"),exact:!0},{path:"/tags/full-stack",component:l("/tags/full-stack","493"),exact:!0},{path:"/tags/git",component:l("/tags/git","210"),exact:!0},{path:"/tags/git-hub",component:l("/tags/git-hub","13d"),exact:!0},{path:"/tags/google",component:l("/tags/google","8f9"),exact:!0},{path:"/tags/graph-ql",component:l("/tags/graph-ql","6c9"),exact:!0},{path:"/tags/hardware",component:l("/tags/hardware","72f"),exact:!0},{path:"/tags/hash",component:l("/tags/hash","74d"),exact:!0},{path:"/tags/hosting",component:l("/tags/hosting","dc7"),exact:!0},{path:"/tags/html",component:l("/tags/html","eb7"),exact:!0},{path:"/tags/http",component:l("/tags/http","e97"),exact:!0},{path:"/tags/i-o",component:l("/tags/i-o","3f6"),exact:!0},{path:"/tags/i-os",component:l("/tags/i-os","919"),exact:!0},{path:"/tags/ia-c",component:l("/tags/ia-c","5cd"),exact:!0},{path:"/tags/iaa-s",component:l("/tags/iaa-s","37e"),exact:!0},{path:"/tags/ide",component:l("/tags/ide","e38"),exact:!0},{path:"/tags/integration",component:l("/tags/integration","fb5"),exact:!0},{path:"/tags/internet",component:l("/tags/internet","712"),exact:!0},{path:"/tags/ip",component:l("/tags/ip","bfb"),exact:!0},{path:"/tags/it",component:l("/tags/it","bb3"),exact:!0},{path:"/tags/jasmine",component:l("/tags/jasmine","b51"),exact:!0},{path:"/tags/java-script",component:l("/tags/java-script","f67"),exact:!0},{path:"/tags/jest",component:l("/tags/jest","7e6"),exact:!0},{path:"/tags/js",component:l("/tags/js","e98"),exact:!0},{path:"/tags/kafka",component:l("/tags/kafka","39d"),exact:!0},{path:"/tags/kernel",component:l("/tags/kernel","7cc"),exact:!0},{path:"/tags/libs",component:l("/tags/libs","425"),exact:!0},{path:"/tags/linux",component:l("/tags/linux","b74"),exact:!0},{path:"/tags/lucene",component:l("/tags/lucene","536"),exact:!0},{path:"/tags/mac-os",component:l("/tags/mac-os","4a8"),exact:!0},{path:"/tags/marketing",component:l("/tags/marketing","826"),exact:!0},{path:"/tags/memo",component:l("/tags/memo","802"),exact:!0},{path:"/tags/microsoft",component:l("/tags/microsoft","f5d"),exact:!0},{path:"/tags/mobile",component:l("/tags/mobile","f41"),exact:!0},{path:"/tags/mocha",component:l("/tags/mocha","426"),exact:!0},{path:"/tags/mongo-db",component:l("/tags/mongo-db","fb0"),exact:!0},{path:"/tags/network",component:l("/tags/network","937"),exact:!0},{path:"/tags/next-js",component:l("/tags/next-js","5c0"),exact:!0},{path:"/tags/nginx",component:l("/tags/nginx","057"),exact:!0},{path:"/tags/no-sql",component:l("/tags/no-sql","9d6"),exact:!0},{path:"/tags/node-js",component:l("/tags/node-js","ea5"),exact:!0},{path:"/tags/notification",component:l("/tags/notification","697"),exact:!0},{path:"/tags/npm",component:l("/tags/npm","233"),exact:!0},{path:"/tags/oop",component:l("/tags/oop","8ee"),exact:!0},{path:"/tags/orm",component:l("/tags/orm","d0c"),exact:!0},{path:"/tags/os",component:l("/tags/os","825"),exact:!0},{path:"/tags/osems",component:l("/tags/osems","053"),exact:!0},{path:"/tags/owasp",component:l("/tags/owasp","fa1"),exact:!0},{path:"/tags/pagination",component:l("/tags/pagination","26a"),exact:!0},{path:"/tags/pay-u",component:l("/tags/pay-u","e5e"),exact:!0},{path:"/tags/performance",component:l("/tags/performance","c14"),exact:!0},{path:"/tags/php",component:l("/tags/php","dde"),exact:!0},{path:"/tags/prettier",component:l("/tags/prettier","10b"),exact:!0},{path:"/tags/prism",component:l("/tags/prism","1a3"),exact:!0},{path:"/tags/prisma",component:l("/tags/prisma","71d"),exact:!0},{path:"/tags/przelewy-24",component:l("/tags/przelewy-24","51d"),exact:!0},{path:"/tags/push",component:l("/tags/push","6c4"),exact:!0},{path:"/tags/pwa",component:l("/tags/pwa","f5f"),exact:!0},{path:"/tags/rabbit-mq",component:l("/tags/rabbit-mq","a34"),exact:!0},{path:"/tags/ram",component:l("/tags/ram","112"),exact:!0},{path:"/tags/react",component:l("/tags/react","037"),exact:!0},{path:"/tags/readme",component:l("/tags/readme","4e2"),exact:!0},{path:"/tags/redux",component:l("/tags/redux","1d6"),exact:!0},{path:"/tags/reg-ex",component:l("/tags/reg-ex","6e1"),exact:!0},{path:"/tags/res-tful",component:l("/tags/res-tful","3c5"),exact:!0},{path:"/tags/rest",component:l("/tags/rest","551"),exact:!0},{path:"/tags/routing",component:l("/tags/routing","7aa"),exact:!0},{path:"/tags/rx-js",component:l("/tags/rx-js","080"),exact:!0},{path:"/tags/sass",component:l("/tags/sass","009"),exact:!0},{path:"/tags/scrum",component:l("/tags/scrum","c25"),exact:!0},{path:"/tags/scss",component:l("/tags/scss","c5d"),exact:!0},{path:"/tags/security",component:l("/tags/security","32a"),exact:!0},{path:"/tags/self-hosting",component:l("/tags/self-hosting","a99"),exact:!0},{path:"/tags/sem-ver",component:l("/tags/sem-ver","57d"),exact:!0},{path:"/tags/seo",component:l("/tags/seo","129"),exact:!0},{path:"/tags/serverless",component:l("/tags/serverless","4b9"),exact:!0},{path:"/tags/smtp",component:l("/tags/smtp","bed"),exact:!0},{path:"/tags/solr",component:l("/tags/solr","722"),exact:!0},{path:"/tags/sql",component:l("/tags/sql","206"),exact:!0},{path:"/tags/ssd",component:l("/tags/ssd","cec"),exact:!0},{path:"/tags/ssh",component:l("/tags/ssh","28d"),exact:!0},{path:"/tags/state",component:l("/tags/state","b01"),exact:!0},{path:"/tags/stripe",component:l("/tags/stripe","bbb"),exact:!0},{path:"/tags/svg",component:l("/tags/svg","233"),exact:!0},{path:"/tags/tailwind-css",component:l("/tags/tailwind-css","35d"),exact:!0},{path:"/tags/tcp-ip",component:l("/tags/tcp-ip","59e"),exact:!0},{path:"/tags/tdd",component:l("/tags/tdd","c2c"),exact:!0},{path:"/tags/testing",component:l("/tags/testing","eff"),exact:!0},{path:"/tags/testing-library",component:l("/tags/testing-library","9c7"),exact:!0},{path:"/tags/tpay",component:l("/tags/tpay","a03"),exact:!0},{path:"/tags/tracking",component:l("/tags/tracking","afa"),exact:!0},{path:"/tags/ts",component:l("/tags/ts","f43"),exact:!0},{path:"/tags/type-script",component:l("/tags/type-script","8c5"),exact:!0},{path:"/tags/ui",component:l("/tags/ui","32e"),exact:!0},{path:"/tags/unit",component:l("/tags/unit","630"),exact:!0},{path:"/tags/uptime",component:l("/tags/uptime","790"),exact:!0},{path:"/tags/ux",component:l("/tags/ux","013"),exact:!0},{path:"/tags/vcs",component:l("/tags/vcs","83e"),exact:!0},{path:"/tags/vercel",component:l("/tags/vercel","7fa"),exact:!0},{path:"/tags/vim",component:l("/tags/vim","255"),exact:!0},{path:"/tags/virtualbox",component:l("/tags/virtualbox","bb0"),exact:!0},{path:"/tags/vite",component:l("/tags/vite","f1a"),exact:!0},{path:"/tags/vm",component:l("/tags/vm","378"),exact:!0},{path:"/tags/vps",component:l("/tags/vps","0ce"),exact:!0},{path:"/tags/vs-code",component:l("/tags/vs-code","fce"),exact:!0},{path:"/tags/wasm",component:l("/tags/wasm","d15"),exact:!0},{path:"/tags/web-components",component:l("/tags/web-components","cdb"),exact:!0},{path:"/tags/web-server",component:l("/tags/web-server","35f"),exact:!0},{path:"/tags/web-socket",component:l("/tags/web-socket","3ec"),exact:!0},{path:"/tags/webpack",component:l("/tags/webpack","465"),exact:!0},{path:"/tags/windows",component:l("/tags/windows","20d"),exact:!0},{path:"/twitter",component:l("/twitter","727"),exact:!0},{path:"/youtube",component:l("/youtube","e26"),exact:!0},{path:"/",component:l("/","b41"),exact:!0},{path:"/",component:l("/","94c"),routes:[{path:"/backend/api-zaplecza",component:l("/backend/api-zaplecza","66b"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/api-zaplecza/graphql",component:l("/backend/api-zaplecza/graphql","94b"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/api-zaplecza/restful-api",component:l("/backend/api-zaplecza/restful-api","163"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/bazy-danych",component:l("/backend/bazy-danych","9fe"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/bazy-danych/mapowanie-obiektowo-relacyjne",component:l("/backend/bazy-danych/mapowanie-obiektowo-relacyjne","b9b"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/brokery-wiadomosci",component:l("/backend/brokery-wiadomosci","d4c"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/ciagla-integracja-i-wdrazanie",component:l("/backend/ciagla-integracja-i-wdrazanie","1e4"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/infrastuktura",component:l("/backend/infrastuktura","1bb"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/monitoring",component:l("/backend/monitoring","48c"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/node-js",component:l("/backend/node-js","5c4"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/obsluga-emaili",component:l("/backend/obsluga-emaili","21e"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/obsluga-emaili/darmowy-system-do-email-marketingu-osems",component:l("/backend/obsluga-emaili/darmowy-system-do-email-marketingu-osems","1b5"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/obsluga-emaili/przekierowywanie-emaili-przez-cloudflare",component:l("/backend/obsluga-emaili/przekierowywanie-emaili-przez-cloudflare","d0e"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/projektowanie-backendu",component:l("/backend/projektowanie-backendu","9ea"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/serwery-internetowe",component:l("/backend/serwery-internetowe","154"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/silniki-wyszukiwania",component:l("/backend/silniki-wyszukiwania","8c2"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/systemy-zarzadzania-trescia",component:l("/backend/systemy-zarzadzania-trescia","729"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/wierwsz-polecen",component:l("/backend/wierwsz-polecen","07b"),exact:!0,sidebar:"backendSidebar"},{path:"/backend/wirtualizacja-i-konteneryzacja",component:l("/backend/wirtualizacja-i-konteneryzacja","44e"),exact:!0,sidebar:"backendSidebar"},{path:"/frontend/aplikacje-mobilne",component:l("/frontend/aplikacje-mobilne","17a"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/biblioteki",component:l("/frontend/biblioteki","158"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/css",component:l("/frontend/css","fa4"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/css/debugowanie-css-przez-narzedzia-developerskie",component:l("/frontend/css/debugowanie-css-przez-narzedzia-developerskie","df6"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/css/menu-mobilne-w-html-css-bez-javascript",component:l("/frontend/css/menu-mobilne-w-html-css-bez-javascript","2db"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/css/organizacja-styli-css-i-preprocesory",component:l("/frontend/css/organizacja-styli-css-i-preprocesory","321"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/css/wprowadzenie-w-css",component:l("/frontend/css/wprowadzenie-w-css","59b"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/dostepnosc",component:l("/frontend/dostepnosc","409"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/frontend",component:l("/frontend/frontend","77f"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/html",component:l("/frontend/html","19d"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/html/obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji",component:l("/frontend/html/obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji","c71"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/html/rdzen-metadane-sekcje",component:l("/frontend/html/rdzen-metadane-sekcje","ef5"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/html/tabele-formularze-elementy-interaktywne-komponenty",component:l("/frontend/html/tabele-formularze-elementy-interaktywne-komponenty","2dc"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/html/tekst",component:l("/frontend/html/tekst","fb2"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/html/wprowadzenie-do-htmla",component:l("/frontend/html/wprowadzenie-do-htmla","cdb"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/html/zadanie-domowe",component:l("/frontend/html/zadanie-domowe","08e"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/javascript",component:l("/frontend/javascript","645"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/javascript/automatyzacja-zadan-w-przegladarce-z-js",component:l("/frontend/javascript/automatyzacja-zadan-w-przegladarce-z-js","a41"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/javascript/nie-uzywaj-luznego-porownania-w-javascript",component:l("/frontend/javascript/nie-uzywaj-luznego-porownania-w-javascript","dd2"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/javascript/node-js-na-frontendzie copy",component:l("/frontend/javascript/node-js-na-frontendzie copy","4c7"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/javascript/podstawy-javascript",component:l("/frontend/javascript/podstawy-javascript","c3c"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/javascript/trawersowanie-drzewa-w-javascript-zadanie-rekrutacyjne",component:l("/frontend/javascript/trawersowanie-drzewa-w-javascript-zadanie-rekrutacyjne","cc0"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/javascript/wprowadzenie-w-typescript",component:l("/frontend/javascript/wprowadzenie-w-typescript","649"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/komponenty",component:l("/frontend/komponenty","7dd"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki",component:l("/frontend/pakiety-i-pakowarki","05b"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4",component:l("/frontend/pakiety-i-pakowarki/webpack-4","251"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/deweloperski-serwer-webpack-i-gorace-przeladowania",component:l("/frontend/pakiety-i-pakowarki/webpack-4/deweloperski-serwer-webpack-i-gorace-przeladowania","d2c"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/generowanie-pliku-html-z-szablonu",component:l("/frontend/pakiety-i-pakowarki/webpack-4/generowanie-pliku-html-z-szablonu","19a"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/ladowarki",component:l("/frontend/pakiety-i-pakowarki/webpack-4/ladowarki","dde"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/plik-konfiguracyjny",component:l("/frontend/pakiety-i-pakowarki/webpack-4/plik-konfiguracyjny","f4c"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/podstawowy-sposob-uzycia",component:l("/frontend/pakiety-i-pakowarki/webpack-4/podstawowy-sposob-uzycia","1b8"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/podzial-plikow-konfiguracyjnych",component:l("/frontend/pakiety-i-pakowarki/webpack-4/podzial-plikow-konfiguracyjnych","b5c"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/rozwiazywanie-sciezek-importu-plikow",component:l("/frontend/pakiety-i-pakowarki/webpack-4/rozwiazywanie-sciezek-importu-plikow","d27"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/pakiety-i-pakowarki/webpack-4/tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian",component:l("/frontend/pakiety-i-pakowarki/webpack-4/tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian","e71"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/progresywne-aplikacje",component:l("/frontend/progresywne-aplikacje","c77"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/react",component:l("/frontend/react","1b2"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/react/memoizowanie-cacheowanie-na-przykladzie-reacta",component:l("/frontend/react/memoizowanie-cacheowanie-na-przykladzie-reacta","15c"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/react/react-i-jego-ekosystem",component:l("/frontend/react/react-i-jego-ekosystem","deb"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/react/tworzenie-kopiarki-fragmentow-kodu-z-kolorowaniem-skladni",component:l("/frontend/react/tworzenie-kopiarki-fragmentow-kodu-z-kolorowaniem-skladni","2d4"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/seo",component:l("/frontend/seo","2a9"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/svg",component:l("/frontend/svg","539"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/webassembly",component:l("/frontend/webassembly","db8"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem",component:l("/frontend/zarzadzanie-stanem","e0b"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa","102"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/asynchroniczne-akcje",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/asynchroniczne-akcje","d70"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/koncept-dzialania-redux-a",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/koncept-dzialania-redux-a","3d6"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/laczenie-reduktorow",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/laczenie-reduktorow","cc7"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-magazynu",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-magazynu","e49"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-pojedynczych-elementow",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-pojedynczych-elementow","c48"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/podzial-kodu-na-mniejsze-pliki",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/podzial-kodu-na-mniejsze-pliki","0af"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/predefiniowane-typy-akcji-i-kreatory-akcji",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/predefiniowane-typy-akcji-i-kreatory-akcji","9f1"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/przygotowanie-srodowiska-deweloperskiego",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/przygotowanie-srodowiska-deweloperskiego","49d"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/redux-thunk",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/redux-thunk","c11"),exact:!0,sidebar:"frontendSidebar"},{path:"/frontend/zarzadzanie-stanem/podstawy-reduxa/zarzadzanie-wieloma-stanami",component:l("/frontend/zarzadzanie-stanem/podstawy-reduxa/zarzadzanie-wieloma-stanami","bf0"),exact:!0,sidebar:"frontendSidebar"},{path:"/fullstack/autentykacja-i-autoryzacja",component:l("/fullstack/autentykacja-i-autoryzacja","767"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji",component:l("/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji","eb6"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/logowanie",component:l("/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/logowanie","5bc"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/obsluga-sesji",component:l("/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/obsluga-sesji","784"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/projekt-systemu-uwierzytelniania",component:l("/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/projekt-systemu-uwierzytelniania","62c"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/rejestracja",component:l("/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/rejestracja","aa2"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/wylogowanie",component:l("/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/wylogowanie","9de"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/bramki-platnicze",component:l("/fullstack/bramki-platnicze","2f5"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/fullstack",component:l("/fullstack/fullstack","fd9"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js",component:l("/fullstack/next-js","81c"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js",component:l("/fullstack/next-js/mini-projekt-z-next-js","50c"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js/hosting-aplikacji-w-serwisie-vercel",component:l("/fullstack/next-js/mini-projekt-z-next-js/hosting-aplikacji-w-serwisie-vercel","dab"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js/inne-serwisy-hostingowe-i-cloud-development",component:l("/fullstack/next-js/mini-projekt-z-next-js/inne-serwisy-hostingowe-i-cloud-development","45f"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js/instalacja-niezbednego-oprogramowania",component:l("/fullstack/next-js/mini-projekt-z-next-js/instalacja-niezbednego-oprogramowania","752"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js/korzystanie-z-bazy-danych-mongodb-i-prismy",component:l("/fullstack/next-js/mini-projekt-z-next-js/korzystanie-z-bazy-danych-mongodb-i-prismy","44a"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js/obsluga-formularza-i-api",component:l("/fullstack/next-js/mini-projekt-z-next-js/obsluga-formularza-i-api","ca9"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js/stworzenie-strony-glownej",component:l("/fullstack/next-js/mini-projekt-z-next-js/stworzenie-strony-glownej","ca8"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/mini-projekt-z-next-js/system-kontroli-wersji-git-i-serwis-github",component:l("/fullstack/next-js/mini-projekt-z-next-js/system-kontroli-wersji-git-i-serwis-github","f9a"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/next-js/warsztat-next-js-2022-12-20",component:l("/fullstack/next-js/warsztat-next-js-2022-12-20","9b2"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/paginacja",component:l("/fullstack/paginacja","979"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/powiadomienia-push",component:l("/fullstack/powiadomienia-push","501"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/sledzenie",component:l("/fullstack/sledzenie","a0e"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/trasowanie",component:l("/fullstack/trasowanie","385"),exact:!0,sidebar:"fullstackSidebar"},{path:"/fullstack/websocket",component:l("/fullstack/websocket","54a"),exact:!0,sidebar:"fullstackSidebar"},{path:"/podstawy/aplikacje",component:l("/podstawy/aplikacje","d25"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/architektura-oprogramowania",component:l("/podstawy/architektura-oprogramowania","f63"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/bezpieczenstwo",component:l("/podstawy/bezpieczenstwo","e5c"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/debugowanie",component:l("/podstawy/debugowanie","0aa"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/dns-i-domeny",component:l("/podstawy/dns-i-domeny","dc2"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/dokumentacje",component:l("/podstawy/dokumentacje","e58"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/dokumentacje/jak-czytac-dokumentacje",component:l("/podstawy/dokumentacje/jak-czytac-dokumentacje","972"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/dokumentacje/jak-tworzyc-dokumentacje",component:l("/podstawy/dokumentacje/jak-tworzyc-dokumentacje","fa2"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/edytory-kodu",component:l("/podstawy/edytory-kodu","16c"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/edytory-kodu/formatowanie-kodu",component:l("/podstawy/edytory-kodu/formatowanie-kodu","45e"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/edytory-kodu/vim",component:l("/podstawy/edytory-kodu/vim","09a"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/edytory-kodu/visual-studio-code",component:l("/podstawy/edytory-kodu/visual-studio-code","5f0"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/haszowanie",component:l("/podstawy/haszowanie","470"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/hosting",component:l("/podstawy/hosting","920"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/hosting/darmowy-hosting-statycznych-stron-w-serwisie-github",component:l("/podstawy/hosting/darmowy-hosting-statycznych-stron-w-serwisie-github","483"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/hosting/konfiguracja-wlasnego-serwera-wirtualnego-vps copy",component:l("/podstawy/hosting/konfiguracja-wlasnego-serwera-wirtualnego-vps copy","206"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/hosting/serwuj-strony-internetowe-z-twojego-komputera copy",component:l("/podstawy/hosting/serwuj-strony-internetowe-z-twojego-komputera copy","a62"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/informatyka",component:l("/podstawy/informatyka","f92"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/jezyki-programowania",component:l("/podstawy/jezyki-programowania","5f1"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/jezyki-programowania/c",component:l("/podstawy/jezyki-programowania/c","ccf"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/jezyki-programowania/javascript",component:l("/podstawy/jezyki-programowania/javascript","86b"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/jezyki-programowania/php",component:l("/podstawy/jezyki-programowania/php","e21"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/jezyki-programowania/python",component:l("/podstawy/jezyki-programowania/python","a65"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/jezyki-programowania/scratch",component:l("/podstawy/jezyki-programowania/scratch","8ea"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji",component:l("/podstawy/kontrola-wersji","f6c"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/github",component:l("/podstawy/kontrola-wersji/github","8f0"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/inspekcja-kodu",component:l("/podstawy/kontrola-wersji/inspekcja-kodu","daa"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita",component:l("/podstawy/kontrola-wersji/podstawy-gita","2fe"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/czym-jest-git",component:l("/podstawy/kontrola-wersji/podstawy-gita/czym-jest-git","a93"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/etykietowanie",component:l("/podstawy/kontrola-wersji/podstawy-gita/etykietowanie","69a"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/galezie-laczenie-galezi-i-rozwiazywanie-konfliktow",component:l("/podstawy/kontrola-wersji/podstawy-gita/galezie-laczenie-galezi-i-rozwiazywanie-konfliktow","062"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/ignorowanie-plikow-i-katalogow",component:l("/podstawy/kontrola-wersji/podstawy-gita/ignorowanie-plikow-i-katalogow","1cd"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/instalacja",component:l("/podstawy/kontrola-wersji/podstawy-gita/instalacja","5b9"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/korzystanie-z-dokumentacji",component:l("/podstawy/kontrola-wersji/podstawy-gita/korzystanie-z-dokumentacji","4b5"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/podrozowanie-w-czasie",component:l("/podstawy/kontrola-wersji/podstawy-gita/podrozowanie-w-czasie","c73"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/praca-z-graficznym-interfejsem-git-w-visual-studio-code",component:l("/podstawy/kontrola-wersji/podstawy-gita/praca-z-graficznym-interfejsem-git-w-visual-studio-code","1a3"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/praca-ze-zdalnym-repozytorium-github",component:l("/podstawy/kontrola-wersji/podstawy-gita/praca-ze-zdalnym-repozytorium-github","1d5"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/kontrola-wersji/podstawy-gita/tymczasowe-przechowywanie-zmian",component:l("/podstawy/kontrola-wersji/podstawy-gita/tymczasowe-przechowywanie-zmian","ea6"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/licencje",component:l("/podstawy/licencje","bb5"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/pamiec-podreczna",component:l("/podstawy/pamiec-podreczna","0f4"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/praca-w-it",component:l("/podstawy/praca-w-it","2fe"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/praca-w-it/backend-developer",component:l("/podstawy/praca-w-it/backend-developer","ed7"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/praca-w-it/devops-qa-i-inne",component:l("/podstawy/praca-w-it/devops-qa-i-inne","8b3"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/praca-w-it/frontend-developer",component:l("/podstawy/praca-w-it/frontend-developer","938"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/praca-w-it/ux-ui-designer",component:l("/podstawy/praca-w-it/ux-ui-designer","090"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie",component:l("/podstawy/programowanie","055"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/algorytmy",component:l("/podstawy/programowanie/algorytmy","3bf"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/api",component:l("/podstawy/programowanie/api","157"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/dobre-praktyki",component:l("/podstawy/programowanie/dobre-praktyki","673"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/frameworki-i-biblioteki",component:l("/podstawy/programowanie/frameworki-i-biblioteki","ab3"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/paradygmaty-programowania",component:l("/podstawy/programowanie/paradygmaty-programowania","13d"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/struktury-i-bazy-danych",component:l("/podstawy/programowanie/struktury-i-bazy-danych","88e"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/typowanie-statyczne-i-dynamiczne",component:l("/podstawy/programowanie/typowanie-statyczne-i-dynamiczne","b5c"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/wyrazenia-regularne",component:l("/podstawy/programowanie/wyrazenia-regularne","c94"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/programowanie/wzorce-projektowe",component:l("/podstawy/programowanie/wzorce-projektowe","0a1"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/siec",component:l("/podstawy/siec","07e"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/siec/jak-dziala-internet",component:l("/podstawy/siec/jak-dziala-internet","404"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/sprzet-komputerowy",component:l("/podstawy/sprzet-komputerowy","eb4"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/sprzet-komputerowy/system-binarny",component:l("/podstawy/sprzet-komputerowy/system-binarny","f09"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/sprzet-komputerowy/system-binarny/podstawy-systemu-binarnego",component:l("/podstawy/sprzet-komputerowy/system-binarny/podstawy-systemu-binarnego","206"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/sprzet-komputerowy/system-binarny/system-binarny",component:l("/podstawy/sprzet-komputerowy/system-binarny/system-binarny","9b9"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/systemy-operacyjne",component:l("/podstawy/systemy-operacyjne","44d"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/systemy-operacyjne/chrome-os",component:l("/podstawy/systemy-operacyjne/chrome-os","e10"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/systemy-operacyjne/free-bsd",component:l("/podstawy/systemy-operacyjne/free-bsd","60d"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/systemy-operacyjne/linux",component:l("/podstawy/systemy-operacyjne/linux","879"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/systemy-operacyjne/macos-i-ios",component:l("/podstawy/systemy-operacyjne/macos-i-ios","243"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/systemy-operacyjne/windows",component:l("/podstawy/systemy-operacyjne/windows","689"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/testowanie",component:l("/podstawy/testowanie","6b9"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/testowanie/przyklady-testow-jednostkowych-integracyjnych-i-e2e",component:l("/podstawy/testowanie/przyklady-testow-jednostkowych-integracyjnych-i-e2e","0ab"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/testowanie/wprowadzenie-do-testowania",component:l("/podstawy/testowanie/wprowadzenie-do-testowania","908"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/warstwy-abstrakcji",component:l("/podstawy/warstwy-abstrakcji","a62"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/wydajnosc",component:l("/podstawy/wydajnosc","9a3"),exact:!0,sidebar:"basicsSidebar"},{path:"/podstawy/zarzadzanie-projektami",component:l("/podstawy/zarzadzanie-projektami","c44"),exact:!0,sidebar:"basicsSidebar"},{path:"/ux-ui/czy-do-zostania-designerem-ux-ui-potrzeba-10000-godzin",component:l("/ux-ui/czy-do-zostania-designerem-ux-ui-potrzeba-10000-godzin","324"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/praktyczne-szkolenie-projektowania-ux-ui",component:l("/ux-ui/praktyczne-szkolenie-projektowania-ux-ui","17c"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/material-uzupelniajacy-ui",component:l("/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/material-uzupelniajacy-ui","97b"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/nagranie-z-webinaru-ux",component:l("/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/nagranie-z-webinaru-ux","de0"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow","cac"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/detale",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/detale","056"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-ilustracji",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-ilustracji","c70"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-typografii-i-kolorow",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-typografii-i-kolorow","91e"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/formularzdostepnosci-uslugi",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/formularzdostepnosci-uslugi","2a0"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/glebia",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/glebia","08a"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/identyfikacja-marki",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/identyfikacja-marki","88a"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/korzystanie-z-figmy",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/korzystanie-z-figmy","5d0"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/mapa-strony",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/mapa-strony","ed1"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/persona-uzytkownika",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/persona-uzytkownika","85b"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/projektowanie-szkieletu",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/projektowanie-szkieletu","691"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/prototyp",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/prototyp","050"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/przygotowanie-elementow-szkieletu",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/przygotowanie-elementow-szkieletu","f50"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/rozmieszczenie-grafik",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/rozmieszczenie-grafik","e9f"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/scenariusze-uzytkownika",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/scenariusze-uzytkownika","b48"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/schemat-dzialan-uzytkownika",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/schemat-dzialan-uzytkownika","07f"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tablica-inspiracji",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tablica-inspiracji","656"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-graficzne",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-graficzne","687"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-tekstowe",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-tekstowe","7b9"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/wprowadzenie",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/wprowadzenie","d9f"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/zapoznanie-z-interfejsem",component:l("/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/zapoznanie-z-interfejsem","f2d"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-ux-ui",component:l("/ux-ui/projektowanie-ux-ui","808"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/projektowanie-vs-kodowanie",component:l("/ux-ui/projektowanie-vs-kodowanie","c13"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/przeprojektowanie-interfejsu-strony-internetowej-gls",component:l("/ux-ui/przeprojektowanie-interfejsu-strony-internetowej-gls","9e9"),exact:!0,sidebar:"uxuiSidebar"},{path:"/ux-ui/roznice-miedzy-ux-ui",component:l("/ux-ui/roznice-miedzy-ux-ui","cc1"),exact:!0,sidebar:"uxuiSidebar"}]},{path:"*",component:l("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>c});var a=n(67294);const o=a.createContext(!1);function c(e){let{children:t}=e;const[n,c]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{c(!0)}),[]),a.createElement(o.Provider,{value:n},t)}},49383:(e,t,n)=>{"use strict";var a=n(67294),o=n(73935),c=n(73727),i=n(70405),s=n(10412);const r=[n(56657),n(32497),n(3310),n(18320),n(52295)];var d=n(723),u=n(16550),b=n(18790);function l(e){let{children:t}=e;return a.createElement(a.Fragment,null,t)}var f=n(87462),p=n(35742),g=n(52263),m=n(44996),w=n(86668),h=n(1944),_=n(94711),y=n(19727),j=n(43320),k=n(90197);function x(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,_.l)();return a.createElement(p.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:o}]=e;return a.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:o})})),a.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function v(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),o=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,u.TH)();return e+(0,m.Z)(t)}(),c=t?`${n}${t}`:o;return a.createElement(p.Z,null,a.createElement("meta",{property:"og:url",content:c}),a.createElement("link",{rel:"canonical",href:c}))}function z(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,w.L)();return a.createElement(a.Fragment,null,a.createElement(p.Z,null,a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("body",{className:y.h})),n&&a.createElement(h.d,{image:n}),a.createElement(v,null),a.createElement(x,null),a.createElement(k.Z,{tag:j.HX,locale:e}),a.createElement(p.Z,null,t.map(((e,t)=>a.createElement("meta",(0,f.Z)({key:t},e))))))}const C=new Map;function S(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,b.f)(d.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var E=n(98934),D=n(58940);function T(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a{const a=t.default?.[e]??t[e];return a?.(...n)}));return()=>o.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:o}=e;return(0,a.useLayoutEffect)((()=>{o!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const a=t.pathname===n.pathname,o=t.hash===n.hash,c=t.search===n.search;if(a&&o&&!c)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:o}),T("onRouteDidUpdate",{previousLocation:o,location:n}))}),[o,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,b.f)(d.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class A extends a.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?T("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=T("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return a.createElement(P,{previousLocation:this.previousLocation,location:t},a.createElement(u.AW,{location:t,render:()=>e}))}}const N=A,R="__docusaurus-base-url-issue-banner-container",O="__docusaurus-base-url-issue-banner",I="__docusaurus-base-url-issue-banner-suggestion-container",M="__DOCUSAURUS_INSERT_BASEURL_BANNER";function F(e){return`\nwindow['${M}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${M}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${R}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[M]=!1}),[]),a.createElement(a.Fragment,null,!s.Z.canUseDOM&&a.createElement(p.Z,null,a.createElement("script",null,F(e))),a.createElement("div",{id:R}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?a.createElement(B,null):null}function $(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:o,localeConfigs:c}}=(0,g.Z)(),i=(0,m.Z)(e),{htmlLang:s,direction:r}=c[o];return a.createElement(p.Z,null,a.createElement("html",{lang:s,dir:r}),a.createElement("title",null,t),a.createElement("meta",{property:"og:title",content:t}),a.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&a.createElement("link",{rel:"icon",href:i}))}var q=n(44763);function H(){const e=(0,b.H)(d.Z),t=(0,u.TH)();return a.createElement(q.Z,null,a.createElement(D.M,null,a.createElement(E.t,null,a.createElement(l,null,a.createElement($,null),a.createElement(z,null),a.createElement(U,null),a.createElement(N,{location:S(t)},e)))))}var G=n(16887);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const a=new XMLHttpRequest;a.open("GET",e,!0),a.withCredentials=!0,a.onload=()=>{200===a.status?t():n()},a.send(null)}))};var V=n(99670);const W=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,b.f)(d.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,V.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),L(e))},Q=Object.freeze(X);if(s.Z.canUseDOM){window.docusaurus=Q;const e=o.hydrate;L(window.location.pathname).then((()=>{e(a.createElement(i.B6,null,a.createElement(c.VK,null,a.createElement(H,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>b});var a=n(67294),o=n(36809);const c=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-C4MJB6VCM9"],"anonymizeIP":true,"id":"default"}},"docusaurus-lunr-search":{"default":{"fileNames":{"searchDoc":"search-doc-1693727825551.json","lunrIndex":"lunr-index-1693727825551.json"}}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"podstawy/informatyka/index","docs":[{"id":"backend/api-zaplecza/graphql","path":"/backend/api-zaplecza/graphql","sidebar":"backendSidebar"},{"id":"backend/api-zaplecza/index","path":"/backend/api-zaplecza/","sidebar":"backendSidebar"},{"id":"backend/api-zaplecza/restful-api","path":"/backend/api-zaplecza/restful-api","sidebar":"backendSidebar"},{"id":"backend/bazy-danych/index","path":"/backend/bazy-danych/","sidebar":"backendSidebar"},{"id":"backend/bazy-danych/mapowanie-obiektowo-relacyjne","path":"/backend/bazy-danych/mapowanie-obiektowo-relacyjne","sidebar":"backendSidebar"},{"id":"backend/brokery-wiadomosci/index","path":"/backend/brokery-wiadomosci/","sidebar":"backendSidebar"},{"id":"backend/ciagla-integracja-i-wdrazanie/index","path":"/backend/ciagla-integracja-i-wdrazanie/","sidebar":"backendSidebar"},{"id":"backend/infrastuktura/index","path":"/backend/infrastuktura/","sidebar":"backendSidebar"},{"id":"backend/monitoring/index","path":"/backend/monitoring/","sidebar":"backendSidebar"},{"id":"backend/node-js/index","path":"/backend/node-js/","sidebar":"backendSidebar"},{"id":"backend/obsluga-emaili/darmowy-system-do-email-marketingu-osems","path":"/backend/obsluga-emaili/darmowy-system-do-email-marketingu-osems","sidebar":"backendSidebar"},{"id":"backend/obsluga-emaili/index","path":"/backend/obsluga-emaili/","sidebar":"backendSidebar"},{"id":"backend/obsluga-emaili/przekierowywanie-emaili-przez-cloudflare","path":"/backend/obsluga-emaili/przekierowywanie-emaili-przez-cloudflare","sidebar":"backendSidebar"},{"id":"backend/projektowanie-backendu/index","path":"/backend/projektowanie-backendu/","sidebar":"backendSidebar"},{"id":"backend/serwery-internetowe/index","path":"/backend/serwery-internetowe/","sidebar":"backendSidebar"},{"id":"backend/silniki-wyszukiwania/index","path":"/backend/silniki-wyszukiwania/","sidebar":"backendSidebar"},{"id":"backend/systemy-zarzadzania-trescia/index","path":"/backend/systemy-zarzadzania-trescia/","sidebar":"backendSidebar"},{"id":"backend/wierwsz-polecen/index","path":"/backend/wierwsz-polecen/","sidebar":"backendSidebar"},{"id":"backend/wirtualizacja-i-konteneryzacja/index","path":"/backend/wirtualizacja-i-konteneryzacja/","sidebar":"backendSidebar"},{"id":"frontend/aplikacje-mobilne/index","path":"/frontend/aplikacje-mobilne/","sidebar":"frontendSidebar"},{"id":"frontend/biblioteki/index","path":"/frontend/biblioteki/","sidebar":"frontendSidebar"},{"id":"frontend/css/debugowanie-css-przez-narzedzia-developerskie","path":"/frontend/css/debugowanie-css-przez-narzedzia-developerskie","sidebar":"frontendSidebar"},{"id":"frontend/css/index","path":"/frontend/css/","sidebar":"frontendSidebar"},{"id":"frontend/css/menu-mobilne-w-html-css-bez-javascript","path":"/frontend/css/menu-mobilne-w-html-css-bez-javascript","sidebar":"frontendSidebar"},{"id":"frontend/css/organizacja-styli-css-i-preprocesory","path":"/frontend/css/organizacja-styli-css-i-preprocesory","sidebar":"frontendSidebar"},{"id":"frontend/css/wprowadzenie-w-css","path":"/frontend/css/wprowadzenie-w-css","sidebar":"frontendSidebar"},{"id":"frontend/dostepnosc/index","path":"/frontend/dostepnosc/","sidebar":"frontendSidebar"},{"id":"frontend/frontend/index","path":"/frontend/frontend/","sidebar":"frontendSidebar"},{"id":"frontend/html/index","path":"/frontend/html/","sidebar":"frontendSidebar"},{"id":"frontend/html/obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji","path":"/frontend/html/obrazki-i-multimedia-osadzanie-skrypty-sledzenie-edycji","sidebar":"frontendSidebar"},{"id":"frontend/html/rdzen-metadane-sekcje","path":"/frontend/html/rdzen-metadane-sekcje","sidebar":"frontendSidebar"},{"id":"frontend/html/tabele-formularze-elementy-interaktywne-komponenty","path":"/frontend/html/tabele-formularze-elementy-interaktywne-komponenty","sidebar":"frontendSidebar"},{"id":"frontend/html/tekst","path":"/frontend/html/tekst","sidebar":"frontendSidebar"},{"id":"frontend/html/wprowadzenie-do-htmla","path":"/frontend/html/wprowadzenie-do-htmla","sidebar":"frontendSidebar"},{"id":"frontend/html/zadanie-domowe","path":"/frontend/html/zadanie-domowe","sidebar":"frontendSidebar"},{"id":"frontend/javascript/automatyzacja-zadan-w-przegladarce-z-js","path":"/frontend/javascript/automatyzacja-zadan-w-przegladarce-z-js","sidebar":"frontendSidebar"},{"id":"frontend/javascript/index","path":"/frontend/javascript/","sidebar":"frontendSidebar"},{"id":"frontend/javascript/nie-uzywaj-luznego-porownania-w-javascript","path":"/frontend/javascript/nie-uzywaj-luznego-porownania-w-javascript","sidebar":"frontendSidebar"},{"id":"frontend/javascript/node-js-na-frontendzie copy","path":"/frontend/javascript/node-js-na-frontendzie copy","sidebar":"frontendSidebar"},{"id":"frontend/javascript/podstawy-javascript","path":"/frontend/javascript/podstawy-javascript","sidebar":"frontendSidebar"},{"id":"frontend/javascript/trawersowanie-drzewa-w-javascript-zadanie-rekrutacyjne","path":"/frontend/javascript/trawersowanie-drzewa-w-javascript-zadanie-rekrutacyjne","sidebar":"frontendSidebar"},{"id":"frontend/javascript/wprowadzenie-w-typescript","path":"/frontend/javascript/wprowadzenie-w-typescript","sidebar":"frontendSidebar"},{"id":"frontend/komponenty/index","path":"/frontend/komponenty/","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/index","path":"/frontend/pakiety-i-pakowarki/","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/deweloperski-serwer-webpack-i-gorace-przeladowania","path":"/frontend/pakiety-i-pakowarki/webpack-4/deweloperski-serwer-webpack-i-gorace-przeladowania","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/generowanie-pliku-html-z-szablonu","path":"/frontend/pakiety-i-pakowarki/webpack-4/generowanie-pliku-html-z-szablonu","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/index","path":"/frontend/pakiety-i-pakowarki/webpack-4/","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/ladowarki","path":"/frontend/pakiety-i-pakowarki/webpack-4/ladowarki","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/plik-konfiguracyjny","path":"/frontend/pakiety-i-pakowarki/webpack-4/plik-konfiguracyjny","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/podstawowy-sposob-uzycia","path":"/frontend/pakiety-i-pakowarki/webpack-4/podstawowy-sposob-uzycia","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/podzial-plikow-konfiguracyjnych","path":"/frontend/pakiety-i-pakowarki/webpack-4/podzial-plikow-konfiguracyjnych","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/rozwiazywanie-sciezek-importu-plikow","path":"/frontend/pakiety-i-pakowarki/webpack-4/rozwiazywanie-sciezek-importu-plikow","sidebar":"frontendSidebar"},{"id":"frontend/pakiety-i-pakowarki/webpack-4/tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian","path":"/frontend/pakiety-i-pakowarki/webpack-4/tryb-deweloperski-mapa-zrodla-i-obserwacja-zmian","sidebar":"frontendSidebar"},{"id":"frontend/progresywne-aplikacje/index","path":"/frontend/progresywne-aplikacje/","sidebar":"frontendSidebar"},{"id":"frontend/react/index","path":"/frontend/react/","sidebar":"frontendSidebar"},{"id":"frontend/react/memoizowanie-cacheowanie-na-przykladzie-reacta","path":"/frontend/react/memoizowanie-cacheowanie-na-przykladzie-reacta","sidebar":"frontendSidebar"},{"id":"frontend/react/react-i-jego-ekosystem","path":"/frontend/react/react-i-jego-ekosystem","sidebar":"frontendSidebar"},{"id":"frontend/react/tworzenie-kopiarki-fragmentow-kodu-z-kolorowaniem-skladni","path":"/frontend/react/tworzenie-kopiarki-fragmentow-kodu-z-kolorowaniem-skladni","sidebar":"frontendSidebar"},{"id":"frontend/seo/index","path":"/frontend/seo/","sidebar":"frontendSidebar"},{"id":"frontend/svg/index","path":"/frontend/svg/","sidebar":"frontendSidebar"},{"id":"frontend/webassembly/index","path":"/frontend/webassembly/","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/index","path":"/frontend/zarzadzanie-stanem/","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/asynchroniczne-akcje","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/asynchroniczne-akcje","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/index","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/koncept-dzialania-redux-a","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/koncept-dzialania-redux-a","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/laczenie-reduktorow","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/laczenie-reduktorow","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-magazynu","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-magazynu","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-pojedynczych-elementow","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/modyfikowanie-stanu-pojedynczych-elementow","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/podzial-kodu-na-mniejsze-pliki","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/podzial-kodu-na-mniejsze-pliki","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/predefiniowane-typy-akcji-i-kreatory-akcji","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/predefiniowane-typy-akcji-i-kreatory-akcji","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/przygotowanie-srodowiska-deweloperskiego","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/przygotowanie-srodowiska-deweloperskiego","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/redux-thunk","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/redux-thunk","sidebar":"frontendSidebar"},{"id":"frontend/zarzadzanie-stanem/podstawy-reduxa/zarzadzanie-wieloma-stanami","path":"/frontend/zarzadzanie-stanem/podstawy-reduxa/zarzadzanie-wieloma-stanami","sidebar":"frontendSidebar"},{"id":"fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/index","path":"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/","sidebar":"fullstackSidebar"},{"id":"fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/logowanie","path":"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/logowanie","sidebar":"fullstackSidebar"},{"id":"fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/obsluga-sesji","path":"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/obsluga-sesji","sidebar":"fullstackSidebar"},{"id":"fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/projekt-systemu-uwierzytelniania","path":"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/projekt-systemu-uwierzytelniania","sidebar":"fullstackSidebar"},{"id":"fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/rejestracja","path":"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/rejestracja","sidebar":"fullstackSidebar"},{"id":"fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/wylogowanie","path":"/fullstack/autentykacja-i-autoryzacja/implementacja-autentykacji/wylogowanie","sidebar":"fullstackSidebar"},{"id":"fullstack/autentykacja-i-autoryzacja/index","path":"/fullstack/autentykacja-i-autoryzacja/","sidebar":"fullstackSidebar"},{"id":"fullstack/bramki-platnicze/index","path":"/fullstack/bramki-platnicze/","sidebar":"fullstackSidebar"},{"id":"fullstack/fullstack/index","path":"/fullstack/fullstack/","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/index","path":"/fullstack/next-js/","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/hosting-aplikacji-w-serwisie-vercel","path":"/fullstack/next-js/mini-projekt-z-next-js/hosting-aplikacji-w-serwisie-vercel","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/index","path":"/fullstack/next-js/mini-projekt-z-next-js/","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/inne-serwisy-hostingowe-i-cloud-development","path":"/fullstack/next-js/mini-projekt-z-next-js/inne-serwisy-hostingowe-i-cloud-development","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/instalacja-niezbednego-oprogramowania","path":"/fullstack/next-js/mini-projekt-z-next-js/instalacja-niezbednego-oprogramowania","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/korzystanie-z-bazy-danych-mongodb-i-prismy","path":"/fullstack/next-js/mini-projekt-z-next-js/korzystanie-z-bazy-danych-mongodb-i-prismy","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/obsluga-formularza-i-api","path":"/fullstack/next-js/mini-projekt-z-next-js/obsluga-formularza-i-api","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/stworzenie-strony-glownej","path":"/fullstack/next-js/mini-projekt-z-next-js/stworzenie-strony-glownej","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/mini-projekt-z-next-js/system-kontroli-wersji-git-i-serwis-github","path":"/fullstack/next-js/mini-projekt-z-next-js/system-kontroli-wersji-git-i-serwis-github","sidebar":"fullstackSidebar"},{"id":"fullstack/next-js/warsztat-next-js-2022-12-20","path":"/fullstack/next-js/warsztat-next-js-2022-12-20","sidebar":"fullstackSidebar"},{"id":"fullstack/paginacja/index","path":"/fullstack/paginacja/","sidebar":"fullstackSidebar"},{"id":"fullstack/powiadomienia-push/index","path":"/fullstack/powiadomienia-push/","sidebar":"fullstackSidebar"},{"id":"fullstack/sledzenie/index","path":"/fullstack/sledzenie/","sidebar":"fullstackSidebar"},{"id":"fullstack/trasowanie/index","path":"/fullstack/trasowanie/","sidebar":"fullstackSidebar"},{"id":"fullstack/websocket/index","path":"/fullstack/websocket/","sidebar":"fullstackSidebar"},{"id":"podstawy/aplikacje/index","path":"/podstawy/aplikacje/","sidebar":"basicsSidebar"},{"id":"podstawy/architektura-oprogramowania/index","path":"/podstawy/architektura-oprogramowania/","sidebar":"basicsSidebar"},{"id":"podstawy/bezpieczenstwo/index","path":"/podstawy/bezpieczenstwo/","sidebar":"basicsSidebar"},{"id":"podstawy/debugowanie/index","path":"/podstawy/debugowanie/","sidebar":"basicsSidebar"},{"id":"podstawy/dns-i-domeny/index","path":"/podstawy/dns-i-domeny/","sidebar":"basicsSidebar"},{"id":"podstawy/dokumentacje/index","path":"/podstawy/dokumentacje/","sidebar":"basicsSidebar"},{"id":"podstawy/dokumentacje/jak-czytac-dokumentacje","path":"/podstawy/dokumentacje/jak-czytac-dokumentacje","sidebar":"basicsSidebar"},{"id":"podstawy/dokumentacje/jak-tworzyc-dokumentacje","path":"/podstawy/dokumentacje/jak-tworzyc-dokumentacje","sidebar":"basicsSidebar"},{"id":"podstawy/edytory-kodu/formatowanie-kodu","path":"/podstawy/edytory-kodu/formatowanie-kodu","sidebar":"basicsSidebar"},{"id":"podstawy/edytory-kodu/index","path":"/podstawy/edytory-kodu/","sidebar":"basicsSidebar"},{"id":"podstawy/edytory-kodu/vim","path":"/podstawy/edytory-kodu/vim","sidebar":"basicsSidebar"},{"id":"podstawy/edytory-kodu/visual-studio-code","path":"/podstawy/edytory-kodu/visual-studio-code","sidebar":"basicsSidebar"},{"id":"podstawy/haszowanie/index","path":"/podstawy/haszowanie/","sidebar":"basicsSidebar"},{"id":"podstawy/hosting/darmowy-hosting-statycznych-stron-w-serwisie-github","path":"/podstawy/hosting/darmowy-hosting-statycznych-stron-w-serwisie-github","sidebar":"basicsSidebar"},{"id":"podstawy/hosting/index","path":"/podstawy/hosting/","sidebar":"basicsSidebar"},{"id":"podstawy/hosting/konfiguracja-wlasnego-serwera-wirtualnego-vps copy","path":"/podstawy/hosting/konfiguracja-wlasnego-serwera-wirtualnego-vps copy","sidebar":"basicsSidebar"},{"id":"podstawy/hosting/serwuj-strony-internetowe-z-twojego-komputera copy","path":"/podstawy/hosting/serwuj-strony-internetowe-z-twojego-komputera copy","sidebar":"basicsSidebar"},{"id":"podstawy/informatyka/index","path":"/podstawy/informatyka/","sidebar":"basicsSidebar"},{"id":"podstawy/jezyki-programowania/c","path":"/podstawy/jezyki-programowania/c","sidebar":"basicsSidebar"},{"id":"podstawy/jezyki-programowania/index","path":"/podstawy/jezyki-programowania/","sidebar":"basicsSidebar"},{"id":"podstawy/jezyki-programowania/javascript","path":"/podstawy/jezyki-programowania/javascript","sidebar":"basicsSidebar"},{"id":"podstawy/jezyki-programowania/php","path":"/podstawy/jezyki-programowania/php","sidebar":"basicsSidebar"},{"id":"podstawy/jezyki-programowania/python","path":"/podstawy/jezyki-programowania/python","sidebar":"basicsSidebar"},{"id":"podstawy/jezyki-programowania/scratch","path":"/podstawy/jezyki-programowania/scratch","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/github","path":"/podstawy/kontrola-wersji/github","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/index","path":"/podstawy/kontrola-wersji/","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/inspekcja-kodu","path":"/podstawy/kontrola-wersji/inspekcja-kodu","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/czym-jest-git","path":"/podstawy/kontrola-wersji/podstawy-gita/czym-jest-git","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/etykietowanie","path":"/podstawy/kontrola-wersji/podstawy-gita/etykietowanie","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/galezie-laczenie-galezi-i-rozwiazywanie-konfliktow","path":"/podstawy/kontrola-wersji/podstawy-gita/galezie-laczenie-galezi-i-rozwiazywanie-konfliktow","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/ignorowanie-plikow-i-katalogow","path":"/podstawy/kontrola-wersji/podstawy-gita/ignorowanie-plikow-i-katalogow","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/index","path":"/podstawy/kontrola-wersji/podstawy-gita/","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/instalacja","path":"/podstawy/kontrola-wersji/podstawy-gita/instalacja","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/korzystanie-z-dokumentacji","path":"/podstawy/kontrola-wersji/podstawy-gita/korzystanie-z-dokumentacji","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/podrozowanie-w-czasie","path":"/podstawy/kontrola-wersji/podstawy-gita/podrozowanie-w-czasie","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/praca-z-graficznym-interfejsem-git-w-visual-studio-code","path":"/podstawy/kontrola-wersji/podstawy-gita/praca-z-graficznym-interfejsem-git-w-visual-studio-code","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/praca-ze-zdalnym-repozytorium-github","path":"/podstawy/kontrola-wersji/podstawy-gita/praca-ze-zdalnym-repozytorium-github","sidebar":"basicsSidebar"},{"id":"podstawy/kontrola-wersji/podstawy-gita/tymczasowe-przechowywanie-zmian","path":"/podstawy/kontrola-wersji/podstawy-gita/tymczasowe-przechowywanie-zmian","sidebar":"basicsSidebar"},{"id":"podstawy/licencje/index","path":"/podstawy/licencje/","sidebar":"basicsSidebar"},{"id":"podstawy/pamiec-podreczna/index","path":"/podstawy/pamiec-podreczna/","sidebar":"basicsSidebar"},{"id":"podstawy/praca-w-it/backend-developer","path":"/podstawy/praca-w-it/backend-developer","sidebar":"basicsSidebar"},{"id":"podstawy/praca-w-it/devops-qa-i-inne","path":"/podstawy/praca-w-it/devops-qa-i-inne","sidebar":"basicsSidebar"},{"id":"podstawy/praca-w-it/frontend-developer","path":"/podstawy/praca-w-it/frontend-developer","sidebar":"basicsSidebar"},{"id":"podstawy/praca-w-it/index","path":"/podstawy/praca-w-it/","sidebar":"basicsSidebar"},{"id":"podstawy/praca-w-it/ux-ui-designer","path":"/podstawy/praca-w-it/ux-ui-designer","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/algorytmy","path":"/podstawy/programowanie/algorytmy","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/api","path":"/podstawy/programowanie/api","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/dobre-praktyki","path":"/podstawy/programowanie/dobre-praktyki","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/frameworki-i-biblioteki","path":"/podstawy/programowanie/frameworki-i-biblioteki","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/index","path":"/podstawy/programowanie/","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/paradygmaty-programowania","path":"/podstawy/programowanie/paradygmaty-programowania","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/struktury-i-bazy-danych","path":"/podstawy/programowanie/struktury-i-bazy-danych","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/typowanie-statyczne-i-dynamiczne","path":"/podstawy/programowanie/typowanie-statyczne-i-dynamiczne","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/wyrazenia-regularne","path":"/podstawy/programowanie/wyrazenia-regularne","sidebar":"basicsSidebar"},{"id":"podstawy/programowanie/wzorce-projektowe","path":"/podstawy/programowanie/wzorce-projektowe","sidebar":"basicsSidebar"},{"id":"podstawy/siec/index","path":"/podstawy/siec/","sidebar":"basicsSidebar"},{"id":"podstawy/siec/jak-dziala-internet","path":"/podstawy/siec/jak-dziala-internet","sidebar":"basicsSidebar"},{"id":"podstawy/sprzet-komputerowy/index","path":"/podstawy/sprzet-komputerowy/","sidebar":"basicsSidebar"},{"id":"podstawy/sprzet-komputerowy/system-binarny/index","path":"/podstawy/sprzet-komputerowy/system-binarny/","sidebar":"basicsSidebar"},{"id":"podstawy/sprzet-komputerowy/system-binarny/podstawy-systemu-binarnego","path":"/podstawy/sprzet-komputerowy/system-binarny/podstawy-systemu-binarnego","sidebar":"basicsSidebar"},{"id":"podstawy/sprzet-komputerowy/system-binarny/system-binarny","path":"/podstawy/sprzet-komputerowy/system-binarny/system-binarny","sidebar":"basicsSidebar"},{"id":"podstawy/systemy-operacyjne/chrome-os","path":"/podstawy/systemy-operacyjne/chrome-os","sidebar":"basicsSidebar"},{"id":"podstawy/systemy-operacyjne/free-bsd","path":"/podstawy/systemy-operacyjne/free-bsd","sidebar":"basicsSidebar"},{"id":"podstawy/systemy-operacyjne/index","path":"/podstawy/systemy-operacyjne/","sidebar":"basicsSidebar"},{"id":"podstawy/systemy-operacyjne/linux","path":"/podstawy/systemy-operacyjne/linux","sidebar":"basicsSidebar"},{"id":"podstawy/systemy-operacyjne/macos-i-ios","path":"/podstawy/systemy-operacyjne/macos-i-ios","sidebar":"basicsSidebar"},{"id":"podstawy/systemy-operacyjne/windows","path":"/podstawy/systemy-operacyjne/windows","sidebar":"basicsSidebar"},{"id":"podstawy/testowanie/index","path":"/podstawy/testowanie/","sidebar":"basicsSidebar"},{"id":"podstawy/testowanie/przyklady-testow-jednostkowych-integracyjnych-i-e2e","path":"/podstawy/testowanie/przyklady-testow-jednostkowych-integracyjnych-i-e2e","sidebar":"basicsSidebar"},{"id":"podstawy/testowanie/wprowadzenie-do-testowania","path":"/podstawy/testowanie/wprowadzenie-do-testowania","sidebar":"basicsSidebar"},{"id":"podstawy/warstwy-abstrakcji/index","path":"/podstawy/warstwy-abstrakcji/","sidebar":"basicsSidebar"},{"id":"podstawy/wydajnosc/index","path":"/podstawy/wydajnosc/","sidebar":"basicsSidebar"},{"id":"podstawy/zarzadzanie-projektami/index","path":"/podstawy/zarzadzanie-projektami/","sidebar":"basicsSidebar"},{"id":"ux-ui/czy-do-zostania-designerem-ux-ui-potrzeba-10000-godzin","path":"/ux-ui/czy-do-zostania-designerem-ux-ui-potrzeba-10000-godzin","sidebar":"uxuiSidebar"},{"id":"ux-ui/praktyczne-szkolenie-projektowania-ux-ui/index","path":"/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/","sidebar":"uxuiSidebar"},{"id":"ux-ui/praktyczne-szkolenie-projektowania-ux-ui/material-uzupelniajacy-ui","path":"/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/material-uzupelniajacy-ui","sidebar":"uxuiSidebar"},{"id":"ux-ui/praktyczne-szkolenie-projektowania-ux-ui/nagranie-z-webinaru-ux","path":"/ux-ui/praktyczne-szkolenie-projektowania-ux-ui/nagranie-z-webinaru-ux","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/detale","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/detale","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-ilustracji","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-ilustracji","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-typografii-i-kolorow","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/dostosowanie-typografii-i-kolorow","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/formularzdostepnosci-uslugi","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/formularzdostepnosci-uslugi","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/glebia","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/glebia","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/identyfikacja-marki","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/identyfikacja-marki","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/index","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/korzystanie-z-figmy","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/korzystanie-z-figmy","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/mapa-strony","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/mapa-strony","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/persona-uzytkownika","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/persona-uzytkownika","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/projektowanie-szkieletu","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/projektowanie-szkieletu","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/prototyp","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/prototyp","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/przygotowanie-elementow-szkieletu","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/przygotowanie-elementow-szkieletu","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/rozmieszczenie-grafik","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/rozmieszczenie-grafik","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/scenariusze-uzytkownika","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/scenariusze-uzytkownika","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/schemat-dzialan-uzytkownika","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/schemat-dzialan-uzytkownika","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tablica-inspiracji","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tablica-inspiracji","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-graficzne","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-graficzne","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-tekstowe","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/tresci-tekstowe","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/wprowadzenie","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/wprowadzenie","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/zapoznanie-z-interfejsem","path":"/ux-ui/projektowanie-interfejsu-i-doswiadczen-uzytkownikow/zapoznanie-z-interfejsem","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-ux-ui","path":"/ux-ui/projektowanie-ux-ui","sidebar":"uxuiSidebar"},{"id":"ux-ui/projektowanie-vs-kodowanie","path":"/ux-ui/projektowanie-vs-kodowanie","sidebar":"uxuiSidebar"},{"id":"ux-ui/przeprojektowanie-interfejsu-strony-internetowej-gls","path":"/ux-ui/przeprojektowanie-interfejsu-strony-internetowej-gls","sidebar":"uxuiSidebar"},{"id":"ux-ui/roznice-miedzy-ux-ui","path":"/ux-ui/roznice-miedzy-ux-ui","sidebar":"uxuiSidebar"}],"draftIds":[],"sidebars":{"basicsSidebar":{"link":{"path":"/podstawy/informatyka/","label":"Informatyka"}},"uxuiSidebar":{"link":{"path":"/ux-ui/projektowanie-ux-ui","label":"ux-ui/projektowanie-ux-ui"}},"frontendSidebar":{"link":{"path":"/frontend/frontend/","label":"Frontend"}},"backendSidebar":{"link":{"path":"/backend/projektowanie-backendu/","label":"\u25b6\ufe0f Projektowanie backendu"}},"fullstackSidebar":{"link":{"path":"/fullstack/fullstack/","label":"Full Stack"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"pl","locales":["pl"],"path":"i18n","currentLocale":"pl","localeConfigs":{"pl":{"label":"Polski","direction":"ltr","htmlLang":"pl","calendar":"gregory","path":"pl"}}}');var s=n(57529);const r=JSON.parse('{"docusaurusVersion":"2.4.1","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"},"docusaurus-lunr-search":{"type":"package","name":"docusaurus-lunr-search","version":"2.3.2"},"docusaurus-tailwindcss":{"type":"local"}}}'),d={siteConfig:o.default,siteMetadata:r,globalData:c,i18n:i,codeTranslations:s},u=a.createContext(d);function b(e){let{children:t}=e;return a.createElement(u.Provider,{value:d},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var a=n(67294),o=n(10412),c=n(35742),i=n(18780),s=n(84173);function r(e){let{error:t,tryAgain:n}=e;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},a.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),a.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),a.createElement(d,{error:t}))}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return a.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return a.createElement(l,{fallback:()=>a.createElement(r,{error:t,tryAgain:n})},a.createElement(c.Z,null,a.createElement("title",null,"Page Error")),a.createElement(s.Z,null,a.createElement(r,{error:t,tryAgain:n})))}const b=e=>a.createElement(u,e);class l extends a.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??b)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const a="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:a,canUseEventListeners:a&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:a&&"IntersectionObserver"in window,canUseViewport:a&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(67294),o=n(70405);function c(e){return a.createElement(o.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var a=n(87462),o=n(67294),c=n(73727),i=n(18780),s=n(52263),r=n(13919),d=n(10412);const u=o.createContext({collectLink:()=>{}});var b=n(44996);function l(e,t){let{isNavLink:n,to:l,href:f,activeClassName:p,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:w=!0,...h}=e;const{siteConfig:{trailingSlash:_,baseUrl:y}}=(0,s.Z)(),{withBaseUrl:j}=(0,b.C)(),k=(0,o.useContext)(u),x=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>x.current));const v=l||f;const z=(0,r.Z)(v),C=v?.replace("pathname://","");let S=void 0!==C?(E=C,w&&(e=>e.startsWith("/"))(E)?j(E):E):void 0;var E;S&&z&&(S=(0,i.applyTrailingSlash)(S,{trailingSlash:_,baseUrl:y}));const D=(0,o.useRef)(!1),T=n?c.OL:c.rU,P=d.Z.canUseIntersectionObserver,L=(0,o.useRef)(),A=()=>{D.current||null==S||(window.docusaurus.preload(S),D.current=!0)};(0,o.useEffect)((()=>(!P&&z&&null!=S&&window.docusaurus.prefetch(S),()=>{P&&L.current&&L.current.disconnect()})),[L,S,P,z]);const N=S?.startsWith("#")??!1,R=!S||!z||N;return R||m||k.collectLink(S),R?o.createElement("a",(0,a.Z)({ref:x,href:S},v&&!z&&{target:"_blank",rel:"noopener noreferrer"},h)):o.createElement(T,(0,a.Z)({},h,{onMouseEnter:A,onTouchStart:A,innerRef:e=>{x.current=e,P&&e&&z&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=S&&window.docusaurus.prefetch(S))}))})),L.current.observe(e))},to:S},n&&{isActive:g,activeClassName:p}))}const f=o.forwardRef(l)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r,I:()=>s});var a=n(67294);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,a.isValidElement)(e)))?n.map(((e,t)=>(0,a.isValidElement)(e)?a.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var c=n(57529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return c[t??n]??n??t}function s(e,t){let{message:n,id:a}=e;return o(i({message:n,id:a}),t)}function r(e){let{children:t,id:n,values:c}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const s=i({message:t,id:n});return a.createElement(a.Fragment,null,o(s,c))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>a});const a="default"},13919:(e,t,n)=>{"use strict";function a(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!a(e)}n.d(t,{Z:()=>o,b:()=>a})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var a=n(67294),o=n(52263),c=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.Z)(),n=(0,a.useCallback)(((n,a)=>function(e,t,n,a){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===a?{}:a;if(!n||n.startsWith("#")||(0,c.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,a)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(67294),o=n(58940);function c(){return(0,a.useContext)(o._)}},28084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>c,eZ:()=>i});var a=n(52263),o=n(29935);function c(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const a=c(e),i=a?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(67294),o=n(98934);function c(){return(0,a.useContext)(o._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const a=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[c,i]=n;const s=o?`${o}.${c}`:c;a(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>c});var a=n(67294);const o=a.createContext(null);function c(e){let{children:t,value:n}=e;const c=a.useContext(o),i=(0,a.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const a={...t.data,...n?.data};return{plugin:t.plugin,data:a}}({parent:c,value:n})),[c,n]);return a.createElement(o.Provider,{value:i},t)}},94104:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>f,gA:()=>u,_r:()=>r,Jo:()=>p,zh:()=>d,yW:()=>l,gB:()=>b});var a=n(16550),o=n(28084);const c=e=>e.versions.find((e=>e.isLast));function i(e,t){const n=function(e,t){const n=c(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,a.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),o=n?.docs.find((e=>!!(0,a.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((a=>{a.id===t&&(n[e.name]=a)}))})),n}(o.id):{}}}const s={},r=()=>(0,o.OD)("docusaurus-plugin-content-docs")??s,d=e=>(0,o.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0});function u(e){void 0===e&&(e={});const t=r(),{pathname:n}=(0,a.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,a.LX)(t,{path:n.path,exact:!1,strict:!1})})),c=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!c&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return c}(t,n,e)}function b(e){return d(e).versions}function l(e){const t=d(e);return c(t)}function f(e){const t=d(e),{pathname:n}=(0,a.TH)();return i(t,n)}function p(e){const t=d(e),{pathname:n}=(0,a.TH)();return function(e,t){const n=c(e);return{latestDocSuggestion:i(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},56657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});const a={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>c});var a=n(74865),o=n.n(a);o().configure({showSpinner:!1});const c={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var a=n(87410),o=n(36809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:a}=t;globalThis.Prism=e,a.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(a.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(67294);const o={iconExternalLink:"iconExternalLink_nPIU"};function c(e){let{width:t=13.5,height:n=13.5}=e;return a.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:o.iconExternalLink},a.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},84173:(e,t,n)=>{"use strict";n.d(t,{Z:()=>pt});var a=n(67294),o=n(86010),c=n(44763),i=n(1944),s=n(87462),r=n(16550),d=n(95999),u=n(85936);const b="__docusaurus_skipToContent_fallback";function l(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,a.useRef)(null),{action:t}=(0,r.k6)(),n=(0,a.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(b);t&&l(t)}),[]);return(0,u.S)((n=>{let{location:a}=n;e.current&&!a.hash&&"PUSH"===t&&l(e.current)})),{containerRef:e,onClick:n}}const p=(0,d.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??p,{containerRef:n,onClick:o}=f();return a.createElement("div",{ref:n,role:"region","aria-label":p},a.createElement("a",(0,s.Z)({},e,{href:`#${b}`,onClick:o}),t))}var m=n(35281),w=n(19727);const h={skipToContent:"skipToContent_fXgn"};function _(){return a.createElement(g,{className:h.skipToContent})}var y=n(86668),j=n(59689);function k(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:c=1.2,className:i,...r}=e;return a.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},r),a.createElement("g",{stroke:o,strokeWidth:c},a.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const x={closeButton:"closeButton_CVFx"};function v(e){return a.createElement("button",(0,s.Z)({type:"button","aria-label":(0,d.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,o.Z)("clean-btn close",x.closeButton,e.className)}),a.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const z={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,y.L)(),{content:n}=t;return a.createElement("div",(0,s.Z)({},e,{className:(0,o.Z)(z.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const S={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function E(){const{announcementBar:e}=(0,y.L)(),{isActive:t,close:n}=(0,j.nT)();if(!t)return null;const{backgroundColor:o,textColor:c,isCloseable:i}=e;return a.createElement("div",{className:S.announcementBar,style:{backgroundColor:o,color:c},role:"banner"},i&&a.createElement("div",{className:S.announcementBarPlaceholder}),a.createElement(C,{className:S.announcementBarContent}),i&&a.createElement(v,{onClick:n,className:S.announcementBarClose}))}var D=n(72961),T=n(12466);var P=n(902),L=n(13102);const A=a.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,D.e)(),t=(0,L.HY)(),[n,o]=(0,a.useState)(!1),c=null!==t.component,i=(0,P.D9)(c);return(0,a.useEffect)((()=>{c&&!i&&o(!0)}),[c,i]),(0,a.useEffect)((()=>{c?e.shown||o(!0):o(!1)}),[e.shown,c]),(0,a.useMemo)((()=>[n,o]),[n])}();return a.createElement(A.Provider,{value:n},t)}function R(e){if(e.component){const t=e.component;return a.createElement(t,e.props)}}function O(){const e=(0,a.useContext)(A);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,a.useCallback)((()=>n(!1)),[n]),c=(0,L.HY)();return(0,a.useMemo)((()=>({shown:t,hide:o,content:R(c)})),[o,c,t])}function I(e){let{header:t,primaryMenu:n,secondaryMenu:c}=e;const{shown:i}=O();return a.createElement("div",{className:"navbar-sidebar"},t,a.createElement("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},a.createElement("div",{className:"navbar-sidebar__item menu"},n),a.createElement("div",{className:"navbar-sidebar__item menu"},c)))}var M=n(92949),F=n(72389);function B(e){return a.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function U(e){return a.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),a.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:c,onChange:i}=e;const s=(0,F.Z)(),r=(0,d.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===c?(0,d.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,d.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return a.createElement("div",{className:(0,o.Z)($.toggle,t)},a.createElement("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!s&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===c?"light":"dark"),disabled:!s,title:r,"aria-label":r,"aria-live":"polite"},a.createElement(B,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),a.createElement(U,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=a.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,y.L)().navbar.style,o=(0,y.L)().colorMode.disableSwitch,{colorMode:c,setColorMode:i}=(0,M.I)();return o?null:a.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:c,onChange:i})}var V=n(21327);function W(){return a.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,D.e)();return a.createElement("button",{type:"button","aria-label":(0,d.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},a.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return a.createElement("div",{className:"navbar-sidebar__brand"},a.createElement(W,null),a.createElement(Z,{className:"margin-right--md"}),a.createElement(Y,null))}var X=n(39960),Q=n(44996),J=n(13919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(39471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:c,label:i,html:r,isDropdownLink:d,prependBaseUrlToHref:u,...b}=e;const l=(0,Q.Z)(o),f=(0,Q.Z)(t),p=(0,Q.Z)(c,{forcePrependBaseUrl:!0}),g=i&&c&&!(0,J.Z)(c),m=r?{dangerouslySetInnerHTML:{__html:r}}:{children:a.createElement(a.Fragment,null,i,g&&a.createElement(te.Z,d&&{width:12,height:12}))};return c?a.createElement(X.Z,(0,s.Z)({href:u?p:c},b,m)):a.createElement(X.Z,(0,s.Z)({to:l,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},b,m))}function ae(e){let{className:t,isDropdownItem:n=!1,...c}=e;const i=a.createElement(ne,(0,s.Z)({className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},c));return n?a.createElement("li",null,i):i}function oe(e){let{className:t,isDropdownItem:n,...c}=e;return a.createElement("li",{className:"menu__list-item"},a.createElement(ne,(0,s.Z)({className:(0,o.Z)("menu__link",t)},c)))}function ce(e){let{mobile:t=!1,position:n,...o}=e;const c=t?oe:ae;return a.createElement(c,(0,s.Z)({},o,{activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(86043),se=n(48596),re=n(52263);function de(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:c,onClick:i,...r}=e;const d=(0,a.useRef)(null),[u,b]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{const e=e=>{d.current&&!d.current.contains(e.target)&&b(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[d]),a.createElement("div",{ref:d,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},a.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:r.to?void 0:"#",className:(0,o.Z)("navbar__link",c)},r,{onClick:r.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),b(!u))}}),r.children??r.label),a.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>a.createElement(Se,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function be(e){let{items:t,className:n,position:c,onClick:i,...d}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,re.Z)(),{pathname:t}=(0,r.TH)();return t.replace(e,"/")}(),b=de(t,u),{collapsed:l,toggleCollapsed:f,setCollapsed:p}=(0,ie.u)({initialState:()=>!b});return(0,a.useEffect)((()=>{b&&p(!b)}),[u,b,p]),a.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":l})},a.createElement(ne,(0,s.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},d,{onClick:e=>{e.preventDefault(),f()}}),d.children??d.label),a.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:l},t.map(((e,t)=>a.createElement(Se,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function le(e){let{mobile:t=!1,...n}=e;const o=t?be:ue;return a.createElement(o,n)}var fe=n(94711);function pe(e){let{width:t=20,height:n=20,...o}=e;return a.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},o),a.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ge="iconLanguage_nlXk";var me=n(94184),we=n.n(me),he=n(28084);const _e=e=>{const t=(0,a.useRef)(!1),o=(0,a.useRef)(null),[c,i]=(0,a.useState)(!1),s=(0,r.k6)(),{siteConfig:d={}}=(0,re.Z)(),u=(0,F.Z)(),{baseUrl:b}=d,l=(0,he.eZ)("docusaurus-lunr-search"),f=()=>{t.current||(Promise.all([fetch(`${b}${l.fileNames.searchDoc}`).then((e=>e.json())),fetch(`${b}${l.fileNames.lunrIndex}`).then((e=>e.json())),Promise.all([n.e(84611),n.e(25684)]).then(n.bind(n,4734)),Promise.all([n.e(40532),n.e(32572)]).then(n.bind(n,32572))]).then((e=>{let[t,n,{default:a}]=e;0!==t.length&&(((e,t,n)=>{new n({searchDocs:e,searchIndex:t,baseUrl:b,inputSelector:"#search_input_react",handleSelected:(e,t,n)=>{const a=n.url||"/";document.createElement("a").href=a,s.push(a)}})})(t,n,a),i(!0))})),t.current=!0)},p=(0,a.useCallback)((t=>{o.current.contains(t.target)||o.current.focus(),e.handleSearchBarToggle&&e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]);return u&&f(),a.createElement("div",{className:"navbar__search",key:"search-box"},a.createElement("span",{"aria-label":"expand searchbar",role:"button",className:we()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:p,onKeyDown:p,tabIndex:0}),a.createElement("input",{id:"search_input_react",type:"search",placeholder:c?"Search":"Loading...","aria-label":"Search",className:we()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onClick:f,onMouseOver:f,onFocus:p,onBlur:p,ref:o,disabled:!c}))},ye={searchBox:"searchBox_ZlJk"};function je(e){let{children:t,className:n}=e;return a.createElement("div",{className:(0,o.Z)(n,ye.searchBox)},t)}var ke=n(94104),xe=n(52802);var ve=n(60373);const ze=e=>e.docs.find((t=>t.id===e.mainDocId));const Ce={default:ce,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:o,...c}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:b}}=(0,re.Z)(),l=(0,fe.l)(),{search:f,hash:p}=(0,r.TH)(),g=[...n,...u.map((e=>{const n=`${`pathname://${l.createUrl({locale:e,fullyQualified:!1})}`}${f}${p}`;return{label:b[e].label,lang:b[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...o],m=t?(0,d.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):b[i].label;return a.createElement(le,(0,s.Z)({},c,{mobile:t,label:a.createElement(a.Fragment,null,a.createElement(pe,{className:ge}),m),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:a.createElement(je,{className:n},a.createElement(_e,null))},dropdown:le,html:function(e){let{value:t,className:n,mobile:c=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return a.createElement(s,{className:(0,o.Z)({navbar__item:!c&&!i,"menu__list-item":c},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:o,...c}=e;const{activeDoc:i}=(0,ke.Iw)(o),r=(0,xe.vY)(t,o);return null===r?null:a.createElement(ce,(0,s.Z)({exact:!0},c,{isActive:()=>i?.path===r.path||!!i?.sidebar&&i.sidebar===r.sidebar,label:n??r.id,to:r.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...c}=e;const{activeDoc:i}=(0,ke.Iw)(o),r=(0,xe.oz)(t,o).link;if(!r)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return a.createElement(ce,(0,s.Z)({exact:!0},c,{isActive:()=>i?.sidebar===t,label:n??r.label,to:r.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...c}=e;const i=(0,xe.lO)(o)[0],r=t??i.label,d=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return a.createElement(ce,(0,s.Z)({},c,{label:r,to:d}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:c,dropdownItemsAfter:i,...u}=e;const{search:b,hash:l}=(0,r.TH)(),f=(0,ke.Iw)(n),p=(0,ke.gB)(n),{savePreferredVersionName:g}=(0,ve.J)(n),m=[...c,...p.map((e=>{const t=f.alternateDocVersions[e.name]??ze(e);return{label:e.label,to:`${t.path}${b}${l}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...i],w=(0,xe.lO)(n)[0],h=t&&m.length>1?(0,d.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):w.label,_=t&&m.length>1?void 0:ze(w).path;return m.length<=1?a.createElement(ce,(0,s.Z)({},u,{mobile:t,label:h,to:_,isActive:o?()=>!1:void 0})):a.createElement(le,(0,s.Z)({},u,{mobile:t,label:h,to:_,items:m,isActive:o?()=>!1:void 0}))}};function Se(e){let{type:t,...n}=e;const o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),c=Ce[o];if(!c)throw new Error(`No NavbarItem component found for type "${t}".`);return a.createElement(c,n)}function Ee(){const e=(0,D.e)(),t=(0,y.L)().navbar.items;return a.createElement("ul",{className:"menu__list"},t.map(((t,n)=>a.createElement(Se,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function De(e){return a.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),a.createElement(d.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Te(){const e=0===(0,y.L)().navbar.items.length,t=O();return a.createElement(a.Fragment,null,!e&&a.createElement(De,{onClick:()=>t.hide()}),t.content)}function Pe(){const e=(0,D.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,a.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?a.createElement(I,{header:a.createElement(K,null),primaryMenu:a.createElement(Ee,null),secondaryMenu:a.createElement(Te,null)}):null}const Le={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ae(e){return a.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Ne(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:c}}=(0,y.L)(),i=(0,D.e)(),{navbarRef:s,isNavbarVisible:r}=function(e){const[t,n]=(0,a.useState)(e),o=(0,a.useRef)(!1),c=(0,a.useRef)(0),i=(0,a.useCallback)((e=>{null!==e&&(c.current=e.getBoundingClientRect().height)}),[]);return(0,T.RF)(((t,a)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+d{if(!e)return;const a=t.location.hash;if(a?document.getElementById(a.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return a.createElement("nav",{ref:s,"aria-label":(0,d.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Le.navbarHideable,!r&&Le.navbarHidden],{"navbar--dark":"dark"===c,"navbar--primary":"primary"===c,"navbar-sidebar--show":i.shown})},t,a.createElement(Ae,{onClick:i.toggle}),a.createElement(Pe,null))}var Re=n(18780);const Oe={errorBoundaryError:"errorBoundaryError_a6uf"};function Ie(e){return a.createElement("button",(0,s.Z)({type:"button"},e),a.createElement(d.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function Me(e){let{error:t}=e;const n=(0,Re.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return a.createElement("p",{className:Oe.errorBoundaryError},n)}class Fe extends a.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Be="right";function Ue(e){let{width:t=30,height:n=30,className:o,...c}=e;return a.createElement("svg",(0,s.Z)({className:o,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},c),a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function $e(){const{toggle:e,shown:t}=(0,D.e)();return a.createElement("button",{onClick:e,"aria-label":(0,d.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},a.createElement(Ue,null))}const qe={colorModeToggle:"colorModeToggle_DEke"};function He(e){let{items:t}=e;return a.createElement(a.Fragment,null,t.map(((e,t)=>a.createElement(Fe,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},a.createElement(Se,e)))))}function Ge(e){let{left:t,right:n}=e;return a.createElement("div",{className:"navbar__inner"},a.createElement("div",{className:"navbar__items"},t),a.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ze(){const e=(0,D.e)(),t=(0,y.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??Be)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),c=t.find((e=>"search"===e.type));return a.createElement(Ge,{left:a.createElement(a.Fragment,null,!e.disabled&&a.createElement($e,null),a.createElement(W,null),a.createElement(He,{items:n})),right:a.createElement(a.Fragment,null,a.createElement(He,{items:o}),a.createElement(Z,{className:qe.colorModeToggle}),!c&&a.createElement(je,null,a.createElement(_e,null)))})}function Ve(){return a.createElement(Ne,null,a.createElement(Ze,null))}function We(e){let{item:t}=e;const{to:n,href:o,label:c,prependBaseUrlToHref:i,...r}=t,d=(0,Q.Z)(n),u=(0,Q.Z)(o,{forcePrependBaseUrl:!0});return a.createElement(X.Z,(0,s.Z)({className:"footer__link-item"},o?{href:i?u:o}:{to:d},r),c,o&&!(0,J.Z)(o)&&a.createElement(te.Z,null))}function Ye(e){let{item:t}=e;return t.html?a.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement("li",{key:t.href??t.to,className:"footer__item"},a.createElement(We,{item:t}))}function Ke(e){let{column:t}=e;return a.createElement("div",{className:"col footer__col"},a.createElement("div",{className:"footer__title"},t.title),a.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>a.createElement(Ye,{key:t,item:e})))))}function Xe(e){let{columns:t}=e;return a.createElement("div",{className:"row footer__links"},t.map(((e,t)=>a.createElement(Ke,{key:t,column:e}))))}function Qe(){return a.createElement("span",{className:"footer__link-separator"},"\xb7")}function Je(e){let{item:t}=e;return t.html?a.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):a.createElement(We,{item:t})}function et(e){let{links:t}=e;return a.createElement("div",{className:"footer__links text--center"},a.createElement("div",{className:"footer__links"},t.map(((e,n)=>a.createElement(a.Fragment,{key:n},a.createElement(Je,{item:e}),t.length!==n+1&&a.createElement(Qe,null))))))}function tt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?a.createElement(Xe,{columns:t}):a.createElement(et,{links:t})}var nt=n(50941);const at={footerLogoLink:"footerLogoLink_BH7S"};function ot(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),c={light:n(t.src),dark:n(t.srcDark??t.src)};return a.createElement(nt.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:c,width:t.width,height:t.height,style:t.style})}function ct(e){let{logo:t}=e;return t.href?a.createElement(X.Z,{href:t.href,className:at.footerLogoLink,target:t.target},a.createElement(ot,{logo:t})):a.createElement(ot,{logo:t})}function it(e){let{copyright:t}=e;return a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function st(e){let{style:t,links:n,logo:c,copyright:i}=e;return a.createElement("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t})},a.createElement("div",{className:"container container-fluid"},n,(c||i)&&a.createElement("div",{className:"footer__bottom text--center"},c&&a.createElement("div",{className:"margin-bottom--sm"},c),i)))}function rt(){const{footer:e}=(0,y.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:c}=e;return a.createElement(st,{style:c,links:n&&n.length>0&&a.createElement(tt,{links:n}),logo:o&&a.createElement(ct,{logo:o}),copyright:t&&a.createElement(it,{copyright:t})})}const dt=a.memo(rt),ut=(0,P.Qc)([M.S,j.pl,T.OC,ve.L5,i.VC,function(e){let{children:t}=e;return a.createElement(L.n2,null,a.createElement(D.M,null,a.createElement(N,null,t)))}]);function bt(e){let{children:t}=e;return a.createElement(ut,null,t)}function lt(e){let{error:t,tryAgain:n}=e;return a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(d.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),a.createElement("div",{className:"margin-vert--lg"},a.createElement(Ie,{onClick:n,className:"button button--primary shadow--lw"})),a.createElement("hr",null),a.createElement("div",{className:"margin-vert--md"},a.createElement(Me,{error:t})))))}const ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:s,title:r,description:d}=e;return(0,w.t)(),a.createElement(bt,null,a.createElement(i.d,{title:r,description:d}),a.createElement(_,null),a.createElement(E,null),a.createElement(Ve,null),a.createElement("div",{id:b,className:(0,o.Z)(m.k.wrapper.main,ft.mainWrapper,s)},a.createElement(c.Z,{fallback:e=>a.createElement(lt,e)},t)),!n&&a.createElement(dt,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>b});var a=n(87462),o=n(67294),c=n(39960),i=n(44996),s=n(52263),r=n(86668),d=n(50941);function u(e){let{logo:t,alt:n,imageClassName:a}=e;const c={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},s=o.createElement(d.Z,{className:t.className,sources:c,height:t.height,width:t.width,alt:n,style:t.style});return a?o.createElement("div",{className:a},s):s}function b(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:d}}=(0,r.L)(),{imageClassName:b,titleClassName:l,...f}=e,p=(0,i.Z)(d?.href||"/"),g=n?"":t,m=d?.alt??g;return o.createElement(c.Z,(0,a.Z)({to:p},f,d?.target&&{target:d.target}),d&&o.createElement(u,{logo:d,alt:m,imageClassName:b}),null!=n&&o.createElement("b",{className:l},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var a=n(67294),o=n(35742);function c(e){let{locale:t,version:n,tag:c}=e;const i=t;return a.createElement(o.Z,null,t&&a.createElement("meta",{name:"docusaurus_locale",content:t}),n&&a.createElement("meta",{name:"docusaurus_version",content:n}),c&&a.createElement("meta",{name:"docusaurus_tag",content:c}),i&&a.createElement("meta",{name:"docsearch:language",content:i}),n&&a.createElement("meta",{name:"docsearch:version",content:n}),c&&a.createElement("meta",{name:"docsearch:docusaurus_tag",content:c}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(87462),o=n(67294),c=n(86010),i=n(72389),s=n(92949);const r={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function d(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:d,className:u,alt:b,...l}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return o.createElement(o.Fragment,null,f.map((e=>o.createElement("img",(0,a.Z)({key:e,src:d[e],alt:b,className:(0,c.Z)(r.themedImage,r[`themedImage--${e}`],u)},l)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>r,z:()=>m});var a=n(87462),o=n(67294),c=n(10412),i=n(91442);const s="ease-in-out";function r(e){let{initialState:t}=e;const[n,a]=(0,o.useState)(t??!1),c=(0,o.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:c}}const d={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function b(e,t){const n=t?d:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function l(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const c=(0,o.useRef)(!1);(0,o.useEffect)((()=>{const e=t.current;function o(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function r(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!c.current)return b(e,n),void(c.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(r(),requestAnimationFrame((()=>{e.style.height=d.height,e.style.overflow=d.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{r()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function f(e){if(!c.Z.canUseDOM)return e?d:u}function p(e){let{as:t="div",collapsed:n,children:a,animation:c,onCollapseTransitionEnd:i,className:s,disableSSRStyle:r}=e;const d=(0,o.useRef)(null);return l({collapsibleRef:d,collapsed:n,animation:c}),o.createElement(t,{ref:d,style:r?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(b(d.current,n),i?.(n))},className:s},a)}function g(e){let{collapsed:t,...n}=e;const[c,i]=(0,o.useState)(!t),[s,r]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,o.useLayoutEffect)((()=>{c&&r(t)}),[c,t]),c?o.createElement(p,(0,a.Z)({},n,{collapsed:s})):null}function m(e){let{lazy:t,...n}=e;const a=t?g:p;return o.createElement(a,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>p,pl:()=>f});var a=n(67294),o=n(72389),c=n(50012),i=n(902),s=n(86668);const r=(0,c.WA)("docusaurus.announcement.dismiss"),d=(0,c.WA)("docusaurus.announcement.id"),u=()=>"true"===r.get(),b=e=>r.set(String(e)),l=a.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,c]=(0,a.useState)((()=>!!t&&u()));(0,a.useEffect)((()=>{c(u())}),[]);const i=(0,a.useCallback)((()=>{b(!0),c(!0)}),[]);return(0,a.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=d.get();"annoucement-bar"===n&&(n="announcement-bar");const a=t!==n;d.set(t),a&&b(!1),!a&&u()||c(!1)}),[e]),(0,a.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return a.createElement(l.Provider,{value:n},t)}function p(){const e=(0,a.useContext)(l);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>m,S:()=>g});var a=n(67294),o=n(10412),c=n(902),i=n(50012),s=n(86668);const r=a.createContext(void 0),d="theme",u=(0,i.WA)(d),b={light:"light",dark:"dark"},l=e=>e===b.dark?b.dark:b.light,f=e=>o.Z.canUseDOM?l(document.documentElement.getAttribute("data-theme")):l(e),p=e=>{u.set(l(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,c]=(0,a.useState)(f(e));(0,a.useEffect)((()=>{t&&u.del()}),[t]);const i=(0,a.useCallback)((function(t,a){void 0===a&&(a={});const{persist:o=!0}=a;t?(c(t),o&&p(t)):(c(n?window.matchMedia("(prefers-color-scheme: dark)").matches?b.dark:b.light:e),u.del())}),[n,e]);(0,a.useEffect)((()=>{document.documentElement.setAttribute("data-theme",l(o))}),[o]),(0,a.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==d)return;const t=u.get();null!==t&&i(l(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const r=(0,a.useRef)(!1);return(0,a.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),a=()=>{window.matchMedia("print").matches||r.current?r.current=window.matchMedia("print").matches:i(null)};return e.addListener(a),()=>e.removeListener(a)}),[i,t,n]),(0,a.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===b.dark},setLightTheme(){i(b.light)},setDarkTheme(){i(b.dark)}})),[o,i])}();return a.createElement(r.Provider,{value:n},t)}function m(){const e=(0,a.useContext)(r);if(null==e)throw new c.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>h,L5:()=>m});var a=n(67294),o=n(94104),c=n(29935),i=n(86668),s=n(52802),r=n(902),d=n(50012);const u=e=>`docs-preferred-version-${e}`,b={save:(e,t,n)=>{(0,d.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,d.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,d.WA)(u(e),{persistence:t}).del()}},l=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=a.createContext(null);function p(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,a.useMemo)((()=>Object.keys(e)),[e]),[c,s]=(0,a.useState)((()=>l(n)));(0,a.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:a}=e;function o(e){const t=b.read(e,n);return a[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(b.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[c,(0,a.useMemo)((()=>({savePreferredVersion:function(e,n){b.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=p();return a.createElement(f.Provider,{value:n},t)}function m(e){let{children:t}=e;return s.cE?a.createElement(g,null,t):a.createElement(a.Fragment,null,t)}function w(){const e=(0,a.useContext)(f);if(!e)throw new r.i6("DocsPreferredVersionContextProvider");return e}function h(e){void 0===e&&(e=c.m);const t=(0,o.zh)(e),[n,i]=w(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,a.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>r,b:()=>s});var a=n(67294),o=n(902);const c=Symbol("EmptyContext"),i=a.createContext(c);function s(e){let{children:t,name:n,items:o}=e;const c=(0,a.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return a.createElement(i.Provider,{value:c},t)}function r(){const e=(0,a.useContext)(i);if(e===c)throw new o.i6("DocsSidebarProvider");return e}},72961:(e,t,n)=>{"use strict";n.d(t,{M:()=>l,e:()=>f});var a=n(67294),o=n(13102),c=n(87524),i=n(16550),s=(n(61688),n(902));function r(e){!function(e){const t=(0,i.k6)(),n=(0,s.zX)(e);(0,a.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var d=n(86668);const u=a.createContext(void 0);function b(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,d.L)().navbar;return 0===t.length&&!e.component}(),t=(0,c.i)(),n=!e&&"mobile"===t,[i,s]=(0,a.useState)(!1);r((()=>{if(i)return s(!1),!1}));const u=(0,a.useCallback)((()=>{s((e=>!e))}),[]);return(0,a.useEffect)((()=>{"desktop"===t&&s(!1)}),[t]),(0,a.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function l(e){let{children:t}=e;const n=b();return a.createElement(u.Provider,{value:n},t)}function f(){const e=a.useContext(u);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>r,n2:()=>i});var a=n(67294),o=n(902);const c=a.createContext(null);function i(e){let{children:t}=e;const n=(0,a.useState)({component:null,props:null});return a.createElement(c.Provider,{value:n},t)}function s(){const e=(0,a.useContext)(c);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function r(e){let{component:t,props:n}=e;const i=(0,a.useContext)(c);if(!i)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,r=(0,o.Ql)(n);return(0,a.useEffect)((()=>{s({component:t,props:r})}),[s,t,r]),(0,a.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>c});var a=n(67294);const o="navigation-with-keyboard";function c(){(0,a.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>d});var a=n(67294),o=n(10412);const c={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return o.Z.canUseDOM?window.innerWidth>i?c.desktop:c.mobile:c.ssr}const r=!1;function d(){const[e,t]=(0,a.useState)((()=>r?"ssr":s()));return(0,a.useEffect)((()=>{function e(){t(s())}const n=r?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>a});const a={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},91442:(e,t,n)=>{"use strict";function a(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>a})},52802:(e,t,n)=>{"use strict";n.d(t,{MN:()=>x,Wl:()=>l,_F:()=>m,cE:()=>b,jA:()=>f,hI:()=>k,lO:()=>_,vY:()=>j,oz:()=>y,s1:()=>h});var a=n(67294),o=n(16550),c=n(18790),i=n(94104),s=n(60373),r=n(1116);function d(e){return Array.from(new Set(e))}var u=n(48596);const b=!!i._r;function l(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=l(t);if(e)return e}}}function f(){const{pathname:e}=(0,o.TH)(),t=(0,r.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const p=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),g=(e,t)=>e.some((e=>m(e,t)));function m(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||g(e.items,t))}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:a=!1}=e;const o=[];return function e(t){for(const c of t)if("category"===c.type&&((0,u.Mg)(c.href,n)||e(c.items))||"link"===c.type&&(0,u.Mg)(c.href,n)){return a&&"category"!==c.type||o.unshift(c),!0}return!1}(t),o}function h(){const e=(0,r.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function _(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),o=(0,i.yW)(e);return(0,a.useMemo)((()=>d([t,n,o].filter(Boolean))),[t,n,o])}function y(e,t){const n=_(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),a=t.find((t=>t[0]===e));if(!a)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return a[1]}),[e,n])}function j(e,t){const n=_(t);return(0,a.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),a=t.find((t=>t.id===e));if(!a){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${d(t.map((e=>e.id))).join("\n- ")}`)}return a}),[e,n])}function k(e){let{route:t,versionMetadata:n}=e;const a=(0,o.TH)(),i=t.routes,s=i.find((e=>(0,o.LX)(a.pathname,e)));if(!s)return null;const r=s.sidebar,d=r?n.docsSidebars[r]:void 0;return{docElement:(0,c.H)(i),sidebarName:r,sidebarItems:d}}function x(e){return e.filter((e=>"category"!==e.type||!!l(e)))}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>l,d:()=>u,VC:()=>f});var a=n(67294),o=n(86010),c=n(35742),i=n(30226);function s(){const e=a.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var r=n(44996),d=n(52263);function u(e){let{title:t,description:n,keywords:o,image:i,children:s}=e;const u=function(e){const{siteConfig:t}=(0,d.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}(t),{withBaseUrl:b}=(0,r.C)(),l=i?b(i,{absolute:!0}):void 0;return a.createElement(c.Z,null,t&&a.createElement("title",null,u),t&&a.createElement("meta",{property:"og:title",content:u}),n&&a.createElement("meta",{name:"description",content:n}),n&&a.createElement("meta",{property:"og:description",content:n}),o&&a.createElement("meta",{name:"keywords",content:Array.isArray(o)?o.join(","):o}),l&&a.createElement("meta",{property:"og:image",content:l}),l&&a.createElement("meta",{name:"twitter:image",content:l}),s)}const b=a.createContext(void 0);function l(e){let{className:t,children:n}=e;const i=a.useContext(b),s=(0,o.Z)(i,t);return a.createElement(b.Provider,{value:s},a.createElement(c.Z,null,a.createElement("html",{className:s})),n)}function f(e){let{children:t}=e;const n=s(),c=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return a.createElement(l,{className:(0,o.Z)(c,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>d,Ql:()=>r,i6:()=>s,zX:()=>c});var a=n(67294);const o=n(10412).Z.canUseDOM?a.useLayoutEffect:a.useEffect;function c(e){const t=(0,a.useRef)(e);return o((()=>{t.current=e}),[e]),(0,a.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,a.useRef)();return o((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function r(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,a.useMemo)((()=>e),t.flat())}function d(e){return t=>{let{children:n}=t;return a.createElement(a.Fragment,null,e.reduceRight(((e,t)=>a.createElement(t,null,e)),n))}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var a=n(67294),o=n(723),c=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,c.Z)().siteConfig;return(0,a.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function a(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(a)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>l,OC:()=>r,RF:()=>b});var a=n(67294),o=n(10412),c=n(72389),i=n(902);const s=a.createContext(void 0);function r(e){let{children:t}=e;const n=function(){const e=(0,a.useRef)(!0);return(0,a.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return a.createElement(s.Provider,{value:n},t)}function d(){const e=(0,a.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function b(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,a.useRef)(u()),c=(0,i.zX)(e);(0,a.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();c(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[c,n,...t])}function l(){const e=(0,a.useRef)(null),t=(0,c.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function a(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>a,os:()=>o});n(52263);const a="default";function o(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{WA:()=>r});n(67294),n(61688);const a="localStorage";function o(e){let{key:t,oldValue:n,newValue:a,storage:o}=e;if(n===a)return;const c=document.createEvent("StorageEvent");c.initStorageEvent("storage",!1,!1,t,n,a,window.location.href,o),window.dispatchEvent(c)}function c(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function r(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=c(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const a=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:a,newValue:t,storage:n})}catch(a){console.error(`Docusaurus storage error, can't set ${e}=${t}`,a)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const a=a=>{a.storageArea===n&&a.key===e&&t(a)};return window.addEventListener("storage",a),()=>window.removeEventListener("storage",a)}catch(a){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,a),()=>{}}}}}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>c});var a=n(52263),o=n(16550);function c(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:c}}=(0,a.Z)(),{pathname:i}=(0,o.TH)(),s=c===n?e:e.replace(`/${c}/`,"/"),r=i.replace(e,"");return{createUrl:function(e){let{locale:a,fullyQualified:o}=e;return`${o?t:""}${function(e){return e===n?`${s}`:`${s}${e}/`}(a)}${r}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var a=n(67294),o=n(16550),c=n(902);function i(e){const t=(0,o.TH)(),n=(0,c.D9)(t),i=(0,c.zX)(e);(0,a.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var a=n(52263);function o(){return(0,a.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:a}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),c="/"===o||o===a?o:(i=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,c)}},54143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},18780:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return a(o).default}});var c=n(54143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return c.getErrorCausalChain}})},94184:(e,t)=>{var n;!function(){"use strict";var a={}.hasOwnProperty;function o(){for(var e=[],t=0;t{"use strict";function a(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{lX:()=>y,q_:()=>C,ob:()=>f,PP:()=>E,Ep:()=>l});var a=n(87462);function o(e){return"/"===e.charAt(0)}function c(e,t){for(var n=t,a=n+1,o=e.length;a=0;l--){var f=i[l];"."===f?c(i,l):".."===f?(c(i,l),b++):b&&(c(i,l),b--)}if(!d)for(;b--;b)i.unshift("..");!d||""===i[0]||i[0]&&o(i[0])||i.unshift("");var p=i.join("/");return n&&"/"!==p.substr(-1)&&(p+="/"),p};var s=n(38776);function r(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function b(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function l(e){var t=e.pathname,n=e.search,a=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),a&&"#"!==a&&(o+="#"===a.charAt(0)?a:"#"+a),o}function f(e,t,n,o){var c;"string"==typeof e?(c=function(e){var t=e||"/",n="",a="",o=t.indexOf("#");-1!==o&&(a=t.substr(o),t=t.substr(0,o));var c=t.indexOf("?");return-1!==c&&(n=t.substr(c),t=t.substr(0,c)),{pathname:t,search:"?"===n?"":n,hash:"#"===a?"":a}}(e),c.state=t):(void 0===(c=(0,a.Z)({},e)).pathname&&(c.pathname=""),c.search?"?"!==c.search.charAt(0)&&(c.search="?"+c.search):c.search="",c.hash?"#"!==c.hash.charAt(0)&&(c.hash="#"+c.hash):c.hash="",void 0!==t&&void 0===c.state&&(c.state=t));try{c.pathname=decodeURI(c.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+c.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(c.key=n),o?c.pathname?"/"!==c.pathname.charAt(0)&&(c.pathname=i(c.pathname,o.pathname)):c.pathname=o.pathname:c.pathname||(c.pathname="/"),c}function p(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,a,o){if(null!=e){var c="function"==typeof e?e(t,n):e;"string"==typeof c?"function"==typeof a?a(c,o):o(!0):o(!1!==c)}else o(!0)},appendListener:function(e){var n=!0;function a(){n&&e.apply(void 0,arguments)}return t.push(a),function(){n=!1,t=t.filter((function(e){return e!==a}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),a=0;at?n.splice(t,n.length-t,o):n.push(o),b({action:a,location:o,index:t,entries:n})}}))},replace:function(e,t){var a="REPLACE",o=f(e,t,g(),y.location);u.confirmTransitionTo(o,a,n,(function(e){e&&(y.entries[y.index]=o,b({action:a,location:o}))}))},go:_,goBack:function(){_(-1)},goForward:function(){_(1)},canGo:function(e){var t=y.index+e;return t>=0&&t{"use strict";var a=n(59864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},c={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function r(e){return a.isMemo(e)?i:s[e.$$typeof]||o}s[a.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[a.Memo]=i;var d=Object.defineProperty,u=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols,l=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,p=Object.prototype;e.exports=function e(t,n,a){if("string"!=typeof n){if(p){var o=f(n);o&&o!==p&&e(t,o,a)}var i=u(n);b&&(i=i.concat(b(n)));for(var s=r(t),g=r(n),m=0;m{"use strict";e.exports=function(e,t,n,a,o,c,i,s){if(!e){var r;if(void 0===t)r=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var d=[n,a,o,c,i,s],u=0;(r=new Error(t.replace(/%s/g,(function(){return d[u++]})))).name="Invariant Violation"}throw r.framesToPop=1,r}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},32497:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var a,o;a=function(){var e,t,n={version:"0.2.0"},a=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function c(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===a.positionUsing?{transform:"translate3d("+c(e)+"%,0,0)"}:"translate"===a.positionUsing?{transform:"translate("+c(e)+"%,0)"}:{"margin-left":c(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(a[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,a.minimum,1),n.status=1===e?null:e;var c=n.render(!t),d=c.querySelector(a.barSelector),u=a.speed,b=a.easing;return c.offsetWidth,s((function(t){""===a.positionUsing&&(a.positionUsing=n.getPositioningCSS()),r(d,i(e,u,b)),1===e?(r(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){r(c,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),a.trickleSpeed)};return a.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*a.trickleRate)},e=0,t=0,n.promise=function(a){return a&&"resolved"!==a.state()?(0===t&&n.start(),e++,t++,a.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=a.template;var o,i=t.querySelector(a.barSelector),s=e?"-100":c(n.status||0),d=document.querySelector(a.parent);return r(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),a.showSpinner||(o=t.querySelector(a.spinnerSelector))&&f(o),d!=document.body&&u(d,"nprogress-custom-parent"),d.appendChild(t),t},n.remove=function(){b(document.documentElement,"nprogress-busy"),b(document.querySelector(a.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),r=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function a(t){var n=document.body.style;if(t in n)return t;for(var a,o=e.length,c=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((a=e[o]+c)in n)return a;return t}function o(e){return e=n(e),t[e]||(t[e]=a(e))}function c(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,a,o=arguments;if(2==o.length)for(n in t)void 0!==(a=t[n])&&t.hasOwnProperty(n)&&c(e,n,a);else c(e,o[1],o[2])}}();function d(e,t){return("string"==typeof e?e:l(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=l(e),a=n+t;d(n,t)||(e.className=a.substring(1))}function b(e,t){var n,a=l(e);d(e,t)&&(n=a.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function l(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof a?a.call(t,n,t,e):a)||(e.exports=o)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach((function(e){a[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(o){return!1}}()?Object.assign:function(e,o){for(var c,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),r=1;r{var a=n(5826);e.exports=f,e.exports.parse=c,e.exports.compile=function(e,t){return s(c(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=l;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function c(e,t){for(var n,a=[],c=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var b=n[0],l=n[1],f=n.index;if(s+=e.slice(i,f),i=f+b.length,l)s+=l[1];else{var p=e[i],g=n[2],m=n[3],w=n[4],h=n[5],_=n[6],y=n[7];s&&(a.push(s),s="");var j=null!=g&&null!=p&&p!==g,k="+"===_||"*"===_,x="?"===_||"*"===_,v=n[2]||u,z=w||h;a.push({name:m||c++,prefix:g||"",delimiter:v,optional:x,repeat:k,partial:j,asterisk:!!y,pattern:z?d(z):y?".*":"[^"+r(v)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>c});var a=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},a={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=b.reach);x+=k.value.length,k=k.next){var v=k.value;if(t.length>e.length)return;if(!(v instanceof o)){var z,C=1;if(h){if(!(z=c(j,x,e,w))||z.index>=e.length)break;var S=z.index,E=z.index+z[0].length,D=x;for(D+=k.value.length;S>=D;)D+=(k=k.next).value.length;if(x=D-=k.value.length,k.value instanceof o)continue;for(var T=k;T!==t.tail&&(Db.reach&&(b.reach=N);var R=k.prev;if(L&&(R=r(t,R,L),x+=L.length),d(t,R,C),k=r(t,R,new o(l,m?a.tokenize(P,m):P,_,P)),A&&r(t,k,A),C>1){var O={cause:l+","+p,reach:N};i(e,t,n,k.prev,x,O),b&&O.reach>b.reach&&(b.reach=O.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function r(e,t,n){var a=t.next,o={value:n,prev:t,next:a};return t.next=o,a.prev=o,e.length++,o}function d(e,t,n){for(var a=t.next,o=0;o"+c.content+""},a}(),o=a;a.default=a,o.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},o.languages.markup.tag.inside["attr-value"].inside.entity=o.languages.markup.entity,o.languages.markup.doctype.inside["internal-subset"].inside=o.languages.markup,o.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(o.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:o.languages[t]},n.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:o.languages[t]};var c={};c[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},o.languages.insertBefore("markup","cdata",c)}}),Object.defineProperty(o.languages.markup.tag,"addAttribute",{value:function(e,t){o.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:o.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),o.languages.html=o.languages.markup,o.languages.mathml=o.languages.markup,o.languages.svg=o.languages.markup,o.languages.xml=o.languages.extend("markup",{}),o.languages.ssml=o.languages.xml,o.languages.atom=o.languages.xml,o.languages.rss=o.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],c=a.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},o.languages.c=o.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),o.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),o.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},o.languages.c.string],char:o.languages.c.char,comment:o.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:o.languages.c}}}}),o.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete o.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(o),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(o),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var a={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},o={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:a,number:o,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:a,number:o})}(o),o.languages.javascript=o.languages.extend("clike",{"class-name":[o.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),o.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,o.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:o.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:o.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:o.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:o.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:o.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),o.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:o.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),o.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),o.languages.markup&&(o.languages.markup.tag.addInlined("script","javascript"),o.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),o.languages.js=o.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(o),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),c=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return"(?:"+o+"|"+c+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(c),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(o),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var a=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return a})),c=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+c+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+c+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(a),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+c+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(a),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,a=t.length;n",quot:'"'},r=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(o),o.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:o.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},o.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var s=l(/^\{$/,/^\}$/);if(-1===s)continue;for(var r=n;r=0&&f(d,"variable-input")}}}}function u(e){return t[n+e]}function b(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,a=t.inside.interpolation,o=a.inside["interpolation-punctuation"],c=a.pattern.source;function i(t,a){if(e.languages[t])return{pattern:RegExp("((?:"+a+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function r(t,n,a){var o={code:t,grammar:n,language:a};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(o.code,o.grammar),e.hooks.run("after-tokenize",o),o.tokens}function d(t){var n={};n["interpolation-punctuation"]=o;var c=e.tokenize(t,n);if(3===c.length){var i=[1,1];i.push.apply(i,r(c[1],e.languages.javascript,"javascript")),c.splice.apply(c,i)}return new e.Token("interpolation",c,a.alias,t)}function u(t,n,a){var o=e.tokenize(t,{interpolation:{pattern:RegExp(c),lookbehind:!0}}),i=0,u={},b=r(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=s(i++,a)););return u[n]=o,n})).join(""),n,a),l=Object.keys(u);return i=0,function e(t){for(var n=0;n=l.length)return;var a=t[n];if("string"==typeof a||"string"==typeof a.content){var o=l[i],c="string"==typeof a?a:a.content,s=c.indexOf(o);if(-1!==s){++i;var r=c.substring(0,s),b=d(u[o]),f=c.substring(s+o.length),p=[];if(r&&p.push(r),p.push(b),f){var g=[f];e(g),p.push.apply(p,g)}"string"==typeof a?(t.splice.apply(t,[n,1].concat(p)),n+=p.length-1):a.content=p}}else{var m=a.content;Array.isArray(m)?e(m):e([m])}}}(b),new e.Token(a,b,"language-"+a,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var b={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function l(e){return"string"==typeof e?e:Array.isArray(e)?e.map(l).join(""):l(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in b&&function t(n){for(var a=0,o=n.length;a]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(o),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],a=0;a*\.{3}(?:[^{}]|)*\})/.source;function c(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return a})).replace(//g,(function(){return o})),RegExp(e,t)}o=c(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=c(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:c(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:c(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},s=function(t){for(var n=[],a=0;a0&&n[n.length-1].tagName===i(o.content[0].content[1])&&n.pop():"/>"===o.content[o.content.length-1].content||n.push({tagName:i(o.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:c=!0),(c||"string"==typeof o)&&n.length>0&&0===n[n.length-1].openedBraces){var r=i(o);a0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(r=i(t[a-1])+r,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",r,null,r)}o.content&&"string"!=typeof o.content&&s(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(o),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var a=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+a+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(o),o.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},o.languages.go=o.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),o.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete o.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,o,c){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof c&&!c(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(a,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var o=0,c=Object.keys(n.tokenStack);!function i(s){for(var r=0;r=c.length);r++){var d=s[r];if("string"==typeof d||d.content&&"string"==typeof d.content){var u=c[o],b=n.tokenStack[u],l="string"==typeof d?d:d.content,f=t(a,u),p=l.indexOf(f);if(p>-1){++o;var g=l.substring(0,p),m=new e.Token(a,e.tokenize(b,n.grammar),"language-"+a,b),w=l.substring(p+f.length),h=[];g&&h.push.apply(h,i([g])),h.push(m),w&&h.push.apply(h,i([w])),"string"==typeof d?s.splice.apply(s,[r,1].concat(h)):d.content=h}}else d.content&&i(d.content)}return s}(n.tokens)}}}})}(o),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(o),o.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},o.languages.webmanifest=o.languages.json,o.languages.less=o.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),o.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),o.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},o.languages.objectivec=o.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete o.languages.objectivec["class-name"],o.languages.objc=o.languages.objectivec,o.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},o.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},o.languages.python["string-interpolation"].inside.interpolation.inside.rest=o.languages.python,o.languages.py=o.languages.python,o.languages.reason=o.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),o.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete o.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(o),o.languages.scss=o.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),o.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),o.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),o.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),o.languages.scss.atrule.inside.rest=o.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},a={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};a.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:a}},a.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:a}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:a}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:a}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:a}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:a.interpolation}},rest:a}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:a.interpolation,comment:a.comment,punctuation:/[{},]/}},func:a.func,string:a.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:a.interpolation,punctuation:/[{}()\[\];:.]/}}(o),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(o),o.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const c=o},29901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const a=n(29901),o=n(39642),c=new Set;function i(e){void 0===e?e=Object.keys(a.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...c,...Object.keys(Prism.languages)];o(a,e,t).load((e=>{if(!(e in a.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(16500).resolve(t)],delete Prism.languages[e],n(16500)(t),c.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var a={"./":2885};function o(e){var t=c(e);return n(t)}function c(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}o.keys=function(){return Object.keys(a)},o.resolve=c,e.exports=o,o.id=6726},16500:(e,t,n)=>{var a={"./":2885};function o(e){var t=c(e);return n(t)}function c(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}o.keys=function(){return Object.keys(a)},o.resolve=c,e.exports=o,o.id=16500},39642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,a=e.length;n "));var s={},r=e[a];if(r){function d(t){if(!(t in e))throw new Error(a+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,c),s[t]=!0,n[t])s[i]=!0}t(r.require,d),t(r.optional,d),t(r.modify,d)}n[a]=s,c.pop()}}return function(e){var t=n[e];return t||(o(e,a),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(c,i,s){var r=function(e){var t={};for(var n in e){var a=e[n];for(var o in a)if("meta"!=o){var c=a[o];t[o]="string"==typeof c?{title:c}:c}}return t}(c),d=function(e){var n;return function(a){if(a in e)return a;if(!n)for(var o in n={},e){var c=e[o];t(c&&c.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[a]||a}}(r);i=i.map(d),s=(s||[]).map(d);var u=n(i),b=n(s);i.forEach((function e(n){var a=r[n];t(a&&a.require,(function(t){t in b||(u[t]=!0,e(t))}))}));for(var l,f=a(r),p=u;o(p);){for(var g in l={},p){var m=r[g];t(m&&m.modify,(function(e){e in b&&(l[e]=!0)}))}for(var w in b)if(!(w in u))for(var h in f(w))if(h in u){l[w]=!0;break}for(var _ in p=l)u[_]=!0}var y={getIds:function(){var e=[];return y.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,a,o){var c=o?o.series:void 0,i=o?o.parallel:e,s={},r={};function d(e){if(e in s)return s[e];r[e]=!0;var o,u=[];for(var b in t(e))b in n&&u.push(b);if(0===u.length)o=a(e);else{var l=i(u.map((function(e){var t=d(e);return delete r[e],t})));c?o=c(l,(function(){return a(e)})):a(e)}return s[e]=o}for(var u in n)d(u);var b=[];for(var l in r)b.push(s[l]);return i(b)}(f,u,t,n)}};return y}}();e.exports=t},92703:(e,t,n)=>{"use strict";var a=n(50414);function o(){}function c(){}c.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,c,i){if(i!==a){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:c,resetWarningCache:o};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var a=n(67294),o=n(27418),c=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n