마크다운 텍스트에 대해 설명한다. RStudio에는 팬독 바이너리가 들어있고, 문서 변환기로서의 기능은 대부분은 Rmarkdown패키지에 녹아있다.
팬독 마크다운 문법
R에서는 rmarkdown 패키지에 의해 제공되는 Rmarkdown을 사용한다. rmarkdown은 pandoc마크다운을 내부적으로 사용하고, 팬독에 대한 래퍼 역학을 한다.
YAML 헤더
---
title: "Untitled"
author: "sunny"
output: html_document
---
앞뒤 — 는 다른 텍스트와 구별되는 경계
그 안에 필요한 내용을 [키:값]쌍으로 기재
YAML header 는 문서의 메타 정보를 입력하는 곳
단락
[code]
단락은 특별한 표시 없이 그대로 입력
단락의 구분은 하나 이상의 빈 줄로
그냥 엔터만 한줄쳐서 작성한다면
이는 그냥 한 단락으로 간주
줄을 강제로 바꾸기 위해서는
스페이스를 두 번 누르고 엔터를 하거나
줄을 강제로 바꾸기 위해서는 끝에\
벡슬래시를 입력하고 엔터키 누르기
[result]
단락은 특별한 표시 없이 그대로 입력
단락의 구분은 하나 이상의 빈 줄로
그냥 엔터만 한줄쳐서 작성한다면 이는 그냥 한 단락으로 간주
줄을 강제로 바꾸기 위해서는
스페이스를 두 번 누르고 엔터를 하거나
줄을 강제로 바꾸기 위해서는 끝에
벡슬래시를 입력하고 엔터키 누르기
제목
[code]
# Header1
## Header2
### Header3
(헤더 앞에는 적어도 빈 줄 하나가 필요)
나는 베스킨라빈스 아이스크림 중
#22번과 #5번을 좋아한다.
나는 베스킨라빈스 아이스크림 중
#22번과 #5번을 좋아한다.
[result]
22번과 #5번을 좋아한다.
제목의 아이디와 클래스
팬독은 제목 부분에 HTML의 class, id 속성들을 정할 수 있는 문법 제공
{}안에 #은 아이디, “,”로 시작하는 것은 클래스
## 팬독 사용법 {#UsingPandoc .unnumbered}
UsingPandoc은 아이디, unnumbered는 클래스
한글 제목을 사용하는 경우에는 영문으로 아이디를 지정해줘야 함!
한글 제목만 사용경우, 자동으로 생성되는 내부 링크가 제대로 작동하지 않을 가능성이 높음. 이를 어기면 HTML 문서에서 toc:true 라는 옵션을 사용하여 만든 목차에서 링크를 제대로 찾지 못하는 현상이 나타난다. 따라서 제목과 아이디 부여하는 습관 갖도록 하자.
블록 인용
> This is a block quote. This
> paragraph has two lines.
>
> 1. This is a list inside a block quote.
> 2. Second item.
This is a block quote. This paragraph has two lines.
- This is a list inside a block quote.
- Second item.
있는 그대로 (Verbatim)
띄어쓰기(space) 4번
[code]
library(ggplot2)
ggplot(diamonds, aes(carat,price))+geom_point()
(경계사용코드)
~~~
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())
~~~
[result]
library(ggplot2)
ggplot(diamonds, aes(carat,price))+geom_point()
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())
행 블록(Line blocks)
일부러 텍스트의 구조를 바꿔 표현할 때.
수직 바 또는 파이프 기호 | 와 공백(space)하나로 시작하는 행으로 구성된 블록 사용.
[code]
| The limerick packs laughs anatomical
| In space that is quite economical.
| But the good ones I've seen
| So seldom are clean
| And the clean ones so seldom are comical
| 200 Main St.
| Berkeley, CA 94718
[result]
The limerick packs laughs anatomical
In space that is quite economical.
But the good ones I’ve seen
So seldom are clean
And the clean ones so seldom are comical
200 Main St.
Berkeley, CA 94718
목록
팬독에는 목록을 위한 문법이 풍부하다
구분점 목록(Bullet List)
[code] +,*,- 중 하나로 사용 가능
- 하나
- 둘
- 셋
+ 하나
+ 둘
+ 셋
* 하나
* 둘
* 셋
[result]
[code]
*The bullets need not be flush with the left margin; they may be
indented one, two, or three spaces. The bullet must be followed by
whitespace.
[result]
- The bullets need not be flush with the left margin; they may be indented one, two, or three spaces. The bullet must be followed by whitespace.
4-스페이스 규칙
[code]
* 첫 번째 단락
첫 번째 단락에 포함된 서브 단락으로 공백 4개를 사용
* 두 번째 단락인데, 이 단락이 코드 블록을 포함하고 있을 때는 8개의 공백으로 표시
library(ggolot2)
ggplot(diamonds, aes(carat, price))+geom_point()
[result]
첫 번째 단락
첫 번째 단락에 포함된 서브 단락으로 공백 4개를 사용
두 번째 단락인데, 이 단락이 코드 블록을 포함하고 있을 때는 8개의 공백으로 표시
library(ggolot2)
ggplot(diamonds, aes(carat, price))+geom_point()
[code]
* fruits
+ apples
- macintosh
- red delicious
+ pears
+ peaches
* vegetables
+ broccoli
+ chard
[result]
순서 있는 목록(Ordered List)
숫자를 쓰고, 마침표를 쓰고, 하나의 공백을 주고 나서 내용을 입력한다. 이때 숫자는 의미가 없고 그냥 순서가 자동으로 정해진다.
[code]
1. one
2. two
3. three
5. one
7. two
1. three
[result]
- one
- two
- three
- one
- two
- three
로마 숫자로 구분점 만드는 것도 가능
[code]
(I) one
(I) two
(I) three
[result]
- one
- two
- three
알파벳으로구분점 만드는 것도 가능
[code]
A) one
A) two
A) three
[result]
- one
- two
- three
시작하는 번호
팬독은 목록에서 구분점과 시작번호를 주목함.
같은 구분점을 가지는 항목들은 하나의 목록으로 취급
[code]
9) Ninth
10) Tenth
11) Eleventh
i. subone
ii. subtwo
iii. subthree
[result]
- Ninth
- Tenth
- Eleventh
- subone
- subtwo
- subthree
정의 목록(Definition List)
정의 목록은 용어의 정의 등을 입력할 때 쓰인다.
Term 1
: Definition of term1
Term 2 with *inline markup*
: about definition of term2
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())
Third paragraph of definition 2.)
- Term 1
Definition of term1
- Term 2 with inline markup
about definition of term2
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())
Third paragraph of definition 2.)
수평선
+,-,_ 기호 3개 이상 ==> 수평선
***
---
___
표
팬독이 제공하는 표 문법은
총 4가지. 처리하기 까다로움. 자세히는 설명하지 않는다.
CJK(중국, 일본, 한국)언어는 더블-바이트 언어라 문자의 폭에 문제가 생긴다. D2Coding과 같은 한글 고정폭 폰트 사용하면 조금은 해결가능. but, 부족한 경우 많음
백슬래시 이스케이프
\*\*있는 그대로\*\*
**있는 그대로**
**있는 그대로**
있는 그대로
인라인 포매팅
강조: _ 기호나 *
*약한 강조*, **강한 강조**
약한 강조, 강한 강조
텍스트 삭제 표시
이것은 ~~삭제된 단어~~입니다.
이것은 삭제된 단어입니다.
윗첨자, 아랫첨자
^기호와 ~기호를 사용하면 된다. 첨자로 들어간 부분에 띄어쓰기가 있다면 백슬레시(\)쓰고 한 칸을 띄어 주고 사용.
이것은 연습^위의 첨자^이고, 또 이것은 연습~아래의 첨자~이다.
이것은 연습^위의 첨자^이고, 또 이것은 연습~아래의 첨자~이다.
이것은 연습^위의\ 첨자^이고, 또 이것은 연습~아래의\ 첨자~이다.
이것은 연습위의 첨자이고, 또 이것은 연습아래의 첨자이다.
수식
rmarkdown은 HTML 문서를 랜더링할 때 MathJax 사용.
인라인 수식의 경우 $감싸고, 블록 수식인 경우 $$감싼다. 그 안에는 레이텍에서 사용하는 수식 쓰면 된다.
ex1.
비율은 $y = \frac{a}{a+b}$ 로 표시한다.
비율은 \(y = \frac{a}{a+b}\) 로 표시한다.
ex2.
$$\begin{array}{ccc}
x_{11} & x_{12} & x_{13}\\
x_{21} & x_{22} & x_{23}
\end{array}$$
\[\begin{array}{ccc}
x_{11} & x_{12} & x_{13}\\
x_{21} & x_{22} & x_{23}
\end{array}\]
Link
인라인 링크
인라인 링크는 [링크 설명 텍스트], (링크의 URL) 문법 사용. 인라인 링크에서 메일을 보내고자 할 때는 mailto: 를 입력하면 된다.
[sunny site](http://smiling-sun.tistory.com/)에 놀러오세요.
[이곳으로](mailto:sunsmiling@naver.com)으로 메일을 보내세요
sunny site에 놀러오세요.
이곳으로으로 메일을 보내세요
레퍼런스 링크
프로그래밍에서 변수처럼, 자주 사용하는 웹 주소등을 저장해놓고 쓰는 방법. 아무데서나 사용 가능(안보임).
[변수명], 콜론(:), space, URL
[구글]: http://www.google.co.kr
[팬독 사이트]: http://pandoc.org/index.html
[구글]에서 검색해보면 ...
구글에서 검색해보면 …
문서 내부 링크
앞서 헤더에 아이디 주는 방법:
[서론] (#AboutMarkdown)
문서에 내부 링크 주는 방법:
[링크인덱스](./html문서#ID)
A 문서의 저자의견을 보면
그림 삽입
pdf에서는 제대로 랜더링 되지만, html, docs에서는 제대로 랜더링 되지 않으므로 knir패키지의 include_graphics() 함수와 크기, 위치 조정하는 청크 옵션 사용할 것을 권자

.Rmd파일에서 참고 문헌과 인용 표시
- 다양한 포멧과 확장자 존재
- 팬독에서는 오픈소스참고문헌 관리 데이터베이스 포멧을 지원
Rmd 파일에 참고문헌 DB를 추가할 때는 YAML 헤더의 bibiography라는 필드에 DB 파일명으로 항목을 지정
/—
title: 알마크다운에 대하여
author: SBKo
bibliography: example.bibtex
output:
html_document:
toc: true
/—
알마크다운 패지[@allaire2014]에 따르면
스타일 지정하기 학술지마다의 정해진 스타일.(팬독의 default: ‘저자-연도’)
스타일을 바꾸기 위해서는 스타일 정의 시트 파일(.csl)을 다운받아, YAML 해더에서 csl 필드를 사용하면 된다.
주석 달기
Here is a footnote reference,[^1] and another.[^longnote]
[^1]: Here is the footnote.
[^longnote]: Here's one with multiple blocks.
Subsequent paragraphs are indented to show that they
belong to the previous footnote.
{ some.code }
The whole paragraph can be indented, or just the first
line. In this way, multi-paragraph footnotes work like
multi-paragraph list items.
This paragraph won't be part of the note, because it
isn't indented.
Here is a footnote reference, and another.
This paragraph won’t be part of the note, because it isn’t indented.
LS0tDQp0aXRsZTogIjQg7Yys64+FIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KbWFpbmZvbnQ6IEQyQ29kaW5nDQotLS0NCuuniO2BrOuLpOyatCDthY3siqTtirjsl5Ag64yA7ZW0IOyEpOuqhe2VnOuLpC4gUlN0dWRpb+yXkOuKlCDtjKzrj4Ug67CU7J2064SI66as6rCAIOuTpOyWtOyeiOqzoCwg66y47IScIOuzgO2ZmOq4sOuhnOyEnOydmCDquLDriqXsnYAg64yA67aA67aE7J2AIFJtYXJrZG93bu2MqO2CpOyngOyXkCDrhbnslYTsnojri6QuDQoNCiMj7Yys64+FIOuniO2BrOuLpOyatCDrrLjrspUNClLsl5DshJzripQgcm1hcmtkb3duIO2MqO2CpOyngOyXkCDsnZjtlbQg7KCc6rO165CY64qUIFJtYXJrZG93buydhCDsgqzsmqntlZzri6QuIHJtYXJrZG93buydgCBwYW5kb2Prp4jtgazri6TsmrTsnYQg64K067aA7KCB7Jy866GcIOyCrOyaqe2VmOqzoCwg7Yys64+F7JeQIOuMgO2VnCDrnpjtjbwg7Jet7ZWZ7J2EIO2VnOuLpC4NCg0KIyMgWUFNTCDtl6TrjZQNCg0KICAgIC0tLQ0KICAgIHRpdGxlOiAiVW50aXRsZWQiDQogICAgYXV0aG9yOiAic3VubnkiDQogICAgb3V0cHV0OiBodG1sX2RvY3VtZW50DQogICAgLS0tDQrslZ7rkqQgLS0tIOuKlCDri6Trpbgg7YWN7Iqk7Yq47JmAIOq1rOuzhOuQmOuKlCDqsr3qs4RcDQrqt7gg7JWI7JeQIO2VhOyalO2VnCDrgrTsmqnsnYQgW+2CpDrqsJJd7IyN7Jy866GcIOq4sOyerFwNCllBTUwgaGVhZGVyIOuKlCDrrLjshJzsnZgg66mU7YOAIOygleuztOulvCDsnoXroKXtlZjripQg6rOzXA0KDQoNCiMj64uo6529DQoNCg0KICAgIFtjb2RlXQ0KICAgIOuLqOudveydgCDtirnrs4TtlZwg7ZGc7IucIOyXhuydtCDqt7jrjIDroZwg7J6F66ClDQogICAgDQogICAg64uo65297J2YIOq1rOu2hOydgCDtlZjrgpgg7J207IOB7J2YIOu5iCDspITroZwNCiAgICANCiAgICDqt7jrg6Ug7JeU7YSw66eMIO2VnOykhOyzkOyEnCDsnpHshLHtlZzri6TrqbQNCiAgICDsnbTripQg6re464OlIO2VnCDri6jrnb3snLzroZwg6rCE7KO8DQogICAgDQogICAg7KSE7J2EIOqwleygnOuhnCDrsJTqvrjquLAg7JyE7ZW07ISc64qUICANCiAgICDsiqTtjpjsnbTsiqTrpbwg65GQIOuyiCDriITrpbTqs6Ag7JeU7YSw66W8IO2VmOqxsOuCmA0KICAgIA0KICAgIOykhOydhCDqsJXsoJzroZwg67CU6r646riwIOychO2VtOyEnOuKlCDrgZ3sl5BcDQogICAg67Kh7Iqs656Y7Iuc66W8IOyeheugpe2VmOqzoCDsl5TthLDtgqQg64iE66W06riwDQoNCg0KW3Jlc3VsdF1cDQrri6jrnb3snYAg7Yq567OE7ZWcIO2RnOyLnCDsl4bsnbQg6re464yA66GcIOyeheugpQ0KDQrri6jrnb3snZgg6rWs67aE7J2AIO2VmOuCmCDsnbTsg4HsnZgg67mIIOykhOuhnA0KDQrqt7jrg6Ug7JeU7YSw66eMIO2VnOykhOyzkOyEnCDsnpHshLHtlZzri6TrqbQNCuydtOuKlCDqt7jrg6Ug7ZWcIOuLqOudveycvOuhnCDqsITso7wNCg0K7KSE7J2EIOqwleygnOuhnCDrsJTqvrjquLAg7JyE7ZW07ISc64qUICANCuyKpO2OmOydtOyKpOulvCDrkZAg67KIIOuIhOultOqzoCDsl5TthLDrpbwg7ZWY6rGw64KYDQoNCuykhOydhCDqsJXsoJzroZwg67CU6r646riwIOychO2VtOyEnOuKlCDrgZ3sl5BcDQrrsqHsiqzrnpjsi5zrpbwg7J6F66Cl7ZWY6rOgIOyXlO2EsO2CpCDriITrpbTquLAgDQoNCg0KIyPsoJzrqqkNCg0KICAgIFtjb2RlXQ0KICAgICMgSGVhZGVyMQ0KICAgIA0KICAgICMjIEhlYWRlcjINCiAgICANCiAgICAjIyMgSGVhZGVyMw0KICAgIA0KICAgICjtl6TrjZQg7JWe7JeQ64qUIOyggeyWtOuPhCDruYgg7KSEIO2VmOuCmOqwgCDtlYTsmpQpDQogICAgDQogICAg64KY64qUIOuyoOyKpO2CqOudvOu5iOyKpCDslYTsnbTsiqTtgazrprwg7KSRDQogICAgIzIy67KI6rO8ICM167KI7J2EIOyii+yVhO2VnOuLpC4NCiAgICANCiAgICDrgpjripQg67Kg7Iqk7YKo652867mI7IqkIOyVhOydtOyKpO2BrOumvCDspJENCiAgICANCiAgICAjMjLrsojqs7wgIzXrsojsnYQg7KKL7JWE7ZWc64ukLg0KDQpbcmVzdWx0XQ0KDQojIEhlYWRlcjENCg0KIyMgSGVhZGVyMg0KDQojIyMgSGVhZGVyMw0KDQrtl6TrjZTripQg7ZaJ7J2YIOyLnOyekeyXkCAg7JisIOyImCDsnojri6QuIA0KDQrrgpjripQg67Kg7Iqk7YKo652867mI7IqkIOyVhOydtOyKpO2BrOumvCDspJENCiMyMuuyiOqzvCAjNeuyiOydhCDsoovslYTtlZzri6QuIA0KDQrrgpjripQg67Kg7Iqk7YKs652867mI7IqkIOyVhOydtOyKpO2BrOumvOykkQ0KIA0KIzIy67KI6rO8ICM167KI7J2EIOyii+yVhO2VnOuLpC4NCiANCiANCiANCiMj7KCc66qp7J2YIOyVhOydtOuUlOyZgCDtgbTrnpjsiqQNCu2MrOuPheydgCDsoJzrqqkg67aA67aE7JeQIEhUTUzsnZggY2xhc3MsIGlkIOyGjeyEseuTpOydhCDsoJXtlaAg7IiYIOyeiOuKlCDrrLjrspUg7KCc6rO1DQoNCnt97JWI7JeQICPsnYAg7JWE7J2065SULCAiLCLroZwg7Iuc7J6R7ZWY64qUIOqyg+ydgCDtgbTrnpjsiqQNCg0KDQogICAgIyMg7Yys64+FIOyCrOyaqeuylSB7I1VzaW5nUGFuZG9jIC51bm51bWJlcmVkfQ0KDQpVc2luZ1BhbmRvY+ydgCDslYTsnbTrlJQsIHVubnVtYmVyZWTripQg7YG0656Y7IqkDQoNCu2VnOq4gCDsoJzrqqnsnYQg7IKs7Jqp7ZWY64qUIOqyveyasOyXkOuKlCAq7JiB66y47Jy866GcIOyVhOydtOuUlCrrpbwg7KeA7KCV7ZW07KSY7JW8IO2VqCENCg0K7ZWc6riAIOygnOuqqeunjCDsgqzsmqnqsr3smrAsIOyekOuPmeycvOuhnCDsg53shLHrkJjripQg64K067aAIOunge2BrOqwgCDsoJzrjIDroZwg7J6R64+Z7ZWY7KeAIOyViuydhCDqsIDriqXshLHsnbQg64aS7J2MLiDsnbTrpbwg7Ja06riw66m0IEhUTUwg66y47ISc7JeQ7IScIHRvYzp0cnVlIOudvOuKlCDsmLXshZjsnYQg7IKs7Jqp7ZWY7JesIOunjOuToCDrqqnssKjsl5DshJwg66eB7YGs66W8IOygnOuMgOuhnCDssL7sp4Ag66q77ZWY64qUIO2YhOyDgeydtCDrgpjtg4Drgpzri6QuIOuUsOudvOyEnCDsoJzrqqnqs7wg7JWE7J2065SUIOu2gOyXrO2VmOuKlCDsirXqtIAg6rCW64+E66GdIO2VmOyekC4NCg0KIyMg67iU66GdIOyduOyaqQ0KYGBge3J9DQo+IFRoaXMgaXMgYSBibG9jayBxdW90ZS4gVGhpcw0KPiBwYXJhZ3JhcGggaGFzIHR3byBsaW5lcy4NCj4NCj4gMS4gVGhpcyBpcyBhIGxpc3QgaW5zaWRlIGEgYmxvY2sgcXVvdGUuDQo+IDIuIFNlY29uZCBpdGVtLg0KYGBgDQoNCj4gVGhpcyBpcyBhIGJsb2NrIHF1b3RlLiBUaGlzDQo+IHBhcmFncmFwaCBoYXMgdHdvIGxpbmVzLg0KPg0KPiAxLiBUaGlzIGlzIGEgbGlzdCBpbnNpZGUgYSBibG9jayBxdW90ZS4NCj4gMi4gU2Vjb25kIGl0ZW0uDQoNCg0KIyMg7J6I64qUIOq3uOuMgOuhnCAoVmVyYmF0aW0pDQrrnYTslrTsk7DquLAoc3BhY2UpIDTrsogNCmBgYHtyfQ0KW2NvZGVdDQogICAgbGlicmFyeShnZ3Bsb3QyKQ0KICAgIGdncGxvdChkaWFtb25kcywgYWVzKGNhcmF0LHByaWNlKSkrZ2VvbV9wb2ludCgpDQoNCijqsr3qs4TsgqzsmqnsvZTrk5wpDQp+fn4NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChkaWFtb25kcywgYWVzKGNhcmF0LHByaWNlKStnZW9tX3BvaW50KCkpDQp+fn4NCmBgYA0KW3Jlc3VsdF0NCg0KICAgIGxpYnJhcnkoZ2dwbG90MikNCiAgICBnZ3Bsb3QoZGlhbW9uZHMsIGFlcyhjYXJhdCxwcmljZSkpK2dlb21fcG9pbnQoKQ0KDQoNCn5+fg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRpYW1vbmRzLCBhZXMoY2FyYXQscHJpY2UpK2dlb21fcG9pbnQoKSkNCn5+fg0KDQp+fn5+IHsjbXljb2RlIC5yIC5udW1iZXJMaW5lcyBzdGFydEZyb209IjEifQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRpYW1vbmRzLCBhZXMoY2FyYXQscHJpY2UpK2dlb21fcG9pbnQoKSkNCn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQoNCiMjIO2WiSDruJTroZ0oTGluZSBibG9ja3MpDQrsnbzrtoDrn6wg7YWN7Iqk7Yq47J2YIOq1rOyhsOulvCDrsJTqv5Qg7ZGc7ZiE7ZWgIOuVjC4gDQoNCuyImOyngSDrsJQg65iQ64qUIO2MjOydtO2UhCDquLDtmLggfCDsmYAg6rO167CxKHNwYWNlKe2VmOuCmOuhnCDsi5zsnpHtlZjripQg7ZaJ7Jy866GcIOq1rOyEseuQnCDruJTroZ0g7IKs7JqpLg0KDQpbY29kZV0NCg0KICAgIHwgVGhlIGxpbWVyaWNrIHBhY2tzIGxhdWdocyBhbmF0b21pY2FsDQogICAgfCBJbiBzcGFjZSB0aGF0IGlzIHF1aXRlIGVjb25vbWljYWwuDQogICAgfCAgICBCdXQgdGhlIGdvb2Qgb25lcyBJJ3ZlIHNlZW4NCiAgICB8ICAgIFNvIHNlbGRvbSBhcmUgY2xlYW4NCiAgICB8IEFuZCB0aGUgY2xlYW4gb25lcyBzbyBzZWxkb20gYXJlIGNvbWljYWwNCg0KICAgIHwgMjAwIE1haW4gU3QuDQogICAgfCBCZXJrZWxleSwgQ0EgOTQ3MTgNCg0KW3Jlc3VsdF0NCg0KfCBUaGUgbGltZXJpY2sgcGFja3MgbGF1Z2hzIGFuYXRvbWljYWwNCnwgSW4gc3BhY2UgdGhhdCBpcyBxdWl0ZSBlY29ub21pY2FsLg0KfCAgICBCdXQgdGhlIGdvb2Qgb25lcyBJJ3ZlIHNlZW4NCnwgICAgU28gc2VsZG9tIGFyZSBjbGVhbg0KfCBBbmQgdGhlIGNsZWFuIG9uZXMgc28gc2VsZG9tIGFyZSBjb21pY2FsDQoNCnwgMjAwIE1haW4gU3QuDQp8IEJlcmtlbGV5LCBDQSA5NDcxOA0KDQojIyDrqqnroZ0gDQog7Yys64+F7JeQ64qUIOuqqeuhneydhCDsnITtlZwg66y467KV7J20IO2Sjeu2gO2VmOuLpA0KIA0KIyMjIOq1rOu2hOygkCDrqqnroZ0oQnVsbGV0IExpc3QpDQoNCiAgICBbY29kZV0gKywqLC0g7KSRIO2VmOuCmOuhnCDsgqzsmqkg6rCA64qlDQogICAgLSDtlZjrgpgNCiAgICAtIOuRmA0KICAgIC0g7IWLDQogICAgDQogICAgKyDtlZjrgpgNCiAgICArIOuRmA0KICAgICsg7IWLDQogICAgDQogICAgKiDtlZjrgpgNCiAgICAqIOuRmA0KICAgICog7IWLDQogICAgDQpbcmVzdWx0XQ0KDQotIO2VmOuCmA0KLSDrkZgNCi0g7IWLDQogICAgDQorIO2VmOuCmA0KKyDrkZgNCisg7IWLDQogICAgDQoqIO2VmOuCmA0KKiDrkZgNCiog7IWLDQoNCmBgYHtyfQ0KW2NvZGVdDQoqVGhlIGJ1bGxldHMgbmVlZCBub3QgYmUgZmx1c2ggd2l0aCB0aGUgbGVmdCBtYXJnaW47IHRoZXkgbWF5IGJlDQppbmRlbnRlZCBvbmUsIHR3bywgb3IgdGhyZWUgc3BhY2VzLiBUaGUgYnVsbGV0IG11c3QgYmUgZm9sbG93ZWQgYnkNCndoaXRlc3BhY2UuDQpgYGANCiAgICANCltyZXN1bHRdDQoNCiogVGhlIGJ1bGxldHMgbmVlZCBub3QgYmUgZmx1c2ggd2l0aCB0aGUgbGVmdCBtYXJnaW47IHRoZXkgbWF5IGJlIGluZGVudGVkIG9uZSwgdHdvLCBvciB0aHJlZSBzcGFjZXMuIFRoZSBidWxsZXQgbXVzdCBiZSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLg0KDQoNCg0KDQojIyMgNC3siqTtjpjsnbTsiqQg6rec7LmZDQoNCmBgYHtyfQ0KW2NvZGVdDQoqIOyyqyDrsojsp7gg64uo6529DQogICAg7LKrIOuyiOynuCDri6jrnb3sl5Ag7Y+s7ZWo65CcIOyEnOu4jCDri6jrnb3snLzroZwg6rO167CxIDTqsJzrpbwg7IKs7JqpDQoNCiog65GQIOuyiOynuCDri6jrnb3snbjrjbAsIOydtCDri6jrnb3snbQg7L2U65OcIOu4lOuhneydhCDtj6ztlajtlZjqs6Ag7J6I7J2EIOuVjOuKlCA46rCc7J2YIOqzteuwseycvOuhnCDtkZzsi5wNCiAgICAgICAgbGlicmFyeShnZ29sb3QyKQ0KICAgICAgICBnZ3Bsb3QoZGlhbW9uZHMsIGFlcyhjYXJhdCwgcHJpY2UpKStnZW9tX3BvaW50KCkNCmBgYA0KW3Jlc3VsdF0NCg0KKiDssqsg67KI7Ke4IOuLqOudvQ0KDQogICAg7LKrIOuyiOynuCDri6jrnb3sl5Ag7Y+s7ZWo65CcIOyEnOu4jCDri6jrnb3snLzroZwg6rO167CxIDTqsJzrpbwg7IKs7JqpDQoNCiog65GQIOuyiOynuCDri6jrnb3snbjrjbAsIOydtCDri6jrnb3snbQg7L2U65OcIOu4lOuhneydhCDtj6ztlajtlZjqs6Ag7J6I7J2EIOuVjOuKlCA46rCc7J2YIOqzteuwseycvOuhnCDtkZzsi5wNCg0KICAgICAgICBsaWJyYXJ5KGdnb2xvdDIpDQogICAgICAgIGdncGxvdChkaWFtb25kcywgYWVzKGNhcmF0LCBwcmljZSkpK2dlb21fcG9pbnQoKQ0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KYGBge3J9DQpbY29kZV0NCiogZnJ1aXRzDQogICAgKyBhcHBsZXMNCiAgICAgICAgLSBtYWNpbnRvc2gNCiAgICAgICAgLSByZWQgZGVsaWNpb3VzDQogICAgKyBwZWFycw0KICAgICsgcGVhY2hlcw0KKiB2ZWdldGFibGVzDQogICAgKyBicm9jY29saQ0KICAgICsgY2hhcmQNCmBgYA0KDQpbcmVzdWx0XQ0KDQoqIGZydWl0cw0KICAgICsgYXBwbGVzDQogICAgICAgIC0gbWFjaW50b3NoDQogICAgICAgIC0gcmVkIGRlbGljaW91cw0KICAgICsgcGVhcnMNCiAgICArIHBlYWNoZXMNCiogdmVnZXRhYmxlcw0KICAgICsgYnJvY2NvbGkNCiAgICArIGNoYXJkDQogICAgDQogICAgDQogICAgDQojIyMg7Iic7IScIOyeiOuKlCDrqqnroZ0oT3JkZXJlZCBMaXN0KQ0K7Iir7J6Q66W8IOyTsOqzoCwg66eI7Lmo7ZGc66W8IOyTsOqzoCwg7ZWY64KY7J2YIOqzteuwseydhCDso7zqs6Ag64KY7IScIOuCtOyaqeydhCDsnoXroKXtlZzri6QuIOydtOuVjCDsiKvsnpDripQg7J2Y66+46rCAIOyXhuqzoCDqt7jrg6Ug7Iic7ISc6rCAIOyekOuPmeycvOuhnCDsoJXtlbTsp4Tri6QuDQoNCiAgICBbY29kZV0NCiAgICAxLiAgb25lDQogICAgMi4gIHR3bw0KICAgIDMuICB0aHJlZQ0KICAgIDUuICBvbmUNCiAgICA3LiAgdHdvDQogICAgMS4gIHRocmVlDQogICAgDQpbcmVzdWx0XQ0KDQoxLiAgb25lDQoyLiAgdHdvDQozLiAgdGhyZWUNCjUuICBvbmUNCjcuICB0d28NCjEuICB0aHJlZQ0KDQoNCuuhnOuniCDsiKvsnpDroZwg6rWs67aE7KCQIOunjOuTnOuKlCDqsoPrj4Qg6rCA64qlDQoNCiAgICBbY29kZV0NCiAgICAoSSkgIG9uZQ0KICAgIChJKSAgdHdvDQogICAgKEkpICB0aHJlZQ0KDQpbcmVzdWx0XQ0KDQooSSkgIG9uZQ0KKEkpICB0d28NCihJKSB0aHJlZQ0KDQrslYztjIzrsrPsnLzroZzqtazrtoTsoJAg66eM65Oc64qUIOqyg+uPhCDqsIDriqUNCg0KDQogICAgW2NvZGVdDQogICAgQSkgIG9uZQ0KICAgIEEpICB0d28NCiAgICBBKSAgdGhyZWUNCiAgICANCg0KW3Jlc3VsdF0NCg0KQSkgIG9uZQ0KQSkgIHR3bw0KQSkgdGhyZWUNCg0KDQojIyMj7Iuc7J6R7ZWY64qUIOuyiO2YuA0K7Yys64+F7J2AIOuqqeuhneyXkOyEnCDqtazrtoTsoJDqs7wg7Iuc7J6R67KI7Zi466W8IOyjvOuqqe2VqC4NCg0K6rCZ7J2AIOq1rOu2hOygkOydhCDqsIDsp4DripQg7ZWt66qp65Ok7J2AIO2VmOuCmOydmCDrqqnroZ3snLzroZwg7Leo6riJDQoNCg0KICAgIFtjb2RlXQ0KICAgICA5KSAgTmludGgNCiAgICAxMCkgIFRlbnRoDQogICAgMTEpICBFbGV2ZW50aA0KICAgICAgICAgICBpLiBzdWJvbmUNCiAgICAgICAgICBpaS4gc3VidHdvDQogICAgICAgICBpaWkuIHN1YnRocmVlDQogICAgDQoNCltyZXN1bHRdDQoNCiA5KSAgTmludGgNCjEwKSAgVGVudGgNCjExKSAgRWxldmVudGgNCiAgICAgICBpLiBzdWJvbmUNCiAgICAgIGlpLiBzdWJ0d28NCiAgICAgaWlpLiBzdWJ0aHJlZQ0KICAgICANCiAgICAgDQogICAgIA0KIyMg7KCV7J2YIOuqqeuhnShEZWZpbml0aW9uIExpc3QpDQrsoJXsnZgg66qp66Gd7J2AIOyaqeyWtOydmCDsoJXsnZgg65Ox7J2EIOyeheugpe2VoCDrlYwg7JOw7J2464ukLg0KDQogICAgVGVybSAxDQogICAgDQogICAgOiAgIERlZmluaXRpb24gb2YgdGVybTENCiAgICANCiAgICBUZXJtIDIgd2l0aCAqaW5saW5lIG1hcmt1cCoNCiAgICANCiAgICA6ICAgYWJvdXQgZGVmaW5pdGlvbiBvZiB0ZXJtMg0KICAgIA0KICAgICAgICAgICAgbGlicmFyeShnZ3Bsb3QyKQ0KICAgICAgICAgICAgZ2dwbG90KGRpYW1vbmRzLCBhZXMoY2FyYXQscHJpY2UpK2dlb21fcG9pbnQoKSkNCiAgICAgICAgICAgIA0KICAgICAgICBUaGlyZCBwYXJhZ3JhcGggb2YgZGVmaW5pdGlvbiAyLikNCg0KDQpUZXJtIDENCg0KOiAgIERlZmluaXRpb24gb2YgdGVybTENCg0KVGVybSAyIHdpdGggKmlubGluZSBtYXJrdXAqDQoNCjogICBhYm91dCBkZWZpbml0aW9uIG9mIHRlcm0yDQoNCiAgICAgICAgbGlicmFyeShnZ3Bsb3QyKQ0KICAgICAgICBnZ3Bsb3QoZGlhbW9uZHMsIGFlcyhjYXJhdCxwcmljZSkrZ2VvbV9wb2ludCgpKQ0KICAgICAgICANCg0KICAgIFRoaXJkIHBhcmFncmFwaCBvZiBkZWZpbml0aW9uIDIuKQ0KDQogICAgIA0KIyMg7IiY7Y+J7ISgDQorLC0sXyDquLDtmLggM+qwnCDsnbTsg4EgPT0+IOyImO2PieyEoA0KDQogICAgKioqDQogICAgDQogICAgLS0tDQogICAgDQogICAgX19fDQogICAgDQogICAgDQoqKioNCg0KLS0tDQoNCl9fXw0KDQoNCg0KIyMg7ZGcDQrtjKzrj4XsnbQg7KCc6rO17ZWY64qUIO2RnCDrrLjrspXsnYANCg0KKiDsi6ztlIwNCiog66mA7Yuw65287J24DQoqIOq3uOumrOuTnA0KKiDtjIzsnbTtlIQNCg0K7LSdIDTqsIDsp4AuIOyymOumrO2VmOq4sCDquYzri6TroZzsm4AuIOyekOyEuO2eiOuKlCDshKTrqoXtlZjsp4Ag7JWK64qU64ukLg0KDQpDSkso7KSR6rWtLCDsnbzrs7gsIO2VnOq1rSnslrjslrTripQg642U67iULeuwlOydtO2KuCDslrjslrTrnbwg66y47J6Q7J2YIO2PreyXkCDrrLjsoJzqsIAg7IOd6ri064ukLg0KRDJDb2Rpbmfqs7wg6rCZ7J2AIO2VnOq4gCDqs6DsoJXtj60g7Y+w7Yq4IOyCrOyaqe2VmOuptCDsobDquIjsnYAg7ZW06rKw6rCA64qlLiBidXQsIOu2gOyhse2VnCDqsr3smrAg66eO7J2MIA0KDQojIyDrsLHsiqzrnpjsi5wg7J207Iqk7LyA7J207ZSEDQoNCiAgICBcKlwq7J6I64qUIOq3uOuMgOuhnFwqXCoNCiAgICANCiAgICAqKuyeiOuKlCDqt7jrjIDroZwqKg0KICAgIA0KXCpcKuyeiOuKlCDqt7jrjIDroZxcKlwqDQoNCioq7J6I64qUIOq3uOuMgOuhnCoqDQoNCiMjIOyduOudvOyduCDtj6zrp6TtjIUNCg0KIyMjICDqsJXsobA6IF8g6riw7Zi464KYICoNCg0KICAgICrslb3tlZwg6rCV7KGwKiwgKirqsJXtlZwg6rCV7KGwKioNCg0KKuyVve2VnCDqsJXsobAqLCAqKuqwle2VnCDqsJXsobAqKg0KDQojIyMg7YWN7Iqk7Yq4IOyCreygnCDtkZzsi5wNCg0KICAgIOydtOqyg+ydgCB+fuyCreygnOuQnCDri6jslrR+fuyeheuLiOuLpC4NCg0K7J206rKD7J2AIH5+7IKt7KCc65CcIOuLqOyWtH5+7J6F64uI64ukLg0KDQojIyMg7JyX7LKo7J6QLCDslYTrnqvssqjsnpANClxe6riw7Zi47JmAIFx+6riw7Zi466W8IOyCrOyaqe2VmOuptCDrkJzri6QuIOyyqOyekOuhnCDrk6TslrTqsIQg67aA67aE7JeQIOudhOyWtOyTsOq4sOqwgCDsnojri6TrqbQg67Cx7Iqs66CI7IucXChcXClc66W8IOyTsOqzoCDtlZwg7Lm47J2EIOudhOyWtCDso7zqs6Ag7IKs7JqpLg0KDQogICAg7J206rKD7J2AIOyXsOyKtV7snITsnZgg7LKo7J6QXuydtOqzoCwg65iQIOydtOqyg+ydgCDsl7DsirV+7JWE656Y7J2YIOyyqOyekH7snbTri6QuDQogICAgDQrsnbTqsoPsnYAg7Jew7Iq1XuychOydmCDssqjsnpBe7J206rOgLCDrmJAg7J206rKD7J2AIOyXsOyKtX7slYTrnpjsnZgg7LKo7J6QfuydtOuLpC4NCg0KICAgIOydtOqyg+ydgCDsl7DsirVe7JyE7J2YXCDssqjsnpBe7J206rOgLCDrmJAg7J206rKD7J2AIOyXsOyKtX7slYTrnpjsnZhcIOyyqOyekH7snbTri6QuDQogICAgDQrsnbTqsoPsnYAg7Jew7Iq1XuychOydmFwg7LKo7J6QXuydtOqzoCwg65iQIOydtOqyg+ydgCDsl7DsirV+7JWE656Y7J2YXCDssqjsnpB+7J2064ukLg0KDQoNCiMjIyDsiJjsi50NCnJtYXJrZG93buydgCBIVE1MIOusuOyEnOulvCDrnpzrjZTrp4HtlaAg65WMIE1hdGhKYXgg7IKs7JqpLg0KDQrsnbjrnbzsnbgg7IiY7Iud7J2YIOqyveyasCBcJFzroZwg6rCQ7Iu46rOgLCDruJTroZ0g7IiY7Iud7J24IOqyveyasCBcJCRc66GcIOqwkOyLvOuLpC4gXCAgDQrqt7gg7JWI7JeQ64qUIOugiOydtO2FjeyXkOyEnCDsgqzsmqntlZjripQg7IiY7IudIOyTsOuptCDrkJzri6QuDQoNCiAgICBleDEuDQogICAg67mE7Jyo7J2AICR5ID0gXGZyYWN7YX17YStifSQg66GcIO2RnOyLnO2VnOuLpC4NCg0KIOu5hOycqOydgCAkeSA9IFxmcmFje2F9e2ErYn0kIOuhnCDtkZzsi5ztlZzri6QuDQoNCiAgICBleDIuDQogICAgJCRcYmVnaW57YXJyYXl9e2NjY30NCiAgICB4X3sxMX0gJiB4X3sxMn0gJiB4X3sxM31cXA0KICAgIHhfezIxfSAmIHhfezIyfSAmIHhfezIzfQ0KICAgIFxlbmR7YXJyYXl9JCQNCiAgICANCiQkXGJlZ2lue2FycmF5fXtjY2N9DQp4X3sxMX0gJiB4X3sxMn0gJiB4X3sxM31cXA0KeF97MjF9ICYgeF97MjJ9ICYgeF97MjN9DQpcZW5ke2FycmF5fSQkDQoNCg0KIyMgTGluaw0KDQojIyMg7J6Q64+ZIOunge2BrA0KVXJsIOydtOuCmCDsnbTrqZTsnbwg7KO87IaMIOuTseydhCBcPD5cIOyViOyXkCDrhKPsnLzrqbQg66eB7YGs66GcIOuenOuNlOungSDrkJzri6QuDQoNCiAgICA8aHR0cDovL25hdmVyLmNvbT4NCiAgICANCiAgICA8c3Vuc21pbGluZ0BuYXZlci5jb20+DQoNCjxodHRwOi8vbmF2ZXIuY29tPg0KDQo8c3Vuc21pbGluZ0BuYXZlci5jb20+DQoNCg0KIyMjIOyduOudvOyduCDrp4HtgawNCuyduOudvOyduCDrp4HtgazripQgW+unge2BrCDshKTrqoUg7YWN7Iqk7Yq4XSwgKOunge2BrOydmCBVUkwpIOusuOuylSDsgqzsmqkuDQrsnbjrnbzsnbgg66eB7YGs7JeQ7IScIOuplOydvOydhCDrs7TrgrTqs6DsnpAg7ZWgIOuVjOuKlCBtYWlsdG86IOulvCDsnoXroKXtlZjrqbQg65Cc64ukLg0KDQogICAgW3N1bm55IHNpdGVdKGh0dHA6Ly9zbWlsaW5nLXN1bi50aXN0b3J5LmNvbS8p7JeQIOuGgOufrOyYpOyEuOyalC4NCiAgICANCiAgICBb7J206rOz7Jy866GcXShtYWlsdG86c3Vuc21pbGluZ0BuYXZlci5jb20p7Jy866GcIOuplOydvOydhCDrs7TrgrTshLjsmpQNCg0KW3N1bm55IHNpdGVdKGh0dHA6Ly9zbWlsaW5nLXN1bi50aXN0b3J5LmNvbS8p7JeQIOuGgOufrOyYpOyEuOyalC4NCg0KW+ydtOqzs+ycvOuhnF0obWFpbHRvOnN1bnNtaWxpbmdAbmF2ZXIuY29tKeycvOuhnCDrqZTsnbzsnYQg67O064K07IS47JqUDQoNCg0KDQojIyMg66CI7Y2865+w7IqkIOunge2BrA0K7ZSE66Gc6re4656Y67CN7JeQ7IScIOuzgOyImOyymOufvCwg7J6Q7KO8IOyCrOyaqe2VmOuKlCDsm7kg7KO87IaM65Ox7J2EIOyggOyepe2VtOuGk+qzoCDsk7DripQg67Cp67KVLiDslYTrrLTrjbDshJzrgpgg7IKs7JqpIOqwgOuKpSjslYjrs7TsnoQpLg0KDQpb67OA7IiY66qFXSwg7L2c66GgKDopLCBzcGFjZSwgVVJMDQoNCiAgICBb6rWs6riAXTogaHR0cDovL3d3dy5nb29nbGUuY28ua3INCg0KICAgIFvtjKzrj4Ug7IKs7J207Yq4XTogaHR0cDovL3BhbmRvYy5vcmcvaW5kZXguaHRtbA0KICAgIA0KICAgIFvqtazquIBd7JeQ7IScIOqygOyDie2VtOuztOuptCAuLi4NCg0KDQoNClvqtazquIBdOiBodHRwOi8vd3d3Lmdvb2dsZS5jby5rcg0KDQpb7Yys64+FIOyCrOydtO2KuF06IGh0dHA6Ly9wYW5kb2Mub3JnL2luZGV4Lmh0bWwNCg0KW+q1rOq4gF3sl5DshJwg6rKA7IOJ7ZW067O066m0IC4uLg0KDQoNCiMjIyDrrLjshJwg64K067aAIOunge2BrA0KDQrslZ7shJwg7Zek642U7JeQIOyVhOydtOuUlCDso7zripQg67Cp67KVOg0KDQogICAgW+yEnOuhoF0gKCNBYm91dE1hcmtkb3duKQ0KICAgIA0K66y47ISc7JeQIOuCtOu2gCDrp4Htgawg7KO864qUIOuwqeuylTogDQoNCiAgICBb66eB7YGs7J24642x7IqkXSguL2h0bWzrrLjshJwjSUQpDQogICAgDQpBIOusuOyEnOydmCBb7KCA7J6Q7J2Y6rKsXSguL0EuaHRtbCNvcGluaW9uKeydhCDrs7TrqbQNCg0KDQojIyMg6re466a8IOyCveyehQ0KcGRm7JeQ7ISc64qUIOygnOuMgOuhnCDrnpzrjZTrp4Eg65CY7KeA66eMLCBodG1sLCBkb2Nz7JeQ7ISc64qUIOygnOuMgOuhnCDrnpzrjZTrp4Eg65CY7KeAIOyViuycvOuvgOuhnCBrbmly7Yyo7YKk7KeA7J2YIGluY2x1ZGVfZ3JhcGhpY3MoKSDtlajsiJjsmYAg7YGs6riwLCDsnITsuZgg7KGw7KCV7ZWY64qUIOyyre2BrCDsmLXshZgg7IKs7Jqp7ZWgIOqyg+ydhCDqtozsnpANCg0KICAgICFb7J2066+47KeAXSh1cmwvdG8vdGhlL2ltYWdlLnBuZykNCg0KIVvsnbTrr7jsp4BdKGh0dHA6Ly93d3cuYWt0dWFsZS5tay93cC1jb250ZW50L3VwbG9hZHMvMjAxNi8wNi8xMzcxOTItMzAweDE5OS5qcGcpDQoNCiMjIyAuUm1k7YyM7J287JeQ7IScIOywuOqzoCDrrLjtl4zqs7wg7J247JqpIO2RnOyLnA0KDQotIOuLpOyWke2VnCDtj6zrqafqs7wg7ZmV7J6l7J6QIOyhtOyerA0KLSDtjKzrj4Xsl5DshJzripQg7Jik7ZSI7IaM7Iqk7LC46rOg66y47ZeMIOq0gOumrCDrjbDsnbTthLDrsqDsnbTsiqQg7Y+s66mn7J2EIOyngOybkA0KLSBSbWQg7YyM7J287JeQIOywuOqzoOusuO2XjCBEQuulvCDstpTqsIDtlaAg65WM64qUIFlBTUwg7Zek642U7J2YIGJpYmlvZ3JhcGh5652864qUIO2VhOuTnOyXkCBEQiDtjIzsnbzrqoXsnLzroZwg7ZWt66qp7J2EIOyngOyglQ0KICAgIA0KICAgIC8tLS0NCiAgICANCiAgICB0aXRsZTog7JWM66eI7YGs64uk7Jq07JeQIOuMgO2VmOyXrA0KICAgIA0KICAgIGF1dGhvcjogU0JLbw0KICAgIA0KICAgIGJpYmxpb2dyYXBoeTogZXhhbXBsZS5iaWJ0ZXgNCiAgICANCiAgICBvdXRwdXQ6DQogICAgDQogICAgIGh0bWxfZG9jdW1lbnQ6DQogICAgDQogICAgICB0b2M6IHRydWUNCiAgICANCiAgICAvLS0tDQogICAgDQogICAg7JWM66eI7YGs64uk7Jq0IO2MqOyngFtAYWxsYWlyZTIwMTRd7JeQIOuUsOultOuptA0KDQotIOyKpO2DgOydvCDsp4DsoJXtlZjquLANCu2VmeyIoOyngOuniOuLpOydmCDsoJXtlbTsp4Qg7Iqk7YOA7J28LijtjKzrj4XsnZggZGVmYXVsdDogJ+yggOyekC3sl7Drj4QnKQ0KDQrsiqTtg4DsnbzsnYQg67CU6r646riwIOychO2VtOyEnOuKlCDsiqTtg4Dsnbwg7KCV7J2YIOyLnO2KuCDtjIzsnbwoLmNzbCnsnYQg64uk7Jq067Cb7JWELCBZQU1MIO2VtOuNlOyXkOyEnCBjc2wg7ZWE65Oc66W8IOyCrOyaqe2VmOuptCDrkJzri6QuDQoNCiMjIyDso7zshJ0g64us6riwDQoNCiAgICBIZXJlIGlzIGEgZm9vdG5vdGUgcmVmZXJlbmNlLFteMV0gYW5kIGFub3RoZXIuW15sb25nbm90ZV0NCiAgICANCiAgICBbXjFdOiBIZXJlIGlzIHRoZSBmb290bm90ZS4NCiAgICANCiAgICBbXmxvbmdub3RlXTogSGVyZSdzIG9uZSB3aXRoIG11bHRpcGxlIGJsb2Nrcy4NCiAgICANCiAgICAgICAgU3Vic2VxdWVudCBwYXJhZ3JhcGhzIGFyZSBpbmRlbnRlZCB0byBzaG93IHRoYXQgdGhleQ0KICAgICAgICBiZWxvbmcgdG8gdGhlIHByZXZpb3VzIGZvb3Rub3RlLg0KICAgIA0KICAgICAgICAgICAgeyBzb21lLmNvZGUgfQ0KICAgIA0KICAgICAgICBUaGUgd2hvbGUgcGFyYWdyYXBoIGNhbiBiZSBpbmRlbnRlZCwgb3IganVzdCB0aGUgZmlyc3QNCiAgICAgICAgbGluZS4gIEluIHRoaXMgd2F5LCBtdWx0aS1wYXJhZ3JhcGggZm9vdG5vdGVzIHdvcmsgbGlrZQ0KICAgICAgICBtdWx0aS1wYXJhZ3JhcGggbGlzdCBpdGVtcy4NCiAgICANCiAgICBUaGlzIHBhcmFncmFwaCB3b24ndCBiZSBwYXJ0IG9mIHRoZSBub3RlLCBiZWNhdXNlIGl0DQogICAgaXNuJ3QgaW5kZW50ZWQuDQogICAgDQpIZXJlIGlzIGEgZm9vdG5vdGUgcmVmZXJlbmNlLFteMV0gYW5kIGFub3RoZXIuW15sb25nbm90ZV0NCg0KW14xXTogSGVyZSBpcyB0aGUgZm9vdG5vdGUuDQoNCltebG9uZ25vdGVdOiBIZXJlJ3Mgb25lIHdpdGggbXVsdGlwbGUgYmxvY2tzLg0KDQogICAgU3Vic2VxdWVudCBwYXJhZ3JhcGhzIGFyZSBpbmRlbnRlZCB0byBzaG93IHRoYXQgdGhleQ0KYmVsb25nIHRvIHRoZSBwcmV2aW91cyBmb290bm90ZS4NCg0KICAgICAgICB7IHNvbWUuY29kZSB9DQoNCiAgICBUaGUgd2hvbGUgcGFyYWdyYXBoIGNhbiBiZSBpbmRlbnRlZCwgb3IganVzdCB0aGUgZmlyc3QNCiAgICBsaW5lLiAgSW4gdGhpcyB3YXksIG11bHRpLXBhcmFncmFwaCBmb290bm90ZXMgd29yayBsaWtlDQogICAgbXVsdGktcGFyYWdyYXBoIGxpc3QgaXRlbXMuDQoNClRoaXMgcGFyYWdyYXBoIHdvbid0IGJlIHBhcnQgb2YgdGhlIG5vdGUsIGJlY2F1c2UgaXQNCmlzbid0IGluZGVudGVkLg0KDQo=