diff --git a/101-114/101-114.md b/101-114/101-114.md index e07e948..aee9aef 100644 --- a/101-114/101-114.md +++ b/101-114/101-114.md @@ -520,4 +520,3 @@ No Trace ******************************** firstCall->secondCall(10): secondCall->thirdCall(): App Error, State: 99 ``` - diff --git a/101-114/README.md b/101-114/README.md index d755886..0e59a1d 100644 --- a/101-114/README.md +++ b/101-114/README.md @@ -2,13 +2,13 @@ Assigned to -* 권용민/@snowmerak -* 강영주/@979156 +- 권용민/@snowmerak +- 강영주/@979156 Mandatory reviewer -* 권경모/@kkweon -* 최희재/@gmlwo530 +- 권경모/@kkweon +- 최희재/@gmlwo530 ## Error Handling 101 @@ -23,4 +23,3 @@ Mandatory reviewer > ### Finding the bug 110 > > ### Wrapping Errors 111 - diff --git a/114-128/114-128.md b/114-128/114-128.md index 5b8509b..fda7630 100644 --- a/114-128/114-128.md +++ b/114-128/114-128.md @@ -46,10 +46,10 @@ Go 프로그램을 시작할 때 런타임은 고루틴을 생성한다. 그리 스케줄러가 스케줄링을 하게 되는 4가지 상황이 있다.\[재방문\] -* `go` 키워드를 통해 고루틴들을 생성할 때. 이는 여러개의 프로세서\(P\)를 가지고 있을 때, 스케줄러가 균형을 다시 맞출 수 있다. -* 시스템 콜. 시스템 콜은 이미 항상 발생 하는 경향이 있다. -* 뮤텍스\(Mutex\)를 사용하는 채널. \(추후 학습\) -* 가비지 컬렉션. +- `go` 키워드를 통해 고루틴들을 생성할 때. 이는 여러개의 프로세서\(P\)를 가지고 있을 때, 스케줄러가 균형을 다시 맞출 수 있다. +- 시스템 콜. 시스템 콜은 이미 항상 발생 하는 경향이 있다. +- 뮤텍스\(Mutex\)를 사용하는 채널. \(추후 학습\) +- 가비지 컬렉션. 다시 예제로 돌아와, 스케줄러는 `Gm`이 실행되기까지 충분한 시간이 남았을때, `Gm`을 실행 대기열\(run queue\)에 넣고 `G1`이 해당 `m`에서 실행되도록 혀용한다\(문맥교환\). @@ -119,9 +119,9 @@ func main() { 세개의 `Add`, `Done`, `Wait` 메소드를 갖는다. n개의 고루틴은 이 메소드를 동시에 호출 할 수 있고, 모두 직렬화\(serialized\)되어 있다. -* `Add`: 얼마나 많은 고루틴이 있는지 계산한다. -* `Done`: 일부 고루틴이 종료될 예정이므로 값을 감소시킨다. -* `Wait`: 해당 카운트가 0이 될 때까지 프로그램을 유지한다. +- `Add`: 얼마나 많은 고루틴이 있는지 계산한다. +- `Done`: 일부 고루틴이 종료될 예정이므로 값을 감소시킨다. +- `Wait`: 해당 카운트가 0이 될 때까지 프로그램을 유지한다. ```go var wg sync.WaitGroup @@ -402,4 +402,3 @@ E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Terminating Program ``` - diff --git a/114-128/README.md b/114-128/README.md index 4c94040..3022773 100644 --- a/114-128/README.md +++ b/114-128/README.md @@ -2,13 +2,13 @@ Assigned to -* 이재원/@mumunuu +- 이재원/@mumunuu Mandatory reviewer -* 권용민/@snowmerak -* 조용래/@dramgonfly -* 신정훈/@shin2jhoon +- 권용민/@snowmerak +- 조용래/@dramgonfly +- 신정훈/@shin2jhoon ## Concurrency 114 @@ -23,4 +23,3 @@ Mandatory reviewer > > **Goroutine time slicing 124** > > > > **Goroutines and parallelism 126** - diff --git a/128-139/128-139.md b/128-139/128-139.md index ec4a1cb..70a5d20 100644 --- a/128-139/128-139.md +++ b/128-139/128-139.md @@ -4,8 +4,8 @@ 프로그램에 고루틴을 추가하면 복잡도가 엄청나게 올라간다. 고루틴을 언제나 상태없이\(stateless\) 실행할 수는 없기에 조율이 필요하다. 멀티 스레드 소프트웨어를 작성할 때는 사실상 두 가지 선택지가 있다. -* WaitGroup에서 Add와 Done, Wait으로 제어하는 것 처럼, 공유 자원에 대한 접근 상태를 동기화하거나 -* 고루틴을 예측 가능하고, 합리적으로 실행이 되도록 만들어야 한다. +- WaitGroup에서 Add와 Done, Wait으로 제어하는 것 처럼, 공유 자원에 대한 접근 상태를 동기화하거나 +- 고루틴을 예측 가능하고, 합리적으로 실행이 되도록 만들어야 한다. 채널이 없었을 때는, 아토믹 함수나 mutex를 사용하여 앞서 언급한 두 가지 선택지를 구현하였다. 채널은 간단한 제어 방법을 제공하지만, 대부분의 경우는 아토믹 함수와 mutex를 사용하여 공유 자원에 대한 액세스 동기화를 사용하는 것이 가장 좋은 방법이다. atomic 연산은 Go에서 가장 빠른 방법이다. Go는 메모리에서 한번에 4-8 바이트씩 동기화를 하기 때문이다. @@ -482,4 +482,3 @@ func reader(id int) { 아토믹 함수와 뮤텍스는 사용자의 소프트웨어에 대기시간을 만든다. 대기시간은 여러 고루틴 사이에 자원 접근에 대한 조율이 필요할 때 유용하다. Read/Write 뮤텍스는 대기시간을 줄이는 데 유용하다. 뮤텍스를 사용하는 경우, 잠금 이후 최대한 빨리 잠금을 해제해야 한다. 다른 불필요한 행위는 하지 않는 것이 좋다. 때로는 공유 자원을 읽기를 위해 로컬 변수만 사용하는 것으로도 충분하다. 뮤텍스를 적게 사용할수록 좋다. 이를 통해 대기시간을 최소한으로 줄일 수 있다. - diff --git a/128-139/README.md b/128-139/README.md index d03af46..2093b0d 100644 --- a/128-139/README.md +++ b/128-139/README.md @@ -2,12 +2,12 @@ Assigned to -* 배지원/@baewang +- 배지원/@baewang Mandatory reviewer -* 조동헌/@davinnovation -* 강영주/@979156 +- 조동헌/@davinnovation +- 강영주/@979156 > ## Data race 128 > @@ -18,4 +18,3 @@ Mandatory reviewer > > ### Mutexes 133 > > > > ### Read/Write Mutex 135 - diff --git a/139-164/139-164.md b/139-164/139-164.md index 19268a0..80898b2 100644 --- a/139-164/139-164.md +++ b/139-164/139-164.md @@ -1053,4 +1053,3 @@ fs 0x0 gs 0x0 exit status 2 ``` - diff --git a/139-164/README.md b/139-164/README.md index 014c878..8a0471e 100644 --- a/139-164/README.md +++ b/139-164/README.md @@ -2,13 +2,13 @@ Assigned to -* 조용래/@dreamgonfly +- 조용래/@dreamgonfly Mandatory reviewer -* 배지원/@baewang -* 정영훈/@aeuveritas -* 신정훈/@shin2jhoon +- 배지원/@baewang +- 정영훈/@aeuveritas +- 신정훈/@shin2jhoon > ## Channel 139 > @@ -31,4 +31,3 @@ Mandatory reviewer > > ### Buffered channel: Fan Out 153 > > > > ### Select 157 - diff --git a/164-173/164-173.md b/164-173/164-173.md index 09c5acd..13fa412 100644 --- a/164-173/164-173.md +++ b/164-173/164-173.md @@ -407,4 +407,3 @@ func main() { 2020/08/24 18:37:18 Get https://wwww.ardanlabs.com/blog/post/index.xml: net/http: request canceled while waiting for connection ``` - diff --git a/164-173/README.md b/164-173/README.md index def7d28..8b1a79f 100644 --- a/164-173/README.md +++ b/164-173/README.md @@ -2,12 +2,12 @@ Assigned to -* Mark Hahn/@TangoEnSkai +- Mark Hahn/@TangoEnSkai Mandatory reviewer -* 권경모/@kkweon -* 정영훈/@aeuveritas +- 권경모/@kkweon +- 정영훈/@aeuveritas ## Patterns 164 @@ -22,4 +22,3 @@ Mandatory reviewer > > #### WithTimeout 169 > > > > #### Request/Response 171 - diff --git a/173-191/173-191.md b/173-191/173-191.md index b62c0b1..7ed14c7 100644 --- a/173-191/173-191.md +++ b/173-191/173-191.md @@ -426,7 +426,7 @@ ok github.com/hoanhan101/ultimate-go/go/testing/web_server/handlers 0.096s Below is how to test the execution of an internal endpoint without having to stand up the server. Run test using "go test -v -run TestSendJSON" -We are using handlers\_test for package name because we want to make sure we only touch the exported API. +We are using handlers_test for package name because we want to make sure we only touch the exported API. ```go package handlers_test @@ -684,4 +684,3 @@ When we get the response back, we are unmarshaling it from XML to our struct typ PASS ok command-line-arguments 0.191s ``` - diff --git a/173-191/README.md b/173-191/README.md index d516ea5..bb14dbd 100644 --- a/173-191/README.md +++ b/173-191/README.md @@ -2,12 +2,12 @@ Assigned to -* 조동헌/@davinnovation +- 조동헌/@davinnovation Mandatory reviewer -* 김준희/@juunini -* Mark Hahn/@TangoEnSkai +- 김준희/@juunini +- Mark Hahn/@TangoEnSkai ## Testing and Profiling 173 @@ -22,4 +22,3 @@ Mandatory reviewer > > **Web Server 181** > > > > **Mock Server 187** - diff --git a/191-199/191-199.md b/191-199/191-199.md index 5313860..66851c8 100644 --- a/191-199/191-199.md +++ b/191-199/191-199.md @@ -114,8 +114,8 @@ ok command-line-arguments 7.131s 하위 벤치마크를 할 수 있는 다른 방법들: -* `go test -run none -bench BenchmarkSprintSub/none -benchtime 3s -benchmem` -* `go test -run none -bench BenchmarkSprintSub/format -benchtime 3s -benchmem` +- `go test -run none -bench BenchmarkSprintSub/none -benchtime 3s -benchmem` +- `go test -run none -bench BenchmarkSprintSub/format -benchtime 3s -benchmem` ### 프로파일링\(Profiling\) @@ -200,12 +200,12 @@ exit status 2 이번에는 스택 트레이스가 1 word 밖에 보여주지 않는데, 이 4바이트는 32비트 환경에선 half-wold로, 64비트 환경에선 full-word로 표시된다. 예제에 사용된 시스템은 리틀 엔디언을 사용하고 있기 때문에 오른쪽에서 왼쪽으로 읽어야 한다. `0xc419010001` 을 아래와 같이 나타낼 수 있다: -| Bits | Binary | Hex | Value | -| :--- | :--- | :--- | :--- | -| 00-07 | 0000 0001 | 01 | true | -| 08-15 | 0000 0000 | 00 | false | -| 16-23 | 0000 0001 | 01 | true | -| 24-31 | 0001 1001 | 19 | 25 | +| Bits | Binary | Hex | Value | +| :---- | :-------- | :-- | :---- | +| 00-07 | 0000 0001 | 01 | true | +| 08-15 | 0000 0000 | 00 | false | +| 16-23 | 0000 0001 | 01 | true | +| 24-31 | 0001 1001 | 19 | 25 | #### GODEBUG @@ -284,4 +284,3 @@ gc 10 @2.592s 0%: 0.003+11+0.045 ms clock, 0.031+0/5.9/5.2+0.36 ms cpu, 499->499 만약, 당신이 나의 활동 및 프로젝트, 그리고 더 나은 소프트웨어 엔지니어가 되는데 관심이 있다면, 내 웹사이트 [https://hoanhan101.github.io/](https://hoanhan101.github.io/) 에 자유롭게 방문해주시길 바랍니다. **읽어주셔서 고맙습니다. 행운을 빕니다!** - diff --git a/191-199/README.md b/191-199/README.md index 0fce8f3..757ed2f 100644 --- a/191-199/README.md +++ b/191-199/README.md @@ -2,12 +2,12 @@ Assigned to -* 김준희/@juunini +- 김준희/@juunini Mandatory reviewer -* 조동헌/@davinnovation -* Mark Hahn/@TangoEnSkai +- 조동헌/@davinnovation +- Mark Hahn/@TangoEnSkai ### Benchmarking 191 @@ -28,4 +28,3 @@ Mandatory reviewer > > **Memory Tracing 196** ## Keep in touch 199 - diff --git a/20-37/20-37.md b/20-37/20-37.md index 5fb5bfa..64eed9f 100644 --- a/20-37/20-37.md +++ b/20-37/20-37.md @@ -637,4 +637,3 @@ type users []user 이 구문을 사용하여 `users` 를 새로 정의할 수 있으며, 이는 `users`를 정의하는 두 번째 방법이다. 이처럼 이미 존재하는 타입을 통해, 다른 타입의 타입으로 사용할 수 있다. 이 때 두 타입은 서로 연관성이 없다. 하지만 다음의 코드 `u := make(map[users]int)`와 같이 키로서 사용코자 할 때, 컴파일러는 다음의 오류를 발생시킨다. "맵의 키로써 `users` 타입은 유효하지 않다." 그 이유는, 키로 어떤 것을 사용하던지 그 값은 반드시 비교가능해야 하기 때문이다. 맵이 키의 해시 값을 만들 수 있는 지 보여주는 일종의 불리언 표현식을 사용해야한다. - diff --git a/20-37/README.md b/20-37/README.md index a6b210c..4883e9b 100644 --- a/20-37/README.md +++ b/20-37/README.md @@ -2,13 +2,13 @@ Assigned to -* 최희재/@gmlwo530 -* 신정훈/@shin2jhoon +- 최희재/@gmlwo530 +- 신정훈/@shin2jhoon Mandatory reviewer -* 권용민/@snowmerak -* 이재원/@mumunuu +- 권용민/@snowmerak +- 이재원/@mumunuu ## Data Structures 20 @@ -57,4 +57,3 @@ Mandatory reviewer > > #### Find key 36 > > > > #### Map key restrictions 36 - diff --git a/37-55/37-55.md b/37-55/37-55.md index 5cbdd25..180719c 100644 --- a/37-55/37-55.md +++ b/37-55/37-55.md @@ -103,8 +103,8 @@ Changed User Email To it@wontmatter.com 아래 예제들은 실제 Go의 표준 라이브러리에서 사용하는 코드들이다. 이들을 공부해보면, 값에 의한 호출과 참조에 의한 호출\(pointer semantic\) 중 하나를 일관되게 사용하는 것이 얼마나 중요한지 알 수 있다. 따라서 변수의 타입을 정할 때, 다음의 질문에 스스로 답해보자. -* 이 타입은 값에 의한 호출과 참조에 의한 호출 중 어느 것이 더 적합한가? -* 만약 이 변수의 값을 변경해야 한다면, 새로운 값을 가지는 복사본을 만드는 것과, 다른 곳에서도 이 변경된 값을 확인할 수 있게 이 변수의 값을 직접 변경하는 것 중 어느 것이 더 적합한가? +- 이 타입은 값에 의한 호출과 참조에 의한 호출 중 어느 것이 더 적합한가? +- 만약 이 변수의 값을 변경해야 한다면, 새로운 값을 가지는 복사본을 만드는 것과, 다른 곳에서도 이 변경된 값을 확인할 수 있게 이 변수의 값을 직접 변경하는 것 중 어느 것이 더 적합한가? 가장 중요한 것은 일관성이다. 처음에 한 결정이 잘못되었다고 판단되면, 그때 이를 변경하면 된다. @@ -462,10 +462,10 @@ p := pipe{"cfg_service"} `iTable`은 다음의 두 가지를 제공한다: -* 첫 번째 부분은 저장된 데이터의 타입을 나타낸다. 이 예제에서는 `file` 타입을 말한다. -* 두 번째 부분은 함수 포인터의 모체로서, 인터페이스를 통해 메서드를 호출할 때 정확한 메서드를 호출하기 위하여 사용된다. +- 첫 번째 부분은 저장된 데이터의 타입을 나타낸다. 이 예제에서는 `file` 타입을 말한다. +- 두 번째 부분은 함수 포인터의 모체로서, 인터페이스를 통해 메서드를 호출할 때 정확한 메서드를 호출하기 위하여 사용된다. -![iTable for \`file\`](../.gitbook/assets/48.jpg) +![iTable for `file`](../.gitbook/assets/48.jpg) 인터페이스를 통해서 `read`를 호출하면, `iTable`을 확인해서 이 타입에 맞는 `read` 함수를 찾고 이를 호출한다. 결과적으로 구체적 타입의 `read` 메서드를 호출하는 것이다. @@ -475,7 +475,7 @@ retrieve(f) `p`도 이와 동일하다. `reader` 인터페이스의 첫 번째 워드는 `pipe` 타입을 가리키고, 두번째 워드는 `p`의 복사본을 가리킨다. -![iTable for \`pipe\`](../.gitbook/assets/49-1.jpg) +![iTable for `pipe`](../.gitbook/assets/49-1.jpg) 데이터가 변경되었기 때문에, 동작도 다르다. @@ -575,8 +575,8 @@ u := user{"Hoanh", "hoanhan@email.com"} 다음은 그 규칙들이다. -* 주어진 타입 T의 어떤 값에 대해, 값 리시버로 구현한 메서드들만이 이 타입의 메서드 집합에 속한다. -* 주어진 타입 \*T \(타입 T의 포인터\)의 어떤 값에 대해, 값 리시버와 포인터 리시버를 사용하는 모든 메서드들이 이 타입의 메서드 집합에 속한다. +- 주어진 타입 T의 어떤 값에 대해, 값 리시버로 구현한 메서드들만이 이 타입의 메서드 집합에 속한다. +- 주어진 타입 \*T \(타입 T의 포인터\)의 어떤 값에 대해, 값 리시버와 포인터 리시버를 사용하는 모든 메서드들이 이 타입의 메서드 집합에 속한다. 즉, 어떤 타입의 포인터를 사용한다면 선언된 모든 메서드들은 모두 이 포인터를 통해 사용이 가능하다. 만약 어떤 타입의 값을 사용한다면 값에 의한 호출을 사용하는 메서드들만이 사용이 가능하다. @@ -602,8 +602,8 @@ func (d *duration) notify() { `42`를 받아서, 이를 `duration` 타입으로 변경 후 `notify` 메서드를 호출해보자. 이때, 컴파일러는 다음과 같은 에러 메시지를 보여준다. -* "cannot call pointer method on duration\(42\)" -* "cannot take the address of duration\(42\)" +- "cannot call pointer method on duration\(42\)" +- "cannot take the address of duration\(42\)" ```go duration(42).notify() @@ -619,7 +619,7 @@ duration(42).notify() 이 문제를 해결하기 위해서는, `u` 대신 `u`의 주소 값\(&u\)를 전달해야 한다. `user`의 값을 만들고 이 값의 주소 값을 전달하면, 인터페이스는 `user` 타입의 주소 값을 가지게 되고 원본 값을 가리킬 수 있게 된다. -![pointer of \`u\`](../.gitbook/assets/53.jpg) +![pointer of `u`](../.gitbook/assets/53.jpg) ```go sendNotification(&u) @@ -688,4 +688,3 @@ for _, e := range entities { My name is Hoanh and my email is hoanhan@email.com My name is Hoanh An and my email is hoanhan101@gmail.com ``` - diff --git a/37-55/README.md b/37-55/README.md index 9f0bca5..081f12a 100644 --- a/37-55/README.md +++ b/37-55/README.md @@ -2,12 +2,12 @@ Assigned to -* 정영훈/@aeuveritas +- 정영훈/@aeuveritas Mandatory reviewer -* 김지훈/@ghun2 -* 최희재/@gmlwo530 +- 김지훈/@ghun2 +- 최희재/@gmlwo530 ## Decoupling 37 @@ -24,4 +24,3 @@ Mandatory reviewer > > #### Valueless type 46 > > > > #### Interface via pointer receiver 50 - diff --git a/5-20/5-20.md b/5-20/5-20.md index 77a8178..058d029 100644 --- a/5-20/5-20.md +++ b/5-20/5-20.md @@ -12,8 +12,8 @@ 그래서 이렇게 `The Ultimate Go Study Guide eBook version`을 만들었습니다. 지난 3개월 여 제 여유시간 대부분을 `Ultimate Go Study Guide`를 200 페이지의 책으로 만드는데 쏟아부었습니다. `Ultimate Go` 의 모든 좋은 점에 더하여, 전자책에서는 두 가지 장점이 더해졌습니다. -* code 의 input과 output을 따라가며 썼습니다. -* 다이어그램이 추가되었습니다. +- code 의 input과 output을 따라가며 썼습니다. +- 다이어그램이 추가되었습니다. 전자책 버전을 통해 Go를 좀더 쉽게 배우셨으면 합니다. 다시 한 번 모든 분들의 지원과 성원에 감사합니다. 정말 감사합니다. @@ -29,13 +29,13 @@ 타입은 두 가지 질문을 통해 완전성과 가독성을 제공한다 -* 할당한 메모리의 크기는 얼마인가? \(예. 32-bit, 64-bit\) -* 이 메모리는 무엇을 의미하는가? \(예. int, uint, bool, ...\) +- 할당한 메모리의 크기는 얼마인가? \(예. 32-bit, 64-bit\) +- 이 메모리는 무엇을 의미하는가? \(예. int, uint, bool, ...\) 타입은 `int32`, `int64`처럼 명확한 이름도 있다. 예를 들어 -* `uint8`은 1 바이트 메모리에 10진수 숫자를 가지고 있다. -* `int32`는 4 바이트 메모리에 10진수 숫자를 가지고 있다. +- `uint8`은 1 바이트 메모리에 10진수 숫자를 가지고 있다. +- `int32`는 4 바이트 메모리에 10진수 숫자를 가지고 있다. `uint` 나 `int` 처럼 메모리 크기가 명확하지 않은 타입을 선언하면, 아키텍처에 따라 크기가 달라진다. 64-bit OS라면, `int` 는 `int64`와 같은 크기가 되고, 32-bit OS 라면 `int32`와 같은 크기가 된다. @@ -47,14 +47,14 @@ 모든 변수는 초기화되어야 한다. 어떤 값으로 초기화할지를 명시하지 않으면, 제로값으로 초기화 된다. 할당하는 메모리의 모든 비트는 0으로 리셋된다. -| Type | Zero value | -| :--- | :--- | -| Boolean | false | -| Integer | 0 | -| Floating Point | 0 | -| Complex | 0i | -| String | "" | -| Pointer | nil | +| Type | Zero value | +| :------------- | :--------- | +| Boolean | false | +| Integer | 0 | +| Floating Point | 0 | +| Complex | 0i | +| String | "" | +| Pointer | nil | **선언과 초기화** @@ -586,4 +586,3 @@ fmt.Println("Log:", Ldate, Ltime, Lmicroseconds, Llongfile, Lshortfile, LUTC) 3: 1 2 3 Log: 1 2 4 8 16 32 ``` - diff --git a/5-20/README.md b/5-20/README.md index 521fc78..f2bf18a 100644 --- a/5-20/README.md +++ b/5-20/README.md @@ -2,12 +2,12 @@ Assigned to -* 정현석/@nicewook +- 정현석/@nicewook Mandatory reviewer -* 이재원/@mumunuu -* 김준희/@juunini +- 이재원/@mumunuu +- 김준희/@juunini ## Introduction 5 @@ -46,4 +46,3 @@ Mandatory reviewer > > **Declare and initialize 17** > > > > **iota 19** - diff --git a/55-70/55-70.md b/55-70/55-70.md index ee9fcb5..9e7885f 100644 --- a/55-70/55-70.md +++ b/55-70/55-70.md @@ -313,8 +313,8 @@ counter := counters.alertCounter(10) 만약 내보내지 않은 형태의 변수를 사용한다면 아래와 같은 컴파일 에러가 발생하게 된다. -* cannot refer to unexported name counters.alertCounter -* undefined: counters.alertCounter +- cannot refer to unexported name counters.alertCounter +- undefined: counters.alertCounter **내보내지 않은 식별자 값에 접근** @@ -585,10 +585,10 @@ animals := []Animal{ 위 방식이 냄새나는 코드인 이유: -* `Animal` 타입은 재사용 가능한 추상화된 계층을 제공한다. -* 이 프로그램은 `Animal` 타입으로 값을 만들거나 단독으로 사용할 필요가 전혀 없다. -* `Animal` 타입의 `Speak` 메서드 구현은 일반화이다. -* `Animal` 타입에서 정의한 `Speak` 메서드는 절대 호출되어지지 않는다. +- `Animal` 타입은 재사용 가능한 추상화된 계층을 제공한다. +- 이 프로그램은 `Animal` 타입으로 값을 만들거나 단독으로 사용할 필요가 전혀 없다. +- `Animal` 타입의 `Speak` 메서드 구현은 일반화이다. +- `Animal` 타입에서 정의한 `Speak` 메서드는 절대 호출되어지지 않는다. **행동에 의한 그루핑** @@ -691,9 +691,8 @@ Meow! My name is Milo , it is true I am a mammal with a climb factor of 4 타입 선언에 대한 지침: -* 새롭거나 유일한 것을 대표하는 타입을 선언한다. 가독성을 위해 별칭\(alias\)을 생성하지 않는다. -* 모든 타입의 값이 자체적으로 생성되거나 사용되었는지 확인한다. -* 상태가 아니라 행동을 위한 타입을 임베드 해야 한다. 행동에 대해 고려하지 않는다면 미래에 유지보수하기 어려운 설계가 될 수 있다. -* 특정 타입이 이미 있는 타입을 위한 별칭이거나 추상화하고 있다면 의문을 가져야 한다. -* 특정 타입이 유일한 목적이 공통 상태를 공유하는 것이라면 의문을 가져야 한다. - +- 새롭거나 유일한 것을 대표하는 타입을 선언한다. 가독성을 위해 별칭\(alias\)을 생성하지 않는다. +- 모든 타입의 값이 자체적으로 생성되거나 사용되었는지 확인한다. +- 상태가 아니라 행동을 위한 타입을 임베드 해야 한다. 행동에 대해 고려하지 않는다면 미래에 유지보수하기 어려운 설계가 될 수 있다. +- 특정 타입이 이미 있는 타입을 위한 별칭이거나 추상화하고 있다면 의문을 가져야 한다. +- 특정 타입이 유일한 목적이 공통 상태를 공유하는 것이라면 의문을 가져야 한다. diff --git a/55-70/README.md b/55-70/README.md index 23577f3..ec0398f 100644 --- a/55-70/README.md +++ b/55-70/README.md @@ -2,13 +2,13 @@ Assigned to -* 이경석/@lee-kyungseok +- 이경석/@lee-kyungseok Mandatory reviewer -* 김지훈/@ghun2 -* 배지원/@baewang -* 강영주/@979156 +- 김지훈/@ghun2 +- 배지원/@baewang +- 강영주/@979156 > #### Embedding 55 > @@ -41,4 +41,3 @@ Mandatory reviewer > > **Grouping By State 65** > > > > **Grouping By Behavior 67** - diff --git a/70-89/70-89.md b/70-89/70-89.md index 6b6c3bc..c66f716 100644 --- a/70-89/70-89.md +++ b/70-89/70-89.md @@ -381,8 +381,8 @@ Out: Data Go에는 암시적 인터페이스 변환이라는 기능이 있기 때문이다. 이것은 아래의 이유 때문에 가능하다: -* 모든 인터페이스 값이 동일한 모델\(구현 세부 정보\). -* 만약 타입의 내용이 명확하다면, 하나의 인터페이스 안에 존재하는 구체적인 타입은 다른 인터페이스에 대해 충분한 동작을 가진다. +- 모든 인터페이스 값이 동일한 모델\(구현 세부 정보\). +- 만약 타입의 내용이 명확하다면, 하나의 인터페이스 안에 존재하는 구체적인 타입은 다른 인터페이스에 대해 충분한 동작을 가진다. `PullStorer` 내부에 저장된 모든 구체적인 타입은 `Storer` 및 `Puller`도 구현해야 한다. @@ -398,7 +398,7 @@ Go에는 암시적 인터페이스 변환이라는 기능이 있기 때문이다 모두 인터페이스 값에 대한 가치 의미와 공유하기 위한 포인터 의미. -![iTable for \`pipe\`](../.gitbook/assets/80.jpg) +![iTable for `pipe`](../.gitbook/assets/80.jpg) ```go package main @@ -597,7 +597,7 @@ Out: Data 우리는 이 문제를 해결 하고 제품에 반영한다. 우리가 했던 모든 리팩터링은 다음 리팩터링을 하기전에 제품에 반영하였다. 우리는 계속해서 기술부채를 최소화하고 있다. -![iTable for \`pipe\`](../.gitbook/assets/85.jpg) +![iTable for `pipe`](../.gitbook/assets/85.jpg) ```go package main @@ -778,4 +778,3 @@ In: Data Out: Data Out: Data ``` - diff --git a/70-89/README.md b/70-89/README.md index 2376b37..fbe03c2 100644 --- a/70-89/README.md +++ b/70-89/README.md @@ -2,12 +2,12 @@ Assigned to -* 김지훈/@ghun2 +- 김지훈/@ghun2 Mandatory reviewer -* 정현석/@nicewook -* 이경석/@lee-kyungseok +- 정현석/@nicewook +- 이경석/@lee-kyungseok > ## Decoupling 70 > @@ -18,4 +18,3 @@ Mandatory reviewer > > ### Interface Composition 79 > > > > ### Decoupling With Interface Composition 84 - diff --git a/89-101/89-101.md b/89-101/89-101.md index 4a38a88..5e6117e 100644 --- a/89-101/89-101.md +++ b/89-101/89-101.md @@ -81,7 +81,7 @@ func main() { m = ml ``` -![\`MoveLocker\`에서 \`Mover\`로 암묵적 변환](../.gitbook/assets/91.jpg) +![`MoveLocker`에서 `Mover`로 암묵적 변환](../.gitbook/assets/91.jpg) 하지만, 아래와 같이 반대로는 불가능합니다. @@ -312,11 +312,11 @@ API를 사용한다. 위 코드는 문제가 있는데 왜냐하면: -* 패키지가 구체적인 타입의 모든 API를 가지는 인터페이스를 선언하고 있다. -* 인터페이스는 export 되지만 구체적인 타입은 그렇지 않다. -* 팩토리 함수가 export 되지 않은 타입을 가지고 있는 인터페이스를 반환한다. -* 인터페이스를 없더라도 API에서 달라지는 점이 없다. -* 인터페이스가 API 변화에 잘 대응할 수 있도록 디커플링하고 있지 않다. +- 패키지가 구체적인 타입의 모든 API를 가지는 인터페이스를 선언하고 있다. +- 인터페이스는 export 되지만 구체적인 타입은 그렇지 않다. +- 팩토리 함수가 export 되지 않은 타입을 가지고 있는 인터페이스를 반환한다. +- 인터페이스를 없더라도 API에서 달라지는 점이 없다. +- 인터페이스가 API 변화에 잘 대응할 수 있도록 디커플링하고 있지 않다. ### 인터페이스 오염 제거 @@ -341,7 +341,7 @@ func NewServer(host string) *Server { `Start`가 호출되면 서버가 리퀘스트를 받기 시작한다. ```go -func (s *Server) Start() error { +func (s *Server) Start() error { return nil } ``` @@ -382,15 +382,15 @@ API를 사용한다. 인터페이스를 다음과 같은 상황에서 사용한다: -* 유저가 API의 실제 구현 디테일을 작성한다. -* API가 유지보수가 필요한 다양한 구현을 가지고 있다. -* API의 일부분이 변화할 수 있고 디커플링을 필요로 할때 사용한다. +- 유저가 API의 실제 구현 디테일을 작성한다. +- API가 유지보수가 필요한 다양한 구현을 가지고 있다. +- API의 일부분이 변화할 수 있고 디커플링을 필요로 할때 사용한다. 다음과 같은 상황에서 인터페이스를 사용할지 다시 한번 생각해본다: -* 오직 테스트를 위해서만 사용한다. -* 변화로부터 쉽게 대응할 수 없다. -* 인터페이스가 코드를 더 좋게 만들어주지 않는다. +- 오직 테스트를 위해서만 사용한다. +- 변화로부터 쉽게 대응할 수 없다. +- 인터페이스가 코드를 더 좋게 만들어주지 않는다. ## 모조품 만들기\(Mocking\) @@ -522,4 +522,3 @@ func main() { } } ``` - diff --git a/89-101/README.md b/89-101/README.md index 4703048..5aab4b6 100644 --- a/89-101/README.md +++ b/89-101/README.md @@ -2,12 +2,12 @@ Assigned to -* 권경모/@kkweon +- 권경모/@kkweon Mandatory reviewer -* 정현석/@nicewook -* 이경석/@lee-kyungseok +- 정현석/@nicewook +- 이경석/@lee-kyungseok > ## Conversion 89 > @@ -26,4 +26,3 @@ Mandatory reviewer > > ### Package To Mock 98 > > > > ### Client 100 - diff --git a/README.md b/README.md index d49c03c..b80dbe6 100644 --- a/README.md +++ b/README.md @@ -13,18 +13,18 @@ 1. 자신이 맡은 범위의 폴더안에 폴더명과 같은 Markdown 문서를 만들어 PDF 문서의 해당 부분을 복사하고 Markdown 형식에 맞게 정리한다. 2. 전체 정리가 완료되면 Pull Request를 통해 review를 거쳐 main 브랜치에 merge 한다. - * 이제 변역을 위한 준비가 완료 되었다. + - 이제 변역을 위한 준비가 완료 되었다. 3. Branch를 생성하고 범위의 일정 분량을 번역후 Pull Request를 요청하고, 2명 이상의 reviewer로부터 approval을 받으면 main 브랜치에 merge 한다. 4. 전체 초벌 번역이 끝나면, 추가적인 번역여부를 결정하며, 번역한 Markdown 문서들을 편집하여 공유한다. ### Code -* [Table of Contents/table-of-contents-eng.md](table-of-contents/table-of-contents-eng.md): PDF 문서의 목차를 Markdown 형식으로 정리하고, 보기좋게 편집한 문서 -* [assignment.md](assignment.md): 전체 문서를 13 범위로 나누어 놓은 문서. 각 범위는 한 명의 주 번역자와 두 명 이상의 reviewer를 명시해둔다 -* [CODEOWNERS](https://github.com/ultimate-go-korean/translation/tree/86e7958e050398fac3c78b86c134f8e53dd131ec/CODEOWNERS/README.md): 범위별 폴더/파일 담당자를 명시한 문서 \(참고. [https://bit.ly/3jyS8mM](https://bit.ly/3jyS8mM)\) -* 범위 별 폴더 - * 폴더 명과 같은 Markdown 문서\(ex. 5-20/5-20.md\)가 있으며, 여기에 PDF 문서의 해당 범위를 Markdown 으로 정리 후 한글로 번역을 한다. - * README.md: [table-of-contents-eng.md](table-of-contents/table-of-contents-eng.md) 파일의 해당 범위 부분을 여기에 옮겨두어 폴더 내 Markdown 문서가 다루는 내용을 알 수 있게 한다. +- [Table of Contents/table-of-contents-eng.md](table-of-contents/table-of-contents-eng.md): PDF 문서의 목차를 Markdown 형식으로 정리하고, 보기좋게 편집한 문서 +- [assignment.md](assignment.md): 전체 문서를 13 범위로 나누어 놓은 문서. 각 범위는 한 명의 주 번역자와 두 명 이상의 reviewer를 명시해둔다 +- [CODEOWNERS](https://github.com/ultimate-go-korean/translation/tree/86e7958e050398fac3c78b86c134f8e53dd131ec/CODEOWNERS/README.md): 범위별 폴더/파일 담당자를 명시한 문서 \(참고. [https://bit.ly/3jyS8mM](https://bit.ly/3jyS8mM)\) +- 범위 별 폴더 + - 폴더 명과 같은 Markdown 문서\(ex. 5-20/5-20.md\)가 있으며, 여기에 PDF 문서의 해당 범위를 Markdown 으로 정리 후 한글로 번역을 한다. + - README.md: [table-of-contents-eng.md](table-of-contents/table-of-contents-eng.md) 파일의 해당 범위 부분을 여기에 옮겨두어 폴더 내 Markdown 문서가 다루는 내용을 알 수 있게 한다. ### Issues @@ -42,9 +42,9 @@ ## 링크 -* Original Repo: [https://github.com/hoanhan101/ultimate-go](https://github.com/hoanhan101/ultimate-go) -* Download the book: [https://gumroad.com/l/bpUYF](https://gumroad.com/l/bpUYF) - * 번역 시점의 버전: `Hoanh An, The Ultimate Go Study Guide.pdf`\(MD5: fb3e456e9ba62606f5318f386a8e6c3c\) +- Original Repo: [https://github.com/hoanhan101/ultimate-go](https://github.com/hoanhan101/ultimate-go) +- Download the book: [https://gumroad.com/l/bpUYF](https://gumroad.com/l/bpUYF) + - 번역 시점의 버전: `Hoanh An, The Ultimate Go Study Guide.pdf`\(MD5: fb3e456e9ba62606f5318f386a8e6c3c\) ## Contributors @@ -52,20 +52,19 @@ 이름/깃헙계정의 순서로 표기한다. -* 강영주/@979156 -* 권경모/@kkweon -* 권용민/@snowmerak -* 김준희/@juunini -* 김지훈/@ghun2 -* 배지원/@baewang -* 서병선/@famersbs -* 신정훈/@shin2jhoon -* 이경석/@lee-kyungseok -* 이재원/@mumunuu -* 정영훈/@aeuveritas -* 정현석/@nicewook -* 조동헌/@davinnovation -* 조용래/@dreamgonfly -* 최희재/@gmlwo530 -* Mark Hahn/@TangoEnSkai - +- 강영주/@979156 +- 권경모/@kkweon +- 권용민/@snowmerak +- 김준희/@juunini +- 김지훈/@ghun2 +- 배지원/@baewang +- 서병선/@famersbs +- 신정훈/@shin2jhoon +- 이경석/@lee-kyungseok +- 이재원/@mumunuu +- 정영훈/@aeuveritas +- 정현석/@nicewook +- 조동헌/@davinnovation +- 조용래/@dreamgonfly +- 최희재/@gmlwo530 +- Mark Hahn/@TangoEnSkai diff --git a/SUMMARY.md b/SUMMARY.md index a947c7c..be73864 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,33 +1,32 @@ # Table of contents -* ["The Ultimate Go Study Guide" 한글 번역 프로젝트](README.md) -* [Table of Contents](table-of-contents/README.md) - * [table-of-contents-eng](table-of-contents/table-of-contents-eng.md) -* [5-20 pages translation](5-20/README.md) - * [서문](5-20/5-20.md) -* [20-37 pages translation](20-37/README.md) - * [데이터 구조\(Data Structures\)](20-37/20-37.md) -* [37-55 pages translation](37-55/README.md) - * [디커플링](37-55/37-55.md) -* [55-70 pages translation](55-70/README.md) - * [55-70](55-70/55-70.md) -* [70-89 pages translation](70-89/README.md) - * [디커플링](70-89/70-89.md) -* [89-101 pages translation](89-101/README.md) - * [89-101](89-101/89-101.md) -* [101-114 pages translation](101-114/README.md) - * [에러 처리](101-114/101-114.md) -* [114-128 pages translation](114-128/README.md) - * [동시성](114-128/114-128.md) -* [128-139 pages translation](128-139/README.md) - * [자원 경쟁\(Data race\)](128-139/128-139.md) -* [139-164 pages translation](139-164/README.md) - * [채널](139-164/139-164.md) -* [164-173 pages translation](164-173/README.md) - * [Patterns](164-173/164-173.md) -* [173-191 pages translation](173-191/README.md) - * [테스팅 & 프로파일링](173-191/173-191.md) -* [191-199 pages translation](191-199/README.md) - * [191-199](191-199/191-199.md) -* [Assignment table](assignment.md) - +- ["The Ultimate Go Study Guide" 한글 번역 프로젝트](README.md) +- [Table of Contents](table-of-contents/README.md) + - [table-of-contents-eng](table-of-contents/table-of-contents-eng.md) +- [5-20 pages translation](5-20/README.md) + - [서문](5-20/5-20.md) +- [20-37 pages translation](20-37/README.md) + - [데이터 구조\(Data Structures\)](20-37/20-37.md) +- [37-55 pages translation](37-55/README.md) + - [디커플링](37-55/37-55.md) +- [55-70 pages translation](55-70/README.md) + - [55-70](55-70/55-70.md) +- [70-89 pages translation](70-89/README.md) + - [디커플링](70-89/70-89.md) +- [89-101 pages translation](89-101/README.md) + - [89-101](89-101/89-101.md) +- [101-114 pages translation](101-114/README.md) + - [에러 처리](101-114/101-114.md) +- [114-128 pages translation](114-128/README.md) + - [동시성](114-128/114-128.md) +- [128-139 pages translation](128-139/README.md) + - [자원 경쟁\(Data race\)](128-139/128-139.md) +- [139-164 pages translation](139-164/README.md) + - [채널](139-164/139-164.md) +- [164-173 pages translation](164-173/README.md) + - [Patterns](164-173/164-173.md) +- [173-191 pages translation](173-191/README.md) + - [테스팅 & 프로파일링](173-191/173-191.md) +- [191-199 pages translation](191-199/README.md) + - [191-199](191-199/191-199.md) +- [Assignment table](assignment.md) diff --git a/assignment.md b/assignment.md index ee3ff6f..23a69ef 100644 --- a/assignment.md +++ b/assignment.md @@ -1,18 +1,17 @@ # Assignment table -| No | Pages | Contents | Assignee/GitHub account | Reviewers | -| :--- | :--- | :--- | :--- | :--- | -| 1 | 5-20 | **Introduction** Language Mechanics Syntax - Variables - Struct - Pointer - Escape analysis - Function - Constant | 정현석/@nicewook | 이재원/@mumunuu<br>김준희/@juunini | -| 2 | 20-37 | Data Structures - Array - Slice - Map | 최희재/@gmlwo530<br>신정훈/@shin2jhoon | 권용민/@snowmerak<br>이재원/@mumunuu | -| 3 | 37-55 | Decoupling - Method - Interface | 정영훈/@aeuveritas | 김지훈/@ghun2<br>최희재/@gmlwo530 | -| 4 | 55-70 | Decoupling - Embedding - Exporting **Software Design** Composition - Grouping types | 이경석/@lee-kyungseok | 김지훈/@ghun2<br>배지원/@baewang<br>강영주/@979156 | -| 5 | 70-89 | Composition - Decoupling | 김지훈/@ghun2 | 정현석/@nicewook<br>이경석/@lee-kyungseok | -| 6 | 89-101 | Composition - Conversion - Interface Pollution - Mocking | 권경모/@kkweon | 정현석/@nicewook<br>이경석/@lee-kyungseok | -| 7 | 101-114 | Error Handling - Default error values - Error variables - Type and context - Behavior as context - Finding the bug - Wrapping Errors | 권용민/@snowmerak<br>강영주/@979156 | 권경모/@kkweon<br>최희재/@gmlwo530 | -| 8 | 114-128 | **Concurrency** Mechanics - Goroutine - Language Mechanics | 이재원/@mumunuu | 권용민/@snowmerak<br>조용래/@dramgonfly<br>신정훈/@shin2jhoon | -| 9 | 128-139 | Mechanics - Data race | 배지원/@baewang | 조동헌/@davinnovation<br>강영주/@979156 | -| 10 | 139-164 | Mechanics - Channel | 조용래/@dreamgonfly | 배지원/@baewang<br>정영훈/@aeuveritas<br>신정훈/@shin2jhoon | -| 11 | 164-173 | Patterns - Context | Mark Hahn/@TangoEnSkai | 권경모/@kkweon<br>정영훈/@aeuveritas | -| 12 | 173-191 | **Testing and Profiling** Testing - Basic Unit Test | 조동헌/@davinnovation | 김준희/@juunini Mark Hahn/@TangoEnSkai | -| 13 | 191-199 | Benchmarking - Basic Benchmark - Sub Benchmark Profiling - Stack Trace - GODEBUG **Keep in touch** | 김준희/@juunini | 조동헌/@davinnovation Mark Hahn/@TangoEnSkai | - +| No | Pages | Contents | Assignee/GitHub account | Reviewers | +| :-- | :------ | :----------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------- | :------------------------------------------------------------------------ | +| 1 | 5-20 | **Introduction** Language Mechanics Syntax - Variables - Struct - Pointer - Escape analysis - Function - Constant | 정현석/@nicewook | 이재원/@mumunuu<br>김준희/@juunini | +| 2 | 20-37 | Data Structures - Array - Slice - Map | 최희재/@gmlwo530<br>신정훈/@shin2jhoon | 권용민/@snowmerak<br>이재원/@mumunuu | +| 3 | 37-55 | Decoupling - Method - Interface | 정영훈/@aeuveritas | 김지훈/@ghun2<br>최희재/@gmlwo530 | +| 4 | 55-70 | Decoupling - Embedding - Exporting **Software Design** Composition - Grouping types | 이경석/@lee-kyungseok | 김지훈/@ghun2<br>배지원/@baewang<br>강영주/@979156 | +| 5 | 70-89 | Composition - Decoupling | 김지훈/@ghun2 | 정현석/@nicewook<br>이경석/@lee-kyungseok | +| 6 | 89-101 | Composition - Conversion - Interface Pollution - Mocking | 권경모/@kkweon | 정현석/@nicewook<br>이경석/@lee-kyungseok | +| 7 | 101-114 | Error Handling - Default error values - Error variables - Type and context - Behavior as context - Finding the bug - Wrapping Errors | 권용민/@snowmerak<br>강영주/@979156 | 권경모/@kkweon<br>최희재/@gmlwo530 | +| 8 | 114-128 | **Concurrency** Mechanics - Goroutine - Language Mechanics | 이재원/@mumunuu | 권용민/@snowmerak<br>조용래/@dramgonfly<br>신정훈/@shin2jhoon | +| 9 | 128-139 | Mechanics - Data race | 배지원/@baewang | 조동헌/@davinnovation<br>강영주/@979156 | +| 10 | 139-164 | Mechanics - Channel | 조용래/@dreamgonfly | 배지원/@baewang<br>정영훈/@aeuveritas<br>신정훈/@shin2jhoon | +| 11 | 164-173 | Patterns - Context | Mark Hahn/@TangoEnSkai | 권경모/@kkweon<br>정영훈/@aeuveritas | +| 12 | 173-191 | **Testing and Profiling** Testing - Basic Unit Test | 조동헌/@davinnovation | 김준희/@juunini Mark Hahn/@TangoEnSkai | +| 13 | 191-199 | Benchmarking - Basic Benchmark - Sub Benchmark Profiling - Stack Trace - GODEBUG **Keep in touch** | 김준희/@juunini | 조동헌/@davinnovation Mark Hahn/@TangoEnSkai | diff --git a/package-lock.json b/package-lock.json index 819fbe7..58e2633 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,838 @@ { "name": "ultimate-go-korean", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "ultimate-go-korean", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "husky": "^4.3.0", + "prettier": "^2.1.2", + "pretty-quick": "^3.0.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "dependencies": { + "semver-regex": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/husky": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "husky-run": "bin/run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-quick": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.0.2.tgz", + "integrity": "sha512-4rWOs/Ifdkg7G/YX7Xbco4jZkuXPx445KdhuMI6REnl3nXRDb9+zysb29c76R59jsJzcnkcpAaGi8D/RjAVfSQ==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "bin": { + "pretty-quick": "bin/pretty-quick.js" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/pretty-quick/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "node_modules/semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.10.4", diff --git a/table-of-contents/README.md b/table-of-contents/README.md index e9fd6dd..f886a96 100644 --- a/table-of-contents/README.md +++ b/table-of-contents/README.md @@ -1,2 +1 @@ # Table of Contents - diff --git a/table-of-contents/table-of-contents-eng.md b/table-of-contents/table-of-contents-eng.md index 708f91b..ac1e707 100644 --- a/table-of-contents/table-of-contents-eng.md +++ b/table-of-contents/table-of-contents-eng.md @@ -273,4 +273,3 @@ > > **Memory Tracing 196** ## Keep in touch 199 -