forked from kylebaron/learn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdeck_03.html
289 lines (286 loc) · 196 KB
/
deck_03.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<meta name="author" content="Kyle T. Baron" />
<title>Introduction to mrgsolveModel specification</title>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
div.sourceCode { overflow-x: auto; }
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; } /* Keyword */
code > span.dt { color: #902000; } /* DataType */
code > span.dv { color: #40a070; } /* DecVal */
code > span.bn { color: #40a070; } /* BaseN */
code > span.fl { color: #40a070; } /* Float */
code > span.ch { color: #4070a0; } /* Char */
code > span.st { color: #4070a0; } /* String */
code > span.co { color: #60a0b0; font-style: italic; } /* Comment */
code > span.ot { color: #007020; } /* Other */
code > span.al { color: #ff0000; font-weight: bold; } /* Alert */
code > span.fu { color: #06287e; } /* Function */
code > span.er { color: #ff0000; font-weight: bold; } /* Error */
code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
code > span.cn { color: #880000; } /* Constant */
code > span.sc { color: #4070a0; } /* SpecialChar */
code > span.vs { color: #4070a0; } /* VerbatimString */
code > span.ss { color: #bb6688; } /* SpecialString */
code > span.im { } /* Import */
code > span.va { color: #19177c; } /* Variable */
code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code > span.op { color: #666666; } /* Operator */
code > span.bu { } /* BuiltIn */
code > span.ex { } /* Extension */
code > span.pp { color: #bc7a00; } /* Preprocessor */
code > span.at { color: #7d9029; } /* Attribute */
code > span.do { color: #ba2121; font-style: italic; } /* Documentation */
code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
</style>
<link href="data:text/css;charset=utf-8,%0Abody%0A%7B%0Amargin%3A%200%200%200%200%3B%0Apadding%3A%200%200%200%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Acolor%3A%20black%3B%0Abackground%2Dcolor%3A%20white%3B%0Afont%2Dfamily%3A%20%22Gill%20Sans%20MT%22%2C%20%22Gill%20Sans%22%2C%20GillSans%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0Adiv%2Etoolbar%20%7B%0Aposition%3A%20fixed%3B%20z%2Dindex%3A%20200%3B%0Atop%3A%20auto%3B%20bottom%3A%200%3B%20left%3A%200%3B%20right%3A%200%3B%0Aheight%3A%201%2E2em%3B%20text%2Dalign%3A%20right%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%20font%2Dsize%3A%2060%25%3B%0Acolor%3A%20DimGray%3B%0Abackground%2Dcolor%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dtop%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0A%7D%0Adiv%2Etoolbar%20span%2Ecopyright%20%7B%0Acolor%3A%20DimGray%3B%0Amargin%2Dleft%3A%200%2E5em%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%201000%3B%0Abottom%3A%201%2E2em%3B%0Awidth%3A%20100%25%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%29%3B%0Aopacity%3A%200%2E35%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%2C%200%2E35%29%3B%0Acursor%3A%20pointer%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Ehelp%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Eclose%20%7B%0Atext%2Dalign%3A%20right%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%20300%3B%0Awidth%3A%2060%25%3B%0Amax%2Dwidth%3A%2030em%3B%0Aheight%3A%2030em%3B%0Aoverflow%3A%20auto%3B%0Atop%3A%20auto%3B%0Aright%3A%20auto%3B%0Aleft%3A%204em%3B%0Abottom%3A%204em%3B%0Apadding%3A%201em%3B%0Abackground%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dwidth%3A%202px%3B%0Afont%2Dsize%3A%2060%25%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%2Etoc%5Fheading%20%7B%0Atext%2Dalign%3A%20center%3B%0Awidth%3A%20100%25%3B%0Amargin%3A%200%3B%0Amargin%2Dbottom%3A%201em%3B%0Aborder%2Dbottom%2Dstyle%3A%20solid%3B%0Aborder%2Dbottom%2Dcolor%3A%20rgb%28180%2C180%2C180%29%3B%0Aborder%2Dbottom%2Dwidth%3A%201px%3B%0A%7D%0Adiv%2Eslide%20%7B%0Az%2Dindex%3A%2020%3B%0Amargin%3A%200%200%200%200%3B%0Apadding%2Dtop%3A%200%3B%0Apadding%2Dbottom%3A%200%3B%0Apadding%2Dleft%3A%2020px%3B%0Apadding%2Dright%3A%2020px%3B%0Aborder%2Dwidth%3A%200%3B%0Aclear%3A%20both%3B%0Atop%3A%200%3B%0Abottom%3A%200%3B%0Aleft%3A%200%3B%0Aright%3A%200%3B%0Aline%2Dheight%3A%20120%25%3B%0Abackground%2Dcolor%3A%20transparent%3B%0A%7D%0Adiv%2Ebackground%20%7B%0Adisplay%3A%20none%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Amargin%2Dleft%3A%2020px%3B%0Amargin%2Dright%3A%2020px%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20h1%20%7B%0Apadding%2Dtop%3A%2010%25%3B%0Amargin%2Dright%3A%200%3B%0A%7D%0Adiv%2Eslide%20h1%20%7B%0Apadding%2Dleft%3A%200%3B%0Apadding%2Dright%3A%2020pt%3B%0Apadding%2Dtop%3A%204pt%3B%0Apadding%2Dbottom%3A%204pt%3B%0Amargin%2Dtop%3A%200%3B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dright%3A%2060pt%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Adisplay%3A%20block%3B%20font%2Dsize%3A%20160%25%3B%0Aline%2Dheight%3A%201%2E2em%3B%0Abackground%3A%20transparent%3B%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%201024px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20100%25%3B%20%7D%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%20800px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20200%25%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Atop%3A%201em%3B%0Aleft%3A%201em%3B%0Aright%3A%20auto%3B%0Awidth%3A%2080%25%3B%0Afont%2Dsize%3A%20180%25%3B%0A%7D%0A%7D%0Adiv%2Etoc%2Dheading%20%7B%0Awidth%3A%20100%25%3B%0Aborder%2Dbottom%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0Amargin%2Dbottom%3A%201em%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Aimg%20%7B%0Aimage%2Drendering%3A%20optimize%2Dquality%3B%0A%7D%0Apre%20%7B%0Afont%2Dsize%3A%2080%25%3B%0Afont%2Dweight%3A%20bold%3B%0Aline%2Dheight%3A%20120%25%3B%0Apadding%2Dtop%3A%200%2E2em%3B%0Apadding%2Dbottom%3A%200%2E2em%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dleft%2Dwidth%3A%201em%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dright%2Dwidth%3A%20thin%3B%0Aborder%2Dbottom%2Dwidth%3A%20thin%3B%0Aborder%2Dcolor%3A%20%2395ABD0%3B%0Acolor%3A%20%2300428C%3B%0Abackground%2Dcolor%3A%20%23E4E5E7%3B%0A%7D%0Ali%20pre%20%7B%20margin%2Dleft%3A%200%3B%20%7D%0Ablockquote%20%7B%20font%2Dstyle%3A%20italic%20%7D%0Aimg%20%7B%20background%2Dcolor%3A%20transparent%20%7D%0Ap%2Ecopyright%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ecenter%20%7B%20text%2Dalign%3A%20center%20%7D%0A%2Efootnote%20%7B%20font%2Dsize%3A%20smaller%3B%20margin%2Dleft%3A%202em%3B%20%7D%0Aa%20img%20%7B%20border%2Dwidth%3A%200%3B%20border%2Dstyle%3A%20none%20%7D%0Aa%3Avisited%20%7B%20color%3A%20navy%20%7D%0Aa%3Alink%20%7B%20color%3A%20navy%20%7D%0Aa%3Ahover%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%3Aactive%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%20%7Btext%2Ddecoration%3A%20none%7D%0A%2Etoolbar%20a%3Alink%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Avisited%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Aactive%20%7Bcolor%3A%20red%7D%0A%2Etoolbar%20a%3Ahover%20%7Bcolor%3A%20red%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Ali%20%7B%20margin%2Dleft%3A%200%2E5em%3B%20margin%2Dtop%3A%200%2E5em%3B%20%7D%0Ali%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%20%7D%0Ali%20li%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%20%7D%0Adiv%20dt%0A%7B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dtop%3A%201em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%20dd%0A%7B%0Amargin%2Dleft%3A%202em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0A%7D%0Ap%2Cpre%2Cul%2Col%2Cblockquote%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%2Cdl%2Ctable%20%7B%0Amargin%2Dleft%3A%201em%3B%0Amargin%2Dright%3A%201em%3B%0A%7D%0Ap%2Esubhead%20%7B%20font%2Dweight%3A%20bold%3B%20margin%2Dtop%3A%202em%3B%20%7D%0A%2Esmaller%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ebigger%20%7B%20font%2Dsize%3A%20130%25%20%7D%0Atd%2Cth%20%7B%20padding%3A%200%2E2em%20%7D%0Aul%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aol%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20li%20%7B%20list%2Dstyle%3A%20square%3B%0Amargin%3A%200%2E1em%200em%200%2E6em%200%3B%0Apadding%3A%200%200%200%200%3B%0Aline%2Dheight%3A%20140%25%3B%0A%7D%0Aol%20li%20%7B%20margin%3A%200%2E1em%200em%200%2E6em%201%2E5em%3B%0Apadding%3A%200%200%200%200px%3B%0Aline%2Dheight%3A%20140%25%3B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%3B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%3B%0Alist%2Dstyle%2Dtype%3A%20circle%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20li%20ul%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20li%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0A%0Aol%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aol%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aul%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aul%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aol%2Eoutline%20%7B%20list%2Dstyle%3Adecimal%3B%20%7D%0Aol%2Eoutline%20ol%20%7B%20list%2Dstyle%2Dtype%3Alower%2Dalpha%20%7D%0Aol%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0A%0Aa%2Etitleslide%20%7B%20font%2Dweight%3A%20bold%3B%20font%2Dstyle%3A%20italic%20%7D%0A%0Aimg%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Einitial%5Fprompt%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Eslide%20%7B%0Avisibility%3A%20visible%3B%0Aposition%3A%20inherit%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Aborder%2Dtop%2Dstyle%3A%20solid%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dtop%2Dcolor%3A%20black%3B%0A%7D%0A%40media%20screen%20%7B%0A%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ehandout%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Einitial%5Fprompt%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Einvisible%20%7B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Eslide%20%7B%20position%3A%20absolute%20%7D%0Abody%2Esingle%5Fslide%20div%2Ehandout%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0A%7D%0A%40media%20print%20%7B%0A%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%20pre%20%7B%20font%2Dsize%3A%2060%25%3B%20padding%2Dleft%3A%200%2E5em%3B%20%7D%0Adiv%2Etoolbar%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslide%20%7B%20page%2Dbreak%2Dbefore%3A%20always%20%7D%0A%0Adiv%2Eslide%2Efirst%2Dslide%20%7B%20page%2Dbreak%2Dbefore%3A%20avoid%20%7D%0A%7D%0A%0A%0A%2Ejslider%20table%20%7B%0Amargin%2Dleft%3A%200em%3B%0Amargin%2Dright%3A%200em%3B%0A%7D%0A%0Atable%2EdataTable%2C%20%2Eshiny%2Ddatatable%2Doutput%20div%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0A%2EdataTables%5Finfo%2C%20%2EdataTables%5Fpaginate%20%7B%0Afont%2Dsize%3A%2019px%3B%0A%7D%0A%0Apre%2EsourceCode%2C%20code%2EsourceCode%20%7B%0Afont%2Dsize%3A%2080%25%3B%0A%7D%0A%0Alabel%2C%20button%2C%20input%2C%20select%2C%20textarea%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0Aul%2Enav%2C%20ul%2Enav%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,Lyogc2xpZHkuanMKCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDEzIFczQyAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIFczQyBsaWFiaWxpdHksIHRyYWRlbWFyaywgZG9jdW1lbnQgdXNlIGFuZCBzb2Z0d2FyZSBsaWNlbnNpbmcKICAgcnVsZXMgYXBwbHksIHNlZToKCiAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LWRvY3VtZW50cwogICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZQoKICAgRGVmaW5lcyBzaW5nbGUgbmFtZSAidzNjX3NsaWR5IiBpbiBnbG9iYWwgbmFtZXNwYWNlCiAgIEFkZHMgZXZlbnQgaGFuZGxlcnMgd2l0aG91dCB0cmFtcGxpbmcgb24gYW55IG90aGVycwoqLwoKLy8gdGhlIHNsaWR5IG9iamVjdCBpbXBsZW1lbnRhdGlvbgp2YXIgdzNjX3NsaWR5ID0gewogIC8vIGNsYXNzaWZ5IHdoaWNoIGtpbmQgb2YgYnJvd3NlciB3ZSdyZSBydW5uaW5nIHVuZGVyCiAgbnNfcG9zOiAodHlwZW9mIHdpbmRvdy5wYWdlWU9mZnNldCE9J3VuZGVmaW5lZCcpLAogIGtodG1sOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgb3BlcmE6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiT3BlcmEiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGFkOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoImlQYWQiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGhvbmU6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiaVBob25lIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgYW5kcm9pZDogKChuYXZpZ2F0b3IudXNlckFnZW50KS5pbmRleE9mKCJBbmRyb2lkIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgaWU6ICh0eXBlb2YgZG9jdW1lbnQuYWxsICE9ICJ1bmRlZmluZWQiICYmICF0aGlzLm9wZXJhKSwKICBpZTY6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDYiKSAhPSAtMSksCiAgaWU3OiAoIXRoaXMubnNfcG9zICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSA3IikgIT0gLTEpLAogIGllODogKCF0aGlzLm5zX3BvcyAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgOCIpICE9IC0xKSwKICBpZTk6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDkiKSAhPSAtMSksCgogIC8vIGRhdGEgZm9yIHN3aXBlIGFuZCBkb3VibGUgdGFwIGRldGVjdGlvbiBvbiB0b3VjaCBzY3JlZW5zCiAgbGFzdF90YXA6IDAsCiAgcHJldl90YXA6IDAsCiAgc3RhcnRfeDogMCwKICBzdGFydF95OiAwLAogIGRlbHRhX3g6IDAsCiAgZGVsdGFfeTogMCwKCiAgLy8gYXJlIHdlIHJ1bm5pbmcgYXMgWEhUTUw/IChkb2Vzbid0IHdvcmsgb24gT3BlcmEpCiAgaXNfeGh0bWw6IC94bWwvLnRlc3QoZG9jdW1lbnQuY29udGVudFR5cGUpLAoKICBzbGlkZV9udW1iZXI6IDAsIC8vIGludGVnZXIgc2xpZGUgY291bnQ6IDAsIDEsIDIsIC4uLgogIHNsaWRlX251bWJlcl9lbGVtZW50OiBudWxsLCAvLyBlbGVtZW50IGNvbnRhaW5pbmcgc2xpZGUgbnVtYmVyCiAgc2xpZGVzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIHNsaWRlIGRpdidzCiAgbm90ZXM6IFtdLCAvLyBzZXQgdG8gYXJyYXkgb2YgaGFuZG91dCBkaXYncwogIGJhY2tncm91bmRzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIGJhY2tncm91bmQgZGl2J3MKICBvYnNlcnZlcnM6IFtdLCAvLyBsaXN0IG9mIG9ic2VydmVyIGZ1bmN0aW9ucwogIHRvb2xiYXI6IG51bGwsIC8vIGVsZW1lbnQgY29udGFpbmluZyB0b29sYmFyCiAgdGl0bGU6IG51bGwsIC8vIGRvY3VtZW50IHRpdGxlCiAgbGFzdF9zaG93bjogbnVsbCwgLy8gbGFzdCBpbmNyZW1lbnRhbGx5IHNob3duIGl0ZW0KICBlb3M6IG51bGwsICAvLyBzcGFuIGVsZW1lbnQgZm9yIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKICB0b2M6IG51bGwsIC8vIHRhYmxlIG9mIGNvbnRlbnRzCiAgb3V0bGluZTogbnVsbCwgLy8gb3V0bGluZSBlbGVtZW50IHdpdGggdGhlIGZvY3VzCiAgc2VsZWN0ZWRfdGV4dF9sZW46IDAsIC8vIGxlbmd0aCBvZiBkcmFnIHNlbGVjdGlvbiBvbiBkb2N1bWVudAogIHZpZXdfYWxsOiAwLCAgLy8gMSB0byB2aWV3IGFsbCBzbGlkZXMgKyBoYW5kb3V0cwogIHdhbnRfdG9vbGJhcjogdHJ1ZSwgIC8vIHVzZXIgcHJlZmVyZW5jZSB0byBzaG93L2hpZGUgdG9vbGJhcgogIG1vdXNlX2NsaWNrX2VuYWJsZWQ6IHRydWUsIC8vIGVuYWJsZXMgbGVmdCBjbGljayBmb3IgbmV4dCBzbGlkZQogIHNjcm9sbF9oYWNrOiAwLCAvLyBJRSB3b3JrIGFyb3VuZCBmb3IgcG9zaXRpb246IGZpeGVkCiAgZGlzYWJsZV9zbGlkZV9jbGljazogZmFsc2UsICAvLyB1c2VkIGJ5IGNsaWNrZWQgYW5jaG9ycwoKICBsYW5nOiAiZW4iLCAvLyB1cGRhdGVkIHRvIGxhbmd1YWdlIHNwZWNpZmllZCBieSBodG1sIGZpbGUKCiAgaGVscF9hbmNob3I6IG51bGwsIC8vIHVzZWQgZm9yIGtleWJvYXJkIGZvY3VzIGhhY2sgaW4gc2hvd1Rvb2xiYXIoKQogIGhlbHBfcGFnZTogImh0dHA6Ly93d3cudzMub3JnL1RhbGtzL1Rvb2xzL1NsaWR5Mi9oZWxwL2hlbHAuaHRtbCIsCiAgaGVscF90ZXh0OiAiTmF2aWdhdGUgd2l0aCBtb3VzZSBjbGljaywgc3BhY2UgYmFyLCBDdXJzb3IgTGVmdC9SaWdodCwgIiArCiAgICAgICAgICAgICAib3IgUGcgVXAgYW5kIFBnIERuLiBVc2UgUyBhbmQgQiB0byBjaGFuZ2UgZm9udCBzaXplLiIsCgogIHNpemVfaW5kZXg6IDAsCiAgc2l6ZV9hZGp1c3RtZW50OiAwLAogIHNpemVzOiAgbmV3IEFycmF5KCIxMHB0IiwgIjEycHQiLCAiMTRwdCIsICIxNnB0IiwgIjE4cHQiLCAiMjBwdCIsCiAgICAgICAgICAgICAgICAgICAgIjIycHQiLCAiMjRwdCIsICIyNnB0IiwgIjI4cHQiLCAiMzBwdCIsICIzMnB0IiksCgogIC8vIG5lZWRlZCBmb3IgZWZmaWNpZW50IHJlc2l6aW5nCiAgbGFzdF93aWR0aDogMCwKICBsYXN0X2hlaWdodDogMCwKCgogIC8vIE5lZWRlZCBmb3IgY3Jvc3MgYnJvd3NlciBzdXBwb3J0IGZvciByZWxhdGl2ZSB3aWR0aC9oZWlnaHQgb24KICAvLyBvYmplY3QgZWxlbWVudHMuIFRoZSB3b3JrIGFyb3VuZCBpcyB0byBzYXZlIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzCiAgLy8gYW5kIHRoZW4gdG8gcmVjb21wdXRlIGFic29sdXRlIHdpZHRoL2hlaWdodCBkaW1lbnNpb25zIG9uIHJlc2l6aW5nCiAgIG9iamVjdHM6IFtdLAoKICAvLyBhdHRhY2ggaW5pdGlhbGlhdGlvbiBldmVudCBoYW5kbGVycwogIHNldF91cDogZnVuY3Rpb24gKCkgewogICAgdmFyIGluaXQgPSBmdW5jdGlvbigpIHsgdzNjX3NsaWR5LmluaXQoKTsgfTsKICAgIGlmICh0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT0gInVuZGVmaW5lZCIpCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgaW5pdCwgZmFsc2UpOwogICAgZWxzZQogICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsIGluaXQpOwogIH0sCgogIGhpZGVfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAhdzNjX3NsaWR5LmluaXRpYWxpemVkKQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgIGVsc2UKICAgICAgc2V0VGltZW91dCh3M2Nfc2xpZHkuaGlkZV9zbGlkZXMsIDUwKTsKICB9LAoKICAvLyBoYWNrIHRvIHBlcnN1YWRlIElFIHRvIGNvbXB1dGUgY29ycmVjdCBkb2N1bWVudCBoZWlnaHQKICAvLyBhcyBuZWVkZWQgZm9yIHNpbXVsYXRpbmcgZml4ZWQgcG9zaXRpb25pbmcgb2YgdG9vbGJhcgogIGllX2hhY2s6IGZ1bmN0aW9uICgpIHsKICAgIHdpbmRvdy5yZXNpemVCeSgwLC0xKTsKICAgIHdpbmRvdy5yZXNpemVCeSgwLCAxKTsKICB9LAoKICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAvL2FsZXJ0KCJzbGlkeSBzdGFydGluZyB0ZXN0IDEwIik7CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICB0aGlzLmluaXRfbG9jYWxpemF0aW9uKCk7CiAgICB0aGlzLmFkZF90b29sYmFyKCk7CiAgICB0aGlzLndyYXBfaW1wbGljaXRfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfbm90ZXMoKTsKICAgIHRoaXMuY29sbGVjdF9iYWNrZ3JvdW5kcygpOwogICAgdGhpcy5vYmplY3RzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CiAgICB0aGlzLnBhdGNoX2FuY2hvcnMoKTsKICAgIHRoaXMuc2xpZGVfbnVtYmVyID0gdGhpcy5maW5kX3NsaWRlX251bWJlcihsb2NhdGlvbi5ocmVmKTsKICAgIHdpbmRvdy5vZmZzY3JlZW5idWZmZXJpbmcgPSB0cnVlOwogICAgdGhpcy5zaXplX2FkanVzdG1lbnQgPSB0aGlzLmZpbmRfc2l6ZV9hZGp1c3QoKTsKICAgIHRoaXMudGltZV9sZWZ0ID0gdGhpcy5maW5kX2R1cmF0aW9uKCk7CiAgICB0aGlzLmhpZGVfaW1hZ2VfdG9vbGJhcigpOyAgLy8gc3VwcHJlc3MgSUUgaW1hZ2UgdG9vbGJhciBwb3B1cAogICAgdGhpcy5pbml0X291dGxpbmVyKCk7ICAvLyBhY3RpdmF0ZSBmb2xkL3VuZm9sZCBzdXBwb3J0CiAgICB0aGlzLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7CiAgICB0aGlzLmtleWJvYXJkbGVzcyA9ICh0aGlzLmlwYWR8fHRoaXMuaXBob25lfHx0aGlzLmFuZHJvaWQpOwoKICAgIGlmICh0aGlzLmtleWJvYXJkbGVzcykKICAgIHsKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgIHRoaXMud2FudF90b29sYmFyID0gMDsKICAgIH0KCiAgICAvLyB3b3JrIGFyb3VuZCBmb3Igb3BlcmEgYnVnCiAgICB0aGlzLmlzX3hodG1sID0gKGRvY3VtZW50LmJvZHkudGFnTmFtZSA9PSAiQk9EWSIgPyBmYWxzZSA6IHRydWUpOwoKICAgIGlmICh0aGlzLnNsaWRlcy5sZW5ndGggPiAwKQogICAgewogICAgICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1t0aGlzLnNsaWRlX251bWJlcl07CiAgIAogICAgICBpZiAodGhpcy5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgICAgICAgdGhpcy5zZXRfZW9zX3N0YXR1cyh0cnVlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKCF0aGlzLm5leHRfaW5jcmVtZW50YWxfaXRlbSh0aGlzLmxhc3Rfc2hvd24pKTsKICAgICAgfQoKICAgICAgdGhpcy5zZXRfbG9jYXRpb24oKTsKICAgICAgdGhpcy5hZGRfY2xhc3ModGhpcy5zbGlkZXNbMF0sICJmaXJzdC1zbGlkZSIpOwogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZShzbGlkZSk7CiAgICB9CgogICAgdGhpcy50b2MgPSB0aGlzLnRhYmxlX29mX2NvbnRlbnRzKCk7CgogICAgdGhpcy5hZGRfaW5pdGlhbF9wcm9tcHQoKTsKCiAgICAvLyBiaW5kIGV2ZW50IGhhbmRsZXJzIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBjdXN0b20gcGFnZSBzY3JpcHRzCiAgICAvLyBUYXAgZXZlbnRzIGJlaGF2ZSB0b28gd2VpcmRseSB0byBzdXBwb3J0IGNsaWNrcyByZWxpYWJseSBvbgogICAgLy8gaVBob25lIGFuZCBpUGFkLCBzbyBleGNsdWRlIHRoZXNlIGZyb20gY2xpY2sgaGFuZGxlcgoKICAgIGlmICghdGhpcy5rZXlib2FyZGxlc3MpCiAgICB7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIHRoaXMubW91c2VfYnV0dG9uX2NsaWNrKTsKICAgICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNlZG93biIsIHRoaXMubW91c2VfYnV0dG9uX2Rvd24pOwogICAgfQoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAia2V5ZG93biIsIHRoaXMua2V5X2Rvd24pOwogICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMua2V5X3ByZXNzKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInJlc2l6ZSIsIHRoaXMucmVzaXplZCk7CiAgICB0aGlzLmFkZF9saXN0ZW5lcih3aW5kb3csICJzY3JvbGwiLCB0aGlzLnNjcm9sbGVkKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInVubG9hZCIsIHRoaXMudW5sb2FkZWQpOwoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAiZ2VzdHVyZWNoYW5nZSIsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgIHRoaXMuYXR0YWNoX3RvdWNoX2hhbmRlcnModGhpcy5zbGlkZXMpOwoKICAgIC8vIHRoaXMgc2VlbXMgdG8gYmUgYSBkZWJ1Z2dpbmcgaGFjawogICAgLy9pZiAoIWRvY3VtZW50LmJvZHkub25jbGljaykKICAgIC8vICBkb2N1bWVudC5ib2R5Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7IH07CgogICAgdGhpcy5zaW5nbGVfc2xpZGVfdmlldygpOwoKICAgIC8vdGhpcy5zZXRfbG9jYXRpb24oKTsKCiAgICB0aGlzLnJlc2l6ZWQoKTsKCiAgICBpZiAodGhpcy5pZTcpCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CgogICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKCiAgICAvLyBmb3IgYmFjayBidXR0b24gZGV0ZWN0aW9uCiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHczY19zbGlkeS5jaGVja19sb2NhdGlvbigpOyB9LCAyMDApOwogICAgdzNjX3NsaWR5LmluaXRpYWxpemVkID0gdHJ1ZTsKICB9LAoKICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgd2l0aCBsaW5rcyB0byBlYWNoIHNsaWRlCiAgdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0b2MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuYWRkX2NsYXNzKHRvYywgInNsaWR5X3RvYyBoaWRkZW4iKTsKICAgIC8vdG9jLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwoKICAgIHZhciBoZWFkaW5nID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmFkZF9jbGFzcyhoZWFkaW5nLCAidG9jLWhlYWRpbmciKTsKICAgIGhlYWRpbmcuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiVGFibGUgb2YgQ29udGVudHMiKTsKCiAgICB0b2MuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CiAgICB2YXIgcHJldmlvdXMgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIHZhciB0aXRsZSA9IHRoaXMuaGFzX2NsYXNzKHRoaXMuc2xpZGVzW2ldLCAidGl0bGUiKTsKICAgICAgdmFyIG51bSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKChpICsgMSkgKyAiLiAiKTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChudW0pOwoKICAgICAgdmFyIGEgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgIGEuc2V0QXR0cmlidXRlKCJocmVmIiwgIiMoIiArIChpKzEpICsgIikiKTsKCiAgICAgIGlmICh0aXRsZSkKICAgICAgICB0aGlzLmFkZF9jbGFzcyhhLCAidGl0bGVzbGlkZSIpOwoKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnNsaWRlX25hbWUoaSkpOwogICAgICBhLmFwcGVuZENoaWxkKG5hbWUpOwogICAgICBhLm9uY2xpY2sgPSB3M2Nfc2xpZHkudG9jX2NsaWNrOwogICAgICBhLm9ua2V5ZG93biA9IHczY19zbGlkeS50b2Nfa2V5X2Rvd247CiAgICAgIGEucHJldmlvdXMgPSBwcmV2aW91czsKCiAgICAgIGlmIChwcmV2aW91cykKICAgICAgICBwcmV2aW91cy5uZXh0ID0gYTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChhKTsKCiAgICAgIGlmIChpID09IDApCiAgICAgICAgdG9jLmZpcnN0ID0gYTsKCiAgICAgIGlmIChpIDwgdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSkKICAgICAgewogICAgICAgIHZhciBiciA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImJyIik7CiAgICAgICAgdG9jLmFwcGVuZENoaWxkKGJyKTsKICAgICAgfQoKICAgICAgcHJldmlvdXMgPSBhOwogICAgfQoKICAgIHRvYy5mb2N1cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRoaXMuZmlyc3QpCiAgICAgICAgdGhpcy5maXJzdC5mb2N1cygpOwogICAgfQoKICAgIHRvYy5vbm1vdXNldXAgPSB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX3VwOwoKICAgIHRvYy5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgZXx8KGU9d2luZG93LmV2ZW50KTsKCiAgICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPD0gMCkKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CgogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgIAogICAgICBpZiAoZS5jYW5jZWwgIT0gdW5kZWZpbmVkKQogICAgICAgIGUuY2FuY2VsID0gdHJ1ZTsKICAgICAgCiAgICAgIGlmIChlLnJldHVyblZhbHVlICE9IHVuZGVmaW5lZCkKICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIAogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHRvYywgZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTsKICAgIHJldHVybiB0b2M7CiAgfSwKCiAgaXNfc2hvd25fdG9jOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gIXczY19zbGlkeS5oYXNfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogIH0sCgogIHNob3dfdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogICAgdmFyIHRvYyA9IHczY19zbGlkeS50b2M7CiAgICB0b2MuZm9jdXMoKTsKCiAgICBpZiAodzNjX3NsaWR5LmllNyAmJiB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID09IDApCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CiAgfSwKCiAgaGlkZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKGZvY3VzKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKTsKCiAgICBpZiAoZm9jdXMgJiYgIXczY19zbGlkeS5vcGVyYSAmJgogICAgICAgICF3M2Nfc2xpZHkuaGFzX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKSkKICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogIH0sCgogIHRvZ2dsZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5pc19zaG93bl90b2MoKSkKICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CiAgICBlbHNlCiAgICAgIHczY19zbGlkeS5zaG93X3RhYmxlX29mX2NvbnRlbnRzKCk7CiAgfSwKCiAgLy8gY2FsbGVkIG9uIGNsaWNraW5nIHRvYyBlbnRyeQogIHRvY19jbGljazogZnVuY3Rpb24gKGUpIHsKICAgIGlmICghZSkKICAgICAgZSA9IHdpbmRvdy5ldmVudDsKCiAgICB2YXIgdGFyZ2V0ID0gdzNjX3NsaWR5LmdldF90YXJnZXQoZSk7CgogICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMSkKICAgIHsKICAgICAgdmFyIHVyaSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKCiAgICAgIGlmICh1cmkpCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJnb2luZyB0byAiICsgdXJpKTsKICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LmZpbmRfc2xpZGVfbnVtYmVyKHVyaSk7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgIC8vdGFyZ2V0LmZvY3VzKCk7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgIGlmICghdzNjX3NsaWR5Lm9wZXJhKQogICAgICAgICAgICB3M2Nfc2xpZHkuc2V0X2ZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKQogICAgICAgIHsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKICAgIGlmICh3M2Nfc2xpZHkuaWU3KSB3M2Nfc2xpZHkuaWVfaGFjaygpOwogICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChlKTsKICB9LAoKICAvLyBjYWxsZWQgb25rZXlkb3duIGZvciB0b2MgZW50cnkKICB0b2Nfa2V5X2Rvd246IGZ1bmN0aW9uIChldmVudCkgewogICAgdmFyIGtleTsKCiAgICBpZiAoIWV2ZW50KQogICAgICB2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgZWxzZSBpZiAoZXZlbnQud2hpY2gpCiAgICAgIGtleSA9IGV2ZW50LndoaWNoOwogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgcmV0dXJuIHRydWU7CgogICAgLy8gY2hlY2sgZm9yIGNvbmN1cnJlbnQgY29udHJvbC9jb21tYW5kL2FsdCBrZXkKICAgIC8vIGJ1dCBhcmUgdGhlc2Ugb25seSBwcmVzZW50IG9uIG1vdXNlIGV2ZW50cz8KCiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChrZXkgPT0gMTMpCiAgICB7CiAgICAgIHZhciB1cmkgPSB0aGlzLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoKICAgICAgaWYgKHVyaSkKICAgICAgewogICAgICAgIC8vYWxlcnQoImdvaW5nIHRvICIgKyB1cmkpOwogICAgICAgdmFyIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5maW5kX3NsaWRlX251bWJlcih1cmkpOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7CiAgICAgICAgdzNjX3NsaWR5LnNldF9sb2NhdGlvbigpOwogICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cyghdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbSh3M2Nfc2xpZHkubGFzdF9zaG93bikpOwogICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAvL3RhcmdldC5mb2N1cygpOwoKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICBpZiAoIXczY19zbGlkeS5vcGVyYSkKICAgICAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkKICAgICAgICB7CiAgICAgICAgfQogICAgICB9CgogICAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKCiAgICAgIGlmIChzZWxmLmllNykKICAgICAgIHczY19zbGlkeS5pZV9oYWNrKCk7CgogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSA0MCAmJiB0aGlzLm5leHQpCiAgICB7CiAgICAgIHRoaXMubmV4dC5mb2N1cygpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSAzOCAmJiB0aGlzLnByZXZpb3VzKQogICAgewogICAgICB0aGlzLnByZXZpb3VzLmZvY3VzKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICB0b3VjaHN0YXJ0OiBmdW5jdGlvbiAoZSkKICB7CiAgICAvLyBhIGRvdWJsZSB0b3VjaCBvZnRlbiBzdGFydHMgd2l0aCBhCiAgICAvLyBzaW5nbGUgdG91Y2ggZHVlIHRvIGZpbmdlcnMgdG91Y2hpbmcKICAgIC8vIGRvd24gYXQgc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzCiAgICAvLyB0aHVzIGF2b2lkIGNhbGxpbmcgcHJldmVudERlZmF1bHQgaGVyZQogICAgdGhpcy5wcmV2X3RhcCA9IHRoaXMubGFzdF90YXA7CiAgICB0aGlzLmxhc3RfdGFwID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgogICAgdmFyIHRhcF9kZWxheSA9IHRoaXMubGFzdF90YXAgLSB0aGlzLnByZXZfdGFwOwoKICAgIGlmICh0YXBfZGVsYXkgPD0gMjAwKQogICAgewogICAgICAvLyBkb3VibGUgdGFwCiAgICB9CgogICAgdmFyIHRvdWNoID0gZS50b3VjaGVzWzBdOwoKICAgIHRoaXMucGFnZVggPSB0b3VjaC5wYWdlWDsKICAgIHRoaXMucGFnZVkgPSB0b3VjaC5wYWdlWTsKICAgIHRoaXMuc2NyZWVuWCA9IHRvdWNoLnNjcmVlblg7CiAgICB0aGlzLnNjcmVlblkgPSB0b3VjaC5zY3JlZW5ZOwogICAgdGhpcy5jbGllbnRYID0gdG91Y2guY2xpZW50WDsKICAgIHRoaXMuY2xpZW50WSA9IHRvdWNoLmNsaWVudFk7CgogICAgdGhpcy5kZWx0YV94ID0gdGhpcy5kZWx0YV95ID0gMDsKICB9LAoKICB0b3VjaG1vdmU6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIG92ZXJyaWRlIG5hdGl2ZSBnZXN0dXJlcyBmb3Igc2luZ2xlIHRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07CiAgICB0aGlzLmRlbHRhX3ggPSB0b3VjaC5wYWdlWCAtIHRoaXMucGFnZVg7CiAgICB0aGlzLmRlbHRhX3kgPSB0b3VjaC5wYWdlWSAtIHRoaXMucGFnZVk7CiAgfSwKCiAgdG91Y2hlbmQ6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgZm9yIG11bHRpLXRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICB2YXIgZGVsYXkgPSAobmV3IERhdGUpLmdldFRpbWUoKSAtIHRoaXMubGFzdF90YXA7CiAgICB2YXIgZHggPSB0aGlzLmRlbHRhX3g7CiAgICB2YXIgZHkgPSB0aGlzLmRlbHRhX3k7CiAgICB2YXIgYWJzX2R4ID0gTWF0aC5hYnMoZHgpOwogICAgdmFyIGFic19keSA9IE1hdGguYWJzKGR5KTsKCiAgICBpZiAoZGVsYXkgPCA1MDAgJiYgKGFic19keCA+IDEwMCB8fCBhYnNfZHkgPiAxMDApKQogICAgewogICAgICBpZiAoYWJzX2R4ID4gMC41ICogYWJzX2R5KQogICAgICB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICBpZiAoZHggPCAwKQogICAgICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUodHJ1ZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgdzNjX3NsaWR5LnByZXZpb3VzX3NsaWRlKHRydWUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGFic19keSA+IDIgKiBhYnNfZHgpCiAgICAgIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpOwogICAgICB9CiAgICB9CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGJlZm9yZV9wcmludDogZnVuY3Rpb24gKCkgewogICAgdGhpcy5zaG93X2FsbF9zbGlkZXMoKTsKICAgIHRoaXMuaGlkZV90b29sYmFyKCk7CiAgICBhbGVydCgiYmVmb3JlIHByaW50Iik7CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGFmdGVyX3ByaW50OiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMudmlld19hbGwpCiAgICB7CiAgICAgIHRoaXMuc2luZ2xlX3NsaWRlX3ZpZXcoKTsKICAgICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKICAgIH0KICAgIGFsZXJ0KCJhZnRlciBwcmludCIpOwogIH0sCgogIC8vICMjIyBPQlNPTEVURSAjIyMKICBwcmludF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYmVmb3JlX3ByaW50KCk7CiAgICB3aW5kb3cucHJpbnQoKTsKICAgIHRoaXMuYWZ0ZXJfcHJpbnQoKTsKICB9LAoKICAvLyAjIyMgT0JTT0xFVEUgPz8gIyMjCiAgdG9nZ2xlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLnZpZXdfYWxsKQogICAgewogICAgICB0aGlzLnNpbmdsZV9zbGlkZV92aWV3KCk7CiAgICAgIHRoaXMuc2hvd190b29sYmFyKCk7CiAgICAgIHRoaXMudmlld19hbGwgPSAwOwogICAgfQogICAgZWxzZQogICAgewogICAgICB0aGlzLnNob3dfYWxsX3NsaWRlcygpOwogICAgICB0aGlzLmhpZGVfdG9vbGJhcigpOwogICAgICB0aGlzLnZpZXdfYWxsID0gMTsKICAgIH0KICB9LAoKICAvLyBwcmVwYXJlIGZvciBwcmludGluZyAgIyMjIE9CU09MRVRFICMjIwogIHNob3dfYWxsX3NsaWRlczogZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW1vdmVfY2xhc3MoZG9jdW1lbnQuYm9keSwgInNpbmdsZV9zbGlkZSIpOwogICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICB9LAoKICAvLyByZXN0b3JlIGFmdGVyIHByaW50aW5nICAjIyMgT0JTT0xFVEUgIyMjCiAgc2luZ2xlX3NsaWRlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYWRkX2NsYXNzKGRvY3VtZW50LmJvZHksICJzaW5nbGVfc2xpZGUiKTsKICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgfSwKCiAgLy8gc3VwcHJlc3MgSUUncyBpbWFnZSB0b29sYmFyIHBvcCB1cAogIGhpZGVfaW1hZ2VfdG9vbGJhcjogZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLm5zX3BvcykKICAgIHsKICAgICAgdmFyIGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJTUciKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKQogICAgICAgIGltYWdlc1tpXS5zZXRBdHRyaWJ1dGUoImdhbGxlcnlpbWciLCAibm8iKTsKICAgIH0KICB9LAoKICB1bmxvYWRlZDogZnVuY3Rpb24gKGUpIHsKICAgIC8vYWxlcnQoInVubG9hZGVkIik7CiAgfSwKCiAgLy8gU2FmYXJpIGFuZCBLb25xdWVyb3IgZG9uJ3QgeWV0IHN1cHBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSgpCiAgLy8gYW5kIHRoZXkgYWx3YXlzIHJlbG9hZCBwYWdlIHdoZW4gbG9jYXRpb24uaHJlZiBpcyB1cGRhdGVkCiAgaXNfS0hUTUw6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBhZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICByZXR1cm4gKGFnZW50LmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSk7CiAgfSwKCiAgLy8gZmluZCBzbGlkZSBuYW1lIGZyb20gZmlyc3QgaDEgZWxlbWVudAogIC8vIGRlZmF1bHQgdG8gZG9jdW1lbnQgdGl0bGUgKyBzbGlkZSBudW1iZXIKICBzbGlkZV9uYW1lOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgIHZhciBuYW1lID0gbnVsbDsKICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2luZGV4XTsKCiAgICB2YXIgaGVhZGluZyA9IHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKTsKCiAgICBpZiAoaGVhZGluZykKICAgICAgbmFtZSA9IHRoaXMuZXh0cmFjdF90ZXh0KGhlYWRpbmcpOwoKICAgIGlmICghbmFtZSkKICAgICAgbmFtZSA9IHRoaXMudGl0bGUgKyAiKCIgKyAoaW5kZXggKyAxKSArICIpIjsKCiAgICBuYW1lLnJlcGxhY2UoL1wmL2csICImYW1wOyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPC9nLCAiJmx0OyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPi9nLCAiJmd0OyIpOwoKICAgIHJldHVybiBuYW1lOwogIH0sCgogIC8vIGZpbmQgZmlyc3QgaDEgZWxlbWVudCBpbiBET00gdHJlZQogIGZpbmRfaGVhZGluZzogZnVuY3Rpb24gKG5vZGUpIHsKICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBudWxsOwoKICAgIGlmIChub2RlLm5vZGVOYW1lID09ICJIMSIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiaDEiKQogICAgICByZXR1cm4gbm9kZTsKCiAgICB2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7CgogICAgd2hpbGUgKGNoaWxkKQogICAgewogICAgICBub2RlID0gdGhpcy5maW5kX2hlYWRpbmcoY2hpbGQpOwoKICAgICAgaWYgKG5vZGUpCiAgICAgICAgcmV0dXJuIG5vZGU7CgogICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIC8vIHJlY3Vyc2l2ZWx5IGV4dHJhY3QgdGV4dCBmcm9tIERPTSB0cmVlCiAgZXh0cmFjdF90ZXh0OiBmdW5jdGlvbiAobm9kZSkgewogICAgaWYgKCFub2RlKQogICAgICByZXR1cm4gIiI7CgogICAgLy8gdGV4dCBub2RlcwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykKICAgICAgcmV0dXJuIG5vZGUubm9kZVZhbHVlOwoKICAgIC8vIGVsZW1lbnRzCiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKQogICAgewogICAgICBub2RlID0gbm9kZS5maXJzdENoaWxkOwogICAgICB2YXIgdGV4dCA9ICIiOwoKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB0ZXh0ID0gdGV4dCArIHRoaXMuZXh0cmFjdF90ZXh0KG5vZGUpOwogICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICB9CgogICAgICByZXR1cm4gdGV4dDsKICAgIH0KCiAgICByZXR1cm4gIiI7CiAgfSwKCiAgLy8gZmluZCBjb3B5cmlnaHQgdGV4dCBmcm9tIG1ldGEgZWxlbWVudAogIGZpbmRfY29weXJpZ2h0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmFtZSwgY29udGVudDsKICAgIHZhciBtZXRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGEubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIG5hbWUgPSBtZXRhW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwogICAgICBjb250ZW50ID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoImNvbnRlbnQiKTsKCiAgICAgIGlmIChuYW1lID09ICJjb3B5cmlnaHQiKQogICAgICAgIHJldHVybiBjb250ZW50OwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIGZpbmRfc2l6ZV9hZGp1c3Q6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZm9udC1zaXplLWFkanVzdG1lbnQiKQogICAgICAgIHJldHVybiAxICogY29udGVudDsKICAgIH0KCiAgICByZXR1cm4gMTsKICB9LAoKICAvLyA8bWV0YSBuYW1lPSJkdXJhdGlvbiIgY29udGVudD0iMjAiIC8+ICBmb3IgMjAgbWludXRlcwogIGZpbmRfZHVyYXRpb246IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZHVyYXRpb24iKQogICAgICAgIHJldHVybiA2MDAwMCAqIGNvbnRlbnQ7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfSwKCiAgcmVwbGFjZV9ieV9ub25fYnJlYWtpbmdfc3BhY2U6IGZ1bmN0aW9uIChzdHIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKQogICAgICBzdHJbaV0gPSAxNjA7CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBpcyB1c2Ugb2YgImxpIiBva2F5IGZvciB0ZXh0L2h0bWw/CiAgLy8gZm9yIFhIVE1MIGRvIHdlIGFsc28gbmVlZCB0byBzcGVjaWZ5IG5hbWVzcGFjZT8KICBpbml0X291dGxpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGkiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKQogICAgewogICAgICB2YXIgdGFyZ2V0ID0gaXRlbXNbaV07CgogICAgICBpZiAoIXRoaXMuaGFzX2NsYXNzKHRhcmdldC5wYXJlbnROb2RlLCAib3V0bGluZSIpKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgdGFyZ2V0Lm9uY2xpY2sgPSB0aGlzLm91dGxpbmVfY2xpY2s7Ci8qICMjIyBtb3JlIHdvcmsgbmVlZGVkIGZvciBJRTYKICAgICAgaWYgKCF0aGlzLm5zX3BvcykKICAgICAgewogICAgICAgIHRhcmdldC5vbm1vdXNlb3ZlciA9IHRoaXMuaG92ZXJfb3V0bGluZTsKICAgICAgICB0YXJnZXQub25tb3VzZW91dCA9IHRoaXMudW5ob3Zlcl9vdXRsaW5lOwogICAgICB9CiovCiAgICAgIGlmICh0aGlzLmZvbGRhYmxlKHRhcmdldCkpCiAgICAgIHsKICAgICAgICB0YXJnZXQuZm9sZGFibGUgPSB0cnVlOwogICAgICAgIHRhcmdldC5vbmZvY3VzID0gZnVuY3Rpb24gKCkge3czY19zbGlkeS5vdXRsaW5lID0gdGhpczt9OwogICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7dzNjX3NsaWR5Lm91dGxpbmUgPSBudWxsO307CgogICAgICAgIGlmICghdGFyZ2V0LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkKICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKCiAgICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKHRhcmdldCwgImV4cGFuZCIpKQogICAgICAgICAgdGhpcy51bmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmZvbGQodGFyZ2V0KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmFkZF9jbGFzcyh0YXJnZXQsICJub2ZvbGQiKTsKICAgICAgICB0YXJnZXQudmlzaWJsZSA9IHRydWU7CiAgICAgICAgdGFyZ2V0LmZvbGRhYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9LAoKICBmb2xkYWJsZTogZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmICghaXRlbSB8fCBpdGVtLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgbm9kZSA9IGl0ZW0uZmlyc3RDaGlsZDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKQogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICBmb2xkOiBmdW5jdGlvbiAoaXRlbSkgewogICAgaWYgKGl0ZW0pCiAgICB7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJ1bmZvbGRlZCIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhpdGVtLCAiZm9sZGVkIik7CiAgICB9CgogICAgdmFyIG5vZGUgPSBpdGVtID8gaXRlbS5maXJzdENoaWxkIDogbnVsbDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKSAvLyBlbGVtZW50CiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyhub2RlLCAiaGlkZGVuIik7CiAgICAgIH0KCiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgfQoKICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICB1bmZvbGQ6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICBpZiAoaXRlbSkKICAgIHsKICAgICAgdGhpcy5hZGRfY2xhc3MoaXRlbSwgInVuZm9sZGVkIik7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJmb2xkZWQiKTsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGl0ZW0gPyBpdGVtLmZpcnN0Q2hpbGQgOiBudWxsOwoKICAgIHdoaWxlIChub2RlKQogICAgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIHRoaXMuaXNfYmxvY2sobm9kZSkpIC8vIGVsZW1lbnQKICAgICAgewogICAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImhpZGRlbiIpOwogICAgICB9CgogICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICBpdGVtLnZpc2libGUgPSB0cnVlOwogIH0sCgogIG91dGxpbmVfY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgdmFyIHJpZ2h0Y2xpY2sgPSBmYWxzZTsKICAgIHZhciB0YXJnZXQgPSB3M2Nfc2xpZHkuZ2V0X3RhcmdldChlKTsKCiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC52aXNpYmxlID09IHVuZGVmaW5lZCkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChlLndoaWNoKQogICAgICByaWdodGNsaWNrID0gKGUud2hpY2ggPT0gMyk7CiAgICBlbHNlIGlmIChlLmJ1dHRvbikKICAgICAgcmlnaHRjbGljayA9IChlLmJ1dHRvbiA9PSAyKTsKCiAgICBpZiAoIXJpZ2h0Y2xpY2sgJiYgdGFyZ2V0LnZpc2libGUgIT0gdW5kZWZpbmVkKQogICAgewogICAgICBpZiAodGFyZ2V0LmZvbGRhYmxlKQogICAgICB7CiAgICAgICAgaWYgKHRhcmdldC52aXNpYmxlKQogICAgICAgICAgdzNjX3NsaWR5LmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHRhcmdldCk7CiAgICAgIH0KCiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgYWRkX2luaXRpYWxfcHJvbXB0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICBwcm9tcHQuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJpbml0aWFsX3Byb21wdCIpOwoKICAgIHZhciBwMSA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoInAiKTsKICAgIHByb21wdC5hcHBlbmRDaGlsZChwMSk7CiAgICBwMS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImhlbHAiKTsKCiAgICBpZiAodGhpcy5rZXlib2FyZGxlc3MpCiAgICAgIHAxLmlubmVySFRNTCA9ICJzd2lwZSBsZWZ0IHRvIG1vdmUgdG8gbmV4dCBzbGlkZSI7CiAgICBlbHNlCiAgICAgIHAxLmlubmVySFRNTCA9ICJTcGFjZSwgUmlnaHQgQXJyb3cgb3Igc3dpcGUgbGVmdCB0byBtb3ZlIHRvICIgKwogICAgICAgICAgICAgICAgICAgICAibmV4dCBzbGlkZSwgY2xpY2sgaGVscCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzIjsKCiAgICB0aGlzLmFkZF9saXN0ZW5lcihwcm9tcHQsICJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocHJvbXB0KTsKICAgICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICAKICAgICAgaWYgKGUuY2FuY2VsICE9IHVuZGVmaW5lZCkKICAgICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIAogICAgICBpZiAoZS5yZXR1cm5WYWx1ZSAhPSB1bmRlZmluZWQpCiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwcm9tcHQpOwogICAgdGhpcy5pbml0aWFsX3Byb21wdCA9IHByb21wdDsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwcm9tcHQpO30sIDUwMDApOwogIH0sCgogIGFkZF90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnRlciwgcGFnZTsKCiAgICAgdGhpcy50b29sYmFyID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICAgdGhpcy50b29sYmFyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAidG9vbGJhciIpOwoKICAgICAvLyBhIHJlYXNvbmFibHkgYmVoYXZlZCBicm93c2VyCiAgICAgaWYgKHRoaXMubnNfcG9zIHx8ICF0aGlzLmllNikKICAgICB7CiAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgICAgIHJpZ2h0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAiZmxvYXQ6IHJpZ2h0OyB0ZXh0LWFsaWduOiByaWdodCIpOwoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIikKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHJpZ2h0LmFwcGVuZENoaWxkKGNvdW50ZXIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHJpZ2h0KTsKCiAgICAgICB2YXIgbGVmdCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImRpdiIpOwogICAgICAgbGVmdC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInRleHQtYWxpZ246IGxlZnQiKTsKCiAgICAgICAvLyBnbG9iYWwgZW5kIG9mIHNsaWRlIGluZGljYXRvcgogICAgICAgdGhpcy5lb3MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICB0aGlzLmVvcy5pbm5lckhUTUwgPSAiKiAiOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZCh0aGlzLmVvcyk7CgogICAgICAgdmFyIGhlbHAgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgICBoZWxwLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHRoaXMuaGVscF9wYWdlKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRoaXMubG9jYWxpemUodGhpcy5oZWxwX3RleHQpKTsKICAgICAgIGhlbHAuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiaGVscD8iKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoaGVscCk7CiAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyAKICAgICAgIHRoaXMuaGVscF9hbmNob3IgPSBoZWxwOyAgLy8gc2F2ZSBmb3IgZm9jdXMgaGFjawoKICAgICAgIHZhciBnYXAxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoZ2FwMSk7CgogICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiYSIpOwogICAgICAgY29udGVudHMuc2V0QXR0cmlidXRlKCJocmVmIiwgImphdmFzY3JpcHQ6dzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJDb250ZW50cyIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChnYXAyKTsKCiAgICAgICB2YXIgY29weXJpZ2h0ID0gdGhpcy5maW5kX2NvcHlyaWdodCgpOwoKICAgICAgIGlmIChjb3B5cmlnaHQpCiAgICAgICB7CiAgICAgICAgIHZhciBzcGFuID0gdGhpcy5jcmVhdGVfZWxlbWVudCgic3BhbiIpOwogICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICJjb3B5cmlnaHQiOwogICAgICAgICBzcGFuLmlubmVySFRNTCA9IGNvcHlyaWdodDsKICAgICAgICAgbGVmdC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgIH0KCiAgICAgICB0aGlzLnRvb2xiYXIuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQobGVmdCk7CiAgICAgfQogICAgIGVsc2UgLy8gSUU2IHNvIG5lZWQgdG8gd29yayBhcm91bmQgaXRzIHBvb3IgQ1NTIHN1cHBvcnQKICAgICB7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUucG9zaXRpb24gPSAodGhpcy5pZTcgPyAiZml4ZWQiIDogImFic29sdXRlIik7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUuekluZGV4ID0gIjIwMCI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUud2lkdGggPSAiOTkuOSUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmhlaWdodCA9ICIxLjJlbSI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUudG9wID0gImF1dG8iOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5sZWZ0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5mb250U2l6ZSA9ICI2MCUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmNvbG9yID0gInJlZCI7CiAgICAgICB0aGlzLnRvb2xiYXIuYm9yZGVyV2lkdGggPSAwOwogICAgICAgdGhpcy50b29sYmFyLmNsYXNzTmFtZSA9ICJ0b29sYmFyIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIC8vIHdvdWxkIGxpa2UgdG8gaGF2ZSBoZWxwIHRleHQgbGVmdCBhbGlnbmVkCiAgICAgICAvLyBhbmQgcGFnZSBjb3VudGVyIHJpZ2h0IGFsaWduZWQsIGZsb2F0aW5nCiAgICAgICAvLyBkaXYncyBkb24ndCB3b3JrLCBzbyBpbnN0ZWFkIHVzZSBuZXN0ZWQKICAgICAgIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZCBkaXYncy4KCiAgICAgICB2YXIgc3AgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICBzcC5pbm5lckhUTUwgPSAiJm5ic3A7Jm5ic3A7KiZuYnNwOyI7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQoc3ApOwogICAgICAgdGhpcy5lb3MgPSBzcDsgIC8vIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKCiAgICAgICB2YXIgaGVscCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJocmVmIiwgdGhpcy5oZWxwX3BhZ2UpOwogICAgICAgaGVscC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSh0aGlzLmhlbHBfdGV4dCkpOwogICAgICAgaGVscC5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJoZWxwPyIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGhlbHApOwogICAgICAgdGhpcy5oZWxwX2FuY2hvciA9IGhlbHA7ICAvLyBzYXZlIGZvciBmb2N1cyBoYWNrCgogICAgICAgdmFyIGdhcDEgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDEpOwoKICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGNvbnRlbnRzLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJqYXZhc2NyaXB0OnRvZ2dsZVRhYmxlT2ZDb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiLmxvY2FsaXplKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJjb250ZW50cz8iKTsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDIpOwoKICAgICAgIHZhciBjb3B5cmlnaHQgPSB0aGlzLmZpbmRfY29weXJpZ2h0KCk7CgogICAgICAgaWYgKGNvcHlyaWdodCkKICAgICAgIHsKICAgICAgICAgdmFyIHNwYW4gPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gY29weXJpZ2h0OwogICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gImJsYWNrIjsKICAgICAgICAgc3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjAuNWVtIjsKICAgICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHNwYW4pOwogICAgICAgfQoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKQogICAgICAgY291bnRlci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICBjb3VudGVyLnN0eWxlLndpZHRoID0gImF1dG8iOyAvLyIyMCUiOwogICAgICAgY291bnRlci5zdHlsZS5oZWlnaHQgPSAiMS4yZW0iOwogICAgICAgY291bnRlci5zdHlsZS50b3AgPSAiYXV0byI7CiAgICAgICBjb3VudGVyLnN0eWxlLmJvdHRvbSA9IDA7CiAgICAgICBjb3VudGVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgY291bnRlci5zdHlsZS50ZXh0QWxpZ24gPSAicmlnaHQiOwogICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9ICJyZWQiOwogICAgICAgY291bnRlci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgICB9CgogICAgIC8vIGVuc3VyZSB0aGF0IGNsaWNrIGlzbid0IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwYWdlCiAgICAgdGhpcy50b29sYmFyLm9uY2xpY2sgPQogICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKCiAgICAgICAgICAgaWYgKCF0YXJnZXQgJiYgZS5zcmNFbGVtZW50KQogICAgICAgICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBTYWZhcmkgYnVnCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiYSIpCiAgICAgICAgICAgICB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX2NsaWNrKGUpOwogICAgICAgICB9OwoKICAgICB0aGlzLnNsaWRlX251bWJlcl9lbGVtZW50ID0gY291bnRlcjsKICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKGZhbHNlKTsKICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMudG9vbGJhcik7CiAgfSwKCiAgLy8gd3lzaXd5ZyBlZGl0b3JzIG1ha2UgaXQgaGFyZCB0byB1c2UgZGl2IGVsZW1lbnRzCiAgLy8gZS5nLiBhbWF5YSBsb3NlcyB0aGUgZGl2IHdoZW4geW91IGNvcHkgYW5kIHBhc3RlCiAgLy8gdGhpcyBmdW5jdGlvbiB3cmFwcyBkaXYgZWxlbWVudHMgYXJvdW5kIGltcGxpY2l0CiAgLy8gc2xpZGVzIHdoaWNoIHN0YXJ0IHdpdGggYW4gaDEgZWxlbWVudCBhbmQgY29udGludWUKICAvLyB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9yIGRpdiBlbGVtZW50CiAgd3JhcF9pbXBsaWNpdF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBpLCBoZWFkaW5nLCBub2RlLCBuZXh0LCBkaXY7CiAgICB2YXIgaGVhZGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaDEiKTsKCiAgICBpZiAoIWhlYWRpbmdzKQogICAgICByZXR1cm47CgogICAgZm9yIChpID0gMDsgaSA8IGhlYWRpbmdzLmxlbmd0aDsgKytpKQogICAgewogICAgICBoZWFkaW5nID0gaGVhZGluZ3NbaV07CgogICAgICBpZiAoaGVhZGluZy5wYXJlbnROb2RlICE9IGRvY3VtZW50LmJvZHkpCiAgICAgICAgY29udGludWU7CgogICAgICBub2RlID0gaGVhZGluZy5uZXh0U2libGluZzsKCiAgICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJzbGlkZSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlcGxhY2VDaGlsZChkaXYsIGhlYWRpbmcpOwogICAgICBkaXYuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CgogICAgICB3aGlsZSAobm9kZSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIC8vIGFuIGVsZW1lbnQKICAgICAgICB7CiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkgxIiB8fCBub2RlLm5vZGVOYW1lID09ICJoMSIpCiAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkRJViIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiZGl2IikKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAodGhpcy5oYXNfY2xhc3Mobm9kZSwgInNsaWRlIikpCiAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhub2RlLCAiaGFuZG91dCIpKQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0ID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgICBub2RlID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgIH0gCiAgICB9CiAgfSwKCiAgYXR0YWNoX3RvdWNoX2hhbmRlcnM6IGZ1bmN0aW9uKHNsaWRlcykKICB7CiAgICB2YXIgaSwgc2xpZGU7CgogICAgZm9yIChpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgc2xpZGUgPSBzbGlkZXNbaV07CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2hzdGFydCIsIHRoaXMudG91Y2hzdGFydCk7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2htb3ZlIiwgdGhpcy50b3VjaG1vdmUpOwogICAgICB0aGlzLmFkZF9saXN0ZW5lcihzbGlkZSwgInRvdWNoZW5kIiwgdGhpcy50b3VjaGVuZCk7CiAgICB9CiAgfSwKCi8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIHNsaWRlcwogIGNvbGxlY3Rfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGVzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgInNsaWRlIikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgc2xpZGUgdG8gY29sbGVjdGlvbgogICAgICAgIHNsaWRlc1tzbGlkZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gaGlkZSBlYWNoIHNsaWRlIGFzIGl0IGlzIGZvdW5kCiAgICAgICAgdGhpcy5hZGRfY2xhc3MoZGl2LCAiaGlkZGVuIik7CgogICAgICAgIC8vIGFkZCBkdW1teSA8YnIvPiBhdCBlbmQgZm9yIHNjcm9sbGluZyBoYWNrCiAgICAgICAgdmFyIG5vZGUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZTEpOwogICAgICAgIHZhciBub2RlMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIik7CiAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUyKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJiYWNrZ3JvdW5kIikpCiAgICAgIHsgIC8vIHdvcmsgYXJvdW5kIGZvciBGaXJlZm94IFNWRyByZWxvYWQgYnVnCiAgICAgICAgLy8gd2hpY2ggb3RoZXJ3aXNlIHJlcGxhY2VzIDFzdCBTVkcgZ3JhcGhpYyB3aXRoIDJuZAogICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgfQogICAgfQoKICAgIHRoaXMuc2xpZGVzID0gc2xpZGVzOwogIH0sCgogIC8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIDxkaXYgY2xhc3M9ImhhbmRvdXQiPgogIGNvbGxlY3Rfbm90ZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBub3RlcyA9IG5ldyBBcnJheSgpOwogICAgdmFyIGRpdnMgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpdnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGRpdiA9IGRpdnMuaXRlbShpKTsKCiAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJoYW5kb3V0IikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgbm90ZSB0byBjb2xsZWN0aW9uCiAgICAgICAgbm90ZXNbbm90ZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gYW5kIGhpZGUgaXQKICAgICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJoaWRkZW4iKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMubm90ZXMgPSBub3RlczsKICB9LAoKICAvLyByZXR1cm4gbmV3IGFycmF5IG9mIGFsbCA8ZGl2IGNsYXNzPSJiYWNrZ3JvdW5kIj4KICAvLyBpbmNsdWRpbmcgbmFtZWQgYmFja2dyb3VuZHMgZS5nLiBjbGFzcz0iYmFja2dyb3VuZCB0aXRsZXBhZ2UiCiAgY29sbGVjdF9iYWNrZ3JvdW5kczogZnVuY3Rpb24gKCkgewogICAgdmFyIGJhY2tncm91bmRzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgImJhY2tncm91bmQiKSkKICAgICAgewogICAgICAgIC8vIGFkZCBiYWNrZ3JvdW5kIHRvIGNvbGxlY3Rpb24KICAgICAgICBiYWNrZ3JvdW5kc1tiYWNrZ3JvdW5kcy5sZW5ndGhdID0gZGl2OwoKICAgICAgICAvLyBhbmQgaGlkZSBpdAogICAgICAgIHRoaXMuYWRkX2NsYXNzKGRpdiwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CgogICAgdGhpcy5iYWNrZ3JvdW5kcyA9IGJhY2tncm91bmRzOwogIH0sCgogIC8vIHNldCBjbGljayBoYW5kbGVycyBvbiBhbGwgYW5jaG9ycwogIHBhdGNoX2FuY2hvcnM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdzNjX3NsaWR5OwogICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgLy8gY29tcGFyZSB0aGlzLmhyZWYgd2l0aCBsb2NhdGlvbi5ocmVmCiAgICAgIC8vIGZvciBsaW5rIHRvIGFub3RoZXIgc2xpZGUgaW4gdGhpcyBkb2MKCiAgICAgIGlmIChzZWxmLnBhZ2VfYWRkcmVzcyh0aGlzLmhyZWYpID09IHNlbGYucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpKQogICAgICB7CiAgICAgICAgLy8geWVzLCBzbyBmaW5kIG5ldyBzbGlkZSBudW1iZXIKICAgICAgICB2YXIgbmV3c2xpZGVudW0gPSBzZWxmLmZpbmRfc2xpZGVfbnVtYmVyKHRoaXMuaHJlZik7CgogICAgICAgIGlmIChuZXdzbGlkZW51bSAhPSBzZWxmLnNsaWRlX251bWJlcikKICAgICAgICB7CiAgICAgICAgICB2YXIgc2xpZGUgPSBzZWxmLnNsaWRlc1tzZWxmLnNsaWRlX251bWJlcl07CiAgICAgICAgICBzZWxmLmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICAgc2VsZi5zbGlkZV9udW1iZXIgPSBuZXdzbGlkZW51bTsKICAgICAgICAgIHNsaWRlID0gc2VsZi5zbGlkZXNbc2VsZi5zbGlkZV9udW1iZXJdOwogICAgICAgICAgc2VsZi5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAgIHNlbGYuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihldmVudCk7CgovLyAgICAgIGVsc2UgaWYgKHRoaXMudGFyZ2V0ID09IG51bGwpCi8vICAgICAgICBsb2NhdGlvbi5ocmVmID0gdGhpcy5ocmVmOwoKICAgICAgdGhpcy5ibHVyKCk7CiAgICAgIHNlbGYuZGlzYWJsZV9zbGlkZV9jbGljayA9IHRydWU7CiAgICB9OwoKICAgIHZhciBhbmNob3JzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKQogICAgICAgIGFuY2hvcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBoYW5kbGVyLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhbmNob3JzW2ldLmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgaGFuZGxlcik7CiAgICB9CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBzZWUgd2hpY2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkIHZpYSBzZXRUaW1lb3V0CiAgLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZm9yIHVzZSBvZiB3M2Nfc2xpZHkgdnMgdGhpcwogIHNob3dfc2xpZGVfbnVtYmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSB3M2Nfc2xpZHkuZ2V0X3RpbWVyKCk7CiAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyX2VsZW1lbnQuaW5uZXJIVE1MID0gdGltZXIgKyB3M2Nfc2xpZHkubG9jYWxpemUoInNsaWRlIikgKyAiICIgKwogICAgICAgICAgICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICsgMSkgKyAiLyIgKyB3M2Nfc2xpZHkuc2xpZGVzLmxlbmd0aDsKICB9LAoKICAvLyBldmVyeSAyMDBtUyBjaGVjayBpZiB0aGUgbG9jYXRpb24gaGFzIGJlZW4gY2hhbmdlZCBhcyBhCiAgLy8gcmVzdWx0IG9mIHRoZSB1c2VyIGFjdGl2YXRpbmcgdGhlIEJhY2sgYnV0dG9uL21lbnUgaXRlbQogIC8vIGRvZXNuJ3Qgd29yayBmb3IgT3BlcmEgPCA5LjUKICBjaGVja19sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwoKICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID4gMCAmJiAoaGFzaCA9PSAiIiB8fCBoYXNoID09ICIjIikpCiAgICAgIHczY19zbGlkeS5nb3RvX3NsaWRlKDApOwogICAgZWxzZSBpZiAoaGFzaC5sZW5ndGggPiAyICYmIGhhc2ggIT0gIiMoIisodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSsiKSIpCiAgICB7CiAgICAgIHZhciBudW0gPSBwYXJzZUludChsb2NhdGlvbi5oYXNoLnN1YnN0cigyKSk7CgogICAgICBpZiAoIWlzTmFOKG51bSkpCiAgICAgICAgdzNjX3NsaWR5LmdvdG9fc2xpZGUobnVtLTEpOwogICAgfQoKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ICYmIHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgewogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ID4gMCkKICAgICAgICB3M2Nfc2xpZHkudGltZV9sZWZ0IC09IDIwMDsKICAgIH0gCiAgfSwKCiAgZ2V0X3RpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSAiIjsKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0KQogICAgewogICAgICB2YXIgbWlucywgc2VjczsKICAgICAgc2VjcyA9IE1hdGguZmxvb3IodzNjX3NsaWR5LnRpbWVfbGVmdC8xMDAwKTsKICAgICAgbWlucyA9IE1hdGguZmxvb3Ioc2VjcyAvIDYwKTsKICAgICAgc2VjcyA9IHNlY3MgJSA2MDsKICAgICAgdGltZXIgPSAobWlucyA/IG1pbnMrIm0iIDogIiIpICsgc2VjcyArICJzICI7CiAgICB9CgogICAgcmV0dXJuIHRpbWVyOwogIH0sCgogIC8vIHRoaXMgZG9lc24ndCBwdXNoIGxvY2F0aW9uIG9udG8gaGlzdG9yeSBzdGFjayBmb3IgSUUKICAvLyBmb3Igd2hpY2ggYSBoaWRkZW4gaWZyYW1lIGhhY2sgaXMgbmVlZGVkOiBsb2FkIHBhZ2UgaW50bwogIC8vIHRoZSBpZnJhbWUgd2l0aCBzY3JpcHQgdGhhdCBzZXQncyBwYXJlbnQncyBsb2NhdGlvbi5oYXNoCiAgLy8gYnV0IHRoYXQgd29uJ3Qgd29yayBmb3Igc3RhbmRhbG9uZSB1c2UgdW5sZXNzIHdlIGNhbgogIC8vIGNyZWF0ZSB0aGUgcGFnZSBkeW5hbWljYWxseSB2aWEgYSBqYXZhc2NyaXB0OiBVUkwKICAvLyAjIyMgdXNlIGhpc3RvcnkucHVzaFN0YXRlIGlmIGF2YWlsYWJsZQogIHNldF9sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgIHZhciB1cmkgPSB3M2Nfc2xpZHkucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpOwogICAgIHZhciBoYXNoID0gIiMoIiArICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyKzEpICsgIikiOwoKICAgICBpZiAodzNjX3NsaWR5LnNsaWRlX251bWJlciA+PSAwKQogICAgICAgdXJpID0gdXJpICsgaGFzaDsKCiAgICAgaWYgKHR5cGVvZihoaXN0b3J5LnB1c2hTdGF0ZSkgIT0gInVuZGVmaW5lZCIgJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICJmaWxlOiIpCiAgICAgewogICAgICAgZG9jdW1lbnQudGl0bGUgPSB3M2Nfc2xpZHkudGl0bGUgKyAiICgiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CiAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSgwLCBkb2N1bWVudC50aXRsZSwgaGFzaCk7CiAgICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICAgIHczY19zbGlkeS5ub3RpZnlfb2JzZXJ2ZXJzKCk7CiAgICAgICByZXR1cm47CiAgICAgfQoKICAgICBpZiAodzNjX3NsaWR5LmllICYmICh3M2Nfc2xpZHkuaWU2IHx8IHczY19zbGlkeS5pZTcpKQogICAgICAgdzNjX3NsaWR5LnB1c2hfaGFzaChoYXNoKTsKCiAgICAgaWYgKHVyaSAhPSBsb2NhdGlvbi5ocmVmKSAvLyAmJiAha2h0bWwKICAgICAgICBsb2NhdGlvbi5ocmVmID0gdXJpOwoKICAgICBpZiAodGhpcy5raHRtbCkKICAgICAgICBoYXNoID0gIigiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CgogICAgIGlmICghdGhpcy5pZSAmJiBsb2NhdGlvbi5oYXNoICE9IGhhc2ggJiYgbG9jYXRpb24uaGFzaCAhPSAiIikKICAgICAgIGxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICB3M2Nfc2xpZHkubm90aWZ5X29ic2VydmVycygpOwogIH0sCgogIG5vdGlmeV9vYnNlcnZlcnM6IGZ1bmN0aW9uICgpCiAgewogICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbdGhpcy5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICAgIHRoaXMub2JzZXJ2ZXJzW2ldKHRoaXMuc2xpZGVfbnVtYmVyKzEsIHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKS5pbm5lclRleHQsIGxvY2F0aW9uLmhyZWYpOwogIH0sCgogIGFkZF9vYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyKQogIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChvYnNlcnZlciA9PSB0aGlzLm9ic2VydmVyc1tpXSkKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7CiAgfSwKCiAgcmVtb3ZlX29ic2VydmVyOiBmdW5jdGlvbiAobykKICB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDsgKytpKQogICAgewogICAgICBpZiAob2JzZXJ2ZXIgPT0gdGhpcy5vYnNlcnZlcnNbaV0pCiAgICAgIHsKICAgICAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaSwxKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCgogIHBhZ2VfYWRkcmVzczogZnVuY3Rpb24gKHVyaSkgewogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIGlmIChpIDwgMCkKICAgICAgaSA9IHVyaS5pbmRleE9mKCIlMjMiKTsKCiAgICAvLyBjaGVjayBpZiBhbmNob3IgaXMgZW50aXJlIHBhZ2UKCiAgICBpZiAoaSA8IDApCiAgICAgIHJldHVybiB1cmk7ICAvLyB5ZXMKCiAgICByZXR1cm4gdXJpLnN1YnN0cigwLCBpKTsKICB9LAoKICAvLyBvbmx5IHVzZWQgZm9yIElFNiBhbmQgSUU3CiAgb25fZnJhbWVfbG9hZGVkOiBmdW5jdGlvbiAoaGFzaCkgewogICAgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgICB2YXIgdXJpID0gdzNjX3NsaWR5LnBhZ2VfYWRkcmVzcyhsb2NhdGlvbi5ocmVmKTsKICAgIGxvY2F0aW9uLmhyZWYgPSB1cmkgKyBoYXNoOwogIH0sCgogIC8vIGhpc3RvcnkgaGFjayB3aXRoIHRoYW5rcyB0byBCZXJ0cmFuZCBMZSBSb3kKICBwdXNoX2hhc2g6IGZ1bmN0aW9uIChoYXNoKSB7CiAgICBpZiAoaGFzaCA9PSAiIikgaGFzaCA9ICIjKDEpIjsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgIHZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaGlzdG9yeUZyYW1lIikuY29udGVudFdpbmRvdy5kb2N1bWVudDsKICAgIGRvYy5vcGVuKCJqYXZhc2NyaXB0Oic8aHRtbD48L2h0bWw+JyIpOwogICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj53aW5kb3cucGFyZW50LnczY19zbGlkeS5vbl9mcmFtZV9sb2FkZWQoJyIrCiAgICAgIChoYXNoKSArICInKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+aGVsbG8gbXVtPC9ib2R5PjwvaHRtbD4iKTsKICAgICAgZG9jLmNsb3NlKCk7CiAgfSwKCiAgLy8gZmluZCBjdXJyZW50IHNsaWRlIGJhc2VkIHVwb24gbG9jYXRpb24KICAvLyBmaXJzdCBmaW5kIHRhcmdldCBhbmNob3IgYW5kIHRoZW4gbG9vawogIC8vIGZvciBhc3NvY2lhdGVkIGRpdiBlbGVtZW50IGVuY2xvc2luZyBpdAogIC8vIGZpbmFsbHkgbWFwIHRoYXQgdG8gc2xpZGUgbnVtYmVyCiAgZmluZF9zbGlkZV9udW1iZXI6IGZ1bmN0aW9uICh1cmkpIHsKICAgIC8vIGZpcnN0IGdldCBhbmNob3IgZnJvbSBwYWdlIGxvY2F0aW9uCgogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIC8vIGNoZWNrIGlmIGFuY2hvciBpcyBlbnRpcmUgcGFnZQogICAgaWYgKGkgPCAwKQogICAgICByZXR1cm4gMDsgIC8vIHllcwoKICAgIHZhciBhbmNob3IgPSB1bmVzY2FwZSh1cmkuc3Vic3RyKGkrMSkpOwoKICAgIC8vIG5vdyB1c2UgYW5jaG9yIGFzIFhNTCBJRCB0byBmaW5kIHRhcmdldAogICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFuY2hvcik7CgogICAgaWYgKCF0YXJnZXQpCiAgICB7CiAgICAgIC8vIGRvZXMgYW5jaG9yIGxvb2sgbGlrZSAiKDIpIiBmb3Igc2xpZGUgMiA/PwogICAgICAvLyB3aGVyZSBmaXJzdCBzbGlkZSBpcyAoMSkKICAgICAgdmFyIHJlID0gL1woKFxkKStcKS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgIHZhciBudW0gPSBwYXJzZUludChhbmNob3Iuc3Vic3RyaW5nKDEsIGFuY2hvci5sZW5ndGgtMSkpOwoKICAgICAgICBpZiAobnVtID4gdGhpcy5zbGlkZXMubGVuZ3RoKQogICAgICAgICAgbnVtID0gMTsKCiAgICAgICAgaWYgKC0tbnVtIDwgMCkKICAgICAgICAgIG51bSA9IDA7CgogICAgICAgIHJldHVybiBudW07CiAgICAgIH0KCiAgICAgIC8vIGFjY2VwdCBbMl0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgIHJlID0gL1xbKFxkKStcXS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgICB2YXIgbnVtID0gcGFyc2VJbnQoYW5jaG9yLnN1YnN0cmluZygxLCBhbmNob3IubGVuZ3RoLTEpKTsKCiAgICAgICAgIGlmIChudW0gPiB0aGlzLnNsaWRlcy5sZW5ndGgpCiAgICAgICAgICAgIG51bSA9IDE7CgogICAgICAgICBpZiAoLS1udW0gPCAwKQogICAgICAgICAgICBudW0gPSAwOwoKICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgfQoKICAgICAgLy8gb2ggZGVhciB1bmtub3duIGFuY2hvcgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyBzZWFyY2ggZm9yIGVuY2xvc2luZyBzbGlkZQoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAvLyBicm93c2VyIGNvZXJjZXMgaHRtbCBlbGVtZW50cyB0byB1cHBlcmNhc2UhCiAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiZGl2IiAmJgogICAgICAgICAgICB0aGlzLmhhc19jbGFzcyh0YXJnZXQsICJzbGlkZSIpKQogICAgICB7CiAgICAgICAgLy8gZm91bmQgdGhlIHNsaWRlIGVsZW1lbnQKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgLy8gb3RoZXJ3aXNlIHRyeSBwYXJlbnQgZWxlbWVudCBpZiBhbnkKCiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgaWYgKCF0YXJnZXQpCiAgICAgIHsKICAgICAgICByZXR1cm4gMDsgICAvLyBubyBsdWNrIQogICAgICB9CiAgICB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChzbGlkZXNbaV0gPT0gdGFyZ2V0KQogICAgICAgIHJldHVybiBpOyAgLy8gc3VjY2VzcwogICAgfQoKICAgIC8vIG9oIGRlYXIgc3RpbGwgbm8gbHVjawogICAgcmV0dXJuIDA7CiAgfSwKCiAgcHJldmlvdXNfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZTsKCiAgICAgIGlmICgoaW5jcmVtZW50YWwgfHwgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9PSAwKSAmJiB3M2Nfc2xpZHkubGFzdF9zaG93biAhPSBudWxsKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkuaGlkZV9wcmV2aW91c19pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKCiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgLSAxOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICBpZiAoIXczY19zbGlkeS5uc19wb3MpCiAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgfQogIH0sCgogIG5leHRfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZSwgbGFzdCA9IHczY19zbGlkeS5sYXN0X3Nob3duOwoKICAgICAgaWYgKGluY3JlbWVudGFsIHx8IHczY19zbGlkeS5zbGlkZV9udW1iZXIgPT0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5yZXZlYWxfbmV4dF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKCiAgICAgIGlmICgoIWluY3JlbWVudGFsIHx8IHczY19zbGlkeS5sYXN0X3Nob3duID09IG51bGwpICYmCiAgICAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgKyAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlIGlmICghdzNjX3NsaWR5Lmxhc3Rfc2hvd24pCiAgICAgIHsKICAgICAgICAgaWYgKGxhc3QgJiYgaW5jcmVtZW50YWwpCiAgICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBsYXN0OwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgIH0KICB9LAoKICAvLyB0byBmaXJzdCBzbGlkZSB3aXRoIG5vdGhpbmcgcmV2ZWFsZWQKICAvLyBpLmUuIHN0YXRlIGF0IHN0YXJ0IG9mIHByZXNlbnRhdGlvbgogIGZpcnN0X3NsaWRlOiBmdW5jdGlvbiAoKSB7CiAgICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgewogICAgICAgdmFyIHNsaWRlOwoKICAgICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICE9IDApCiAgICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IDA7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgfQoKICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cygKICAgICAgICAgIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKICAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgICB9CiAgfSwKCiAgLy8gZ290byBsYXN0IHNsaWRlIHdpdGggZXZlcnl0aGluZyByZXZlYWxlZAogIC8vIGkuZS4gc3RhdGUgYXQgZW5kIG9mIHByZXNlbnRhdGlvbgogIGxhc3Rfc2xpZGU6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICB2YXIgc2xpZGU7CgogICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7IC8vcmV2ZWFsTmV4dEl0ZW0obGFzdFNob3duKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkubGFzdF9zaG93biA9PSBudWxsICYmCiAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKCiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgidmlzaWJsZSIpOwogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5wcmV2aW91c19pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgIH0KICB9LAoKCiAgLy8gIyMjIGNoZWNrIHRoaXMgYW5kIGNvbnNpZGVyIGFkZC9yZW1vdmUgY2xhc3MKICBzZXRfZW9zX3N0YXR1czogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICBpZiAodGhpcy5lb3MpCiAgICAgIHRoaXMuZW9zLnN0eWxlLmNvbG9yID0gKHN0YXRlID8gInJnYigyNDAsMjQwLDI0MCkiIDogInJlZCIpOwogIH0sCgogIC8vIGZpcnN0IHNsaWRlIGlzIDAKICBnb3RvX3NsaWRlOiBmdW5jdGlvbiAobnVtKSB7CiAgICAvL2FsZXJ0KCJnb2luZyB0byBzbGlkZSAiICsgKG51bSsxKSk7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IG51bTsKICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlX251bWJlcigpOwogIH0sCgoKICBzaG93X3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuc3luY19iYWNrZ3JvdW5kKHNsaWRlKTsKICAgIHRoaXMucmVtb3ZlX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CgogICAgLy8gd29yayBhcm91bmQgSUU5IG9iamVjdCByZW5kZXJpbmcgYnVnCiAgICBzZXRUaW1lb3V0KCJ3aW5kb3cuc2Nyb2xsVG8oMCwwKTsiLCAxKTsKICB9LAoKICBoaWRlX3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuYWRkX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CiAgfSwKCiAgc2V0X2ZvY3VzOiBmdW5jdGlvbiAoZWxlbWVudCkKICB7CiAgICBpZiAoZWxlbWVudCkKICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgZWxzZQogICAgewogICAgICB3M2Nfc2xpZHkuaGVscF9hbmNob3IuZm9jdXMoKTsKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgdzNjX3NsaWR5LmhlbHBfYW5jaG9yLmJsdXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfSwKCiAgLy8gc2hvdyBqdXN0IHRoZSBiYWNrZ3JvdW5kcyBwZXJ0aW5lbnQgdG8gdGhpcyBzbGlkZQogIC8vIHdoZW4gc2xpZGUgYmFja2dyb3VuZC1jb2xvciBpcyB0cmFuc3BhcmVudAogIC8vIHRoaXMgc2hvdWxkIG5vdyB3b3JrIHdpdGggcmdiYSBjb2xvciB2YWx1ZXMKICBzeW5jX2JhY2tncm91bmQ6IGZ1bmN0aW9uIChzbGlkZSkgewogICAgdmFyIGJhY2tncm91bmQ7CiAgICB2YXIgYmdDb2xvcjsKCiAgICBpZiAoc2xpZGUuY3VycmVudFN0eWxlKQogICAgICBiZ0NvbG9yID0gc2xpZGUuY3VycmVudFN0eWxlWyJiYWNrZ3JvdW5kQ29sb3IiXTsKICAgIGVsc2UgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3KQogICAgewogICAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShzbGlkZSxudWxsKTsKCiAgICAgIGlmIChzdHlsZXMpCiAgICAgICAgYmdDb2xvciA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIik7CiAgICAgIGVsc2UgLy8gYnJva2VuIGltcGxlbWVudGF0aW9uIHByb2JhYmx5IGR1ZSBTYWZhcmkgb3IgS29ucXVlcm9yCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJkZWZlY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q29tcHV0ZWRTdHlsZSgpIik7CiAgICAgICAgYmdDb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgYmdDb2xvciA9PSAidHJhbnNwYXJlbnQiOwoKICAgIGlmIChiZ0NvbG9yID09ICJ0cmFuc3BhcmVudCIgfHwKICAgICAgICBiZ0NvbG9yLmluZGV4T2YoInJnYmEiKSA+PSAwIHx8CiAgICAgICAgYmdDb2xvci5pbmRleE9mKCJvcGFjaXR5IikgPj0gMCkKICAgIHsKICAgICAgdmFyIHNsaWRlQ2xhc3MgPSB0aGlzLmdldF9jbGFzc19saXN0KHNsaWRlKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgICAgewogICAgICAgIGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRzW2ldOwoKICAgICAgICB2YXIgYmdDbGFzcyA9IHRoaXMuZ2V0X2NsYXNzX2xpc3QoYmFja2dyb3VuZCk7CgogICAgICAgIGlmICh0aGlzLm1hdGNoaW5nX2JhY2tncm91bmQoc2xpZGVDbGFzcywgYmdDbGFzcykpCiAgICAgICAgICB0aGlzLnJlbW92ZV9jbGFzcyhiYWNrZ3JvdW5kLCAiaGlkZGVuIik7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5hZGRfY2xhc3MoYmFja2dyb3VuZCwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CiAgICBlbHNlIC8vIGZvcmNpYmx5IGhpZGUgYWxsIGJhY2tncm91bmRzCiAgICAgIHRoaXMuaGlkZV9iYWNrZ3JvdW5kcygpOwogIH0sCgogIGhpZGVfYmFja2dyb3VuZHM6IGZ1bmN0aW9uICgpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZHNbaV07CiAgICAgIHRoaXMuYWRkX2NsYXNzKGJhY2tncm91bmQsICJoaWRkZW4iKTsKICAgIH0KICB9LAoKICAvLyBjb21wYXJlIGNsYXNzZXMgZm9yIHNsaWRlIGFuZCBiYWNrZ3JvdW5kCiAgbWF0Y2hpbmdfYmFja2dyb3VuZDogZnVuY3Rpb24gKHNsaWRlQ2xhc3MsIGJnQ2xhc3MpIHsKICAgIHZhciBpLCBjb3VudCwgcGF0dGVybiwgcmVzdWx0OwoKICAgIC8vIGRlZmluZSBwYXR0ZXJuIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgcGF0dGVybiA9IC9cdysvZzsKCiAgICAvLyBjaGVjayBiYWNrZ3JvdW5kIGNsYXNzIG5hbWVzCiAgICByZXN1bHQgPSBiZ0NsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIGZvciAoaSA9IGNvdW50ID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgaWYgKHJlc3VsdFtpXSA9PSAiaGlkZGVuIikKICAgICAgICBjb250aW51ZTsKCiAgICAgIGlmIChyZXN1bHRbaV0gPT0gImJhY2tncm91bmQiKQoJY29udGludWU7CgogICAgICArK2NvdW50OwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSAgLy8gZGVmYXVsdCBtYXRjaAogICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcyBhbmQgcGxhY2UgcmVzdWx0IGluIGFycmF5CiAgICByZXN1bHQgPSBzbGlkZUNsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIG5hbWUgaXMgcHJlc2VudCBmb3IgYmFja2dyb3VuZAogICAgZm9yIChpID0gY291bnQgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQogICAgewogICAgICBpZiAocmVzdWx0W2ldID09ICJoaWRkZW4iKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgaWYgKHRoaXMuaGFzX3Rva2VuKGJnQ2xhc3MsIHJlc3VsdFtpXSkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIHJlc2l6ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICB2YXIgd2lkdGggPSAwOwoKICAgICBpZiAoIHR5cGVvZiggd2luZG93LmlubmVyV2lkdGggKSA9PSAnbnVtYmVyJyApCiAgICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOyAgLy8gTm9uIElFIGJyb3dzZXIKICAgICBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKQogICAgICAgd2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7ICAvLyBJRTYKICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpCiAgICAgICB3aWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7IC8vIElFNAoKICAgICB2YXIgaGVpZ2h0ID0gMDsKCiAgICAgaWYgKCB0eXBlb2YoIHdpbmRvdy5pbm5lckhlaWdodCApID09ICdudW1iZXInICkKICAgICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsgIC8vIE5vbiBJRSBicm93c2VyCiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpCiAgICAgICBoZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OyAgLy8gSUU2CiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgIGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKCiAgICAgaWYgKGhlaWdodCAmJiAod2lkdGgvaGVpZ2h0ID4gMS4wNSoxMDI0Lzc2OCkpCiAgICAgewogICAgICAgd2lkdGggPSBoZWlnaHQgKiAxMDI0LjAvNzY4OwogICAgIH0KCiAgICAgLy8gSUUgZmlyZXMgb25yZXNpemUgZXZlbiB3aGVuIG9ubHkgZm9udCBzaXplIGlzIGNoYW5nZWQhCiAgICAgLy8gc28gd2UgZG8gYSBjaGVjayB0byBhdm9pZCBibG9ja2luZyA8IGFuZCA+IGFjdGlvbnMKICAgICBpZiAod2lkdGggIT0gdzNjX3NsaWR5Lmxhc3Rfd2lkdGggfHwgaGVpZ2h0ICE9IHczY19zbGlkeS5sYXN0X2hlaWdodCkKICAgICB7CiAgICAgICBpZiAod2lkdGggPj0gMTEwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSA1OyAgICAvLyA0CiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSAxMDAwKQogICAgICAgICB3M2Nfc2xpZHkuc2l6ZV9pbmRleCA9IDQ7ICAgIC8vIDMKICAgICAgIGVsc2UgaWYgKHdpZHRoID49IDgwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSAzOyAgICAvLyAyCiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSA2MDApCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMjsgICAgLy8gMQogICAgICAgZWxzZSBpZiAod2lkdGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMDsKCiAgICAgICAvLyBhZGQgaW4gZm9udCBzaXplIGFkanVzdG1lbnQgZnJvbSBtZXRhIGVsZW1lbnQgZS5nLgogICAgICAgLy8gPG1ldGEgbmFtZT0iZm9udC1zaXplLWFkanVzdG1lbnQiIGNvbnRlbnQ9Ii0yIiAvPgogICAgICAgLy8gdXNlZnVsIHdoZW4gc2xpZGVzIGhhdmUgdG9vIG11Y2ggY29udGVudCA7LSkKCiAgICAgICBpZiAoMCA8PSB3M2Nfc2xpZHkuc2l6ZV9pbmRleCArIHczY19zbGlkeS5zaXplX2FkanVzdG1lbnQgJiYKICAgICAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ICsgdzNjX3NsaWR5LnNpemVfYWRqdXN0bWVudCA8IHczY19zbGlkeS5zaXplcy5sZW5ndGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gdzNjX3NsaWR5LnNpemVfaW5kZXggKyB3M2Nfc2xpZHkuc2l6ZV9hZGp1c3RtZW50OwoKICAgICAgIC8vIGVuYWJsZXMgY3Jvc3MgYnJvd3NlciB1c2Ugb2YgcmVsYXRpdmUgd2lkdGgvaGVpZ2h0CiAgICAgICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAgICAgIHczY19zbGlkeS5hZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CgogICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuZm9udFNpemUgIT0gdzNjX3NsaWR5LnNpemVzW3czY19zbGlkeS5zaXplX2luZGV4XSkKICAgICAgIHsKICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICAgICB9CgogICAgICAgdzNjX3NsaWR5Lmxhc3Rfd2lkdGggPSB3aWR0aDsKICAgICAgIHczY19zbGlkeS5sYXN0X2hlaWdodCA9IGhlaWdodDsKCiAgICAgICAvLyBmb3JjZSByZWZsb3cgdG8gd29yayBhcm91bmQgTW96aWxsYSBidWcKICAgICAgIGlmICh3M2Nfc2xpZHkubnNfcG9zKQogICAgICAgewogICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgIH0KCiAgICAgICAvLyBmb3JjZSBjb3JyZWN0IHBvc2l0aW9uaW5nIG9mIHRvb2xiYXIKICAgICAgIHczY19zbGlkeS5yZWZyZXNoX3Rvb2xiYXIoMjAwKTsKICAgICB9CiAgfSwKCiAgc2Nyb2xsZWQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkudG9vbGJhciAmJiAhdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhhY2tfb2Zmc2V0ID0gdzNjX3NsaWR5LnNjcm9sbF94X29mZnNldCgpOwogICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICAgIC8vIG1ha2UgaXQgcmVhcHBlYXIgbGF0ZXIKICAgICAgaWYgKHczY19zbGlkeS5zY3JvbGxoYWNrID09IDAgJiYgIXczY19zbGlkeS52aWV3X2FsbCkKICAgICAgewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge3czY19zbGlkeS5zaG93X3Rvb2xiYXIoKTsgfSwgMTAwMCk7CiAgICAgICAgdzNjX3NsaWR5LnNjcm9sbGhhY2sgPSAxOwogICAgICB9CiAgICB9CiAgfSwKCiAgaGlkZV90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b29sYmFyLCAiaGlkZGVuIik7CiAgICB3aW5kb3cuZm9jdXMoKTsKICB9LAoKICAvLyB1c2VkIHRvIGVuc3VyZSBJRSByZWZyZXNoZXMgdG9vbGJhciBpbiBjb3JyZWN0IHBvc2l0aW9uCiAgcmVmcmVzaF90b29sYmFyOiBmdW5jdGlvbiAoaW50ZXJ2YWwpIHsKICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhpZGVfdG9vbGJhcigpOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHt3M2Nfc2xpZHkuc2hvd190b29sYmFyKCk7fSwgaW50ZXJ2YWwpOwogICAgfQogIH0sCgogIC8vIHJlc3RvcmVzIHRvb2xiYXIgYWZ0ZXIgc2hvcnQgZGVsYXkKICBzaG93X3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkud2FudF90b29sYmFyKQogICAgewogICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgewogICAgICAgIC8vIGFkanVzdCBwb3NpdGlvbiB0byBhbGxvdyBmb3Igc2Nyb2xsaW5nCiAgICAgICAgdmFyIHhvZmZzZXQgPSB3M2Nfc2xpZHkuc2Nyb2xsX3hfb2Zmc2V0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUubGVmdCA9IHhvZmZzZXQ7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUucmlnaHQgPSB4b2Zmc2V0OwoKICAgICAgICAvLyBkZXRlcm1pbmUgdmVydGljYWwgc2Nyb2xsIG9mZnNldAogICAgICAgIC8vdmFyIHlvZmZzZXQgPSBzY3JvbGxZT2Zmc2V0KCk7CgogICAgICAgIC8vIGJvdHRvbSBpcyBkb2MgaGVpZ2h0IC0gd2luZG93IGhlaWdodCAtIHNjcm9sbCBvZmZzZXQKICAgICAgICAvL3ZhciBib3R0b20gPSBkb2N1bWVudEhlaWdodCgpIC0gbGFzdEhlaWdodCAtIHlvZmZzZXQKCiAgICAgICAgLy9pZiAoeW9mZnNldCA+IDAgfHwgZG9jdW1lbnRIZWlnaHQoKSA+IGxhc3RIZWlnaHQpCiAgICAgICAgLy8gICBib3R0b20gKz0gMTY7ICAvLyBhbGxvdyBmb3IgaGVpZ2h0IG9mIHNjcm9sbGJhcgoKICAgICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5ib3R0b20gPSAwOyAvL2JvdHRvbTsKICAgICAgfQoKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpOwogICAgfQoKICAgIHczY19zbGlkeS5zY3JvbGxoYWNrID0gMDsKCgogICAgLy8gc2V0IHRoZSBrZXlib2FyZCBmb2N1cyB0byB0aGUgaGVscCBsaW5rIG9uIHRoZQogICAgLy8gdG9vbGJhciB0byBlbnN1cmUgdGhhdCBkb2N1bWVudCBoYXMgdGhlIGZvY3VzCiAgICAvLyBJRSBkb2Vzbid0IGFsd2F5cyB3b3JrIHdpdGggd2luZG93LmZvY3VzKCkKICAgIC8vIGFuZCB0aGlzIGhhY2sgaGFzIGJlbmVmaXQgb2YgRW50ZXIgZm9yIGhlbHAKCiAgICB0cnkKICAgIHsKICAgICAgaWYgKCF3M2Nfc2xpZHkub3BlcmEpCiAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICB9CiAgfSwKCi8vIGludm9rZWQgdmlhIEYga2V5CiAgdG9nZ2xlX3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDE7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDA7CiAgICAgIH0KICAgIH0KICB9LAoKICBzY3JvbGxfeF9vZmZzZXQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cucGFnZVhPZmZzZXQpCiAgICAgIHJldHVybiBzZWxmLnBhZ2VYT2Zmc2V0OwoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgCiAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0OwoKICAgIHJldHVybiAwOwogIH0sCgogIHNjcm9sbF95X29mZnNldDogZnVuY3Rpb24gKCkgewogICAgaWYgKHdpbmRvdy5wYWdlWU9mZnNldCkKICAgICAgcmV0dXJuIHNlbGYucGFnZVlPZmZzZXQ7CgogICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAKICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApCiAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgogICAgcmV0dXJuIDA7CiAgfSwKCiAgLy8gbG9va2luZyBmb3IgYSB3YXkgdG8gZGV0ZXJtaW5lIGhlaWdodCBvZiBzbGlkZSBjb250ZW50CiAgLy8gdGhlIHNsaWRlIGl0c2VsZiBpcyBzZXQgdG8gdGhlIGhlaWdodCBvZiB0aGUgd2luZG93CiAgb3B0aW1pemVfZm9udF9zaXplOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIC8vdmFyIGRoID0gZG9jdW1lbnRIZWlnaHQoKTsgLy9nZXREb2NIZWlnaHQoZG9jdW1lbnQpOwogICAgdmFyIGRoID0gc2xpZGUuc2Nyb2xsSGVpZ2h0OwogICAgdmFyIHdoID0gZ2V0V2luZG93SGVpZ2h0KCk7CiAgICB2YXIgdSA9IDEwMCAqIGRoIC8gd2g7CgogICAgYWxlcnQoIndpbmRvdyB1dGlsaXphdGlvbiA9ICIgKyB1ICsgIiUgKGRvYyAiCiAgICAgICsgZGggKyAiIHdpbiAiICsgd2ggKyAiKSIpOwogIH0sCgogIC8vIGZyb20gZG9jdW1lbnQgb2JqZWN0CiAgZ2V0X2RvY19oZWlnaHQ6IGZ1bmN0aW9uIChkb2MpIHsKICAgIGlmICghZG9jKQogICAgICBkb2MgPSBkb2N1bWVudDsKCiAgICBpZiAoZG9jICYmIGRvYy5ib2R5ICYmIGRvYy5ib2R5Lm9mZnNldEhlaWdodCkKICAgICAgcmV0dXJuIGRvYy5ib2R5Lm9mZnNldEhlaWdodDsgIC8vIG5zL2dlY2tvIHN5bnRheAoKICAgIGlmIChkb2MgJiYgZG9jLmJvZHkgJiYgZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0KQogICAgICByZXR1cm4gZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0OwoKICAgIGFsZXJ0KCJjb3VsZG4ndCBkZXRlcm1pbmUgZG9jdW1lbnQgaGVpZ2h0Iik7CiAgfSwKCiAgZ2V0X3dpbmRvd19oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICggdHlwZW9mKCB3aW5kb3cuaW5uZXJIZWlnaHQgKSA9PSAnbnVtYmVyJyApCiAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQ7ICAvLyBOb24gSUUgYnJvd3NlcgoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7ICAvLyBJRTYKCiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKICB9LAoKICBkb2N1bWVudF9oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzaCwgb2g7CgogICAgc2ggPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgIG9oID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7CgogICAgaWYgKHNoICYmIG9oKQogICAgewogICAgICByZXR1cm4gKHNoID4gb2ggPyBzaCA6IG9oKTsKICAgIH0KCiAgICAvLyBubyBpZGVhIQogICAgcmV0dXJuIDA7CiAgfSwKCiAgc21hbGxlcjogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5zaXplX2luZGV4ID4gMCkKICAgIHsKICAgICAgLS13M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgYmlnZ2VyOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAodzNjX3NsaWR5LnNpemVfaW5kZXggPCB3M2Nfc2xpZHkuc2l6ZXMubGVuZ3RoIC0gMSkKICAgIHsKICAgICAgKyt3M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgLy8gZW5hYmxlcyBjcm9zcyBicm93c2VyIHVzZSBvZiByZWxhdGl2ZSB3aWR0aC9oZWlnaHQKICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAvLyB3aXRoIHRoYW5rcyB0byBJdmFuIEhlcm1hbiBmb3IgdGhlIHN1Z2dlc3Rpb24KICBhZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnM6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CiAgICBmb3IoIHZhciBpID0gMDsgaSA8IHczY19zbGlkeS5vYmplY3RzLmxlbmd0aDsgaSsrICkKICAgIHsKICAgICAgdmFyIG9iaiA9IHRoaXMub2JqZWN0c1tpXTsKICAgICAgdmFyIG1pbWVUeXBlID0gb2JqLmdldEF0dHJpYnV0ZSgidHlwZSIpOwoKICAgICAgaWYgKG1pbWVUeXBlID09ICJpbWFnZS9zdmcreG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKQogICAgICB7CiAgICAgICAgaWYgKCAhb2JqLmluaXRpYWxXaWR0aCApIAogICAgICAgICAgb2JqLmluaXRpYWxXaWR0aCA9IG9iai5nZXRBdHRyaWJ1dGUoIndpZHRoIik7CgogICAgICAgIGlmICggIW9iai5pbml0aWFsSGVpZ2h0ICkgCiAgICAgICAgICBvYmouaW5pdGlhbEhlaWdodCA9IG9iai5nZXRBdHRyaWJ1dGUoImhlaWdodCIpOwoKICAgICAgICBpZiAoIG9iai5pbml0aWFsV2lkdGggJiYgb2JqLmluaXRpYWxXaWR0aC5jaGFyQXQob2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgdyA9IHBhcnNlSW50KG9iai5pbml0aWFsV2lkdGguc2xpY2UoMCwgb2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkpOwogICAgICAgICAgdmFyIG5ld1cgPSB3aWR0aCAqICh3LzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoIndpZHRoIixuZXdXKTsKICAgICAgICB9CgogICAgICAgIGlmICggb2JqLmluaXRpYWxIZWlnaHQgJiYKICAgICAgICAgICAgIG9iai5pbml0aWFsSGVpZ2h0LmNoYXJBdChvYmouaW5pdGlhbEhlaWdodC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KG9iai5pbml0aWFsSGVpZ2h0LnNsaWNlKDAsIG9iai5pbml0aWFsSGVpZ2h0Lmxlbmd0aC0xKSk7CiAgICAgICAgICB2YXIgbmV3SCA9IGhlaWdodCAqIChoLzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIG5ld0gpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIC8vIG5lZWRlZCBmb3IgT3BlcmEgdG8gaW5oaWJpdCBkZWZhdWx0IGJlaGF2aW9yCiAgLy8gc2luY2UgT3BlcmEgZGVsaXZlcnMga2V5UHJlc3MgZXZlbiBpZiBrZXlEb3duCiAgLy8gd2FzIGNhbmNlbGxlZAogIGtleV9wcmVzczogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAoIWV2ZW50KQogICAgICBldmVudCA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoIXczY19zbGlkeS5rZXlfd2FudGVkKQogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gIFNlZSBlLmcuIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzL2tleXMuaHRtbCBmb3Iga2V5Y29kZXMKICBrZXlfZG93bjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIga2V5LCB0YXJnZXQsIHRhZzsKCiAgICB3M2Nfc2xpZHkua2V5X3dhbnRlZCA9IHRydWU7CgogICAgaWYgKCFldmVudCkKICAgICAgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICB7CiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgICB0YXJnZXQgPSB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudDsKICAgIH0KICAgIGVsc2UgaWYgKGV2ZW50LndoaWNoKQogICAgewogICAgICBrZXkgPSBldmVudC53aGljaDsKICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgfQogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGF2b2lkIGludGVyZmVyaW5nIHdpdGgga2V5c3Ryb2tlCiAgICAvLyBiZWhhdmlvciBmb3Igbm9uLXNsaWR5IGNocm9tZSBlbGVtZW50cwogICAgaWYgKCF3M2Nfc2xpZHkuc2xpZHlfY2hyb21lKHRhcmdldCkgJiYKICAgICAgICB3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGNoZWNrIGZvciBjb25jdXJyZW50IGNvbnRyb2wvY29tbWFuZC9hbHQga2V5CiAgICAvLyBidXQgYXJlIHRoZXNlIG9ubHkgcHJlc2VudCBvbiBtb3VzZSBldmVudHM/CgogICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkpCiAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBkaXNtaXNzIHRhYmxlIG9mIGNvbnRlbnRzIGlmIHZpc2libGUKICAgIGlmICh3M2Nfc2xpZHkuaXNfc2hvd25fdG9jKCkgJiYga2V5ICE9IDkgJiYga2V5ICE9IDE2ICYmIGtleSAhPSAzOCAmJiBrZXkgIT0gNDApCiAgICB7CiAgICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKHRydWUpOwoKICAgICAgaWYgKGtleSA9PSAyNyB8fCBrZXkgPT0gODQgfHwga2V5ID09IDY3KQogICAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICBpZiAoa2V5ID09IDM0KSAvLyBQYWdlIERvd24KICAgIHsKICAgICAgaWYgKHczY19zbGlkeS52aWV3X2FsbCkKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKGZhbHNlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDMzKSAvLyBQYWdlIFVwCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICB3M2Nfc2xpZHkucHJldmlvdXNfc2xpZGUoZmFsc2UpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzIpIC8vIHNwYWNlIGJhcgogICAgewogICAgICB3M2Nfc2xpZHkubmV4dF9zbGlkZSh0cnVlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDM3KSAvLyBMZWZ0IGFycm93CiAgICB7CiAgICAgIHczY19zbGlkeS5wcmV2aW91c19zbGlkZSghZXZlbnQuc2hpZnRLZXkpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzYpIC8vIEhvbWUKICAgIHsKICAgICAgdzNjX3NsaWR5LmZpcnN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzNSkgLy8gRW5kCiAgICB7CiAgICAgIHczY19zbGlkeS5sYXN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzOSkgLy8gUmlnaHQgYXJyb3cKICAgIHsKICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUoIWV2ZW50LnNoaWZ0S2V5KTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDEzKSAvLyBFbnRlcgogICAgewogICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUpCiAgICAgIHsKICAgICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUudmlzaWJsZSkKICAgICAgICAgIHczY19zbGlkeS5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICAgIAogICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg4KSAgLy8gPCBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTkwKSAgLy8gPiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDE4OSB8fCBrZXkgPT0gMTA5KSAgLy8gLSBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg3IHx8IGtleSA9PSAxOTEgfHwga2V5ID09IDEwNykgIC8vID0gKyAgZm9yIGxhcmdlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuYmlnZ2VyKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4MykgIC8vIFMgZm9yIHNtYWxsZXIgZm9udHMKICAgIHsKICAgICAgdzNjX3NsaWR5LnNtYWxsZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY2KSAgLy8gQiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDkwKSAgLy8gWiBmb3IgbGFzdCBzbGlkZQogICAgewogICAgICB3M2Nfc2xpZHkubGFzdF9zbGlkZSgpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gNzApICAvLyBGIGZvciB0b2dnbGUgdG9vbGJhcgogICAgewogICAgICB3M2Nfc2xpZHkudG9nZ2xlX3Rvb2xiYXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY1KSAgLy8gQSBmb3IgdG9nZ2xlIHZpZXcgc2luZ2xlL2FsbCBzbGlkZXMKICAgIHsKICAgICAgdzNjX3NsaWR5LnRvZ2dsZV92aWV3KCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3NSkgIC8vIHRvZ2dsZSBhY3Rpb24gb2YgbGVmdCBjbGljayBmb3IgbmV4dCBwYWdlCiAgICB7CiAgICAgIHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID0gIXczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkOwogICAgICB2YXIgYWxlcnRfbXNnID0gKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID8KICAgICAgICAgICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpICsgICIgbW91c2UgY2xpY2sgYWR2YW5jZSI7CgogICAgICBhbGVydCh3M2Nfc2xpZHkubG9jYWxpemUoYWxlcnRfbXNnKSk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4NCB8fCBrZXkgPT0gNjcpICAvLyBUIG9yIEMgZm9yIHRhYmxlIG9mIGNvbnRlbnRzCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudG9jKQogICAgICAgIHczY19zbGlkeS50b2dnbGVfdGFibGVfb2ZfY29udGVudHMoKTsKCiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3MikgLy8gSCBmb3IgaGVscAogICAgewogICAgICB3aW5kb3cubG9jYXRpb24gPSB3M2Nfc2xpZHkuaGVscF9wYWdlOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICAvL2Vsc2UgYWxlcnQoImtleSBjb2RlIGlzICIrIGtleSk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gc2FmZSBmb3IgYm90aCB0ZXh0L2h0bWwgYW5kIGFwcGxpY2F0aW9uL3hodG1sK3htbAogIGNyZWF0ZV9lbGVtZW50OiBmdW5jdGlvbiAobmFtZSkgewogICAgaWYgKHRoaXMueGh0bWwgJiYgKHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgIT0gJ3VuZGVmaW5lZCcpKQogICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwgbmFtZSkKCiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKICB9LAoKICBnZXRfZWxlbWVudF9zdHlsZTogZnVuY3Rpb24gKGVsZW0sIElFU3R5bGVQcm9wLCBDU1NTdHlsZVByb3ApIHsKICAgIGlmIChlbGVtLmN1cnJlbnRTdHlsZSkKICAgIHsKICAgICAgcmV0dXJuIGVsZW0uY3VycmVudFN0eWxlW0lFU3R5bGVQcm9wXTsKICAgIH0KICAgIGVsc2UgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKQogICAgewogICAgICB2YXIgY29tcFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgIiIpOwogICAgICByZXR1cm4gY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoQ1NTU3R5bGVQcm9wKTsKICAgIH0KICAgIHJldHVybiAiIjsKICB9LAoKICAvLyB0aGUgc3RyaW5nIHN0ciBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zCiAgLy8gdGVzdCBpZiBzdHIgY29udGFpbnMgYSBwYXJ0aWN1bGFyIHRva2VuLCBlLmcuICJzbGlkZSIKICBoYXNfdG9rZW46IGZ1bmN0aW9uIChzdHIsIHRva2VuKSB7CiAgICBpZiAoc3RyKQogICAgewogICAgICAvLyBkZWZpbmUgcGF0dGVybiBhcyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgdmFyIHBhdHRlcm4gPSAvXHcrL2c7CgogICAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcwogICAgICAvLyBwbGFjZSByZXN1bHQgaW4gYXJyYXkKICAgICAgdmFyIHJlc3VsdCA9IHN0ci5tYXRjaChwYXR0ZXJuKTsKCiAgICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIHRva2VuIGlzIHByZXNlbnQKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCiAgICAgIHsKICAgICAgICBpZiAocmVzdWx0W2ldID09IHRva2VuKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgZ2V0X2NsYXNzX2xpc3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gZWxlbWVudC5jbGFzc05hbWU7CgogICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogIH0sCgogIGhhc19jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgiKF58ICkiICsgbmFtZSArICJcVyoiKTsKCiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gcmVnZXhwLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpOwoKICAgIHJldHVybiByZWdleHAudGVzdChlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7CiAgfSwKCiAgcmVtb3ZlX2NsYXNzOiBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkgewogICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoIihefCApIiArIG5hbWUgKyAiXFcqIik7CiAgICB2YXIgY2xzdmFsID0gIiI7CgogICAgaWYgKHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSAhPSAndW5kZWZpbmVkJykKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5jbGFzc05hbWU7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBjbHN2YWw7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xzdmFsKTsKICAgICAgfQogICAgfQogIH0sCgogIGFkZF9jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmICghdGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgbmFtZSkpCiAgICB7CiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgIT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gIiAiICsgbmFtZTsKICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdmFyIGNsc3ZhbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogICAgICAgIGNsc3ZhbCA9IGNsc3ZhbCA/IGNsc3ZhbCArICIgIiArIG5hbWUgOiBuYW1lOwogICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGNsc3ZhbCk7CiAgICAgIH0KICAgIH0KICB9LAoKICAvLyBIVE1MIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBjbGFzcz0iaW5jcmVtZW50YWwiCiAgLy8gbm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBwdXQgdGhlIGNsYXNzIG9uIGNvbnRhaW5lcnMgbGlrZQogIC8vIHVwLCBvbCwgZGwsIGFuZCBkaXYgdG8gbWFrZSB0aGVpciBjb250ZW50cyBhcHBlYXIKICAvLyBpbmNyZW1lbnRhbGx5LiBVcHBlciBjYXNlIGlzIHVzZWQgc2luY2UgdGhpcyBpcyB3aGF0CiAgLy8gYnJvd3NlcnMgcmVwb3J0IGZvciBIVE1MIG5vZGUgbmFtZXMgKHRleHQvaHRtbCkuCiAgaW5jcmVtZW50YWxfZWxlbWVudHM6IG51bGwsCiAgb2theV9mb3JfaW5jcmVtZW50YWw6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICBpZiAoIXRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMpCiAgICB7CiAgICAgIHZhciBpbmNsaXN0ID0gbmV3IEFycmF5KCk7CiAgICAgIGluY2xpc3RbInAiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInByZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsibGkiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImJsb2NrcXVvdGUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImR0Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJkZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImgzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJoNCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImg2Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJzcGFuIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJhZGRyZXNzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0YWJsZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsidHIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInRoIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0ZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaW1nIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJvYmplY3QiXSA9IHRydWU7CiAgICAgIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMgPSBpbmNsaXN0OwogICAgfQogICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHNbbmFtZS50b0xvd2VyQ2FzZSgpXTsKICB9LAoKICBuZXh0X2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkubmV4dF9ub2RlKHNsaWRlLCBub2RlKTsKCiAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IG51bGwpCiAgICAgICAgYnJlYWs7CgogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSAgLy8gRUxFTUVOVAogICAgICB7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gYnIpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgImluY3JlbWVudGFsIikKICAgICAgICAgICAgICYmIHczY19zbGlkeS5va2F5X2Zvcl9pbmNyZW1lbnRhbChub2RlLm5vZGVOYW1lKSkKICAgICAgICAgIHJldHVybiBub2RlOwoKICAgICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLnBhcmVudE5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiAhdzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLCAibm9uLWluY3JlbWVudGFsIikpCiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0sCgogIHByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkucHJldmlvdXNfbm9kZShzbGlkZSwgbm9kZSk7CgogICAgICBpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUucGFyZW50Tm9kZSA9PSBudWxsKQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IGJyKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIGlmICh3M2Nfc2xpZHkuaGFzX2NsYXNzKG5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiB3M2Nfc2xpZHkub2theV9mb3JfaW5jcmVtZW50YWwobm9kZS5ub2RlTmFtZSkpCiAgICAgICAgICByZXR1cm4gbm9kZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZS5wYXJlbnROb2RlLCAiaW5jcmVtZW50YWwiKQogICAgICAgICAgICAgJiYgIXczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgIm5vbi1pbmNyZW1lbnRhbCIpKQogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9LAoKICAvLyBzZXQgdmlzaWJpbGl0eSBmb3IgYWxsIGVsZW1lbnRzIG9uIGN1cnJlbnQgc2xpZGUgd2l0aAogIC8vIGEgcGFyZW50IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGUgY2xhc3M9ImluY3JlbWVudGFsIgogIHNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMubmV4dF9pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwoKICAgIGlmICh2YWx1ZSA9PSAiaGlkZGVuIikKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogICAgZWxzZSAvLyB2YWx1ZSA9PSAidmlzaWJsZSIKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkucmVtb3ZlX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogIH0sCgogIC8vIHJldmVhbCB0aGUgbmV4dCBoaWRkZW4gaXRlbSBvbiB0aGUgc2xpZGUKICAvLyBub2RlIGlzIG51bGwgb3IgdGhlIG5vZGUgdGhhdCB3YXMgbGFzdCByZXZlYWxlZAogIHJldmVhbF9uZXh0X2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKCiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiBub2RlOwogIH0sCgogIC8vIGV4YWN0IGludmVyc2Ugb2YgcmV2ZWFsTmV4dEl0ZW0obm9kZSkKICBoaWRlX3ByZXZpb3VzX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5hZGRfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obm9kZSk7CiAgfSwKCiAgLy8gbGVmdCB0byByaWdodCB0cmF2ZXJzYWwgb2Ygcm9vdCdzIGNvbnRlbnQKICBuZXh0X25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgICByZXR1cm4gcm9vdC5maXJzdENoaWxkOwoKICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpCiAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQ7CgogICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpCiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CgogICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PSByb290KQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5uZXh0U2libGluZykKICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9LAoKICAvLyByaWdodCB0byBsZWZ0IHRyYXZlcnNhbCBvZiByb290J3MgY29udGVudAogIHByZXZpb3VzX25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgewogICAgICBub2RlID0gcm9vdC5sYXN0Q2hpbGQ7CgogICAgICBpZiAobm9kZSkKICAgICAgewogICAgICAgIHdoaWxlIChub2RlLmxhc3RDaGlsZCkKICAgICAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDsKICAgICAgfQoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucHJldmlvdXNTaWJsaW5nKQogICAgewogICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CgogICAgICB3aGlsZSAobm9kZS5sYXN0Q2hpbGQpCiAgICAgICAgbm9kZSA9IG5vZGUubGFzdENoaWxkOwoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPSByb290KQogICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlOwoKICAgIHJldHVybiBudWxsOwogIH0sCgogIHByZXZpb3VzX3NpYmxpbmdfZWxlbWVudDogZnVuY3Rpb24gKGVsKSB7CiAgICBlbCA9IGVsLnByZXZpb3VzU2libGluZzsKCiAgICB3aGlsZSAoZWwgJiYgZWwubm9kZVR5cGUgIT0gMSkKICAgICAgZWwgPSBlbC5wcmV2aW91c1NpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIG5leHRfc2libGluZ19lbGVtZW50OiBmdW5jdGlvbiAoZWwpIHsKICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKGVsICYmIGVsLm5vZGVUeXBlICE9IDEpCiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIGZpcnN0X2NoaWxkX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbCkgewogICAgdmFyIG5vZGU7CgogICAgZm9yIChub2RlID0gZWwuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgZmlyc3RfdGFnOiBmdW5jdGlvbiAoZWxlbWVudCwgdGFnKSB7CiAgICB2YXIgbm9kZTsKCiAgICBpZiAoIXRoaXMuaXNfeGh0bWwpCiAgICAgIHRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpOwoKICAgIGZvciAobm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5ub2RlTmFtZSA9PSB0YWcpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgaGlkZV9zZWxlY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSAvLyBGaXJlZm94LCBDaHJvbWl1bSwgU2FmYXJpLCBPcGVyYQogICAgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwoKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkKICAgICAgewogICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgIHJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgLy8gSW50ZXJuZXQgRXhwbG9yZXIKICAgIHsKICAgICAgdmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSAoKTsKICAgICAgdGV4dFJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICB9CiAgfSwKCiAgZ2V0X3NlbGVjdGVkX3RleHQ6IGZ1bmN0aW9uICgpIHsKICAgIHRyeQogICAgewogICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikKICAgICAgICByZXR1cm4gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7CgogICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKQogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpOwoKICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikKICAgICAgICByZXR1cm4gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKICAgIH0KICAgIGNhdGNoIChlKQogICAgewogICAgfQoKICAgIHJldHVybiAiIjsKICB9LAoKICAvLyBtYWtlIG5vdGUgb2YgbGVuZ3RoIG9mIHNlbGVjdGVkIHRleHQKICAvLyBhcyB0aGlzIGV2YWx1YXRlcyB0byB6ZXJvIGluIGNsaWNrIGV2ZW50CiAgbW91c2VfYnV0dG9uX3VwOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogIH0sCgogIG1vdXNlX2J1dHRvbl9kb3duOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogICAgdzNjX3NsaWR5Lm1vdXNlX3ggPSBlLmNsaWVudFg7CiAgICB3M2Nfc2xpZHkubW91c2VfeSA9IGUuY2xpZW50WTsKICB9LAoKICAvLyByaWdodCBtb3VzZSBidXR0b24gY2xpY2sgaXMgcmVzZXJ2ZWQgZm9yIGNvbnRleHQgbWVudXMKICAvLyBpdCBpcyBtb3JlIHJlbGlhYmxlIHRvIGRldGVjdCByaWdodGNsaWNrIHRoYW4gbGVmdGNsaWNrCiAgbW91c2VfYnV0dG9uX2NsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFlKQogICAgICB2YXIgZSA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC13M2Nfc2xpZHkubW91c2VfeCkgKwogICAgICAgIE1hdGguYWJzKGUuY2xpZW50WSAtdzNjX3NsaWR5Lm1vdXNlX3kpID4gMTApCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPiAwKQogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgcmlnaHRjbGljayA9IGZhbHNlOwogICAgdmFyIGxlZnRjbGljayA9IGZhbHNlOwogICAgdmFyIG1pZGRsZWNsaWNrID0gZmFsc2U7CiAgICB2YXIgdGFyZ2V0OwoKICAgIGlmICghZSkKICAgICAgdmFyIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIC8vIHdvcmsgYXJvdW5kIFNhZmFyaSBidWcKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKGUud2hpY2gpIC8vIGFsbCBicm93c2VycyBleGNlcHQgSUUKICAgIHsKICAgICAgbGVmdGNsaWNrID0gKGUud2hpY2ggPT0gMSk7CiAgICAgIG1pZGRsZWNsaWNrID0gKGUud2hpY2ggPT0gMik7CiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS53aGljaCA9PSAzKTsKICAgIH0KICAgIGVsc2UgaWYgKGUuYnV0dG9uKQogICAgewogICAgICAvLyBLb25xdWVyb3IgZ2l2ZXMgMSBmb3IgbGVmdCwgNCBmb3IgbWlkZGxlCiAgICAgIC8vIElFNiBnaXZlcyAwIGZvciBsZWZ0IGFuZCBub3QgMSBhcyBJIGV4cGVjdGVkCgogICAgICBpZiAoZS5idXR0b24gPT0gNCkKICAgICAgICBtaWRkbGVjbGljayA9IHRydWU7CgogICAgICAvLyBhbGwgYnJvd3NlcnMgYWdyZWUgb24gMiBmb3IgcmlnaHQgYnV0dG9uCiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS5idXR0b24gPT0gMik7CiAgICB9CiAgICBlbHNlCiAgICAgIGxlZnRjbGljayA9IHRydWU7CgogICAgaWYgKHczY19zbGlkeS5zZWxlY3RlZF90ZXh0X2xlbiA+IDApCiAgICB7CiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGRpc21pc3MgdGFibGUgb2YgY29udGVudHMKICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKGZhbHNlKTsKCiAgICAvLyBjaGVjayBpZiB0YXJnZXQgaXMgc29tZXRoaW5nIHRoYXQgcHJvYmFibHkgd2FudCdzIGNsaWNrcwogICAgLy8gZS5nLiBhLCBlbWJlZCwgb2JqZWN0LCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgb3B0aW9uCiAgICB2YXIgdGFnID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgaWYgKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkICYmIGxlZnRjbGljayAmJgogICAgICAgICF3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkgJiYKICAgICAgICAhdGFyZ2V0Lm9uY2xpY2spCiAgICB7CiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKHRydWUpOwogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgICAgZS5jYW5jZWwgPSB0cnVlOwogICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBzcGVjaWFsX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgIm5vbi1pbnRlcmFjdGl2ZSIpKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgdmFyIHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gZWxlbWVudC5vbmtleWRvd24gfHwKICAgICAgZWxlbWVudC5vbmNsaWNrIHx8CiAgICAgIHRhZyA9PSAiYSIgfHwKICAgICAgdGFnID09ICJlbWJlZCIgfHwKICAgICAgdGFnID09ICJvYmplY3QiIHx8CiAgICAgIHRhZyA9PSAidmlkZW8iIHx8CiAgICAgIHRhZyA9PSAiYXVkaW8iIHx8CiAgICAgIHRhZyA9PSAic3ZnIiB8fAogICAgICB0YWcgPT0gImNhbnZhcyIgfHwKICAgICAgdGFnID09ICJpbnB1dCIgfHwKICAgICAgdGFnID09ICJ0ZXh0YXJlYSIgfHwKICAgICAgdGFnID09ICJzZWxlY3QiIHx8CiAgICAgIHRhZyA9PSAib3B0aW9uIjsKICB9LAoKICBzbGlkeV9jaHJvbWU6IGZ1bmN0aW9uIChlbCkgewogICAgd2hpbGUgKGVsKQogICAgewogICAgICBpZiAoZWwgPT0gdzNjX3NsaWR5LnRvYyB8fAogICAgICAgICAgZWwgPT0gdzNjX3NsaWR5LnRvb2xiYXIgfHwKICAgICAgICAgIHczY19zbGlkeS5oYXNfY2xhc3MoZWwsICJvdXRsaW5lIikpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGdldF9rZXk6IGZ1bmN0aW9uIChlKQogIHsKICAgIHZhciBrZXk7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKICAgIGVsc2UgaWYgKGUud2hpY2gpCiAgICAgIGtleSA9IGUud2hpY2g7CgogICAgcmV0dXJuIGtleTsKICB9LAoKICBnZXRfdGFyZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgdmFyIHRhcmdldDsKCiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgIT0gMSkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgcmV0dXJuIHRhcmdldDsKICB9LAoKICAvLyBkb2VzIGRpc3BsYXkgcHJvcGVydHkgcHJvdmlkZSBjb3JyZWN0IGRlZmF1bHRzPwogIGlzX2Jsb2NrOiBmdW5jdGlvbiAoZWxlbSkgewogICAgdmFyIHRhZyA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gdGFnID09ICJvbCIgfHwgdGFnID09ICJ1bCIgfHwgdGFnID09ICJwIiB8fCB0YWcgPT0gImRsIiB8fAogICAgICAgICAgIHRhZyA9PSAibGkiIHx8IHRhZyA9PSAidGFibGUiIHx8IHRhZyA9PSAicHJlIiB8fAogICAgICAgICAgIHRhZyA9PSAiaDEiIHx8IHRhZyA9PSAiaDIiIHx8IHRhZyA9PSAiaDMiIHx8CiAgICAgICAgICAgdGFnID09ICJoNCIgfHwgdGFnID09ICJoNSIgfHwgdGFnID09ICJoNiIgfHwKICAgICAgICAgICB0YWcgPT0gImJsb2NrcXVvdGUiIHx8IHRhZyA9PSAiYWRkcmVzcyI7IAogIH0sCgogIGFkZF9saXN0ZW5lcjogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKSB7CiAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpCiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpOwogICAgZWxzZQogICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIrZXZlbnQsIGhhbmRsZXIpOwogIH0sCgogIC8vIHVzZWQgdG8gcHJldmVudCBldmVudCBwcm9wYWdhdGlvbiBmcm9tIGZpZWxkIGNvbnRyb2xzCiAgc3RvcF9wcm9wYWdhdGlvbjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBldmVudCA9IGV2ZW50ID8gZXZlbnQgOiB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOyAgLy8gZm9yIElFCgogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgY2FuY2VsOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIGlmIChldmVudCkKICAgIHsKICAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7CiAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwoKICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgogICAgdzNjX3NsaWR5LmtleV93YW50ZWQgPSBmYWxzZTsKICAgIHJldHVybiBmYWxzZTsKICB9LAoKLy8gZm9yIGVhY2ggbGFuZ3VhZ2UgZGVmaW5lIGFuIGFzc29jaWF0aXZlIGFycmF5Ci8vIGFuZCBhbHNvIHRoZSBoZWxwIHRleHQgd2hpY2ggaXMgbG9uZ2VyCgogIHN0cmluZ3NfZXM6IHsKICAgICJzbGlkZSI6InDDoWcuIiwKICAgICJoZWxwPyI6IkF5dWRhIiwKICAgICJjb250ZW50cz8iOiLDjW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6InRhYmxhIGRlIGNvbnRlbmlkb3MiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiVGFibGEgZGUgQ29udGVuaWRvcyIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZWluaWNpYXIgcHJlc2VudGFjacOzbiIsCiAgICAicmVzdGFydD8iOiJJbmljaW8iCiAgfSwKICBoZWxwX2VzOgogICAgIlV0aWxpY2UgZWwgcmF0w7NuLCBiYXJyYSBlc3BhY2lhZG9yYSwgdGVjbGFzIEl6ZGEvRGNoYSwgIiArCiAgICAibyBSZSBww6FnIHkgQXYgcMOhZy4gVXNlIFMgeSBCIHBhcmEgY2FtYmlhciBlbCB0YW1hw7FvIGRlIGZ1ZW50ZS4iLAoKICBzdHJpbmdzX2NhOiB7CiAgICAic2xpZGUiOiJww6BnLi4iLAogICAgImhlbHA/IjoiQWp1ZGEiLAogICAgImNvbnRlbnRzPyI6IsONbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YXVsYSBkZSBjb250aW5ndXRzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhdWxhIGRlIENvbnRpbmd1dHMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVpbmljaWFyIHByZXNlbnRhY2nDsyIsCiAgICAicmVzdGFydD8iOiJJbmljaSIKICB9LAogIGhlbHBfY2E6CiAgICAiVXRpbGl0emkgZWwgcmF0b2zDrSwgYmFycmEgZXNwYWlhZG9yYSwgdGVjbGVzIEVzcS4vRHRhLiAiICsKICAgICJvIFJlIHDDoGcgeSBBdiBww6BnLiBVc2kgUyBpIEIgcGVyIGNhbnZpYXIgZ3JhbmTDoHJpYSBkZSBmb250LiIsCgogIHN0cmluZ3NfY3M6IHsKICAgICJzbGlkZSI6InNuw61tZWsiLAogICAgImhlbHA/IjoibsOhcG92xJtkYSIsCiAgICAiY29udGVudHM/Ijoib2JzYWgiLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoib2JzYWggcHJlemVudGFjZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJPYnNhaCBwcmV6ZW50YWNlIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6Inpub3Z1IHNwdXN0aXQgcHJlemVudGFjaSIsCiAgICAicmVzdGFydD8iOiJyZXN0YXJ0IgogIH0sCiAgaGVscF9jczoKICAgICJQcmV6ZW50YWNpIG3Fr8W+ZXRlIHByb2Now6F6ZXQgcG9tb2PDrSBrbGlrbnV0w60gbXnFoWksIG1lemVybsOta3UsICIgKwogICAgIsWhaXBlayB2bGV2byBhIHZwcmF2byBuZWJvIGtsw6F2ZXMgUGFnZVVwIGEgUGFnZURvd24uIFDDrXNtbyBzZSAiICsKICAgICJkw6EgenbEm3TFoWl0IGEgem1lbsWhaXQgcG9tb2PDrSBrbMOhdmVzIEIgYSBTLiIsCgogIHN0cmluZ3Nfbmw6IHsKICAgICJzbGlkZSI6InBhZ2luYSIsCiAgICAiaGVscD8iOiJIZWxwPyIsCiAgICAiY29udGVudHM/IjoiSW5ob3VkPyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbmhvdWRzb3BnYXZlIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IkluaG91ZHNvcGdhdmUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiaGVyc3RhcnQgcHJlc2VudGF0aWUiLAogICAgInJlc3RhcnQ/IjoiSGVyc3RhcnQ/IgogIH0sCiAgaGVscF9ubDoKICAgICAiTmF2aWdlZXIgZC5tLnYuIGhldCBtdWlzLCBzcGF0aWViYXIsIExpbmtzL1JlY2h0cyB0b2V0c2VuLCAiICsKICAgICAib2YgUGdVcCBlbiBQZ0RuLiBHZWJydWlrIFMgZW4gQiBvbSBkZSBrYXJha3Rlcmdyb290dGUgdGUgdmVyYW5kZXJlbi4iLAoKICBzdHJpbmdzX2RlOiB7CiAgICAic2xpZGUiOiJTZWl0ZSIsCiAgICAiaGVscD8iOiJIaWxmZSIsCiAgICAiY29udGVudHM/Ijoiw5xiZXJzaWNodCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJJbmhhbHRzdmVyemVpY2huaXMiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiSW5oYWx0c3ZlcnplaWNobmlzIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IlByw6RzZW50YXRpb24gbmV1IHN0YXJ0ZW4iLAogICAgInJlc3RhcnQ/IjoiTmV1c3RhcnQiCiAgfSwKICBoZWxwX2RlOgogICAgIkJlbnV0emVuIFNpZSBkaWUgTWF1cywgTGVlcnNjaGxhZywgZGllIEN1cnNvcnRhc3RlbiBsaW5rcy9yZWNodHMgb2RlciAiICsKICAgICJQYWdlIHVwL1BhZ2UgRG93biB6dW0gV2VjaHNlbG4gZGVyIFNlaXRlbiB1bmQgUyB1bmQgQiBmw7xyIGRpZSBTY2hyaWZ0Z3LDtnNzZS4iLAoKICBzdHJpbmdzX3BsOiB7CiAgICAic2xpZGUiOiJzbGFqZCIsCiAgICAiaGVscD8iOiJwb21vYz8iLAogICAgImNvbnRlbnRzPyI6InNwaXMgdHJlxZtjaT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoic3BpcyB0cmXFm2NpIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlNwaXMgVHJlxZtjaSIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZXN0YXJ0dWogcHJlemVudGFjasSZIiwKICAgICJyZXN0YXJ0PyI6InJlc3RhcnQ/IgogIH0sCiAgaGVscF9wbDoKICAgICJabWllbmlhaiBzbGFqZHkga2xpa2FqxIVjIG15c3rEhSwgbmFjaXNrYWrEhWMgc3BhY2rEmSwgc3RyemHFgmtpIGxld28vcHJhd28iICsKICAgICJsdWIgUGdVcCAvIFBnRG4uIFXFvHlqIGtsYXdpc3p5IFMgaSBCLCBhYnkgem1pZW5pxIcgcm96bWlhciBjemN6aW9ua2kuIiwKCiAgc3RyaW5nc19mcjogewogICAgInNsaWRlIjoicGFnZSIsCiAgICAiaGVscD8iOiJBaWRlIiwKICAgICJjb250ZW50cz8iOiJJbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YWJsZSBkZXMgbWF0acOocmVzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhYmxlIGRlcyBtYXRpw6hyZXMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVjb21tZW5jZXIgbCdleHBvc8OpIiwKICAgICJyZXN0YXJ0PyI6IkTDqWJ1dCIKICB9LAogIGhlbHBfZnI6CiAgICAiTmF2aWd1ZXogYXZlYyBsYSBzb3VyaXMsIGxhIGJhcnJlIGQnZXNwYWNlLCBsZXMgZmzDqGNoZXMgIiArCiAgICAiZ2F1Y2hlL2Ryb2l0ZSBvdSBsZXMgdG91Y2hlcyBQZyBVcCwgUGcgRG4uIFV0aWxpc2V6ICIgKwogICAgImxlcyB0b3VjaGVzIFMgZXQgQiBwb3VyIG1vZGlmaWVyIGxhIHRhaWxsZSBkZSBsYSBwb2xpY2UuIiwKCiAgc3RyaW5nc19odTogewogICAgInNsaWRlIjoib2xkYWwiLAogICAgImhlbHA/Ijoic2Vnw610c8OpZyIsCiAgICAiY29udGVudHM/IjoidGFydGFsb20iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoidGFydGFsb21qZWd5esOpayIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJUYXJ0YWxvbWplZ3l6w6lrIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6ImJlbXV0YXTDsyDDumpyYWluZMOtdMOhc2EiLAogICAgInJlc3RhcnQ/Ijoiw7pqcmFpbmTDrXTDoXMiCiAgfSwKICBoZWxwX2h1OgogICAgIkF6IG9sZGFsYWsga8O2enRpIGzDqXBrZWTDqXNoZXoga2F0dGludHNvbiBheiBlZ8OpcnJlbCwgdmFneSAiICsKICAgICJoYXN6bsOhbGphIGEgc3rDs2vDtnosIGEgYmFsLCB2YWd5IGEgam9iYiBuecOtbCwgaWxsZXR2ZSBhIFBhZ2UgRG93biwgIiArCiAgICAiUGFnZSBVcCBiaWxsZW50ecWxa2V0LiBBeiBTIMOpcyBhIEIgYmlsbGVudHnFsWtrZWwgdsOhbHRvenRhdGhhdGphICIgKwogICAgImEgc3rDtnZlZyBtw6lyZXTDqXQuIiwKCiAgc3RyaW5nc19pdDogewogICAgInNsaWRlIjoicGFnLiIsCiAgICAiaGVscD8iOiJBaXV0byIsCiAgICAiY29udGVudHM/IjoiSW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6ImluZGljZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJJbmRpY2UiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmljb21pbmNpYXJlIGxhIHByZXNlbnRhemlvbmUiLAogICAgInJlc3RhcnQ/IjoiSW5pemlvIgogIH0sCiAgaGVscF9pdDoKICAgICJOYXZpZ2FyZSBjb24gbW91c2UsIGJhcnJhIHNwYXppbywgZnJlY2NlIHNpbmlzdHJhL2Rlc3RyYSBvICIgKwogICAgIlBnVXAgZSBQZ0RuLiBVc2FyZSBTIGUgQiBwZXIgY2FtYmlhcmUgbGEgZGltZW5zaW9uZSBkZWkgY2FyYXR0ZXJpLiIsCgogIHN0cmluZ3NfZWw6IHsKICAgICJzbGlkZSI6Is+DzrXOu86vzrTOsSIsCiAgICAiaGVscD8iOiLOss6/zq7OuM61zrnOsTsiLAogICAgImNvbnRlbnRzPyI6Is+AzrXPgc65zrXPh8+MzrzOtc69zrE7IiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6Is+Azq/Ovc6xzrrOsc+CIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiLOoM6vzr3Osc66zrHPgiDOoM61z4HOuc61z4fOv868zq3Ovc+Jzr0iLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoizrXPgM6xzr3Otc66zrrOr869zrfPg863IM+AzrHPgc6/z4XPg86vzrHPg863z4IiLAogICAgInJlc3RhcnQ/IjoizrXPgM6xzr3Otc66zrrOr869zrfPg863OyIKICB9LAogIGhlbHBfZWw6CiAgICAizqDOu86/zrfOs863zrjOtc6vz4TOtSDOvM61IM+Ezr8gzrrOu86vzrogz4TOv8+FIM+Azr/Ovc+EzrnOus65zr/PjSwgz4TOvyBzcGFjZSwgz4TOsSDOss6tzrvOtyDOsc+BzrnPg8+EzrXPgc6sL860zrXOvs65zqwsICIgKwogICAgIs6uIFBhZ2UgVXAgzrrOsc65IFBhZ2UgRG93bi4gzqfPgc63z4POuc68zr/PgM6/zrnOrs+Dz4TOtSDPhM6xIM+AzrvOrs66z4TPgc6xIFMgzrrOsc65IEIgzrPOuc6xIM69zrEgzrHOu867zqzOvs61z4TOtSAiICsKICAgICLPhM6/IM68zq3Os861zrjOv8+CIM+EzrfPgiDOs8+BzrHOvM68zrHPhM6/z4POtc65z4HOrM+CLiIsCgogIHN0cmluZ3NfamE6IHsKICAgICJzbGlkZSI6IuOCueODqeOCpOODiSIsCiAgICAiaGVscD8iOiLjg5jjg6vjg5ciLAogICAgImNvbnRlbnRzPyI6IuebruasoSIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67mrKHjgpLooajnpLoiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5qyhIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IuacgOWIneOBi+OCieWGjeeUnyIsCiAgICAicmVzdGFydD8iOiLmnIDliJ3jgYvjgokiCiAgfSwKICBoZWxwX2phOgogICAgICLjg57jgqbjgrnlt6bjgq/jg6rjg4Pjgq8g44O7IOOCueODmuODvOOCuSDjg7sg5bem5Y+z44Kt44O8ICIgKwogICAgICLjgb7jgZ/jga8gUGFnZSBVcCDjg7sgUGFnZSBEb3du44Gn5pON5L2c77yMIFMg44O7IELjgafjg5Xjgqnjg7Pjg4jjgrXjgqTjgrrlpInmm7QiLAoKICBzdHJpbmdzX3poOiB7CiAgICAic2xpZGUiOiLlubvnga/niYciLAogICAgImhlbHA/Ijoi5biu5YqpPyIsCiAgICAiY29udGVudHM/Ijoi5YaF5a65PyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67lvZUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5b2VIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IumHjeaWsOWQr+WKqOWxleekuiIsCiAgICAicmVzdGFydD8iOiLph43mlrDlkK/liqg/IgogIH0sCiAgaGVscF96aDoKICAgICLnlKjpvKDmoIfngrnlh7ssIOepuuagvOadoSwg5bem5Y+z566t5aS0LCBQZyBVcCDlkowgUGcgRG4g5a+86IiqLiAiICsKICAgICLnlKggUywgQiDmlLnlj5jlrZfkvZPlpKflsI8uIiwKCiAgc3RyaW5nc19ydTogewogICAgInNsaWRlIjoi0YHQu9Cw0LnQtCIsCiAgICAiaGVscD8iOiLQv9C+0LzQvtGJ0Yw/IiwKICAgICJjb250ZW50cz8iOiLRgdC+0LTQtdGA0LbQsNC90LjQtT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoi0L7Qs9C70LDQstC70LXQvdC40LUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi0J7Qs9C70LDQstC70LXQvdC40LUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoi0L/QtdGA0LXQt9Cw0L/Rg9GB0YLQuNGC0Ywg0L/RgNC10LfQtdC90YLQsNGG0LjRjiIsCiAgICAicmVzdGFydD8iOiLQv9C10YDQtdC30LDQv9GD0YHQuj8iCiAgfSwKICBoZWxwX3J1OgogICAgItCf0LXRgNC10LzQtdGJ0LDQudGC0LXRgdGMINC60LvQuNC60LDRjyDQvNGL0YjQutC+0LksINC40YHQv9C+0LvRjNC30YPRjyDQutC70LDQstC40YjRgyDQv9GA0L7QsdC10LssINGB0YLRgNC10LvQutC4IiArCiAgICAi0LLQu9C10LLQvi/QstC/0YDQsNCy0L4g0LjQu9C4IFBnIFVwINC4IFBnIERuLiDQmtC70LDQstC40YjQuCBTINC4IEIg0LzQtdC90Y/RjtGCINGA0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAuIiwKCiAgc3RyaW5nc19zdjogewogICAgInNsaWRlIjoic2lkYSIsCiAgICAiaGVscD8iOiJoasOkbHAiLAogICAgImNvbnRlbnRzPyI6ImlubmVow6VsbCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbm5laMOlbGxzZsO2cnRlY2tuaW5nIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IklubmVow6VsbHNmw7ZydGVja25pbmciLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoidmlzYSBwcmVzZW50YXRpb25lbiBmcsOlbiBiw7ZyamFuIiwKICAgICJyZXN0YXJ0PyI6ImLDtnJqYSBvbSIKICB9LAogIGhlbHBfc3Y6CiAgICAiQmzDpGRkcmEgbWVkIGV0dCBrbGljayBtZWQgdsOkbnN0cmEgbXVza25hcHBlbiwgbWVsbGFuc2xhZ3N0YW5nZW50ZW4sICIgKwogICAgInbDpG5zdGVyLSBvY2ggaMO2Z2VycGlsdGFuZ2VudGVybmEgZWxsZXIgdGFuZ2VudGVybmEgUGcgVXAsIFBnIERuLiAiICsKICAgICJBbnbDpG5kIHRhbmdlbnRlcm5hIFMgb2NoIEIgZsO2ciBhdHQgw6RuZHJhIHRleHRlbnMgc3Rvcmxlay4iLAoKICBzdHJpbmdzOiB7IH0sCgogIGxvY2FsaXplOiBmdW5jdGlvbiAoc3JjKSB7CiAgICBpZiAoc3JjID09ICIiKQogICAgICByZXR1cm4gc3JjOwoKICAgICAvLyB0cnkgZnVsbCBsYW5ndWFnZSBjb2RlLCBlLmcuIGVuLVVTCiAgICAgdmFyIHMsIGxvb2t1cCA9IHczY19zbGlkeS5zdHJpbmdzW3czY19zbGlkeS5sYW5nXTsKCiAgICAgaWYgKGxvb2t1cCkKICAgICB7CiAgICAgICBzID0gbG9va3VwW3NyY107CgogICAgICAgaWYgKHMpCiAgICAgICAgcmV0dXJuIHM7CiAgICAgfQoKICAgICAvLyBzdHJpcCBjb3VudHJ5IGNvZGUgc3VmZml4LCBlLmcuCiAgICAgLy8gdHJ5IGVuIGlmIHVuZGVmaW5lZCBmb3IgZW4tVVMKICAgICB2YXIgbGcgPSB3M2Nfc2xpZHkubGFuZy5zcGxpdCgiLSIpOwoKICAgICBpZiAobGcubGVuZ3RoID4gMSkKICAgICB7CiAgICAgICBsb29rdXAgPSB3M2Nfc2xpZHkuc3RyaW5nc1tsZ1swXV07CgogICAgICAgaWYgKGxvb2t1cCkKICAgICAgIHsKICAgICAgICAgcyA9IGxvb2t1cFtzcmNdOwoKICAgICAgICAgaWYgKHMpCiAgICAgICAgICByZXR1cm4gczsKICAgICAgIH0KICAgICB9CgogICAgIC8vIG90aGVyd2lzZSBzdHJpbmcgYXMgaXMKICAgICByZXR1cm4gc3JjOwogIH0sCgogIGluaXRfbG9jYWxpemF0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaTE4biA9IHczY19zbGlkeTsKICAgIHZhciBoZWxwX3RleHQgPSB3M2Nfc2xpZHkuaGVscF90ZXh0OwoKICAgIC8vIGVhY2ggc3VjaCBsYW5ndWFnZSBhcnJheSBpcyBkZWNsYXJlZCBpbiB0aGUgbG9jYWxpemUgYXJyYXkKICAgIC8vIHRoaXMgaXMgdXNlZCBhcyBpbiAgdzNjX3NsaWR5LmxvY2FsaXplKCJmb28iKTsKICAgIHRoaXMuc3RyaW5ncyA9IHsKICAgICAgImVzIjp0aGlzLnN0cmluZ3NfZXMsCiAgICAgICJjYSI6dGhpcy5zdHJpbmdzX2NhLAogICAgICAiY3MiOnRoaXMuc3RyaW5nc19jcywKICAgICAgIm5sIjp0aGlzLnN0cmluZ3NfbmwsCiAgICAgICJkZSI6dGhpcy5zdHJpbmdzX2RlLAogICAgICAicGwiOnRoaXMuc3RyaW5nc19wbCwKICAgICAgImZyIjp0aGlzLnN0cmluZ3NfZnIsCiAgICAgICJodSI6dGhpcy5zdHJpbmdzX2h1LAogICAgICAiaXQiOnRoaXMuc3RyaW5nc19pdCwKICAgICAgImVsIjp0aGlzLnN0cmluZ3NfZWwsCiAgICAgICJqcCI6dGhpcy5zdHJpbmdzX2phLAogICAgICAiemgiOnRoaXMuc3RyaW5nc196aCwKICAgICAgInJ1Ijp0aGlzLnN0cmluZ3NfcnUsCiAgICAgICJzdiI6dGhpcy5zdHJpbmdzX3N2CiAgICB9LAoKICAgIGkxOG4uc3RyaW5nc19lc1toZWxwX3RleHRdID0gaTE4bi5oZWxwX2VzOwogICAgaTE4bi5zdHJpbmdzX2NhW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfY2E7CiAgICBpMThuLnN0cmluZ3NfY3NbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9jczsKICAgIGkxOG4uc3RyaW5nc19ubFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX25sOwogICAgaTE4bi5zdHJpbmdzX2RlW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfZGU7CiAgICBpMThuLnN0cmluZ3NfcGxbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9wbDsKICAgIGkxOG4uc3RyaW5nc19mcltoZWxwX3RleHRdID0gaTE4bi5oZWxwX2ZyOwogICAgaTE4bi5zdHJpbmdzX2h1W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfaHU7CiAgICBpMThuLnN0cmluZ3NfaXRbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9pdDsKICAgIGkxOG4uc3RyaW5nc19lbFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX2VsOwogICAgaTE4bi5zdHJpbmdzX2phW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfamE7CiAgICBpMThuLnN0cmluZ3NfemhbaGVscF90ZXh0XSA9IGkxOG4uaGVscF96aDsKICAgIGkxOG4uc3RyaW5nc19ydVtoZWxwX3RleHRdID0gaTE4bi5oZWxwX3J1OwogICAgaTE4bi5zdHJpbmdzX3N2W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfc3Y7CgogICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJsYW5nIik7CgogICAgaWYgKCF3M2Nfc2xpZHkubGFuZykKICAgICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpOwoKICAgIGlmICghdzNjX3NsaWR5LmxhbmcpCiAgICAgIHczY19zbGlkeS5sYW5nID0gImVuIjsKICB9Cn07CgovLyBoYWNrIGZvciBiYWNrIGJ1dHRvbiBiZWhhdmlvcgppZiAodzNjX3NsaWR5LmllNiB8fCB3M2Nfc2xpZHkuaWU3KQp7CiAgZG9jdW1lbnQud3JpdGUoIjxpZnJhbWUgaWQ9J2hpc3RvcnlGcmFtZScgIiArCiAgInNyYz0namF2YXNjcmlwdDpcIjxodG1sIisiPjwvIisiaHRtbD5cIicgIiArCiAgImhlaWdodD0nMScgd2lkdGg9JzEnICIgKwogICJzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7bGVmdDotODAwcHgnPjwvaWZyYW1lPiIpOwp9CgovLyBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzIGZvciBpbml0aWFsaXphdGlvbgp3M2Nfc2xpZHkuc2V0X3VwKCk7CgovLyBoaWRlIHRoZSBzbGlkZXMgYXMgc29vbiBhcyBib2R5IGVsZW1lbnQgaXMgYXZhaWxhYmxlCi8vIHRvIHJlZHVjZSBhbm5veWluZyBzY3JlZW4gbWVzcyBiZWZvcmUgdGhlIG9ubG9hZCBldmVudApzZXRUaW1lb3V0KHczY19zbGlkeS5oaWRlX3NsaWRlcywgNTApOwoK"></script>
<link href="data:text/css;charset=utf-8,h1%20%7B%0Acolor%3A%20black%3B%0A%7D%0Ah2%20%7B%0Acolor%3A%20black%3B%0A%7D%0Ah3%20%7B%0Acolor%3A%20black%3B%0A%7D%0Aa%20%7B%0Acolor%3A%20steelblue%3B%0A%7D%0Abody%7B%20%0Afont%2Dsize%3A%2032px%3B%0Afont%2Dfamily%3A%20Helvetica%2C%20arial%2C%20sans%2Dserif%3B%0Aline%2Dheight%3A%201%2E45%3B%0A%7D%0Apre%20%7B%0Afont%2Dfamily%3A%20%22SFMono%2DRegular%22%2C%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Acode%20%7B%0Afont%2Dsize%3A%2090%25%3B%0Amargin%2Dtop%3A%200%3B%0Amargin%2Dbottom%3A%200%3B%0Aoverflow%3A%20auto%3B%0Afont%2Dsize%3A%2090%25%3B%0Aline%2Dheight%3A%201%2E45%3B%0Aborder%2Dradius%3A%205px%3B%0A%7D%0Apre%20%7B%0Amargin%2Dtop%3A%200%3B%0Amargin%2Dbottom%3A%200%3B%0Aoverflow%3A%20auto%3B%0Afont%2Dsize%3A%2090%25%3B%0Aline%2Dheight%3A%201%2E45%3B%0Aborder%3A%200%3B%0Apadding%3A%2016px%3B%0Aborder%2Dradius%3A%205px%3B%0Amargin%2Dtop%3A%2016px%3B%0Amargin%2Dbottom%3A%2018px%3B%0Apadding%2Dtop%3A%2012px%3B%0Apadding%2Dbottom%3A%2012px%3B%0A%7D%0Apre%3Anot%28%5Bclass%5D%29%20%7B%0Aborder%3A%201%3B%0Afont%2Dweight%3A%20bold%3B%0Abackground%2Dcolor%3A%20%23F0F0F0%0A%7D%0Acode%20%7B%0Aborder%3A%201%3B%0Abackground%2Dcolor%3A%20%23F0F0F0%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20%22SFMono%2DRegular%22%2C%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Acode%3Anot%28%5Bclass%5D%29%20%7B%0Abackground%2Dcolor%3A%20%23F0F0F0%0Afont%2Dfamily%3A%20Consolas%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0A%2EsourceCode%2Er%20%7B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0Afont%2Dsize%3A%2095%25%3B%0Abackground%2Dcolor%3A%20%23f6f8fa%3B%0A%7D%0A%2EsourceCode%2Ec%20%7B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0Afont%2Dsize%3A%2095%25%3B%0Abackground%2Dcolor%3A%20%23f6f8fa%3B%0Acolor%3A%20black%3B%0A%7D%0A%2Eslide%2Esection%20%7B%0Aline%2Dheight%3A%201%2E1%3B%0Amargin%2Dleft%3A%2050px%3B%0Amargin%2Dright%3A%2050px%3B%0Afont%2Dsize%3A%2036px%3B%0A%7D%0A%2Eslide%2Etitlepage%20%7B%0Afont%2Dsize%3A%2048px%3B%0A%7D%0A%2Ealert%20%7B%0Acolor%3A%20firebrick%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0A%2Edefout%20%7B%0Abackground%2Dcolor%3A%20%23F7F9F9%3B%0Afont%2Dweight%3A%20normal%3B%0Acolor%3A%20black%3B%0Aborder%3A%205px%3B%0Amargin%2Dtop%3A%2016px%3B%0Amargin%2Dbottom%3A%2018px%3B%0Apadding%2Dtop%3A%2012px%3B%0Apadding%2Dbottom%3A%2012px%3B%0Afont%2Dsize%3A%2075%25%3B%0A%7D%0A%2Emypre%20%7B%0Acolor%3A%20darkslateblue%3B%0Abackground%2Dcolor%3A%20%23f6f8fa%3B%0A%7D%0Aalrt%20%7B%0Acolor%3A%20firebrick%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Adsb%20%7B%0Acolor%3A%20darkslateblue%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0A%2Ecolumn%2Dleft%7B%0Afloat%3A%20left%3B%0Awidth%3A%2050%25%3B%0Atext%2Dalign%3A%20left%3B%0A%7D%0A%2Ecolumn%2Dcenter%7B%0Adisplay%3A%20inline%2Dblock%3B%0Awidth%3A%2033%25%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0A%2Ecolumn%2Dright%7B%0Afloat%3A%20right%3B%0Awidth%3A%2050%25%3B%0Atext%2Dalign%3A%20left%3B%0A%7D" rel="stylesheet" type="text/css" media="screen, projection, print" />
<link href="data:text/css;charset=utf-8,red%20%7B%0Acolor%3A%20firebrick%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Ablu%20%7B%0Acolor%3A%20darkslateblue%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Agrn%20%7B%0Acolor%3A%20darkgreen%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Aorng%20%7B%0Acolor%3A%20DarkOrange%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Ablk%20%7B%0Acolor%3A%20black%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Agold%20%7B%0Acolor%3A%20GoldenRod%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0Apurp%20%7B%0Acolor%3A%20Purple%3B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dfamily%3A%20Consolas%2C%20%22Liberation%20Mono%22%2C%20Menlo%2C%20Courier%2C%20monospace%3B%0A%7D%0A%2Ered%20%7B%0Acolor%3A%20firebrick%3B%0A%7D%0A" rel="stylesheet" type="text/css" media="screen, projection, print" />
</head>
<body>
<div class="slide titlepage">
<h1 class="title">Introduction to <grn>mrgsolve</grn><BR>Model specification</h1>
<p class="author">
Kyle T. Baron
</p>
<p class="date">Metrum Research Group, LLC</p>
</div>
<div id="lets-make-this-model" class="slide section level1">
<h1>Let’s make this model</h1>
<div class="figure">
<img src="data:image/png;base64,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" />
</div>
<ul class="incremental">
<li>What are the <grn>parameters</grn>?</li>
<li>What are the <blu>compartments</blu>?</li>
<li>What are the <purp>differential equations</purp>?</li>
</ul>
</div>
<div id="code-up-the-model" class="slide section level1">
<h1>Code up the model</h1>
</div>
<div id="param-r-declare-and-initialize-model-parameters" class="slide section level1">
<h1>$PARAM [<code>R</code>] <strong>declare and initialize model parameters</strong></h1>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="op">$</span>PARAM CL =<span class="st"> </span><span class="dv">1</span>, VC =<span class="st"> </span><span class="dv">20</span>, KA=<span class="fl">1.2</span></code></pre></div>
<ul>
<li>Model “parameters” with <code>name = value</code> format</li>
<li>Separate by <code>,</code> or <code><newline></code></li>
<li>Use any <code>name</code> except for words in <code>mrgsolve:::reserved()</code></li>
<li>Values are evaluated by <code>R</code> parser</li>
<li>Multiple blocks allowed</li>
<li>Use <code>name</code> anywhere in the model</li>
<li>Updatable in <code>R</code> but read-only in the model specification file
<ul>
<li>Consider <code>$FIXED</code> if appropriate</li>
</ul></li>
<li>Most often, you will want to match names in <code>$PARAM</code> with the names in your input data sets</li>
</ul>
</div>
<div id="cmt-txt-declare-model-compartments" class="slide section level1">
<h1><code>$CMT</code> [<code>txt</code>] <strong>declare model compartments</strong></h1>
<ul>
<li>Specify <code>name</code> and <code>number</code> of compartments in the model</li>
<li>Use any name except for those listed in <code>mrgsolve:::reserved()</code></li>
<li>See also or <code>$INIT</code></li>
</ul>
<p>Example <code>$CMT</code></p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$CMT GUT CENT</code></pre></div>
<p>Example <code>$INIT</code></p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$INIT GUT = <span class="dv">0</span>, CENT = <span class="dv">10</span></code></pre></div>
</div>
<div id="ode-c-write-differential-equations" class="slide section level1">
<h1><code>$ODE</code> [<code>C++</code>] write differential equations</h1>
<ul>
<li>Every compartment <strong>needs</strong> an equation</li>
<li>Form:<code>dxdt_CMT = ratein - rateout;</code></li>
<li>Use <code>CMT</code> for compartment amounts, parameters, or other variables</li>
<li>This block of code gets called repeatedly so be wise</li>
</ul>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$ODE
dxdt_GUT = -KA*GUT;
dxdt_CENT = KA*GUT - (CL/VC)*CENT;</code></pre></div>
</div>
<div id="derive-new-variables-in-your-model" class="slide section level1">
<h1>Derive <code>new variables</code> in your model</h1>
<ul>
<li>Your model code is written in <code>C++</code>, which is a language</li>
<li>When you want a new variable, you must say what it is</li>
<li><code>$MAIN</code>, <code>$ODE</code>, <code>$TABLE</code>, <code>$GLOBAL</code></li>
</ul>
<p><strong>To get a numeric variable</strong>, use <code>double</code></p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="dt">double</span> x = <span class="fl">5.4</span>;</code></pre></div>
<p><strong>Other types you might use</strong></p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">bool cured = false;
<span class="dt">int</span> i = <span class="dv">2</span>;</code></pre></div>
<p>If in doubt, use <code>double</code>; it’s what you want most of the time.</p>
</div>
<div id="main-c-covariate-model-initials" class="slide section level1">
<h1><code>$MAIN</code> [<code>C++</code>] <strong>covariate model & initials</strong></h1>
<p>For example</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$MAIN
<span class="dt">double</span> CL = TVCL*pow(WT/<span class="dv">70</span>,<span class="fl">0.75</span>);
<span class="dt">double</span> VC = TVVC*pow(<span class="fl">0.86</span>,SEX);
RESP_0 = KIN/KOUT;</code></pre></div>
<p>In this example</p>
<ul>
<li><code>TVCL</code>, <code>KIN</code>, <code>KOUT</code>, <code>WT</code>, <code>SEX</code> were declared in <code>$PARAM</code></li>
<li>There is a response compartment <code>RESP</code></li>
</ul>
</div>
<div id="c-expressions-and-functions" class="slide section level1">
<h1><code>C++</code> expressions and functions</h1>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c"><span class="cf">if</span>(a == <span class="dv">2</span>) b = <span class="dv">2</span>;
<span class="cf">if</span>(b <= <span class="dv">2</span>) {
c=<span class="dv">3</span>;
} <span class="cf">else</span> {
c=<span class="dv">4</span>;
}
<span class="dt">double</span> d = pow(base,exponent);
<span class="dt">double</span> e = exp(<span class="dv">3</span>);
<span class="dt">double</span> f = fabs(-<span class="dv">4</span>);
<span class="dt">double</span> g = sqrt(<span class="dv">5</span>);
<span class="dt">double</span> h = log(<span class="dv">6</span>);
<span class="dt">double</span> i = log10(<span class="dv">7</span>);
<span class="dt">double</span> j = floor(<span class="fl">4.2</span>);
<span class="dt">double</span> k = ceil(<span class="fl">4.2</span>);</code></pre></div>
<p>Lots of help on the web <a href="http://en.cppreference.com/w/cpp/numeric/math/tgamma" class="uri">http://en.cppreference.com/w/cpp/numeric/math/tgamma</a></p>
</div>
<div id="preprocessor-directives-define" class="slide section level1">
<h1>Preprocessor directives (<code>#define</code>)</h1>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$GLOBAL
<span class="pp">#define CP (CENT/VC)</span>
<span class="pp">#define g 9.8</span>
$ODE
<span class="dt">double</span> INH = CP/(EC50+CP);
dxdt_RESP = KIN*(<span class="dv">1</span>-INH) - KOUT*RESP;
$CAPTURE CP</code></pre></div>
</div>
<div id="introduction-to-population-simulation" class="slide section level1">
<h1>Introduction to <code>POPULATION</code> simulation</h1>
<ul>
<li><p><dsb>Like NONMEM</dsb>, use <code>$OMEGA</code> and <code>$SIGMA</code> to define covariance matrices for IIV and RUV, respectively</p></li>
<li><dsb>Like NONMEM</dsb>, use <code>ETA(n)</code> and <code>EPS(m)</code> for realized random effects drawn from <code>$OMEGA</code> and <code>$SIGMA</code> respectively
<ul>
<li>BUT …. use labeled <code>ETA</code>s instead</li>
</ul></li>
<li><p><dsb>Like NONMEM</dsb>, <code>mrgsolve</code> recognizes <code>ID</code> as a subject indicator for simulating a new <code>ETA</code></p></li>
<li><p><dsb>Like NONMEM</dsb>, <code>mrgsolve</code> allows you to write an error model as a function of <code>EPS(m)</code> and any other calculated value in your model</p></li>
</ul>
</div>
<div id="omega-and-sigma-txt" class="slide section level1">
<h1><code>$OMEGA</code> and <code>$SIGMA</code> [<code>txt</code>]</h1>
<ul>
<li>Specify random effect variance/covariance matrices
<ul>
<li><span class="math inline">\(\eta_i \sim N\left(0, \Omega \right)\)</span></li>
<li><span class="math inline">\(\varepsilon_j \sim N \left(0, \Sigma \right)\)</span></li>
</ul></li>
<li>NONMEM-style input - lower triangle</li>
<li>Multiple <code>$OMEGA</code> and <code>$SIGMA</code> are allowed and each may be named</li>
<li>How you enter these blocks defines a that <code>mrgsolve</code> will enforce later on</li>
<li>Diagonal matrix (3x3 in this example)</li>
</ul>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$OMEGA <span class="fl">0.1</span> <span class="fl">0.2</span> <span class="fl">0.3</span></code></pre></div>
</div>
<div id="more-omega-and-sigma" class="slide section level1">
<h1>More <code>$OMEGA</code> and <code>$SIGMA</code></h1>
<ul>
<li>Options are <code>@</code> delimited & must be on different line from the matrix data</li>
<li>Block matrix (2x2 in this example)</li>
</ul>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$OMEGA @block
<span class="fl">0.1</span> <span class="fl">0.0947</span> <span class="fl">0.2</span></code></pre></div>
<ul>
<li>Block matrix with correlations (assumes <code>@block</code>)</li>
</ul>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$OMEGA @cor
<span class="fl">0.1</span> <span class="fl">0.67</span> <span class="fl">0.2</span></code></pre></div>
</div>
<div id="omega-and-sigma" class="slide section level1">
<h1><code>$OMEGA</code> and <code>$SIGMA</code></h1>
<ul>
<li>Multiple <code>$OMEGA</code> and <code>$SIGMA</code> are allowed; each may be named</li>
</ul>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$OMEGA @name PK
<span class="dv">0</span> <span class="dv">0</span> <span class="dv">0</span>
$OMEGA @name PD
<span class="dv">0</span> <span class="dv">0</span></code></pre></div>
<p>Users are encouraged to add labels</p>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$OMEGA @name PK @labels ECL EVC EKA
<span class="dv">0</span> <span class="dv">0</span> <span class="dv">0</span></code></pre></div>
</div>
<div id="about-macros" class="slide section level1">
<h1>About <code>@</code> macros</h1>
<ul>
<li>Used to indicate options associated with different code blocks</li>
<li>Most options are for <code>$OMEGA</code> and <code>$SIGMA</code></li>
<li><code>@</code> should appear at the start of the line and the entire line is reserved for options</li>
<li>A line may contain multiple options: <code>@cor @name PK</code></li>
</ul>
<p>Two forms:</p>
<ul>
<li>Boolean: <code>@block</code> means <code>block=TRUE</code></li>
<li>Name/value: <code>@labels ECL EVC</code> means <code>labels=c("ECL", "EVC")</code></li>
</ul>
</div>
<div id="closed-form-pk-models-with-pkmodel" class="slide section level1">
<h1>Closed-form PK models with <code>$PKMODEL</code></h1>
<ul>
<li>Set <code>ncmt</code> to 1 or 2</li>
<li>Set <code>depot</code> to <code>TRUE</code> for extravascular dosing compartment</li>
<li>Set <code>trans</code> to change the names of required parameters</li>
<li>Use <code>$CMT</code> to declare 1 to 3 compartments as appropriate</li>
</ul>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$PKMODEL cmt = <span class="st">"GUT CENT PERIPH"</span>, depot=TRUE
$PARAM CL = <span class="dv">1</span> , V2 = <span class="dv">30</span>, Q = <span class="dv">8</span>, V3 = <span class="dv">400</span>, KA=<span class="fl">1.2</span></code></pre></div>
</div>
<div id="more-pkmodel" class="slide section level1">
<h1>More <code>$PKMODEL</code></h1>
<div class="sourceCode"><pre class="sourceCode c"><code class="sourceCode c">$PKMODEL ncmt=<span class="dv">1</span>, depot=TRUE
$CMT GUT CENT
$PARAM TVCL = <span class="dv">1</span> , TVV = <span class="dv">30</span>, KA=<span class="fl">1.2</span>
$OMEGA @labels ECL EVC
<span class="dv">1</span> <span class="dv">1</span>
$MAIN
<span class="dt">double</span> CL = TVCL*exp(ECL);
<span class="dt">double</span> V = TVV *exp(EVC);</code></pre></div>
</div>
<div id="bioavailability-dosing-lag-time-and-infusions" class="slide section level1">
<h1>Bioavailability, dosing lag time, and infusions</h1>
<ul>
<li><p>To change the bioavability of doses administered to a compartment, set <code>F_CMT</code> in <code>$MAIN</code></p></li>
<li><p>To add a lagtime for doses administered to a compartment, set <code>ALAG_CMT</code> in <code>$MAIN</code></p></li>
<li>To set the duration of infusion, set <code>D_CMT</code> in <code>$MAIN</code>
<ul>
<li>Also, use <code>rate = -2</code> in your data set or event object</li>
</ul></li>
<li>To set the infusion rate, set <code>R_CMT</code> in <code>$MAIN</code>
<ul>
<li>ALso, use <code>rate = -1</code> in your data set or event object</li>
</ul></li>
</ul>
</div>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>