-
Notifications
You must be signed in to change notification settings - Fork 0
/
PyReview.py
242 lines (242 loc) · 589 KB
/
PyReview.py
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
#!/usr/bin/env python2
try:
import time
import os
import subprocess
from PIL import Image
import shlex
import base64
import hashlib
from cStringIO import StringIO
except ImportError:
print "Missing a module! Please ensure you have time, os, subprocess, Image, shlex, base64 and haslib modules available to your python installation."
except KeyboardInterrupt:
print "Reporting cancelled."
##################################################
#Partition selection "menu".
try:
filelist = []
cnt = 0
voll = []
fdisk = subprocess.Popen(["fdisk", "-l"], stdout=subprocess.PIPE)
fdisk = fdisk.stdout.readlines()
for item in fdisk:
if item.startswith("/dev"):
litem = item.split(' ')
cnt = cnt + 1
voll.append(str(cnt)+": "+litem[0])
errm = 0
chk = 0
while chk == 0:
chkcnt = 1
os.system('clear')
if errm == 1:
print "Incorrect input, please try again."
print 'Select a partition by entering its corresponding number.'
print '\n'
for item in voll:
print item
chkcnt = chkcnt + 1
print '\n'
selection = raw_input("Selection Number: ")
ocnt = 0
for c in selection:
if 48 <= ord(c) <= 57:
ocnt = ocnt + 1
if ocnt == len(selection):
if int(selection) in range(1,chkcnt):
chk = 1
errm = 1
for item in voll:
if item.startswith(selection):
vol = item[3:len(item)]
subprocess.call('clear')
ptarg = vol
cnt = 0
##################################################
#Make mount point and mount target drive to it.
sane = 1
prevmnt = '/tmp/prevmnt'+str(cnt)
while sane == 1:
if os.path.isdir(prevmnt):
cnt = cnt+1
prevmnt = '/tmp/prevmnt'+str(cnt)
else:
try:
os.makedirs(prevmnt)
except OSError:
os.system('clear')
print "Could not create mount point. This can be sometimes caused by a broken mounting caused from a previous mount of your target partition. If the issue persists try running the script again or consider rebooting."
break
sane = 0
subprocess.call(['mount', '-o', 'ro,noatime,noexec,noauto', ptarg, prevmnt], stderr=open(os.devnull, 'wb'))
except KeyboardInterrupt:
print "Report cancelled."
#################################################
#Get file list of pictures for later processing.
try:
cnt2 = 0
for dirname, dirnames, filenames in os.walk(prevmnt+'/'):
for filename in filenames:
if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.bmp') or filename.endswith('.png') or filename.endswith('.gif'):
jpg = os.path.join(dirname, filename)
filelist.append(jpg)
cnt2 = cnt2 + 1
subprocess.call('clear', shell=True)
print str(cnt2)+' potential graphic files detected.'
except KeyboardInterrupt:
print "Caught keyboard interrupt. Mounted evidence and script generated files are likely located in /tmp/ under prevramX and prevmntX directories."
##################################################
#Mount a RAM disk and create folder structure for the web pages/thumbnails used to create the report.
cnt = 0
sane = 1
prevram = '/tmp/prevram'+str(cnt)
while sane == 1:
if os.path.isdir(prevram):
cnt = cnt+1
prevram = '/tmp/prevram'+str(cnt)
else:
os.makedirs(prevram)
sane = 0
subprocess.call('chmod 777 '+prevram, shell=True)
subprocess.call('mount -t tmpfs -o size=512M tmpfs '+prevram, shell=True)
os.makedirs(prevram+'/thumbs')
os.makedirs(prevram+'/html')
os.makedirs(prevram+'/js')
subprocess.call('chmod 777 '+prevram+'/thumbs', shell=True)
subprocess.call('chmod 777 '+prevram+'/html', shell=True)
subprocess.call('chmod 777 '+prevram+'/js', shell=True)
##################################################
#Creating thumbnails and report pages. The large ammount of base64 data is the javascript libraries needed for the report page to work correctly.
size = 128, 128
cnt = 1
ecnt = 0
repm = ''
ptit = 0
span = ''
eList = []
onejsn = 'basic.js'
onejsd = 'ZnVuY3Rpb24gZGVtb1R3b1BhZ2VEb2N1bWVudCgpIHsKCXZhciBkb2MgPSBuZXcganNQREYoKTsKCWRvYy50ZXh0KDIwLCAyMCwgJ0hlbGxvIHdvcmxkIScpOwoJZG9jLnRleHQoMjAsIDMwLCAnVGhpcyBpcyBjbGllbnQtc2lkZSBKYXZhc2NyaXB0LCBwdW1waW5nIG91dCBhIFBERi4nKTsKCWRvYy5hZGRQYWdlKCk7Cglkb2MudGV4dCgyMCwgMjAsICdEbyB5b3UgbGlrZSB0aGF0PycpOwoJCgkvLyBTYXZlIHRoZSBQREYKCWRvYy5zYXZlKCdUZXN0LnBkZicpOwp9CgpmdW5jdGlvbiBkZW1vTGFuZHNjYXBlKCkgewoJdmFyIGRvYyA9IG5ldyBqc1BERignbGFuZHNjYXBlJyk7Cglkb2MudGV4dCgyMCwgMjAsICdIZWxsbyBsYW5kc2NhcGUgd29ybGQhJyk7CgoJLy8gU2F2ZSB0aGUgUERGCglkb2Muc2F2ZSgnVGVzdC5wZGYnKTsKfQoKZnVuY3Rpb24gZGVtb0ZvbnRTaXplcygpIHsKCXZhciBkb2MgPSBuZXcganNQREYoKTsKCWRvYy5zZXRGb250U2l6ZSgyMik7Cglkb2MudGV4dCgyMCwgMjAsICdUaGlzIGlzIGEgdGl0bGUnKTsKCQoJZG9jLnNldEZvbnRTaXplKDE2KTsKCWRvYy50ZXh0KDIwLCAzMCwgJ1RoaXMgaXMgc29tZSBub3JtYWwgc2l6ZWQgdGV4dCB1bmRlcm5lYXRoLicpOwoJCglkb2Muc2F2ZSgnVGVzdC5wZGYnKTsKfQoKZnVuY3Rpb24gZGVtb0ZvbnRUeXBlcygpIHsKCXZhciBkb2MgPSBuZXcganNQREYoKTsKCQoJZG9jLnRleHQoMjAsIDIwLCAnVGhpcyBpcyB0aGUgZGVmYXVsdCBmb250LicpOwoJCglkb2Muc2V0Rm9udCgiY291cmllciIpOwoJZG9jLnNldEZvbnRUeXBlKCJub3JtYWwiKTsKCWRvYy50ZXh0KDIwLCAzMCwgJ1RoaXMgaXMgY291cmllciBub3JtYWwuJyk7CgkKCWRvYy5zZXRGb250KCJ0aW1lcyIpOwoJZG9jLnNldEZvbnRUeXBlKCJpdGFsaWMiKTsKCWRvYy50ZXh0KDIwLCA0MCwgJ1RoaXMgaXMgdGltZXMgaXRhbGljLicpOwoJCglkb2Muc2V0Rm9udCgiaGVsdmV0aWNhIik7Cglkb2Muc2V0Rm9udFR5cGUoImJvbGQiKTsKCWRvYy50ZXh0KDIwLCA1MCwgJ1RoaXMgaXMgaGVsdmV0aWNhIGJvbGQuJyk7CgkKCWRvYy5zZXRGb250KCJjb3VyaWVyIik7Cglkb2Muc2V0Rm9udFR5cGUoImJvbGRpdGFsaWMiKTsKCWRvYy50ZXh0KDIwLCA2MCwgJ1RoaXMgaXMgY291cmllciBib2xkaXRhbGljLicpOwoJCglkb2Muc2F2ZSgnVGVzdC5wZGYnKTsKfQoKZnVuY3Rpb24gZGVtb1RleHRDb2xvcnMoKSB7Cgl2YXIgZG9jID0gbmV3IGpzUERGKCk7CgoJZG9jLnNldFRleHRDb2xvcigxMDApOwoJZG9jLnRleHQoMjAsIDIwLCAnVGhpcyBpcyBncmF5LicpOwoJCglkb2Muc2V0VGV4dENvbG9yKDE1MCk7Cglkb2MudGV4dCgyMCwgMzAsICdUaGlzIGlzIGxpZ2h0IGdyYXkuJyk7CgkKCWRvYy5zZXRUZXh0Q29sb3IoMjU1LDAsMCk7Cglkb2MudGV4dCgyMCwgNDAsICdUaGlzIGlzIHJlZC4nKTsKCQoJZG9jLnNldFRleHRDb2xvcigwLDI1NSwwKTsKCWRvYy50ZXh0KDIwLCA1MCwgJ1RoaXMgaXMgZ3JlZW4uJyk7CgkKCWRvYy5zZXRUZXh0Q29sb3IoMCwwLDI1NSk7Cglkb2MudGV4dCgyMCwgNjAsICdUaGlzIGlzIGJsdWUuJyk7CgkKCS8vIE91dHB1dCBhcyBEYXRhIFVSSQoJZG9jLm91dHB1dCgnZGF0YXVyaScpOwp9CgpmdW5jdGlvbiBkZW1vTWV0YWRhdGEoKSB7Cgl2YXIgZG9jID0gbmV3IGpzUERGKCk7Cglkb2MudGV4dCgyMCwgMjAsICdUaGlzIFBERiBoYXMgYSB0aXRsZSwgc3ViamVjdCwgYXV0aG9yLCBrZXl3b3JkcyBhbmQgYSBjcmVhdG9yLicpOwoJCgkvLyBPcHRpb25hbCAtIHNldCBwcm9wZXJ0aWVzIG9uIHRoZSBkb2N1bWVudAoJZG9jLnNldFByb3BlcnRpZXMoewoJCXRpdGxlOiAnVGl0bGUnLAoJCXN1YmplY3Q6ICdUaGlzIGlzIHRoZSBzdWJqZWN0JywKCQlhdXRob3I6ICdKYW1lcyBIYWxsJywKCQlrZXl3b3JkczogJ2dlbmVyYXRlZCwgamF2YXNjcmlwdCwgd2ViIDIuMCwgYWpheCcsCgkJY3JlYXRvcjogJ01FRUUnCgl9KTsKCQoJZG9jLnNhdmUoJ1Rlc3QucGRmJyk7Cn0KCmZ1bmN0aW9uIGRlbW9Vc2VySW5wdXQoKSB7CQoJdmFyIG5hbWUgPSBwcm9tcHQoJ1doYXQgaXMgeW91ciBuYW1lPycpOwoJdmFyIG11bHRpcGxpZXIgPSBwcm9tcHQoJ0VudGVyIGEgbnVtYmVyOicpOwoJbXVsdGlwbGllciA9IHBhcnNlSW50KG11bHRpcGxpZXIpOwoKCXZhciBkb2MgPSBuZXcganNQREYoKTsKCWRvYy5zZXRGb250U2l6ZSgyMik7CQoJZG9jLnRleHQoMjAsIDIwLCAnUXVlc3Rpb25zJyk7Cglkb2Muc2V0Rm9udFNpemUoMTYpOwoJZG9jLnRleHQoMjAsIDMwLCAnVGhpcyBiZWxvbmdzIHRvOiAnICsgbmFtZSk7CgkKCWZvcih2YXIgaSA9IDE7IGkgPD0gMTI7IGkgKyspIHsKCQlkb2MudGV4dCgyMCwgMzAgKyAoaSAqIDEwKSwgaSArICcgeCAnICsgbXVsdGlwbGllciArICcgPSBfX18nKTsKCX0KCQoJZG9jLmFkZFBhZ2UoKTsKCWRvYy5zZXRGb250U2l6ZSgyMik7Cglkb2MudGV4dCgyMCwgMjAsICdBbnN3ZXJzJyk7Cglkb2Muc2V0Rm9udFNpemUoMTYpOwoJCglmb3IodmFyIGkgPSAxOyBpIDw9IDEyOyBpICsrKSB7CgkJZG9jLnRleHQoMjAsIDMwICsgKGkgKiAxMCksIGkgKyAnIHggJyArIG11bHRpcGxpZXIgKyAnID0gJyArIChpICogbXVsdGlwbGllcikpOwoJfQkKCWRvYy5zYXZlKCdUZXN0LnBkZicpOwoJCn0KCmZ1bmN0aW9uIGRlbW9SZWN0YW5nbGVzKCkgewkKCXZhciBkb2MgPSBuZXcganNQREYoKTsKCglkb2MucmVjdCgyMCwgMjAsIDEwLCAxMCk7IC8vIGVtcHR5IHNxdWFyZQoKCWRvYy5yZWN0KDQwLCAyMCwgMTAsIDEwLCAnRicpOyAvLyBmaWxsZWQgc3F1YXJlCgkKCWRvYy5zZXREcmF3Q29sb3IoMjU1LDAsMCk7Cglkb2MucmVjdCg2MCwgMjAsIDEwLCAxMCk7IC8vIGVtcHR5IHJlZCBzcXVhcmUKCQoJZG9jLnNldERyYXdDb2xvcigyNTUsMCwwKTsKCWRvYy5yZWN0KDgwLCAyMCwgMTAsIDEwLCAnRkQnKTsgLy8gZmlsbGVkIHNxdWFyZSB3aXRoIHJlZCBib3JkZXJzCgkKCWRvYy5zZXREcmF3Q29sb3IoMCk7Cglkb2Muc2V0RmlsbENvbG9yKDI1NSwwLDApOwoJZG9jLnJlY3QoMTAwLCAyMCwgMTAsIDEwLCAnRicpOyAvLyBmaWxsZWQgcmVkIHNxdWFyZQoJCglkb2Muc2V0RHJhd0NvbG9yKDApOwoJZG9jLnNldEZpbGxDb2xvcigyNTUsMCwwKTsKCWRvYy5yZWN0KDEyMCwgMjAsIDEwLCAxMCwgJ0ZEJyk7IC8vIGZpbGxlZCByZWQgc3F1YXJlIHdpdGggYmxhY2sgYm9yZGVycwoKCWRvYy5zZXREcmF3Q29sb3IoMCk7Cglkb2Muc2V0RmlsbENvbG9yKDI1NSwgMjU1LCAyNTUpOwoJZG9jLnJvdW5kZWRSZWN0KDE0MCwgMjAsIDEwLCAxMCwgMywgMywgJ0ZEJyk7IC8vICBCbGFjayBzcWF1cmUgd2l0aCByb3VuZGVkIGNvcm5lcnMKCglkb2Muc2F2ZSgnVGVzdC5wZGYnKTsKfQoKZnVuY3Rpb24gZGVtb0xpbmVzKCkgewkKCXZhciBkb2MgPSBuZXcganNQREYoKTsKCglkb2MubGluZSgyMCwgMjAsIDYwLCAyMCk7IC8vIGhvcml6b250YWwgbGluZQoJCQoJZG9jLnNldExpbmVXaWR0aCgwLjUpOwoJZG9jLmxpbmUoMjAsIDI1LCA2MCwgMjUpOwoJCglkb2Muc2V0TGluZVdpZHRoKDEpOwoJZG9jLmxpbmUoMjAsIDMwLCA2MCwgMzApOwoJCglkb2Muc2V0TGluZVdpZHRoKDEuNSk7Cglkb2MubGluZSgyMCwgMzUsIDYwLCAzNSk7CgkKCWRvYy5zZXREcmF3Q29sb3IoMjU1LDAsMCk7IC8vIGRyYXcgcmVkIGxpbmVzCgkKCWRvYy5zZXRMaW5lV2lkdGgoMC4xKTsKCWRvYy5saW5lKDEwMCwgMjAsIDEwMCwgNjApOyAvLyB2ZXJ0aWNhbCBsaW5lCgkKCWRvYy5zZXRMaW5lV2lkdGgoMC41KTsKCWRvYy5saW5lKDEwNSwgMjAsIDEwNSwgNjApOwoJCglkb2Muc2V0TGluZVdpZHRoKDEpOwoJZG9jLmxpbmUoMTEwLCAyMCwgMTEwLCA2MCk7CgkKCWRvYy5zZXRMaW5lV2lkdGgoMS41KTsKCWRvYy5saW5lKDExNSwgMjAsIDExNSwgNjApOwoJCgkvLyBPdXRwdXQgYXMgRGF0YSBVUkkKCWRvYy5vdXRwdXQoJ2RhdGF1cmknKTsKfQoKZnVuY3Rpb24gZGVtb0NpcmNsZXMoKSB7Cgl2YXIgZG9jID0gbmV3IGpzUERGKCk7CgoJZG9jLmVsbGlwc2UoNDAsIDIwLCAxMCwgNSk7CgoJZG9jLnNldEZpbGxDb2xvcigwLDAsMjU1KTsKCWRvYy5lbGxpcHNlKDgwLCAyMCwgMTAsIDUsICdGJyk7CgkKCWRvYy5zZXRMaW5lV2lkdGgoMSk7Cglkb2Muc2V0RHJhd0NvbG9yKDApOwoJZG9jLnNldEZpbGxDb2xvcigyNTUsMCwwKTsKCWRvYy5jaXJjbGUoMTIwLCAyMCwgNSwgJ0ZEJyk7CgoJZG9jLnNhdmUoJ1Rlc3QucGRmJyk7Cn0KCmZ1bmN0aW9uIGRlbW9UcmlhbmdsZXMoKSB7Cgl2YXIgZG9jID0gbmV3IGpzUERGKCk7CgoJZG9jLnRyaWFuZ2xlKDYwLCAxMDAsIDYwLCAxMjAsIDgwLCAxMTAsICdGRCcpOwoJCglkb2Muc2V0TGluZVdpZHRoKDEpOwoJZG9jLnNldERyYXdDb2xvcigyNTUsMCwwKTsKCWRvYy5zZXRGaWxsQ29sb3IoMCwwLDI1NSk7Cglkb2MudHJpYW5nbGUoMTAwLCAxMDAsIDExMCwgMTAwLCAxMjAsIDEzMCwgJ0ZEJyk7CgkKCWRvYy5zYXZlKCdUZXN0LnBkZicpOwp9CgpmdW5jdGlvbiBkZW1vSW1hZ2VzKCkgewoJLy8gQmVjYXVzZSBvZiBzZWN1cml0eSByZXN0cmljdGlvbnMsIGdldEltYWdlRnJvbVVybCB3aWxsCgkvLyBub3QgbG9hZCBpbWFnZXMgZnJvbSBvdGhlciBkb21haW5zLiAgQ2hyb21lIGhhcyBhZGRlZAoJLy8gc2VjdXJpdHkgcmVzdHJpY3Rpb25zIHRoYXQgcHJldmVudCBpdCBmcm9tIGxvYWRpbmcgaW1hZ2VzCgkvLyB3aGVuIHJ1bm5pbmcgbG9jYWwgZmlsZXMuICBSdW4gd2l0aDogY2hyb21pdW0gLS1hbGxvdy1maWxlLWFjY2Vzcy1mcm9tLWZpbGVzIC0tYWxsb3ctZmlsZS1hY2Nlc3MKCS8vIHRvIHRlbXBvcmFyaWx5IGdldCBhcm91bmQgdGhpcyBpc3N1ZS4KCXZhciBnZXRJbWFnZUZyb21VcmwgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CgkJdmFyIGltZyA9IG5ldyBJbWFnZSwgZGF0YSwgcmV0PXtkYXRhOiBudWxsLCBwZW5kaW5nOiB0cnVlfTsKCQkKCQlpbWcub25FcnJvciA9IGZ1bmN0aW9uKCkgewoJCQl0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBsb2FkIGltYWdlOiAiJyt1cmwrJyInKTsKCQl9CgkJaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CgkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTsKCQkJY2FudmFzLndpZHRoID0gaW1nLndpZHRoOwoJCQljYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDsKCgkJCXZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCQkJY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApOwoJCQkvLyBHcmFiIHRoZSBpbWFnZSBhcyBhIGpwZWcgZW5jb2RlZCBpbiBiYXNlNjQsIGJ1dCBvbmx5IHRoZSBkYXRhCgkJCWRhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJykuc2xpY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJy5sZW5ndGgpOwoJCQkvLyBDb252ZXJ0IHRoZSBkYXRhIHRvIGJpbmFyeSBmb3JtCgkJCWRhdGEgPSBhdG9iKGRhdGEpCgkJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY2FudmFzKTsKCgkJCXJldFsnZGF0YSddID0gZGF0YTsKCQkJcmV0WydwZW5kaW5nJ10gPSBmYWxzZTsKCQkJaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgewoJCQkJY2FsbGJhY2soZGF0YSk7CgkJCX0KCQl9CgkJaW1nLnNyYyA9IHVybDsKCgkJcmV0dXJuIHJldDsKCX0KCgkvLyBTaW5jZSBpbWFnZXMgYXJlIGxvYWRlZCBhc3luY3Jvbm91c2x5LCB3ZSBtdXN0IHdhaXQgdG8gY3JlYXRlCgkvLyB0aGUgcGRmIHVudGlsIHdlIGFjdHVhbGx5IGhhdmUgdGhlIGltYWdlIGRhdGEuCgkvLyBJZiB3ZSBhbHJlYWR5IGhhZCB0aGUganBlZyBpbWFnZSBiaW5hcnkgZGF0YSBsb2FkZWQgaW50bwoJLy8gYSBzdHJpbmcsIHdlIGNyZWF0ZSB0aGUgcGRmIHdpdGhvdXQgZGVsYXkuCgl2YXIgY3JlYXRlUERGID0gZnVuY3Rpb24oaW1nRGF0YSkgewoJCXZhciBkb2MgPSBuZXcganNQREYoKTsKCgkJZG9jLmFkZEltYWdlKGltZ0RhdGEsICdKUEVHJywgMTAsIDEwLCA1MCwgNTApOwoJCWRvYy5hZGRJbWFnZShpbWdEYXRhLCAnSlBFRycsIDcwLCAxMCwgMTAwLCAxMjApOwoKCQlkb2Muc2F2ZSgnb3V0cHV0LnBkZicpOwoKCX0KCglnZXRJbWFnZUZyb21VcmwoJ3RoaW5raW5nLW1vbmtleS5qcGcnLCBjcmVhdGVQREYpOwp9CgpmdW5jdGlvbiBkZW1vU3RyaW5nU3BsaXR0aW5nKCkgewoKCXZhciBwZGYgPSBuZXcganNQREYoJ3AnLCdpbicsJ2xldHRlcicpCgksIHNpemVzID0gWzEyLCAxNiwgMjBdCgksIGZvbnRzID0gW1snVGltZXMnLCdSb21hbiddLFsnSGVsdmV0aWNhJywnJ10sIFsnVGltZXMnLCdJdGFsaWMnXV0KCSwgZm9udCwgc2l6ZSwgbGluZXMKCSwgbWFyZ2luID0gMC41IC8vIGluY2hlcyBvbiBhIDguNSB4IDExIGluY2ggc2hlZXQuCgksIHZlcnRpY2FsT2Zmc2V0ID0gbWFyZ2luCgksIGxvcmVtaXBzdW0gPSAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gUGhhc2VsbHVzIGlkIGVyb3MgdHVycGlzLiBWaXZhbXVzIHRlbXBvciB1cm5hIHZpdGFlIHNhcGllbiBtb2xsaXMgbW9sZXN0aWUuIFZlc3RpYnVsdW0gaW4gbGVjdHVzIG5vbiBlbmltIGJpYmVuZHVtIGxhb3JlZXQgYXQgYXQgbGliZXJvLiBFdGlhbSBtYWxlc3VhZGEgZXJhdCBzZWQgc2VtIGJsYW5kaXQgaW4gdmFyaXVzIG9yY2kgcG9ydHRpdG9yLiBTZWQgYXQgc2FwaWVuIHVybmEuIEZ1c2NlIGF1Z3VlIGlwc3VtLCBtb2xlc3RpZSBldCBhZGlwaXNjaW5nIGF0LCB2YXJpdXMgcXVpcyBlbmltLiBNb3JiaSBzZWQgbWFnbmEgZXN0LCB2ZWwgdmVzdGlidWx1bSB1cm5hLiBTZWQgdGVtcG9yIGlwc3VtIHZlbCBtaSBwcmV0aXVtIGF0IGVsZW1lbnR1bSB1cm5hIHRlbXBvci4gTnVsbGEgZmF1Y2lidXMgY29uc2VjdGV0dXIgZmVsaXMsIGVsZW1lbnR1bSB2ZW5lbmF0aXMgbWkgbW9sbGlzIGdyYXZpZGEuIEFsaXF1YW0gbWkgYW50ZSwgYWNjdW1zYW4gZXUgdGVtcHVzIHZpdGFlLCB2aXZlcnJhIHF1aXMganVzdG8uXG5cblByb2luIGZldWdpYXQgYXVndWUgaW4gYXVndWUgcmhvbmN1cyBldSBjdXJzdXMgdGVsbHVzIGxhb3JlZXQuIFBlbGxlbnRlc3F1ZSBldSBzYXBpZW4gYXQgZGlhbSBwb3J0dGl0b3IgdmVuZW5hdGlzIG5lYyB2aXRhZSB2ZWxpdC4gRG9uZWMgdWx0cmljZXMgdm9sdXRwYXQgbGVjdHVzIGVnZXQgdmVoaWN1bGEuIE5hbSBldSBlcmF0IG1pLCBpbiBwdWx2aW5hciBlcm9zLiBNYXVyaXMgdml2ZXJyYSBwb3J0YSBvcmNpLCBldCB2ZWhpY3VsYSBsZWN0dXMgc2FnaXR0aXMgaWQuIE51bGxhbSBhdCBtYWduYSB2aXRhZSBudW5jIGZyaW5naWxsYSBwb3N1ZXJlLiBEdWlzIHZvbHV0cGF0IG1hbGVzdWFkYSBvcm5hcmUuIE51bGxhIGluIGVyb3MgbWV0dXMuIFZpdmFtdXMgYSBwb3N1ZXJlIGxpYmVyby4nCgoJLy8gTWFyZ2luczoKCXBkZi5zZXREcmF3Q29sb3IoMCwgMjU1LCAwKQoJCS5zZXRMaW5lV2lkdGgoMS83MikKCQkubGluZShtYXJnaW4sIG1hcmdpbiwgbWFyZ2luLCAxMSAtIG1hcmdpbikKCQkubGluZSg4LjUgLSBtYXJnaW4sIG1hcmdpbiwgOC41LW1hcmdpbiwgMTEtbWFyZ2luKQoKCS8vIHRoZSAzIGJsb2NrcyBvZiB0ZXh0Cglmb3IgKHZhciBpIGluIGZvbnRzKXsKCQlpZiAoZm9udHMuaGFzT3duUHJvcGVydHkoaSkpIHsKCQkJZm9udCA9IGZvbnRzW2ldCgkJCXNpemUgPSBzaXplc1tpXQoKCQkJbGluZXMgPSBwZGYuc2V0Rm9udChmb250WzBdLCBmb250WzFdKQoJCQkJCQkuc2V0Rm9udFNpemUoc2l6ZSkKCQkJCQkJLnNwbGl0VGV4dFRvU2l6ZShsb3JlbWlwc3VtLCA3LjUpCgkJCS8vIERvbid0IHdhbnQgdG8gcHJlc2V0IGZvbnQsIHNpemUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lcz8KCQkJLy8gLnNwbGl0VGV4dFRvU2l6ZSh0ZXh0LCBtYXhzaXplLCBvcHRpb25zKQoJCQkvLyBhbGxvd3MgeW91IHRvIHBhc3MgYW4gb2JqZWN0IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmc6CgkJCS8vIHsKCQkJLy8gCSdmb250U2l6ZSc6IDEyCgkJCS8vIAksICdmb250U3R5bGUnOiAnSXRhbGljJwoJCQkvLyAJLCAnZm9udE5hbWUnOiAnVGltZXMnCgkJCS8vIH0KCQkJLy8gV2l0aG91dCB0aGVzZSwgLnNwbGl0VGV4dFRvU2l6ZSB3aWxsIHVzZSBjdXJyZW50IC8gZGVmYXVsdAoJCQkvLyBmb250IEZhbWlseSwgU3R5bGUsIFNpemUuCgkJCWNvbnNvbGUubG9nKGxpbmVzKTsKCQkJcGRmLnRleHQoMC41LCB2ZXJ0aWNhbE9mZnNldCArIHNpemUgLyA3MiwgbGluZXMpCgoJCQl2ZXJ0aWNhbE9mZnNldCArPSAobGluZXMubGVuZ3RoICsgMC41KSAqIHNpemUgLyA3MgoJCX0KCX0KCglwZGYuc2F2ZSgnVGVzdC5wZGYnKTsKfQoKZnVuY3Rpb24gZGVtb0Zyb21IVE1MKCkgewoJdmFyIHBkZiA9IG5ldyBqc1BERigncCcsJ2luJywnbGV0dGVyJykKCgkvLyBzb3VyY2UgY2FuIGJlIEhUTUwtZm9ybWF0dGVkIHN0cmluZywgb3IgYSByZWZlcmVuY2UKCS8vIHRvIGFuIGFjdHVhbCBET00gZWxlbWVudCBmcm9tIHdoaWNoIHRoZSB0ZXh0IHdpbGwgYmUgc2NyYXBlZC4KCSwgc291cmNlID0gJCgnI2Zyb21IVE1MdGVzdGRpdicpWzBdCgoJLy8gd2Ugc3VwcG9ydCBzcGVjaWFsIGVsZW1lbnQgaGFuZGxlcnMuIFJlZ2lzdGVyIHRoZW0gd2l0aCBqUXVlcnktc3R5bGUgCgkvLyBJRCBzZWxlY3RvciBmb3IgZWl0aGVyIElEIG9yIG5vZGUgbmFtZS4gKCIjaUFtSUQiLCAiZGl2IiwgInNwYW4iIGV0Yy4pCgkvLyBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBhbnkgb3RoZXIgdHlwZSBvZiBzZWxlY3RvcnMgCgkvLyAoY2xhc3MsIG9mIGNvbXBvdW5kKSBhdCB0aGlzIHRpbWUuCgksIHNwZWNpYWxFbGVtZW50SGFuZGxlcnMgPSB7CgkJLy8gZWxlbWVudCB3aXRoIGlkIG9mICJieXBhc3MiIC0galF1ZXJ5IHN0eWxlIHNlbGVjdG9yCgkJJyNieXBhc3NtZSc6IGZ1bmN0aW9uKGVsZW1lbnQsIHJlbmRlcmVyKXsKCQkJLy8gdHJ1ZSA9ICJoYW5kbGVkIGVsc2V3aGVyZSwgYnlwYXNzIHRleHQgZXh0cmFjdGlvbiIKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CgoJLy8gYWxsIGNvb3JkcyBhbmQgd2lkdGhzIGFyZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzCgkvLyAnaW5jaGVzJyBpbiB0aGlzIGNhc2UKCXBkZi5mcm9tSFRNTCgKCQlzb3VyY2UgLy8gSFRNTCBzdHJpbmcgb3IgRE9NIGVsZW0gcmVmLgoJCSwgMC41IC8vIHggY29vcmQKCQksIDAuNSAvLyB5IGNvb3JkCgkJLCB7CgkJCSd3aWR0aCc6Ny41IC8vIG1heCB3aWR0aCBvZiBjb250ZW50IG9uIFBERgoJCQksICdlbGVtZW50SGFuZGxlcnMnOiBzcGVjaWFsRWxlbWVudEhhbmRsZXJzCgkJfQoJKQoKCXBkZi5zYXZlKCdUZXN0LnBkZicpOwp9'
twojsn = 'jspdf.plugin.standard_fonts_metrics.js'
twojsd = 'LyoqIEBwcmVzZXJ2ZSAKanNQREYgc3RhbmRhcmRfZm9udHNfbWV0cmljcyBwbHVnaW4KQ29weXJpZ2h0IChjKSAyMDEyIFdpbGxvdyBTeXN0ZW1zIENvcnBvcmF0aW9uLCB3aWxsb3ctc3lzdGVtcy5jb20KTUlUIGxpY2Vuc2UuCiovCi8qKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCiAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCiAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KCjsoZnVuY3Rpb24oQVBJKSB7Cid1c2Ugc3RyaWN0JwoKLyoKIyByZWZlcmVuY2UgKFB5dGhvbikgdmVyc2lvbnMgb2YgJ2NvbXByZXNzJyBhbmQgJ3VuY29tcHJlc3MnCiMgb25seSAndW5jb21wcmVzcycgZnVuY3Rpb24gaXMgZmVhdHVyZWQgbG93ZXIgYXMgSmF2YVNjcmlwdAojIGlmIHlvdSB3YW50IHRvIHVuaXQgdGVzdCAicm91bmR0cmlwIiwganVzdCB0cmFuc2NyaWJlIHRoZSByZWZlcmVuY2UKIyAnY29tcHJlc3MnIGZ1bmN0aW9uIGZyb20gUHl0aG9uIGludG8gSmF2YVNjcmlwdAoKZGVmIGNvbXByZXNzKGRhdGEpOgoKCWtleXMgPSAgICcwMTIzNDU2Nzg5YWJjZGVmJwoJdmFsdWVzID0gJ2tsbW5vcHFyc3R1dnd4eXonCgltYXBwaW5nID0gZGljdCh6aXAoa2V5cywgdmFsdWVzKSkKCXZhbHMgPSBbXQoJZm9yIGtleSBpbiBkYXRhLmtleXMoKToKCQl2YWx1ZSA9IGRhdGFba2V5XQoJCXRyeToKCQkJa2V5c3RyaW5nID0gaGV4KGtleSlbMjpdCgkJCWtleXN0cmluZyA9IGtleXN0cmluZ1s6LTFdICsgbWFwcGluZ1trZXlzdHJpbmdbLTE6XV0KCQlleGNlcHQ6CgkJCWtleXN0cmluZyA9IGtleS5qb2luKFsiJyIsIiciXSkKCQkJI3ByaW50KCdLZXlzdHJpbmcgaXMgJXMnICUga2V5c3RyaW5nKQoKCQl0cnk6CgkJCWlmIHZhbHVlIDwgMDoKCQkJCXZhbHVlc3RyaW5nID0gaGV4KHZhbHVlKVszOl0KCQkJCW51bWJlcnByZWZpeCA9ICctJwoJCQllbHNlOgoJCQkJdmFsdWVzdHJpbmcgPSBoZXgodmFsdWUpWzI6XQoJCQkJbnVtYmVycHJlZml4ID0gJycKCQkJdmFsdWVzdHJpbmcgPSBudW1iZXJwcmVmaXggKyB2YWx1ZXN0cmluZ1s6LTFdICsgbWFwcGluZ1t2YWx1ZXN0cmluZ1stMTpdXQoJCWV4Y2VwdDoKCQkJaWYgdHlwZSh2YWx1ZSkgPT0gZGljdDoKCQkJCXZhbHVlc3RyaW5nID0gY29tcHJlc3ModmFsdWUpCgkJCWVsc2U6CgkJCQlyYWlzZSBFeGNlcHRpb24oIkRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHZhbHVlIHR5cGUgJXMiICUgdHlwZSh2YWx1ZSkpCgoJCXZhbHMuYXBwZW5kKGtleXN0cmluZyt2YWx1ZXN0cmluZykKCQoJcmV0dXJuICd7JyArICcnLmpvaW4odmFscykgKyAnfScKCmRlZiB1bmNvbXByZXNzKGRhdGEpOgoKCWRlY29kZWQgPSAnMDEyMzQ1Njc4OWFiY2RlZicKCWVuY29kZWQgPSAna2xtbm9wcXJzdHV2d3h5eicKCW1hcHBpbmcgPSBkaWN0KHppcChlbmNvZGVkLCBkZWNvZGVkKSkKCglzaWduID0gKzEKCXN0cmluZ21vZGUgPSBGYWxzZQoJc3RyaW5ncGFydHMgPSBbXQoKCW91dHB1dCA9IHt9CgoJYWN0aXZlb2JqZWN0ID0gb3V0cHV0CglwYXJlbnRjaGFpbiA9IFtdCgoJa2V5cGFydHMgPSAnJwoJdmFsdWVwYXJ0cyA9ICcnCgoJa2V5ID0gTm9uZQoKCWVuZGluZyA9IHNldChlbmNvZGVkKQoKCWkgPSAxCglsID0gbGVuKGRhdGEpIC0gMSAjIHN0cmlwcGluZyBzdGFydGluZywgZW5kaW5nIHt9Cgl3aGlsZSBpICE9IGw6ICMgc3RyaXBwaW5nIHt9CgkJIyAtLCB7LCB9LCAnIGFyZSBzcGVjaWFsLgoKCQljaCA9IGRhdGFbaV0KCQlpICs9IDEKCgkJaWYgY2ggPT0gIiciOgoJCQlpZiBzdHJpbmdtb2RlOgoJCQkJIyBlbmQgb2Ygc3RyaW5nIG1vZGUKCQkJCXN0cmluZ21vZGUgPSBGYWxzZQoJCQkJa2V5ID0gJycuam9pbihzdHJpbmdwYXJ0cykKCQkJZWxzZToKCQkJCSMgc3RhcnQgb2Ygc3RyaW5nIG1vZGUKCQkJCXN0cmluZ21vZGUgPSBUcnVlCgkJCQlzdHJpbmdwYXJ0cyA9IFtdCgkJZWxpZiBzdHJpbmdtb2RlID09IFRydWU6CgkJCSNwcmludCgiQWRkaW5nICVzIHRvIHN0cmluZ3BhcnQiICUgY2gpCgkJCXN0cmluZ3BhcnRzLmFwcGVuZChjaCkKCgkJZWxpZiBjaCA9PSAneyc6CgkJCSMgc3RhcnQgb2Ygb2JqZWN0CgkJCXBhcmVudGNoYWluLmFwcGVuZCggW2FjdGl2ZW9iamVjdCwga2V5XSApCgkJCWFjdGl2ZW9iamVjdCA9IHt9CgkJCWtleSA9IE5vbmUKCQkJI0RFQlVHID0gVHJ1ZQoJCWVsaWYgY2ggPT0gJ30nOgoJCQkjIGVuZCBvZiBvYmplY3QKCQkJcGFyZW50LCBrZXkgPSBwYXJlbnRjaGFpbi5wb3AoKQoJCQlwYXJlbnRba2V5XSA9IGFjdGl2ZW9iamVjdAoJCQlrZXkgPSBOb25lCgkJCWFjdGl2ZW9iamVjdCA9IHBhcmVudAoJCQkjREVCVUcgPSBGYWxzZQoKCQllbGlmIGNoID09ICctJzoKCQkJc2lnbiA9IC0xCgkJZWxzZToKCQkJIyBtdXN0IGJlIG51bWJlcgoJCQlpZiBrZXkgPT0gTm9uZToKCQkJCSNkZWJ1ZygiSW4gS2V5LiBJdCBpcyAnJXMnLCBjaCBpcyAnJXMnIiAlIChrZXlwYXJ0cywgY2gpKQoJCQkJaWYgY2ggaW4gZW5kaW5nOgoJCQkJCSNkZWJ1ZygiRW5kIG9mIGtleSIpCgkJCQkJa2V5cGFydHMgKz0gbWFwcGluZ1tjaF0KCQkJCQlrZXkgPSBpbnQoa2V5cGFydHMsIDE2KSAqIHNpZ24KCQkJCQlzaWduID0gKzEKCQkJCQlrZXlwYXJ0cyA9ICcnCgkJCQllbHNlOgoJCQkJCWtleXBhcnRzICs9IGNoCgkJCWVsc2U6CgkJCQkjZGVidWcoIkluIHZhbHVlLiBJdCBpcyAnJXMnLCBjaCBpcyAnJXMnIiAlICh2YWx1ZXBhcnRzLCBjaCkpCgkJCQlpZiBjaCBpbiBlbmRpbmc6CgkJCQkJI2RlYnVnKCJFbmQgb2YgdmFsdWUiKQoJCQkJCXZhbHVlcGFydHMgKz0gbWFwcGluZ1tjaF0KCQkJCQlhY3RpdmVvYmplY3Rba2V5XSA9IGludCh2YWx1ZXBhcnRzLCAxNikgKiBzaWduCgkJCQkJc2lnbiA9ICsxCgkJCQkJa2V5ID0gTm9uZQoJCQkJCXZhbHVlcGFydHMgPSAnJwoJCQkJZWxzZToKCQkJCQl2YWx1ZXBhcnRzICs9IGNoCgoJCQkjZGVidWcoYWN0aXZlb2JqZWN0KQoKCXJldHVybiBvdXRwdXQKCiovCgovKioKVW5jb21wcmVzc2VzIGRhdGEgY29tcHJlc3NlZCBpbnRvIGN1c3RvbSwgYmFzZTE2LWxpa2UgZm9ybWF0LiAKQHB1YmxpYwpAZnVuY3Rpb24KQHBhcmFtCkByZXR1cm5zIHtUeXBlfQoqLwp2YXIgdW5jb21wcmVzcyA9IGZ1bmN0aW9uKGRhdGEpewoKCXZhciBkZWNvZGVkID0gJzAxMjM0NTY3ODlhYmNkZWYnCgksIGVuY29kZWQgPSAna2xtbm9wcXJzdHV2d3h5eicKCSwgbWFwcGluZyA9IHt9CgoJZm9yICh2YXIgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSsrKXsKCQltYXBwaW5nW2VuY29kZWRbaV1dID0gZGVjb2RlZFtpXQoJfQoKCXZhciB1bmRlZgoJLCBvdXRwdXQgPSB7fQoJLCBzaWduID0gMQoJLCBzdHJpbmdwYXJ0cyAvLyB1bmRlZi4gd2lsbCBiZSBbXSBpbiBzdHJpbmcgbW9kZQoJCgksIGFjdGl2ZW9iamVjdCA9IG91dHB1dAoJLCBwYXJlbnRjaGFpbiA9IFtdCgksIHBhcmVudF9rZXlfcGFpcgoJLCBrZXlwYXJ0cyA9ICcnCgksIHZhbHVlcGFydHMgPSAnJwoJLCBrZXkgLy8gdW5kZWYuIHdpbGwgYmUgVHJ1dGh5IHdoZW4gS2V5IGlzIHJlc29sdmVkLgoJLCBkYXRhbGVuID0gZGF0YS5sZW5ndGggLSAxIC8vIHN0cmlwcGluZyBlbmRpbmcgfQoJLCBjaAoKCWkgPSAxIC8vIHN0cmlwcGluZyBzdGFydGluZyB7CgkKCXdoaWxlIChpICE9IGRhdGFsZW4pewoJCS8vIC0geyB9ICcgYXJlIHNwZWNpYWwuCgoJCWNoID0gZGF0YVtpXQoJCWkgKz0gMQoKCQlpZiAoY2ggPT0gIiciKXsKCQkJaWYgKHN0cmluZ3BhcnRzKXsKCQkJCS8vIGVuZCBvZiBzdHJpbmcgbW9kZQoJCQkJa2V5ID0gc3RyaW5ncGFydHMuam9pbignJykKCQkJCXN0cmluZ3BhcnRzID0gdW5kZWYJCQkJCgkJCX0gZWxzZSB7CgkJCQkvLyBzdGFydCBvZiBzdHJpbmcgbW9kZQoJCQkJc3RyaW5ncGFydHMgPSBbXQkJCQkKCQkJfQoJCX0gZWxzZSBpZiAoc3RyaW5ncGFydHMpewoJCQlzdHJpbmdwYXJ0cy5wdXNoKGNoKQoJCX0gZWxzZSBpZiAoY2ggPT0gJ3snKXsKCQkJLy8gc3RhcnQgb2Ygb2JqZWN0CgkJCXBhcmVudGNoYWluLnB1c2goIFthY3RpdmVvYmplY3QsIGtleV0gKQoJCQlhY3RpdmVvYmplY3QgPSB7fQoJCQlrZXkgPSB1bmRlZgoJCX0gZWxzZSBpZiAoY2ggPT0gJ30nKXsKCQkJLy8gZW5kIG9mIG9iamVjdAoJCQlwYXJlbnRfa2V5X3BhaXIgPSBwYXJlbnRjaGFpbi5wb3AoKQoJCQlwYXJlbnRfa2V5X3BhaXJbMF1bcGFyZW50X2tleV9wYWlyWzFdXSA9IGFjdGl2ZW9iamVjdAoJCQlrZXkgPSB1bmRlZgoJCQlhY3RpdmVvYmplY3QgPSBwYXJlbnRfa2V5X3BhaXJbMF0KCQl9IGVsc2UgaWYgKGNoID09ICctJyl7CgkJCXNpZ24gPSAtMQoJCX0gZWxzZSB7CgkJCS8vIG11c3QgYmUgbnVtYmVyCgkJCWlmIChrZXkgPT09IHVuZGVmKSB7CgkJCQlpZiAobWFwcGluZy5oYXNPd25Qcm9wZXJ0eShjaCkpewoJCQkJCWtleXBhcnRzICs9IG1hcHBpbmdbY2hdCgkJCQkJa2V5ID0gcGFyc2VJbnQoa2V5cGFydHMsIDE2KSAqIHNpZ24KCQkJCQlzaWduID0gKzEKCQkJCQlrZXlwYXJ0cyA9ICcnCgkJCQl9IGVsc2UgewoJCQkJCWtleXBhcnRzICs9IGNoCgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAobWFwcGluZy5oYXNPd25Qcm9wZXJ0eShjaCkpewoJCQkJCXZhbHVlcGFydHMgKz0gbWFwcGluZ1tjaF0KCQkJCQlhY3RpdmVvYmplY3Rba2V5XSA9IHBhcnNlSW50KHZhbHVlcGFydHMsIDE2KSAqIHNpZ24KCQkJCQlzaWduID0gKzEKCQkJCQlrZXkgPSB1bmRlZgoJCQkJCXZhbHVlcGFydHMgPSAnJwoJCQkJfSBlbHNlIHsKCQkJCQl2YWx1ZXBhcnRzICs9IGNoCQkJCQkKCQkJCX0KCQkJfQoJCX0KCX0gLy8gZW5kIHdoaWxlCgoJcmV0dXJuIG91dHB1dAp9CgovLyBlbmNvZGluZyA9ICdVbmljb2RlJyAKLy8gTk9UIFVURjgsIE5PVCBVVEYxNkJFL0xFLCBOT1QgVUNTMkJFL0xFLiBOTyBjbGV2ZXIgQk9NIGJlaGF2aW9yCi8vIEFjdHVhbCAxNmJpdCBjaGFyIGNvZGVzIHVzZWQuCi8vIG5vIG11bHRpLWJ5dGUgbG9naWMgaGVyZQoKLy8gVW5pY29kZSBjaGFyYWN0ZXJzIHRvIFdpbkFuc2lFbmNvZGluZzoKLy8gezQwMjogMTMxLCA4MjExOiAxNTAsIDgyMTI6IDE1MSwgODIxNjogMTQ1LCA4MjE3OiAxNDYsIDgyMTg6IDEzMCwgODIyMDogMTQ3LCA4MjIxOiAxNDgsIDgyMjI6IDEzMiwgODIyNDogMTM0LCA4MjI1OiAxMzUsIDgyMjY6IDE0OSwgODIzMDogMTMzLCA4MzY0OiAxMjgsIDgyNDA6MTM3LCA4MjQ5OiAxMzksIDgyNTA6IDE1NSwgNzEwOiAxMzYsIDg0ODI6IDE1MywgMzM4OiAxNDAsIDMzOTogMTU2LCA3MzI6IDE1MiwgMzUyOiAxMzgsIDM1MzogMTU0LCAzNzY6IDE1OSwgMzgxOiAxNDIsIDM4MjogMTU4fQovLyBhcyB5b3UgY2FuIHNlZSwgYWxsIFVuaWNvZGUgY2hhcnMgYXJlIG91dHNpZGUgb2YgMC0yNTUgcmFuZ2UuIE5vIGNoYXIgY29kZSBjb25mbGljdHMuCi8vIHRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGdpdmUgV2luIGNwMTI1MiBlbmNvZGVkIHN0cmluZ3MgdG8ganNQREYgZm9yIHJlbmRlcmluZyBkaXJlY3RseQovLyBhcyB3ZWxsIGFzIGdpdmUgc3RyaW5ncyB3aXRoIHNvbWUgKHN1cHBvcnRlZCBieSB0aGVzZSBmb250cykgVW5pY29kZSBjaGFyYWN0ZXJzIGFuZCAKLy8gdGhlc2Ugd2lsbCBiZSBtYXBwZWQgdG8gd2luIGNwMTI1MiAKLy8gZm9yIGV4YW1wbGUsIHlvdSBjYW4gc2VuZCBjaGFyIGNvZGUgKGNwMTI1MikgMHg4MCBvciAodW5pY29kZSkgMHgyMEFDLCBnZXR0aW5nICJFdXJvIiBnbHlwaCBkaXNwbGF5ZWQgaW4gYm90aCBjYXNlcy4KCnZhciBlbmNvZGluZ0Jsb2NrID0gewoJJ2NvZGVQYWdlcyc6IFsnV2luQW5zaUVuY29kaW5nJ10KCSwgJ1dpbkFuc2lFbmNvZGluZyc6IHVuY29tcHJlc3MoInsxOW04bjIwMW45cTIwMW85cjIwMXM5bDIwMXQ5bTIwMXU4bTIwMXc5bjIwMXg5bzIwMXk4bzIwMms4cTIwMmw4cjIwMm05cDIwMnE4cDIwYXc4azIwM2s4dDIwM3Q4djIwM3U5djJjcThzMjEybTl0MTVtOHcxNW45dzJkdzlzMTZrOHUxNmw5dTE3czl6MTd4OHkxN3k5eX0iKQp9CiwgZW5jb2RpbmdzID0geydVbmljb2RlJzp7CgknQ291cmllcic6IGVuY29kaW5nQmxvY2sKCSwgJ0NvdXJpZXItQm9sZCc6IGVuY29kaW5nQmxvY2sKCSwgJ0NvdXJpZXItQm9sZE9ibGlxdWUnOiBlbmNvZGluZ0Jsb2NrCgksICdDb3VyaWVyLU9ibGlxdWUnOiBlbmNvZGluZ0Jsb2NrCgksICdIZWx2ZXRpY2EnOiBlbmNvZGluZ0Jsb2NrCgksICdIZWx2ZXRpY2EtQm9sZCc6IGVuY29kaW5nQmxvY2sKCSwgJ0hlbHZldGljYS1Cb2xkT2JsaXF1ZSc6IGVuY29kaW5nQmxvY2sKCSwgJ0hlbHZldGljYS1PYmxpcXVlJzogZW5jb2RpbmdCbG9jawoJLCAnVGltZXMtUm9tYW4nOiBlbmNvZGluZ0Jsb2NrCgksICdUaW1lcy1Cb2xkJzogZW5jb2RpbmdCbG9jawoJLCAnVGltZXMtQm9sZEl0YWxpYyc6IGVuY29kaW5nQmxvY2sKCSwgJ1RpbWVzLUl0YWxpYyc6IGVuY29kaW5nQmxvY2sKLy8JLCAnU3ltYm9sJwovLwksICdaYXBmRGluZ2JhdHMnCn19Ci8qKiAKUmVzb3VyY2VzOgpGb250IG1ldHJpY3MgZGF0YSBpcyByZXByb2Nlc3NlZCBkZXJpdmF0aXZlIG9mIGNvbnRlbnRzIG9mCiJGb250IE1ldHJpY3MgZm9yIFBERiBDb3JlIDE0IEZvbnRzIiBwYWNrYWdlLCB3aGljaCBleGhpYml0cyB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZToKCkNvcHlyaWdodCAoYykgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRoaXMgZmlsZSBhbmQgdGhlIDE0IFBvc3RTY3JpcHQoUikgQUZNIGZpbGVzIGl0IGFjY29tcGFuaWVzIG1heSBiZSB1c2VkLApjb3BpZWQsIGFuZCBkaXN0cmlidXRlZCBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IGFsbCBjb3B5cmlnaHQgbm90aWNlcyBhcmUgcmV0YWluZWQ7IHRoYXQgdGhlIEFGTQpmaWxlcyBhcmUgbm90IGRpc3RyaWJ1dGVkIHdpdGhvdXQgdGhpcyBmaWxlOyB0aGF0IGFsbCBtb2RpZmljYXRpb25zIHRvIHRoaXMKZmlsZSBvciBhbnkgb2YgdGhlIEFGTSBmaWxlcyBhcmUgcHJvbWluZW50bHkgbm90ZWQgaW4gdGhlIG1vZGlmaWVkIGZpbGUocyk7CmFuZCB0aGF0IHRoaXMgcGFyYWdyYXBoIGlzIG5vdCBtb2RpZmllZC4gQWRvYmUgU3lzdGVtcyBoYXMgbm8gcmVzcG9uc2liaWxpdHkKb3Igb2JsaWdhdGlvbiB0byBzdXBwb3J0IHRoZSB1c2Ugb2YgdGhlIEFGTSBmaWxlcy4KCiovCiwgZm9udE1ldHJpY3MgPSB7J1VuaWNvZGUnOnsKCS8vIGFsbCBzaXppbmcgbnVtYmVycyBhcmUgbi9mb250TWV0cmljc0ZyYWN0aW9uT2YgPSBvbmUgZm9udCBzaXplIHVuaXQKCS8vIHRoaXMgbWVhbnMgdGhhdCBpZiBmb250TWV0cmljc0ZyYWN0aW9uT2YgPSAxMDAwLCBhbmQgbGV0dGVyIEEncyB3aWR0aCBpcyA0NzYsIGl0J3MKCS8vIHdpZHRoIGlzIDQ3Ni8xMDAwIG9yIDQ3LjYlIG9mIGl0cyBoZWlnaHQgKHJlZ2FyZGxlc3Mgb2YgZm9udCBzaXplKQoJLy8gQXQgdGhpcyB0aW1lIHRoaXMgdmFsdWUgYXBwbGllcyB0byAid2lkdGhzIiBhbmQgImtlcm5pbmciIG51bWJlcnMuCgoJLy8gY2hhciBjb2RlIDAgcmVwcmVzZW50cyAiZGVmYXVsdCIgKGF2ZXJhZ2UpIHdpZHRoIC0gdXNlIGl0IGZvciBjaGFycyBtaXNzaW5nIGluIHRoaXMgdGFibGUuCgkvLyBrZXkgJ2ZvZicgcmVwcmVzZW50cyB0aGUgImZvbnRNZXRyaWNzRnJhY3Rpb25PZiIgdmFsdWUKCgknQ291cmllci1PYmxpcXVlJzogdW5jb21wcmVzcygieyd3aWR0aHMne2szdydmb2YnNm99J2tlcm5pbmcneydmb2YnLTZvfX0iKQoJLCAnVGltZXMtQm9sZEl0YWxpYyc6IHVuY29tcHJlc3MoInsnd2lkdGhzJ3trM28ycTR5Y3gycjIwMW4zbTIwMW82bzIwMXMybDIwMXQybDIwMXUybDIwMXczbTIwMXgzbTIwMXkzbTJrMXQybDJyMjAybTJuMm4zbTJvM20ycDVuMjAycTZvMnIxdzJzMmwydDJsMnUzbTJ2M3QydzF0MngybDJ5MXQyejF3M2szbTNsM20zbTNtM24zbTNvM20zcDNtM3EzbTNyM20zczNtMjAzdDJsMjAzdTJsM3YybDN3M3QzeDN0M3kzdDN6M200azVuNGw0bTRtNG00bjRtNG80czRwNG00cTRtNHI0czRzNHk0dDJyNHUzbTR2NG00dzN4NHg1dDR5NHM0ejRzNWszeDVsNHM1bTRtNW4zcjVvM3g1cDRzNXE0bTVyNXQ1czRtNXQzeDV1M3g1djJsNXcxdzV4Mmw1eTN0NXozbTZrMmw2bDNtNm0zbTZuMnc2bzNtNnAydzZxMmw2cjNtNnMzcjZ0MXc2dTF3NnYzbTZ3MXc2eDR5NnkzcjZ6M203azNtN2wzbTdtMnI3bjJyN28xdzdwM3I3cTJ3N3I0bTdzM203dDJ3N3Uycjd2Mm43dzFxN3gybjd5M3QyMDJsM21jbDRtYWwycmFtM21hbjNtYW8zbWFwM21hcjNtYXMybGF0NHVhdTF1YXYzbWF3M3dheTR1YXoybGJrMnNibDN0J2ZvZic2b2JvMmxicDN0YnEzbWJyMXRiczJsYnUxeWJ2M21iejNtY2s0bTIwMmszbWNtNG1jbjRtY280bWNwNG1jcTV5Y3I0bWNzNG1jdDRtY3U0bWN2NG1jdzJyMm0zcmN5MnJjejJyZGw0c2RtNHNkbjRzZG80c2RwNHNkcTRzZHM0c2R0NHNkdTRzZHY0c2R3NHNkejNtZWszbWVsM21lbTNtZW4zbWVvM21lcDNtZXE0c2VyMndlczJ3ZXQyd2V1MndldjJ3ZXcxd2V4MXdleTF3ZXoxd2ZsM3JmbTNtZm4zbWZvM21mcDNtZnEzbWZyM3RmczNtZnQzcmZ1M3JmdjNyZnczcmZ6MncyMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzbTN1MmwxN3MzeDE5bTNtfSdrZXJuaW5nJ3tjbHs0cXU1a3Q1cXQ1cnMxN3NzNXRzfTIwMXN7MjAxc3N9MjAxdHtja3M0bHNjbXNjbnNjb3NjcHNjbHMyd3UyeXUyMDF0c30yMDF4ezJ3dTJ5dX0ya3syMDF0c30yd3s0cXg1a3g1b3U1cXg1cnMxN3N1NXR1fTJ4ezE3c3U1dHU1b3V9Mnl7NHF4NWt4NW91NXF4NXJzMTdzczV0c30nZm9mJy02b2ZuezE3c3c1dHc1b3U1cXc1cnN9N3R7Y2tzY2xzY21zY25zY29zY3BzNGxzfTN1ezE3c3U1dHU1b3M1cXN9M3Z7MTdzdTV0dTVvczVxc303cHsxN3N1NXR1fWNrezRxdTVrdDVxdDVyczE3c3M1dHN9NGx7NHF1NWt0NXF0NXJzMTdzczV0c31jbXs0cXU1a3Q1cXQ1cnMxN3NzNXRzfWNuezRxdTVrdDVxdDVyczE3c3M1dHN9Y297NHF1NWt0NXF0NXJzMTdzczV0c31jcHs0cXU1a3Q1cXQ1cnMxN3NzNXRzfTZsezRxdTVvdTVxdzVydDE3c3U1dHV9NXF7Y2t1Y2x1Y211Y251Y291Y3B1NGx1fTVye2NrdWNsdWNtdWNudWNvdWNwdTRsdX03cXtja3NjbHNjbXNjbnNjb3NjcHM0bHN9NnB7NHF1NW91NXF3NXJ0MTdzdzV0d31la3s0cXU1b3U1cXc1cnQxN3N1NXR1fWVsezRxdTVvdTVxdzVydDE3c3U1dHV9ZW17NHF1NW91NXF3NXJ0MTdzdTV0dX1lbns0cXU1b3U1cXc1cnQxN3N1NXR1fWVvezRxdTVvdTVxdzVydDE3c3U1dHV9ZXB7NHF1NW91NXF3NXJ0MTdzdTV0dX1lc3sxN3NzNXRzNXFzNHF1fWV0ezRxdTVvdTVxdzVydDE3c3c1dHd9ZXV7NHF1NW91NXF3NXJ0MTdzczV0c31ldnsxN3NzNXRzNXFzNHF1fTZ6ezE3c3c1dHc1b3U1cXc1cnN9Zm17MTdzdzV0dzVvdTVxdzVyc303bnsyMDF0c31mb3sxN3N3NXR3NW91NXF3NXJzfWZwezE3c3c1dHc1b3U1cXc1cnN9ZnF7MTdzdzV0dzVvdTVxdzVyc303cntja3NjbHNjbXNjbnNjb3NjcHM0bHN9ZnN7MTdzdzV0dzVvdTVxdzVyc31mdHsxN3N1NXR1fWZ1ezE3c3U1dHV9ZnZ7MTdzdTV0dX1md3sxN3N1NXR1fWZ6e2Nrc2Nsc2Ntc2Nuc2Nvc2NwczRsc319fSIpCgksICdIZWx2ZXRpY2EtQm9sZCc6IHVuY29tcHJlc3MoInsnd2lkdGhzJ3trM3MycTRzY3gxdzIwMW4zcjIwMW82bzIwMXMxdzIwMXQxdzIwMXUxdzIwMXczbTIwMXgzbTIwMXkzbTJrMXcybDJsMjAybTJuMm4zcjJvM3IycDV0MjAycTZvMnIxczJzMmwydDJsMnUycjJ2M3UydzF3MngybDJ5MXcyejF3M2szcjNsM3IzbTNyM24zcjNvM3IzcDNyM3EzcjNyM3IzczNyMjAzdDJsMjAzdTJsM3YybDN3M3UzeDN1M3kzdTN6M3g0azZsNGw0czRtNHM0bjRzNG80czRwNG00cTN4NHI0eTRzNHM0dDF3NHUzcjR2NHM0dzN4NHg1bjR5NHM0ejR5NWs0bTVsNHk1bTRzNW40bTVvM3g1cDRzNXE0bTVyNXk1czRtNXQ0bTV1M3g1djJsNXcxdzV4Mmw1eTN1NXozcjZrMmw2bDNyNm0zeDZuM3I2bzN4NnAzcjZxMmw2cjN4NnMzeDZ0MXc2dTF3NnYzcjZ3MXc2eDV0NnkzeDZ6M3g3azN4N2wzeDdtMnI3bjNyN28ybDdwM3g3cTNyN3I0eTdzM3I3dDNyN3UzbTd2MnI3dzF3N3gycjd5M3UyMDJsM3JjbDRzYWwybGFtM3JhbjNyYW8zcmFwM3JhcjNyYXMybGF0NHRhdTJwYXYzcmF3M3VheTR0YXoybGJrMnNibDN1J2ZvZic2b2JvMmxicDN4YnEzcmJyMXdiczJsYnUyb2J2M3JiejN4Y2s0czIwMmszcmNtNHNjbjRzY280c2NwNHNjcTZvY3I0c2NzNG1jdDRtY3U0bWN2NG1jdzF3Mm0yemN5MXdjejF3ZGw0c2RtNHlkbjR5ZG80eWRwNHlkcTR5ZHM0eWR0NHNkdTRzZHY0c2R3NHNkejN4ZWszcmVsM3JlbTNyZW4zcmVvM3JlcDNyZXE1dGVyM3JlczNyZXQzcmV1M3JldjNyZXcxd2V4MXdleTF3ZXoxd2ZsM3hmbTN4Zm4zeGZvM3hmcDN4ZnEzeGZyM3VmczN4ZnQzeGZ1M3hmdjN4ZnczeGZ6M3IyMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzcjN1MmwxN3M0bTE5bTNyfSdrZXJuaW5nJ3tjbHs0cXM1a3U1b3Q1cXMxN3N2NXR2fTIwMXR7Mnd3NHd5Mnl3fTIwMXd7MmtzfTIwMXh7Mnd3NHd5Mnl3fTJrezIwMXRzMjAxeHN9Mnd7N3FzNHF1NWt3NW9zNXF3NXJzMTdzdTV0dTd0c2Z6c30yeHs1b3c1cXN9Mnl7N3FzNHF1NWt3NW9zNXF3NXJzMTdzdTV0dTd0c2Z6c30nZm9mJy02bzdwezE3c3U1dHU1b3R9Y2t7NHFzNWt1NW90NXFzMTdzdjV0dn00bHs0cXM1a3U1b3Q1cXMxN3N2NXR2fWNtezRxczVrdTVvdDVxczE3c3Y1dHZ9Y257NHFzNWt1NW90NXFzMTdzdjV0dn1jb3s0cXM1a3U1b3Q1cXMxN3N2NXR2fWNwezRxczVrdTVvdDVxczE3c3Y1dHZ9Nmx7MTdzdDV0dDVvc30xN3N7Mmt3Y2x2Y212Y252Y292Y3B2NGx2NHd3Y2t2fTVvezJrdWNsdGNtdGNudGNvdGNwdDRsdDR3dGNrdH01cXsya3NjbHNjbXNjbnNjb3NjcHM0bHM0d3Zja3N9NXJ7MmtzNHdzfTV0ezJrd2NsdmNtdmNudmNvdmNwdjRsdjR3d2Nrdn1lb3sxN3N0NXR0NW9zfWZ1ezE3c3U1dHU1b3R9NnB7MTdzczV0c31la3sxN3N0NXR0NW9zfWVsezE3c3Q1dHQ1b3N9ZW17MTdzdDV0dDVvc31lbnsxN3N0NXR0NW9zfTZvezIwMXRzfWVwezE3c3Q1dHQ1b3N9ZXN7MTdzczV0c31ldHsxN3NzNXRzfWV1ezE3c3M1dHN9ZXZ7MTdzczV0c302ensxN3N1NXR1NW9zNXF0fWZtezE3c3U1dHU1b3M1cXR9Zm57MTdzdTV0dTVvczVxdH1mb3sxN3N1NXR1NW9zNXF0fWZwezE3c3U1dHU1b3M1cXR9ZnF7MTdzdTV0dTVvczVxdH1mc3sxN3N1NXR1NW9zNXF0fWZ0ezE3c3U1dHU1b3R9N217NW9zfWZ2ezE3c3U1dHU1b3R9Znd7MTdzdTV0dTVvdH19fSIpCgksICdDb3VyaWVyJzogdW5jb21wcmVzcygieyd3aWR0aHMne2szdydmb2YnNm99J2tlcm5pbmcneydmb2YnLTZvfX0iKQoJLCAnQ291cmllci1Cb2xkT2JsaXF1ZSc6IHVuY29tcHJlc3MoInsnd2lkdGhzJ3trM3cnZm9mJzZvfSdrZXJuaW5nJ3snZm9mJy02b319IikKCSwgJ1RpbWVzLUJvbGQnOiB1bmNvbXByZXNzKCJ7J3dpZHRocyd7azNxMnE1bmN4MnIyMDFuM20yMDFvNm8yMDFzMmwyMDF0MmwyMDF1MmwyMDF3M20yMDF4M20yMDF5M20yazF0MmwybDIwMm0ybjJuM20ybzNtMnA2bzIwMnE2bzJyMXcyczJsMnQybDJ1M20ydjN0MncxdDJ4MmwyeTF0MnoxdzNrM20zbDNtM20zbTNuM20zbzNtM3AzbTNxM20zcjNtM3MzbTIwM3QybDIwM3UybDN2MmwzdzN0M3gzdDN5M3QzejNtNGs1eDRsNHM0bTRtNG40czRvNHM0cDRtNHEzeDRyNHk0czR5NHQycjR1M200djR5NHc0bTR4NXk0eTRzNHo0eTVrM3g1bDR5NW00czVuM3I1bzRtNXA0czVxNHM1cjZvNXM0czV0NHM1dTRtNXYybDV3MXc1eDJsNXkzdTV6M202azJsNmwzbTZtM3I2bjJ3Nm8zcjZwMnc2cTJsNnIzbTZzM3I2dDF3NnUybDZ2M3I2dzF3Nng1bjZ5M3I2ejNtN2szcjdsM3I3bTJ3N24ycjdvMmw3cDNyN3EzbTdyNHM3czNtN3QzbTd1Mnc3djJyN3cxcTd4MnI3eTNvMjAybDNtY2w0c2FsMmxhbTNtYW4zbWFvM21hcDNtYXIzbWFzMmxhdDR1YXUxeWF2M21hdzN0YXk0dWF6MmxiazJzYmwzdCdmb2YnNm9ibzJsYnAzcmJyMXRiczJsYnUybGJ2M21iejNtY2s0czIwMmszbWNtNHNjbjRzY280c2NwNHNjcTZvY3I0c2NzNG1jdDRtY3U0bWN2NG1jdzJyMm0zcmN5MnJjejJyZGw0c2RtNHlkbjR5ZG80eWRwNHlkcTR5ZHM0eWR0NHNkdTRzZHY0c2R3NHNkejNyZWszbWVsM21lbTNtZW4zbWVvM21lcDNtZXE0c2VyMndlczJ3ZXQyd2V1MndldjJ3ZXcxd2V4MXdleTF3ZXoxd2ZsM3JmbTNtZm4zbWZvM21mcDNtZnEzbWZyM3RmczNtZnQzcmZ1M3JmdjNyZnczcmZ6M20yMDNrNm8yMTJtNm8yZHcybDJjcTJsM3QzbTN1MmwxN3M0czE5bTNtfSdrZXJuaW5nJ3tjbHs0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fTIwMXR7Y2tzNGxzY21zY25zY29zY3BzY2xzNHd2fTJrezIwMXRzfTJ3ezRxdTVrdTdtdTVvczVxeDVydTE3c3U1dHV9Mnh7MTdzdTV0dTVvdTVxc30yeXs0cXY1a3Y3bXU1b3Q1cXo1cnUxN3N1NXR1fSdmb2YnLTZvN3R7Y2tzY2xzY21zY25zY29zY3BzNGxzfTN1ezE3c3U1dHU1b3M1cXV9M3Z7MTdzdTV0dTVvczVxdX1mdXsxN3N1NXR1NW91NXF1fTdwezE3c3U1dHU1b3U1cXV9Y2t7NHF0NWtzNW90NXF5NXJ3MTdzdjV0dn00bHs0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fWNtezRxdDVrczVvdDVxeTVydzE3c3Y1dHZ9Y257NHF0NWtzNW90NXF5NXJ3MTdzdjV0dn1jb3s0cXQ1a3M1b3Q1cXk1cncxN3N2NXR2fWNwezRxdDVrczVvdDVxeTVydzE3c3Y1dHZ9Nmx7MTdzdDV0dDVvdTVxdX0xN3N7Y2t1Y2x1Y211Y251Y291Y3B1NGx1NHd1fTVve2NrdWNsdWNtdWNudWNvdWNwdTRsdTR3dX01cXtja3pjbHpjbXpjbnpjb3pjcHo0bHo0d3V9NXJ7Y2t4Y2x4Y214Y254Y294Y3B4NGx4NHd1fTV0e2NrdWNsdWNtdWNudWNvdWNwdTRsdTR3dX03cXtja3VjbHVjbXVjbnVjb3VjcHU0bHV9NnB7MTdzdzV0dzVvdTVxdX1la3sxN3N0NXR0NXF1fWVsezE3c3Q1dHQ1b3U1cXV9ZW17MTdzdDV0dDVxdX1lbnsxN3N0NXR0NXF1fWVvezE3c3Q1dHQ1cXV9ZXB7MTdzdDV0dDVvdTVxdX1lc3sxN3NzNXRzNXF1fWV0ezE3c3c1dHc1b3U1cXV9ZXV7MTdzdzV0dzVvdTVxdX1ldnsxN3NzNXRzNXF1fTZ6ezE3c3c1dHc1b3U1cXU1cnN9Zm17MTdzdzV0dzVvdTVxdTVyc31mbnsxN3N3NXR3NW91NXF1NXJzfWZvezE3c3c1dHc1b3U1cXU1cnN9ZnB7MTdzdzV0dzVvdTVxdTVyc31mcXsxN3N3NXR3NW91NXF1NXJzfTdye2NrdGNsdGNtdGNudGNvdGNwdDRsdDVvc31mc3sxN3N3NXR3NW91NXF1NXJzfWZ0ezE3c3U1dHU1b3U1cXV9N217NW9zfWZ2ezE3c3U1dHU1b3U1cXV9Znd7MTdzdTV0dTVvdTVxdX1mentja3NjbHNjbXNjbnNjb3NjcHM0bHN9fX0iKQoJLy8sICdTeW1ib2wnOiB1bmNvbXByZXNzKCJ7J3dpZHRocyd7azN1YXc0cjE5bTNtMmsxdDJsMmwyMDJtMnkybjNtMnA1bjIwMnE2bzNrM20yczJsMnQybDJ2M3IydzF0M20zbTJ5MXQyejF3Ymsyc2JsM3InZm9mJzZvM24zbTNvM20zcDNtM3EzbTNyM20zczNtM3QzbTN1MXczdjF3M3czcjN4M3IzeTNyM3oyd2JwM3QzbDNtNXYybDV4Mmw1ejNtMnE0eWZyM3I3djNrN3cxbzd4M2t9J2tlcm5pbmcneydmb2YnLTZvfX0iKQoJLCAnSGVsdmV0aWNhJzogdW5jb21wcmVzcygieyd3aWR0aHMne2szcDJxNG1jeDF3MjAxbjNyMjAxbzZvMjAxczFxMjAxdDFxMjAxdTFxMjAxdzJsMjAxeDJsMjAxeTJsMmsxdzJsMXcyMDJtMm4ybjNyMm8zcjJwNXQyMDJxNm8ycjFuMnMybDJ0MmwydTJyMnYzdTJ3MXcyeDJsMnkxdzJ6MXczazNyM2wzcjNtM3IzbjNyM28zcjNwM3IzcTNyM3IzcjNzM3IyMDN0MmwyMDN1MmwzdjF3M3czdTN4M3UzeTN1M3ozcjRrNnA0bDRtNG00bTRuNHM0bzRzNHA0bTRxM3g0cjR5NHM0czR0MXc0dTNtNHY0bTR3M3I0eDVuNHk0czR6NHk1azRtNWw0eTVtNHM1bjRtNW8zeDVwNHM1cTRtNXI1eTVzNG01dDRtNXUzeDV2MXc1dzF3NXgxdzV5Mno1ejNyNmsybDZsM3I2bTNyNm4zbTZvM3I2cDNyNnExdzZyM3I2czNyNnQxcTZ1MXE2djNtNncxcTZ4NW42eTNyNnozcjdrM3I3bDNyN20ybDduM203bzF3N3AzcjdxM203cjRzN3MzbTd0M203dTNtN3YybDd3MXU3eDJsN3kzdTIwMmwzcmNsNG1hbDJsYW0zcmFuM3JhbzNyYXAzcmFyM3JhczJsYXQ0dGF1MnBhdjNyYXczdWF5NHRhejJsYmsyc2JsM3UnZm9mJzZvYm8ybGJwM3JicjF3YnMybGJ1Mm9idjNyYnozeGNrNG0yMDJrM3JjbTRtY240bWNvNG1jcDRtY3E2b2NyNHNjczRtY3Q0bWN1NG1jdjRtY3cxdzJtMm5jeTF3Y3oxd2RsNHNkbTR5ZG40eWRvNHlkcDR5ZHE0eWRzNHlkdDRzZHU0c2R2NHNkdzRzZHozeGVrM3JlbDNyZW0zcmVuM3JlbzNyZXAzcmVxNXRlcjNtZXMzcmV0M3JldTNyZXYzcmV3MXdleDF3ZXkxd2V6MXdmbDNyZm0zcmZuM3JmbzNyZnAzcmZxM3JmcjN1ZnMzeGZ0M3JmdTNyZnYzcmZ3M3JmejNtMjAzazZvMjEybTZvMmR3MmwyY3EybDN0M3IzdTF3MTdzNG0xOW0zcn0na2VybmluZyd7NXF7NHd2fWNsezRxczVrdzVvdzVxczE3c3Y1dHZ9MjAxdHsyd3U0dzFrMnl1fTIwMXh7Mnd1NHd5Mnl1fTE3c3sya3RjbHVjbXVjbnU0b3RjcHU0bHU0d3ljb3Vja3V9Mnd7N3FzNHF6NWsxbTE3c3k1b3c1cXg1cnNmc3U1dHk3dHVmenV9Mnh7MTdzeTV0eTVveTVxc30yeXs3cXM0cXo1azFtMTdzeTVvdzVxeDVyc2ZzdTV0eTd0dWZ6dX0nZm9mJy02bzdwezE3c3Y1dHY1b3d9Y2t7NHFzNWt3NW93NXFzMTdzdjV0dn00bHs0cXM1a3c1b3c1cXMxN3N2NXR2fWNtezRxczVrdzVvdzVxczE3c3Y1dHZ9Y257NHFzNWt3NW93NXFzMTdzdjV0dn1jb3s0cXM1a3c1b3c1cXMxN3N2NXR2fWNwezRxczVrdzVvdzVxczE3c3Y1dHZ9Nmx7MTdzeTV0eTVvd31kb3sxN3N0NXR0fTR6ezE3c3Q1dHR9N3N7ZnN0fWRtezE3c3Q1dHR9ZG57MTdzdDV0dH01b3tja3djbHdjbXdjbndjb3djcHc0bHc0d3Z9ZHB7MTdzdDV0dH1kcXsxN3N0NXR0fTd0ezVvd31kc3sxN3N0NXR0fTV0ezJrdGNsdWNtdWNudTRvdGNwdTRsdTR3eWNvdWNrdX1mdXsxN3N2NXR2NW93fTZwezE3c3k1dHk1b3c1cXN9ZWt7MTdzeTV0eTVvd31lbHsxN3N5NXR5NW93fWVtezE3c3k1dHk1b3d9ZW57NXR5fWVvezE3c3k1dHk1b3d9ZXB7MTdzeTV0eTVvd31lc3sxN3N5NXR5NXFzfWV0ezE3c3k1dHk1b3c1cXN9ZXV7MTdzeTV0eTVvdzVxc31ldnsxN3N5NXR5NW93NXFzfTZ6ezE3c3k1dHk1b3c1cXN9Zm17MTdzeTV0eTVvdzVxc31mbnsxN3N5NXR5NW93NXFzfWZvezE3c3k1dHk1b3c1cXN9ZnB7MTdzeTV0eTVxc31mcXsxN3N5NXR5NW93NXFzfTdyezVvd31mc3sxN3N5NXR5NW93NXFzfWZ0ezE3c3Y1dHY1b3d9N217NW93fWZ2ezE3c3Y1dHY1b3d9Znd7MTdzdjV0djVvd319fSIpCgksICdIZWx2ZXRpY2EtQm9sZE9ibGlxdWUnOiB1bmNvbXByZXNzKCJ7J3dpZHRocyd7azNzMnE0c2N4MXcyMDFuM3IyMDFvNm8yMDFzMXcyMDF0MXcyMDF1MXcyMDF3M20yMDF4M20yMDF5M20yazF3MmwybDIwMm0ybjJuM3IybzNyMnA1dDIwMnE2bzJyMXMyczJsMnQybDJ1MnIydjN1MncxdzJ4MmwyeTF3MnoxdzNrM3IzbDNyM20zcjNuM3IzbzNyM3AzcjNxM3IzcjNyM3MzcjIwM3QybDIwM3UybDN2MmwzdzN1M3gzdTN5M3UzejN4NGs2bDRsNHM0bTRzNG40czRvNHM0cDRtNHEzeDRyNHk0czRzNHQxdzR1M3I0djRzNHczeDR4NW40eTRzNHo0eTVrNG01bDR5NW00czVuNG01bzN4NXA0czVxNG01cjV5NXM0bTV0NG01dTN4NXYybDV3MXc1eDJsNXkzdTV6M3I2azJsNmwzcjZtM3g2bjNyNm8zeDZwM3I2cTJsNnIzeDZzM3g2dDF3NnUxdzZ2M3I2dzF3Nng1dDZ5M3g2ejN4N2szeDdsM3g3bTJyN24zcjdvMmw3cDN4N3EzcjdyNHk3czNyN3Qzcjd1M203djJyN3cxdzd4MnI3eTN1MjAybDNyY2w0c2FsMmxhbTNyYW4zcmFvM3JhcDNyYXIzcmFzMmxhdDR0YXUycGF2M3JhdzN1YXk0dGF6MmxiazJzYmwzdSdmb2YnNm9ibzJsYnAzeGJxM3JicjF3YnMybGJ1Mm9idjNyYnozeGNrNHMyMDJrM3JjbTRzY240c2NvNHNjcDRzY3E2b2NyNHNjczRtY3Q0bWN1NG1jdjRtY3cxdzJtMnpjeTF3Y3oxd2RsNHNkbTR5ZG40eWRvNHlkcDR5ZHE0eWRzNHlkdDRzZHU0c2R2NHNkdzRzZHozeGVrM3JlbDNyZW0zcmVuM3JlbzNyZXAzcmVxNXRlcjNyZXMzcmV0M3JldTNyZXYzcmV3MXdleDF3ZXkxd2V6MXdmbDN4Zm0zeGZuM3hmbzN4ZnAzeGZxM3hmcjN1ZnMzeGZ0M3hmdTN4ZnYzeGZ3M3hmejNyMjAzazZvMjEybTZvMmR3MmwyY3EybDN0M3IzdTJsMTdzNG0xOW0zcn0na2VybmluZyd7Y2x7NHFzNWt1NW90NXFzMTdzdjV0dn0yMDF0ezJ3dzR3eTJ5d30yMDF3ezJrc30yMDF4ezJ3dzR3eTJ5d30ya3syMDF0czIwMXhzfTJ3ezdxczRxdTVrdzVvczVxdzVyczE3c3U1dHU3dHNmenN9Mnh7NW93NXFzfTJ5ezdxczRxdTVrdzVvczVxdzVyczE3c3U1dHU3dHNmenN9J2ZvZictNm83cHsxN3N1NXR1NW90fWNrezRxczVrdTVvdDVxczE3c3Y1dHZ9NGx7NHFzNWt1NW90NXFzMTdzdjV0dn1jbXs0cXM1a3U1b3Q1cXMxN3N2NXR2fWNuezRxczVrdTVvdDVxczE3c3Y1dHZ9Y297NHFzNWt1NW90NXFzMTdzdjV0dn1jcHs0cXM1a3U1b3Q1cXMxN3N2NXR2fTZsezE3c3Q1dHQ1b3N9MTdzezJrd2NsdmNtdmNudmNvdmNwdjRsdjR3d2Nrdn01b3sya3VjbHRjbXRjbnRjb3RjcHQ0bHQ0d3Rja3R9NXF7MmtzY2xzY21zY25zY29zY3BzNGxzNHd2Y2tzfTVyezJrczR3c301dHsya3djbHZjbXZjbnZjb3ZjcHY0bHY0d3dja3Z9ZW97MTdzdDV0dDVvc31mdXsxN3N1NXR1NW90fTZwezE3c3M1dHN9ZWt7MTdzdDV0dDVvc31lbHsxN3N0NXR0NW9zfWVtezE3c3Q1dHQ1b3N9ZW57MTdzdDV0dDVvc302b3syMDF0c31lcHsxN3N0NXR0NW9zfWVzezE3c3M1dHN9ZXR7MTdzczV0c31ldXsxN3NzNXRzfWV2ezE3c3M1dHN9Nnp7MTdzdTV0dTVvczVxdH1mbXsxN3N1NXR1NW9zNXF0fWZuezE3c3U1dHU1b3M1cXR9Zm97MTdzdTV0dTVvczVxdH1mcHsxN3N1NXR1NW9zNXF0fWZxezE3c3U1dHU1b3M1cXR9ZnN7MTdzdTV0dTVvczVxdH1mdHsxN3N1NXR1NW90fTdtezVvc31mdnsxN3N1NXR1NW90fWZ3ezE3c3U1dHU1b3R9fX0iKQoJLy8sICdaYXBmRGluZ2JhdHMnOiB1bmNvbXByZXNzKCJ7J3dpZHRocyd7azR1Mmsxdydmb2YnNm99J2tlcm5pbmcneydmb2YnLTZvfX0iKQoJLCAnQ291cmllci1Cb2xkJzogdW5jb21wcmVzcygieyd3aWR0aHMne2szdydmb2YnNm99J2tlcm5pbmcneydmb2YnLTZvfX0iKQoJLCAnVGltZXMtSXRhbGljJzogdW5jb21wcmVzcygieyd3aWR0aHMne2szbjJxNHljeDJsMjAxbjNtMjAxbzV0MjAxczJsMjAxdDJsMjAxdTJsMjAxdzNyMjAxeDNyMjAxeTNyMmsxdDJsMmwyMDJtMm4ybjNtMm8zbTJwNW4yMDJxNXQycjFwMnMybDJ0MmwydTNtMnY0bjJ3MXQyeDJsMnkxdDJ6MXczazNtM2wzbTNtM20zbjNtM28zbTNwM20zcTNtM3IzbTNzM20yMDN0MmwyMDN1MmwzdjJsM3c0bjN4NG4zeTRuM3ozbTRrNXc0bDN4NG0zeDRuNG00bzRzNHAzeDRxM3g0cjRzNHM0czR0Mmw0dTJ3NHY0bTR3M3I0eDVuNHk0bTR6NHM1azN4NWw0czVtM3g1bjNtNW8zcjVwNHM1cTN4NXI1bjVzM3g1dDNyNXUzcjV2MnI1dzF3NXgycjV5MnU1ejNtNmsybDZsM202bTNtNm4ydzZvM202cDJ3NnExdzZyM202czNtNnQxdzZ1MXc2djJ3NncxdzZ4NHM2eTNtNnozbTdrM203bDNtN20ycjduMnI3bzF3N3AzbTdxMnc3cjRtN3Mydzd0Mnc3dTJyN3Yyczd3MXY3eDJzN3kzcTIwMmwzbWNsM3hhbDJyYW0zbWFuM21hbzNtYXAzbWFyM21hczJsYXQ0d2F1MXZhdjNtYXc0bmF5NHdhejJsYmsyc2JsNG4nZm9mJzZvYm8ybGJwM21icTNvYnIxdGJzMmxidTF6YnYzbWJ6M21jazN4MjAyazNtY20zeGNuM3hjbzN4Y3AzeGNxNXRjcjRtY3MzeGN0M3hjdTN4Y3YzeGN3MmwybTJ1Y3kybGN6MmxkbDRtZG00c2RuNHNkbzRzZHA0c2RxNHNkczRzZHQ0c2R1NHNkdjRzZHc0c2R6M21lazNtZWwzbWVtM21lbjNtZW8zbWVwM21lcTRtZXIyd2VzMndldDJ3ZXUyd2V2MndldzF3ZXgxd2V5MXdlejF3ZmwzbWZtM21mbjNtZm8zbWZwM21mcTNtZnI0bmZzM21mdDNtZnUzbWZ2M21mdzNtZnoydzIwM2s2bzIxMm02bTJkdzJsMmNxMmwzdDNtM3UybDE3czNyMTltM219J2tlcm5pbmcne2NsezVrdDRxd30yMDFzezIwMXN3fTIwMXR7MjAxdHcyd3kyeXk2cS10fTIwMXh7Mnd5Mnl5fTJrezIwMXR3fTJ3ezdxczRxeTdyczVreTdtdzVvczVxeDVydTE3c3U1dHV9Mnh7MTdzczV0czVvc30yeXs3cXM0cXk3cnM1a3k3bXc1b3M1cXg1cnUxN3N1NXR1fSdmb2YnLTZvNnR7MTdzczV0czVxc303dHs1b3N9M3Z7NXFzfTdwezE3c3U1dHU1cXN9Y2t7NWt0NHF3fTRsezVrdDRxd31jbXs1a3Q0cXd9Y257NWt0NHF3fWNvezVrdDRxd31jcHs1a3Q0cXd9Nmx7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX0xN3N7MmtzfTVxe2NrdmNsdmNtdmNudmNvdmNwdjRsdn01cntja3VjbHVjbXVjbnVjb3VjcHU0bHV9NXR7MmtzfTZwezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZWt7NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1lbHs0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fWVtezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZW57NHFzNWtzNW91NXF3NXJ1MTdzdTV0dX1lb3s0cXM1a3M1b3U1cXc1cnUxN3N1NXR1fWVwezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZXN7NWtzNXFzNHFzfWV0ezRxczVrczVvdTVxdzVydTE3c3U1dHV9ZXV7NHFzNWtzNXF3NXJ1MTdzdTV0dX1ldns1a3M1cXM0cXN9ZXh7MTdzczV0czVxc302ens0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fWZtezRxdjVrczVvdTVxdzVydTE3c3U1dHV9Zm57NHF2NWtzNW91NXF3NXJ1MTdzdTV0dX1mb3s0cXY1a3M1b3U1cXc1cnUxN3N1NXR1fWZwezRxdjVrczVvdTVxdzVydTE3c3U1dHV9ZnF7NHF2NWtzNW91NXF3NXJ1MTdzdTV0dX03cns1b3N9ZnN7NHF2NWtzNW91NXF3NXJ1MTdzdTV0dX1mdHsxN3N1NXR1NXFzfWZ1ezE3c3U1dHU1cXN9ZnZ7MTdzdTV0dTVxc31md3sxN3N1NXR1NXFzfX19IikKCSwgJ1RpbWVzLVJvbWFuJzogdW5jb21wcmVzcygieyd3aWR0aHMne2szbjJxNHljeDJsMjAxbjNtMjAxbzZvMjAxczJsMjAxdDJsMjAxdTJsMjAxdzJ3MjAxeDJ3MjAxeTJ3MmsxdDJsMmwyMDJtMm4ybjNtMm8zbTJwNW4yMDJxNm8ycjFtMnMybDJ0MmwydTNtMnYzczJ3MXQyeDJsMnkxdDJ6MXczazNtM2wzbTNtM20zbjNtM28zbTNwM20zcTNtM3IzbTNzM20yMDN0MmwyMDN1MmwzdjF3M3czczN4M3MzeTNzM3oydzRrNXc0bDRzNG00bTRuNG00bzRzNHAzeDRxM3I0cjRzNHM0czR0Mmw0dTJyNHY0czR3M3g0eDV0NHk0czR6NHM1azNyNWw0czVtNG01bjNyNW8zeDVwNHM1cTRzNXI1eTVzNHM1dDRzNXUzeDV2Mmw1dzF3NXgybDV5Mno1ejNtNmsybDZsMnc2bTNtNm4ydzZvM202cDJ3NnEybDZyM202czNtNnQxdzZ1MXc2djNtNncxdzZ4NHk2eTNtNnozbTdrM203bDNtN20ybDduMnI3bzF3N3AzbTdxM203cjRzN3MzbTd0M203dTJ3N3Yzazd3MW83eDNrN3kzcTIwMmwzbWNsNHNhbDJsYW0zbWFuM21hbzNtYXAzbWFyM21hczJsYXQ0d2F1MXZhdjNtYXczc2F5NHdhejJsYmsyc2JsM3MnZm9mJzZvYm8ybGJwM21icTJ4YnIxdGJzMmxidTF6YnYzbWJ6MndjazRzMjAyazNtY200c2NuNHNjbzRzY3A0c2NxNXRjcjRtY3MzeGN0M3hjdTN4Y3YzeGN3MmwybTJ0Y3kybGN6MmxkbDRzZG00c2RuNHNkbzRzZHA0c2RxNHNkczRzZHQ0c2R1NHNkdjRzZHc0c2R6M21lazJ3ZWwyd2VtMndlbjJ3ZW8yd2VwMndlcTRtZXIyd2VzMndldDJ3ZXUyd2V2MndldzF3ZXgxd2V5MXdlejF3ZmwzbWZtM21mbjNtZm8zbWZwM21mcTNtZnIzc2ZzM21mdDNtZnUzbWZ2M21mdzNtZnozbTIwM2s2bzIxMm02bTJkdzJsMmNxMmwzdDNtM3UxdzE3czRzMTltM219J2tlcm5pbmcne2NsezRxczVrdTE3c3c1b3U1cXk1cncyMDFzczV0dzIwMXdzfTIwMXN7MjAxc3N9MjAxdHtja3c0bHdjbXdjbndjb3djcHdjbHc0d3UyMDF0c30ya3syMDF0c30yd3s0cXM1a3c1b3M1cXg1cnUxN3N4NXR4fTJ4ezE3c3c1dHc1b3U1cXV9Mnl7NHFzNWt3NW9zNXF4NXJ1MTdzeDV0eH0nZm9mJy02bzd0e2NrdWNsdWNtdWNudWNvdWNwdTRsdTVvczVyc30zdXsxN3N1NXR1NXFzfTN2ezE3c3U1dHU1cXN9N3B7MTdzdzV0dzVxc31ja3s0cXM1a3UxN3N3NW91NXF5NXJ3MjAxc3M1dHcyMDF3c300bHs0cXM1a3UxN3N3NW91NXF5NXJ3MjAxc3M1dHcyMDF3c31jbXs0cXM1a3UxN3N3NW91NXF5NXJ3MjAxc3M1dHcyMDF3c31jbns0cXM1a3UxN3N3NW91NXF5NXJ3MjAxc3M1dHcyMDF3c31jb3s0cXM1a3UxN3N3NW91NXF5NXJ3MjAxc3M1dHcyMDF3c31jcHs0cXM1a3UxN3N3NW91NXF5NXJ3MjAxc3M1dHcyMDF3c302bHsxN3N1NXR1NW9zNXF3NXJzfTE3c3sya3RjbHZjbXZjbnZjb3ZjcHY0bHY0d3Vja3Z9NW97Y2t3Y2x3Y213Y253Y293Y3B3NGx3NHd1fTVxe2NreWNseWNteWNueWNveWNweTRseTR3dTVtc301cntja3RjbHRjbXRjbnRjb3RjcHQ0bHQ0d3N9NXR7Mmt0Y2x2Y212Y252Y292Y3B2NGx2NHd1Y2t2fTdxe2Nrc2Nsc2Ntc2Nuc2Nvc2NwczRsc302cHsxN3N1NXR1NXF3NXJzfWVrezVxczVyc31lbHsxN3N1NXR1NW9zNXF3NXJzfWVtezE3c3U1dHU1b3M1cXM1cnN9ZW57MTdzdTVxczVyc31lb3s1cXM1cnN9ZXB7MTdzdTV0dTVvczVxdzVyc31lc3s1cXN9ZXR7MTdzdTV0dTVxdzVyc31ldXsxN3N1NXR1NXFzNXJzfWV2ezVxc302ensxN3N2NXR2NW9zNXF4NXJzfWZtezVvczVxdDVyc31mbnsxN3N2NXR2NW9zNXF4NXJzfWZvezE3c3Y1dHY1b3M1cXg1cnN9ZnB7NW9zNXF0NXJzfWZxezVvczVxdDVyc303cntja3VjbHVjbXVjbnVjb3VjcHU0bHU1b3N9ZnN7MTdzdjV0djVvczVxeDVyc31mdHsxN3NzNXRzNXFzfWZ1ezE3c3c1dHc1cXN9ZnZ7MTdzdzV0dzVxc31md3sxN3NzNXRzNXFzfWZ6e2NrdWNsdWNtdWNudWNvdWNwdTRsdTVvczVyc319fSIpCgksICdIZWx2ZXRpY2EtT2JsaXF1ZSc6IHVuY29tcHJlc3MoInsnd2lkdGhzJ3trM3AycTRtY3gxdzIwMW4zcjIwMW82bzIwMXMxcTIwMXQxcTIwMXUxcTIwMXcybDIwMXgybDIwMXkybDJrMXcybDF3MjAybTJuMm4zcjJvM3IycDV0MjAycTZvMnIxbjJzMmwydDJsMnUycjJ2M3UydzF3MngybDJ5MXcyejF3M2szcjNsM3IzbTNyM24zcjNvM3IzcDNyM3EzcjNyM3IzczNyMjAzdDJsMjAzdTJsM3YxdzN3M3UzeDN1M3kzdTN6M3I0azZwNGw0bTRtNG00bjRzNG80czRwNG00cTN4NHI0eTRzNHM0dDF3NHUzbTR2NG00dzNyNHg1bjR5NHM0ejR5NWs0bTVsNHk1bTRzNW40bTVvM3g1cDRzNXE0bTVyNXk1czRtNXQ0bTV1M3g1djF3NXcxdzV4MXc1eTJ6NXozcjZrMmw2bDNyNm0zcjZuM202bzNyNnAzcjZxMXc2cjNyNnMzcjZ0MXE2dTFxNnYzbTZ3MXE2eDVuNnkzcjZ6M3I3azNyN2wzcjdtMmw3bjNtN28xdzdwM3I3cTNtN3I0czdzM203dDNtN3UzbTd2Mmw3dzF1N3gybDd5M3UyMDJsM3JjbDRtYWwybGFtM3JhbjNyYW8zcmFwM3JhcjNyYXMybGF0NHRhdTJwYXYzcmF3M3VheTR0YXoybGJrMnNibDN1J2ZvZic2b2JvMmxicDNyYnIxd2JzMmxidTJvYnYzcmJ6M3hjazRtMjAyazNyY200bWNuNG1jbzRtY3A0bWNxNm9jcjRzY3M0bWN0NG1jdTRtY3Y0bWN3MXcybTJuY3kxd2N6MXdkbDRzZG00eWRuNHlkbzR5ZHA0eWRxNHlkczR5ZHQ0c2R1NHNkdjRzZHc0c2R6M3hlazNyZWwzcmVtM3JlbjNyZW8zcmVwM3JlcTV0ZXIzbWVzM3JldDNyZXUzcmV2M3JldzF3ZXgxd2V5MXdlejF3ZmwzcmZtM3JmbjNyZm8zcmZwM3JmcTNyZnIzdWZzM3hmdDNyZnUzcmZ2M3JmdzNyZnozbTIwM2s2bzIxMm02bzJkdzJsMmNxMmwzdDNyM3UxdzE3czRtMTltM3J9J2tlcm5pbmcnezVxezR3dn1jbHs0cXM1a3c1b3c1cXMxN3N2NXR2fTIwMXR7Mnd1NHcxazJ5dX0yMDF4ezJ3dTR3eTJ5dX0xN3N7Mmt0Y2x1Y211Y251NG90Y3B1NGx1NHd5Y291Y2t1fTJ3ezdxczRxejVrMW0xN3N5NW93NXF4NXJzZnN1NXR5N3R1Znp1fTJ4ezE3c3k1dHk1b3k1cXN9Mnl7N3FzNHF6NWsxbTE3c3k1b3c1cXg1cnNmc3U1dHk3dHVmenV9J2ZvZictNm83cHsxN3N2NXR2NW93fWNrezRxczVrdzVvdzVxczE3c3Y1dHZ9NGx7NHFzNWt3NW93NXFzMTdzdjV0dn1jbXs0cXM1a3c1b3c1cXMxN3N2NXR2fWNuezRxczVrdzVvdzVxczE3c3Y1dHZ9Y297NHFzNWt3NW93NXFzMTdzdjV0dn1jcHs0cXM1a3c1b3c1cXMxN3N2NXR2fTZsezE3c3k1dHk1b3d9ZG97MTdzdDV0dH00ensxN3N0NXR0fTdze2ZzdH1kbXsxN3N0NXR0fWRuezE3c3Q1dHR9NW97Y2t3Y2x3Y213Y253Y293Y3B3NGx3NHd2fWRwezE3c3Q1dHR9ZHF7MTdzdDV0dH03dHs1b3d9ZHN7MTdzdDV0dH01dHsya3RjbHVjbXVjbnU0b3RjcHU0bHU0d3ljb3Vja3V9ZnV7MTdzdjV0djVvd302cHsxN3N5NXR5NW93NXFzfWVrezE3c3k1dHk1b3d9ZWx7MTdzeTV0eTVvd31lbXsxN3N5NXR5NW93fWVuezV0eX1lb3sxN3N5NXR5NW93fWVwezE3c3k1dHk1b3d9ZXN7MTdzeTV0eTVxc31ldHsxN3N5NXR5NW93NXFzfWV1ezE3c3k1dHk1b3c1cXN9ZXZ7MTdzeTV0eTVvdzVxc302ensxN3N5NXR5NW93NXFzfWZtezE3c3k1dHk1b3c1cXN9Zm57MTdzeTV0eTVvdzVxc31mb3sxN3N5NXR5NW93NXFzfWZwezE3c3k1dHk1cXN9ZnF7MTdzeTV0eTVvdzVxc303cns1b3d9ZnN7MTdzeTV0eTVvdzVxc31mdHsxN3N2NXR2NW93fTdtezVvd31mdnsxN3N2NXR2NW93fWZ3ezE3c3Y1dHY1b3d9fX0iKQp9fTsKCi8qClRoaXMgZXZlbnQgaGFuZGxlciBpcyBmaXJlZCB3aGVuIGEgbmV3IGpzUERGIG9iamVjdCBpcyBpbml0aWFsaXplZApUaGlzIGV2ZW50IGhhbmRsZXIgYXBwZW5kcyBtZXRyaWNzIGRhdGEgdG8gc3RhbmRhcmQgZm9udHMgd2l0aGluCnRoYXQganNQREYgaW5zdGFuY2UuIFRoZSBtZXRyaWNzIGFyZSBtYXBwZWQgb3ZlciBVbmljb2RlIGNoYXJhY3Rlcgpjb2RlcywgTk9UIENJRHMgb3Igb3RoZXIgY29kZXMgbWF0Y2hpbmcgdGhlIFN0YW5kYXJkRW5jb2RpbmcgdGFibGUgb2YgdGhlCnN0YW5kYXJkIFBERiBmb250cy4KRnV0dXJlOgpBbHNvIGluY2x1ZGVkIGlzIHRoZSBlbmNvZGluZyBtYXBpbmcgdGFibGUsIGNvbnZlcnRpbmcgVW5pY29kZSAoVUNTLTIsIFVURi0xNikKY2hhciBjb2RlcyB0byBTdGFuZGFyZEVuY29kaW5nIGNoYXJhY3RlciBjb2Rlcy4gVGhlIGVuY29kaW5nIHRhYmxlIGlzIHRvIGJlIHVzZWQKc29tZXdoZXJlIGFyb3VuZCAicGRmRXNjYXBlIiBjYWxsLgoqLwoKQVBJLmV2ZW50cy5wdXNoKFsgCgknYWRkRm9udHMnCgksZnVuY3Rpb24oZm9udE1hbmFnZW1lbnRPYmplY3RzKSB7CgkJLy8gZm9udE1hbmFnZW1lbnRPYmplY3RzIGlzIHsKCQkvLwknZm9udHMnOmZvbnRfSUQta2V5ZWQgaGFzaCBvZiBmb250IG9iamVjdHMKCQkvLwksICdkaWN0aW9uYXJ5JzogbG9va3VwIG9iamVjdCwgbGlua2luZyBbIkZvbnRGYW1pbHkiXVsnU3R5bGUnXSB0byBmb250IElECgkJLy99CgkJdmFyIGZvbnQKCQksIGZvbnRJRAoJCSwgbWV0cmljcwoJCSwgdW5pY29kZV9zZWN0aW9uCgkJLCBlbmNvZGluZyA9ICdVbmljb2RlJwoJCSwgZW5jb2RpbmdCbG9jawoKCQlmb3IgKGZvbnRJRCBpbiBmb250TWFuYWdlbWVudE9iamVjdHMuZm9udHMpewoJCQlpZiAoZm9udE1hbmFnZW1lbnRPYmplY3RzLmZvbnRzLmhhc093blByb3BlcnR5KGZvbnRJRCkpIHsKCQkJCWZvbnQgPSBmb250TWFuYWdlbWVudE9iamVjdHMuZm9udHNbZm9udElEXQoKCQkJCS8vIC8vIHdlIG9ubHkgc2hpcCAnVW5pY29kZScgbWFwcGluZ3MgYW5kIG1ldHJpY3MuIE5vIG5lZWQgZm9yIGxvb3AuCgkJCQkvLyAvLyBzdGlsbCwgbGVhdmluZyB0aGlzIGZvciB0aGUgZnV0dXJlLgoKCQkJCS8vIGZvciAoZW5jb2RpbmcgaW4gZm9udE1ldHJpY3MpewoJCQkJLy8gCWlmIChmb250TWV0cmljcy5oYXNPd25Qcm9wZXJ0eShlbmNvZGluZykpIHsKCgkJCQkJCW1ldHJpY3MgPSBmb250TWV0cmljc1tlbmNvZGluZ11bZm9udC5Qb3N0U2NyaXB0TmFtZV0KCQkJCQkJaWYgKG1ldHJpY3MpIHsKCQkJCQkJCWlmIChmb250Lm1ldGFkYXRhW2VuY29kaW5nXSkgewoJCQkJCQkJCXVuaWNvZGVfc2VjdGlvbiA9IGZvbnQubWV0YWRhdGFbZW5jb2RpbmddCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXVuaWNvZGVfc2VjdGlvbiA9IGZvbnQubWV0YWRhdGFbZW5jb2RpbmddID0ge30KCQkJCQkJCX0KCgkJCQkJCQl1bmljb2RlX3NlY3Rpb24ud2lkdGhzID0gbWV0cmljcy53aWR0aHMKCQkJCQkJCXVuaWNvZGVfc2VjdGlvbi5rZXJuaW5nID0gbWV0cmljcy5rZXJuaW5nCgkJCQkJCX0KCQkJCS8vIAl9CgkJCQkvLyB9CgkJCQkvLyBmb3IgKGVuY29kaW5nIGluIGVuY29kaW5ncyl7CgkJCQkvLyAJaWYgKGVuY29kaW5ncy5oYXNPd25Qcm9wZXJ0eShlbmNvZGluZykpIHsKCQkJCQkJZW5jb2RpbmdCbG9jayA9IGVuY29kaW5nc1tlbmNvZGluZ11bZm9udC5Qb3N0U2NyaXB0TmFtZV0KCQkJCQkJaWYgKGVuY29kaW5nQmxvY2spIHsKCQkJCQkJCWlmIChmb250Lm1ldGFkYXRhW2VuY29kaW5nXSkgewoJCQkJCQkJCXVuaWNvZGVfc2VjdGlvbiA9IGZvbnQubWV0YWRhdGFbZW5jb2RpbmddCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXVuaWNvZGVfc2VjdGlvbiA9IGZvbnQubWV0YWRhdGFbZW5jb2RpbmddID0ge30KCQkJCQkJCX0KCgkJCQkJCQl1bmljb2RlX3NlY3Rpb24uZW5jb2RpbmcgPSBlbmNvZGluZ0Jsb2NrCgkJCQkJCQlpZiAoZW5jb2RpbmdCbG9jay5jb2RlUGFnZXMgJiYgZW5jb2RpbmdCbG9jay5jb2RlUGFnZXMubGVuZ3RoKSB7CgkJCQkJCQkJZm9udC5lbmNvZGluZyA9IGVuY29kaW5nQmxvY2suY29kZVBhZ2VzWzBdCgkJCQkJCQl9CgkJCQkJCX0KCQkJCS8vIAl9CgkJCQkvLyB9CgkJCX0KCQl9Cgl9Cl0pIC8vIGVuZCBvZiBhZGRpbmcgZXZlbnQgaGFuZGxlcgoKfSkoanNQREYuQVBJKTsK'
threejsn = 'jspdf.plugin.split_text_to_size.js'
threejsd = 'LyoqIEBwcmVzZXJ2ZSAKanNQREYgc3BsaXRfdGV4dF90b19zaXplIHBsdWdpbgpDb3B5cmlnaHQgKGMpIDIwMTIgV2lsbG93IFN5c3RlbXMgQ29ycG9yYXRpb24sIHdpbGxvdy1zeXN0ZW1zLmNvbQpNSVQgbGljZW5zZS4KKi8KLyoqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKiAKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqIAogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECiAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgogKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwoKOyhmdW5jdGlvbihBUEkpIHsKJ3VzZSBzdHJpY3QnCgovKioKUmV0dXJucyBhbiBhcnJheSBvZiBsZW5ndGggbWF0Y2hpbmcgbGVuZ3RoIG9mIHRoZSAnd29yZCcgc3RyaW5nLCB3aXRoIGVhY2gKY2VsbCBvY3VwaWVkIGJ5IHRoZSB3aWR0aCBvZiB0aGUgY2hhciBpbiB0aGF0IHBvc2l0aW9uLgoKQGZ1bmN0aW9uCkBwYXJhbSB3b3JkIHtTdHJpbmd9CkBwYXJhbSB3aWR0aHMge09iamVjdH0KQHBhcmFtIGtlcm5pbmcge09iamVjdH0KQHJldHVybnMge0FycmF5fQoqLwp2YXIgZ2V0Q2hhcldpZHRoc0FycmF5ID0gQVBJLmdldENoYXJXaWR0aHNBcnJheSA9IGZ1bmN0aW9uKHRleHQsIG9wdGlvbnMpewoKCWlmICghb3B0aW9ucykgewoJCW9wdGlvbnMgPSB7fQoJfQoKCXZhciB3aWR0aHMgPSBvcHRpb25zLndpZHRocyA/IG9wdGlvbnMud2lkdGhzIDogdGhpcy5pbnRlcm5hbC5nZXRGb250KCkubWV0YWRhdGEuVW5pY29kZS53aWR0aHMKCSwgd2lkdGhzRnJhY3Rpb25PZiA9IHdpZHRocy5mb2YgPyB3aWR0aHMuZm9mIDogMQoJLCBrZXJuaW5nID0gb3B0aW9ucy5rZXJuaW5nID8gb3B0aW9ucy5rZXJuaW5nIDogdGhpcy5pbnRlcm5hbC5nZXRGb250KCkubWV0YWRhdGEuVW5pY29kZS5rZXJuaW5nCgksIGtlcm5pbmdGcmFjdGlvbk9mID0ga2VybmluZy5mb2YgPyBrZXJuaW5nLmZvZiA6IDEKCQoJLy8gY29uc29sZS5sb2coIndpZHRocywga2VyZ25pbmdzIiwgd2lkdGhzLCBrZXJuaW5nKQoKCXZhciBpLCBsCgksIGNoYXJfY29kZQoJLCBjaGFyX3dpZHRoCgksIHByaW9yX2NoYXJfY29kZSA9IDAgLy8gZm9yIGtlcm5pbmcKCSwgZGVmYXVsdF9jaGFyX3dpZHRoID0gd2lkdGhzWzBdIHx8IHdpZHRoc0ZyYWN0aW9uT2YKCSwgb3V0cHV0ID0gW10KCglmb3IgKGkgPSAwLCBsID0gdGV4dC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQljaGFyX2NvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSkKCQlvdXRwdXQucHVzaCgKCQkJKCB3aWR0aHNbY2hhcl9jb2RlXSB8fCBkZWZhdWx0X2NoYXJfd2lkdGggKSAvIHdpZHRoc0ZyYWN0aW9uT2YgKyAKCQkJKCBrZXJuaW5nW2NoYXJfY29kZV0gJiYga2VybmluZ1tjaGFyX2NvZGVdW3ByaW9yX2NoYXJfY29kZV0gfHwgMCApIC8ga2VybmluZ0ZyYWN0aW9uT2YKCQkpCgkJcHJpb3JfY2hhcl9jb2RlID0gY2hhcl9jb2RlCgl9CgoJcmV0dXJuIG91dHB1dAp9CnZhciBnZXRBcnJheVN1bSA9IGZ1bmN0aW9uKGFycmF5KXsKCXZhciBpID0gYXJyYXkubGVuZ3RoCgksIG91dHB1dCA9IDAKCXdoaWxlKGkpewoJCTtpLS07CgkJb3V0cHV0ICs9IGFycmF5W2ldCgl9CglyZXR1cm4gb3V0cHV0Cn0KLyoqClJldHVybnMgYSB3aWR0aHMgb2Ygc3RyaW5nIGluIGEgZ2l2ZW4gZm9udCwgaWYgdGhlIGZvbnQgc2l6ZSBpcyBzZXQgYXMgMSBwb2ludC4KCkluIG90aGVyIHdvcmRzLCB0aGlzIGlzICJwcm9wb3J0aW9uYWwiIHZhbHVlLiBGb3IgMSB1bml0IG9mIGZvbnQgc2l6ZSwgdGhlIGxlbmd0aApvZiB0aGUgc3RyaW5nIHdpbGwgYmUgdGhhdCBtdWNoLgoKTXVsdGlwbHkgYnkgZm9udCBzaXplIHRvIGdldCBhY3R1YWwgd2lkdGggaW4gKnBvaW50cyoKVGhlbiBkaXZpZGUgYnkgNzIgdG8gZ2V0IGluY2hlcyBvciBkaXZpZGUgYnkgKDcyLzI1LjYpIHRvIGdldCAnbW0nIGV0Yy4KCkBwdWJsaWMKQGZ1bmN0aW9uCkBwYXJhbQpAcmV0dXJucyB7VHlwZX0KKi8KdmFyIGdldFN0cmluZ1VuaXRXaWR0aCA9IEFQSS5nZXRTdHJpbmdVbml0V2lkdGggPSBmdW5jdGlvbih0ZXh0LCBvcHRpb25zKSB7CglyZXR1cm4gZ2V0QXJyYXlTdW0oZ2V0Q2hhcldpZHRoc0FycmF5LmNhbGwodGhpcywgdGV4dCwgb3B0aW9ucykpCn0KCi8qKiAKcmV0dXJucyBhcnJheSBvZiBsaW5lcwoqLwp2YXIgc3BsaXRMb25nV29yZCA9IGZ1bmN0aW9uKHdvcmQsIHdpZHRoc19hcnJheSwgZmlyc3RMaW5lTWF4TGVuLCBtYXhMZW4pewoJdmFyIGFuc3dlciA9IFtdCgoJLy8gMXN0LCBjaG9wIG9mZiB0aGUgcGllY2UgdGhhdCBjYW4gZml0IG9uIHRoZSBoYW5naW5nIGxpbmUuCgl2YXIgaSA9IDAKCSwgbCA9IHdvcmQubGVuZ3RoCgksIHdvcmtpbmdMZW4gPSAwCgl3aGlsZSAoaSAhPT0gbCAmJiB3b3JraW5nTGVuICsgd2lkdGhzX2FycmF5W2ldIDwgZmlyc3RMaW5lTWF4TGVuKXsKCQl3b3JraW5nTGVuICs9IHdpZHRoc19hcnJheVtpXQoJCTtpKys7Cgl9CgkvLyB0aGlzIGlzIGZpcnN0IGxpbmUuCglhbnN3ZXIucHVzaCh3b3JkLnNsaWNlKDAsIGkpKQoKCS8vIDJuZC4gU3BsaXQgdGhlIHJlc3QgaW50byBtYXhMZW4gcGllY2VzLgoJdmFyIHN0YXJ0T2ZMaW5lID0gaQoJd29ya2luZ0xlbiA9IDAKCXdoaWxlIChpICE9PSBsKXsKCQlpZiAod29ya2luZ0xlbiArIHdpZHRoc19hcnJheVtpXSA+IG1heExlbikgewoJCQlhbnN3ZXIucHVzaCh3b3JkLnNsaWNlKHN0YXJ0T2ZMaW5lLCBpKSkKCQkJd29ya2luZ0xlbiA9IDAKCQkJc3RhcnRPZkxpbmUgPSBpCgkJfQoJCXdvcmtpbmdMZW4gKz0gd2lkdGhzX2FycmF5W2ldCgkJO2krKzsKCX0KCWlmIChzdGFydE9mTGluZSAhPT0gaSkgewoJCWFuc3dlci5wdXNoKHdvcmQuc2xpY2Uoc3RhcnRPZkxpbmUsIGkpKQoJfQoKCXJldHVybiBhbnN3ZXIKfQoKLy8gTm90ZSwgYWxsIHNpemluZyBpbnB1dHMgZm9yIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbiAiZm9udCBtZWFzdXJlbWVudCB1bml0cyIKLy8gQnkgZGVmYXVsdCwgZm9yIFBERiwgaXQncyAicG9pbnQiLgp2YXIgc3BsaXRQYXJhZ3JhcGhJbnRvTGluZXMgPSBmdW5jdGlvbih0ZXh0LCBtYXhsZW4sIG9wdGlvbnMpewoJLy8gYXQgdGhpcyB0aW1lIHdvcmtzIG9ubHkgb24gV2VzdGVybiBzY3JpcHRzLCBvbmVzIHdpdGggc3BhY2UgY2hhcgoJLy8gc2VwYXJhdGluZyB0aGUgd29yZHMuIEZlZWwgZnJlZSB0byBleHBhbmQuCgoJaWYgKCFvcHRpb25zKSB7CgkJb3B0aW9ucyA9IHt9Cgl9CgoJdmFyIHNwYWNlQ2hhcldpZHRoID0gZ2V0Q2hhcldpZHRoc0FycmF5KCcgJywgb3B0aW9ucylbMF0KCgl2YXIgd29yZHMgPSB0ZXh0LnNwbGl0KCcgJykKCgl2YXIgbGluZSA9IFtdCgksIGxpbmVzID0gW2xpbmVdCgksIGxpbmVfbGVuZ3RoID0gb3B0aW9ucy50ZXh0SW5kZW50IHx8IDAKCSwgc2VwYXJhdG9yX2xlbmd0aCA9IDAKCSwgY3VycmVudF93b3JkX2xlbmd0aCA9IDAKCSwgd29yZAoJLCB3aWR0aHNfYXJyYXkKCgl2YXIgaSwgbCwgdG1wCglmb3IgKGkgPSAwLCBsID0gd29yZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJd29yZCA9IHdvcmRzW2ldCgkJd2lkdGhzX2FycmF5ID0gZ2V0Q2hhcldpZHRoc0FycmF5KHdvcmQsIG9wdGlvbnMpCgkJY3VycmVudF93b3JkX2xlbmd0aCA9IGdldEFycmF5U3VtKHdpZHRoc19hcnJheSkKCgkJaWYgKGxpbmVfbGVuZ3RoICsgc2VwYXJhdG9yX2xlbmd0aCArIGN1cnJlbnRfd29yZF9sZW5ndGggPiBtYXhsZW4pIHsKCQkJaWYgKGN1cnJlbnRfd29yZF9sZW5ndGggPiBtYXhsZW4pIHsKCQkJCS8vIHRoaXMgaGFwcGVucyB3aGVuIHlvdSBoYXZlIHNwYWNlLWxlc3MgbG9uZyBVUkxzIGZvciBleGFtcGxlLgoJCQkJLy8gd2UganVzdCBjaG9wIHRoZXNlIHRvIHNpemUuIFdlIGRvIE5PVCBpbnNlcnQgaGlwaGVucwoJCQkJdG1wID0gc3BsaXRMb25nV29yZCh3b3JkLCB3aWR0aHNfYXJyYXksIG1heGxlbiAtIChsaW5lX2xlbmd0aCArIHNlcGFyYXRvcl9sZW5ndGgpLCBtYXhsZW4pCgkJCQkvLyBmaXJzdCBsaW5lIHdlIGFkZCB0byBleGlzdGluZyBsaW5lIG9iamVjdAoJCQkJbGluZS5wdXNoKHRtcC5zaGlmdCgpKSAvLyBpdCdzIG9rIHRvIGhhdmUgZXh0cmEgc3BhY2UgaW5kaWNhdG9yIHRoZXJlCgkJCQkvLyBsYXN0IGxpbmUgd2UgbWFrZSBpbnRvIG5ldyBsaW5lIG9iamVjdAoJCQkJbGluZSA9IFt0bXAucG9wKCldCgkJCQkvLyBsaW5lcyBpbiB0aGUgbWlkZGxlIHdlIGFwcGVkIHRvIGxpbmVzIG9iamVjdCBhcyB3aG9sZSBsaW5lcwoJCQkJd2hpbGUodG1wLmxlbmd0aCl7CgkJCQkJbGluZXMucHVzaChbdG1wLnNoaWZ0KCldKSAvLyBzaW5nbGUgZnJhZ21lbnQgb2NjdXBpZXMgd2hvbGUgbGluZQoJCQkJfQoJCQkJY3VycmVudF93b3JkX2xlbmd0aCA9IGdldEFycmF5U3VtKCB3aWR0aHNfYXJyYXkuc2xpY2Uod29yZC5sZW5ndGggLSBsaW5lWzBdLmxlbmd0aCkgKQoJCQl9IGVsc2UgewoJCQkJLy8ganVzdCBwdXQgaXQgb24gYSBuZXcgbGluZQoJCQkJbGluZSA9IFt3b3JkXQoJCQl9CgoJCQkvLyBub3cgd2UgYXR0YWNoIG5ldyBsaW5lIHRvIGxpbmVzCgkJCWxpbmVzLnB1c2gobGluZSkKCgkJCWxpbmVfbGVuZ3RoID0gY3VycmVudF93b3JkX2xlbmd0aAoJCQlzZXBhcmF0b3JfbGVuZ3RoID0gc3BhY2VDaGFyV2lkdGgKCgkJfSBlbHNlIHsKCQkJbGluZS5wdXNoKHdvcmQpCgoJCQlsaW5lX2xlbmd0aCArPSBzZXBhcmF0b3JfbGVuZ3RoICsgY3VycmVudF93b3JkX2xlbmd0aAoJCQlzZXBhcmF0b3JfbGVuZ3RoID0gc3BhY2VDaGFyV2lkdGgKCQl9Cgl9CgoJdmFyIG91dHB1dCA9IFtdCglmb3IgKGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJb3V0cHV0LnB1c2goIGxpbmVzW2ldLmpvaW4oJyAnKSApCgl9CglyZXR1cm4gb3V0cHV0Cgp9CgovKioKU3BsaXRzIGEgZ2l2ZW4gc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy4gVXNlcyAnc2l6ZScgdmFsdWUKKGluIG1lYXN1cmVtZW50IHVuaXRzIGRlY2xhcmVkIGFzIGRlZmF1bHQgZm9yIHRoZSBqc1BERiBpbnN0YW5jZSkKYW5kIHRoZSBmb250J3MgIndpZHRocyIgYW5kICJLZXJuaW5nIiB0YWJsZXMsIHdoZXJlIGF2YWlsYWJlLCB0bwpkZXRlcm1pbmUgZGlzcGxheSBsZW5ndGggb2YgYSBnaXZlbiBzdHJpbmcgZm9yIGEgZ2l2ZW4gZm9udC4KCldlIHVzZSBjaGFyYWN0ZXIncyAxMDAlIG9mIHVuaXQgc2l6ZSAoaGVpZ2h0KSBhcyB3aWR0aCB3aGVuIFdpZHRoCnRhYmxlIG9yIG90aGVyIGRlZmF1bHQgd2lkdGggaXMgbm90IGF2YWlsYWJsZS4KCkBwdWJsaWMKQGZ1bmN0aW9uCkBwYXJhbSB0ZXh0IHtTdHJpbmd9IFVuZW5jb2RlZCwgcmVndWxhciBKYXZhU2NyaXB0IChVbmljb2RlLCBVVEYtMTYgLyBVQ1MtMikgc3RyaW5nLgpAcGFyYW0gc2l6ZSB7TnVtYmVyfSBOb21pbmFsIG51bWJlciwgbWVhc3VyZWQgaW4gdW5pdHMgZGVmYXVsdCB0byB0aGlzIGluc3RhbmNlIG9mIGpzUERGLgpAcGFyYW0gb3B0aW9ucyB7T2JqZWN0fSBPcHRpb25hbCBmbGFncyBuZWVkZWQgZm9yIGNob3BwZXIgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLgpAcmV0dXJucyB7QXJyYXl9IHdpdGggc3RyaW5ncyBjaG9wcGVkIHRvIHNpemUuCiovCkFQSS5zcGxpdFRleHRUb1NpemUgPSBmdW5jdGlvbih0ZXh0LCBtYXhsZW4sIG9wdGlvbnMpIHsKCSd1c2Ugc3RyaWN0JwoKCWlmICghb3B0aW9ucykgewoJCW9wdGlvbnMgPSB7fQoJfQoKCXZhciBmc2l6ZSA9IG9wdGlvbnMuZm9udFNpemUgfHwgdGhpcy5pbnRlcm5hbC5nZXRGb250U2l6ZSgpCgksIG5ld09wdGlvbnMgPSAoZnVuY3Rpb24ob3B0aW9ucyl7CgkJdmFyIHdpZHRocyA9IHswOjF9CgkJLCBrZXJuaW5nID0ge30KCgkJaWYgKCFvcHRpb25zLndpZHRocyB8fCAhb3B0aW9ucy5rZXJuaW5nKSB7CgkJCXZhciBmID0gdGhpcy5pbnRlcm5hbC5nZXRGb250KG9wdGlvbnMuZm9udE5hbWUsIG9wdGlvbnMuZm9udFN0eWxlKQoJCQksIGVuY29kaW5nID0gJ1VuaWNvZGUnCgkJCS8vIE5PVCBVVEY4LCBOT1QgVVRGMTZCRS9MRSwgTk9UIFVDUzJCRS9MRQoJCQkvLyBBY3R1YWwgSmF2YVNjcmlwdC1uYXRpdmUgU3RyaW5nJ3MgMTZiaXQgY2hhciBjb2RlcyB1c2VkLgoJCQkvLyBubyBtdWx0aS1ieXRlIGxvZ2ljIGhlcmUKCgkJCWlmIChmLm1ldGFkYXRhW2VuY29kaW5nXSkgewoJCQkJcmV0dXJuIHsKCQkJCQl3aWR0aHM6IGYubWV0YWRhdGFbZW5jb2RpbmddLndpZHRocyB8fCB3aWR0aHMKCQkJCQksIGtlcm5pbmc6IGYubWV0YWRhdGFbZW5jb2RpbmddLmtlcm5pbmcgfHwga2VybmluZwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0dXJuIAl7CgkJCQl3aWR0aHM6IG9wdGlvbnMud2lkdGhzCgkJCQksIGtlcm5pbmc6IG9wdGlvbnMua2VybmluZwoJCQl9CQkJCgkJfQoKCQkvLyB0aGVuIHVzZSBkZWZhdWx0IHZhbHVlcwoJCXJldHVybiAJewoJCQl3aWR0aHM6IHdpZHRocwoJCQksIGtlcm5pbmc6IGtlcm5pbmcKCQl9Cgl9KS5jYWxsKHRoaXMsIG9wdGlvbnMpCgoJLy8gZmlyc3Qgd2Ugc3BsaXQgb24gZW5kLW9mLWxpbmUgY2hhcnMKCXZhciBwYXJhZ3JhcGhzIAoJaWYgKHRleHQubWF0Y2goL1tcblxyXS8pKSB7CgkJcGFyYWdyYXBocyA9IHRleHQuc3BsaXQoL1xyXG58XHJ8XG4vZykKCX0gZWxzZSB7CgkJcGFyYWdyYXBocyA9IFt0ZXh0XQoJfQoKCS8vIG5vdyB3ZSBjb252ZXJ0IHNpemUgKG1heCBsZW5ndGggb2YgbGluZSkgaW50byAiZm9udCBzaXplIHVuaXRzIgoJLy8gYXQgcHJlc2VudCB0aW1lLCB0aGUgImZvbnQgc2l6ZSB1bml0IiBpcyBhbHdheXMgJ3BvaW50JwoJLy8gJ3Byb3BvcnRpb25hbCcgbWVhbnMsICJpbiBwcm9wb3J0aW9uIHRvIGZvbnQgc2l6ZSIKCXZhciBmb250VW5pdF9tYXhMZW4gPSAxLjAgKiB0aGlzLmludGVybmFsLnNjYWxlRmFjdG9yICogbWF4bGVuIC8gZnNpemUKCS8vIGF0IHRoaXMgdGltZSwgZnNpemUgaXMgYWx3YXlzIGluICJwb2ludHMiIHJlZ2FyZGxlc3Mgb2YgdGhlIGRlZmF1bHQgbWVhc3VyZW1lbnQgdW5pdCBvZiB0aGUgZG9jLgoJLy8gdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmU/CgkvLyB1bnRpbCB0aGVuLCBwcm9wb3J0aW9uYWxfbWF4bGVuIGlzIGxpa2VseSB0byBiZSBpbiAncG9pbnRzJwoKCS8vIElmIGZpcnN0IGxpbmUgaXMgdG8gYmUgaW5kZW50ZWQgKHNob3J0ZXIgb3IgbG9uZ2VyKSB0aGFuIG1heExlbiAKCS8vIHdlIGluZGljYXRlIHRoYXQgYnkgdXNpbmcgQ1NTLXN0eWxlICJ0ZXh0LWluZGVudCIgb3B0aW9uLgoJLy8gaGVyZSBpdCdzIGluIGZvbnQgdW5pdHMgdG9vICh3aGljaCBpcyBsaWtlbHkgJ3BvaW50cycpCgkvLyBpdCBjYW4gYmUgbmVnYXRpdmUgKHdoaWNoIG1ha2VzIHRoZSBmaXJzdCBsaW5lIGxvbmdlciB0aGFuIG1heExlbikKCW5ld09wdGlvbnMudGV4dEluZGVudCA9IG9wdGlvbnMudGV4dEluZGVudCA/IAoJCW9wdGlvbnMudGV4dEluZGVudCAqIDEuMCAqIHRoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3IgLyBmc2l6ZSA6IAoJCTAKCgl2YXIgaSwgbAoJLCBvdXRwdXQgPSBbXQoJZm9yIChpID0gMCwgbCA9IHBhcmFncmFwaHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJb3V0cHV0ID0gb3V0cHV0LmNvbmNhdCgKCQkJc3BsaXRQYXJhZ3JhcGhJbnRvTGluZXMoCgkJCQlwYXJhZ3JhcGhzW2ldCgkJCQksIGZvbnRVbml0X21heExlbgoJCQkJLCBuZXdPcHRpb25zCgkJCSkKCQkpCgl9CgoJcmV0dXJuIG91dHB1dCAKfQoKfSkoanNQREYuQVBJKTsK'
fourjsn = 'jspdf.plugin.from_html.js'
fourjsd = 'LyoqIEBwcmVzZXJ2ZQpqc1BERiBmcm9tSFRNTCBwbHVnaW4uIEJFVEEgc3RhZ2UuIEFQSSBzdWJqZWN0IHRvIGNoYW5nZS4gTmVlZHMgYnJvd3NlciwgalF1ZXJ5CkNvcHlyaWdodCAoYykgMjAxMiAyMDEyIFdpbGxvdyBTeXN0ZW1zIENvcnBvcmF0aW9uLCB3aWxsb3ctc3lzdGVtcy5jb20KKi8KLyoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqIAogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQogKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCiAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgogKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCgo7KGZ1bmN0aW9uKGpzUERGQVBJKSB7Cid1c2Ugc3RyaWN0JwoKCmlmKCFTdHJpbmcucHJvdG90eXBlLnRyaW0pIHsKICBTdHJpbmcucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywnJyk7CiAgfTsKfQppZighU3RyaW5nLnByb3RvdHlwZS50cmltTGVmdCkgewogIFN0cmluZy5wcm90b3R5cGUudHJpbUxlZnQgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC9eXHMrL2csJycpOwogIH07Cn0KaWYoIVN0cmluZy5wcm90b3R5cGUudHJpbVJpZ2h0KSB7CiAgU3RyaW5nLnByb3RvdHlwZS50cmltUmlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC9ccyskL2csJycpOwogIH07Cn0KCmZ1bmN0aW9uIFB1cmdlV2hpdGVTcGFjZShhcnJheSl7Cgl2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGgsIGZyYWdtZW50CgksIGxUcmltbWVkID0gZmFsc2UKCSwgclRyaW1tZWQgPSBmYWxzZQoKCXdoaWxlICghbFRyaW1tZWQgJiYgaSAhPT0gbCkgewoJCWZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltTGVmdCgpCgkJaWYgKGZyYWdtZW50KSB7CgkJCS8vIHRoZXJlIGlzIHNvbWV0aGluZyBsZWZ0IHRoZXJlLgoJCQlsVHJpbW1lZCA9IHRydWUKCQl9CgkJO2krKzsKCX0KCglpID0gbCAtIDEKCXdoaWxlIChsICYmICFyVHJpbW1lZCAmJiBpICE9PSAtMSkgewoJCWZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltUmlnaHQoKQoJCWlmIChmcmFnbWVudCkgewoJCQkvLyB0aGVyZSBpcyBzb21ldGhpbmcgbGVmdCB0aGVyZS4KCQkJclRyaW1tZWQgPSB0cnVlCgkJfQoJCTtpLS07Cgl9CgoJdmFyIHIgPSAvXHMrJC9nCgksIHRyYWlsaW5nU3BhY2UgPSB0cnVlIC8vIGl0J3Mgc2FmZSB0byBhc3N1bWUgd2UgYWx3YXlzIHRyaW0gc3RhcnQgb2YgZGlzcGxheTpibG9jayBlbGVtZW50J3MgdGV4dC4KCglmb3IgKGkgPSAwOyBpICE9PSBsOyBpKyspIHsKCQlmcmFnbWVudCA9IGFycmF5W2ldLnJlcGxhY2UoL1xzKy9nLCAnICcpCgkJLy8gaWYgKGwgPiAxKSB7CgkJLy8gCWNvbnNvbGUubG9nKGksIHRyYWlsaW5nU3BhY2UsIGZyYWdtZW50KQoJCS8vIH0KCQlpZiAodHJhaWxpbmdTcGFjZSkgewoJCQlmcmFnbWVudCA9IGZyYWdtZW50LnRyaW1MZWZ0KCkKCQl9CgkJaWYgKGZyYWdtZW50KSB7CgkJCS8vIG1lYW5pbmcsIGl0IHdhcyBub3QgcmVkdWNlZCB0byAiIgoJCQkvLyBpZiBpdCB3YXMsIHdlIGRvbid0IHdhbnQgdG8gY2xlYXIgdHJhaWxpbmdTcGFjZSBmbGFnLgoJCQl0cmFpbGluZ1NwYWNlID0gci50ZXN0KGZyYWdtZW50KQoJCX0KCQlhcnJheVtpXSA9IGZyYWdtZW50Cgl9CgoJcmV0dXJuIGFycmF5Cn0KCmZ1bmN0aW9uIFJlbmRlcmVyKHBkZiwgeCwgeSwgc2V0dGluZ3MpIHsKCXRoaXMucGRmID0gcGRmCgl0aGlzLnggPSB4Cgl0aGlzLnkgPSB5Cgl0aGlzLnNldHRpbmdzID0gc2V0dGluZ3MKCgl0aGlzLmluaXQoKQoKCXJldHVybiB0aGlzCn0KClJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKXsKCgl0aGlzLnBhcmFncmFwaCA9IHsKCQkndGV4dCc6IFtdCgkJLCAnc3R5bGUnOiBbXQoJfQoKCXRoaXMucGRmLmludGVybmFsLndyaXRlKAoJCSdxJwoJKQp9CgpSZW5kZXJlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCl7Cgl0aGlzLnBkZi5pbnRlcm5hbC53cml0ZSgKCQknUScgLy8gY2xvc2VzIHRoZSAncScgaW4gaW5pdCgpCgkpCglyZXR1cm4gewoJCSd4Jzp0aGlzLngsICd5Jzp0aGlzLnkgLy8gYm90dG9tIGxlZnQgb2YgbGFzdCBsaW5lLiA9IHVwcGVyIGxlZnQgb2Ygd2hhdCBjb21lcyBhZnRlciB1cy4KCQkvLyBUT0RPOiB3ZSBjYW5ub3QgdHJhdmVyc2UgcGFnZXMgeWV0LCBidXQgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBjb21tdW5pY2F0ZSB0aGF0IHdoZW4gd2UgZG8uCgkJLy8gVE9ETzogYWRkIG1vcmUgc3RhdHM6IG51bWJlciBvZiBsaW5lcywgcGFyYWdyYXBocyBldGMuCgl9Cn0KClJlbmRlcmVyLnByb3RvdHlwZS5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyA9IGZ1bmN0aW9uKGZyYWdtZW50cywgc3R5bGVzKXsKCXZhciBkZWZhdWx0Rm9udFNpemUgPSAxMiAvLyBwb2ludHMKCSwgayA9IHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yIC8vIHdoZW4gbXVsdGlwbGllZCBieSB0aGlzLCBjb252ZXJ0cyBqc1BERiBpbnN0YW5jZSB1bml0cyBpbnRvICdwb2ludHMnCgoJLy8gdmFyIHdpZHRocyA9IG9wdGlvbnMud2lkdGhzID8gb3B0aW9ucy53aWR0aHMgOiB0aGlzLmludGVybmFsLmdldEZvbnQoKS5tZXRhZGF0YS5Vbmljb2RlLndpZHRocwoJLy8gLCBrZXJuaW5nID0gb3B0aW9ucy5rZXJuaW5nID8gb3B0aW9ucy5rZXJuaW5nIDogdGhpcy5pbnRlcm5hbC5nZXRGb250KCkubWV0YWRhdGEuVW5pY29kZS5rZXJuaW5nCgksIGZvbnRNZXRyaWNzQ2FjaGUgPSB7fQoJLCBmZiwgZnMKCSwgZm9udE1ldHJpY3MKCgksIGZyYWdtZW50IC8vIHN0cmluZywgZWxlbWVudCBvZiBgZnJhZ21lbnRzYAoJLCBzdHlsZSAvLyBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHdpdGggbmFtZXMgc2ltaWxhciB0byBDU1MuIEhvbGRzIHBlcnRpbmVudCBzdHlsZSBpbmZvIGZvciBnaXZlbiBmcmFnbWVudAoJLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcyAvLyBmb250TWV0cmljcyArIHNvbWUgaW5kZW50IGFuZCBzaXppbmcgcHJvcGVydGllcyBwb3B1bGF0ZWQuIFdlIHJldXNlIGl0LCBoZW5jZSB0aGUgYm90aGVyLgoJLCBmcmFnbWVudExlbmd0aCAvLyBmcmFnbWVudCdzIGxlbmd0aCBpbiBqc1BERiB1bml0cwoJLCBmcmFnbWVudENob3BwZWQgLy8gd2lsbCBiZSBhcnJheSAtIGZyYWdtZW50IHNwbGl0IGludG8gImxpbmVzIgoKCSwgbGluZSA9IFtdIC8vIGFycmF5IG9mIHBhaXJzIG9mIGFycmF5cyBbdCxzXSwgd2hlcmUgdCBpcyB0ZXh0IHN0cmluZywgYW5kIHMgaXMgc3R5bGUgb2JqZWN0IGZvciB0aGF0IHQuCgksIGxpbmVzID0gW2xpbmVdIC8vIGFycmF5IG9mIGFycmF5cyBvZiBwYWlycyBvZiBhcnJheXMKCSwgY3VycmVudExpbmVMZW5ndGggPSAwIC8vIGluIGpzUERGIGluc3RhbmNlIHVuaXRzIChpbmNoZXMsIGNtIGV0YykKCSwgbWF4TGluZUxlbmd0aCA9IHRoaXMuc2V0dGluZ3Mud2lkdGggLy8gbmVlZCB0byBkZWNpZGUgaWYgdGhpcyBpcyB0aGUgYmVzdCB3YXkgdG8ga25vdyB3aWR0aCBvZiBjb250ZW50LgoKCS8vIHRoaXMgbG9vcCBzb3J0cyB0ZXh0IGZyYWdtZW50cyAoYW5kIGFzc29jaWF0ZWQgc3R5bGUpCgkvLyBpbnRvIGxpbmVzLiBTb21lIGZyYWdtZW50cyB3aWxsIGJlIGNob3BwZWQgaW50byBzbWFsbGVyCgkvLyBmcmFnbWVudHMgdG8gYmUgc3ByZWFkIG92ZXIgbXVsdGlwbGUgbGluZXMuCgl3aGlsZSAoZnJhZ21lbnRzLmxlbmd0aCkgewoKCQlmcmFnbWVudCA9IGZyYWdtZW50cy5zaGlmdCgpCgkJc3R5bGUgPSBzdHlsZXMuc2hpZnQoKQoKCQkvLyBpZiBub3QgZW1wdHkgc3RyaW5nCgkJaWYgKGZyYWdtZW50KSB7CgoJCQlmZiA9IHN0eWxlWydmb250LWZhbWlseSddCgkJCWZzID0gc3R5bGVbJ2ZvbnQtc3R5bGUnXQoKCQkJZm9udE1ldHJpY3MgPSBmb250TWV0cmljc0NhY2hlW2ZmK2ZzXQoJCQlpZiAoIWZvbnRNZXRyaWNzKSB7CgkJCQlmb250TWV0cmljcyA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoZmYsIGZzKS5tZXRhZGF0YS5Vbmljb2RlCgkJCQlmb250TWV0cmljc0NhY2hlW2ZmK2ZzXSA9IGZvbnRNZXRyaWNzCgkJCX0KCgkJCWZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0gewoJCQkJJ3dpZHRocyc6IGZvbnRNZXRyaWNzLndpZHRocwoJCQkJLCAna2VybmluZyc6IGZvbnRNZXRyaWNzLmtlcm5pbmcKCgkJCQkvLyBmb250U2l6ZSBjb21lcyB0byB1cyBmcm9tIENTUyBzY3JhcGVyIGFzICJwcm9wb3J0aW9uIG9mIG5vcm1hbCIgdmFsdWUKCQkJCS8vICwgaGVuY2UgdGhlIG11bHRpcGxpY2F0aW9uCgkJCQksICdmb250U2l6ZSc6IHN0eWxlWydmb250LXNpemUnXSAqIGRlZmF1bHRGb250U2l6ZQoKCQkJCS8vIC8vIHRoZXNlIHNob3VsZCBub3QgbWF0dGVyIGFzIHdlIHByb3ZpZGUgdGhlIG1ldHJpY3MgbWFudWFsbHkKCQkJCS8vIC8vIGlmIHdlIHdvdWxkIG5vdCwgd2Ugd291bGQgbmVlZCB0aGVzZToKCQkJCS8vICwgJ2ZvbnROYW1lJzogc3R5bGUuZm9udE5hbWUgCgkJCQkvLyAsICdmb250U3R5bGUnOiBzdHlsZS5mb250U3R5bGUKCgkJCQkvLyB0aGlzIGlzIHNldHRpbmcgZm9yICJpbmRlbnQgZmlyc3QgbGluZSBvZiBwYXJhZ3JhcGgiLCBidXQgd2UgYWJ1c2UgaXQKCQkJCS8vIGZvciBjb250aW51aW5nIGlubGluZSBzcGFucyBvZiB0ZXh0LiBJbmRlbnQgdmFsdWUgPSBzcGFjZSBpbiBqc1BERiBpbnN0YW5jZSB1bml0cwoJCQkJLy8gKHdoYXRldmVyIHVzZXIgcGFzc2VkIHRvICduZXcganNQREYob3JpZW50YXRpb24sIHVuaXRzLCBzaXplKQoJCQkJLy8gYWxyZWFkeSBjb25zdW1lZCBvbiB0aGlzIGxpbmUuIE1heSBiZSB6ZXJvLCBvZiBjb3Vyc2UsIGZvciAic3RhcnQgb2YgbGluZSIKCQkJCS8vIGl0J3MgdXNlZCBvbmx5IG9uIGNob3BwZXIsIGlnbm9yZWQgaW4gYWxsICJzaXppbmciIGNvZGUKCQkJCSwgJ3RleHRJbmRlbnQnOiBjdXJyZW50TGluZUxlbmd0aAoJCQl9CgoJCQkvLyBpbiB1c2VyIHVuaXRzIChpbmNoLCBjbSBldGMuKQoJCQlmcmFnbWVudExlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aCgKCQkJCWZyYWdtZW50CgkJCQksIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzCgkJCSkgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGsKCgkJCWlmIChjdXJyZW50TGluZUxlbmd0aCArIGZyYWdtZW50TGVuZ3RoID4gbWF4TGluZUxlbmd0aCkgewoJCQkJLy8gd2hhdGV2ZXIgaXMgYWxyZWFkeSBvbiB0aGUgbGluZSArIHRoaXMgbmV3IGZyYWdtZW50CgkJCQkvLyB3aWxsIGJlIGxvbmdlciB0aGFuIG1heCBsZW4gZm9yIGEgbGluZS4gCgkJCQkvLyBIZW5jZSwgY2hvcHBpbmcgZnJhZ21lbnQgaW50byBsaW5lczoKCQkJCWZyYWdtZW50Q2hvcHBlZCA9IHRoaXMucGRmLnNwbGl0VGV4dFRvU2l6ZSgKCQkJCQlmcmFnbWVudAoJCQkJCSwgbWF4TGluZUxlbmd0aAoJCQkJCSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MKCQkJCSkKCgkJCQlsaW5lLnB1c2goW2ZyYWdtZW50Q2hvcHBlZC5zaGlmdCgpLCBzdHlsZV0pCgkJCQl3aGlsZSAoZnJhZ21lbnRDaG9wcGVkLmxlbmd0aCl7CgkJCQkJbGluZSA9IFtbZnJhZ21lbnRDaG9wcGVkLnNoaWZ0KCksIHN0eWxlXV0KCQkJCQlsaW5lcy5wdXNoKGxpbmUpCgkJCQl9CgoJCQkJY3VycmVudExpbmVMZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgoCgkJCQkJLy8gbmV3IGxpbmUncyBmaXJzdCAoYW5kIG9ubHkpIGZyYWdtZW50J3MgbGVuZ3RoIGlzIG91ciBuZXcgbGluZSBsZW5ndGgKCQkJCQlsaW5lWzBdWzBdCgkJCQkJLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcwoJCQkJKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gawoJCQl9IGVsc2UgewoJCQkJLy8gbmljZSwgd2UgY2FuIGZpdCB0aGlzIGZyYWdtZW50IG9uIGN1cnJlbnQgbGluZS4gTGVzcyB3b3JrIGZvciB1cy4uLgoJCQkJbGluZS5wdXNoKFtmcmFnbWVudCwgc3R5bGVdKQoJCQkJY3VycmVudExpbmVMZW5ndGggKz0gZnJhZ21lbnRMZW5ndGgKCQkJfQoJCX0KCX0KCglyZXR1cm4gbGluZXMKfQoKUmVuZGVyZXIucHJvdG90eXBlLlJlbmRlclRleHRGcmFnbWVudCA9IGZ1bmN0aW9uKHRleHQsIHN0eWxlKSB7CgoJdmFyIGRlZmF1bHRGb250U2l6ZSA9IDEyCgkvLyAsIGhlYWRlciA9ICIvRjEgMTYgVGZcbjE2IFRMXG4wIGciCgksIGZvbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHN0eWxlWydmb250LWZhbWlseSddLCBzdHlsZVsnZm9udC1zdHlsZSddKQoKCXRoaXMucGRmLmludGVybmFsLndyaXRlKAoJCScvJyArIGZvbnQuaWQgLy8gZm9udCBrZXkKCQksIChkZWZhdWx0Rm9udFNpemUgKiBzdHlsZVsnZm9udC1zaXplJ10pLnRvRml4ZWQoMikgLy8gZm9udCBzaXplIGNvbWVzIGFzIGZsb2F0ID0gcHJvcG9ydGlvbiB0byBub3JtYWwuCgkJLCAnVGYnIC8vIGZvbnQgZGVmIG1hcmtlcgoJCSwgJygnK3RoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KSsnKSBUaicKCSkKfQoKUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlclBhcmFncmFwaCA9IGZ1bmN0aW9uKCl7CgoJdmFyIGZyYWdtZW50cyA9IFB1cmdlV2hpdGVTcGFjZSggdGhpcy5wYXJhZ3JhcGgudGV4dCApCgksIHN0eWxlcyA9IHRoaXMucGFyYWdyYXBoLnN0eWxlCgksIGJsb2Nrc3R5bGUgPSB0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlCgksIHByaW9yYmxvY2tzdHlwZSA9IHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGUgfHwge30KCXRoaXMucGFyYWdyYXBoID0geyd0ZXh0JzpbXSwgJ3N0eWxlJzpbXSwgJ2Jsb2Nrc3R5bGUnOnt9LCAncHJpb3JibG9ja3N0eWxlJzpibG9ja3N0eWxlfQoKCWlmICghZnJhZ21lbnRzLmpvaW4oJycpLnRyaW0oKSkgewoJCS8qIGlmIGl0J3MgZW1wdHkgc3RyaW5nICovCgkJcmV0dXJuCgl9IC8vIGVsc2UgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRyYXcKCgl2YXIgbGluZXMgPSB0aGlzLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzKGZyYWdtZW50cywgc3R5bGVzKQoJLCBsaW5lIC8vIHdpbGwgYmUgYXJyYXkgb2YgYXJyYXkgcGFpcnMgW1t0LHNdLFt0LHNdLFt0LHNdLi4uXSB3aGVyZSB0ID0gdGV4dCwgcyA9IHN0eWxlIG9iamVjdAoKCSwgbWF4TGluZUhlaWdodAoJLCBkZWZhdWx0Rm9udFNpemUgPSAxMgoJLCBmb250VG9Vbml0UmF0aW8gPSBkZWZhdWx0Rm9udFNpemUgLyB0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcgoKCS8vIHRoZXNlIHdpbGwgYmUgaW4gcGRmIGluc3RhbmNlIHVuaXRzCgksIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKCAKCQkvLyB3ZSBvbmx5IHVzZSBtYXJnaW4tdG9wIHBvdGlvbiB0aGF0IGlzIGxhcmdlciB0aGFuIG1hcmdpbi1ib3R0b20gb2YgcHJldmlvdXMgZWxlbQoJCS8vIGJlY2F1c2UgQ1NTIG1hcmdpbnMgZG9uJ3Qgc3RhY2ssIHRoZXkgb3ZlcmxhcC4KCQlNYXRoLm1heCggKCBibG9ja3N0eWxlWydtYXJnaW4tdG9wJ10gfHwgMCApIC0gKCBwcmlvcmJsb2Nrc3R5cGVbJ21hcmdpbi1ib3R0b20nXSB8fCAwICksIDAgKSArIAoJCSggYmxvY2tzdHlsZVsncGFkZGluZy10b3AnXSB8fCAwICkgCgkpICogZm9udFRvVW5pdFJhdGlvCgksIHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIgPSAoIAoJCSggYmxvY2tzdHlsZVsnbWFyZ2luLWJvdHRvbSddIHx8IDAgKSArICggYmxvY2tzdHlsZVsncGFkZGluZy1ib3R0b20nXSB8fCAwICkgCgkpICogZm9udFRvVW5pdFJhdGlvCgoJLCBvdXQgPSB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZQoKCSwgaSwgbAoKCXRoaXMueSArPSBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZQoKCW91dCgKCQkncScgLy8gY2FubmluZyB0aGUgc2NvcGUKCQksICdCVCcgLy8gQmVnaW4gVGV4dAoJCS8vIGFuZCB0aGlzIG1vdmVzIHRoZSB0ZXh0IHN0YXJ0IHRvIGRlc2lyZWQgcG9zaXRpb24uCgkJLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCkKCQksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpCgkJLCAnVGQnCgkpCgoJLy8gbG9vcGluZyB0aHJvdWdoIGxpbmVzCgl3aGlsZSAobGluZXMubGVuZ3RoKSB7CgkJbGluZSA9IGxpbmVzLnNoaWZ0KCkKCgkJbWF4TGluZUhlaWdodCA9IDAKCgkJZm9yIChpID0gMCwgbCA9IGxpbmUubGVuZ3RoOyBpICE9PSBsOyBpKyspIHsKCQkJaWYgKGxpbmVbaV1bMF0udHJpbSgpKSB7CgkJCQltYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgbGluZVtpXVsxXVsnbGluZS1oZWlnaHQnXSwgbGluZVtpXVsxXVsnZm9udC1zaXplJ10pCgkJCX0KCQl9CgoJCS8vIGN1cnJlbnQgY29vcmRpbmF0ZXMgYXJlICJ0b3AgbGVmdCIgY29ybmVyIG9mIHRleHQgYm94LiBUZXh0IG11c3Qgc3RhcnQgZnJvbSAibG93ZXIgbGVmdCIKCQkvLyBzbywgbG93ZXJpbmcgdGhlIGN1cnJlbnQgY29vcmQgb25lIGxpbmUgaGVpZ2h0LgoJCW91dCgKCQkJMAoJCQksICgtMSAqIGRlZmF1bHRGb250U2l6ZSAqIG1heExpbmVIZWlnaHQpLnRvRml4ZWQoMikgLy8gc2hpZnRpbmcgZG93biBhIGxpbmUgaW4gbmF0aXZlIGBwb2ludHMnIG1lYW5zIHJlZHVjaW5nIHkgY29vcmRpbmF0ZQoJCQksICdUZCcKCQkJLy8gLCAoZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSAvLyBsaW5lIGhlaWdodCBjb21lcyBhcyBmbG9hdCA9IHByb3BvcnRpb24gdG8gbm9ybWFsLgoJCQkvLyAsICdUTCcgLy8gbGluZSBoZWlnaHQgbWFya2VyLiBOb3Qgc3VyZSB3ZSBuZWVkIGl0IHdpdGggIlRkIiwgYnV0Li4uIAoJCSkKCgkJZm9yIChpID0gMCwgbCA9IGxpbmUubGVuZ3RoOyBpICE9PSBsOyBpKyspIHsKCQkJaWYgKGxpbmVbaV1bMF0pIHsKCQkJCXRoaXMuUmVuZGVyVGV4dEZyYWdtZW50KGxpbmVbaV1bMF0sIGxpbmVbaV1bMV0pCgkJCX0KCQl9CgoJCS8vIHkgaXMgaW4gdXNlciB1bml0cyAoY20sIGluY2ggZXRjKQoJCS8vIG1heExpbmVIZWlnaHQgaXMgcmF0aW8gb2YgZGVmYXVsdEZvbnRTaXplCgkJLy8gZGVmYXVsdEZvbnRTaXplIGlzIGluIHBvaW50cyBhbHdheXMuCgkJLy8gdGhpcy5pbnRlcm5hbC5zY2FsZUZhY3RvciBpcyByYXRpbyBvZiB1c2VyIHVuaXQgdG8gcG9pbnRzLiAKCQkvLyBEaXZpZGluZyBieSBpdCBjb252ZXJ0cyBwb2ludHMgdG8gdXNlciB1bml0cy4KCQkvLyB2ZXJ0aWNhbCBvZmZzZXQgd2lsbCBiZSBpbiB1c2VyIHVuaXRzLgoJCS8vIHRoaXMueSBpcyBpbiB1c2VyIHVuaXRzLgoJCXRoaXMueSArPSBtYXhMaW5lSGVpZ2h0ICogZm9udFRvVW5pdFJhdGlvCgl9CgoJb3V0KAoJCSdFVCcgLy8gRW5kIFRleHQKCQksICdRJyAvLyByZXN0b3JlIHNjb3BlCgkpCgoJdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIKfQoKUmVuZGVyZXIucHJvdG90eXBlLnNldEJsb2NrQm91bmRhcnkgPSBmdW5jdGlvbigpewoJdGhpcy5yZW5kZXJQYXJhZ3JhcGgoKQp9CgpSZW5kZXJlci5wcm90b3R5cGUuc2V0QmxvY2tTdHlsZSA9IGZ1bmN0aW9uKGNzcyl7Cgl0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlID0gY3NzCn0KClJlbmRlcmVyLnByb3RvdHlwZS5hZGRUZXh0ID0gZnVuY3Rpb24odGV4dCwgY3NzKXsKCXRoaXMucGFyYWdyYXBoLnRleHQucHVzaCh0ZXh0KQoJdGhpcy5wYXJhZ3JhcGguc3R5bGUucHVzaChjc3MpCn0KCgovLz09PT09PT09PT09PT09PT09PT09PQovLyB0aGVzZSBhcmUgRHJpbGxGb3JDb250ZW50IGFuZCBmcmllbmRzCgp2YXIgRm9udE5hbWVEQiA9IHsKCSdoZWx2ZXRpY2EnOidoZWx2ZXRpY2EnCgksICdzYW5zLXNlcmlmJzonaGVsdmV0aWNhJwoJLCAnc2VyaWYnOid0aW1lcycKCSwgJ3RpbWVzJzondGltZXMnCgksICd0aW1lcyBuZXcgcm9tYW4nOid0aW1lcycKCSwgJ21vbm9zcGFjZSc6J2NvdXJpZXInCgksICdjb3VyaWVyJzonY291cmllcicKfQosIEZvbnRXZWlnaHRNYXAgPSB7IjEwMCI6J25vcm1hbCcsIjIwMCI6J25vcm1hbCcsIjMwMCI6J25vcm1hbCcsIjQwMCI6J25vcm1hbCcsIjUwMCI6J2JvbGQnLCI2MDAiOidib2xkJywiNzAwIjonYm9sZCcsIjgwMCI6J2JvbGQnLCI5MDAiOidib2xkJywibm9ybWFsIjonbm9ybWFsJywiYm9sZCI6J2JvbGQnLCJib2xkZXIiOidib2xkJywibGlnaHRlciI6J25vcm1hbCd9CiwgRm9udFN0eWxlTWFwID0geydub3JtYWwnOidub3JtYWwnLCdpdGFsaWMnOidpdGFsaWMnLCdvYmxpcXVlJzonaXRhbGljJ30KLCBVbml0ZWROdW1iZXJNYXAgPSB7J25vcm1hbCc6MX0KCmZ1bmN0aW9uIFJlc29sdmVGb250KGNzc19mb250X2ZhbWlseV9zdHJpbmcpewoJdmFyIG5hbWUKCSwgcGFydHMgPSBjc3NfZm9udF9mYW1pbHlfc3RyaW5nLnNwbGl0KCcsJykgLy8geWVzLCB3ZSBkb24ndCBjYXJlIGFib3V0ICwgaW5zaWRlIHF1b3RlcwoJLCBwYXJ0ID0gcGFydHMuc2hpZnQoKQoKCXdoaWxlICghbmFtZSAmJiBwYXJ0KXsKCQluYW1lID0gRm9udE5hbWVEQlsgcGFydC50cmltKCkudG9Mb3dlckNhc2UoKSBdCgkJcGFydCA9IHBhcnRzLnNoaWZ0KCkKCX0KCXJldHVybiBuYW1lIAp9CgovLyByZXR1cm4gcmF0aW8gdG8gIm5vcm1hbCIgZm9udCBzaXplLiBpbiBvdGhlciB3b3JkcywgaXQncyBmcmFjdGlvbiBvZiAxNiBwaXhlbHMuCmZ1bmN0aW9uIFJlc29sdmVVbml0ZWROdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyl7Cgl2YXIgdW5kZWYKCSwgbm9ybWFsID0gMTYuMDAKCSwgdmFsdWUgPSBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10KCWlmICh2YWx1ZSkgewoJCXJldHVybiB2YWx1ZQoJfQoKCS8vIG5vdCBpbiBjYWNoZSwgb2suIG5lZWQgdG8gcGFyc2UgaXQuCgoJLy8gQ291bGQgaXQgYmUgYSBuYW1lZCB2YWx1ZT8KCS8vIHdlIHdpbGwgdXNlIFdpbmRvd3MgOTRkcGkgc2l6aW5nIHdpdGggQ1NTMiBzdWdnZXN0ZWQgMS4yIHN0ZXAgcmF0aW8KCS8vIHdoZXJlICJub3JtYWwiIG9yICJtZWRpdW0iIGlzIDE2cHgKCS8vIHNlZTogaHR0cDovL3N0eWxlLmNsZXZlcmNoaW1wLmNvbS9mb250X3NpemVfaW50ZXJ2YWxzL2FsdGludGVydmFscy5odG1sCgl2YWx1ZSA9ICh7CgkJJ3h4LXNtYWxsJzo5CgkJLCAneC1zbWFsbCc6MTEKCQksICdzbWFsbCc6MTMKCQksICdtZWRpdW0nOjE2CgkJLCAnbGFyZ2UnOjE5CgkJLCAneC1sYXJnZSc6MjMKCQksICd4eC1sYXJnZSc6MjgKCQksICdhdXRvJzowCgl9KVtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXQoJaWYgKHZhbHVlICE9PSB1bmRlZikgewoJCS8vIGNhY2hpbmcsIHJldHVybmluZwoJCXJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbAoJfQoKCS8vIG5vdCBpbiBjYWNoZSwgb2suIG5lZWQgdG8gcGFyc2UgaXQuCgkvLyBpcyBpdCBpbnQ/CglpZiAodmFsdWUgPSBwYXJzZUZsb2F0KGNzc19saW5lX2hlaWdodF9zdHJpbmcpKSB7CgkJLy8gY2FjaGluZywgcmV0dXJuaW5nCgkJcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHZhbHVlIC8gbm9ybWFsCgl9CgoJLy8gbXVzdCBiZSBhICJ1bml0ZWQiIHZhbHVlICgnMTIzZW0nLCAnMTM0cHgnIGV0Yy4pCgkvLyBtb3N0IGJyb3dzZXJzIGNvbnZlcnQgaXQgdG8gcHggc28sIG9ubHkgaGFuZGxpbmcgdGhlIHB4Cgl2YWx1ZSA9IGNzc19saW5lX2hlaWdodF9zdHJpbmcubWF0Y2goIC8oW1xkXC5dKykocHgpLyApCglpZiAodmFsdWUubGVuZ3RoID09PSAzKSB7CgkJLy8gY2FjaGluZywgcmV0dXJuaW5nCgkJcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHBhcnNlRmxvYXQoIHZhbHVlWzFdICkgLyBub3JtYWwKCX0KCglyZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gMQp9CgpmdW5jdGlvbiBHZXRDU1MoZWxlbWVudCl7Cgl2YXIgJGUgPSAkKGVsZW1lbnQpCgksIGNzcyA9IHt9CgksIHRtcAoKCWNzc1snZm9udC1mYW1pbHknXSA9IFJlc29sdmVGb250KCAkZS5jc3MoJ2ZvbnQtZmFtaWx5JykgKSB8fCAndGltZXMnCgljc3NbJ2ZvbnQtc3R5bGUnXSA9IEZvbnRTdHlsZU1hcCBbICRlLmNzcygnZm9udC1zdHlsZScpIF0gfHwgJ25vcm1hbCcKCXRtcCA9IEZvbnRXZWlnaHRNYXBbICRlLmNzcygnZm9udC13ZWlnaHQnKSBdIHx8ICdub3JtYWwnCglpZiAodG1wID09PSAnYm9sZCcpIHsKCQlpZiAoY3NzWydmb250LXN0eWxlJ10gPT09ICdub3JtYWwnKSB7CgkJCWNzc1snZm9udC1zdHlsZSddID0gdG1wCgkJfSBlbHNlIHsKCQkJY3NzWydmb250LXN0eWxlJ10gPSB0bXAgKyBjc3NbJ2ZvbnQtc3R5bGUnXSAvLyBqc1BERidzIGRlZmF1bHQgZm9udHMgaGF2ZSBpdCBhcyAiYm9sZGl0YWxpYyIKCQl9Cgl9CgoJY3NzWydmb250LXNpemUnXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoICRlLmNzcygnZm9udC1zaXplJykgKSB8fCAxIC8vIHJhdGlvIHRvICJub3JtYWwiIHNpemUKCWNzc1snbGluZS1oZWlnaHQnXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoICRlLmNzcygnbGluZS1oZWlnaHQnKSApIHx8IDEgLy8gcmF0aW8gdG8gIm5vcm1hbCIgc2l6ZQoKCWNzc1snZGlzcGxheSddID0gJGUuY3NzKCdkaXNwbGF5JykgPT09ICdpbmxpbmUnID8gJ2lubGluZScgOiAnYmxvY2snCgoJaWYgKGNzc1snZGlzcGxheSddID09PSAnYmxvY2snKXsKCQljc3NbJ21hcmdpbi10b3AnXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoICRlLmNzcygnbWFyZ2luLXRvcCcpICkgfHwgMAoJCWNzc1snbWFyZ2luLWJvdHRvbSddID0gUmVzb2x2ZVVuaXRlZE51bWJlciggJGUuY3NzKCdtYXJnaW4tYm90dG9tJykgKSB8fCAwCgkJY3NzWydwYWRkaW5nLXRvcCddID0gUmVzb2x2ZVVuaXRlZE51bWJlciggJGUuY3NzKCdwYWRkaW5nLXRvcCcpICkgfHwgMAoJCWNzc1sncGFkZGluZy1ib3R0b20nXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoICRlLmNzcygncGFkZGluZy1ib3R0b20nKSApIHx8IDAKCX0KCglyZXR1cm4gY3NzCn0KCmZ1bmN0aW9uIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpewoJdmFyIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGZhbHNlCgoJdmFyIGksIGwsIHQKCSwgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbJyMnK2VsZW1lbnQuaWRdCglpZiAoaGFuZGxlcnMpIHsKCQlpZiAodHlwZW9mIGhhbmRsZXJzID09PSAnZnVuY3Rpb24nKSB7CgkJCWlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKQoJCX0gZWxzZSAvKiBhcnJheSAqLyB7CgkJCWkgPSAwCgkJCWwgPSBoYW5kbGVycy5sZW5ndGgKCQkJd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCl7CgkJCQlpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcikKCQkJCTtpKys7CgkJCX0KCQl9Cgl9CgoJaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbZWxlbWVudC5ub2RlTmFtZV0KCWlmICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGhhbmRsZXJzKSB7CgkJaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gJ2Z1bmN0aW9uJykgewoJCQlpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcikKCQl9IGVsc2UgLyogYXJyYXkgKi8gewoJCQlpID0gMAoJCQlsID0gaGFuZGxlcnMubGVuZ3RoCgkJCXdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpewoJCQkJaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpCgkJCQk7aSsrOwoJCQl9CgkJfQoJfQoKCXJldHVybiBpc0hhbmRsZWRFbHNld2hlcmUKfQoKZnVuY3Rpb24gRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpewoJdmFyIGNucyA9IGVsZW1lbnQuY2hpbGROb2RlcwoJLCBjbgoJLCBmcmFnbWVudENTUyA9IEdldENTUyhlbGVtZW50KQoJLCBpc0Jsb2NrID0gZnJhZ21lbnRDU1MuZGlzcGxheSA9PT0gJ2Jsb2NrJwoKCWlmIChpc0Jsb2NrKSB7CgkJcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeSgpCgkJcmVuZGVyZXIuc2V0QmxvY2tTdHlsZShmcmFnbWVudENTUykKCX0KCglmb3IgKHZhciBpID0gMCwgbCA9IGNucy5sZW5ndGg7IGkgPCBsIDsgaSsrKXsKCQljbiA9IGNuc1tpXQoKCQlpZiAodHlwZW9mIGNuID09PSAnb2JqZWN0JykgewoJCQkvLyBEb24ndCByZW5kZXIgdGhlIGluc2lkZXMgb2Ygc2NyaXB0IHRhZ3MsIHRoZXkgY29udGFpbiB0ZXh0IG5vZGVzIHdoaWNoIHRoZW4gcmVuZGVyCgkJCWlmIChjbi5ub2RlVHlwZSA9PT0gMSAmJiBjbi5ub2RlTmFtZSAhPSAnU0NSSVBUJykgewoJCQkJaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHsKCQkJCQlEcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpCgkJCQl9CgkJCX0gZWxzZSBpZiAoY24ubm9kZVR5cGUgPT09IDMpewoJCQkJcmVuZGVyZXIuYWRkVGV4dCggY24ubm9kZVZhbHVlLCBmcmFnbWVudENTUyApCgkJCX0KCQl9IGVsc2UgaWYgKHR5cGVvZiBjbiA9PT0gJ3N0cmluZycpIHsKCQkJcmVuZGVyZXIuYWRkVGV4dCggY24sIGZyYWdtZW50Q1NTICkKCQl9Cgl9CgoJaWYgKGlzQmxvY2spIHsKCQlyZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KCkKCX0KfQoKZnVuY3Rpb24gcHJvY2VzcyhwZGYsIGVsZW1lbnQsIHgsIHksIHNldHRpbmdzKSB7CgoJLy8gd2Ugb3BlcmF0ZSBvbiBET00gZWxlbXMuIFNvIEhUTUwtZm9ybWF0dGVkIHN0cmluZ3MgbmVlZCB0byBwdXNoZWQgaW50byBvbmUKCWlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHsKCQllbGVtZW50ID0gKGZ1bmN0aW9uKGVsZW1lbnQpIHsKCQkJdmFyIGZyYW1lbmFtZSA9ICJqc1BERmh0bWxUZXh0IiArIERhdGUubm93KCkudG9TdHJpbmcoKSArIChNYXRoLnJhbmRvbSgpICogMTAwMCkudG9GaXhlZCgwKQoJCQksIHZpc3VhbGx5aGlkZGVuID0gJ3Bvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OycgKwoJCQkJJ2NsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsgLyogSUU2LCBJRTcgKi8nICsKCQkJCSdjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7JyArCgkJCQkncGFkZGluZzowICFpbXBvcnRhbnQ7JyArCgkJCQknYm9yZGVyOjAgIWltcG9ydGFudDsnICsKCQkJCSdoZWlnaHQ6IDFweCAhaW1wb3J0YW50OycgKyAKCQkJCSd3aWR0aDogMXB4ICFpbXBvcnRhbnQ7ICcgKwoJCQkJJ3RvcDphdXRvOycgKwoJCQkJJ2xlZnQ6LTEwMHB4OycgKwoJCQkJJ292ZXJmbG93OiBoaWRkZW47JwoJCQkvLyBUT0RPOiBjbGVhbiB1cCBoaWRkZW4gZGl2CgkJCSwgJGhpZGRlbmRpdiA9ICQoCgkJCQknPGRpdiBzdHlsZT0iJyt2aXN1YWxseWhpZGRlbisnIj4nICsKCQkJCSc8aWZyYW1lIHN0eWxlPSJoZWlnaHQ6MXB4O3dpZHRoOjFweCIgbmFtZT0iJytmcmFtZW5hbWUrJyIgLz4nICsKCQkJCSc8L2Rpdj4nCgkJCSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkKCQkJLCAkZnJhbWUgPSB3aW5kb3cuZnJhbWVzW2ZyYW1lbmFtZV0KCQkJcmV0dXJuICQoJGZyYW1lLmRvY3VtZW50LmJvZHkpLmh0bWwoZWxlbWVudClbMF0KCQl9KSggZWxlbWVudCApCgl9CgoJdmFyIHIgPSBuZXcgUmVuZGVyZXIoIHBkZiwgeCwgeSwgc2V0dGluZ3MgKQoJLCBhID0gRHJpbGxGb3JDb250ZW50KCBlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMgKQoKCXJldHVybiByLmRpc3Bvc2UoKQoKfQoKCi8qKgpDb252ZXJ0cyBIVE1MLWZvcm1hdHRlZCB0ZXh0IGludG8gZm9ybWF0dGVkIFBERiB0ZXh0LgoKTm90ZXM6CjIwMTItMDctMTgKCVBsdWdpbiByZWxpZXMgb24gaGF2aW5nIGJyb3dzZXIsIERPTSBhcm91bmQuIFRoZSBIVE1MIGlzIHB1c2hlZCBpbnRvIGRvbSBhbmQgdHJhdmVyc2VkLgoJUGx1Z2luIHJlbGllcyBvbiBqUXVlcnkgZm9yIENTUyBleHRyYWN0aW9uLgoJVGFyZ2V0aW5nIEhUTUwgb3V0cHV0IGZyb20gTWFya2Rvd24gdGVtcGxhdGluZywgd2hpY2ggaXMgYSB2ZXJ5IHNpbXBsZQoJbWFya3VwIC0gZGl2LCBzcGFuLCBlbSwgc3Ryb25nLCBwLiBObyBici1iYXNlZCBwYXJhZ3JhcGggc2VwYXJhdGlvbiBzdXBwb3J0ZWQgZXhwbGljaXRseSAoYnV0IHN0aWxsIG1heSB3b3JrLikKCUltYWdlcywgdGFibGVzIGFyZSBOT1Qgc3VwcG9ydGVkLgoKQHB1YmxpYwpAZnVuY3Rpb24KQHBhcmFtIEhUTUwge1N0cmluZyBvciBET00gRWxlbWVudH0gSFRNTC1mb3JtYXR0ZWQgdGV4dCwgb3IgcG9pbnRlciB0byBET00gZWxlbWVudCB0aGF0IGlzIHRvIGJlIHJlbmRlcmVkIGludG8gUERGLgpAcGFyYW0geCB7TnVtYmVyfSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy4KQHBhcmFtIHkge051bWJlcn0gc3RhcnRpbmcgWSBjb29yZGluYXRlIGluIGpzUERGIGluc3RhbmNlJ3MgZGVjbGFyZWQgdW5pdHMuCkBwYXJhbSBzZXR0aW5ncyB7T2JqZWN0fSBBZGRpdGlvbmFsIC8gb3B0aW9uYWwgdmFyaWFibGVzIGNvbnRyb2xsaW5nIHBhcnNpbmcsIHJlbmRlcmluZy4KQHJldHVybnMge09iamVjdH0ganNQREYgaW5zdGFuY2UKKi8KanNQREZBUEkuZnJvbUhUTUwgPSBmdW5jdGlvbihIVE1MLCB4LCB5LCBzZXR0aW5ncykgewoJJ3VzZSBzdHJpY3QnCgkvLyBgdGhpc2AgaXMgX2pzUERGIG9iamVjdCByZXR1cm5lZCB3aGVuIGpzUERGIGlzIGluaXRlZCAobmV3IGpzUERGKCkpCgkvLyBgdGhpcy5pbnRlcm5hbGAgaXMgYSBjb2xsZWN0aW9uIG9mIHVzZWZ1bCwgc3BlY2lmaWMtdG8tcmF3LVBERi1zdHJlYW0gZnVuY3Rpb25zLgoJLy8gZm9yIGV4YW1wbGUsIGB0aGlzLmludGVybmFsLndyaXRlYCBmdW5jdGlvbiBhbGxvd2luZyB5b3UgdG8gd3JpdGUgZGlyZWN0bHkgdG8gUERGIHN0cmVhbS4KCS8vIGB0aGlzLmxpbmVgLCBgdGhpcy50ZXh0YCBldGMgYXJlIGF2YWlsYWJsZSBkaXJlY3RseS4KCS8vIHNvIGlmIHlvdXIgcGx1Z2luIGp1c3Qgd3JhcHMgY29tcGxleCBzZXJpZXMgb2YgdGhpcy5saW5lIG9yIHRoaXMudGV4dCBvciBvdGhlciBwdWJsaWMgQVBJIGNhbGxzLAoJLy8geW91IGRvbid0IG5lZWQgdG8gbG9vayBpbnRvIGB0aGlzLmludGVybmFsYAoJLy8gU2VlIF9qc1BERiBvYmplY3QgaW4ganNwZGYuanMgZm9yIGNvbXBsZXRlIGxpc3Qgb2Ygd2hhdCdzIGF2YWlsYWJsZSB0byB5b3UuCgoJLy8gaXQgaXMgZ29vZCBwcmFjdGljZSB0byByZXR1cm4gcmVmIHRvIGpzUERGIGluc3RhbmNlIHRvIG1ha2UgCgkvLyB0aGUgY2FsbHMgY2hhaW5hYmxlLiAKCS8vIHJldHVybiB0aGlzCgoJLy8gYnV0IGluIHRoaXMgY2FzZSBpdCBpcyBtb3JlIHVzZWZ1bGwgdG8gcmV0dXJuIHNvbWUgc3RhdHMgYWJvdXQgd2hhdCB3ZSByZW5kZXJlZC4gCglyZXR1cm4gcHJvY2Vzcyh0aGlzLCBIVE1MLCB4LCB5LCBzZXR0aW5ncykKfQoKfSkoanNQREYuQVBJKQo='
fivejsn = 'jspdf.plugin.addimage.js'
fivejsd = 'LyoqIEBwcmVzZXJ2ZSAKanNQREYgYWRkSW1hZ2UgcGx1Z2luIChKUEVHIG9ubHkgYXQgdGhpcyB0aW1lKQpDb3B5cmlnaHQgKGMpIDIwMTIgaHR0cHM6Ly9naXRodWIuY29tL3NpZWZrZW5qLwoqLwoKLyoqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKiAKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqIAogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECiAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgogKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwoKOyhmdW5jdGlvbihqc1BERkFQSSkgewondXNlIHN0cmljdCcKCnZhciBuYW1lc3BhY2UgPSAnYWRkSW1hZ2VfJwoKLy8gdGFrZXMgYSBzdHJpbmcgaW1nRGF0YSBjb250YWluaW5nIHRoZSByYXcgYnl0ZXMgb2YKLy8gYSBqcGVnIGltYWdlIGFuZCByZXR1cm5zIFt3aWR0aCwgaGVpZ2h0XQovLyBBbGdvcml0aG0gZnJvbTogaHR0cDovL3d3dy42NGxpbmVzLmNvbS9qcGVnLXdpZHRoLWhlaWdodAp2YXIgZ2V0SnBlZ1NpemUgPSBmdW5jdGlvbihpbWdEYXRhKSB7CgkndXNlIHN0cmljdCcKCXZhciB3aWR0aCwgaGVpZ2h0OwoJLy8gVmVyaWZ5IHdlIGhhdmUgYSB2YWxpZCBqcGVnIGhlYWRlciAweGZmLDB4ZDgsMHhmZiwweGUwLD8sPywnSicsJ0YnLCdJJywnRicsMHgwMAoJaWYgKCFpbWdEYXRhLmNoYXJDb2RlQXQoMCkgPT09IDB4ZmYgfHwKCQkhaW1nRGF0YS5jaGFyQ29kZUF0KDEpID09PSAweGQ4IHx8CgkJIWltZ0RhdGEuY2hhckNvZGVBdCgyKSA9PT0gMHhmZiB8fAoJCSFpbWdEYXRhLmNoYXJDb2RlQXQoMykgPT09IDB4ZTAgfHwKCQkhaW1nRGF0YS5jaGFyQ29kZUF0KDYpID09PSAnSicuY2hhckNvZGVBdCgwKSB8fAoJCSFpbWdEYXRhLmNoYXJDb2RlQXQoNykgPT09ICdGJy5jaGFyQ29kZUF0KDApIHx8CgkJIWltZ0RhdGEuY2hhckNvZGVBdCg4KSA9PT0gJ0knLmNoYXJDb2RlQXQoMCkgfHwKCQkhaW1nRGF0YS5jaGFyQ29kZUF0KDkpID09PSAnRicuY2hhckNvZGVBdCgwKSB8fAoJCSFpbWdEYXRhLmNoYXJDb2RlQXQoMTApID09PSAweDAwKSB7CgkJCXRocm93IG5ldyBFcnJvcignZ2V0SnBlZ1NpemUgcmVxdWlyZXMgYSBiaW5hcnkganBlZyBmaWxlJykKCX0KCXZhciBibG9ja0xlbmd0aCA9IGltZ0RhdGEuY2hhckNvZGVBdCg0KSoyNTYgKyBpbWdEYXRhLmNoYXJDb2RlQXQoNSk7Cgl2YXIgaSA9IDQsIGxlbiA9IGltZ0RhdGEubGVuZ3RoOwoJd2hpbGUgKCBpIDwgbGVuICkgewoJCWkgKz0gYmxvY2tMZW5ndGg7CgkJaWYgKGltZ0RhdGEuY2hhckNvZGVBdChpKSAhPT0gMHhmZikgewoJCQl0aHJvdyBuZXcgRXJyb3IoJ2dldEpwZWdTaXplIGNvdWxkIG5vdCBmaW5kIHRoZSBzaXplIG9mIHRoZSBpbWFnZScpOwoJCX0KCQlpZiAoaW1nRGF0YS5jaGFyQ29kZUF0KGkrMSkgPT09IDB4YzApIHsKCQkJaGVpZ2h0ID0gaW1nRGF0YS5jaGFyQ29kZUF0KGkrNSkqMjU2ICsgaW1nRGF0YS5jaGFyQ29kZUF0KGkrNik7CgkJCXdpZHRoID0gaW1nRGF0YS5jaGFyQ29kZUF0KGkrNykqMjU2ICsgaW1nRGF0YS5jaGFyQ29kZUF0KGkrOCk7CgkJCXJldHVybiBbd2lkdGgsIGhlaWdodF07CgkJfSBlbHNlIHsKCQkJaSArPSAyOwoJCQlibG9ja0xlbmd0aCA9IGltZ0RhdGEuY2hhckNvZGVBdChpKSoyNTYgKyBpbWdEYXRhLmNoYXJDb2RlQXQoaSsxKQoJCX0KCX0KfQovLyBJbWFnZSBmdW5jdGlvbmFsaXR5IHBvcnRlZCBmcm9tIHBkZi5qcwosIHB1dEltYWdlID0gZnVuY3Rpb24oaW1nKSB7Cgl2YXIgb2JqZWN0TnVtYmVyID0gdGhpcy5pbnRlcm5hbC5uZXdPYmplY3QoKQoJLCBvdXQgPSB0aGlzLmludGVybmFsLndyaXRlCgksIHB1dFN0cmVhbSA9IHRoaXMuaW50ZXJuYWwucHV0U3RyZWFtCgoJaW1nWyduJ10gPSBvYmplY3ROdW1iZXIKCglvdXQoJzw8L1R5cGUgL1hPYmplY3QnKQoJb3V0KCcvU3VidHlwZSAvSW1hZ2UnKQoJb3V0KCcvV2lkdGggJyArIGltZ1sndyddKQoJb3V0KCcvSGVpZ2h0ICcgKyBpbWdbJ2gnXSkKCWlmIChpbWdbJ2NzJ10gPT09ICdJbmRleGVkJykgewoJCW91dCgnL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgJwoJCQkJKyAoaW1nWydwYWwnXS5sZW5ndGggLyAzIC0gMSkgKyAnICcgKyAob2JqZWN0TnVtYmVyICsgMSkKCQkJCSsgJyAwIFJdJyk7Cgl9IGVsc2UgewoJCW91dCgnL0NvbG9yU3BhY2UgLycgKyBpbWdbJ2NzJ10pOwoJCWlmIChpbWdbJ2NzJ10gPT09ICdEZXZpY2VDTVlLJykgewoJCQlvdXQoJy9EZWNvZGUgWzEgMCAxIDAgMSAwIDEgMF0nKTsKCQl9Cgl9CglvdXQoJy9CaXRzUGVyQ29tcG9uZW50ICcgKyBpbWdbJ2JwYyddKTsKCWlmICgnZicgaW4gaW1nKSB7CgkJb3V0KCcvRmlsdGVyIC8nICsgaW1nWydmJ10pOwoJfQoJaWYgKCdkcCcgaW4gaW1nKSB7CgkJb3V0KCcvRGVjb2RlUGFybXMgPDwnICsgaW1nWydkcCddICsgJz4+Jyk7Cgl9CglpZiAoJ3RybnMnIGluIGltZyAmJiBpbWdbJ3RybnMnXS5jb25zdHJ1Y3RvciA9PSBBcnJheSkgewoJCXZhciB0cm5zID0gJyc7CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgaW1nWyd0cm5zJ10ubGVuZ3RoOyBpKyspIHsKCQkJdHJucyArPSAoaW1nW3RybnNdW2ldICsgJyAnICsgaW1nWyd0cm5zJ11baV0gKyAnICcpOwoJCQlvdXQoJy9NYXNrIFsnICsgdHJucyArICddJyk7CgkJfQoJfQoJaWYgKCdzbWFzaycgaW4gaW1nKSB7CgkJb3V0KCcvU01hc2sgJyArIChvYmplY3ROdW1iZXIgKyAxKSArICcgMCBSJyk7Cgl9CglvdXQoJy9MZW5ndGggJyArIGltZ1snZGF0YSddLmxlbmd0aCArICc+PicpOwoKCXB1dFN0cmVhbShpbWdbJ2RhdGEnXSk7CgoJb3V0KCdlbmRvYmonKTsKfQosIHB1dFJlc291cmNlc0NhbGxiYWNrID0gZnVuY3Rpb24oKSB7Cgl2YXIgaW1hZ2VzID0gdGhpcy5pbnRlcm5hbC5jb2xsZWN0aW9uc1tuYW1lc3BhY2UgKyAnaW1hZ2VzJ10KCWZvciAoIHZhciBpIGluIGltYWdlcyApIHsKCQlwdXRJbWFnZS5jYWxsKHRoaXMsIGltYWdlc1tpXSkKCX0KfQosIHB1dFhPYmplY3RzRGljdENhbGxiYWNrID0gZnVuY3Rpb24oKXsKCXZhciBpbWFnZXMgPSB0aGlzLmludGVybmFsLmNvbGxlY3Rpb25zW25hbWVzcGFjZSArICdpbWFnZXMnXQoJLCBvdXQgPSB0aGlzLmludGVybmFsLndyaXRlCgksIGltYWdlCglmb3IgKHZhciBpIGluIGltYWdlcykgewoJCWltYWdlID0gaW1hZ2VzW2ldCgkJb3V0KAoJCQknL0knICsgaW1hZ2VbJ2knXQoJCQksIGltYWdlWyduJ10KCQkJLCAnMCcKCQkJLCAnUicKCQkpCgl9Cn0KCmpzUERGQVBJLmFkZEltYWdlID0gZnVuY3Rpb24oaW1hZ2VEYXRhLCBmb3JtYXQsIHgsIHksIHcsIGgpIHsKCSd1c2Ugc3RyaWN0JwoKCWlmIChmb3JtYXQudG9VcHBlckNhc2UoKSAhPT0gJ0pQRUcnKSB7CgkJdGhyb3cgbmV3IEVycm9yKCdhZGRJbWFnZSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBmb3JtYXQgXCdKUEVHXCcsIG5vdCBcJycrZm9ybWF0KydcJycpOwoJfQoKCXZhciBpbWFnZUluZGV4CgksIGltYWdlcyA9IHRoaXMuaW50ZXJuYWwuY29sbGVjdGlvbnNbbmFtZXNwYWNlICsgJ2ltYWdlcyddCgksIGNvb3JkID0gdGhpcy5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nCgksIHZjb29yZCA9IHRoaXMuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nOwoKCS8vIERldGVjdCBpZiB0aGUgaW1hZ2VEYXRhIGlzIHJhdyBiaW5hcnkgb3IgRGF0YSBVUkwKCWlmIChpbWFnZURhdGEuc3Vic3RyaW5nKDAsIDIzKSA9PT0gJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJykgewoJCWltYWdlRGF0YSA9IGF0b2IoaW1hZ2VEYXRhLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJywgJycpKTsKCX0KCglpZiAoaW1hZ2VzKXsKCQkvLyB0aGlzIGlzIE5PVCB0aGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcyByYW4gb24gdGhpcyBpbnN0YW5jZSBvZiBqc1BERiBvYmplY3QuCgkJaW1hZ2VJbmRleCA9IE9iamVjdC5rZXlzID8gCgkJT2JqZWN0LmtleXMoaW1hZ2VzKS5sZW5ndGggOgoJCShmdW5jdGlvbihvKXsKCQkJdmFyIGkgPSAwCgkJCWZvciAodmFyIGUgaW4gbyl7aWYoby5oYXNPd25Qcm9wZXJ0eShlKSl7IGkrKyB9fQoJCQlyZXR1cm4gaQoJCX0pKGltYWdlcykKCX0gZWxzZSB7CgkJLy8gdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcyByYW4gb24gdGhpcyBpbnN0YW5jZSBvZiBqc1BERiBvYmplY3QuCgkJaW1hZ2VJbmRleCA9IDAKCQl0aGlzLmludGVybmFsLmNvbGxlY3Rpb25zW25hbWVzcGFjZSArICdpbWFnZXMnXSA9IGltYWdlcyA9IHt9CgkJdGhpcy5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwdXRSZXNvdXJjZXMnLCBwdXRSZXNvdXJjZXNDYWxsYmFjaykKCQl0aGlzLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3B1dFhvYmplY3REaWN0JywgcHV0WE9iamVjdHNEaWN0Q2FsbGJhY2spCgl9CgoJdmFyIGRpbXMgPSBnZXRKcGVnU2l6ZShpbWFnZURhdGEpOwoJdmFyIGluZm8gPSB7CgkJdyA6IGRpbXNbMF0sCgkJaCA6IGRpbXNbMV0sCgkJY3MgOiAnRGV2aWNlUkdCJywKCQlicGMgOiA4LAoJCWYgOiAnRENURGVjb2RlJywKCQlpIDogaW1hZ2VJbmRleCwKCQlkYXRhIDogaW1hZ2VEYXRhCgkJLy8gbjogb2JqZWN0TnVtYmVyIHdpbGwgYmUgYWRkZWQgYnkgcHV0SW1hZ2UgY29kZQoKCX07CglpbWFnZXNbaW1hZ2VJbmRleF0gPSBpbmZvCglpZiAoIXcgJiYgIWgpIHsKCQl3ID0gLTk2OwoJCWggPSAtOTY7Cgl9CglpZiAodyA8IDApIHsKCQl3ID0gKC0xKSAqIGluZm9bJ3cnXSAqIDcyIC8gdyAvIHRoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3I7Cgl9CglpZiAoaCA8IDApIHsKCQloID0gKC0xKSAqIGluZm9bJ2gnXSAqIDcyIC8gaCAvIHRoaXMuaW50ZXJuYWwuc2NhbGVGYWN0b3I7Cgl9CglpZiAodyA9PT0gMCkgewoJCXcgPSBoICogaW5mb1sndyddIC8gaW5mb1snaCddOwoJfQoJaWYgKGggPT09IDApIHsKCQloID0gdyAqIGluZm9bJ2gnXSAvIGluZm9bJ3cnXTsKCX0KCgl0aGlzLmludGVybmFsLndyaXRlKAoJCSdxJwoJCSwgY29vcmQodykKCQksICcwIDAnCgkJLCBjb29yZChoKSAvLyBUT0RPOiBjaGVjayBpZiB0aGlzIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHZjb29yZAoJCSwgY29vcmQoeCkKCQksIHZjb29yZCh5ICsgaCkKCQksICdjbSAvSScraW5mb1snaSddCgkJLCAnRG8gUScKCSkKCglyZXR1cm4gdGhpcyAKfQoKfSkoanNQREYuQVBJKQo='
sixjsn = 'BlobBuilder.js'
sixjsd = 'LyogQmxvYkJ1aWxkZXIuanMKICogQSBCbG9iQnVpbGRlciBpbXBsZW1lbnRhdGlvbi4KICogMjAxMi0wNC0yMQogKiAKICogQnkgRWxpIEdyZXksIGh0dHA6Ly9lbGlncmV5LmNvbQogKiBMaWNlbnNlOiBYMTEvTUlUCiAqICAgU2VlIExJQ0VOU0UubWQKICovCgovKmdsb2JhbCBzZWxmLCB1bmVzY2FwZSAqLwovKmpzbGludCBiaXR3aXNlOiB0cnVlLCByZWdleHA6IHRydWUsIGNvbmZ1c2lvbjogdHJ1ZSwgZXM1OiB0cnVlLCB2YXJzOiB0cnVlLCB3aGl0ZTogdHJ1ZSwKICBwbHVzcGx1czogdHJ1ZSAqLwoKLyohIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0Jsb2JCdWlsZGVyLmpzL2Jsb2IvbWFzdGVyL0Jsb2JCdWlsZGVyLmpzICovCgp2YXIgQmxvYkJ1aWxkZXIgPSBCbG9iQnVpbGRlciB8fCBzZWxmLldlYktpdEJsb2JCdWlsZGVyIHx8IHNlbGYuTW96QmxvYkJ1aWxkZXIgfHwgc2VsZi5NU0Jsb2JCdWlsZGVyIHx8IChmdW5jdGlvbih2aWV3KSB7CiJ1c2Ugc3RyaWN0IjsKdmFyCgkgIGdldF9jbGFzcyA9IGZ1bmN0aW9uKG9iamVjdCkgewoJCXJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KS5tYXRjaCgvXlxbb2JqZWN0XHMoLiopXF0kLylbMV07Cgl9CgksIEZha2VCbG9iQnVpbGRlciA9IGZ1bmN0aW9uKCl7CgkJdGhpcy5kYXRhID0gW107Cgl9CgksIEZha2VCbG9iID0gZnVuY3Rpb24oZGF0YSwgdHlwZSwgZW5jb2RpbmcpIHsKCQl0aGlzLmRhdGEgPSBkYXRhOwoJCXRoaXMuc2l6ZSA9IGRhdGEubGVuZ3RoOwoJCXRoaXMudHlwZSA9IHR5cGU7CgkJdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwoJfQoJLCBGQkJfcHJvdG8gPSBGYWtlQmxvYkJ1aWxkZXIucHJvdG90eXBlCgksIEZCX3Byb3RvID0gRmFrZUJsb2IucHJvdG90eXBlCgksIEZpbGVSZWFkZXJTeW5jID0gdmlldy5GaWxlUmVhZGVyU3luYwoJLCBGaWxlRXhjZXB0aW9uID0gZnVuY3Rpb24odHlwZSkgewoJCXRoaXMuY29kZSA9IHRoaXNbdGhpcy5uYW1lID0gdHlwZV07Cgl9CgksIGZpbGVfZXhfY29kZXMgPSAoCgkJICAiTk9UX0ZPVU5EX0VSUiBTRUNVUklUWV9FUlIgQUJPUlRfRVJSIE5PVF9SRUFEQUJMRV9FUlIgRU5DT0RJTkdfRVJSICIKCQkrICJOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIgSU5WQUxJRF9TVEFURV9FUlIgU1lOVEFYX0VSUiIKCSkuc3BsaXQoIiAiKQoJLCBmaWxlX2V4X2NvZGUgPSBmaWxlX2V4X2NvZGVzLmxlbmd0aAoJLCByZWFsVVJMID0gdmlldy5VUkwgfHwgdmlldy53ZWJraXRVUkwgfHwgdmlldwoJLCByZWFsX2NyZWF0ZV9vYmplY3RfVVJMID0gcmVhbFVSTC5jcmVhdGVPYmplY3RVUkwKCSwgcmVhbF9yZXZva2Vfb2JqZWN0X1VSTCA9IHJlYWxVUkwucmV2b2tlT2JqZWN0VVJMCgksIFVSTCA9IHJlYWxVUkwKCSwgYnRvYSA9IHZpZXcuYnRvYQoJLCBhdG9iID0gdmlldy5hdG9iCgksIGNhbl9hcHBseV90eXBlZF9hcnJheXMgPSBmYWxzZQoJLCBjYW5fYXBwbHlfdHlwZWRfYXJyYXlzX3Rlc3QgPSBmdW5jdGlvbihwYXNzKSB7CgkJY2FuX2FwcGx5X3R5cGVkX2FycmF5cyA9ICFwYXNzOwoJfQoJCgksIEFycmF5QnVmZmVyID0gdmlldy5BcnJheUJ1ZmZlcgoJLCBVaW50OEFycmF5ID0gdmlldy5VaW50OEFycmF5CjsKRmFrZUJsb2JCdWlsZGVyLmZha2UgPSBGQl9wcm90by5mYWtlID0gdHJ1ZTsKd2hpbGUgKGZpbGVfZXhfY29kZS0tKSB7CglGaWxlRXhjZXB0aW9uLnByb3RvdHlwZVtmaWxlX2V4X2NvZGVzW2ZpbGVfZXhfY29kZV1dID0gZmlsZV9leF9jb2RlICsgMTsKfQp0cnkgewoJaWYgKFVpbnQ4QXJyYXkpIHsKCQljYW5fYXBwbHlfdHlwZWRfYXJyYXlzX3Rlc3QuYXBwbHkoMCwgbmV3IFVpbnQ4QXJyYXkoMSkpOwoJfQp9IGNhdGNoIChleCkge30KaWYgKCFyZWFsVVJMLmNyZWF0ZU9iamVjdFVSTCkgewoJVVJMID0gdmlldy5VUkwgPSB7fTsKfQpVUkwuY3JlYXRlT2JqZWN0VVJMID0gZnVuY3Rpb24oYmxvYikgewoJdmFyCgkJICB0eXBlID0gYmxvYi50eXBlCgkJLCBkYXRhX1VSSV9oZWFkZXIKCTsKCWlmICh0eXBlID09PSBudWxsKSB7CgkJdHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwoJfQoJaWYgKGJsb2IgaW5zdGFuY2VvZiBGYWtlQmxvYikgewoJCWRhdGFfVVJJX2hlYWRlciA9ICJkYXRhOiIgKyB0eXBlOwoJCWlmIChibG9iLmVuY29kaW5nID09PSAiYmFzZTY0IikgewoJCQlyZXR1cm4gZGF0YV9VUklfaGVhZGVyICsgIjtiYXNlNjQsIiArIGJsb2IuZGF0YTsKCQl9IGVsc2UgaWYgKGJsb2IuZW5jb2RpbmcgPT09ICJVUkkiKSB7CgkJCXJldHVybiBkYXRhX1VSSV9oZWFkZXIgKyAiLCIgKyBkZWNvZGVVUklDb21wb25lbnQoYmxvYi5kYXRhKTsKCQl9IGlmIChidG9hKSB7CgkJCXJldHVybiBkYXRhX1VSSV9oZWFkZXIgKyAiO2Jhc2U2NCwiICsgYnRvYShibG9iLmRhdGEpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBkYXRhX1VSSV9oZWFkZXIgKyAiLCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi5kYXRhKTsKCQl9Cgl9IGVsc2UgaWYgKHJlYWxfY3JlYXRlX29iamVjdF91cmwpIHsKCQlyZXR1cm4gcmVhbF9jcmVhdGVfb2JqZWN0X3VybC5jYWxsKHJlYWxVUkwsIGJsb2IpOwoJfQp9OwpVUkwucmV2b2tlT2JqZWN0VVJMID0gZnVuY3Rpb24ob2JqZWN0X3VybCkgewoJaWYgKG9iamVjdF91cmwuc3Vic3RyaW5nKDAsIDUpICE9PSAiZGF0YToiICYmIHJlYWxfcmV2b2tlX29iamVjdF91cmwpIHsKCQlyZWFsX3Jldm9rZV9vYmplY3RfdXJsLmNhbGwocmVhbFVSTCwgb2JqZWN0X3VybCk7Cgl9Cn07CkZCQl9wcm90by5hcHBlbmQgPSBmdW5jdGlvbihkYXRhLyosIGVuZGluZ3MqLykgewoJdmFyIGJiID0gdGhpcy5kYXRhOwoJLy8gZGVjb2RlIGRhdGEgdG8gYSBiaW5hcnkgc3RyaW5nCglpZiAoVWludDhBcnJheSAmJiBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgewoJCWlmIChjYW5fYXBwbHlfdHlwZWRfYXJyYXlzKSB7CgkJCWJiLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIG5ldyBVaW50OEFycmF5KGRhdGEpKSk7CgkJfSBlbHNlIHsKCQkJdmFyCgkJCQkgIHN0ciA9ICIiCgkJCQksIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGRhdGEpCgkJCQksIGkgPSAwCgkJCQksIGJ1Zl9sZW4gPSBidWYubGVuZ3RoCgkJCTsKCQkJZm9yICg7IGkgPCBidWZfbGVuOyBpKyspIHsKCQkJCXN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7CgkJCX0KCQl9Cgl9IGVsc2UgaWYgKGdldF9jbGFzcyhkYXRhKSA9PT0gIkJsb2IiIHx8IGdldF9jbGFzcyhkYXRhKSA9PT0gIkZpbGUiKSB7CgkJaWYgKEZpbGVSZWFkZXJTeW5jKSB7CgkJCXZhciBmciA9IG5ldyBGaWxlUmVhZGVyU3luYzsKCQkJYmIucHVzaChmci5yZWFkQXNCaW5hcnlTdHJpbmcoZGF0YSkpOwoJCX0gZWxzZSB7CgkJCS8vIGFzeW5jIEZpbGVSZWFkZXIgd29uJ3Qgd29yayBhcyBCbG9iQnVpbGRlciBpcyBzeW5jCgkJCXRocm93IG5ldyBGaWxlRXhjZXB0aW9uKCJOT1RfUkVBREFCTEVfRVJSIik7CgkJfQoJfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRmFrZUJsb2IpIHsKCQlpZiAoZGF0YS5lbmNvZGluZyA9PT0gImJhc2U2NCIgJiYgYXRvYikgewoJCQliYi5wdXNoKGF0b2IoZGF0YS5kYXRhKSk7CgkJfSBlbHNlIGlmIChkYXRhLmVuY29kaW5nID09PSAiVVJJIikgewoJCQliYi5wdXNoKGRlY29kZVVSSUNvbXBvbmVudChkYXRhLmRhdGEpKTsKCQl9IGVsc2UgaWYgKGRhdGEuZW5jb2RpbmcgPT09ICJyYXciKSB7CgkJCWJiLnB1c2goZGF0YS5kYXRhKTsKCQl9Cgl9IGVsc2UgewoJCWlmICh0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIpIHsKCQkJZGF0YSArPSAiIjsgLy8gY29udmVydCB1bnN1cHBvcnRlZCB0eXBlcyB0byBzdHJpbmdzCgkJfQoJCS8vIGRlY29kZSBVVEYtMTYgdG8gYmluYXJ5IHN0cmluZwoJCWJiLnB1c2godW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGRhdGEpKSk7Cgl9Cn07CkZCQl9wcm90by5nZXRCbG9iID0gZnVuY3Rpb24odHlwZSkgewoJaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CgkJdHlwZSA9IG51bGw7Cgl9CglyZXR1cm4gbmV3IEZha2VCbG9iKHRoaXMuZGF0YS5qb2luKCIiKSwgdHlwZSwgInJhdyIpOwp9OwpGQkJfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKCXJldHVybiAiW29iamVjdCBCbG9iQnVpbGRlcl0iOwp9OwpGQl9wcm90by5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHR5cGUpIHsKCXZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aDsKCWlmIChhcmdzIDwgMykgewoJCXR5cGUgPSBudWxsOwoJfQoJcmV0dXJuIG5ldyBGYWtlQmxvYigKCQkgIHRoaXMuZGF0YS5zbGljZShzdGFydCwgYXJncyA+IDEgPyBlbmQgOiB0aGlzLmRhdGEubGVuZ3RoKQoJCSwgdHlwZQoJCSwgdGhpcy5lbmNvZGluZwoJKTsKfTsKRkJfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKCXJldHVybiAiW29iamVjdCBCbG9iXSI7Cn07CnJldHVybiBGYWtlQmxvYkJ1aWxkZXI7Cn0oc2VsZikpOwo='
sevenjsn = 'FileSaver.js'
sevenjsd = 'LyogRmlsZVNhdmVyLmpzCiAqIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLgogKiAyMDEyLTEyLTExCiAqIAogKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tCiAqIExpY2Vuc2U6IFgxMS9NSVQKICogICBTZWUgTElDRU5TRS5tZAogKi8KCi8qZ2xvYmFsIHNlbGYgKi8KLypqc2xpbnQgYml0d2lzZTogdHJ1ZSwgcmVnZXhwOiB0cnVlLCBjb25mdXNpb246IHRydWUsIGVzNTogdHJ1ZSwgdmFyczogdHJ1ZSwgd2hpdGU6IHRydWUsCiAgcGx1c3BsdXM6IHRydWUgKi8KCi8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvRmlsZVNhdmVyLmpzICovCgp2YXIgc2F2ZUFzID0gc2F2ZUFzCiAgfHwgKG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iICYmIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iLmJpbmQobmF2aWdhdG9yKSkKICB8fCAoZnVuY3Rpb24odmlldykgewoJInVzZSBzdHJpY3QiOwoJdmFyCgkJICBkb2MgPSB2aWV3LmRvY3VtZW50CgkJICAvLyBvbmx5IGdldCBVUkwgd2hlbiBuZWNlc3NhcnkgaW4gY2FzZSBCbG9iQnVpbGRlci5qcyBoYXNuJ3Qgb3ZlcnJpZGRlbiBpdCB5ZXQKCQksIGdldF9VUkwgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHZpZXcuVVJMIHx8IHZpZXcud2Via2l0VVJMIHx8IHZpZXc7CgkJfQoJCSwgVVJMID0gdmlldy5VUkwgfHwgdmlldy53ZWJraXRVUkwgfHwgdmlldwoJCSwgc2F2ZV9saW5rID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsICJhIikKCQksIGNhbl91c2Vfc2F2ZV9saW5rID0gImRvd25sb2FkIiBpbiBzYXZlX2xpbmsKCQksIGNsaWNrID0gZnVuY3Rpb24obm9kZSkgewoJCQl2YXIgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnRzIik7CgkJCWV2ZW50LmluaXRNb3VzZUV2ZW50KAoJCQkJImNsaWNrIiwgdHJ1ZSwgZmFsc2UsIHZpZXcsIDAsIDAsIDAsIDAsIDAKCQkJCSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwKCQkJKTsKCQkJcmV0dXJuIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7IC8vIGZhbHNlIGlmIGV2ZW50IHdhcyBjYW5jZWxsZWQKCQl9CgkJLCB3ZWJraXRfcmVxX2ZzID0gdmlldy53ZWJraXRSZXF1ZXN0RmlsZVN5c3RlbQoJCSwgcmVxX2ZzID0gdmlldy5yZXF1ZXN0RmlsZVN5c3RlbSB8fCB3ZWJraXRfcmVxX2ZzIHx8IHZpZXcubW96UmVxdWVzdEZpbGVTeXN0ZW0KCQksIHRocm93X291dHNpZGUgPSBmdW5jdGlvbiAoZXgpIHsKCQkJKHZpZXcuc2V0SW1tZWRpYXRlIHx8IHZpZXcuc2V0VGltZW91dCkoZnVuY3Rpb24oKSB7CgkJCQl0aHJvdyBleDsKCQkJfSwgMCk7CgkJfQoJCSwgZm9yY2Vfc2F2ZWFibGVfdHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iCgkJLCBmc19taW5fc2l6ZSA9IDAKCQksIGRlbGV0aW9uX3F1ZXVlID0gW10KCQksIHByb2Nlc3NfZGVsZXRpb25fcXVldWUgPSBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSBkZWxldGlvbl9xdWV1ZS5sZW5ndGg7CgkJCXdoaWxlIChpLS0pIHsKCQkJCXZhciBmaWxlID0gZGVsZXRpb25fcXVldWVbaV07CgkJCQlpZiAodHlwZW9mIGZpbGUgPT09ICJzdHJpbmciKSB7IC8vIGZpbGUgaXMgYW4gb2JqZWN0IFVSTAoJCQkJCVVSTC5yZXZva2VPYmplY3RVUkwoZmlsZSk7CgkJCQl9IGVsc2UgeyAvLyBmaWxlIGlzIGEgRmlsZQoJCQkJCWZpbGUucmVtb3ZlKCk7CgkJCQl9CgkJCX0KCQkJZGVsZXRpb25fcXVldWUubGVuZ3RoID0gMDsgLy8gY2xlYXIgcXVldWUKCQl9CgkJLCBkaXNwYXRjaCA9IGZ1bmN0aW9uKGZpbGVzYXZlciwgZXZlbnRfdHlwZXMsIGV2ZW50KSB7CgkJCWV2ZW50X3R5cGVzID0gW10uY29uY2F0KGV2ZW50X3R5cGVzKTsKCQkJdmFyIGkgPSBldmVudF90eXBlcy5sZW5ndGg7CgkJCXdoaWxlIChpLS0pIHsKCQkJCXZhciBsaXN0ZW5lciA9IGZpbGVzYXZlclsib24iICsgZXZlbnRfdHlwZXNbaV1dOwoJCQkJaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gImZ1bmN0aW9uIikgewoJCQkJCXRyeSB7CgkJCQkJCWxpc3RlbmVyLmNhbGwoZmlsZXNhdmVyLCBldmVudCB8fCBmaWxlc2F2ZXIpOwoJCQkJCX0gY2F0Y2ggKGV4KSB7CgkJCQkJCXRocm93X291dHNpZGUoZXgpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQksIEZpbGVTYXZlciA9IGZ1bmN0aW9uKGJsb2IsIG5hbWUpIHsKCQkJLy8gRmlyc3QgdHJ5IGEuZG93bmxvYWQsIHRoZW4gd2ViIGZpbGVzeXN0ZW0sIHRoZW4gb2JqZWN0IFVSTHMKCQkJdmFyCgkJCQkgIGZpbGVzYXZlciA9IHRoaXMKCQkJCSwgdHlwZSA9IGJsb2IudHlwZQoJCQkJLCBibG9iX2NoYW5nZWQgPSBmYWxzZQoJCQkJLCBvYmplY3RfdXJsCgkJCQksIHRhcmdldF92aWV3CgkJCQksIGdldF9vYmplY3RfdXJsID0gZnVuY3Rpb24oKSB7CgkJCQkJdmFyIG9iamVjdF91cmwgPSBnZXRfVVJMKCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwoJCQkJCWRlbGV0aW9uX3F1ZXVlLnB1c2gob2JqZWN0X3VybCk7CgkJCQkJcmV0dXJuIG9iamVjdF91cmw7CgkJCQl9CgkJCQksIGRpc3BhdGNoX2FsbCA9IGZ1bmN0aW9uKCkgewoJCQkJCWRpc3BhdGNoKGZpbGVzYXZlciwgIndyaXRlc3RhcnQgcHJvZ3Jlc3Mgd3JpdGUgd3JpdGVlbmQiLnNwbGl0KCIgIikpOwoJCQkJfQoJCQkJLy8gb24gYW55IGZpbGVzeXMgZXJyb3JzIHJldmVydCB0byBzYXZpbmcgd2l0aCBvYmplY3QgVVJMcwoJCQkJLCBmc19lcnJvciA9IGZ1bmN0aW9uKCkgewoJCQkJCS8vIGRvbid0IGNyZWF0ZSBtb3JlIG9iamVjdCBVUkxzIHRoYW4gbmVlZGVkCgkJCQkJaWYgKGJsb2JfY2hhbmdlZCB8fCAhb2JqZWN0X3VybCkgewoJCQkJCQlvYmplY3RfdXJsID0gZ2V0X29iamVjdF91cmwoYmxvYik7CgkJCQkJfQoJCQkJCXRhcmdldF92aWV3LmxvY2F0aW9uLmhyZWYgPSBvYmplY3RfdXJsOwoJCQkJCWZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLkRPTkU7CgkJCQkJZGlzcGF0Y2hfYWxsKCk7CgkJCQl9CgkJCQksIGFib3J0YWJsZSA9IGZ1bmN0aW9uKGZ1bmMpIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmIChmaWxlc2F2ZXIucmVhZHlTdGF0ZSAhPT0gZmlsZXNhdmVyLkRPTkUpIHsKCQkJCQkJCXJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoJCQkJLCBjcmVhdGVfaWZfbm90X2ZvdW5kID0ge2NyZWF0ZTogdHJ1ZSwgZXhjbHVzaXZlOiBmYWxzZX0KCQkJCSwgc2xpY2UKCQkJOwoJCQlmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5JTklUOwoJCQlpZiAoIW5hbWUpIHsKCQkJCW5hbWUgPSAiZG93bmxvYWQiOwoJCQl9CgkJCWlmIChjYW5fdXNlX3NhdmVfbGluaykgewoJCQkJb2JqZWN0X3VybCA9IGdldF9vYmplY3RfdXJsKGJsb2IpOwoJCQkJc2F2ZV9saW5rLmhyZWYgPSBvYmplY3RfdXJsOwoJCQkJc2F2ZV9saW5rLmRvd25sb2FkID0gbmFtZTsKCQkJCWlmIChjbGljayhzYXZlX2xpbmspKSB7CgkJCQkJZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTsKCQkJCQlkaXNwYXRjaF9hbGwoKTsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCQkJLy8gT2JqZWN0IGFuZCB3ZWIgZmlsZXN5c3RlbSBVUkxzIGhhdmUgYSBwcm9ibGVtIHNhdmluZyBpbiBHb29nbGUgQ2hyb21lIHdoZW4KCQkJLy8gdmlld2VkIGluIGEgdGFiLCBzbyBJIGZvcmNlIHNhdmUgd2l0aCBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCQkJLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTExNTgKCQkJaWYgKHZpZXcuY2hyb21lICYmIHR5cGUgJiYgdHlwZSAhPT0gZm9yY2Vfc2F2ZWFibGVfdHlwZSkgewoJCQkJc2xpY2UgPSBibG9iLnNsaWNlIHx8IGJsb2Iud2Via2l0U2xpY2U7CgkJCQlibG9iID0gc2xpY2UuY2FsbChibG9iLCAwLCBibG9iLnNpemUsIGZvcmNlX3NhdmVhYmxlX3R5cGUpOwoJCQkJYmxvYl9jaGFuZ2VkID0gdHJ1ZTsKCQkJfQoJCQkvLyBTaW5jZSBJIGNhbid0IGJlIHN1cmUgdGhhdCB0aGUgZ3Vlc3NlZCBtZWRpYSB0eXBlIHdpbGwgdHJpZ2dlciBhIGRvd25sb2FkCgkJCS8vIGluIFdlYktpdCwgSSBhcHBlbmQgLmRvd25sb2FkIHRvIHRoZSBmaWxlbmFtZS4KCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDQwCgkJCWlmICh3ZWJraXRfcmVxX2ZzICYmIG5hbWUgIT09ICJkb3dubG9hZCIpIHsKCQkJCW5hbWUgKz0gIi5kb3dubG9hZCI7CgkJCX0KCQkJaWYgKHR5cGUgPT09IGZvcmNlX3NhdmVhYmxlX3R5cGUgfHwgd2Via2l0X3JlcV9mcykgewoJCQkJdGFyZ2V0X3ZpZXcgPSB2aWV3OwoJCQl9IGVsc2UgewoJCQkJdGFyZ2V0X3ZpZXcgPSB2aWV3Lm9wZW4oKTsKCQkJfQoJCQlpZiAoIXJlcV9mcykgewoJCQkJZnNfZXJyb3IoKTsKCQkJCXJldHVybjsKCQkJfQoJCQlmc19taW5fc2l6ZSArPSBibG9iLnNpemU7CgkJCXJlcV9mcyh2aWV3LlRFTVBPUkFSWSwgZnNfbWluX3NpemUsIGFib3J0YWJsZShmdW5jdGlvbihmcykgewoJCQkJZnMucm9vdC5nZXREaXJlY3RvcnkoInNhdmVkIiwgY3JlYXRlX2lmX25vdF9mb3VuZCwgYWJvcnRhYmxlKGZ1bmN0aW9uKGRpcikgewoJCQkJCXZhciBzYXZlID0gZnVuY3Rpb24oKSB7CgkJCQkJCWRpci5nZXRGaWxlKG5hbWUsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGFib3J0YWJsZShmdW5jdGlvbihmaWxlKSB7CgkJCQkJCQlmaWxlLmNyZWF0ZVdyaXRlcihhYm9ydGFibGUoZnVuY3Rpb24od3JpdGVyKSB7CgkJCQkJCQkJd3JpdGVyLm9ud3JpdGVlbmQgPSBmdW5jdGlvbihldmVudCkgewoJCQkJCQkJCQl0YXJnZXRfdmlldy5sb2NhdGlvbi5ocmVmID0gZmlsZS50b1VSTCgpOwoJCQkJCQkJCQlkZWxldGlvbl9xdWV1ZS5wdXNoKGZpbGUpOwoJCQkJCQkJCQlmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FOwoJCQkJCQkJCQlkaXNwYXRjaChmaWxlc2F2ZXIsICJ3cml0ZWVuZCIsIGV2ZW50KTsKCQkJCQkJCQl9OwoJCQkJCQkJCXdyaXRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7CgkJCQkJCQkJCXZhciBlcnJvciA9IHdyaXRlci5lcnJvcjsKCQkJCQkJCQkJaWYgKGVycm9yLmNvZGUgIT09IGVycm9yLkFCT1JUX0VSUikgewoJCQkJCQkJCQkJZnNfZXJyb3IoKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX07CgkJCQkJCQkJIndyaXRlc3RhcnQgcHJvZ3Jlc3Mgd3JpdGUgYWJvcnQiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihldmVudCkgewoJCQkJCQkJCQl3cml0ZXJbIm9uIiArIGV2ZW50XSA9IGZpbGVzYXZlclsib24iICsgZXZlbnRdOwoJCQkJCQkJCX0pOwoJCQkJCQkJCXdyaXRlci53cml0ZShibG9iKTsKCQkJCQkJCQlmaWxlc2F2ZXIuYWJvcnQgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJd3JpdGVyLmFib3J0KCk7CgkJCQkJCQkJCWZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLkRPTkU7CgkJCQkJCQkJfTsKCQkJCQkJCQlmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5XUklUSU5HOwoJCQkJCQkJfSksIGZzX2Vycm9yKTsKCQkJCQkJfSksIGZzX2Vycm9yKTsKCQkJCQl9OwoJCQkJCWRpci5nZXRGaWxlKG5hbWUsIHtjcmVhdGU6IGZhbHNlfSwgYWJvcnRhYmxlKGZ1bmN0aW9uKGZpbGUpIHsKCQkJCQkJLy8gZGVsZXRlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMKCQkJCQkJZmlsZS5yZW1vdmUoKTsKCQkJCQkJc2F2ZSgpOwoJCQkJCX0pLCBhYm9ydGFibGUoZnVuY3Rpb24oZXgpIHsKCQkJCQkJaWYgKGV4LmNvZGUgPT09IGV4Lk5PVF9GT1VORF9FUlIpIHsKCQkJCQkJCXNhdmUoKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWZzX2Vycm9yKCk7CgkJCQkJCX0KCQkJCQl9KSk7CgkJCQl9KSwgZnNfZXJyb3IpOwoJCQl9KSwgZnNfZXJyb3IpOwoJCX0KCQksIEZTX3Byb3RvID0gRmlsZVNhdmVyLnByb3RvdHlwZQoJCSwgc2F2ZUFzID0gZnVuY3Rpb24oYmxvYiwgbmFtZSkgewoJCQlyZXR1cm4gbmV3IEZpbGVTYXZlcihibG9iLCBuYW1lKTsKCQl9Cgk7CglGU19wcm90by5hYm9ydCA9IGZ1bmN0aW9uKCkgewoJCXZhciBmaWxlc2F2ZXIgPSB0aGlzOwoJCWZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLkRPTkU7CgkJZGlzcGF0Y2goZmlsZXNhdmVyLCAiYWJvcnQiKTsKCX07CglGU19wcm90by5yZWFkeVN0YXRlID0gRlNfcHJvdG8uSU5JVCA9IDA7CglGU19wcm90by5XUklUSU5HID0gMTsKCUZTX3Byb3RvLkRPTkUgPSAyOwoJCglGU19wcm90by5lcnJvciA9CglGU19wcm90by5vbndyaXRlc3RhcnQgPQoJRlNfcHJvdG8ub25wcm9ncmVzcyA9CglGU19wcm90by5vbndyaXRlID0KCUZTX3Byb3RvLm9uYWJvcnQgPQoJRlNfcHJvdG8ub25lcnJvciA9CglGU19wcm90by5vbndyaXRlZW5kID0KCQludWxsOwoJCgl2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsIHByb2Nlc3NfZGVsZXRpb25fcXVldWUsIGZhbHNlKTsKCXJldHVybiBzYXZlQXM7Cn0oc2VsZikpOw=='
eightjsn = 'jspdf.js'
eightjsd = 'LyoqIEBwcmVzZXJ2ZSBqc1BERiAwLjkuMHJjMSAoICR7YnVpbGREYXRlfSAke2NvbW1pdElEfSApCkNvcHlyaWdodCAoYykgMjAxMC0yMDEyIEphbWVzIEhhbGwsIGphbWVzQHNuYXBzaG90bWVkaWEuY28udWssIGh0dHBzOi8vZ2l0aHViLmNvbS9NclJpby9qc1BERgpDb3B5cmlnaHQgKGMpIDIwMTIgV2lsbG93IFN5c3RlbXMgQ29ycG9yYXRpb24sIHdpbGxvdy1zeXN0ZW1zLmNvbQpNSVQgbGljZW5zZS4KKi8KCi8qCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKiAKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqIAogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECiAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgogKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwoKCi8qKgpDcmVhdGVzIG5ldyBqc1BERiBkb2N1bWVudCBvYmplY3QgaW5zdGFuY2UKQGNsYXNzCkBwYXJhbSBvcmllbnRhdGlvbiBPbmUgb2YgInBvcnRyYWl0IiBvciAibGFuZHNjYXBlIiAob3Igc2hvcnRjdXRzICJwIiAoRGVmYXVsdCksICJsIikKQHBhcmFtIHVuaXQgTWVhc3VyZW1lbnQgdW5pdCB0byBiZSB1c2VkIHdoZW4gY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZC4gT25lIG9mICJwdCIgKHBvaW50cyksICJtbSIgKERlZmF1bHQpLCAiY20iLCAiaW4iCkBwYXJhbSBmb3JtYXQgT25lIG9mICdhMycsICdhNCcgKERlZmF1bHQpLCdhNScgLCdsZXR0ZXInICwnbGVnYWwnCkByZXR1cm5zIHtqc1BERn0KQG5hbWUganNQREYKKi8KdmFyIGpzUERGID0gKGZ1bmN0aW9uKCkgewondXNlIHN0cmljdCcKCi8vIHRoaXMgd2lsbCBydW4gb24gPD1JRTksIHBvc3NpYmx5IHNvbWUgbmljaGUgYnJvd3NlcnMKLy8gbmV3IHdlYmtpdC1iYXNlZCwgRmlyZUZveCwgSUUxMCBhbHJlYWR5IGhhdmUgbmF0aXZlIHZlcnNpb24gb2YgdGhpcy4KaWYgKHR5cGVvZiBidG9hID09PSAndW5kZWZpbmVkJykgewoJd2luZG93LmJ0b2EgPSBmdW5jdGlvbihkYXRhKSB7CgkJLy8gRE8gTk9UIEFERCBVVEY4IEVOQ09ESU5HIENPREUgSEVSRSEhISEKCgkJLy8gVVRGOCBlbmNvZGluZyBlbmNvZGVzIGJ5dGVzIG92ZXIgY2hhciBjb2RlIDEyOAoJCS8vIGFuZCwgZXNzZW50aWFsbHksIHR1cm5zIGFuIDgtYml0IGJpbmFyeSBzdHJlYW1zCgkJLy8gKHRoYXQgYmFzZTY0IGNhbiBkZWFsIHdpdGgpIGludG8gNy1iaXQgYmluYXJ5IHN0cmVhbXMuIAoJCS8vIChieSBkZWZhdWx0IHNlcnZlciBkb2VzIG5vdCBrbm93IHRoYXQgYW5kIGRvZXMgbm90IHJlY29kZSB0aGUgZGF0YSBiYWNrIHRvIDhiaXQpCgkJLy8gWW91IGRlc3Ryb3kgeW91ciBkYXRhLgoKCQkvLyBiaW5hcnkgc3RyZWFtcyBsaWtlIGpwZWcgaW1hZ2UgZGF0YSBldGMsIHdoaWxlIHN0b3JlZCBpbiBKYXZhU2NyaXB0IHN0cmluZ3MsCgkJLy8gKHdoaWNoIGFyZSAxNmJpdCBhcnJheXMpIGFyZSBpbiA4Yml0IGZvcm1hdCBhbHJlYWR5LgoJCS8vIFlvdSBkbyBOT1QgbmVlZCB0byBjaGFyLWVuY29kZSB0aGF0IGJlZm9yZSBiYXNlNjQgZW5jb2RpbmcuCgoJCS8vIGlmIHlvdSwgYnkgYWN0IG9mIGZhdGUKCQkvLyBoYXZlIHN0cmluZyB3aGljaCBoYXMgaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIHdpdGggY29kZQoJCS8vIGFib3ZlIDI1NSAocHVyZSB1bmljb2RlIGNoYXJzKSwgZW5jb2RlIHRoYXQgQkVGT1JFIHlvdSBiYXNlNjQgaGVyZS4KCQkvLyB5b3UgY2FuIHVzZSBhYnNvbHV0ZWx5IGFueSBhcHByb2NoIHRoZXJlLCBhcyBsb25nIGFzIGluIHRoZSBlbmQsCgkJLy8gYmFzZTY0IGdldHMgYW4gOGJpdCAoY2hhciBjb2RlcyAwIC0gMjU1KSBzdHJlYW0uCgkJLy8gd2hlbiB5b3UgZ2V0IGl0IG9uIHRoZSBzZXJ2ZXIgYWZ0ZXIgdW4tYmFzZTY0LCB5b3UgbXVzdCAKCQkvLyBVTmVuY29kZSBpdCB0b28sIHRvIGdldCBiYWNrIHRvIDE2LCAzMmJpdCBvciB3aGF0ZXZlciBvcmlnaW5hbCBiaW4gc3RyZWFtLgoKCQkvLyBOb3RlLCBZZXMsIEphdmFTY3JpcHQgc3RyaW5ncyBhcmUsIGluIG1vc3QgY2FzZXMgVUNTLTIgLSAKCQkvLyAxNi1iaXQgY2hhcmFjdGVyIGFycmF5cy4gVGhpcyBkb2VzIG5vdCBtZWFuLCBob3dldmVyLAoJCS8vIHRoYXQgeW91IGFsd2F5cyBoYXZlIHRvIFVURjggaXQgYmVmb3JlIGJhc2U2NC4KCQkvLyBpdCBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIGFjdHVhbCBjaGFyYWN0ZXJzIGFueXdoZXJlIGluCgkJLy8gdGhhdCBzdHJpbmcgdGhhdCBoYXZlIGNoYXIgY29kZSBhYm92ZSAyNTUsIHlvdSBuZWVkIHRvCgkJLy8gcmVjb2RlICplbnRpcmUqIHN0cmluZyBmcm9tIDE2LWJpdCAob3IgMzJiaXQpIHRvIDgtYml0IGFycmF5LgoJCS8vIFlvdSBjYW4gZG8gYmluYXJ5IHNwbGl0IHRvIFVURjE2IChCRSBvciBMRSkKCQkvLyB5b3UgY2FuIGRvIHV0ZjgsIHlvdSBjYW4gc3BsaXQgdGhlIHRoaW5nIGJ5IGhhbmQgYW5kIHByZXBlbmQgQk9NIHRvIGl0LAoJCS8vIGJ1dCB3aGF0ZXZlciB5b3UgZG8sIG1ha2Ugc3VyZSB5b3UgbWlycm9yIHRoZSBvcHBvc2l0ZSBvbgoJCS8vIHRoZSBzZXJ2ZXIuIElmIHNlcnZlciBkb2VzIG5vdCBleHBlY3QgdG8gcG9zdC1wcm9jZXNzIHVuLWJhc2U2NAoJCS8vIDgtYml0IGJpbmFyeSBzdHJlYW0sIHRoaW5rIHZlcnkgdmVyeSBoYXJkIGFib3V0IG1lc3NpbmcgYXJvdW5kIHdpdGggZW5jb2RpbmcuCgoJCS8vIHNvLCBsb25nIHN0b3J5IHNob3J0OgoJCS8vIERPIE5PVCBBREQgVVRGOCBFTkNPRElORyBDT0RFIEhFUkUhISEhCgkJCgkJLyogQHByZXNlcnZlCgkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQliYXNlNjQgZW5jb2RlcgoJCU1JVCwgR1BMCgkKCQl2ZXJzaW9uOiAxMTA5LjIwMTUKCQlkaXNjdXNzIGF0OiBodHRwOi8vcGhwanMub3JnL2Z1bmN0aW9ucy9iYXNlNjRfZW5jb2RlCgkJKyAgIG9yaWdpbmFsIGJ5OiBUeWxlciBBa2lucyAoaHR0cDovL3J1bWtpbi5jb20pCgkJKyAgIGltcHJvdmVkIGJ5OiBCYXlyb24gR3VldmFyYQoJCSsgICBpbXByb3ZlZCBieTogVGh1bmRlci5tCgkJKyAgIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va2V2aW4udmFuem9ubmV2ZWxkLm5ldCkKCQkrICAgYnVnZml4ZWQgYnk6IFBlbGxlbnRlc3F1ZSBNYWxlc3VhZGEKCQkrICAgaW1wcm92ZWQgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHA6Ly9rZXZpbi52YW56b25uZXZlbGQubmV0KQoJCSsgICBpbXByb3ZlZCBieTogUmFmYWwgS3VrYXdza2kgKGh0dHA6Ly9rdWthd3NraS5wbCkKCQkrICAgCQkJIERhbmllbCBEb3RzZW5rbywgV2lsbG93IFN5c3RlbXMgQ29ycCwgd2lsbG93LXN5c3RlbXMuY29tCgkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkqLwoJCQoJCXZhciBiNjQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iCgkJLCBiNjRhID0gYjY0LnNwbGl0KCcnKQoJCSwgbzEsIG8yLCBvMywgaDEsIGgyLCBoMywgaDQsIGJpdHMsIGkgPSAwLAoJCWFjID0gMCwKCQllbmMgPSAiIiwKCQl0bXBfYXJyID0gW107CgkgCgkJZG8geyAvLyBwYWNrIHRocmVlIG9jdGV0cyBpbnRvIGZvdXIgaGV4ZXRzCgkJCW8xID0gZGF0YS5jaGFyQ29kZUF0KGkrKyk7CgkJCW8yID0gZGF0YS5jaGFyQ29kZUF0KGkrKyk7CgkJCW8zID0gZGF0YS5jaGFyQ29kZUF0KGkrKyk7CgkgCgkJCWJpdHMgPSBvMSA8PCAxNiB8IG8yIDw8IDggfCBvMzsKCgkJCWgxID0gYml0cyA+PiAxOCAmIDB4M2Y7CgkJCWgyID0gYml0cyA+PiAxMiAmIDB4M2Y7CgkJCWgzID0gYml0cyA+PiA2ICYgMHgzZjsKCQkJaDQgPSBiaXRzICYgMHgzZjsKCSAKCQkJLy8gdXNlIGhleGV0cyB0byBpbmRleCBpbnRvIGI2NCwgYW5kIGFwcGVuZCByZXN1bHQgdG8gZW5jb2RlZCBzdHJpbmcKCQkJdG1wX2FyclthYysrXSA9IGI2NGFbaDFdICsgYjY0YVtoMl0gKyBiNjRhW2gzXSArIGI2NGFbaDRdOwoJCX0gd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCk7CgoJCWVuYyA9IHRtcF9hcnIuam9pbignJyk7CgkJdmFyIHIgPSBkYXRhLmxlbmd0aCAlIDM7CgkJcmV0dXJuIChyID8gZW5jLnNsaWNlKDAsIHIgLSAzKSA6IGVuYykgKyAnPT09Jy5zbGljZShyIHx8IDMpOwoKCQkvLyBlbmQgb2YgYmFzZTY0IGVuY29kZXIgTUlULCBHUEwKCX07Cn0KCmlmICh0eXBlb2YgYXRvYiA9PT0gJ3VuZGVmaW5lZCcpIHsKCXdpbmRvdy5hdG9iID0gZnVuY3Rpb24gKGRhdGEpIHsKCQkvLyBodHRwOi8va2V2aW4udmFuem9ubmV2ZWxkLm5ldAoJCS8vICsgICBvcmlnaW5hbCBieTogVHlsZXIgQWtpbnMgKGh0dHA6Ly9ydW1raW4uY29tKQoJCS8vICsgICBpbXByb3ZlZCBieTogVGh1bmRlci5tCgkJLy8gKyAgICAgIGlucHV0IGJ5OiBBbWFuIEd1cHRhCgkJLy8gKyAgIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va2V2aW4udmFuem9ubmV2ZWxkLm5ldCkKCQkvLyArICAgYnVnZml4ZWQgYnk6IE9ubm8gTWFyc21hbgoJCS8vICsgICBidWdmaXhlZCBieTogUGVsbGVudGVzcXVlIE1hbGVzdWFkYQoJCS8vICsgICBpbXByb3ZlZCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2tldmluLnZhbnpvbm5ldmVsZC5uZXQpCgkJLy8gKyAgICAgIGlucHV0IGJ5OiBCcmV0dCBaYW1pciAoaHR0cDovL2JyZXR0LXphbWlyLm1lKQoJCS8vICsgICBidWdmaXhlZCBieTogS2V2aW4gdmFuIFpvbm5ldmVsZCAoaHR0cDovL2tldmluLnZhbnpvbm5ldmVsZC5uZXQpCgkJLy8gKiAgICAgZXhhbXBsZSAxOiBiYXNlNjRfZGVjb2RlKCdTMlYyYVc0Z2RtRnVJRnB2Ym01bGRtVnNaQT09Jyk7CgkJLy8gKiAgICAgcmV0dXJucyAxOiAnS2V2aW4gdmFuIFpvbm5ldmVsZCcKCQkvLyBtb3ppbGxhIGhhcyB0aGlzIG5hdGl2ZQoJCS8vIC0gYnV0IGJyZWFrcyBpbiAyLjAuMC4xMiEKCQkvL2lmICh0eXBlb2YgdGhpcy53aW5kb3dbJ2F0b2InXSA9PSAnZnVuY3Rpb24nKSB7CgkJLy8gICAgcmV0dXJuIGF0b2IoZGF0YSk7CgkJLy99CgkJdmFyIGI2NCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7CgkJdmFyIG8xLCBvMiwgbzMsIGgxLCBoMiwgaDMsIGg0LCBiaXRzLCBpID0gMCwKCQlhYyA9IDAsCgkJZGVjID0gIiIsCgkJdG1wX2FyciA9IFtdOwoKCQlpZiAoIWRhdGEpIHsKCQlyZXR1cm4gZGF0YTsKCQl9CgoJCWRhdGEgKz0gJyc7CgoJCWRvIHsgLy8gdW5wYWNrIGZvdXIgaGV4ZXRzIGludG8gdGhyZWUgb2N0ZXRzIHVzaW5nIGluZGV4IHBvaW50cyBpbiBiNjQKCQkJaDEgPSBiNjQuaW5kZXhPZihkYXRhLmNoYXJBdChpKyspKTsKCQkJaDIgPSBiNjQuaW5kZXhPZihkYXRhLmNoYXJBdChpKyspKTsKCQkJaDMgPSBiNjQuaW5kZXhPZihkYXRhLmNoYXJBdChpKyspKTsKCQkJaDQgPSBiNjQuaW5kZXhPZihkYXRhLmNoYXJBdChpKyspKTsKCgkJCWJpdHMgPSBoMSA8PCAxOCB8IGgyIDw8IDEyIHwgaDMgPDwgNiB8IGg0OwoKCQkJbzEgPSBiaXRzID4+IDE2ICYgMHhmZjsKCQkJbzIgPSBiaXRzID4+IDggJiAweGZmOwoJCQlvMyA9IGJpdHMgJiAweGZmOwoKCQkJaWYgKGgzID09IDY0KSB7CgkJCQl0bXBfYXJyW2FjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShvMSk7CgkJCX0gZWxzZSBpZiAoaDQgPT0gNjQpIHsKCQkJCXRtcF9hcnJbYWMrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG8xLCBvMik7CgkJCX0gZWxzZSB7CgkJCQl0bXBfYXJyW2FjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShvMSwgbzIsIG8zKTsKCQkJfQoJCX0gd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCk7CgoJCWRlYyA9IHRtcF9hcnIuam9pbignJyk7CgoJCXJldHVybiBkZWM7Cgl9Owp9Cgp2YXIgZ2V0T2JqZWN0TGVuZ3RoID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nID8KCWZ1bmN0aW9uKG9iamVjdCl7CgkJcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoCgl9IDoKCWZ1bmN0aW9uKG9iamVjdCl7CgkJdmFyIGkgPSAwCgkJZm9yICh2YXIgZSBpbiBvYmplY3Qpe2lmKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShlKSl7IGkrKyB9fQoJCXJldHVybiBpCgl9CgovKioKUHViU3ViIGltcGxlbWVudGF0aW9uCgpAY2xhc3MKQG5hbWUgUHViU3ViCiovCnZhciBQdWJTdWIgPSBmdW5jdGlvbihjb250ZXh0KXsKCSd1c2Ugc3RyaWN0JwoJLyoqICBAcHJlc2VydmUgCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJSmF2YVNjcmlwdCBQdWJTdWIgbGlicmFyeQoJMjAxMiAoYykgZGRvdHNlbmtvQHdpbGxvd3N5c3RlbXMuY29tCgliYXNlZCBvbiBQZXRlciBIaWdnaW5zIChkYW50ZUBkb2pvdG9vbGtpdC5vcmcpCglMb29zZWx5IGJhc2VkIG9uIERvam8gcHVibGlzaC9zdWJzY3JpYmUgQVBJLCBsaW1pdGVkIGluIHNjb3BlLiBSZXdyaXR0ZW4gYmxpbmRseS4KCU9yaWdpbmFsIGlzIChjKSBEb2pvIEZvdW5kYXRpb24gMjAwNC0yMDEwLiBSZWxlYXNlZCB1bmRlciBlaXRoZXIgQUZMIG9yIG5ldyBCU0QsIHNlZToKCWh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvbGljZW5zZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkqLwoJLyoqCglAcHJpdmF0ZQoJQGZpZWxkT2YgUHViU3ViCgkqLwoJdGhpcy50b3BpY3MgPSB7fQoJLyoqCglTdG9yZXMgd2hhdCB3aWxsIGJlIGB0aGlzYCB3aXRoaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KCglAcHJpdmF0ZQoJQGZpZWxkT2YgUHViU3ViIwoJKi8KCXRoaXMuY29udGV4dCA9IGNvbnRleHQKCS8qKgoJQWxsb3dzIGNhbGxlciB0byBlbWl0IGFuIGV2ZW50IGFuZCBwYXNzIGFyZ3VtZW50cyB0byBldmVudCBsaXN0ZW5lcnMuCglAcHVibGljCglAZnVuY3Rpb24KCUBwYXJhbSB0b3BpYyB7U3RyaW5nfSBOYW1lIG9mIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRvIHZvaWNlIHRoaXMgZXZlbnQKCUBwYXJhbSAqKmFyZ3MgQW55IG51bWJlciBvZiBhcmd1bWVudHMgeW91IHdhbnQgdG8gcGFzcyB0byB0aGUgbGlzdGVuZXJzIG9mIHRoaXMgZXZlbnQuCglAbWV0aG9kT2YgUHViU3ViIwoJQG5hbWUgcHVibGlzaAoJKi8KCXRoaXMucHVibGlzaCA9IGZ1bmN0aW9uKHRvcGljLCBhcmdzKSB7CgkJJ3VzZSBzdHJpY3QnCgkJaWYgKHRoaXMudG9waWNzW3RvcGljXSkgewoJCQl2YXIgY3VycmVudFRvcGljID0gdGhpcy50b3BpY3NbdG9waWNdCgkJCSwgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkKCQkJLCB0b3JlbW92ZSA9IFtdCgkJCSwgZm4KCQkJLCBpLCBsCgkJCSwgcGFpcgoKCQkJZm9yIChpID0gMCwgbCA9IGN1cnJlbnRUb3BpYy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJCXBhaXIgPSBjdXJyZW50VG9waWNbaV0gLy8gdGhpcyBpcyBhIFtmdW5jdGlvbiwgb25jZV9mbGFnXSBhcnJheQoJCQkJZm4gPSBwYWlyWzBdIAoJCQkJaWYgKHBhaXJbMV0gLyogJ3J1biBvbmNlJyBmbGFnIHNldCAqLyl7CgkJCQkgIHBhaXJbMF0gPSBmdW5jdGlvbigpe30KCQkJCSAgdG9yZW1vdmUucHVzaChpKQoJCQkJfQoJCQkgICAJZm4uYXBwbHkodGhpcy5jb250ZXh0LCBhcmdzKQoJCQl9CgkJCWZvciAoaSA9IDAsIGwgPSB0b3JlbW92ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJICBjdXJyZW50VG9waWMuc3BsaWNlKHRvcmVtb3ZlW2ldLCAxKQoJCQl9CgkJfQoJfQoJLyoqCglBbGxvd3MgbGlzdGVuZXIgY29kZSB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBhbmQgYmUgY2FsbGVkIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUgCglAcHVibGljCglAZnVuY3Rpb24KCUBwYXJhbSB0b3BpYyB7U3RyaW5nfSBOYW1lIG9mIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRvIHZvaWNlIHRoaXMgZXZlbnQKCUBwYXJhbSBjYWxsYmFjayB7RnVuY3Rpb259IEV4ZWN1dGFibGUgKGZ1bmN0aW9uIHBvaW50ZXIpIHRoYXQgd2lsbCBiZSByYW4gd2hlbiBldmVudCBpcyB2b2ljZWQgb24gdGhpcyBjaGFubmVsLgoJQHBhcmFtIG9uY2Uge0Jvb2xlYW59IChvcHRpb25hbC4gRmFsc2UgYnkgZGVmYXVsdCkgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBmdW5jdGlvbiBpcyB0byBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLgoJQHJldHVybnMge09iamVjdH0gQSB0b2tlbiBvYmplY3QgdGhhdCBjZW4gYmUgdXNlZCBmb3IgdW5zdWJzY3JpYmluZy4gIAoJQG1ldGhvZE9mIFB1YlN1YiMKCUBuYW1lIHN1YnNjcmliZQoJKi8KCXRoaXMuc3Vic2NyaWJlID0gZnVuY3Rpb24odG9waWMsIGNhbGxiYWNrLCBvbmNlKSB7CgkJJ3VzZSBzdHJpY3QnCgkJaWYgKCF0aGlzLnRvcGljc1t0b3BpY10pIHsKCQkJdGhpcy50b3BpY3NbdG9waWNdID0gW1tjYWxsYmFjaywgb25jZV1dOwoJCX0gZWxzZSB7CgkJCXRoaXMudG9waWNzW3RvcGljXS5wdXNoKFtjYWxsYmFjayxvbmNlXSk7CgkJfQoJCXJldHVybiB7CgkJCSJ0b3BpYyI6IHRvcGljLAoJCQkiY2FsbGJhY2siOiBjYWxsYmFjawoJCX07Cgl9OwoJLyoqCglBbGxvd3MgbGlzdGVuZXIgY29kZSB0byB1bnN1YnNjcmliZSBmcm9tIGEgY2hhbm5lbCAKCUBwdWJsaWMKCUBmdW5jdGlvbgoJQHBhcmFtIHRva2VuIHtPYmplY3R9IEEgdG9rZW4gb2JqZWN0IHRoYXQgd2FzIHJldHVybmVkIGJ5IGBzdWJzY3JpYmVgIG1ldGhvZCAKCUBtZXRob2RPZiBQdWJTdWIjCglAbmFtZSB1bnN1YnNjcmliZQoJKi8KCXRoaXMudW5zdWJzY3JpYmUgPSBmdW5jdGlvbih0b2tlbikgewoJCWlmICh0aGlzLnRvcGljc1t0b2tlbi50b3BpY10pIHsKCQkJdmFyIGN1cnJlbnRUb3BpYyA9IHRoaXMudG9waWNzW3Rva2VuLnRvcGljXQoJCQkKCQkJZm9yICh2YXIgaSA9IDAsIGwgPSBjdXJyZW50VG9waWMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCQlpZiAoY3VycmVudFRvcGljW2ldWzBdID09PSB0b2tlbi5jYWxsYmFjaykgewoJCQkJCWN1cnJlbnRUb3BpYy5zcGxpY2UoaSwgMSkKCQkJCX0KCQkJfQoJCX0KCX0KfQoKCQovKioKQGNvbnN0cnVjdG9yCkBwcml2YXRlCiovCmZ1bmN0aW9uIGpzUERGKC8qKiBTdHJpbmcgKi8gb3JpZW50YXRpb24sIC8qKiBTdHJpbmcgKi8gdW5pdCwgLyoqIFN0cmluZyAqLyBmb3JtYXQpewoKCS8vIERlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcwoJaWYgKHR5cGVvZiBvcmllbnRhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIG9yaWVudGF0aW9uID0gJ3AnCgllbHNlIG9yaWVudGF0aW9uID0gb3JpZW50YXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpCglpZiAodHlwZW9mIHVuaXQgPT09ICd1bmRlZmluZWQnKSB1bml0ID0gJ21tJwoJaWYgKHR5cGVvZiBmb3JtYXQgPT09ICd1bmRlZmluZWQnKSBmb3JtYXQgPSAnYTQnCgoJdmFyIGZvcm1hdF9hc19zdHJpbmcgPSBmb3JtYXQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpCgksIHZlcnNpb24gPSAnMjAxMjA2MTknCgksIGNvbnRlbnQgPSBbXQoJLCBjb250ZW50X2xlbmd0aCA9IDAKCgksIHBkZlZlcnNpb24gPSAnMS4zJyAvLyBQREYgVmVyc2lvbgoJLCBwYWdlRm9ybWF0cyA9IHsgLy8gU2l6ZSBpbiBwdCBvZiB2YXJpb3VzIHBhcGVyIGZvcm1hdHMKCQknYTMnOiBbODQxLjg5LCAxMTkwLjU1XQoJCSwgJ2E0JzogWzU5NS4yOCwgODQxLjg5XQoJCSwgJ2E1JzogWzQyMC45NCwgNTk1LjI4XQoJCSwgJ2xldHRlcic6IFs2MTIsIDc5Ml0KCQksICdsZWdhbCc6IFs2MTIsIDEwMDhdCgl9CgksIHRleHRDb2xvciA9ICcwIGcnCgksIGRyYXdDb2xvciA9ICcwIEcnCgksIHBhZ2UgPSAwCgksIHBhZ2VzID0gW10KCSwgb2JqZWN0TnVtYmVyID0gMiAvLyAnbicgQ3VycmVudCBvYmplY3QgbnVtYmVyCgksIG91dFRvUGFnZXMgPSBmYWxzZSAvLyBzd2l0Y2hlcyB3aGVyZSBvdXQoKSBwcmludHMuIG91dFRvUGFnZXMgdHJ1ZSA9IHB1c2ggdG8gcGFnZXMgb2JqLiBvdXRUb1BhZ2VzIGZhbHNlID0gZG9jIGJ1aWxkZXIgY29udGVudAoJLCBvZmZzZXRzID0gW10gLy8gTGlzdCBvZiBvZmZzZXRzLiBBY3RpdmF0ZWQgYW5kIHJlc2V0IGJ5IGJ1aWxkRG9jdW1lbnQoKS4gUHVwdWxhdGVkIGJ5IHZhcmlvdXMgY2FsbHMgYnVpbGREb2N1bWVudCBtYWtlcy4KCSwgZm9udHMgPSB7fSAvLyBjb2xsZWN0aW9uIG9mIGZvbnQgb2JqZWN0cywgd2hlcmUga2V5IGlzIGZvbnRLZXkgLSBhIGR5bmFtaWNhbGx5IGNyZWF0ZWQgbGFiZWwgZm9yIGEgZ2l2ZW4gZm9udC4KCSwgZm9udG1hcCA9IHt9IC8vIG1hcHBpbmcgc3RydWN0dXJlIGZvbnROYW1lID4gZm9udFN0eWxlID4gZm9udCBrZXkgLSBwZXJmb3JtYW5jZSBsYXllci4gU2VlIGFkZEZvbnQoKQoJLCBhY3RpdmVGb250U2l6ZSA9IDE2CgksIGFjdGl2ZUZvbnRLZXkgLy8gd2lsbCBiZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBLRVkgb2YgdGhlIGZvbnQgYXMgY29tYmluYXRpb24gb2YgZm9udE5hbWUgKyBmb250U3R5bGUKCSwgbGluZVdpZHRoID0gMC4yMDAwMjUgLy8gMm1tCgksIHBhZ2VIZWlnaHQKCSwgcGFnZVdpZHRoCgksIGsgLy8gU2NhbGUgZmFjdG9yCgksIGRvY3VtZW50UHJvcGVydGllcyA9IHsndGl0bGUnOicnLCdzdWJqZWN0JzonJywnYXV0aG9yJzonJywna2V5d29yZHMnOicnLCdjcmVhdG9yJzonJ30KCSwgbGluZUNhcElEID0gMAoJLCBsaW5lSm9pbklEID0gMAoJLCBBUEkgPSB7fQoJLCBldmVudHMgPSBuZXcgUHViU3ViKEFQSSkKCglpZiAodW5pdCA9PSAncHQnKSB7CgkJayA9IDEKCX0gZWxzZSBpZih1bml0ID09ICdtbScpIHsKCQlrID0gNzIvMjUuNAoJfSBlbHNlIGlmKHVuaXQgPT0gJ2NtJykgewoJCWsgPSA3Mi8yLjU0Cgl9IGVsc2UgaWYodW5pdCA9PSAnaW4nKSB7CgkJayA9IDcyCgl9IGVsc2UgewoJCXRocm93KCdJbnZhbGlkIHVuaXQ6ICcgKyB1bml0KQoJfQoJCgkvLyBEaW1lbnNpb25zIGFyZSBzdG9yZWQgYXMgdXNlciB1bml0cyBhbmQgY29udmVydGVkIHRvIHBvaW50cyBvbiBvdXRwdXQKCWlmIChmb3JtYXRfYXNfc3RyaW5nIGluIHBhZ2VGb3JtYXRzKSB7CgkJcGFnZUhlaWdodCA9IHBhZ2VGb3JtYXRzW2Zvcm1hdF9hc19zdHJpbmddWzFdIC8gawoJCXBhZ2VXaWR0aCA9IHBhZ2VGb3JtYXRzW2Zvcm1hdF9hc19zdHJpbmddWzBdIC8gawoJfSBlbHNlIHsKCQl0cnkgewoJCQlwYWdlSGVpZ2h0ID0gZm9ybWF0WzFdCgkJCXBhZ2VXaWR0aCA9IGZvcm1hdFswXQoJCX0gCgkJY2F0Y2goZXJyKSB7CgkJCXRocm93KCdJbnZhbGlkIGZvcm1hdDogJyArIGZvcm1hdCkKCQl9Cgl9CgkKCWlmIChvcmllbnRhdGlvbiA9PT0gJ3AnIHx8IG9yaWVudGF0aW9uID09PSAncG9ydHJhaXQnKSB7CgkJb3JpZW50YXRpb24gPSAncCcKCQlpZiAoIHBhZ2VXaWR0aCA+IHBhZ2VIZWlnaHQgICkgewoJCQl2YXIgdG1wID0gcGFnZVdpZHRoCgkJCXBhZ2VXaWR0aCA9IHBhZ2VIZWlnaHQKCQkJcGFnZUhlaWdodCA9IHRtcAoJCX0KCX0gZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdsJyB8fCBvcmllbnRhdGlvbiA9PT0gJ2xhbmRzY2FwZScpIHsKCQlvcmllbnRhdGlvbiA9ICdsJwoJCWlmICggcGFnZUhlaWdodCA+IHBhZ2VXaWR0aCApIHsKCQkJdmFyIHRtcCA9IHBhZ2VXaWR0aAoJCQlwYWdlV2lkdGggPSBwYWdlSGVpZ2h0CgkJCXBhZ2VIZWlnaHQgPSB0bXAKCQl9Cgl9IGVsc2UgewoJCXRocm93KCdJbnZhbGlkIG9yaWVudGF0aW9uOiAnICsgb3JpZW50YXRpb24pCgl9CgoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvLyBQcml2YXRlIGZ1bmN0aW9ucwoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkvLyBzaW1wbGlmaWVkIChzcGVlZGllcikgcmVwbGFjZW1lbnQgZm9yIHNwcmludGYncyAlLjJmIGNvbnZlcnNpb24gIAoJdmFyIGYyID0gZnVuY3Rpb24obnVtYmVyKXsKCQlyZXR1cm4gbnVtYmVyLnRvRml4ZWQoMikKCX0KCS8vIHNpbXBsaWZpZWQgKHNwZWVkaWVyKSByZXBsYWNlbWVudCBmb3Igc3ByaW50ZidzICUuM2YgY29udmVyc2lvbiAgCgksIGYzID0gZnVuY3Rpb24obnVtYmVyKXsKCQlyZXR1cm4gbnVtYmVyLnRvRml4ZWQoMykKCX0KCS8vIHNpbXBsaWZpZWQgKHNwZWVkaWVyKSByZXBsYWNlbWVudCBmb3Igc3ByaW50ZidzICUwMmQKCSwgcGFkZDIgPSBmdW5jdGlvbihudW1iZXIpIHsKCQl2YXIgbiA9IChudW1iZXIpLnRvRml4ZWQoMCkKCQlpZiAoIG51bWJlciA8IDEwICkgcmV0dXJuICcwJyArIG4KCQllbHNlIHJldHVybiBuCgl9CgkvLyBzaW1wbGlmaWVkIChzcGVlZGllcikgcmVwbGFjZW1lbnQgZm9yIHNwcmludGYncyAlMDJkCgksIHBhZGQxMCA9IGZ1bmN0aW9uKG51bWJlcikgewoJCXZhciBuID0gKG51bWJlcikudG9GaXhlZCgwKQoJCWlmIChuLmxlbmd0aCA8IDEwKSByZXR1cm4gbmV3IEFycmF5KCAxMSAtIG4ubGVuZ3RoICkuam9pbiggJzAnICkgKyBuCgkJZWxzZSByZXR1cm4gbgoJfQoJLCBvdXQgPSBmdW5jdGlvbihzdHJpbmcpIHsKCQlpZihvdXRUb1BhZ2VzIC8qIHNldCBieSBiZWdpblBhZ2UgKi8pIHsKCQkJcGFnZXNbcGFnZV0ucHVzaChzdHJpbmcpCgkJfSBlbHNlIHsKCQkJY29udGVudC5wdXNoKHN0cmluZykKCQkJY29udGVudF9sZW5ndGggKz0gc3RyaW5nLmxlbmd0aCArIDEgLy8gKzEgaXMgZm9yICdcbicgdGhhdCB3aWxsIGJlIHVzZWQgdG8gam9pbiBjb250ZW50cyBvZiBjb250ZW50IAoJCX0KCX0KCSwgbmV3T2JqZWN0ID0gZnVuY3Rpb24oKSB7CgkJLy8gQmVnaW4gYSBuZXcgb2JqZWN0CgkJb2JqZWN0TnVtYmVyICsrCgkJb2Zmc2V0c1tvYmplY3ROdW1iZXJdID0gY29udGVudF9sZW5ndGgKCQlvdXQob2JqZWN0TnVtYmVyICsgJyAwIG9iaicpOwkJCgkJcmV0dXJuIG9iamVjdE51bWJlcgoJfQoJLCBwdXRQYWdlcyA9IGZ1bmN0aW9uKCkgewoJCXZhciB3UHQgPSBwYWdlV2lkdGggKiBrCgkJdmFyIGhQdCA9IHBhZ2VIZWlnaHQgKiBrCgoJCS8vIG91dFRvUGFnZXMgPSBmYWxzZSBhcyBzZXQgaW4gZW5kRG9jdW1lbnQoKS4gb3V0KCkgd3JpdGVzIHRvIGNvbnRlbnQuCgkJCgkJdmFyIG4sIHAKCQlmb3Iobj0xOyBuIDw9IHBhZ2U7IG4rKykgewoJCQluZXdPYmplY3QoKQoJCQlvdXQoJzw8L1R5cGUgL1BhZ2UnKQoJCQlvdXQoJy9QYXJlbnQgMSAwIFInKTsJCgkJCW91dCgnL1Jlc291cmNlcyAyIDAgUicpCgkJCW91dCgnL0NvbnRlbnRzICcgKyAob2JqZWN0TnVtYmVyICsgMSkgKyAnIDAgUj4+JykKCQkJb3V0KCdlbmRvYmonKQoJCQkKCQkJLy8gUGFnZSBjb250ZW50CgkJCXAgPSBwYWdlc1tuXS5qb2luKCdcbicpCgkJCW5ld09iamVjdCgpCgkJCW91dCgnPDwvTGVuZ3RoICcgKyBwLmxlbmd0aCAgKyAnPj4nKQoJCQlwdXRTdHJlYW0ocCkKCQkJb3V0KCdlbmRvYmonKQoJCX0KCQlvZmZzZXRzWzFdID0gY29udGVudF9sZW5ndGgKCQlvdXQoJzEgMCBvYmonKQoJCW91dCgnPDwvVHlwZSAvUGFnZXMnKQoJCXZhciBraWRzID0gJy9LaWRzIFsnCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlOyBpKyspIHsKCQkJa2lkcyArPSAoMyArIDIgKiBpKSArICcgMCBSICcKCQl9CgkJb3V0KGtpZHMgKyAnXScpCgkJb3V0KCcvQ291bnQgJyArIHBhZ2UpCgkJb3V0KCcvTWVkaWFCb3ggWzAgMCAnK2YyKHdQdCkrJyAnK2YyKGhQdCkrJ10nKQoJCW91dCgnPj4nKQoJCW91dCgnZW5kb2JqJyk7CQkKCX0KCSwgcHV0U3RyZWFtID0gZnVuY3Rpb24oc3RyKSB7CgkJb3V0KCdzdHJlYW0nKQoJCW91dChzdHIpCgkJb3V0KCdlbmRzdHJlYW0nKQoJfQoJLCBwdXRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKCQlwdXRGb250cygpCgkJZXZlbnRzLnB1Ymxpc2goJ3B1dFJlc291cmNlcycpCgkJLy8gUmVzb3VyY2UgZGljdGlvbmFyeQoJCW9mZnNldHNbMl0gPSBjb250ZW50X2xlbmd0aAoJCW91dCgnMiAwIG9iaicpCgkJb3V0KCc8PCcpCgkJcHV0UmVzb3VyY2VEaWN0aW9uYXJ5KCkKCQlvdXQoJz4+JykKCQlvdXQoJ2VuZG9iaicpCgl9CQoJLCBwdXRGb250cyA9IGZ1bmN0aW9uKCkgewoJCWZvciAodmFyIGZvbnRLZXkgaW4gZm9udHMpIHsKCQkJaWYgKGZvbnRzLmhhc093blByb3BlcnR5KGZvbnRLZXkpKSB7CgkJCQlwdXRGb250KGZvbnRzW2ZvbnRLZXldKQoJCQl9CgkJfQoJfQoJLCBwdXRGb250ID0gZnVuY3Rpb24oZm9udCkgewoJCWZvbnQub2JqZWN0TnVtYmVyID0gbmV3T2JqZWN0KCkKCQlvdXQoJzw8L0Jhc2VGb250LycgKyBmb250LlBvc3RTY3JpcHROYW1lICsgJy9UeXBlL0ZvbnQnKQoJCWlmICh0eXBlb2YgZm9udC5lbmNvZGluZyA9PT0gJ3N0cmluZycpIHsKCQkJb3V0KCcvRW5jb2RpbmcvJytmb250LmVuY29kaW5nKQkJCQoJCX0KCQlvdXQoJy9TdWJ0eXBlL1R5cGUxPj4nKQoJCW91dCgnZW5kb2JqJykKCX0KCSwgYWRkVG9Gb250RGljdGlvbmFyeSA9IGZ1bmN0aW9uKGZvbnRLZXksIGZvbnROYW1lLCBmb250U3R5bGUpIHsKCQkvLyB0aGlzIGlzIG1hcHBpbmcgc3RydWN0dXJlIGZvciBxdWljayBmb250IGtleSBsb29rdXAuCgkJLy8gcmV0dXJucyB0aGUgS0VZIG9mIHRoZSBmb250IChleDogIkYxIikgZm9yIGEgZ2l2ZW4gcGFpciBvZiBmb250IG5hbWUgYW5kIHR5cGUgKGV4OiAiQXJpYWwiLiAiSXRhbGljIikKCQl2YXIgdW5kZWYKCQlpZiAoZm9udG1hcFtmb250TmFtZV0gPT09IHVuZGVmKXsKCQkJZm9udG1hcFtmb250TmFtZV0gPSB7fSAvLyBmb250U3R5bGUgaXMgYSB2YXIgaW50ZXJwcmV0ZWQgYW5kIGNvbnZlcnRlZCB0byBhcHByb3ByaWF0ZSBzdHJpbmcuIGRvbid0IHdyYXAgaW4gcXVvdGVzLgoJCX0KCQlmb250bWFwW2ZvbnROYW1lXVtmb250U3R5bGVdID0gZm9udEtleQoJfQoJLyoqCglGb250T2JqZWN0IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgZm9udCBhcyBtZW1iZXIgb2YgYW4gaW5zdG5hY2Ugb2YganNQREYKCglJdCdzIGEgY29sbGVjdGlvbiBvZiBwcm9wZXJ0aWVzIGxpa2UgJ2lkJyAodG8gYmUgdXNlZCBpbiBQREYgc3RyZWFtKSwKCSdmb250TmFtZScgKGZvbnQncyBmYW1pbHkgbmFtZSksICdmb250U3R5bGUnIChmb250J3Mgc3R5bGUgdmFyaWFudCBsYWJlbCkKCglAY2xhc3MKCUBwdWJsaWMKCUBwcm9wZXJ0eSBpZCB7U3RyaW5nfSBQREYtZG9jdW1lbnQtaW5zdGFuY2Utc3BlY2lmaWMgbGFiZWwgYXNzaW5nZWQgdG8gdGhlIGZvbnQuCglAcHJvcGVydHkgUG9zdFNjcmlwdE5hbWUge1N0cmluZ30gUERGIHNwZWNpZmljYXRpb24gZnVsbCBuYW1lIGZvciB0aGUgZm9udAoJQHByb3BlcnR5IGVuY29kaW5nIHtPYmplY3R9IEVuY29kaW5nX25hbWUtdG8tRm9udF9tZXRyaWNzX29iamVjdCBtYXBwaW5nLgoJQG5hbWUgRm9udE9iamVjdAoJKi8KCSwgRm9udE9iamVjdCA9IHt9CgksIGFkZEZvbnQgPSBmdW5jdGlvbihQb3N0U2NyaXB0TmFtZSwgZm9udE5hbWUsIGZvbnRTdHlsZSwgZW5jb2RpbmcpIHsKCQl2YXIgZm9udEtleSA9ICdGJyArIChnZXRPYmplY3RMZW5ndGgoZm9udHMpICsgMSkudG9TdHJpbmcoMTApCgkJCgkJLy8gVGhpcyBpcyBGb250T2JqZWN0IAoJCXZhciBmb250ID0gZm9udHNbZm9udEtleV0gPSB7CgkJCSdpZCc6IGZvbnRLZXkKCQkJLy8gLCAnb2JqZWN0TnVtYmVyJzogICB3aWxsIGJlIHNldCBieSBwdXRGb250KCkKCQkJLCAnUG9zdFNjcmlwdE5hbWUnOiBQb3N0U2NyaXB0TmFtZQoJCQksICdmb250TmFtZSc6IGZvbnROYW1lCgkJCSwgJ2ZvbnRTdHlsZSc6IGZvbnRTdHlsZQoJCQksICdlbmNvZGluZyc6IGVuY29kaW5nCgkJCSwgJ21ldGFkYXRhJzoge30KCQl9CgoJCWFkZFRvRm9udERpY3Rpb25hcnkoZm9udEtleSwgZm9udE5hbWUsIGZvbnRTdHlsZSkKCgkJZXZlbnRzLnB1Ymxpc2goJ2FkZEZvbnQnLCBmb250KQkJCgoJCXJldHVybiBmb250S2V5Cgl9CgksIGFkZEZvbnRzID0gZnVuY3Rpb24oKSB7CgoJCXZhciBIRUxWRVRJQ0EgPSAiaGVsdmV0aWNhIgoJCSwgVElNRVMgPSAidGltZXMiCgkJLCBDT1VSSUVSID0gImNvdXJpZXIiCgkJLCBOT1JNQUwgPSAibm9ybWFsIgoJCSwgQk9MRCA9ICJib2xkIgoJCSwgSVRBTElDID0gIml0YWxpYyIKCQksIEJPTERfSVRBTElDID0gImJvbGRpdGFsaWMiCgkJLCBlbmNvZGluZyA9ICdTdGFuZGFyZEVuY29kaW5nJwoJCSwgc3RhbmRhcmRGb250cyA9IFsKCQkJWydIZWx2ZXRpY2EnLCBIRUxWRVRJQ0EsIE5PUk1BTF0KCQkJLCBbJ0hlbHZldGljYS1Cb2xkJywgSEVMVkVUSUNBLCBCT0xEXQoJCQksIFsnSGVsdmV0aWNhLU9ibGlxdWUnLCBIRUxWRVRJQ0EsIElUQUxJQ10KCQkJLCBbJ0hlbHZldGljYS1Cb2xkT2JsaXF1ZScsIEhFTFZFVElDQSwgQk9MRF9JVEFMSUNdCgkJCSwgWydDb3VyaWVyJywgQ09VUklFUiwgTk9STUFMXQoJCQksIFsnQ291cmllci1Cb2xkJywgQ09VUklFUiwgQk9MRF0KCQkJLCBbJ0NvdXJpZXItT2JsaXF1ZScsIENPVVJJRVIsIElUQUxJQ10KCQkJLCBbJ0NvdXJpZXItQm9sZE9ibGlxdWUnLCBDT1VSSUVSLCBCT0xEX0lUQUxJQ10KCQkJLCBbJ1RpbWVzLVJvbWFuJywgVElNRVMsIE5PUk1BTF0KCQkJLCBbJ1RpbWVzLUJvbGQnLCBUSU1FUywgQk9MRF0KCQkJLCBbJ1RpbWVzLUl0YWxpYycsIFRJTUVTLCBJVEFMSUNdCgkJCSwgWydUaW1lcy1Cb2xkSXRhbGljJywgVElNRVMsIEJPTERfSVRBTElDXQoJCV0KCgkJdmFyIGksIGwsIGZvbnRLZXksIHBhcnRzCgkJZm9yIChpID0gMCwgbCA9IHN0YW5kYXJkRm9udHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCWZvbnRLZXkgPSBhZGRGb250KAoJCQkJc3RhbmRhcmRGb250c1tpXVswXQoJCQkJLCBzdGFuZGFyZEZvbnRzW2ldWzFdCgkJCQksIHN0YW5kYXJkRm9udHNbaV1bMl0KCQkJCSwgZW5jb2RpbmcKCQkJKQoKCQkJLy8gYWRkaW5nIGFsaWFzZXMgZm9yIHN0YW5kYXJkIGZvbnRzLCB0aGlzIHRpbWUgbWF0Y2hpbmcgdGhlIGNhcGl0YWxpemF0aW9uCgkJCXBhcnRzID0gc3RhbmRhcmRGb250c1tpXVswXS5zcGxpdCgnLScpCgkJCWFkZFRvRm9udERpY3Rpb25hcnkoZm9udEtleSwgcGFydHNbMF0sIHBhcnRzWzFdIHx8ICcnKQoJCX0KCgkJZXZlbnRzLnB1Ymxpc2goJ2FkZEZvbnRzJywgeydmb250cyc6Zm9udHMsICdkaWN0aW9uYXJ5Jzpmb250bWFwfSkKCX0KCSwgcHV0UmVzb3VyY2VEaWN0aW9uYXJ5ID0gZnVuY3Rpb24oKSB7CgkJb3V0KCcvUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0nKQoJCW91dCgnL0ZvbnQgPDwnKQoJCS8vIERvIHRoaXMgZm9yIGVhY2ggZm9udCwgdGhlICcxJyBiaXQgaXMgdGhlIGluZGV4IG9mIHRoZSBmb250CgkJZm9yICh2YXIgZm9udEtleSBpbiBmb250cykgewoJCQlpZiAoZm9udHMuaGFzT3duUHJvcGVydHkoZm9udEtleSkpIHsKCQkJCW91dCgnLycgKyBmb250S2V5ICsgJyAnICsgZm9udHNbZm9udEtleV0ub2JqZWN0TnVtYmVyICsgJyAwIFInKQoJCQl9CgkJfQoJCW91dCgnPj4nKQoJCW91dCgnL1hPYmplY3QgPDwnKQoJCXB1dFhvYmplY3REaWN0KCkKCQlvdXQoJz4+JykKCX0KCSwgcHV0WG9iamVjdERpY3QgPSBmdW5jdGlvbigpIHsKCQkvLyBMb29wIHRocm91Z2ggaW1hZ2VzLCBvciBvdGhlciBkYXRhIG9iamVjdHMKCQlldmVudHMucHVibGlzaCgncHV0WG9iamVjdERpY3QnKQoJfQoJLCBwdXRJbmZvID0gZnVuY3Rpb24oKSB7CgkJb3V0KCcvUHJvZHVjZXIgKGpzUERGICcgKyB2ZXJzaW9uICsgJyknKQoJCWlmKGRvY3VtZW50UHJvcGVydGllcy50aXRsZSkgewoJCQlvdXQoJy9UaXRsZSAoJyArIHBkZkVzY2FwZShkb2N1bWVudFByb3BlcnRpZXMudGl0bGUpICsgJyknKQoJCX0KCQlpZihkb2N1bWVudFByb3BlcnRpZXMuc3ViamVjdCkgewoJCQlvdXQoJy9TdWJqZWN0ICgnICsgcGRmRXNjYXBlKGRvY3VtZW50UHJvcGVydGllcy5zdWJqZWN0KSArICcpJykKCQl9CgkJaWYoZG9jdW1lbnRQcm9wZXJ0aWVzLmF1dGhvcikgewoJCQlvdXQoJy9BdXRob3IgKCcgKyBwZGZFc2NhcGUoZG9jdW1lbnRQcm9wZXJ0aWVzLmF1dGhvcikgKyAnKScpCgkJfQoJCWlmKGRvY3VtZW50UHJvcGVydGllcy5rZXl3b3JkcykgewoJCQlvdXQoJy9LZXl3b3JkcyAoJyArIHBkZkVzY2FwZShkb2N1bWVudFByb3BlcnRpZXMua2V5d29yZHMpICsgJyknKQoJCX0KCQlpZihkb2N1bWVudFByb3BlcnRpZXMuY3JlYXRvcikgewoJCQlvdXQoJy9DcmVhdG9yICgnICsgcGRmRXNjYXBlKGRvY3VtZW50UHJvcGVydGllcy5jcmVhdG9yKSArICcpJykKCQl9CQkKCQl2YXIgY3JlYXRlZCA9IG5ldyBEYXRlKCkKCQlvdXQoJy9DcmVhdGlvbkRhdGUgKEQ6JyArIAoJCQlbCgkJCQljcmVhdGVkLmdldEZ1bGxZZWFyKCkKCQkJCSwgcGFkZDIoY3JlYXRlZC5nZXRNb250aCgpICsgMSkKCQkJCSwgcGFkZDIoY3JlYXRlZC5nZXREYXRlKCkpCgkJCQksIHBhZGQyKGNyZWF0ZWQuZ2V0SG91cnMoKSkKCQkJCSwgcGFkZDIoY3JlYXRlZC5nZXRNaW51dGVzKCkpCgkJCQksIHBhZGQyKGNyZWF0ZWQuZ2V0U2Vjb25kcygpKQoJCQldLmpvaW4oJycpKwoJCQknKScKCQkpCgl9CgksIHB1dENhdGFsb2cgPSBmdW5jdGlvbiAoKSB7CgkJb3V0KCcvVHlwZSAvQ2F0YWxvZycpCgkJb3V0KCcvUGFnZXMgMSAwIFInKQoJCS8vIEBUT0RPOiBBZGQgem9vbSBhbmQgbGF5b3V0IG1vZGVzCgkJb3V0KCcvT3BlbkFjdGlvbiBbMyAwIFIgL0ZpdEggbnVsbF0nKQoJCW91dCgnL1BhZ2VMYXlvdXQgL09uZUNvbHVtbicpCgl9CQoJLCBwdXRUcmFpbGVyID0gZnVuY3Rpb24gKCkgewoJCW91dCgnL1NpemUgJyArIChvYmplY3ROdW1iZXIgKyAxKSkKCQlvdXQoJy9Sb290ICcgKyBvYmplY3ROdW1iZXIgKyAnIDAgUicpCgkJb3V0KCcvSW5mbyAnICsgKG9iamVjdE51bWJlciAtIDEpICsgJyAwIFInKQoJfQkKCSwgYmVnaW5QYWdlID0gZnVuY3Rpb24oKSB7CgkJcGFnZSArKwoJCS8vIERvIGRpbWVuc2lvbiBzdHVmZgoJCW91dFRvUGFnZXMgPSB0cnVlCgkJcGFnZXNbcGFnZV0gPSBbXQoJfQoJLCBfYWRkUGFnZSA9IGZ1bmN0aW9uKCkgewoJCWJlZ2luUGFnZSgpCgkJLy8gU2V0IGxpbmUgd2lkdGgKCQlvdXQoZjIobGluZVdpZHRoICogaykgKyAnIHcnKQoJCS8vIFNldCBkcmF3IGNvbG9yCgkJb3V0KGRyYXdDb2xvcikKCQkvLyByZXN1cnJlY3Rpbmcgbm9uLWRlZmF1bHQgbGluZSBjYXBzLCBqb2lucwoJCWlmIChsaW5lQ2FwSUQgIT09IDApIG91dChsaW5lQ2FwSUQudG9TdHJpbmcoMTApKycgSicpCgkJaWYgKGxpbmVKb2luSUQgIT09IDApIG91dChsaW5lSm9pbklELnRvU3RyaW5nKDEwKSsnIGonKQoKCQlldmVudHMucHVibGlzaCgnYWRkUGFnZScsIHsncGFnZU51bWJlcic6cGFnZX0pCgl9CgkvKioKCVJldHVybnMgYSBkb2N1bWVudC1zcGVjaWZpYyBmb250IGtleSAtIGEgbGFiZWwgYXNzaWduZWQgdG8gYQoJZm9udCBuYW1lICsgZm9udCB0eXBlIGNvbWJpbmF0aW9uIGF0IHRoZSB0aW1lIHRoZSBmb250IHdhcyBhZGRlZAoJdG8gdGhlIGZvbnQgaW52ZW50b3J5LgoKCUZvbnQga2V5IGlzIHVzZWQgYXMgbGFiZWwgZm9yIHRoZSBkZXNpcmVkIGZvbnQgZm9yIGEgYmxvY2sgb2YgdGV4dAoJdG8gYmUgYWRkZWQgdG8gdGhlIFBERiBkb2N1bWVudCBzdHJlYW0uCglAcHJpdmF0ZQoJQGZ1bmN0aW9uCglAcGFyYW0gZm9udE5hbWUge1N0cmluZ30gY2FuIGJlIHVuZGVmaW5lZCBvbiAiZmFsdGh5IiB0byBpbmRpY2F0ZSAidXNlIGN1cnJlbnQiCglAcGFyYW0gZm9udFN0eWxlIHtTdHJpbmd9IGNhbiBiZSB1bmRlZmluZWQgb24gImZhbHRoeSIgdG8gaW5kaWNhdGUgInVzZSBjdXJyZW50IgoJQHJldHVybnMge1N0cmluZ30gRm9udCBrZXkuCgkqLwoJLCBnZXRGb250ID0gZnVuY3Rpb24oZm9udE5hbWUsIGZvbnRTdHlsZSkgewoJCXZhciBrZXksIHVuZGVmCgoJCWlmIChmb250TmFtZSA9PT0gdW5kZWYpIHsKCQkJZm9udE5hbWUgPSBmb250c1thY3RpdmVGb250S2V5XVsnZm9udE5hbWUnXQoJCX0KCQlpZiAoZm9udFN0eWxlID09PSB1bmRlZikgewoJCQlmb250U3R5bGUgPSBmb250c1thY3RpdmVGb250S2V5XVsnZm9udFN0eWxlJ10KCQl9CgoJCXRyeSB7CgkJCWtleSA9IGZvbnRtYXBbZm9udE5hbWVdW2ZvbnRTdHlsZV0gLy8gcmV0dXJucyBhIHN0cmluZyBsaWtlICdGMycgLSB0aGUgS0VZIGNvcnJlc3BvbmRpbmcgdG90IGhlIGZvbnQgKyB0eXBlIGNvbWJpbmF0aW9uLgoJCX0gY2F0Y2ggKGUpIHsKCQkJa2V5ID0gdW5kZWYKCQl9CgkJaWYgKCFrZXkpewoJCQl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBsb29rIHVwIGZvbnQgbGFiZWwgZm9yIGZvbnQgJyIrZm9udE5hbWUrIicsICciK2ZvbnRTdHlsZSsiJy4gUmVmZXIgdG8gZ2V0Rm9udExpc3QoKSBmb3IgYXZhaWxhYmxlIGZvbnRzLiIpCgkJfQoKCQlyZXR1cm4ga2V5Cgl9CgksIGJ1aWxkRG9jdW1lbnQgPSBmdW5jdGlvbigpIHsKCQkKCQlvdXRUb1BhZ2VzID0gZmFsc2UgLy8gc3dpdGNoZXMgb3V0KCkgdG8gY29udGVudAoJCWNvbnRlbnQgPSBbXQoJCW9mZnNldHMgPSBbXQoJCQoJCS8vIHB1dEhlYWRlcigpCgkJb3V0KCclUERGLScgKyBwZGZWZXJzaW9uKQoJCQoJCXB1dFBhZ2VzKCkKCQkKCQlwdXRSZXNvdXJjZXMoKQoKCQkvLyBJbmZvCgkJbmV3T2JqZWN0KCkKCQlvdXQoJzw8JykKCQlwdXRJbmZvKCkKCQlvdXQoJz4+JykKCQlvdXQoJ2VuZG9iaicpCgkJCgkJLy8gQ2F0YWxvZwoJCW5ld09iamVjdCgpCgkJb3V0KCc8PCcpCgkJcHV0Q2F0YWxvZygpCgkJb3V0KCc+PicpCgkJb3V0KCdlbmRvYmonKQoJCQoJCS8vIENyb3NzLXJlZgoJCXZhciBvID0gY29udGVudF9sZW5ndGgKCQlvdXQoJ3hyZWYnKQoJCW91dCgnMCAnICsgKG9iamVjdE51bWJlciArIDEpKQoJCW91dCgnMDAwMDAwMDAwMCA2NTUzNSBmICcpCgkJZm9yICh2YXIgaT0xOyBpIDw9IG9iamVjdE51bWJlcjsgaSsrKSB7CgkJCW91dChwYWRkMTAob2Zmc2V0c1tpXSkgKyAnIDAwMDAwIG4gJykKCQl9CgkJLy8gVHJhaWxlcgoJCW91dCgndHJhaWxlcicpCgkJb3V0KCc8PCcpCgkJcHV0VHJhaWxlcigpCgkJb3V0KCc+PicpCgkJb3V0KCdzdGFydHhyZWYnKQoJCW91dChvKQoJCW91dCgnJSVFT0YnKQoJCQoJCW91dFRvUGFnZXMgPSB0cnVlCgkJCgkJcmV0dXJuIGNvbnRlbnQuam9pbignXG4nKQoJfQoJLyoqCgkKCUBwdWJsaWMKCUBmdW5jdGlvbgoJQHBhcmFtIHRleHQge1N0cmluZ30gCglAcGFyYW0gZmxhZ3Mge09iamVjdH0gRW5jb2RpbmcgZmxhZ3MuCglAcmV0dXJucyB7U3RyaW5nfSBFbmNvZGVkIHN0cmluZwoJKi8KCSwgdG84Yml0U3RyZWFtID0gZnVuY3Rpb24odGV4dCwgZmxhZ3MpewoJCS8qIFBERiAxLjMgc3BlYzoKCQkiRm9yIHRleHQgc3RyaW5ncyBlbmNvZGVkIGluIFVuaWNvZGUsIHRoZSBmaXJzdCB0d28gYnl0ZXMgbXVzdCBiZSAyNTQgZm9sbG93ZWQgYnkKCQkyNTUsIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBieXRlIG9yZGVyIG1hcmtlciwgVStGRUZGLiAoVGhpcyBzZXF1ZW5jZSBjb25mbGljdHMKCQl3aXRoIHRoZSBQREZEb2NFbmNvZGluZyBjaGFyYWN0ZXIgc2VxdWVuY2UgdGhvcm4geWRpZXJlc2lzLCB3aGljaCBpcyB1bmxpa2VseQoJCXRvIGJlIGEgbWVhbmluZ2Z1bCBiZWdpbm5pbmcgb2YgYSB3b3JkIG9yIHBocmFzZS4pIFRoZSByZW1haW5kZXIgb2YgdGhlCgkJc3RyaW5nIGNvbnNpc3RzIG9mIFVuaWNvZGUgY2hhcmFjdGVyIGNvZGVzLCBhY2NvcmRpbmcgdG8gdGhlIFVURi0xNiBlbmNvZGluZwoJCXNwZWNpZmllZCBpbiB0aGUgVW5pY29kZSBzdGFuZGFyZCwgdmVyc2lvbiAyLjAuIENvbW1vbmx5IHVzZWQgVW5pY29kZSB2YWx1ZXMKCQlhcmUgcmVwcmVzZW50ZWQgYXMgMiBieXRlcyBwZXIgY2hhcmFjdGVyLCB3aXRoIHRoZSBoaWdoLW9yZGVyIGJ5dGUgYXBwZWFyaW5nIGZpcnN0CgkJaW4gdGhlIHN0cmluZy4iCgoJCUluIG90aGVyIHdvcmRzLCBpZiB0aGVyZSBhcmUgY2hhcnMgaW4gYSBzdHJpbmcgd2l0aCBjaGFyIGNvZGUgYWJvdmUgMjU1LCB3ZQoJCXJlY29kZSB0aGUgc3RyaW5nIHRvIFVDUzIgQkUgLSBzdHJpbmcgZG91YmxlcyBpbiBsZW5ndGggYW5kIEJPTSBpcyBwcmVwZW5kZWQuCgoJCUhPV0VWRVIhCgkJQWN0dWFsICpjb250ZW50KiAoYm9keSkgdGV4dCAoYXMgb3Bwb3NlZCB0byBzdHJpbmdzIHVzZWQgaW4gZG9jdW1lbnQgcHJvcGVydGllcyBldGMpCgkJZG9lcyBOT1QgZXhwZWN0IEJPTS4gVGhlcmUsIGl0IGlzIHRyZWF0ZWQgYXMgYSBsaXRlcmFsIEdJRCAoR2x5cGggSUQpCgoJCUJlY2F1c2Ugb2YgQWRvYmUncyBmb2N1cyBvbiAieW91IHN1YnNldCB5b3VyIGZvbnRzISIgeW91IGFyZSBub3Qgc3VwcG9zZWQgdG8gaGF2ZQoJCWEgZm9udCB0aGF0IG1hcHMgZGlyZWN0bHkgVW5pY29kZSAoVUNTMiAvIFVURjE2QkUpIGNvZGUgdG8gZm9udCBHSUQsIGJ1dCB5b3UgY291bGQKCQlmdWRnZSBpdCB3aXRoICJJZGVudGl0eS1IIiBlbmNvZGluZyBhbmQgY3VzdG9tIENJRHRvR0lEIG1hcCB0aGF0IG1pbWljcyBVbmljb2RlCgkJY29kZSBwYWdlLiBUaGVyZSwgaG93ZXZlciwgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmVhbSBhcmUgdHJlYXRlZCBhcyBHSURzLAoJCWluY2x1ZGluZyBCT00sIHdoaWNoIGlzIHRoZSByZWFzb24gd2UgbmVlZCB0byBza2lwIEJPTSBpbiBjb250ZW50IHRleHQgKGkuZS4gdGhhdAoJCXRoYXQgaXMgdGllZCB0byBhIGZvbnQpLgoKCQlUbyBzaWduYWwgdGhpcyAic3BlY2lhbCIgUERGRXNjYXBlIC8gdG84Yml0U3RyZWFtIGhhbmRsaW5nIG1vZGUsCgkJQVBJLnRleHQoKSBmdW5jdGlvbiBzZXRzICh1bmxlc3MgeW91IG92ZXJ3cml0ZSBpdCB3aXRoIG1hbnVhbCB2YWx1ZXMKCQlnaXZlbiB0byBBUEkudGV4dCguLiwgZmxhZ3MpICkKCQkJZmxhZ3MuYXV0b2VuY29kZSA9IHRydWUKCQkJZmxhZ3Mubm9CT00gPSB0cnVlCgoJCSovCgoJCS8qCgkJYGZsYWdzYCBwcm9wZXJ0aWVzIHJlbGllZCB1cG9uOgoJCS5zb3VyY2VFbmNvZGluZyA9IHN0cmluZyB3aXRoIGVuY29kaW5nIGxhYmVsLiAKCQkJIlVuaWNvZGUiIGJ5IGRlZmF1bHQuID0gZW5jb2Rpbmcgb2YgdGhlIGluY29taW5nIHRleHQuCgkJCXBhc3Mgc29tZSBub24tZXhpc3RpbmcgZW5jb2RpbmcgbmFtZSAKCQkJKGV4OiAnRG8gbm90IHRvdWNoIG15IHN0cmluZ3MhIEkga25vdyB3aGF0IEkgYW0gZG9pbmcuJykKCQkJdG8gbWFrZSBlbmNvZGluZyBjb2RlIHNraXAgdGhlIGVuY29kaW5nIHN0ZXAuCgkJLm91dHB1dEVuY29kaW5nID0gRWl0aGVyIHZhbGlkIFBERiBlbmNvZGluZyBuYW1lIAoJCQkobXVzdCBiZSBzdXBwb3J0ZWQgYnkganNQREYgZm9udCBtZXRyaWNzLCBvdGhlcndpc2Ugbm8gZW5jb2RpbmcpCgkJCW9yIGEgSlMgb2JqZWN0LCB3aGVyZSBrZXkgPSBzb3VyY2VDaGFyQ29kZSwgdmFsdWUgPSBvdXRwdXRDaGFyQ29kZQoJCQltaXNzaW5nIGtleXMgd2lsbCBiZSB0cmVhdGVkIGFzOiBzb3VyY2VDaGFyQ29kZSA9PT0gb3V0cHV0Q2hhckNvZGUKCQkubm9CT00KCQkJU2VlIGNvbW1lbnQgaGlnaGVyIGFib3ZlIGZvciBleHBsYW5hdGlvbiBmb3Igd2h5IHRoaXMgaXMgaW1wb3J0YW50CgkJLmF1dG9lbmNvZGUKCQkJU2VlIGNvbW1lbnQgaGlnaGVyIGFib3ZlIGZvciBleHBsYW5hdGlvbiBmb3Igd2h5IHRoaXMgaXMgaW1wb3J0YW50CgkJKi8KCgkJdmFyIGksIGwsIHVuZGVmCgoJCWlmIChmbGFncyA9PT0gdW5kZWYpIHsKCQkJZmxhZ3MgPSB7fQoJCX0KCgkJdmFyIHNvdXJjZUVuY29kaW5nID0gZmxhZ3Muc291cmNlRW5jb2RpbmcgPyBzb3VyY2VFbmNvZGluZyA6ICdVbmljb2RlJwoJCSwgZW5jb2RpbmdCbG9jawoJCSwgb3V0cHV0RW5jb2RpbmcgPSBmbGFncy5vdXRwdXRFbmNvZGluZwoJCSwgbmV3dGV4dAoJCSwgaXNVbmljb2RlLCBjaCwgYmNoCgkJLy8gVGhpcyAnZW5jb2RpbmcnIHNlY3Rpb24gcmVsaWVzIG9uIGZvbnQgbWV0cmljcyBmb3JtYXQgCgkJLy8gYXR0YWNoZWQgdG8gZm9udCBvYmplY3RzIGJ5LCBhbW9uZyBvdGhlcnMsIAoJCS8vICJXaWxsb3cgU3lzdGVtcycgc3RhbmRhcmRfZm9udF9tZXRyaWNzIHBsdWdpbiIKCQkvLyBzZWUganNwZGYucGx1Z2luLnN0YW5kYXJkX2ZvbnRfbWV0cmljcy5qcyBmb3IgZm9ybWF0CgkJLy8gb2YgdGhlIGZvbnQubWV0YWRhdGEuZW5jb2RpbmcgT2JqZWN0LgoJCS8vIEl0IHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZQoJCS8vICAgLmVuY29kaW5nID0geydjb2RlUGFnZXMnOlsnV2luQU5TSS4uLi4nXSwgJ1dpbkFOU0kuLi4nOntjb2RlOmNvZGUsIC4uLn19CgkJLy8gICAud2lkdGhzID0gezA6d2lkdGgsIGNvZGU6d2lkdGgsIC4uLiwgJ2ZvZic6ZGl2aXNvcn0KCQkvLyAgIC5rZXJuaW5nID0ge2NvZGU6e3ByZXZpb3VzX2NoYXJfY29kZTpzaGlmdCwgLi4uLCAnZm9mJzotZGl2aXNvcn0sLi4ufQoJCWlmICgoZmxhZ3MuYXV0b2VuY29kZSB8fCBvdXRwdXRFbmNvZGluZyApICYmIAoJCQlmb250c1thY3RpdmVGb250S2V5XS5tZXRhZGF0YSAmJgoJCQlmb250c1thY3RpdmVGb250S2V5XS5tZXRhZGF0YVtzb3VyY2VFbmNvZGluZ10gJiYKCQkJZm9udHNbYWN0aXZlRm9udEtleV0ubWV0YWRhdGFbc291cmNlRW5jb2RpbmddLmVuY29kaW5nCgkJKSB7CgkJCWVuY29kaW5nQmxvY2sgPSBmb250c1thY3RpdmVGb250S2V5XS5tZXRhZGF0YVtzb3VyY2VFbmNvZGluZ10uZW5jb2RpbmcKCQkJCgkJCS8vIGVhY2ggZm9udCBoYXMgZGVmYXVsdCBlbmNvZGluZy4gU29tZSBoYXZlIGl0IGNsZWFybHkgZGVmaW5lZC4KCQkJaWYgKCFvdXRwdXRFbmNvZGluZyAmJiBmb250c1thY3RpdmVGb250S2V5XS5lbmNvZGluZykgewoJCQkJb3V0cHV0RW5jb2RpbmcgPSBmb250c1thY3RpdmVGb250S2V5XS5lbmNvZGluZwoJCQl9CgoJCQkvLyBIbW1tLCB0aGUgYWJvdmUgZGlkIG5vdCB3b3JrPyBMZXQncyB0cnkgYWdhaW4sIGluIGRpZmZlcmVudCBwbGFjZS4KCQkJaWYgKCFvdXRwdXRFbmNvZGluZyAmJiBlbmNvZGluZ0Jsb2NrLmNvZGVQYWdlcykgewoJCQkJb3V0cHV0RW5jb2RpbmcgPSBlbmNvZGluZ0Jsb2NrLmNvZGVQYWdlc1swXSAvLyBsZXQncyBzYXksIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdAoJCQl9CgoJCQlpZiAodHlwZW9mIG91dHB1dEVuY29kaW5nID09PSAnc3RyaW5nJykgewoJCQkJb3V0cHV0RW5jb2RpbmcgPSBlbmNvZGluZ0Jsb2NrW291dHB1dEVuY29kaW5nXQoJCQl9CgkJCS8vIHdlIHdhbnQgb3V0cHV0IGVuY29kaW5nIHRvIGJlIGEgSlMgT2JqZWN0LCB3aGVyZQoJCQkvLyBrZXkgPSBzb3VyY2VFbmNvZGluZydzIGNoYXJhY3RlciBjb2RlIGFuZCAKCQkJLy8gdmFsdWUgPSBvdXRwdXRFbmNvZGluZydzIGNoYXJhY3RlciBjb2RlLgoJCQlpZiAob3V0cHV0RW5jb2RpbmcpIHsKCQkJCWlzVW5pY29kZSA9IGZhbHNlCgkJCQluZXd0ZXh0ID0gW10KCQkJCWZvciAoaSA9IDAsIGwgPSB0ZXh0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQkJCWNoID0gb3V0cHV0RW5jb2RpbmdbdGV4dC5jaGFyQ29kZUF0KGkpXQoJCQkJCWlmIChjaCkgewoJCQkJCQluZXd0ZXh0LnB1c2goCgkJCQkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKQoJCQkJCQkpCgkJCQkJfSBlbHNlIHsKCQkJCQkJbmV3dGV4dC5wdXNoKAoJCQkJCQkJdGV4dFtpXQoJCQkJCQkpCgkJCQkJfQoKCQkJCQkvLyBzaW5jZSB3ZSBhcmUgbG9vcGluZyBvdmVyIGNoYXJzIGFueXdheSwgbWlnaHQgYXMgd2VsbAoJCQkJCS8vIGNoZWNrIGZvciByZXNpZHVhbCB1bmljb2RlbmVzcwoJCQkJCWlmIChuZXd0ZXh0W2ldLmNoYXJDb2RlQXQoMCkgPj4gOCAvKiBtb3JlIHRoYW4gMjU1ICovICkgewoJCQkJCQlpc1VuaWNvZGUgPSB0cnVlCgkJCQkJfQoJCQkJfQoJCQkJdGV4dCA9IG5ld3RleHQuam9pbignJykKCQkJfQoJCX0KCgkJaSA9IHRleHQubGVuZ3RoCgkJLy8gaXNVbmljb2RlIG1heSBiZSBzZXQgdG8gZmFsc2UgYWJvdmUuIEhlbmNlIHRoZSB0cmlwbGUtZXF1YWwgdG8gdW5kZWZpbmVkCgkJd2hpbGUgKGlzVW5pY29kZSA9PT0gdW5kZWYgJiYgaSAhPT0gMCl7CgkJCWlmICggdGV4dC5jaGFyQ29kZUF0KGkgLSAxKSA+PiA4IC8qIG1vcmUgdGhhbiAyNTUgKi8gKSB7CgkJCQlpc1VuaWNvZGUgPSB0cnVlCgkJCX0KCQkJO2ktLTsKCQl9CgkJaWYgKCFpc1VuaWNvZGUpIHsKCQkJcmV0dXJuIHRleHQKCQl9IGVsc2UgewoJCQluZXd0ZXh0ID0gZmxhZ3Mubm9CT00gPyBbXSA6IFsyNTQsIDI1NV0KCQkJZm9yIChpID0gMCwgbCA9IHRleHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCQljaCA9IHRleHQuY2hhckNvZGVBdChpKQoJCQkJYmNoID0gY2ggPj4gOCAvLyBkaXZpZGUgYnkgMjU2CgkJCQlpZiAoYmNoID4+IDggLyogc29tZXRoaW5nIGxlZnQgYWZ0ZXIgZGl2aWRpbmcgYnkgMjU2IHNlY29uZCB0aW1lICovICkgewoJCQkJCXRocm93IG5ldyBFcnJvcigiQ2hhcmFjdGVyIGF0IHBvc2l0aW9uICIraS50b1N0cmluZygxMCkrIiBvZiBzdHJpbmcgJyIrdGV4dCsiJyBleGNlZWRzIDE2Yml0cy4gQ2Fubm90IGJlIGVuY29kZWQgaW50byBVQ1MtMiBCRSIpCgkJCQl9CgkJCQluZXd0ZXh0LnB1c2goYmNoKQoJCQkJbmV3dGV4dC5wdXNoKGNoIC0gKCBiY2ggPDwgOCkpCgkJCX0KCQkJcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkodW5kZWYsIG5ld3RleHQpCgkJfQoJfQoJLy8gUmVwbGFjZSAnLycsICcoJywgYW5kICcpJyB3aXRoIHBkZi1zYWZlIHZlcnNpb25zCgksIHBkZkVzY2FwZSA9IGZ1bmN0aW9uKHRleHQsIGZsYWdzKSB7CgkJLy8gZG9pbmcgdG84Yml0U3RyZWFtIGRvZXMgTk9UIG1ha2UgdGhpcyBQREYgZGlzcGxheSB1bmljb2RlIHRleHQuIEZvciB0aGF0CgkJLy8gd2UgYWxzbyBuZWVkIHRvIHJlZmVyZW5jZSBhIHVuaWNvZGUgZm9udCBhbmQgZW1iZWQgaXQgLSByb3lhbCBwYWluIGluIHRoZSByZWFyLgoKCQkvLyBUaGVyZSBpcyBzdGlsbCBhIGJlbmVmaXQgdG8gdG84Yml0U3RyZWFtIC0gUERGIHNpbXBseSBjYW5ub3QgaGFuZGxlIDE2Yml0IGNoYXJzLAoJCS8vIHdoaWNoIEphdmFTY3JpcHQgU3RyaW5ncyBhcmUgaGFwcHkgdG8gcHJvdmlkZS4gU28sIHdoaWxlIHdlIHN0aWxsIGNhbm5vdCBkaXNwbGF5CgkJLy8gMi1ieXRlIGNoYXJhY3RlcnMgcHJvcGVydHksIGF0IGxlYXN0IENPTkRJVElPTkFMTFkgY29udmVydGluZyAoZW50aXJlIHN0cmluZyBjb250YWluaW5nKSAKCQkvLyAxNmJpdCBjaGFycyB0byAoVVNDLTItQkUpIDItYnl0ZXMgcGVyIGNoYXIgKyBCT00gc3RyZWFtcyB3ZSBlbnN1cmUgdGhhdCBlbnRpcmUgUERGCgkJLy8gaXMgc3RpbGwgcGFyc2VhYmxlLgoJCS8vIFRoaXMgd2lsbCBhbGxvdyBpbW1lZGlhdGUgc3VwcG9ydCBmb3IgdW5pY29kZSBpbiBkb2N1bWVudCBwcm9wZXJ0aWVzIHN0cmluZ3MuCgkJcmV0dXJuIHRvOGJpdFN0cmVhbSh0ZXh0LCBmbGFncykucmVwbGFjZSgvXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC9cKC9nLCAnXFwoJykucmVwbGFjZSgvXCkvZywgJ1xcKScpCgl9CgksIGdldFN0eWxlID0gZnVuY3Rpb24oc3R5bGUpewoJCS8vIHNlZSBQYXRoLVBhaW50aW5nIE9wZXJhdG9ycyBvZiBQREYgc3BlYwoJCXZhciBvcCA9ICdTJzsgLy8gc3Ryb2tlCgkJaWYgKHN0eWxlID09PSAnRicpIHsKCQkJb3AgPSAnZic7IC8vIGZpbGwKCQl9IGVsc2UgaWYgKHN0eWxlID09PSAnRkQnIHx8IHN0eWxlID09PSAnREYnKSB7CgkJCW9wID0gJ0InOyAvLyBib3RoCgkJfQoJCXJldHVybiBvcDsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gUHVibGljIEFQSQoKCS8qCglPYmplY3QgZXhwb3NpbmcgaW50ZXJuYWwgQVBJIHRvIHBsdWdpbnMKCUBwdWJsaWMKCSovCglBUEkuaW50ZXJuYWwgPSB7CgkJJ3BkZkVzY2FwZSc6IHBkZkVzY2FwZQoJCSwgJ2dldFN0eWxlJzogZ2V0U3R5bGUKCQkvKioKCQlSZXR1cm5zIHtGb250T2JqZWN0fSBkZXNjcmliaW5nIGEgcGFydGljdWxhciBmb250LgoJCUBwdWJsaWMKCQlAZnVuY3Rpb24KCQlAcGFyYW0gZm9udE5hbWUge1N0cmluZ30gKE9wdGlvbmFsKSBGb250J3MgZmFtaWx5IG5hbWUKCQlAcGFyYW0gZm9udFN0eWxlIHtTdHJpbmd9IChPcHRpb25hbCkgRm9udCdzIHN0eWxlIHZhcmlhdGlvbiBuYW1lIChFeGFtcGxlOiJJdGFsaWMiKQoJCUByZXR1cm5zIHtGb250T2JqZWN0fQoJCSovCgkJLCAnZ2V0Rm9udCc6IGZ1bmN0aW9uKCl7IHJldHVybiBmb250c1tnZXRGb250LmFwcGx5KEFQSSwgYXJndW1lbnRzKV0gfQoJCSwgJ2dldEZvbnRTaXplJzogZnVuY3Rpb24oKSB7IHJldHVybiBhY3RpdmVGb250U2l6ZQl9CgkJLCAnYnRvYSc6IGJ0b2EKCQksICd3cml0ZSc6IGZ1bmN0aW9uKHN0cmluZzEsIHN0cmluZzIsIHN0cmluZzMsIGV0Yyl7CgkJCW91dCgKCQkJCWFyZ3VtZW50cy5sZW5ndGggPT09IDE/IAoJCQkJYXJndW1lbnRzWzBdIDogCgkJCQlBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cywgJyAnKQoJCQkpCgkJfQoJCSwgJ2dldENvb3JkaW5hdGVTdHJpbmcnOiBmdW5jdGlvbih2YWx1ZSl7CgkJCXJldHVybiBmMih2YWx1ZSAqIGspCgkJfQoJCSwgJ2dldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyc6IGZ1bmN0aW9uKHZhbHVlKXsKCQkJcmV0dXJuIGYyKChwYWdlSGVpZ2h0IC0gdmFsdWUpICogaykKCQl9CgkJLCAnY29sbGVjdGlvbnMnOiB7fQoJCSwgJ25ld09iamVjdCc6IG5ld09iamVjdAoJCSwgJ3B1dFN0cmVhbSc6IHB1dFN0cmVhbQoJCSwgJ2V2ZW50cyc6IGV2ZW50cwoJCS8vIHJhdGlvIHRoYXQgeW91IHVzZSBpbiBtdWx0aXBsaWNhdGlvbiBvZiBhIGdpdmVuICJzaXplIiBudW1iZXIgdG8gYXJyaXZlIHRvICdwb2ludCcgCgkJLy8gdW5pdHMgb2YgbWVhc3VyZW1lbnQuCgkJLy8gc2NhbGVGYWN0b3IgaXMgc2V0IGF0IGluaXRpYWxpemF0aW9uIG9mIHRoZSBkb2N1bWVudCBhbmQgY2FsY3VsYXRlZCBhZ2FpbnN0IHRoZSBzdGF0ZWQgCgkJLy8gZGVmYXVsdCBtZWFzdXJlbWVudCB1bml0cyBmb3IgdGhlIGRvY3VtZW50LgoJCS8vIElmIGRlZmF1bHQgaXMgIm1tIiwgayBpcyB0aGUgbnVtYmVyIHRoYXQgd2lsbCB0dXJuIG51bWJlciBpbiAnbW0nIGludG8gJ3BvaW50cycgbnVtYmVyLgoJCS8vIHRocm91Z2ggbXVsdGlwbGljYXRpb24uCgkJLCAnc2NhbGVGYWN0b3InOiBrIAoJCSwgJ3BhZ2VTaXplJzogeyd3aWR0aCc6cGFnZVdpZHRoLCAnaGVpZ2h0JzpwYWdlSGVpZ2h0fQoJCSwgJ291dHB1dCc6IGZ1bmN0aW9uKHR5cGUsIG9wdGlvbnMpIHsKCQkJcmV0dXJuIG91dHB1dCh0eXBlLCBvcHRpb25zKTsKCQl9Cgl9CgkKCS8qKgoJQWRkcyAoYW5kIHRyYW5zZmVycyB0aGUgZm9jdXMgdG8pIG5ldyBwYWdlIHRvIHRoZSBQREYgZG9jdW1lbnQuCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0gCgoJQG1ldGhvZE9mIGpzUERGIwoJQG5hbWUgYWRkUGFnZQoJICovCglBUEkuYWRkUGFnZSA9IGZ1bmN0aW9uKCkgewoJCV9hZGRQYWdlKCkKCQlyZXR1cm4gdGhpcwoJfQoKCS8qKgoJQWRkcyB0ZXh0IHRvIHBhZ2UuIFN1cHBvcnRzIGFkZGluZyBtdWx0aWxpbmUgdGV4dCB3aGVuICd0ZXh0JyBhcmd1bWVudCBpcyBhbiBBcnJheSBvZiBTdHJpbmdzLiAKCUBmdW5jdGlvbgoJQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHRleHQgU3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gYmUgYWRkZWQgdG8gdGhlIHBhZ2UuIEVhY2ggbGluZSBpcyBzaGlmdGVkIG9uZSBsaW5lIGRvd24gcGVyIGZvbnQsIHNwYWNpbmcgc2V0dGluZ3MgZGVjbGFyZWQgYmVmb3JlIHRoaXMgY2FsbC4KCUBwYXJhbSB7TnVtYmVyfSB4IENvb3JkaW5hdGUgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIGFnYWluc3QgbGVmdCBlZGdlIG9mIHRoZSBwYWdlCglAcGFyYW0ge051bWJlcn0geSBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IHVwcGVyIGVkZ2Ugb2YgdGhlIHBhZ2UKCUBwYXJhbSB7T2JqZWN0fSBmbGFncyBDb2xsZWN0aW9uIG9mIHNldHRpbmdzIHNpZ25hbGxpbmcgaG93IHRoZSB0ZXh0IG11c3QgYmUgZW5jb2RlZC4gRGVmYXVsdHMgYXJlIHNhbmUuIElmIHlvdSB0aGluayB5b3Ugd2FudCB0byBwYXNzIHNvbWUgZmxhZ3MsIHlvdSBsaWtlbHkgY2FuIHJlYWQgdGhlIHNvdXJjZS4KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIHRleHQKCSAqLwoJQVBJLnRleHQgPSBmdW5jdGlvbih0ZXh0LCB4LCB5LCBmbGFncykgewoJCS8qKgoJCSAqIEluc2VydHMgc29tZXRoaW5nIGxpa2UgdGhpcyBpbnRvIFBERgoJCQlCVCAKCQkJL0YxIDE2IFRmICAlIEZvbnQgbmFtZSArIHNpemUKCQkJMTYgVEwgJSBIb3cgbWFueSB1bml0cyBkb3duIGZvciBuZXh0IGxpbmUgaW4gbXVsdGlsaW5lIHRleHQKCQkJMCBnICUgY29sb3IKCQkJMjguMzUgODEzLjU0IFRkICUgcG9zaXRpb24KCQkJKGxpbmUgb25lKSBUaiAKCQkJVCogKGxpbmUgdHdvKSBUagoJCQlUKiAobGluZSB0aHJlZSkgVGoKCQkJRVQKCSAJKi8KCQkKCSAJdmFyIHVuZGVmCgkJLy8gUHJlLUF1Z3VzdC0yMDEyIHRoZSBvcmRlciBvZiBhcmd1bWVudHMgd2FzIGZ1bmN0aW9uKHgsIHksIHRleHQsIGZsYWdzKQoJCS8vIGluIGVmZm9ydCB0byBtYWtlIGFsbCBjYWxscyBoYXZlIHNpbWlsYXIgc2lnbmF0dXJlIGxpa2UgCgkJLy8gICBmdW5jdGlvbihkYXRhLCBjb29yZGluYXRlcy4uLiAsIG1pc2NlbGxhbmVvdXMpCgkJLy8gdGhpcyBtZXRob2QgaGFkIGl0cyBhcmdzIGZsaXBwZWQuCgkJLy8gY29kZSBiZWxvdyBhbGxvd3MgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBhcmcgb3JkZXIuCgkJdmFyIF9maXJzdCwgX3NlY29uZCwgX3RoaXJkCgkJaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdudW1iZXInKSB7CgkJCV9maXJzdCA9IGFyZ3VtZW50c1syXQoJCQlfc2Vjb25kID0gYXJndW1lbnRzWzBdCgkJCV90aGlyZCA9IGFyZ3VtZW50c1sxXQoKCQkJdGV4dCA9IF9maXJzdCAKCQkJeCA9IF9zZWNvbmQgCgkJCXkgPSBfdGhpcmQKCQl9CgoJCS8vIElmIHRoZXJlIGFyZSBhbnkgbmV3bGluZXMgaW4gdGV4dCwgd2UgYXNzdW1lCgkJLy8gdGhlIHVzZXIgd2FudGVkIHRvIHByaW50IG11bHRpcGxlIGxpbmVzLCBzbyBicmVhayB0aGUKCQkvLyB0ZXh0IHVwIGludG8gYW4gYXJyYXkuICBJZiB0aGUgdGV4dCBpcyBhbHJlYWR5IGFuIGFycmF5LAoJCS8vIHdlIGFzc3VtZSB0aGUgdXNlciBrbm93cyB3aGF0IHRoZXkgYXJlIGRvaW5nLgoJCWlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgJiYgdGV4dC5tYXRjaCgvW1xuXHJdLykpIHsKCQkJdGV4dCA9IHRleHQuc3BsaXQoL1xyXG58XHJ8XG4vZykKCQl9CgoJCWlmICh0eXBlb2YgZmxhZ3MgPT09ICd1bmRlZmluZWQnKSB7CgkJCWZsYWdzID0geydub0JPTSc6dHJ1ZSwnYXV0b2VuY29kZSc6dHJ1ZX0KCQl9IGVsc2UgewoKCQkJaWYgKGZsYWdzLm5vQk9NID09PSB1bmRlZikgewoJCQkJZmxhZ3Mubm9CT00gPSB0cnVlCgkJCX0KCgkJCWlmIChmbGFncy5hdXRvZW5jb2RlID09PSB1bmRlZikgewoJCQkJZmxhZ3MuYXV0b2VuY29kZSA9IHRydWUKCQkJfQoKCQl9CgoJCXZhciBuZXd0ZXh0LCBzdHIKCgkJaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykgewoJCQlzdHIgPSBwZGZFc2NhcGUodGV4dCwgZmxhZ3MpCgkJfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgQXJyYXkpIC8qIEFycmF5ICovewoJCQkvLyB3ZSBkb24ndCB3YW50IHRvIGRlc3Ryb3kgIG9yaWdpbmFsIHRleHQgYXJyYXksIHNvIGNsb25pbmcgaXQKCQkJbmV3dGV4dCA9IHRleHQuY29uY2F0KCkKCQkJLy8gd2UgZG8gYXJyYXkuam9pbigndGV4dCB0aGF0IG11c3Qgbm90IGJlIFBERmVzY2FwZWQiKQoJCQkvLyB0aHVzLCBwZGZFc2NhcGUgZWFjaCBjb21wb25lbnQgc2VwYXJhdGVseQoJCQlmb3IgKCB2YXIgaSA9IG5ld3RleHQubGVuZ3RoIC0gMTsgaSAhPT0gLTEgOyBpLS0pIHsKCQkJCW5ld3RleHRbaV0gPSBwZGZFc2NhcGUoIG5ld3RleHRbaV0sIGZsYWdzKQoJCQl9CgkJCXN0ciA9IG5ld3RleHQuam9pbiggIikgVGpcblQqICgiICkKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXJyb3IoJ1R5cGUgb2YgdGV4dCBtdXN0IGJlIHN0cmluZyBvciBBcnJheS4gIicrdGV4dCsnIiBpcyBub3QgcmVjb2duaXplZC4nKQoJCX0KCQkvLyBVc2luZyAiJyIgKCJnbyBuZXh0IGxpbmUgYW5kIHJlbmRlciB0ZXh0IiBtYXJrKSB3b3VsZCBzYXZlIHNwYWNlIGJ1dCB3b3VsZCBjb21wbGljYXRlIG91ciByZW5kZXJpbmcgY29kZSwgdGVtcGxhdGVzIAoJCQoJCS8vIEJUIC4uIEVUIGRvZXMgTk9UIGhhdmUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgVGYuIFlvdSBtdXN0IHN0YXRlIHRoYXQgZXhwbGljaXRlbHkgZXZlcnkgdGltZSBmb3IgQlQgLi4gRVQKCQkvLyBpZiB5b3Ugd2FudCB0ZXh0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAoKyBtdWx0aWxpbmUpIHRvIHdvcmsgcmVsaWFibHkgKHdoaWNoIHJlYWRzIHNpemVzIG9mIHRoaW5ncyBmcm9tIGZvbnQgZGVjbGFyYXRpb25zKSAKCQkvLyBUaHVzLCB0aGVyZSBpcyBOTyB1c2VmdWwsICpyZWxpYWJsZSogY29uY2VwdCBvZiAiZGVmYXVsdCIgZm9udCBmb3IgYSBwYWdlLiAKCQkvLyBUaGUgZmFjdCB0aGF0ICJkZWZhdWx0IiAocmV1c2UgZm9udCB1c2VkIGJlZm9yZSkgZm9udCB3b3JrZWQgYmVmb3JlIGluIGJhc2ljIGNhc2VzIGlzIGFuIGFjY2lkZW50CgkJLy8gLSByZWFkZXJzIGRlYWxpbmcgc21hcnRseSB3aXRoIGJyb2tlbm5lc3Mgb2YganNQREYncyBtYXJrdXAuCgkJb3V0KCAKCQkJJ0JUXG4vJyArCgkJCWFjdGl2ZUZvbnRLZXkgKyAnICcgKyBhY3RpdmVGb250U2l6ZSArICcgVGZcbicgKyAvLyBmb250IGZhY2UsIHN0eWxlLCBzaXplCgkJCWFjdGl2ZUZvbnRTaXplICsgJyBUTFxuJyArIC8vIGxpbmUgc3BhY2luZwoJCQl0ZXh0Q29sb3IgKyAKCQkJJ1xuJyArIGYyKHggKiBrKSArICcgJyArIGYyKChwYWdlSGVpZ2h0IC0geSkgKiBrKSArICcgVGRcbignICsgCgkJCXN0ciArCgkJCScpIFRqXG5FVCcKCQkpCgkJcmV0dXJuIHRoaXMKCX0KCglBUEkubGluZSA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyKSB7CgkJb3V0KAoJCQlmMih4MSAqIGspICsgJyAnICsgZjIoKHBhZ2VIZWlnaHQgLSB5MSkgKiBrKSArICcgbSAnICsKCQkJZjIoeDIgKiBrKSArICcgJyArIGYyKChwYWdlSGVpZ2h0IC0geTIpICogaykgKyAnIGwgUycJCQkKCQkpCgkJcmV0dXJuIHRoaXMKCX0KCgkvKioKCUFkZHMgc2VyaWVzIG9mIGN1cnZlcyAoc3RyYWlnaHQgbGluZXMgb3IgY3ViaWMgYmV6aWVyIGN1cnZlcykgdG8gY2FudmFzLCBzdGFydGluZyBhdCBgeGAsIGB5YCBjb29yZGluYXRlcy4KCUFsbCBkYXRhIHBvaW50cyBpbiBgbGluZXNgIGFyZSByZWxhdGl2ZSB0byBsYXN0IGxpbmUgb3JpZ2luLgoJYHhgLCBgeWAgYmVjb21lIHgxLHkxIGZvciBmaXJzdCBsaW5lIC8gY3VydmUgaW4gdGhlIHNldC4KCUZvciBsaW5lcyB5b3Ugb25seSBuZWVkIHRvIHNwZWNpZnkgW3gyLCB5Ml0gLSAoZW5kaW5nIHBvaW50KSB2ZWN0b3IgYWdhaW5zdCB4MSwgeTEgc3RhcnRpbmcgcG9pbnQuCglGb3IgYmV6aWVyIGN1cnZlcyB5b3UgbmVlZCB0byBzcGVjaWZ5IFt4Mix5Mix4Myx5Myx4NCx5NF0gLSB2ZWN0b3JzIHRvIGNvbnRyb2wgcG9pbnRzIDEsIDIsIGVuZGluZyBwb2ludC4gQWxsIHZlY3RvcnMgYXJlIGFnYWluc3QgdGhlIHN0YXJ0IG9mIHRoZSBjdXJ2ZSAtIHgxLHkxLgoJCglAZXhhbXBsZSAubGluZXMoW1syLDJdLFstMiwyXSxbMSwxLDIsMiwzLDNdLFsyLDFdXSwgMjEyLDExMCwgMTApIC8vIGxpbmUsIGxpbmUsIGJlemllciBjdXJ2ZSwgbGluZSAKCUBwYXJhbSB7QXJyYXl9IGxpbmVzIEFycmF5IG9mICp2ZWN0b3IqIHNoaWZ0cyBhcyBwYWlycyAobGluZXMpIG9yIHNleHRldHMgKGN1YmljIGJlemllciBjdXJ2ZXMpLgoJQHBhcmFtIHtOdW1iZXJ9IHggQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCBsZWZ0IGVkZ2Ugb2YgdGhlIHBhZ2UKCUBwYXJhbSB7TnVtYmVyfSB5IENvb3JkaW5hdGUgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIGFnYWluc3QgdXBwZXIgZWRnZSBvZiB0aGUgcGFnZQoJQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIChEZWZhdWx0cyB0byBbMS4wLDEuMF0pIHgseSBTY2FsaW5nIGZhY3RvciBmb3IgYWxsIHZlY3RvcnMuIEVsZW1lbnRzIGNhbiBiZSBhbnkgZmxvYXRpbmcgbnVtYmVyIFN1Yi1vbmUgbWFrZXMgZHJhd2luZyBzbWFsbGVyLiBPdmVyLW9uZSBncm93cyB0aGUgZHJhd2luZy4gTmVnYXRpdmUgZmxpcHMgdGhlIGRpcmVjdGlvbi4gICAKCUBmdW5jdGlvbgoJQHJldHVybnMge2pzUERGfQoJQG1ldGhvZE9mIGpzUERGIwoJQG5hbWUgbGluZXMKCSAqLwoJQVBJLmxpbmVzID0gZnVuY3Rpb24obGluZXMsIHgsIHksIHNjYWxlLCBzdHlsZSkgewoJCXZhciB1bmRlZgoJCQoJCS8vIFByZS1BdWd1c3QtMjAxMiB0aGUgb3JkZXIgb2YgYXJndW1lbnRzIHdhcyBmdW5jdGlvbih4LCB5LCBsaW5lcywgc2NhbGUsIHN0eWxlKQoJCS8vIGluIGVmZm9ydCB0byBtYWtlIGFsbCBjYWxscyBoYXZlIHNpbWlsYXIgc2lnbmF0dXJlIGxpa2UgCgkJLy8gICBmdW5jdGlvbihjb250ZW50LCBjb29yZGluYXRlWCwgY29vcmRpbmF0ZVkgLCBtaXNjZWxsYW5lb3VzKQoJCS8vIHRoaXMgbWV0aG9kIGhhZCBpdHMgYXJncyBmbGlwcGVkLgoJCS8vIGNvZGUgYmVsb3cgYWxsb3dzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgYXJnIG9yZGVyLgoJCXZhciBfZmlyc3QsIF9zZWNvbmQsIF90aGlyZAoJCWlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnbnVtYmVyJykgewoJCQlfZmlyc3QgPSBhcmd1bWVudHNbMl0KCQkJX3NlY29uZCA9IGFyZ3VtZW50c1swXQoJCQlfdGhpcmQgPSBhcmd1bWVudHNbMV0KCgkJCWxpbmVzID0gX2ZpcnN0IAoJCQl4ID0gX3NlY29uZCAKCQkJeSA9IF90aGlyZAoJCX0KCgkJc3R5bGUgPSBnZXRTdHlsZShzdHlsZSkKCQlzY2FsZSA9IHNjYWxlID09PSB1bmRlZiA/IFsxLDFdIDogc2NhbGUKCgkJLy8gc3RhcnRpbmcgcG9pbnQKCQlvdXQoZjMoeCAqIGspICsgJyAnICsgZjMoKHBhZ2VIZWlnaHQgLSB5KSAqIGspICsgJyBtICcpCgkJCgkJdmFyIHNjYWxleCA9IHNjYWxlWzBdCgkJLCBzY2FsZXkgPSBzY2FsZVsxXQoJCSwgaSA9IDAKCQksIGwgPSBsaW5lcy5sZW5ndGgKCQksIGxlZwoJCSwgeDIsIHkyIC8vIGJlemllciBvbmx5LiBJbiBwYWdlIGRlZmF1bHQgbWVhc3VyZW1lbnQgInVuaXRzIiwgKmFmdGVyKiBzY2FsaW5nCgkJLCB4MywgeTMgLy8gYmV6aWVyIG9ubHkuIEluIHBhZ2UgZGVmYXVsdCBtZWFzdXJlbWVudCAidW5pdHMiLCAqYWZ0ZXIqIHNjYWxpbmcKCQkvLyBlbmRpbmcgcG9pbnQgZm9yIGFsbCwgbGluZXMgYW5kIGJlemllci4gLiBJbiBwYWdlIGRlZmF1bHQgbWVhc3VyZW1lbnQgInVuaXRzIiwgKmFmdGVyKiBzY2FsaW5nCgkJLCB4NCA9IHggLy8gbGFzdCAvIGVuZGluZyBwb2ludCA9IHN0YXJ0aW5nIHBvaW50IGZvciBmaXJzdCBpdGVtLgoJCSwgeTQgPSB5IC8vIGxhc3QgLyBlbmRpbmcgcG9pbnQgPSBzdGFydGluZyBwb2ludCBmb3IgZmlyc3QgaXRlbS4KCQkKCQlmb3IgKDsgaSA8IGw7IGkrKykgewoJCQlsZWcgPSBsaW5lc1tpXQoJCQlpZiAobGVnLmxlbmd0aCA9PT0gMil7CgkJCQkvLyBzaW1wbGUgbGluZQoJCQkJeDQgPSBsZWdbMF0gKiBzY2FsZXggKyB4NCAvLyBoZXJlIGxhc3QgeDQgd2FzIHByaW9yIGVuZGluZyBwb2ludAoJCQkJeTQgPSBsZWdbMV0gKiBzY2FsZXkgKyB5NCAvLyBoZXJlIGxhc3QgeTQgd2FzIHByaW9yIGVuZGluZyBwb2ludAoJCQkJb3V0KGYzKHg0ICogaykgKyAnICcgKyBmMygocGFnZUhlaWdodCAtIHk0KSAqIGspICsgJyBsJykJCQkJCQoJCQl9IGVsc2UgewoJCQkJLy8gYmV6aWVyIGN1cnZlCgkJCQl4MiA9IGxlZ1swXSAqIHNjYWxleCArIHg0IC8vIGhlcmUgbGFzdCB4NCBpcyBwcmlvciBlbmRpbmcgcG9pbnQKCQkJCXkyID0gbGVnWzFdICogc2NhbGV5ICsgeTQgLy8gaGVyZSBsYXN0IHk0IGlzIHByaW9yIGVuZGluZyBwb2ludAkJCQkJCgkJCQl4MyA9IGxlZ1syXSAqIHNjYWxleCArIHg0IC8vIGhlcmUgbGFzdCB4NCBpcyBwcmlvciBlbmRpbmcgcG9pbnQKCQkJCXkzID0gbGVnWzNdICogc2NhbGV5ICsgeTQgLy8gaGVyZSBsYXN0IHk0IGlzIHByaW9yIGVuZGluZyBwb2ludAkJCQkJCQkJCQkKCQkJCXg0ID0gbGVnWzRdICogc2NhbGV4ICsgeDQgLy8gaGVyZSBsYXN0IHg0IHdhcyBwcmlvciBlbmRpbmcgcG9pbnQKCQkJCXk0ID0gbGVnWzVdICogc2NhbGV5ICsgeTQgLy8gaGVyZSBsYXN0IHk0IHdhcyBwcmlvciBlbmRpbmcgcG9pbnQKCQkJCW91dCgKCQkJCQlmMyh4MiAqIGspICsgJyAnICsgCgkJCQkJZjMoKHBhZ2VIZWlnaHQgLSB5MikgKiBrKSArICcgJyArCgkJCQkJZjMoeDMgKiBrKSArICcgJyArIAoJCQkJCWYzKChwYWdlSGVpZ2h0IC0geTMpICogaykgKyAnICcgKwoJCQkJCWYzKHg0ICogaykgKyAnICcgKyAKCQkJCQlmMygocGFnZUhlaWdodCAtIHk0KSAqIGspICsgJyBjJwoJCQkJKQoJCQl9CgkJfQkJCQoJCS8vIHN0cm9raW5nIC8gZmlsbGluZyAvIGJvdGggdGhlIHBhdGgKCQlvdXQoc3R5bGUpIAoJCXJldHVybiB0aGlzCgl9CgoJLyoqCglBZGRzIGEgcmVjdGFuZ2xlIHRvIFBERgoJCglAcGFyYW0ge051bWJlcn0geCBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IGxlZnQgZWRnZSBvZiB0aGUgcGFnZQoJQHBhcmFtIHtOdW1iZXJ9IHkgQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCB1cHBlciBlZGdlIG9mIHRoZSBwYWdlCglAcGFyYW0ge051bWJlcn0gdyBXaWR0aCAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgCglAcGFyYW0ge051bWJlcn0gaCBIZWlnaHQgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIAoJQHBhcmFtIHtTdHJpbmd9IHN0eWxlIChEZWZhdWx0cyB0byBhY3RpdmUgZmlsbC9zdHJva2Ugc3R5bGUpIEEgc3RyaW5nIHNpZ25hbGxpbmcgaWYgc3Ryb2tlLCBmaWxsIG9yIGJvdGggYXJlIHRvIGJlIGFwcGxpZWQuCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIHJlY3QKCSAqLwoJQVBJLnJlY3QgPSBmdW5jdGlvbih4LCB5LCB3LCBoLCBzdHlsZSkgewoJCXZhciBvcCA9IGdldFN0eWxlKHN0eWxlKQoJCW91dChbCgkJCWYyKHggKiBrKQoJCQksIGYyKChwYWdlSGVpZ2h0IC0geSkgKiBrKQoJCQksIGYyKHcgKiBrKQoJCQksIGYyKC1oICogaykKCQkJLCAncmUnCgkJCSwgb3AKCQldLmpvaW4oJyAnKSkKCQlyZXR1cm4gdGhpcwoJfQoKCS8qKgoJQWRkcyBhIHRyaWFuZ2xlIHRvIFBERgoJCglAcGFyYW0ge051bWJlcn0geDEgQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCBsZWZ0IGVkZ2Ugb2YgdGhlIHBhZ2UKCUBwYXJhbSB7TnVtYmVyfSB5MSBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IHVwcGVyIGVkZ2Ugb2YgdGhlIHBhZ2UKCUBwYXJhbSB7TnVtYmVyfSB4MiBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IGxlZnQgZWRnZSBvZiB0aGUgcGFnZQoJQHBhcmFtIHtOdW1iZXJ9IHkyIENvb3JkaW5hdGUgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIGFnYWluc3QgdXBwZXIgZWRnZSBvZiB0aGUgcGFnZQoJQHBhcmFtIHtOdW1iZXJ9IHgzIENvb3JkaW5hdGUgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIGFnYWluc3QgbGVmdCBlZGdlIG9mIHRoZSBwYWdlCglAcGFyYW0ge051bWJlcn0geTMgQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCB1cHBlciBlZGdlIG9mIHRoZSBwYWdlCglAcGFyYW0ge1N0cmluZ30gc3R5bGUgKERlZmF1bHRzIHRvIGFjdGl2ZSBmaWxsL3N0cm9rZSBzdHlsZSkgQSBzdHJpbmcgc2lnbmFsbGluZyBpZiBzdHJva2UsIGZpbGwgb3IgYm90aCBhcmUgdG8gYmUgYXBwbGllZC4KCUBmdW5jdGlvbgoJQHJldHVybnMge2pzUERGfQoJQG1ldGhvZE9mIGpzUERGIwoJQG5hbWUgdHJpYW5nbGUKCSAqLwoJQVBJLnRyaWFuZ2xlID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgzLCB5Mywgc3R5bGUpIHsKCQl0aGlzLmxpbmVzKAoJCQlbCgkJCQlbIHgyIC0geDEgLCB5MiAtIHkxIF0gLy8gdmVjdG9yIHRvIHBvaW50IDIKCQkJCSwgWyB4MyAtIHgyICwgeTMgLSB5MiBdIC8vIHZlY3RvciB0byBwb2ludCAzCgkJCQksIFsgeDEgLSB4MyAsIHkxIC0geTMgXSAvLyBjbG9zaW5nIHZlY3RvciBiYWNrIHRvIHBvaW50IDEKCQkJXQoJCQksIHgxLCB5MSAvLyBzdGFydCBvZiBwYXRoCgkJCSwgWzEsMV0KCQkJLCBzdHlsZQoJCSkKCQlyZXR1cm4gdGhpczsKCX0KCQoJLyoqCglBZGRzIGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzIHRvIFBERgoJCglAcGFyYW0ge051bWJlcn0geCBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IGxlZnQgZWRnZSBvZiB0aGUgcGFnZQoJQHBhcmFtIHtOdW1iZXJ9IHkgQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCB1cHBlciBlZGdlIG9mIHRoZSBwYWdlCglAcGFyYW0ge051bWJlcn0gdyBXaWR0aCAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgCglAcGFyYW0ge051bWJlcn0gaCBIZWlnaHQgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIAoJQHBhcmFtIHtOdW1iZXJ9IHJ4IFJhZGl1cyBhbG9uZyB4IGF4aXMgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIAoJQHBhcmFtIHtOdW1iZXJ9IHJ4IFJhZGl1cyBhbG9uZyB5IGF4aXMgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIAoJQHBhcmFtIHtTdHJpbmd9IHN0eWxlIChEZWZhdWx0cyB0byBhY3RpdmUgZmlsbC9zdHJva2Ugc3R5bGUpIEEgc3RyaW5nIHNpZ25hbGxpbmcgaWYgc3Ryb2tlLCBmaWxsIG9yIGJvdGggYXJlIHRvIGJlIGFwcGxpZWQuCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIHJvdW5kZWRSZWN0CgkqLwoJQVBJLnJvdW5kZWRSZWN0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCwgcngsIHJ5LCBzdHlsZSkgewoJCXZhciBNeUFyYyA9IDQvMyooTWF0aC5TUVJUMi0xKTsKCQl0aGlzLmxpbmVzKAoJCQlbCgkJCQlbICh3LTIqcngpLCAwIF0gCgkJCQksIFsgKHJ4Kk15QXJjKSwgMCwgcngsIHJ5LShyeSpNeUFyYyksIHJ4LCByeSBdIAoJCQkJLCBbIDAsIChoLTIqcnkpIF0gCgkJCQksIFsgMCwgKHJ5Kk15QXJjKSwgLShyeCpNeUFyYyksIHJ5LCAtcngsIHJ5XQoJCQkJLCBbICgtdysyKnJ4KSwgMF0KCQkJCSwgWyAtKHJ4Kk15QXJjKSwgMCwgLXJ4LCAtKHJ5Kk15QXJjKSwgLXJ4LCAtcnldCgkJCQksIFsgMCwgKC1oKzIqcnkpXQoJCQkJLCBbIDAsIC0ocnkqTXlBcmMpLCAocngqTXlBcmMpLCAtcnksIHJ4LCAtcnldCgkJCV0KCQkJLCB4K3J4LCB5IC8vIHN0YXJ0IG9mIHBhdGgKCQkJLCBbMSwxXQoJCQksIHN0eWxlCgkJKQoJCXJldHVybiB0aGlzOwoJfQoKCS8qKgoJQWRkcyBhbiBlbGxpcHNlIHRvIFBERgoJCglAcGFyYW0ge051bWJlcn0geCBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IGxlZnQgZWRnZSBvZiB0aGUgcGFnZQoJQHBhcmFtIHtOdW1iZXJ9IHkgQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCB1cHBlciBlZGdlIG9mIHRoZSBwYWdlCglAcGFyYW0ge051bWJlcn0gcnggUmFkaXVzIGFsb25nIHggYXhpcyAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgCglAcGFyYW0ge051bWJlcn0gcnggUmFkaXVzIGFsb25nIHkgYXhpcyAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgCglAcGFyYW0ge1N0cmluZ30gc3R5bGUgKERlZmF1bHRzIHRvIGFjdGl2ZSBmaWxsL3N0cm9rZSBzdHlsZSkgQSBzdHJpbmcgc2lnbmFsbGluZyBpZiBzdHJva2UsIGZpbGwgb3IgYm90aCBhcmUgdG8gYmUgYXBwbGllZC4KCUBmdW5jdGlvbgoJQHJldHVybnMge2pzUERGfQoJQG1ldGhvZE9mIGpzUERGIwoJQG5hbWUgZWxsaXBzZQoJICovCglBUEkuZWxsaXBzZSA9IGZ1bmN0aW9uKHgsIHksIHJ4LCByeSwgc3R5bGUpIHsKCQl2YXIgb3AgPSBnZXRTdHlsZShzdHlsZSkKCQksIGx4ID0gNC8zKihNYXRoLlNRUlQyLTEpKnJ4CgkJLCBseSA9IDQvMyooTWF0aC5TUVJUMi0xKSpyeQoJCQoJCW91dChbCgkJCWYyKCh4K3J4KSprKQoJCQksIGYyKChwYWdlSGVpZ2h0LXkpKmspCgkJCSwgJ20nCgkJCSwgZjIoKHgrcngpKmspCgkJCSwgZjIoKHBhZ2VIZWlnaHQtKHktbHkpKSprKQoJCQksIGYyKCh4K2x4KSprKQoJCQksIGYyKChwYWdlSGVpZ2h0LSh5LXJ5KSkqaykKCQkJLCBmMih4KmspCgkJCSwgZjIoKHBhZ2VIZWlnaHQtKHktcnkpKSprKQoJCQksICdjJwoJCV0uam9pbignICcpKQoJCW91dChbCgkJCWYyKCh4LWx4KSprKQoJCQksIGYyKChwYWdlSGVpZ2h0LSh5LXJ5KSkqaykKCQkJLCBmMigoeC1yeCkqaykKCQkJLCBmMigocGFnZUhlaWdodC0oeS1seSkpKmspCgkJCSwgZjIoKHgtcngpKmspCgkJCSwgZjIoKHBhZ2VIZWlnaHQteSkqaykKCQkJLCAnYycKCQldLmpvaW4oJyAnKSkKCQlvdXQoWwoJCQlmMigoeC1yeCkqaykKCQkJLCBmMigocGFnZUhlaWdodC0oeStseSkpKmspCgkJCSwgZjIoKHgtbHgpKmspCgkJCSwgZjIoKHBhZ2VIZWlnaHQtKHkrcnkpKSprKQoJCQksIGYyKHgqaykKCQkJLCBmMigocGFnZUhlaWdodC0oeStyeSkpKmspCgkJCSwgJ2MnCgkJXS5qb2luKCcgJykpCgkJb3V0KFsKCQkJZjIoKHgrbHgpKmspCgkJCSwgZjIoKHBhZ2VIZWlnaHQtKHkrcnkpKSprKQoJCQksIGYyKCh4K3J4KSprKQoJCQksIGYyKChwYWdlSGVpZ2h0LSh5K2x5KSkqaykKCQkJLCBmMigoeCtyeCkqaykKCQkJLCBmMigocGFnZUhlaWdodC15KSprKSAKCQkJLCdjJwoJCQksIG9wCgkJXS5qb2luKCcgJykpCgkJcmV0dXJuIHRoaXMKCX0KCgkvKioKCUFkZHMgYW4gY2lyY2xlIHRvIFBERgoJCglAcGFyYW0ge051bWJlcn0geCBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IGxlZnQgZWRnZSBvZiB0aGUgcGFnZQoJQHBhcmFtIHtOdW1iZXJ9IHkgQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCB1cHBlciBlZGdlIG9mIHRoZSBwYWdlCglAcGFyYW0ge051bWJlcn0gciBSYWRpdXMgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpIAoJQHBhcmFtIHtTdHJpbmd9IHN0eWxlIChEZWZhdWx0cyB0byBhY3RpdmUgZmlsbC9zdHJva2Ugc3R5bGUpIEEgc3RyaW5nIHNpZ25hbGxpbmcgaWYgc3Ryb2tlLCBmaWxsIG9yIGJvdGggYXJlIHRvIGJlIGFwcGxpZWQuCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIGNpcmNsZQoJICovCglBUEkuY2lyY2xlID0gZnVuY3Rpb24oeCwgeSwgciwgc3R5bGUpIHsKCQlyZXR1cm4gdGhpcy5lbGxpcHNlKHgsIHksIHIsIHIsIHN0eWxlKQoJfQoKCS8qKgoJQWRkcyBhIHByb3BlcnRpZXMgdG8gdGhlIFBERiBkb2N1bWVudAoJCglAcGFyYW0ge09iamVjdH0gQSBwcm9wZXJ0eV9uYW1lLXRvLXByb3BlcnR5X3ZhbHVlIG9iamVjdCBzdHJ1Y3R1cmUuCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIHNldFByb3BlcnRpZXMKCSAqLwoJQVBJLnNldFByb3BlcnRpZXMgPSBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7CgkJLy8gY29weWluZyBvbmx5IHRob3NlIHByb3BlcnRpZXMgd2UgY2FuIHJlbmRlci4KCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBkb2N1bWVudFByb3BlcnRpZXMpewoJCQlpZiAoZG9jdW1lbnRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSAmJiBwcm9wZXJ0aWVzW3Byb3BlcnR5XSkgewoJCQkJZG9jdW1lbnRQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldCgkJCX0KCQl9CgkJcmV0dXJuIHRoaXMKCX0KCgkvKioKCVNldHMgZm9udCBzaXplIGZvciB1cGNvbWluZyB0ZXh0IGVsZW1lbnRzLgoJCglAcGFyYW0ge051bWJlcn0gc2l6ZSBGb250IHNpemUgaW4gcG9pbnRzLgoJQGZ1bmN0aW9uCglAcmV0dXJucyB7anNQREZ9CglAbWV0aG9kT2YganNQREYjCglAbmFtZSBzZXRGb250U2l6ZQoJICovCglBUEkuc2V0Rm9udFNpemUgPSBmdW5jdGlvbihzaXplKSB7CgkJYWN0aXZlRm9udFNpemUgPSBzaXplCgkJcmV0dXJuIHRoaXMKCX0KCgkvKioKCVNldHMgdGV4dCBmb250IGZhY2UsIHZhcmlhbnQgZm9yIHVwY29taW5nIHRleHQgZWxlbWVudHMuCglTZWUgb3V0cHV0IG9mIGpzUERGLmdldEZvbnRMaXN0KCkgZm9yIHBvc3NpYmxlIGZvbnQgbmFtZXMsIHN0eWxlcy4KCQoJQHBhcmFtIHtTdHJpbmd9IGZvbnROYW1lIEZvbnQgbmFtZSBvciBmYW1pbHkuIEV4YW1wbGU6ICJ0aW1lcyIKCUBwYXJhbSB7U3RyaW5nfSBmb250U3R5bGUgRm9udCBzdHlsZSBvciB2YXJpYW50LiBFeGFtcGxlOiAiaXRhbGljIgoJQGZ1bmN0aW9uCglAcmV0dXJucyB7anNQREZ9CglAbWV0aG9kT2YganNQREYjCglAbmFtZSBzZXRGb250CgkgKi8KCUFQSS5zZXRGb250ID0gZnVuY3Rpb24oZm9udE5hbWUsIGZvbnRTdHlsZSkgewoJCWFjdGl2ZUZvbnRLZXkgPSBnZXRGb250KGZvbnROYW1lLCBmb250U3R5bGUpCgkJLy8gaWYgZm9udCBpcyBub3QgZm91bmQsIHRoZSBhYm92ZSBsaW5lIGJsb3dzIHVwIGFuZCB3ZSBuZXZlciBnbyBmdXJ0aGVyCgkJcmV0dXJuIHRoaXMKCX0KCgkvKioKCVN3aXRjaGVzIGZvbnQgc3R5bGUgb3IgdmFyaWFudCBmb3IgdXBjb21pbmcgdGV4dCBlbGVtZW50cywKCXdoaWxlIGtlZXBpbmcgdGhlIGZvbnQgZmFjZSBvciBmYW1pbHkgc2FtZS4KCVNlZSBvdXRwdXQgb2YganNQREYuZ2V0Rm9udExpc3QoKSBmb3IgcG9zc2libGUgZm9udCBuYW1lcywgc3R5bGVzLgoJCglAcGFyYW0ge1N0cmluZ30gc3R5bGUgRm9udCBzdHlsZSBvciB2YXJpYW50LiBFeGFtcGxlOiAiaXRhbGljIgoJQGZ1bmN0aW9uCglAcmV0dXJucyB7anNQREZ9CglAbWV0aG9kT2YganNQREYjCglAbmFtZSBzZXRGb250U3R5bGUKCSAqLwoJQVBJLnNldEZvbnRTdHlsZSA9IEFQSS5zZXRGb250VHlwZSA9IGZ1bmN0aW9uKHN0eWxlKSB7CgkJdmFyIHVuZGVmCgkJYWN0aXZlRm9udEtleSA9IGdldEZvbnQodW5kZWYsIHN0eWxlKQoJCS8vIGlmIGZvbnQgaXMgbm90IGZvdW5kLCB0aGUgYWJvdmUgbGluZSBibG93cyB1cCBhbmQgd2UgbmV2ZXIgZ28gZnVydGhlcgoJCXJldHVybiB0aGlzCgl9CgoJLyoqCglSZXR1cm5zIGFuIG9iamVjdCAtIGEgdHJlZSBvZiBmb250TmFtZSB0byBmb250U3R5bGUgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgdG8gCglhY3RpdmUgUERGIGRvY3VtZW50LiAKCglAcHVibGljCglAZnVuY3Rpb24KCUByZXR1cm5zIHtPYmplY3R9IExpa2Ugeyd0aW1lcyc6Wydub3JtYWwnLCAnaXRhbGljJywgLi4uIF0sICdhcmlhbCc6Wydub3JtYWwnLCAnYm9sZCcsIC4uLiBdLCAuLi4gfQoJQG1ldGhvZE9mIGpzUERGIwoJQG5hbWUgZ2V0Rm9udExpc3QKCSovCglBUEkuZ2V0Rm9udExpc3QgPSBmdW5jdGlvbigpewoJCS8vIFRPRE86IGl0ZXJhdGUgb3ZlciBmb250cyBhcnJheSBvciByZXR1cm4gY29weSBvZiBmb250bWFwIGluc3RlYWQgaW4gY2FzZSBtb3JlIGFyZSBldmVyIGFkZGVkLgoJCXZhciBsaXN0ID0ge30KCQksIGZvbnROYW1lCgkJLCBmb250U3R5bGUKCQksIHRtcAoKCQlmb3IgKGZvbnROYW1lIGluIGZvbnRtYXApIHsKCQkJaWYgKGZvbnRtYXAuaGFzT3duUHJvcGVydHkoZm9udE5hbWUpKSB7CgkJCQlsaXN0W2ZvbnROYW1lXSA9IHRtcCA9IFtdCgkJCQlmb3IgKGZvbnRTdHlsZSBpbiBmb250bWFwW2ZvbnROYW1lXSl7CgkJCQkJaWYgKGZvbnRtYXBbZm9udE5hbWVdLmhhc093blByb3BlcnR5KGZvbnRTdHlsZSkpIHsKCQkJCQkJdG1wLnB1c2goZm9udFN0eWxlKQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIGxpc3QKCX0KCgkvKioKCVNldHMgbGluZSB3aWR0aCBmb3IgdXBjb21pbmcgbGluZXMuCgkKCUBwYXJhbSB7TnVtYmVyfSB3aWR0aCBMaW5lIHdpZHRoIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KQoJQGZ1bmN0aW9uCglAcmV0dXJucyB7anNQREZ9CglAbWV0aG9kT2YganNQREYjCglAbmFtZSBzZXRMaW5lV2lkdGgKCSAqLwoJQVBJLnNldExpbmVXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoKSB7CgkJb3V0KCh3aWR0aCAqIGspLnRvRml4ZWQoMikgKyAnIHcnKQoJCXJldHVybiB0aGlzCgl9CgoJLyoqCglTZXRzIHRoZSBzdHJva2UgY29sb3IgZm9yIHVwY29taW5nIGVsZW1lbnRzLiAKCglEZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgZ2l2ZW4sIEdyYXksIFJHQiwgb3IgQ01ZSwoJY29sb3Igc3BhY2UgaXMgaW1wbGllZC4KCglXaGVuIG9ubHkgY2gxIGlzIGdpdmVuLCAiR3JheSIgY29sb3Igc3BhY2UgaXMgaW1wbGllZCBhbmQgaXQKCW11c3QgYmUgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwLjAwIChzb2xpZCBibGFjaykgdG8gdG8gMS4wMCAod2hpdGUpCglpZiB2YWx1ZXMgYXJlIGNvbW11bmljYXRlZCBhcyBTdHJpbmcgdHlwZXMsIG9yIGluIHJhbmdlIGZyb20gMCAoYmxhY2spCgl0byAyNTUgKHdoaXRlKSBpZiBjb21tdW5pY2F0ZWQgYXMgTnVtYmVyIHR5cGUuCglUaGUgUkdCLWxpa2UgMC0yNTUgcmFuZ2UgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJV2hlbiBvbmx5IGNoMSxjaDIsY2gzIGFyZSBnaXZlbiwgIlJHQiIgY29sb3Igc3BhY2UgaXMgaW1wbGllZCBhbmQgZWFjaAoJdmFsdWUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgZnJvbSAwLjAwIChtaW5pbXVtIGludGVuc2l0eSkgdG8gdG8gMS4wMCAKCShtYXggaW50ZW5zaXR5KSBpZiB2YWx1ZXMgYXJlIGNvbW11bmljYXRlZCBhcyBTdHJpbmcgdHlwZXMsIG9yIAoJZnJvbSAwIChtaW4gaW50ZW5zaXR5KSB0byB0byAyNTUgKG1heCBpbnRlbnNpdHkpIGlmIHZhbHVlcyBhcmUgY29tbXVuaWNhdGVkCglhcyBOdW1iZXIgdHlwZXMuCglUaGUgUkdCLWxpa2UgMC0yNTUgcmFuZ2UgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJV2hlbiBjaDEsY2gyLGNoMyxjaDQgYXJlIGdpdmVuLCAiQ01ZSyIgY29sb3Igc3BhY2UgaXMgaW1wbGllZCBhbmQgZWFjaAoJdmFsdWUgbXVzdCBiZSBhIGluIHRoZSByYW5nZSBmcm9tIDAuMDAgKDAlIGNvbmNlbnRyYXRpb24pIHRvIHRvIAoJMS4wMCAoMTAwJSBjb25jZW50cmF0aW9uKQoKCUJlY2F1c2UgSmF2YVNjcmlwdCB0cmVhdHMgZml4ZWQgcG9pbnQgbnVtYmVycyBiYWRseSAocm91bmRzIHRvIAoJZmxvYXRpbmcgcG9pbnQgbmVhcmVzdCB0byBiaW5hcnkgcmVwcmVzZW50YXRpb24pIGl0IGlzIGhpZ2hseSBhZHZpc2VkIHRvCgljb21tdW5pY2F0ZSB0aGUgZnJhY3Rpb25hbCBudW1iZXJzIGFzIFN0cmluZyB0eXBlcywgbm90IEphdmFTY3JpcHQgTnVtYmVyIHR5cGUuCgkKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2gxIENvbG9yIGNoYW5uZWwgdmFsdWUKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2gyIENvbG9yIGNoYW5uZWwgdmFsdWUKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2gzIENvbG9yIGNoYW5uZWwgdmFsdWUKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2g0IENvbG9yIGNoYW5uZWwgdmFsdWUKCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIHNldERyYXdDb2xvcgoJICovCglBUEkuc2V0RHJhd0NvbG9yID0gZnVuY3Rpb24oY2gxLGNoMixjaDMsY2g0KSB7CgkJdmFyIHVuZGVmaW5lZAoJCSwgY29sb3IKCQlpZiAoY2gyID09PSB1bmRlZmluZWQgfHwgKCBjaDQgPT09IHVuZGVmaW5lZCAmJiBjaDEgPT09IGNoMiA9PT0gY2gzICkgKSB7CgkJCS8vIEdyYXkgY29sb3Igc3BhY2UuCgkJCWlmICh0eXBlb2YgY2gxID09PSAnc3RyaW5nJykgewoJCQkJY29sb3IgPSBjaDEgKyAnIEcnCgkJCX0gZWxzZSB7CgkJCQljb2xvciA9IGYyKGNoMS8yNTUpICsgJyBHJwoJCQl9CgkJfSBlbHNlIGlmIChjaDQgPT09IHVuZGVmaW5lZCkgewoJCQkvLyBSR0IKCQkJaWYgKHR5cGVvZiBjaDEgPT09ICdzdHJpbmcnKSB7CgkJCQljb2xvciA9IFtjaDEsIGNoMiwgY2gzLCAnUkcnXS5qb2luKCcgJykKCQkJfSBlbHNlIHsKCQkJCWNvbG9yID0gW2YyKGNoMS8yNTUpLCBmMihjaDIvMjU1KSwgZjIoY2gzLzI1NSksICdSRyddLmpvaW4oJyAnKQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQ01ZSwoJCQlpZiAodHlwZW9mIGNoMSA9PT0gJ3N0cmluZycpIHsKCQkJCWNvbG9yID0gW2NoMSwgY2gyLCBjaDMsIGNoNCwgJ0snXS5qb2luKCcgJykKCQkJfSBlbHNlIHsKCQkJCWNvbG9yID0gW2YyKGNoMSksIGYyKGNoMiksIGYyKGNoMyksIGYyKGNoNCksICdLJ10uam9pbignICcpCgkJCX0KCQl9CgoJCW91dChjb2xvcikKCQlyZXR1cm4gdGhpcwoJfQoKCS8qKgoJU2V0cyB0aGUgZmlsbCBjb2xvciBmb3IgdXBjb21pbmcgZWxlbWVudHMuIAoJCglEZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgZ2l2ZW4sIEdyYXksIFJHQiwgb3IgQ01ZSwoJY29sb3Igc3BhY2UgaXMgaW1wbGllZC4KCglXaGVuIG9ubHkgY2gxIGlzIGdpdmVuLCAiR3JheSIgY29sb3Igc3BhY2UgaXMgaW1wbGllZCBhbmQgaXQKCW11c3QgYmUgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwLjAwIChzb2xpZCBibGFjaykgdG8gdG8gMS4wMCAod2hpdGUpCglpZiB2YWx1ZXMgYXJlIGNvbW11bmljYXRlZCBhcyBTdHJpbmcgdHlwZXMsIG9yIGluIHJhbmdlIGZyb20gMCAoYmxhY2spCgl0byAyNTUgKHdoaXRlKSBpZiBjb21tdW5pY2F0ZWQgYXMgTnVtYmVyIHR5cGUuCglUaGUgUkdCLWxpa2UgMC0yNTUgcmFuZ2UgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJV2hlbiBvbmx5IGNoMSxjaDIsY2gzIGFyZSBnaXZlbiwgIlJHQiIgY29sb3Igc3BhY2UgaXMgaW1wbGllZCBhbmQgZWFjaAoJdmFsdWUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgZnJvbSAwLjAwIChtaW5pbXVtIGludGVuc2l0eSkgdG8gdG8gMS4wMCAKCShtYXggaW50ZW5zaXR5KSBpZiB2YWx1ZXMgYXJlIGNvbW11bmljYXRlZCBhcyBTdHJpbmcgdHlwZXMsIG9yIAoJZnJvbSAwIChtaW4gaW50ZW5zaXR5KSB0byB0byAyNTUgKG1heCBpbnRlbnNpdHkpIGlmIHZhbHVlcyBhcmUgY29tbXVuaWNhdGVkCglhcyBOdW1iZXIgdHlwZXMuCglUaGUgUkdCLWxpa2UgMC0yNTUgcmFuZ2UgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJV2hlbiBjaDEsY2gyLGNoMyxjaDQgYXJlIGdpdmVuLCAiQ01ZSyIgY29sb3Igc3BhY2UgaXMgaW1wbGllZCBhbmQgZWFjaAoJdmFsdWUgbXVzdCBiZSBhIGluIHRoZSByYW5nZSBmcm9tIDAuMDAgKDAlIGNvbmNlbnRyYXRpb24pIHRvIHRvIAoJMS4wMCAoMTAwJSBjb25jZW50cmF0aW9uKQoKCUJlY2F1c2UgSmF2YVNjcmlwdCB0cmVhdHMgZml4ZWQgcG9pbnQgbnVtYmVycyBiYWRseSAocm91bmRzIHRvIAoJZmxvYXRpbmcgcG9pbnQgbmVhcmVzdCB0byBiaW5hcnkgcmVwcmVzZW50YXRpb24pIGl0IGlzIGhpZ2hseSBhZHZpc2VkIHRvCgljb21tdW5pY2F0ZSB0aGUgZnJhY3Rpb25hbCBudW1iZXJzIGFzIFN0cmluZyB0eXBlcywgbm90IEphdmFTY3JpcHQgTnVtYmVyIHR5cGUuCgkKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2gxIENvbG9yIGNoYW5uZWwgdmFsdWUKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2gyIENvbG9yIGNoYW5uZWwgdmFsdWUKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2gzIENvbG9yIGNoYW5uZWwgdmFsdWUKCUBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2g0IENvbG9yIGNoYW5uZWwgdmFsdWUKCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIHNldEZpbGxDb2xvcgoJICovCglBUEkuc2V0RmlsbENvbG9yID0gZnVuY3Rpb24oY2gxLCBjaDIsIGNoMywgY2g0KSB7CgkJdmFyIHVuZGVmaW5lZAoJCSwgY29sb3IKCgkJaWYgKGNoMiA9PT0gdW5kZWZpbmVkIHx8ICggY2g0ID09PSB1bmRlZmluZWQgJiYgY2gxID09PSBjaDIgPT09IGNoMyApICkgewoJCQkvLyBHcmF5IGNvbG9yIHNwYWNlLgoJCQlpZiAodHlwZW9mIGNoMSA9PT0gJ3N0cmluZycpIHsKCQkJCWNvbG9yID0gY2gxICsgJyBnJwoJCQl9IGVsc2UgewoJCQkJY29sb3IgPSBmMihyLzI1NSkgKyAnIGcnCgkJCX0KCQl9IGVsc2UgaWYgKGNoNCA9PT0gdW5kZWZpbmVkKSB7CgkJCS8vIFJHQgoJCQlpZiAodHlwZW9mIGNoMSA9PT0gJ3N0cmluZycpIHsKCQkJCWNvbG9yID0gW2NoMSwgY2gyLCBjaDMsICdyZyddLmpvaW4oJyAnKQoJCQl9IGVsc2UgewoJCQkJY29sb3IgPSBbZjIoY2gxLzI1NSksIGYyKGNoMi8yNTUpLCBmMihjaDMvMjU1KSwgJ3JnJ10uam9pbignICcpCgkJCX0KCQl9IGVsc2UgewoJCQkvLyBDTVlLCgkJCWlmICh0eXBlb2YgY2gxID09PSAnc3RyaW5nJykgewoJCQkJY29sb3IgPSBbY2gxLCBjaDIsIGNoMywgY2g0LCAnayddLmpvaW4oJyAnKQoJCQl9IGVsc2UgewoJCQkJY29sb3IgPSBbZjIoY2gxKSwgZjIoY2gyKSwgZjIoY2gzKSwgZjIoY2g0KSwgJ2snXS5qb2luKCcgJykKCQkJfQoJCX0KCgkJb3V0KGNvbG9yKQoJCXJldHVybiB0aGlzCgl9CgoJLyoqCglTZXRzIHRoZSB0ZXh0IGNvbG9yIGZvciB1cGNvbWluZyBlbGVtZW50cy4gCglJZiBvbmx5IG9uZSwgZmlyc3QgYXJndW1lbnQgaXMgZ2l2ZW4sCgl0cmVhdHMgdGhlIHZhbHVlIGFzIGdyYXktc2NhbGUgY29sb3IgdmFsdWUuCgkKCUBwYXJhbSB7TnVtYmVyfSByIFJlZCBjaGFubmVsIGNvbG9yIHZhbHVlIGluIHJhbmdlIDAtMjU1CglAcGFyYW0ge051bWJlcn0gZyBHcmVlbiBjaGFubmVsIGNvbG9yIHZhbHVlIGluIHJhbmdlIDAtMjU1CglAcGFyYW0ge051bWJlcn0gYiBCbHVlIGNoYW5uZWwgY29sb3IgdmFsdWUgaW4gcmFuZ2UgMC0yNTUKCUBmdW5jdGlvbgoJQHJldHVybnMge2pzUERGfQoJQG1ldGhvZE9mIGpzUERGIwoJQG5hbWUgc2V0VGV4dENvbG9yCgkqLwoJQVBJLnNldFRleHRDb2xvciA9IGZ1bmN0aW9uKHIsZyxiKSB7CgkJaWYgKChyPT09MCAmJiBnPT09MCAmJiBiPT09MCkgfHwgKHR5cGVvZiBnID09PSAndW5kZWZpbmVkJykpIHsKCQkJdGV4dENvbG9yID0gZjMoci8yNTUpICsgJyBnJwoJCX0gZWxzZSB7CgkJCXRleHRDb2xvciA9IFtmMyhyLzI1NSksIGYzKGcvMjU1KSwgZjMoYi8yNTUpLCAncmcnXS5qb2luKCcgJykKCQl9CgkJcmV0dXJuIHRoaXMKCX0KCgkvKioKCUlzIGFuIE9iamVjdCBwcm92aWRpbmcgYSBtYXBwaW5nIGZyb20gaHVtYW4tcmVhZGFibGUgdG8KCWludGVnZXIgZmxhZyB2YWx1ZXMgZGVzaWduYXRpbmcgdGhlIHZhcmlldGllcyBvZiBsaW5lIGNhcCAKCWFuZCBqb2luIHN0eWxlcy4KCQoJQHJldHVybnMge09iamVjdH0KCUBmaWVsZE9mIGpzUERGIwoJQG5hbWUgQ2FwSm9pblN0eWxlcwoJKi8KCUFQSS5DYXBKb2luU3R5bGVzID0gewoJCTA6MCwgJ2J1dHQnOjAsICdidXQnOjAsICdiZXZlbCc6MAoJCSwgMToxLCAncm91bmQnOiAxLCAncm91bmRlZCc6MSwgJ2NpcmNsZSc6MQoJCSwgMjoyLCAncHJvamVjdGluZyc6MiwgJ3Byb2plY3QnOjIsICdzcXVhcmUnOjIsICdtaWx0ZXInOjIKCX0KCgkvKioKCVNldHMgdGhlIGxpbmUgY2FwIHN0eWxlcwoJU2VlIHtqc1BERi5DYXBKb2luU3R5bGVzfSBmb3IgdmFyaWFudHMKCQoJQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBzdHlsZSBBIHN0cmluZyBvciBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgbGluZSBjYXAKCUBmdW5jdGlvbgoJQHJldHVybnMge2pzUERGfQoJQG1ldGhvZE9mIGpzUERGIwoJQG5hbWUgc2V0TGluZUNhcAoJKi8KCUFQSS5zZXRMaW5lQ2FwID0gZnVuY3Rpb24oc3R5bGUpIHsKCQl2YXIgdW5kZWZpbmVkCgkJLCBpZCA9IHRoaXMuQ2FwSm9pblN0eWxlc1tzdHlsZV0KCQlpZiAoaWQgPT09IHVuZGVmaW5lZCkgewoJCQl0aHJvdyBuZXcgRXJyb3IoIkxpbmUgY2FwIHN0eWxlIG9mICciK3N0eWxlKyInIGlzIG5vdCByZWNvZ25pemVkLiBTZWUgb3IgZXh0ZW5kIC5DYXBKb2luU3R5bGVzIHByb3BlcnR5IGZvciB2YWxpZCBzdHlsZXMiKQoJCX0KCQlsaW5lQ2FwSUQgPSBpZAoJCW91dChpZC50b1N0cmluZygxMCkgKyAnIEonKQoKCQlyZXR1cm4gdGhpcwoJfQoKCS8qKgoJU2V0cyB0aGUgbGluZSBqb2luIHN0eWxlcwoJU2VlIHtqc1BERi5DYXBKb2luU3R5bGVzfSBmb3IgdmFyaWFudHMKCQoJQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBzdHlsZSBBIHN0cmluZyBvciBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgbGluZSBqb2luCglAZnVuY3Rpb24KCUByZXR1cm5zIHtqc1BERn0KCUBtZXRob2RPZiBqc1BERiMKCUBuYW1lIHNldExpbmVKb2luCgkqLwoJQVBJLnNldExpbmVKb2luID0gZnVuY3Rpb24oc3R5bGUpIHsKCQl2YXIgdW5kZWZpbmVkCgkJLCBpZCA9IHRoaXMuQ2FwSm9pblN0eWxlc1tzdHlsZV0KCQlpZiAoaWQgPT09IHVuZGVmaW5lZCkgewoJCQl0aHJvdyBuZXcgRXJyb3IoIkxpbmUgam9pbiBzdHlsZSBvZiAnIitzdHlsZSsiJyBpcyBub3QgcmVjb2duaXplZC4gU2VlIG9yIGV4dGVuZCAuQ2FwSm9pblN0eWxlcyBwcm9wZXJ0eSBmb3IgdmFsaWQgc3R5bGVzIikKCQl9CgkJbGluZUpvaW5JRCA9IGlkCgkJb3V0KGlkLnRvU3RyaW5nKDEwKSArICcgaicpCgoJCXJldHVybiB0aGlzCgl9CgoJLyoqCglHZW5lcmF0ZXMgdGhlIFBERiBkb2N1bWVudC4KCVBvc3NpYmxlIHZhbHVlczoKCQlkYXRhdXJpc3RyaW5nIChhbGlhcyBkYXRhdXJsc3RyaW5nKSAtIERhdGEtVXJsLWZvcm1hdHRlZCBkYXRhIHJldHVybmVkIGFzIHN0cmluZy4KCQlkYXRhdXJpIChhbGlhcyBkYXRhdXJpKSAtIERhdGEtVXJsLWZvcm1hdHRlZCBkYXRhIHB1c2hlZCBpbnRvIGN1cnJlbnQgd2luZG93J3MgbG9jYXRpb24gKGVmZmVjdGl2ZWx5IHJlbG9hZGluZyB0aGUgd2luZG93IHdpdGggY29udGVudHMgb2YgdGhlIFBERikuCgkKCUlmIGB0eXBlYCBhcmd1bWVudCBpcyB1bmRlZmluZWQsIG91dHB1dCBpcyByYXcgYm9keSBvZiByZXN1bHRpbmcgUERGIHJldHVybmVkIGFzIGEgc3RyaW5nLgoKCUBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgc3RyaW5nIGlkZW50aWZ5aW5nIG9uZSBvZiB0aGUgcG9zc2libGUgb3V0cHV0IHR5cGVzLgoJQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQW4gb2JqZWN0IHByb3ZpZGluZyBzb21lIGFkZGl0aW9uYWwgc2lnbmFsbGluZyB0byBQREYgZ2VuZXJhdG9yLgoJQGZ1bmN0aW9uCglAcmV0dXJucyB7anNQREZ9CglAbWV0aG9kT2YganNQREYjCglAbmFtZSBvdXRwdXQKCSovCgl2YXIgb3V0cHV0ID0gZnVuY3Rpb24odHlwZSwgb3B0aW9ucykgewoJCXZhciB1bmRlZgoJCXN3aXRjaCAodHlwZSl7CgkJCWNhc2UgdW5kZWY6IAoJCQkJcmV0dXJuIGJ1aWxkRG9jdW1lbnQoKTsKCQkJY2FzZSAnc2F2ZSc6CgoJCQkJLy8gSWYgU2FmYXJpIC0gZmFsbGJhY2sgdG8gRGF0YSBVUkwsIHNvcnJ5IHRoZXJlJ3Mgbm8gd2F5IHRvIGZlYXR1cmUgZGV0ZWN0IHRoaXMKCQkJCS8vIEBUT0RPOiBSZWZhY3RvciB0aGlzCgkJCQkkLmJyb3dzZXIuY2hyb21lID0gJC5icm93c2VyLndlYmtpdCAmJiAhIXdpbmRvdy5jaHJvbWU7CgkJCQkkLmJyb3dzZXIuc2FmYXJpID0gJC5icm93c2VyLndlYmtpdCAmJiAhd2luZG93LmNocm9tZTsKCgkJCQlpZiAoJC5icm93c2VyLnNhZmFyaSkgewoJCQkJCXJldHVybiBBUEkub3V0cHV0KCdkYXRhdXJsbmV3d2luZG93Jyk7CgkJCQl9CgoJCQkJdmFyIGJiID0gbmV3IEJsb2JCdWlsZGVyOwoJCQkJdmFyIGRhdGEgPSBidWlsZERvY3VtZW50KCk7CgoJCQkJLy8gTmVlZCB0byBhZGQgdGhlIGZpbGUgdG8gQmxvYkJ1aWxkZXIgYXMgYSBVaW50OEFycmF5CgkJCQl2YXIgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CgkJCQl2YXIgYXJyYXkgPSBuZXcgVWludDhBcnJheShuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSk7CgoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQkJCWFycmF5W2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpOwoJCQkJfQoKCQkJCWJiLmFwcGVuZChhcnJheSk7CgoJCQkJdmFyIGJsb2IgPSBiYi5nZXRCbG9iKCdhcHBsaWNhdGlvbi9wZGYnKTsKCQkJCXNhdmVBcyhibG9iLCBvcHRpb25zKTsKCQkJCWJyZWFrOwoJCQljYXNlICdkYXRhdXJpc3RyaW5nJzoKCQkJY2FzZSAnZGF0YXVybHN0cmluZyc6CgkJCQlyZXR1cm4gJ2RhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwnICsgYnRvYShidWlsZERvY3VtZW50KCkpCgkJCWNhc2UgJ2RhdGF1cmknOgoJCQljYXNlICdkYXRhdXJsJzoKCQkJCWRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSAnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCcgKyBidG9hKGJ1aWxkRG9jdW1lbnQoKSk7IGJyZWFrOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2RhdGF1cmxuZXd3aW5kb3cnOgoJCQkJd2luZG93Lm9wZW4oJ2RhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwnICsgYnRvYShidWlsZERvY3VtZW50KCkpKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ091dHB1dCB0eXBlICInK3R5cGUrJyIgaXMgbm90IHN1cHBvcnRlZC4nKSAKCQl9CgkJLy8gQFRPRE86IEFkZCBkaWZmZXJlbnQgb3V0cHV0IG9wdGlvbnMKCX07CgoJLy8gT3V0cHV0IGlzIGJvdGggYW4gaW50ZXJuYWwgKGZvciBwbHVnaW5zKSBhbmQgZXh0ZXJuYWwgZnVuY3Rpb24KCUFQSS5vdXRwdXQgPSBvdXRwdXQ7CgoJLyoqCgkgKiBTYXZlcyBhcyBQREYgZG9jdW1lbnQuIEFuIGFsaWFzIG9mIGpzUERGLm91dHB1dCgnc2F2ZScsICdmaWxlbmFtZS5wZGYnKQoJICogQHBhcmFtICB7U3RyaW5nfSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgaW5jbHVkaW5nIGV4dGVuc2lvbi4KCSAqCgkgKiBAZnVuY3Rpb24KCSAqIEByZXR1cm5zIHtqc1BERn0KCSAqIEBtZXRob2RPZiBqc1BERiMKCSAqIEBuYW1lIHNhdmUKCSAqLwoJQVBJLnNhdmUgPSBmdW5jdGlvbihmaWxlbmFtZSkgewoJCUFQSS5vdXRwdXQoJ3NhdmUnLCBmaWxlbmFtZSk7Cgl9CgoJLy8gYXBwbHlpbmcgcGx1Z2lucyAobW9yZSBtZXRob2RzKSBPTiBUT1Agb2YgYnVpbHQtaW4gQVBJLgoJLy8gdGhpcyBpcyBpbnRlbnRpb25hbCBhcyB3ZSBhbGxvdyBwbHVnaW5zIHRvIG92ZXJyaWRlIAoJLy8gYnVpbHQtaW5zCglmb3IgKHZhciBwbHVnaW4gaW4ganNQREYuQVBJKXsKCQlpZiAoanNQREYuQVBJLmhhc093blByb3BlcnR5KHBsdWdpbikpewoJCQlpZiAocGx1Z2luID09PSAnZXZlbnRzJyAmJiBqc1BERi5BUEkuZXZlbnRzLmxlbmd0aCkgewoJCQkJKGZ1bmN0aW9uKGV2ZW50cywgbmV3RXZlbnRzKXsKCgkJCQkJLy8ganNQREYuQVBJLmV2ZW50cyBpcyBhIEpTIEFycmF5IG9mIEFycmF5cyAKCQkJCQkvLyB3aGVyZSBlYWNoIEFycmF5IGlzIGEgcGFpciBvZiBldmVudCBuYW1lLCBoYW5kbGVyCgkJCQkJLy8gRXZlbnRzIHdlcmUgYWRkZWQgYnkgcGx1Z2lucyB0byB0aGUganNQREYgaW5zdGFudGlhdG9yLgoJCQkJCS8vIFRoZXNlIGFyZSBhbHdheXMgYWRkZWQgdG8gdGhlIG5ldyBpbnN0YW5jZSBhbmQgc29tZSByYW4KCQkJCQkvLyBkdXJpbmcgaW5zdGFudGlhdGlvbi4KCgkJCQkJdmFyIGV2ZW50bmFtZSwgaGFuZGxlcl9hbmRfYXJncwoKCQkJCQlmb3IgKHZhciBpID0gbmV3RXZlbnRzLmxlbmd0aCAtIDE7IGkgIT09IC0xOyBpLS0pewoJCQkJCQkvLyBzdWJzY3JpYmUgdGFrZXMgMyBhcmdzOiAndG9waWMnLCBmdW5jdGlvbiwgcnVub25jZV9mbGFnCgkJCQkJCS8vIGlmIHVuZGVmaW5lZCwgcnVub25jZSBpcyBmYWxzZS4KCQkJCQkJLy8gdXNlcnMgY2FuIGF0dGFjaCBjYWxsYmFjayBkaXJlY3RseSwgCgkJCQkJCS8vIG9yIHRoZXkgY2FuIGF0dGFjaCBhbiBhcnJheSB3aXRoIFtjYWxsYmFjaywgcnVub25jZV9mbGFnXQoJCQkJCQkvLyB0aGF0J3Mgd2hhdCB0aGUgImFwcGx5IiBtYWdpYyBpcyBmb3IgYmVsb3cuCgkJCQkJCWV2ZW50bmFtZSA9IG5ld0V2ZW50c1tpXVswXQoJCQkJCQloYW5kbGVyX2FuZF9hcmdzID0gbmV3RXZlbnRzW2ldWzFdCgkJCQkJCWV2ZW50cy5zdWJzY3JpYmUuYXBwbHkoCgkJCQkJCQlldmVudHMKCQkJCQkJCSwgW2V2ZW50bmFtZV0uY29uY2F0KAoJCQkJCQkJCXR5cGVvZiBoYW5kbGVyX2FuZF9hcmdzID09PSAnZnVuY3Rpb24nID8KCQkJCQkJCSAgCVsgaGFuZGxlcl9hbmRfYXJncyBdIDoKCQkJCQkJCSAgCWhhbmRsZXJfYW5kX2FyZ3MKCQkJCQkJCSkKCQkJCQkJKQoJCQkJCX0KCQkJCX0pKGV2ZW50cywganNQREYuQVBJLmV2ZW50cykKCQkJfSBlbHNlIHsKCQkJCUFQSVtwbHVnaW5dID0ganNQREYuQVBJW3BsdWdpbl0KCQkJfQoJCX0KCX0KCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy8gY29udGludWluZyBpbml0aWxpc2F0aW9uIG9mIGpzUERGIERvY3VtZW50IG9iamVjdAoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgoJLy8gQWRkIHRoZSBmaXJzdCBwYWdlIGF1dG9tYXRpY2FsbHkKCWFkZEZvbnRzKCkKCWFjdGl2ZUZvbnRLZXkgPSAnRjEnCglfYWRkUGFnZSgpCgoJZXZlbnRzLnB1Ymxpc2goJ2luaXRpYWxpemVkJykKCglyZXR1cm4gQVBJCn0KCi8qKgpqc1BERi5BUEkgaXMgYSBTVEFUSUMgcHJvcGVydHkgb2YganNQREYgY2xhc3MuCmpzUERGLkFQSSBpcyBhbiBvYmplY3QgeW91IGNhbiBhZGQgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0by4KVGhlIG1ldGhvZHMgLyBwcm9wZXJ0aWVzIHlvdSBhZGQgd2lsbCBzaG93IHVwIGluIG5ldyBqc1BERiBvYmplY3RzLgoKT25lIHByb3BlcnR5IGlzIHByZXBvcHVsYXRlZC4gSXQgaXMgdGhlICdldmVudHMnIE9iamVjdC4gUGx1Z2luIGF1dGhvcnMgY2FuIGFkZCB0b3BpY3MsIGNhbGxiYWNrcyB0byB0aGlzIG9iamVjdC4gVGhlc2Ugd2lsbCBiZSByZWFzc2lnbmVkIHRvIGFsbCBuZXcgaW5zdGFuY2VzIG9mIGpzUERGLiAKRXhhbXBsZXM6IAoJanNQREYuQVBJLmV2ZW50c1snaW5pdGlhbGl6ZWQnXSA9IGZ1bmN0aW9uKCl7ICd0aGlzJyBpcyBBUEkgb2JqZWN0IH0KCWpzUERGLkFQSS5ldmVudHNbJ2FkZEZvbnQnXSA9IGZ1bmN0aW9uKGFkZGVkX2ZvbnRfb2JqZWN0KXsgJ3RoaXMnIGlzIEFQSSBvYmplY3QgfQoKQHN0YXRpYwpAcHVibGljCkBtZW1iZXJPZiBqc1BERgpAbmFtZSBBUEkKCkBleGFtcGxlCglqc1BERi5BUEkubXltZXRob2QgPSBmdW5jdGlvbigpewoJCS8vICd0aGlzJyB3aWxsIGJlIHJlZiB0byBpbnRlcm5hbCBBUEkgb2JqZWN0LiBzZWUganNQREYgc291cmNlCgkJLy8gLCBzbyB5b3UgY2FuIHJlZmVyIHRvIGJ1aWx0LWluIG1ldGhvZHMgbGlrZSBzbzogCgkJLy8JIHRoaXMubGluZSguLi4uKQoJCS8vCSB0aGlzLnRleHQoLi4uLikKCX0KCXZhciBwZGZkb2MgPSBuZXcganNQREYoKQoJcGRmZG9jLm15bWV0aG9kKCkgLy8gPC0gISEhISEhCQoqLwpqc1BERi5BUEkgPSB7J2V2ZW50cyc6W119CgpyZXR1cm4ganNQREYKfSkoKQo='
ninejsn = 'jquery-ui-1.8.17.custom.min.js'
ninejsd = 'LyohCiAqIGpRdWVyeSBVSSAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJCiAqLyhmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYil7cmV0dXJuIWEoYikucGFyZW50cygpLmFuZFNlbGYoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gYS5jdXJDU1ModGhpcywidmlzaWJpbGl0eSIpPT09ImhpZGRlbiJ8fGEuZXhwci5maWx0ZXJzLmhpZGRlbih0aGlzKX0pLmxlbmd0aH1mdW5jdGlvbiBjKGIsYyl7dmFyIGU9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKCJhcmVhIj09PWUpe3ZhciBmPWIucGFyZW50Tm9kZSxnPWYubmFtZSxoO2lmKCFiLmhyZWZ8fCFnfHxmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ibWFwIilyZXR1cm4hMTtoPWEoImltZ1t1c2VtYXA9IyIrZysiXSIpWzBdO3JldHVybiEhaCYmZChoKX1yZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGUpPyFiLmRpc2FibGVkOiJhIj09ZT9iLmhyZWZ8fGM6YykmJmQoYil9YS51aT1hLnVpfHx7fTthLnVpLnZlcnNpb258fChhLmV4dGVuZChhLnVpLHt2ZXJzaW9uOiIxLjguMTciLGtleUNvZGU6e0FMVDoxOCxCQUNLU1BBQ0U6OCxDQVBTX0xPQ0s6MjAsQ09NTUE6MTg4LENPTU1BTkQ6OTEsQ09NTUFORF9MRUZUOjkxLENPTU1BTkRfUklHSFQ6OTMsQ09OVFJPTDoxNyxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsSU5TRVJUOjQ1LExFRlQ6MzcsTUVOVTo5MyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9TVUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTSElGVDoxNixTUEFDRTozMixUQUI6OSxVUDozOCxXSU5ET1dTOjkxfX0pLGEuZm4uZXh0ZW5kKHtwcm9wQXR0cjphLmZuLnByb3B8fGEuZm4uYXR0cixfZm9jdXM6YS5mbi5mb2N1cyxmb2N1czpmdW5jdGlvbihiLGMpe3JldHVybiB0eXBlb2YgYj09Im51bWJlciI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YShkKS5mb2N1cygpLGMmJmMuY2FsbChkKX0sYil9KTp0aGlzLl9mb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHNjcm9sbFBhcmVudDpmdW5jdGlvbigpe3ZhciBiO2EuYnJvd3Nlci5tc2llJiYvKHN0YXRpY3xyZWxhdGl2ZSkvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwvYWJzb2x1dGUvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpP2I9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuLyhyZWxhdGl2ZXxhYnNvbHV0ZXxmaXhlZCkvLnRlc3QoYS5jdXJDU1ModGhpcywicG9zaXRpb24iLDEpKSYmLyhhdXRvfHNjcm9sbCkvLnRlc3QoYS5jdXJDU1ModGhpcywib3ZlcmZsb3ciLDEpK2EuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXkiLDEpK2EuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXgiLDEpKX0pLmVxKDApOmI9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuLyhhdXRvfHNjcm9sbCkvLnRlc3QoYS5jdXJDU1ModGhpcywib3ZlcmZsb3ciLDEpK2EuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXkiLDEpK2EuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXgiLDEpKX0pLmVxKDApO3JldHVybi9maXhlZC8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSl8fCFiLmxlbmd0aD9hKGRvY3VtZW50KTpifSx6SW5kZXg6ZnVuY3Rpb24oYyl7aWYoYyE9PWIpcmV0dXJuIHRoaXMuY3NzKCJ6SW5kZXgiLGMpO2lmKHRoaXMubGVuZ3RoKXt2YXIgZD1hKHRoaXNbMF0pLGUsZjt3aGlsZShkLmxlbmd0aCYmZFswXSE9PWRvY3VtZW50KXtlPWQuY3NzKCJwb3NpdGlvbiIpO2lmKGU9PT0iYWJzb2x1dGUifHxlPT09InJlbGF0aXZlInx8ZT09PSJmaXhlZCIpe2Y9cGFyc2VJbnQoZC5jc3MoInpJbmRleCIpLDEwKTtpZighaXNOYU4oZikmJmYhPT0wKXJldHVybiBmfWQ9ZC5wYXJlbnQoKX19cmV0dXJuIDB9LGRpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaW5kKChhLnN1cHBvcnQuc2VsZWN0c3RhcnQ/InNlbGVjdHN0YXJ0IjoibW91c2Vkb3duIikrIi51aS1kaXNhYmxlU2VsZWN0aW9uIixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9KX0sZW5hYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5iaW5kKCIudWktZGlzYWJsZVNlbGVjdGlvbiIpfX0pLGEuZWFjaChbIldpZHRoIiwiSGVpZ2h0Il0sZnVuY3Rpb24oYyxkKXtmdW5jdGlvbiBoKGIsYyxkLGYpe2EuZWFjaChlLGZ1bmN0aW9uKCl7Yy09cGFyc2VGbG9hdChhLmN1ckNTUyhiLCJwYWRkaW5nIit0aGlzLCEwKSl8fDAsZCYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwiYm9yZGVyIit0aGlzKyJXaWR0aCIsITApKXx8MCksZiYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwibWFyZ2luIit0aGlzLCEwKSl8fDApfSk7cmV0dXJuIGN9dmFyIGU9ZD09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGY9ZC50b0xvd2VyQ2FzZSgpLGc9e2lubmVyV2lkdGg6YS5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmEuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDphLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6YS5mbi5vdXRlckhlaWdodH07YS5mblsiaW5uZXIiK2RdPWZ1bmN0aW9uKGMpe2lmKGM9PT1iKXJldHVybiBnWyJpbm5lciIrZF0uY2FsbCh0aGlzKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5jc3MoZixoKHRoaXMsYykrInB4Iil9KX0sYS5mblsib3V0ZXIiK2RdPWZ1bmN0aW9uKGIsYyl7aWYodHlwZW9mIGIhPSJudW1iZXIiKXJldHVybiBnWyJvdXRlciIrZF0uY2FsbCh0aGlzLGIpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhmLGgodGhpcyxiLCEwLGMpKyJweCIpfSl9fSksYS5leHRlbmQoYS5leHByWyI6Il0se2RhdGE6ZnVuY3Rpb24oYixjLGQpe3JldHVybiEhYS5kYXRhKGIsZFszXSl9LGZvY3VzYWJsZTpmdW5jdGlvbihiKXtyZXR1cm4gYyhiLCFpc05hTihhLmF0dHIoYiwidGFiaW5kZXgiKSkpfSx0YWJiYWJsZTpmdW5jdGlvbihiKXt2YXIgZD1hLmF0dHIoYiwidGFiaW5kZXgiKSxlPWlzTmFOKGQpO3JldHVybihlfHxkPj0wKSYmYyhiLCFlKX19KSxhKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuYm9keSxjPWIuYXBwZW5kQ2hpbGQoYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7YS5leHRlbmQoYy5zdHlsZSx7bWluSGVpZ2h0OiIxMDBweCIsaGVpZ2h0OiJhdXRvIixwYWRkaW5nOjAsYm9yZGVyV2lkdGg6MH0pLGEuc3VwcG9ydC5taW5IZWlnaHQ9Yy5vZmZzZXRIZWlnaHQ9PT0xMDAsYS5zdXBwb3J0LnNlbGVjdHN0YXJ0PSJvbnNlbGVjdHN0YXJ0ImluIGMsYi5yZW1vdmVDaGlsZChjKS5zdHlsZS5kaXNwbGF5PSJub25lIn0pLGEuZXh0ZW5kKGEudWkse3BsdWdpbjp7YWRkOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLnVpW2JdLnByb3RvdHlwZTtmb3IodmFyIGYgaW4gZCllLnBsdWdpbnNbZl09ZS5wbHVnaW5zW2ZdfHxbXSxlLnBsdWdpbnNbZl0ucHVzaChbYyxkW2ZdXSl9LGNhbGw6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEucGx1Z2luc1tiXTtpZighIWQmJiEhYS5lbGVtZW50WzBdLnBhcmVudE5vZGUpZm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspYS5vcHRpb25zW2RbZV1bMF1dJiZkW2VdWzFdLmFwcGx5KGEuZWxlbWVudCxjKX19LGNvbnRhaW5zOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTY6YSE9PWImJmEuY29udGFpbnMoYil9LGhhc1Njcm9sbDpmdW5jdGlvbihiLGMpe2lmKGEoYikuY3NzKCJvdmVyZmxvdyIpPT09ImhpZGRlbiIpcmV0dXJuITE7dmFyIGQ9YyYmYz09PSJsZWZ0Ij8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsZT0hMTtpZihiW2RdPjApcmV0dXJuITA7YltkXT0xLGU9YltkXT4wLGJbZF09MDtyZXR1cm4gZX0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE+YiYmYTxiK2N9LGlzT3ZlcjpmdW5jdGlvbihiLGMsZCxlLGYsZyl7cmV0dXJuIGEudWkuaXNPdmVyQXhpcyhiLGQsZikmJmEudWkuaXNPdmVyQXhpcyhjLGUsZyl9fSkpfSkoalF1ZXJ5KTsvKiEKICogalF1ZXJ5IFVJIFdpZGdldCAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1dpZGdldAogKi8oZnVuY3Rpb24oYSxiKXtpZihhLmNsZWFuRGF0YSl7dmFyIGM9YS5jbGVhbkRhdGE7YS5jbGVhbkRhdGE9ZnVuY3Rpb24oYil7Zm9yKHZhciBkPTAsZTsoZT1iW2RdKSE9bnVsbDtkKyspdHJ5e2EoZSkudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGYpe31jKGIpfX1lbHNle3ZhciBkPWEuZm4ucmVtb3ZlO2EuZm4ucmVtb3ZlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2N8fCghYnx8YS5maWx0ZXIoYixbdGhpc10pLmxlbmd0aCkmJmEoIioiLHRoaXMpLmFkZChbdGhpc10pLmVhY2goZnVuY3Rpb24oKXt0cnl7YSh0aGlzKS50cmlnZ2VySGFuZGxlcigicmVtb3ZlIil9Y2F0Y2goYil7fX0pO3JldHVybiBkLmNhbGwoYSh0aGlzKSxiLGMpfSl9fWEud2lkZ2V0PWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLnNwbGl0KCIuIilbMF0sZjtiPWIuc3BsaXQoIi4iKVsxXSxmPWUrIi0iK2IsZHx8KGQ9YyxjPWEuV2lkZ2V0KSxhLmV4cHJbIjoiXVtmXT1mdW5jdGlvbihjKXtyZXR1cm4hIWEuZGF0YShjLGIpfSxhW2VdPWFbZV18fHt9LGFbZV1bYl09ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX07dmFyIGc9bmV3IGM7Zy5vcHRpb25zPWEuZXh0ZW5kKCEwLHt9LGcub3B0aW9ucyksYVtlXVtiXS5wcm90b3R5cGU9YS5leHRlbmQoITAsZyx7bmFtZXNwYWNlOmUsd2lkZ2V0TmFtZTpiLHdpZGdldEV2ZW50UHJlZml4OmFbZV1bYl0ucHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4fHxiLHdpZGdldEJhc2VDbGFzczpmfSxkKSxhLndpZGdldC5icmlkZ2UoYixhW2VdW2JdKX0sYS53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGMsZCl7YS5mbltjXT1mdW5jdGlvbihlKXt2YXIgZj10eXBlb2YgZT09InN0cmluZyIsZz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaD10aGlzO2U9IWYmJmcubGVuZ3RoP2EuZXh0ZW5kLmFwcGx5KG51bGwsWyEwLGVdLmNvbmNhdChnKSk6ZTtpZihmJiZlLmNoYXJBdCgwKT09PSJfIilyZXR1cm4gaDtmP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEuZGF0YSh0aGlzLGMpLGY9ZCYmYS5pc0Z1bmN0aW9uKGRbZV0pP2RbZV0uYXBwbHkoZCxnKTpkO2lmKGYhPT1kJiZmIT09Yil7aD1mO3JldHVybiExfX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEuZGF0YSh0aGlzLGMpO2I/Yi5vcHRpb24oZXx8e30pLl9pbml0KCk6YS5kYXRhKHRoaXMsYyxuZXcgZChlLHRoaXMpKX0pO3JldHVybiBofX0sYS5XaWRnZXQ9ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX0sYS5XaWRnZXQucHJvdG90eXBlPXt3aWRnZXROYW1lOiJ3aWRnZXQiLHdpZGdldEV2ZW50UHJlZml4OiIiLG9wdGlvbnM6e2Rpc2FibGVkOiExfSxfY3JlYXRlV2lkZ2V0OmZ1bmN0aW9uKGIsYyl7YS5kYXRhKGMsdGhpcy53aWRnZXROYW1lLHRoaXMpLHRoaXMuZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCghMCx7fSx0aGlzLm9wdGlvbnMsdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLGIpO3ZhciBkPXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoInJlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbigpe2QuZGVzdHJveSgpfSksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIiksdGhpcy5faW5pdCgpfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3JldHVybiBhLm1ldGFkYXRhJiZhLm1ldGFkYXRhLmdldCh0aGlzLmVsZW1lbnRbMF0pW3RoaXMud2lkZ2V0TmFtZV19LF9jcmVhdGU6ZnVuY3Rpb24oKXt9LF9pbml0OmZ1bmN0aW9uKCl7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSksdGhpcy53aWRnZXQoKS51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQgIisidWktc3RhdGUtZGlzYWJsZWQiKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudH0sb3B0aW9uOmZ1bmN0aW9uKGMsZCl7dmFyIGU9YztpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4gYS5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZih0eXBlb2YgYz09InN0cmluZyIpe2lmKGQ9PT1iKXJldHVybiB0aGlzLm9wdGlvbnNbY107ZT17fSxlW2NdPWR9dGhpcy5fc2V0T3B0aW9ucyhlKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczthLmVhY2goYixmdW5jdGlvbihhLGIpe2MuX3NldE9wdGlvbihhLGIpfSk7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXt0aGlzLm9wdGlvbnNbYV09YixhPT09ImRpc2FibGVkIiYmdGhpcy53aWRnZXQoKVtiPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0odGhpcy53aWRnZXRCYXNlQ2xhc3MrIi1kaXNhYmxlZCIrIiAiKyJ1aS1zdGF0ZS1kaXNhYmxlZCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLGIpO3JldHVybiB0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCEwKX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZz10aGlzLm9wdGlvbnNbYl07ZD1kfHx7fSxjPWEuRXZlbnQoYyksYy50eXBlPShiPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9iOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrYikudG9Mb3dlckNhc2UoKSxjLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sZj1jLm9yaWdpbmFsRXZlbnQ7aWYoZilmb3IoZSBpbiBmKWUgaW4gY3x8KGNbZV09ZltlXSk7dGhpcy5lbGVtZW50LnRyaWdnZXIoYyxkKTtyZXR1cm4hKGEuaXNGdW5jdGlvbihnKSYmZy5jYWxsKHRoaXMuZWxlbWVudFswXSxjLGQpPT09ITF8fGMuaXNEZWZhdWx0UHJldmVudGVkKCkpfX19KShqUXVlcnkpOy8qIQogKiBqUXVlcnkgVUkgTW91c2UgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9Nb3VzZQogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLyhmdW5jdGlvbihhLGIpe3ZhciBjPSExO2EoZG9jdW1lbnQpLm1vdXNldXAoZnVuY3Rpb24oYSl7Yz0hMX0pLGEud2lkZ2V0KCJ1aS5tb3VzZSIse29wdGlvbnM6e2NhbmNlbDoiOmlucHV0LG9wdGlvbiIsZGlzdGFuY2U6MSxkZWxheTowfSxfbW91c2VJbml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgibW91c2Vkb3duLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGEpe3JldHVybiBiLl9tb3VzZURvd24oYSl9KS5iaW5kKCJjbGljay4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihjKXtpZighMD09PWEuZGF0YShjLnRhcmdldCxiLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpKXthLnJlbW92ZURhdGEoYy50YXJnZXQsYi53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSxjLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3JldHVybiExfX0pLHRoaXMuc3RhcnRlZD0hMX0sX21vdXNlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSl9LF9tb3VzZURvd246ZnVuY3Rpb24oYil7aWYoIWMpe3RoaXMuX21vdXNlU3RhcnRlZCYmdGhpcy5fbW91c2VVcChiKSx0aGlzLl9tb3VzZURvd25FdmVudD1iO3ZhciBkPXRoaXMsZT1iLndoaWNoPT0xLGY9dHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWw9PSJzdHJpbmciJiZiLnRhcmdldC5ub2RlTmFtZT9hKGIudGFyZ2V0KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDohMTtpZighZXx8Znx8IXRoaXMuX21vdXNlQ2FwdHVyZShiKSlyZXR1cm4hMDt0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheSx0aGlzLm1vdXNlRGVsYXlNZXR8fCh0aGlzLl9tb3VzZURlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2QubW91c2VEZWxheU1ldD0hMH0sdGhpcy5vcHRpb25zLmRlbGF5KSk7aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChiKSYmdGhpcy5fbW91c2VEZWxheU1ldChiKSl7dGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQoYikhPT0hMTtpZighdGhpcy5fbW91c2VTdGFydGVkKXtiLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuITB9fSEwPT09YS5kYXRhKGIudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikmJmEucmVtb3ZlRGF0YShiLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBkLl9tb3VzZU1vdmUoYSl9LHRoaXMuX21vdXNlVXBEZWxlZ2F0ZT1mdW5jdGlvbihhKXtyZXR1cm4gZC5fbW91c2VVcChhKX0sYShkb2N1bWVudCkuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksYi5wcmV2ZW50RGVmYXVsdCgpLGM9ITA7cmV0dXJuITB9fSxfbW91c2VNb3ZlOmZ1bmN0aW9uKGIpe2lmKGEuYnJvd3Nlci5tc2llJiYhKGRvY3VtZW50LmRvY3VtZW50TW9kZT49OSkmJiFiLmJ1dHRvbilyZXR1cm4gdGhpcy5fbW91c2VVcChiKTtpZih0aGlzLl9tb3VzZVN0YXJ0ZWQpe3RoaXMuX21vdXNlRHJhZyhiKTtyZXR1cm4gYi5wcmV2ZW50RGVmYXVsdCgpfXRoaXMuX21vdXNlRGlzdGFuY2VNZXQoYikmJnRoaXMuX21vdXNlRGVsYXlNZXQoYikmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0aGlzLl9tb3VzZURvd25FdmVudCxiKSE9PSExLHRoaXMuX21vdXNlU3RhcnRlZD90aGlzLl9tb3VzZURyYWcoYik6dGhpcy5fbW91c2VVcChiKSk7cmV0dXJuIXRoaXMuX21vdXNlU3RhcnRlZH0sX21vdXNlVXA6ZnVuY3Rpb24oYil7YShkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLnVuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLHRoaXMuX21vdXNlU3RhcnRlZCYmKHRoaXMuX21vdXNlU3RhcnRlZD0hMSxiLnRhcmdldD09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0JiZhLmRhdGEoYi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiLCEwKSx0aGlzLl9tb3VzZVN0b3AoYikpO3JldHVybiExfSxfbW91c2VEaXN0YW5jZU1ldDpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVgtYS5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVktYS5wYWdlWSkpPj10aGlzLm9wdGlvbnMuZGlzdGFuY2V9LF9tb3VzZURlbGF5TWV0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1vdXNlRGVsYXlNZXR9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGEpe30sX21vdXNlRHJhZzpmdW5jdGlvbihhKXt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYSl7fSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGEpe3JldHVybiEwfX0pfSkoalF1ZXJ5KTsvKgogKiBqUXVlcnkgVUkgUG9zaXRpb24gMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9Qb3NpdGlvbgogKi8oZnVuY3Rpb24oYSxiKXthLnVpPWEudWl8fHt9O3ZhciBjPS9sZWZ0fGNlbnRlcnxyaWdodC8sZD0vdG9wfGNlbnRlcnxib3R0b20vLGU9ImNlbnRlciIsZj17fSxnPWEuZm4ucG9zaXRpb24saD1hLmZuLm9mZnNldDthLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKGIpe2lmKCFifHwhYi5vZilyZXR1cm4gZy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yj1hLmV4dGVuZCh7fSxiKTt2YXIgaD1hKGIub2YpLGk9aFswXSxqPShiLmNvbGxpc2lvbnx8ImZsaXAiKS5zcGxpdCgiICIpLGs9Yi5vZmZzZXQ/Yi5vZmZzZXQuc3BsaXQoIiAiKTpbMCwwXSxsLG0sbjtpLm5vZGVUeXBlPT09OT8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDowLGxlZnQ6MH0pOmkuc2V0VGltZW91dD8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDpoLnNjcm9sbFRvcCgpLGxlZnQ6aC5zY3JvbGxMZWZ0KCl9KTppLnByZXZlbnREZWZhdWx0PyhiLmF0PSJsZWZ0IHRvcCIsbD1tPTAsbj17dG9wOmIub2YucGFnZVksbGVmdDpiLm9mLnBhZ2VYfSk6KGw9aC5vdXRlcldpZHRoKCksbT1oLm91dGVySGVpZ2h0KCksbj1oLm9mZnNldCgpKSxhLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgYT0oYlt0aGlzXXx8IiIpLnNwbGl0KCIgIik7YS5sZW5ndGg9PT0xJiYoYT1jLnRlc3QoYVswXSk/YS5jb25jYXQoW2VdKTpkLnRlc3QoYVswXSk/W2VdLmNvbmNhdChhKTpbZSxlXSksYVswXT1jLnRlc3QoYVswXSk/YVswXTplLGFbMV09ZC50ZXN0KGFbMV0pP2FbMV06ZSxiW3RoaXNdPWF9KSxqLmxlbmd0aD09PTEmJihqWzFdPWpbMF0pLGtbMF09cGFyc2VJbnQoa1swXSwxMCl8fDAsay5sZW5ndGg9PT0xJiYoa1sxXT1rWzBdKSxrWzFdPXBhcnNlSW50KGtbMV0sMTApfHwwLGIuYXRbMF09PT0icmlnaHQiP24ubGVmdCs9bDpiLmF0WzBdPT09ZSYmKG4ubGVmdCs9bC8yKSxiLmF0WzFdPT09ImJvdHRvbSI/bi50b3ArPW06Yi5hdFsxXT09PWUmJihuLnRvcCs9bS8yKSxuLmxlZnQrPWtbMF0sbi50b3ArPWtbMV07cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLm91dGVyV2lkdGgoKSxnPWMub3V0ZXJIZWlnaHQoKSxoPXBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpbkxlZnQiLCEwKSl8fDAsaT1wYXJzZUludChhLmN1ckNTUyh0aGlzLCJtYXJnaW5Ub3AiLCEwKSl8fDAsbz1kK2grKHBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpblJpZ2h0IiwhMCkpfHwwKSxwPWcraSsocGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luQm90dG9tIiwhMCkpfHwwKSxxPWEuZXh0ZW5kKHt9LG4pLHI7Yi5teVswXT09PSJyaWdodCI/cS5sZWZ0LT1kOmIubXlbMF09PT1lJiYocS5sZWZ0LT1kLzIpLGIubXlbMV09PT0iYm90dG9tIj9xLnRvcC09ZzpiLm15WzFdPT09ZSYmKHEudG9wLT1nLzIpLGYuZnJhY3Rpb25zfHwocS5sZWZ0PU1hdGgucm91bmQocS5sZWZ0KSxxLnRvcD1NYXRoLnJvdW5kKHEudG9wKSkscj17bGVmdDpxLmxlZnQtaCx0b3A6cS50b3AtaX0sYS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGMsZSl7YS51aS5wb3NpdGlvbltqW2NdXSYmYS51aS5wb3NpdGlvbltqW2NdXVtlXShxLHt0YXJnZXRXaWR0aDpsLHRhcmdldEhlaWdodDptLGVsZW1XaWR0aDpkLGVsZW1IZWlnaHQ6Zyxjb2xsaXNpb25Qb3NpdGlvbjpyLGNvbGxpc2lvbldpZHRoOm8sY29sbGlzaW9uSGVpZ2h0OnAsb2Zmc2V0OmssbXk6Yi5teSxhdDpiLmF0fSl9KSxhLmZuLmJnaWZyYW1lJiZjLmJnaWZyYW1lKCksYy5vZmZzZXQoYS5leHRlbmQocSx7dXNpbmc6Yi51c2luZ30pKX0pfSxhLnVpLnBvc2l0aW9uPXtmaXQ6e2xlZnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHdpbmRvdyksZT1jLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQrYy5jb2xsaXNpb25XaWR0aC1kLndpZHRoKCktZC5zY3JvbGxMZWZ0KCk7Yi5sZWZ0PWU+MD9iLmxlZnQtZTpNYXRoLm1heChiLmxlZnQtYy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0LGIubGVmdCl9LHRvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEod2luZG93KSxlPWMuY29sbGlzaW9uUG9zaXRpb24udG9wK2MuY29sbGlzaW9uSGVpZ2h0LWQuaGVpZ2h0KCktZC5zY3JvbGxUb3AoKTtiLnRvcD1lPjA/Yi50b3AtZTpNYXRoLm1heChiLnRvcC1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcCxiLnRvcCl9fSxmbGlwOntsZWZ0OmZ1bmN0aW9uKGIsYyl7aWYoYy5hdFswXSE9PWUpe3ZhciBkPWEod2luZG93KSxmPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdCtjLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKSxnPWMubXlbMF09PT0ibGVmdCI/LWMuZWxlbVdpZHRoOmMubXlbMF09PT0icmlnaHQiP2MuZWxlbVdpZHRoOjAsaD1jLmF0WzBdPT09ImxlZnQiP2MudGFyZ2V0V2lkdGg6LWMudGFyZ2V0V2lkdGgsaT0tMipjLm9mZnNldFswXTtiLmxlZnQrPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdDwwP2craCtpOmY+MD9nK2graTowfX0sdG9wOmZ1bmN0aW9uKGIsYyl7aWYoYy5hdFsxXSE9PWUpe3ZhciBkPWEod2luZG93KSxmPWMuY29sbGlzaW9uUG9zaXRpb24udG9wK2MuY29sbGlzaW9uSGVpZ2h0LWQuaGVpZ2h0KCktZC5zY3JvbGxUb3AoKSxnPWMubXlbMV09PT0idG9wIj8tYy5lbGVtSGVpZ2h0OmMubXlbMV09PT0iYm90dG9tIj9jLmVsZW1IZWlnaHQ6MCxoPWMuYXRbMV09PT0idG9wIj9jLnRhcmdldEhlaWdodDotYy50YXJnZXRIZWlnaHQsaT0tMipjLm9mZnNldFsxXTtiLnRvcCs9Yy5jb2xsaXNpb25Qb3NpdGlvbi50b3A8MD9nK2graTpmPjA/ZytoK2k6MH19fX0sYS5vZmZzZXQuc2V0T2Zmc2V0fHwoYS5vZmZzZXQuc2V0T2Zmc2V0PWZ1bmN0aW9uKGIsYyl7L3N0YXRpYy8udGVzdChhLmN1ckNTUyhiLCJwb3NpdGlvbiIpKSYmKGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGQ9YShiKSxlPWQub2Zmc2V0KCksZj1wYXJzZUludChhLmN1ckNTUyhiLCJ0b3AiLCEwKSwxMCl8fDAsZz1wYXJzZUludChhLmN1ckNTUyhiLCJsZWZ0IiwhMCksMTApfHwwLGg9e3RvcDpjLnRvcC1lLnRvcCtmLGxlZnQ6Yy5sZWZ0LWUubGVmdCtnfTsidXNpbmciaW4gYz9jLnVzaW5nLmNhbGwoYixoKTpkLmNzcyhoKX0sYS5mbi5vZmZzZXQ9ZnVuY3Rpb24oYil7dmFyIGM9dGhpc1swXTtpZighY3x8IWMub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXthLm9mZnNldC5zZXRPZmZzZXQodGhpcyxiKX0pO3JldHVybiBoLmNhbGwodGhpcyl9KSxmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLGUsZyxoLGk7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGI/ImRpdiI6ImJvZHkiKSxnPXt2aXNpYmlsaXR5OiJoaWRkZW4iLHdpZHRoOjAsaGVpZ2h0OjAsYm9yZGVyOjAsbWFyZ2luOjAsYmFja2dyb3VuZDoibm9uZSJ9LGImJmpRdWVyeS5leHRlbmQoZyx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiItMTAwMHB4Iix0b3A6Ii0xMDAwcHgifSk7Zm9yKHZhciBqIGluIGcpZC5zdHlsZVtqXT1nW2pdO2QuYXBwZW5kQ2hpbGQoYyksZT1ifHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAxMC43NDMyMjIycHg7IHRvcDogMTAuNDMyMzI1cHg7IGhlaWdodDogMzBweDsgd2lkdGg6IDIwMXB4OyIsaD1hKGMpLm9mZnNldChmdW5jdGlvbihhLGIpe3JldHVybiBifSkub2Zmc2V0KCksZC5pbm5lckhUTUw9IiIsZS5yZW1vdmVDaGlsZChkKSxpPWgudG9wK2gubGVmdCsoYj8yZTM6MCksZi5mcmFjdGlvbnM9aT4yMSYmaTwyMn0oKX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIERyYWdnYWJsZSAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0RyYWdnYWJsZXMKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LnVpLmNvcmUuanMKICoJanF1ZXJ5LnVpLm1vdXNlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovKGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLmRyYWdnYWJsZSIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6ImRyYWciLG9wdGlvbnM6e2FkZENsYXNzZXM6ITAsYXBwZW5kVG86InBhcmVudCIsYXhpczohMSxjb25uZWN0VG9Tb3J0YWJsZTohMSxjb250YWlubWVudDohMSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OiExLGdyaWQ6ITEsaGFuZGxlOiExLGhlbHBlcjoib3JpZ2luYWwiLGlmcmFtZUZpeDohMSxvcGFjaXR5OiExLHJlZnJlc2hQb3NpdGlvbnM6ITEscmV2ZXJ0OiExLHJldmVydER1cmF0aW9uOjUwMCxzY29wZToiZGVmYXVsdCIsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNuYXA6ITEsc25hcE1vZGU6ImJvdGgiLHNuYXBUb2xlcmFuY2U6MjAsc3RhY2s6ITEsekluZGV4OiExfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmhlbHBlcj09Im9yaWdpbmFsIiYmIS9eKD86cnxhfGYpLy50ZXN0KHRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIikpJiYodGhpcy5lbGVtZW50WzBdLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHRoaXMub3B0aW9ucy5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZSIpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9tb3VzZUluaXQoKX0sZGVzdHJveTpmdW5jdGlvbigpe2lmKCEhdGhpcy5lbGVtZW50LmRhdGEoImRyYWdnYWJsZSIpKXt0aGlzLmVsZW1lbnQucmVtb3ZlRGF0YSgiZHJhZ2dhYmxlIikudW5iaW5kKCIuZHJhZ2dhYmxlIikucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZSB1aS1kcmFnZ2FibGUtZHJhZ2dpbmcgdWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VEZXN0cm95KCk7cmV0dXJuIHRoaXN9fSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucztpZih0aGlzLmhlbHBlcnx8Yy5kaXNhYmxlZHx8YShiLnRhcmdldCkuaXMoIi51aS1yZXNpemFibGUtaGFuZGxlIikpcmV0dXJuITE7dGhpcy5oYW5kbGU9dGhpcy5fZ2V0SGFuZGxlKGIpO2lmKCF0aGlzLmhhbmRsZSlyZXR1cm4hMTtjLmlmcmFtZUZpeCYmYShjLmlmcmFtZUZpeD09PSEwPyJpZnJhbWUiOmMuaWZyYW1lRml4KS5lYWNoKGZ1bmN0aW9uKCl7YSgnPGRpdiBjbGFzcz0idWktZHJhZ2dhYmxlLWlmcmFtZUZpeCIgc3R5bGU9ImJhY2tncm91bmQ6ICNmZmY7Ij48L2Rpdj4nKS5jc3Moe3dpZHRoOnRoaXMub2Zmc2V0V2lkdGgrInB4IixoZWlnaHQ6dGhpcy5vZmZzZXRIZWlnaHQrInB4Iixwb3NpdGlvbjoiYWJzb2x1dGUiLG9wYWNpdHk6IjAuMDAxIix6SW5kZXg6MWUzfSkuY3NzKGEodGhpcykub2Zmc2V0KCkpLmFwcGVuZFRvKCJib2R5Iil9KTtyZXR1cm4hMH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO3RoaXMuaGVscGVyPXRoaXMuX2NyZWF0ZUhlbHBlcihiKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksYS51aS5kZG1hbmFnZXImJihhLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMucG9zaXRpb25BYnM9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGIpLHRoaXMub3JpZ2luYWxQYWdlWD1iLnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT1iLnBhZ2VZLGMuY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoYy5jdXJzb3JBdCksYy5jb250YWlubWVudCYmdGhpcy5fc2V0Q29udGFpbm1lbnQoKTtpZih0aGlzLl90cmlnZ2VyKCJzdGFydCIsYik9PT0hMSl7dGhpcy5fY2xlYXIoKTtyZXR1cm4hMX10aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksYS51aS5kZG1hbmFnZXImJiFjLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsYiksdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuX21vdXNlRHJhZyhiLCEwKSxhLnVpLmRkbWFuYWdlciYmYS51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsYik7cmV0dXJuITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYixjKXt0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYiksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTtpZighYyl7dmFyIGQ9dGhpcy5fdWlIYXNoKCk7aWYodGhpcy5fdHJpZ2dlcigiZHJhZyIsYixkKT09PSExKXt0aGlzLl9tb3VzZVVwKHt9KTtyZXR1cm4hMX10aGlzLnBvc2l0aW9uPWQucG9zaXRpb259aWYoIXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLm9wdGlvbnMuYXhpcyE9InkiKXRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCI7aWYoIXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLm9wdGlvbnMuYXhpcyE9IngiKXRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiO2EudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYik7cmV0dXJuITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9ITE7YS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmKGM9YS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGIpKSx0aGlzLmRyb3BwZWQmJihjPXRoaXMuZHJvcHBlZCx0aGlzLmRyb3BwZWQ9ITEpO2lmKCghdGhpcy5lbGVtZW50WzBdfHwhdGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGUpJiZ0aGlzLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5yZXZlcnQ9PSJpbnZhbGlkIiYmIWN8fHRoaXMub3B0aW9ucy5yZXZlcnQ9PSJ2YWxpZCImJmN8fHRoaXMub3B0aW9ucy5yZXZlcnQ9PT0hMHx8YS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LGMpKXt2YXIgZD10aGlzO2EodGhpcy5oZWxwZXIpLmFuaW1hdGUodGhpcy5vcmlnaW5hbFBvc2l0aW9uLHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbiwxMCksZnVuY3Rpb24oKXtkLl90cmlnZ2VyKCJzdG9wIixiKSE9PSExJiZkLl9jbGVhcigpfSl9ZWxzZSB0aGlzLl90cmlnZ2VyKCJzdG9wIixiKSE9PSExJiZ0aGlzLl9jbGVhcigpO3JldHVybiExfSxfbW91c2VVcDpmdW5jdGlvbihiKXt0aGlzLm9wdGlvbnMuaWZyYW1lRml4PT09ITAmJmEoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLGIpO3JldHVybiBhLnVpLm1vdXNlLnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsYil9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKTtyZXR1cm4gdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbihiKXt2YXIgYz0hdGhpcy5vcHRpb25zLmhhbmRsZXx8IWEodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQpLmxlbmd0aD8hMDohMTthKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT1iLnRhcmdldCYmKGM9ITApfSk7cmV0dXJuIGN9LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9YS5pc0Z1bmN0aW9uKGMuaGVscGVyKT9hKGMuaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbYl0pKTpjLmhlbHBlcj09ImNsb25lIj90aGlzLmVsZW1lbnQuY2xvbmUoKS5yZW1vdmVBdHRyKCJpZCIpOnRoaXMuZWxlbWVudDtkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGQuYXBwZW5kVG8oYy5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yy5hcHBlbmRUbyksZFswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpJiZkLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpO3JldHVybiBkfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbihiKXt0eXBlb2YgYj09InN0cmluZyImJihiPWIuc3BsaXQoIiAiKSksYS5pc0FycmF5KGIpJiYoYj17bGVmdDorYlswXSx0b3A6K2JbMV18fDB9KSwibGVmdCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD1iLmxlZnQrdGhpcy5tYXJnaW5zLmxlZnQpLCJyaWdodCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLWIucmlnaHQrdGhpcy5tYXJnaW5zLmxlZnQpLCJ0b3AiaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD1iLnRvcCt0aGlzLm1hcmdpbnMudG9wKSwiYm90dG9tImluIGImJih0aGlzLm9mZnNldC5jbGljay50b3A9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtYi5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcCl9LF9nZXRQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLm9mZnNldFBhcmVudD10aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKTt2YXIgYj10aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKTt0aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYoYi5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksYi50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKTtpZih0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keXx8dGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSYmdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iaHRtbCImJmEuYnJvd3Nlci5tc2llKWI9e3RvcDowLGxlZnQ6MH07cmV0dXJue3RvcDpiLnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDpiLmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKHRoaXMuY3NzUG9zaXRpb249PSJyZWxhdGl2ZSIpe3ZhciBhPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpO3JldHVybnt0b3A6YS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OmEubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCl9fXJldHVybnt0b3A6MCxsZWZ0OjB9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCxyaWdodDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLDEwKXx8MCxib3R0b206cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luQm90dG9tIiksMTApfHwwfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5jb250YWlubWVudD09InBhcmVudCImJihiLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpO2lmKGIuY29udGFpbm1lbnQ9PSJkb2N1bWVudCJ8fGIuY29udGFpbm1lbnQ9PSJ3aW5kb3ciKXRoaXMuY29udGFpbm1lbnQ9W2IuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/MDphKHdpbmRvdykuc2Nyb2xsTGVmdCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxUb3AoKS10aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcCwoYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxMZWZ0KCkpK2EoYi5jb250YWlubWVudD09ImRvY3VtZW50Ij9kb2N1bWVudDp3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxUb3AoKSkrKGEoYi5jb250YWlubWVudD09ImRvY3VtZW50Ij9kb2N1bWVudDp3aW5kb3cpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXTtpZighL14oZG9jdW1lbnR8d2luZG93fHBhcmVudCkkLy50ZXN0KGIuY29udGFpbm1lbnQpJiZiLmNvbnRhaW5tZW50LmNvbnN0cnVjdG9yIT1BcnJheSl7dmFyIGM9YShiLmNvbnRhaW5tZW50KSxkPWNbMF07aWYoIWQpcmV0dXJuO3ZhciBlPWMub2Zmc2V0KCksZj1hKGQpLmNzcygib3ZlcmZsb3ciKSE9ImhpZGRlbiI7dGhpcy5jb250YWlubWVudD1bKHBhcnNlSW50KGEoZCkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChhKGQpLmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApLChwYXJzZUludChhKGQpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChhKGQpLmNzcygicGFkZGluZ1RvcCIpLDEwKXx8MCksKGY/TWF0aC5tYXgoZC5zY3JvbGxXaWR0aCxkLm9mZnNldFdpZHRoKTpkLm9mZnNldFdpZHRoKS0ocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQtdGhpcy5tYXJnaW5zLnJpZ2h0LChmP01hdGgubWF4KGQuc2Nyb2xsSGVpZ2h0LGQub2Zmc2V0SGVpZ2h0KTpkLm9mZnNldEhlaWdodCktKHBhcnNlSW50KGEoZCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wLXRoaXMubWFyZ2lucy5ib3R0b21dLHRoaXMucmVsYXRpdmVfY29udGFpbmVyPWN9ZWxzZSBiLmNvbnRhaW5tZW50LmNvbnN0cnVjdG9yPT1BcnJheSYmKHRoaXMuY29udGFpbm1lbnQ9Yi5jb250YWlubWVudCl9LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbihiLGMpe2N8fChjPXRoaXMucG9zaXRpb24pO3ZhciBkPWI9PSJhYnNvbHV0ZSI/MTotMSxlPXRoaXMub3B0aW9ucyxmPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZz0vKGh0bWx8Ym9keSkvaS50ZXN0KGZbMF0udGFnTmFtZSk7cmV0dXJue3RvcDpjLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AqZCt0aGlzLm9mZnNldC5wYXJlbnQudG9wKmQtKGEuYnJvd3Nlci5zYWZhcmkmJmEuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpnPzA6Zi5zY3JvbGxUb3AoKSkqZCksbGVmdDpjLmxlZnQrdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCpkK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KmQtKGEuYnJvd3Nlci5zYWZhcmkmJmEuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6Zz8wOmYuc2Nyb2xsTGVmdCgpKSpkKX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZT0vKGh0bWx8Ym9keSkvaS50ZXN0KGRbMF0udGFnTmFtZSksZj1iLnBhZ2VYLGc9Yi5wYWdlWTtpZih0aGlzLm9yaWdpbmFsUG9zaXRpb24pe3ZhciBoO2lmKHRoaXMuY29udGFpbm1lbnQpe2lmKHRoaXMucmVsYXRpdmVfY29udGFpbmVyKXt2YXIgaT10aGlzLnJlbGF0aXZlX2NvbnRhaW5lci5vZmZzZXQoKTtoPVt0aGlzLmNvbnRhaW5tZW50WzBdK2kubGVmdCx0aGlzLmNvbnRhaW5tZW50WzFdK2kudG9wLHRoaXMuY29udGFpbm1lbnRbMl0raS5sZWZ0LHRoaXMuY29udGFpbm1lbnRbM10raS50b3BdfWVsc2UgaD10aGlzLmNvbnRhaW5tZW50O2IucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDxoWzBdJiYoZj1oWzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPGhbMV0mJihnPWhbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSxiLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aFsyXSYmKGY9aFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxiLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD5oWzNdJiYoZz1oWzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCl9aWYoYy5ncmlkKXt2YXIgaj1jLmdyaWRbMV0/dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKGctdGhpcy5vcmlnaW5hbFBhZ2VZKS9jLmdyaWRbMV0pKmMuZ3JpZFsxXTp0aGlzLm9yaWdpbmFsUGFnZVk7Zz1oP2otdGhpcy5vZmZzZXQuY2xpY2sudG9wPGhbMV18fGotdGhpcy5vZmZzZXQuY2xpY2sudG9wPmhbM10/ai10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXT9qK2MuZ3JpZFsxXTpqLWMuZ3JpZFsxXTpqOmo7dmFyIGs9Yy5ncmlkWzBdP3RoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChmLXRoaXMub3JpZ2luYWxQYWdlWCkvYy5ncmlkWzBdKSpjLmdyaWRbMF06dGhpcy5vcmlnaW5hbFBhZ2VYO2Y9aD9rLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aFswXXx8ay10aGlzLm9mZnNldC5jbGljay5sZWZ0PmhbMl0/ay10aGlzLm9mZnNldC5jbGljay5sZWZ0PGhbMF0/aytjLmdyaWRbMF06ay1jLmdyaWRbMF06azprfX1yZXR1cm57dG9wOmctdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKyhhLmJyb3dzZXIuc2FmYXJpJiZhLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTplPzA6ZC5zY3JvbGxUb3AoKSksbGVmdDpmLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6dGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOmU/MDpkLnNjcm9sbExlZnQoKSl9fSxfY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlci5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlLWRyYWdnaW5nIiksdGhpcy5oZWxwZXJbMF0hPXRoaXMuZWxlbWVudFswXSYmIXRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbCYmdGhpcy5oZWxwZXIucmVtb3ZlKCksdGhpcy5oZWxwZXI9bnVsbCx0aGlzLmNhbmNlbEhlbHBlclJlbW92YWw9ITF9LF90cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkKXtkPWR8fHRoaXMuX3VpSGFzaCgpLGEudWkucGx1Z2luLmNhbGwodGhpcyxiLFtjLGRdKSxiPT0iZHJhZyImJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpKTtyZXR1cm4gYS5XaWRnZXQucHJvdG90eXBlLl90cmlnZ2VyLmNhbGwodGhpcyxiLGMsZCl9LHBsdWdpbnM6e30sX3VpSGFzaDpmdW5jdGlvbihhKXtyZXR1cm57aGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sb3JpZ2luYWxQb3NpdGlvbjp0aGlzLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0OnRoaXMucG9zaXRpb25BYnN9fX0pLGEuZXh0ZW5kKGEudWkuZHJhZ2dhYmxlLHt2ZXJzaW9uOiIxLjguMTcifSksYS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjb25uZWN0VG9Tb3J0YWJsZSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWQub3B0aW9ucyxmPWEuZXh0ZW5kKHt9LGMse2l0ZW06ZC5lbGVtZW50fSk7ZC5zb3J0YWJsZXM9W10sYShlLmNvbm5lY3RUb1NvcnRhYmxlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YS5kYXRhKHRoaXMsInNvcnRhYmxlIik7YyYmIWMub3B0aW9ucy5kaXNhYmxlZCYmKGQuc29ydGFibGVzLnB1c2goe2luc3RhbmNlOmMsc2hvdWxkUmV2ZXJ0OmMub3B0aW9ucy5yZXZlcnR9KSxjLnJlZnJlc2hQb3NpdGlvbnMoKSxjLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYixmKSl9KX0sc3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1hLmV4dGVuZCh7fSxjLHtpdGVtOmQuZWxlbWVudH0pO2EuZWFjaChkLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMuaW5zdGFuY2UuaXNPdmVyPyh0aGlzLmluc3RhbmNlLmlzT3Zlcj0wLGQuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCx0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5zaG91bGRSZXZlcnQmJih0aGlzLmluc3RhbmNlLm9wdGlvbnMucmV2ZXJ0PSEwKSx0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoYiksdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcixkLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiJiZ0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLmNzcyh7dG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pKToodGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSExLHRoaXMuaW5zdGFuY2UuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGIsZSkpfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9dGhpcyxmPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCxkPXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsZT10aGlzLnBvc2l0aW9uQWJzLnRvcCxmPXRoaXMucG9zaXRpb25BYnMubGVmdCxnPWIuaGVpZ2h0LGg9Yi53aWR0aCxpPWIudG9wLGo9Yi5sZWZ0O3JldHVybiBhLnVpLmlzT3ZlcihlK2MsZitkLGksaixnLGgpfTthLmVhY2goZC5zb3J0YWJsZXMsZnVuY3Rpb24oZil7dGhpcy5pbnN0YW5jZS5wb3NpdGlvbkFicz1kLnBvc2l0aW9uQWJzLHRoaXMuaW5zdGFuY2UuaGVscGVyUHJvcG9ydGlvbnM9ZC5oZWxwZXJQcm9wb3J0aW9ucyx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljaz1kLm9mZnNldC5jbGljayx0aGlzLmluc3RhbmNlLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmluc3RhbmNlLmNvbnRhaW5lckNhY2hlKT8odGhpcy5pbnN0YW5jZS5pc092ZXJ8fCh0aGlzLmluc3RhbmNlLmlzT3Zlcj0xLHRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW09YShlKS5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIikuYXBwZW5kVG8odGhpcy5pbnN0YW5jZS5lbGVtZW50KS5kYXRhKCJzb3J0YWJsZS1pdGVtIiwhMCksdGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlcix0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGMuaGVscGVyWzBdfSxiLnRhcmdldD10aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtWzBdLHRoaXMuaW5zdGFuY2UuX21vdXNlQ2FwdHVyZShiLCEwKSx0aGlzLmluc3RhbmNlLl9tb3VzZVN0YXJ0KGIsITAsITApLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrLnRvcD1kLm9mZnNldC5jbGljay50b3AsdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2subGVmdD1kLm9mZnNldC5jbGljay5sZWZ0LHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0LT1kLm9mZnNldC5wYXJlbnQubGVmdC10aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQubGVmdCx0aGlzLmluc3RhbmNlLm9mZnNldC5wYXJlbnQudG9wLT1kLm9mZnNldC5wYXJlbnQudG9wLXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AsZC5fdHJpZ2dlcigidG9Tb3J0YWJsZSIsYiksZC5kcm9wcGVkPXRoaXMuaW5zdGFuY2UuZWxlbWVudCxkLmN1cnJlbnRJdGVtPWQuZWxlbWVudCx0aGlzLmluc3RhbmNlLmZyb21PdXRzaWRlPWQpLHRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0mJnRoaXMuaW5zdGFuY2UuX21vdXNlRHJhZyhiKSk6dGhpcy5pbnN0YW5jZS5pc092ZXImJih0aGlzLmluc3RhbmNlLmlzT3Zlcj0wLHRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCx0aGlzLmluc3RhbmNlLm9wdGlvbnMucmV2ZXJ0PSExLHRoaXMuaW5zdGFuY2UuX3RyaWdnZXIoIm91dCIsYix0aGlzLmluc3RhbmNlLl91aUhhc2godGhpcy5pbnN0YW5jZSkpLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChiLCEwKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyLHRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0ucmVtb3ZlKCksdGhpcy5pbnN0YW5jZS5wbGFjZWhvbGRlciYmdGhpcy5pbnN0YW5jZS5wbGFjZWhvbGRlci5yZW1vdmUoKSxkLl90cmlnZ2VyKCJmcm9tU29ydGFibGUiLGIpLGQuZHJvcHBlZD0hMSl9KX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImN1cnNvciIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSgiYm9keSIpLGU9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuY3NzKCJjdXJzb3IiKSYmKGUuX2N1cnNvcj1kLmNzcygiY3Vyc29yIikpLGQuY3NzKCJjdXJzb3IiLGUuY3Vyc29yKX0sc3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztkLl9jdXJzb3ImJmEoImJvZHkiKS5jc3MoImN1cnNvciIsZC5fY3Vyc29yKX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsIm9wYWNpdHkiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEoYy5oZWxwZXIpLGU9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuY3NzKCJvcGFjaXR5IikmJihlLl9vcGFjaXR5PWQuY3NzKCJvcGFjaXR5IikpLGQuY3NzKCJvcGFjaXR5IixlLm9wYWNpdHkpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuX29wYWNpdHkmJmEoYy5oZWxwZXIpLmNzcygib3BhY2l0eSIsZC5fb3BhY2l0eSl9fSksYS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzY3JvbGwiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIik7ZC5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZkLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCImJihkLm92ZXJmbG93T2Zmc2V0PWQuc2Nyb2xsUGFyZW50Lm9mZnNldCgpKX0sZHJhZzpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1kLm9wdGlvbnMsZj0hMTtpZihkLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIil7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieCIpZC5vdmVyZmxvd09mZnNldC50b3ArZC5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0LWIucGFnZVk8ZS5zY3JvbGxTZW5zaXRpdml0eT9kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3ArZS5zY3JvbGxTcGVlZDpiLnBhZ2VZLWQub3ZlcmZsb3dPZmZzZXQudG9wPGUuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AtZS5zY3JvbGxTcGVlZCk7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieSIpZC5vdmVyZmxvd09mZnNldC5sZWZ0K2Quc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoLWIucGFnZVg8ZS5zY3JvbGxTZW5zaXRpdml0eT9kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PWY9ZC5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdCtlLnNjcm9sbFNwZWVkOmIucGFnZVgtZC5vdmVyZmxvd09mZnNldC5sZWZ0PGUuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PWY9ZC5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdC1lLnNjcm9sbFNwZWVkKX1lbHNle2lmKCFlLmF4aXN8fGUuYXhpcyE9IngiKWIucGFnZVktYShkb2N1bWVudCkuc2Nyb2xsVG9wKCk8ZS5zY3JvbGxTZW5zaXRpdml0eT9mPWEoZG9jdW1lbnQpLnNjcm9sbFRvcChhKGRvY3VtZW50KS5zY3JvbGxUb3AoKS1lLnNjcm9sbFNwZWVkKTphKHdpbmRvdykuaGVpZ2h0KCktKGIucGFnZVktYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkpPGUuc2Nyb2xsU2Vuc2l0aXZpdHkmJihmPWEoZG9jdW1lbnQpLnNjcm9sbFRvcChhKGRvY3VtZW50KS5zY3JvbGxUb3AoKStlLnNjcm9sbFNwZWVkKSk7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieSIpYi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk8ZS5zY3JvbGxTZW5zaXRpdml0eT9mPWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpLWUuc2Nyb2xsU3BlZWQpOmEod2luZG93KS53aWR0aCgpLShiLnBhZ2VYLWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSk8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGY9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkrZS5zY3JvbGxTcGVlZCkpfWYhPT0hMSYmYS51aS5kZG1hbmFnZXImJiFlLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGQsYil9fSksYS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzbmFwIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zO2Quc25hcEVsZW1lbnRzPVtdLGEoZS5zbmFwLmNvbnN0cnVjdG9yIT1TdHJpbmc/ZS5zbmFwLml0ZW1zfHwiOmRhdGEoZHJhZ2dhYmxlKSI6ZS5zbmFwKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxjPWIub2Zmc2V0KCk7dGhpcyE9ZC5lbGVtZW50WzBdJiZkLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsd2lkdGg6Yi5vdXRlcldpZHRoKCksaGVpZ2h0OmIub3V0ZXJIZWlnaHQoKSx0b3A6Yy50b3AsbGVmdDpjLmxlZnR9KX0pfSxkcmFnOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWQub3B0aW9ucyxmPWUuc25hcFRvbGVyYW5jZSxnPWMub2Zmc2V0LmxlZnQsaD1nK2QuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsaT1jLm9mZnNldC50b3Asaj1pK2QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0O2Zvcih2YXIgaz1kLnNuYXBFbGVtZW50cy5sZW5ndGgtMTtrPj0wO2stLSl7dmFyIGw9ZC5zbmFwRWxlbWVudHNba10ubGVmdCxtPWwrZC5zbmFwRWxlbWVudHNba10ud2lkdGgsbj1kLnNuYXBFbGVtZW50c1trXS50b3Asbz1uK2Quc25hcEVsZW1lbnRzW2tdLmhlaWdodDtpZighKGwtZjxnJiZnPG0rZiYmbi1mPGkmJmk8bytmfHxsLWY8ZyYmZzxtK2YmJm4tZjxqJiZqPG8rZnx8bC1mPGgmJmg8bStmJiZuLWY8aSYmaTxvK2Z8fGwtZjxoJiZoPG0rZiYmbi1mPGomJmo8bytmKSl7ZC5zbmFwRWxlbWVudHNba10uc25hcHBpbmcmJmQub3B0aW9ucy5zbmFwLnJlbGVhc2UmJmQub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2FsbChkLmVsZW1lbnQsYixhLmV4dGVuZChkLl91aUhhc2goKSx7c25hcEl0ZW06ZC5zbmFwRWxlbWVudHNba10uaXRlbX0pKSxkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZz0hMTtjb250aW51ZX1pZihlLnNuYXBNb2RlIT0iaW5uZXIiKXt2YXIgcD1NYXRoLmFicyhuLWopPD1mLHE9TWF0aC5hYnMoby1pKTw9ZixyPU1hdGguYWJzKGwtaCk8PWYscz1NYXRoLmFicyhtLWcpPD1mO3AmJihjLnBvc2l0aW9uLnRvcD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6bi1kLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtZC5tYXJnaW5zLnRvcCkscSYmKGMucG9zaXRpb24udG9wPWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpvLGxlZnQ6MH0pLnRvcC1kLm1hcmdpbnMudG9wKSxyJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bC1kLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1kLm1hcmdpbnMubGVmdCkscyYmKGMucG9zaXRpb24ubGVmdD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Om19KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KX12YXIgdD1wfHxxfHxyfHxzO2lmKGUuc25hcE1vZGUhPSJvdXRlciIpe3ZhciBwPU1hdGguYWJzKG4taSk8PWYscT1NYXRoLmFicyhvLWopPD1mLHI9TWF0aC5hYnMobC1nKTw9ZixzPU1hdGguYWJzKG0taCk8PWY7cCYmKGMucG9zaXRpb24udG9wPWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpuLGxlZnQ6MH0pLnRvcC1kLm1hcmdpbnMudG9wKSxxJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm8tZC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHImJihjLnBvc2l0aW9uLmxlZnQ9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsfSkubGVmdC1kLm1hcmdpbnMubGVmdCkscyYmKGMucG9zaXRpb24ubGVmdD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Om0tZC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQtZC5tYXJnaW5zLmxlZnQpfSFkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZyYmKHB8fHF8fHJ8fHN8fHQpJiZkLm9wdGlvbnMuc25hcC5zbmFwJiZkLm9wdGlvbnMuc25hcC5zbmFwLmNhbGwoZC5lbGVtZW50LGIsYS5leHRlbmQoZC5fdWlIYXNoKCkse3NuYXBJdGVtOmQuc25hcEVsZW1lbnRzW2tdLml0ZW19KSksZC5zbmFwRWxlbWVudHNba10uc25hcHBpbmc9cHx8cXx8cnx8c3x8dH19fSksYS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzdGFjayIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zLGU9YS5tYWtlQXJyYXkoYShkLnN0YWNrKSkuc29ydChmdW5jdGlvbihiLGMpe3JldHVybihwYXJzZUludChhKGIpLmNzcygiekluZGV4IiksMTApfHwwKS0ocGFyc2VJbnQoYShjKS5jc3MoInpJbmRleCIpLDEwKXx8MCl9KTtpZighIWUubGVuZ3RoKXt2YXIgZj1wYXJzZUludChlWzBdLnN0eWxlLnpJbmRleCl8fDA7YShlKS5lYWNoKGZ1bmN0aW9uKGEpe3RoaXMuc3R5bGUuekluZGV4PWYrYX0pLHRoaXNbMF0uc3R5bGUuekluZGV4PWYrZS5sZW5ndGh9fX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKGMuaGVscGVyKSxlPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztkLmNzcygiekluZGV4IikmJihlLl96SW5kZXg9ZC5jc3MoInpJbmRleCIpKSxkLmNzcygiekluZGV4IixlLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fekluZGV4JiZhKGMuaGVscGVyKS5jc3MoInpJbmRleCIsZC5fekluZGV4KX19KX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIERyb3BwYWJsZSAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0Ryb3BwYWJsZXMKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LnVpLmNvcmUuanMKICoJanF1ZXJ5LnVpLndpZGdldC5qcwogKglqcXVlcnkudWkubW91c2UuanMKICoJanF1ZXJ5LnVpLmRyYWdnYWJsZS5qcwogKi8oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuZHJvcHBhYmxlIix7d2lkZ2V0RXZlbnRQcmVmaXg6ImRyb3AiLG9wdGlvbnM6e2FjY2VwdDoiKiIsYWN0aXZlQ2xhc3M6ITEsYWRkQ2xhc3NlczohMCxncmVlZHk6ITEsaG92ZXJDbGFzczohMSxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zLGM9Yi5hY2NlcHQ7dGhpcy5pc292ZXI9MCx0aGlzLmlzb3V0PTEsdGhpcy5hY2NlcHQ9YS5pc0Z1bmN0aW9uKGMpP2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXMoYyl9LHRoaXMucHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH0sYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLnNjb3BlXT1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdfHxbXSxhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdLnB1c2godGhpcyksYi5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9YS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY109PXRoaXMmJmIuc3BsaWNlKGMsMSk7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgiZHJvcHBhYmxlIikudW5iaW5kKCIuZHJvcHBhYmxlIik7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT0iYWNjZXB0IiYmKHRoaXMuYWNjZXB0PWEuaXNGdW5jdGlvbihjKT9jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzKGMpfSksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLGMmJnRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixiLHRoaXMudWkoYykpfSxfZGVhY3RpdmF0ZTpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksYyYmdGhpcy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYix0aGlzLnVpKGMpKX0sX292ZXI6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDshIWMmJihjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpWzBdIT10aGlzLmVsZW1lbnRbMF0mJnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLGMuY3VycmVudEl0ZW18fGMuZWxlbWVudCkmJih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJvdmVyIixiLHRoaXMudWkoYykpKX0sX291dDpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50OyEhYyYmKGMuY3VycmVudEl0ZW18fGMuZWxlbWVudClbMF0hPXRoaXMuZWxlbWVudFswXSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsYix0aGlzLnVpKGMpKSl9LF9kcm9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9Y3x8YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighZHx8KGQuY3VycmVudEl0ZW18fGQuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm4hMTt2YXIgZT0hMTt0aGlzLmVsZW1lbnQuZmluZCgiOmRhdGEoZHJvcHBhYmxlKSIpLm5vdCgiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcywiZHJvcHBhYmxlIik7aWYoYi5vcHRpb25zLmdyZWVkeSYmIWIub3B0aW9ucy5kaXNhYmxlZCYmYi5vcHRpb25zLnNjb3BlPT1kLm9wdGlvbnMuc2NvcGUmJmIuYWNjZXB0LmNhbGwoYi5lbGVtZW50WzBdLGQuY3VycmVudEl0ZW18fGQuZWxlbWVudCkmJmEudWkuaW50ZXJzZWN0KGQsYS5leHRlbmQoYix7b2Zmc2V0OmIuZWxlbWVudC5vZmZzZXQoKX0pLGIub3B0aW9ucy50b2xlcmFuY2UpKXtlPSEwO3JldHVybiExfX0pO2lmKGUpcmV0dXJuITE7aWYodGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sZC5jdXJyZW50SXRlbXx8ZC5lbGVtZW50KSl7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJkcm9wIixiLHRoaXMudWkoZCkpO3JldHVybiB0aGlzLmVsZW1lbnR9cmV0dXJuITF9LHVpOmZ1bmN0aW9uKGEpe3JldHVybntkcmFnZ2FibGU6YS5jdXJyZW50SXRlbXx8YS5lbGVtZW50LGhlbHBlcjphLmhlbHBlcixwb3NpdGlvbjphLnBvc2l0aW9uLG9mZnNldDphLnBvc2l0aW9uQWJzfX19KSxhLmV4dGVuZChhLnVpLmRyb3BwYWJsZSx7dmVyc2lvbjoiMS44LjE3In0pLGEudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKGIsYyxkKXtpZighYy5vZmZzZXQpcmV0dXJuITE7dmFyIGU9KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQsZj1lK2IuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsZz0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wLGg9ZytiLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxpPWMub2Zmc2V0LmxlZnQsaj1pK2MucHJvcG9ydGlvbnMud2lkdGgsaz1jLm9mZnNldC50b3AsbD1rK2MucHJvcG9ydGlvbnMuaGVpZ2h0O3N3aXRjaChkKXtjYXNlImZpdCI6cmV0dXJuIGk8PWUmJmY8PWomJms8PWcmJmg8PWw7Y2FzZSJpbnRlcnNlY3QiOnJldHVybiBpPGUrYi5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZmLWIuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMjxqJiZrPGcrYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMiYmaC1iLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPGw7Y2FzZSJwb2ludGVyIjp2YXIgbT0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCsoYi5jbGlja09mZnNldHx8Yi5vZmZzZXQuY2xpY2spLmxlZnQsbj0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhiLmNsaWNrT2Zmc2V0fHxiLm9mZnNldC5jbGljaykudG9wLG89YS51aS5pc092ZXIobixtLGssaSxjLnByb3BvcnRpb25zLmhlaWdodCxjLnByb3BvcnRpb25zLndpZHRoKTtyZXR1cm4gbztjYXNlInRvdWNoIjpyZXR1cm4oZz49ayYmZzw9bHx8aD49ayYmaDw9bHx8ZzxrJiZoPmwpJiYoZT49aSYmZTw9anx8Zj49aSYmZjw9anx8ZTxpJiZmPmopO2RlZmF1bHQ6cmV0dXJuITF9fSxhLnVpLmRkbWFuYWdlcj17Y3VycmVudDpudWxsLGRyb3BwYWJsZXM6eyJkZWZhdWx0IjpbXX0scHJlcGFyZU9mZnNldHM6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iub3B0aW9ucy5zY29wZV18fFtdLGU9Yz9jLnR5cGU6bnVsbCxmPShiLmN1cnJlbnRJdGVtfHxiLmVsZW1lbnQpLmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5hbmRTZWxmKCk7ZHJvcHBhYmxlc0xvb3A6Zm9yKHZhciBnPTA7ZzxkLmxlbmd0aDtnKyspe2lmKGRbZ10ub3B0aW9ucy5kaXNhYmxlZHx8YiYmIWRbZ10uYWNjZXB0LmNhbGwoZFtnXS5lbGVtZW50WzBdLGIuY3VycmVudEl0ZW18fGIuZWxlbWVudCkpY29udGludWU7Zm9yKHZhciBoPTA7aDxmLmxlbmd0aDtoKyspaWYoZltoXT09ZFtnXS5lbGVtZW50WzBdKXtkW2ddLnByb3BvcnRpb25zLmhlaWdodD0wO2NvbnRpbnVlIGRyb3BwYWJsZXNMb29wfWRbZ10udmlzaWJsZT1kW2ddLmVsZW1lbnQuY3NzKCJkaXNwbGF5IikhPSJub25lIjtpZighZFtnXS52aXNpYmxlKWNvbnRpbnVlO2U9PSJtb3VzZWRvd24iJiZkW2ddLl9hY3RpdmF0ZS5jYWxsKGRbZ10sYyksZFtnXS5vZmZzZXQ9ZFtnXS5lbGVtZW50Lm9mZnNldCgpLGRbZ10ucHJvcG9ydGlvbnM9e3dpZHRoOmRbZ10uZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6ZFtnXS5lbGVtZW50WzBdLm9mZnNldEhlaWdodH19fSxkcm9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITE7YS5lYWNoKGEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXshdGhpcy5vcHRpb25zfHwoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZhLnVpLmludGVyc2VjdChiLHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSkmJihkPXRoaXMuX2Ryb3AuY2FsbCh0aGlzLGMpfHxkKSwhdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLGIuY3VycmVudEl0ZW18fGIuZWxlbWVudCkmJih0aGlzLmlzb3V0PTEsdGhpcy5pc292ZXI9MCx0aGlzLl9kZWFjdGl2YXRlLmNhbGwodGhpcyxjKSkpfSk7cmV0dXJuIGR9LGRyYWdTdGFydDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS5iaW5kKCJzY3JvbGwuZHJvcHBhYmxlIixmdW5jdGlvbigpe2Iub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zfHxhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhiLGMpfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXtiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9ucyYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKSxhLmVhY2goYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxmdW5jdGlvbigpe2lmKCEodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLmdyZWVkeUNoaWxkfHwhdGhpcy52aXNpYmxlKSl7dmFyIGQ9YS51aS5pbnRlcnNlY3QoYix0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpLGU9IWQmJnRoaXMuaXNvdmVyPT0xPyJpc291dCI6ZCYmdGhpcy5pc292ZXI9PTA/Imlzb3ZlciI6bnVsbDtpZighZSlyZXR1cm47dmFyIGY7aWYodGhpcy5vcHRpb25zLmdyZWVkeSl7dmFyIGc9dGhpcy5lbGVtZW50LnBhcmVudHMoIjpkYXRhKGRyb3BwYWJsZSk6ZXEoMCkiKTtnLmxlbmd0aCYmKGY9YS5kYXRhKGdbMF0sImRyb3BwYWJsZSIpLGYuZ3JlZWR5Q2hpbGQ9ZT09Imlzb3ZlciI/MTowKX1mJiZlPT0iaXNvdmVyIiYmKGYuaXNvdmVyPTAsZi5pc291dD0xLGYuX291dC5jYWxsKGYsYykpLHRoaXNbZV09MSx0aGlzW2U9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MCx0aGlzW2U9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYyksZiYmZT09Imlzb3V0IiYmKGYuaXNvdXQ9MCxmLmlzb3Zlcj0xLGYuX292ZXIuY2FsbChmLGMpKX19KX0sZHJhZ1N0b3A6ZnVuY3Rpb24oYixjKXtiLmVsZW1lbnQucGFyZW50cygiOm5vdChib2R5LGh0bWwpIikudW5iaW5kKCJzY3JvbGwuZHJvcHBhYmxlIiksYi5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGIsYyl9fX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIFJlc2l6YWJsZSAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Jlc2l6YWJsZXMKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LnVpLmNvcmUuanMKICoJanF1ZXJ5LnVpLm1vdXNlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovKGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnJlc2l6YWJsZSIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InJlc2l6ZSIsb3B0aW9uczp7YWxzb1Jlc2l6ZTohMSxhbmltYXRlOiExLGFuaW1hdGVEdXJhdGlvbjoic2xvdyIsYW5pbWF0ZUVhc2luZzoic3dpbmciLGFzcGVjdFJhdGlvOiExLGF1dG9IaWRlOiExLGNvbnRhaW5tZW50OiExLGdob3N0OiExLGdyaWQ6ITEsaGFuZGxlczoiZSxzLHNlIixoZWxwZXI6ITEsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTAsbWluV2lkdGg6MTAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKSxhLmV4dGVuZCh0aGlzLHtfYXNwZWN0UmF0aW86ISFjLmFzcGVjdFJhdGlvLGFzcGVjdFJhdGlvOmMuYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOmMuaGVscGVyfHxjLmdob3N0fHxjLmFuaW1hdGU/Yy5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkmJigvcmVsYXRpdmUvLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSkmJmEuYnJvd3Nlci5vcGVyYSYmdGhpcy5lbGVtZW50LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSksdGhpcy5lbGVtZW50LndyYXAoYSgnPGRpdiBjbGFzcz0idWktd3JhcHBlciIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47Ij48L2Rpdj4nKS5jc3Moe3Bvc2l0aW9uOnRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksd2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCksdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpLHRoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgicmVzaXphYmxlIix0aGlzLmVsZW1lbnQuZGF0YSgicmVzaXphYmxlIikpLHRoaXMuZWxlbWVudElzV3JhcHBlcj0hMCx0aGlzLmVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLG1hcmdpblRvcDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLG1hcmdpblJpZ2h0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSxtYXJnaW5Cb3R0b206dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKX0pLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luTGVmdDowLG1hcmdpblRvcDowLG1hcmdpblJpZ2h0OjAsbWFyZ2luQm90dG9tOjB9KSx0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGU9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsIm5vbmUiKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjoic3RhdGljIix6b29tOjEsZGlzcGxheToiYmxvY2sifSkpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luIil9KSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpKSx0aGlzLmhhbmRsZXM9Yy5oYW5kbGVzfHwoYSgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkubGVuZ3RoP3tuOiIudWktcmVzaXphYmxlLW4iLGU6Ii51aS1yZXNpemFibGUtZSIsczoiLnVpLXJlc2l6YWJsZS1zIix3OiIudWktcmVzaXphYmxlLXciLHNlOiIudWktcmVzaXphYmxlLXNlIixzdzoiLnVpLXJlc2l6YWJsZS1zdyIsbmU6Ii51aS1yZXNpemFibGUtbmUiLG53OiIudWktcmVzaXphYmxlLW53In06ImUscyxzZSIpO2lmKHRoaXMuaGFuZGxlcy5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt0aGlzLmhhbmRsZXM9PSJhbGwiJiYodGhpcy5oYW5kbGVzPSJuLGUscyx3LHNlLHN3LG5lLG53Iik7dmFyIGQ9dGhpcy5oYW5kbGVzLnNwbGl0KCIsIik7dGhpcy5oYW5kbGVzPXt9O2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1hLnRyaW0oZFtlXSksZz0idWktcmVzaXphYmxlLSIrZixoPWEoJzxkaXYgY2xhc3M9InVpLXJlc2l6YWJsZS1oYW5kbGUgJytnKyciPjwvZGl2PicpOy9zd3xzZXxuZXxudy8udGVzdChmKSYmaC5jc3Moe3pJbmRleDorK2MuekluZGV4fSksInNlIj09ZiYmaC5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZSIpLHRoaXMuaGFuZGxlc1tmXT0iLnVpLXJlc2l6YWJsZS0iK2YsdGhpcy5lbGVtZW50LmFwcGVuZChoKX19dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbihiKXtiPWJ8fHRoaXMuZWxlbWVudDtmb3IodmFyIGMgaW4gdGhpcy5oYW5kbGVzKXt0aGlzLmhhbmRsZXNbY10uY29uc3RydWN0b3I9PVN0cmluZyYmKHRoaXMuaGFuZGxlc1tjXT1hKHRoaXMuaGFuZGxlc1tjXSx0aGlzLmVsZW1lbnQpLnNob3coKSk7aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyJiZ0aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSl7dmFyIGQ9YSh0aGlzLmhhbmRsZXNbY10sdGhpcy5lbGVtZW50KSxlPTA7ZT0vc3d8bmV8bnd8c2V8bnxzLy50ZXN0KGMpP2Qub3V0ZXJIZWlnaHQoKTpkLm91dGVyV2lkdGgoKTt2YXIgZj1bInBhZGRpbmciLC9uZXxud3xuLy50ZXN0KGMpPyJUb3AiOi9zZXxzd3xzLy50ZXN0KGMpPyJCb3R0b20iOi9eZSQvLnRlc3QoYyk/IlJpZ2h0IjoiTGVmdCJdLmpvaW4oIiIpO2IuY3NzKGYsZSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1pZighYSh0aGlzLmhhbmRsZXNbY10pLmxlbmd0aCljb250aW51ZX19LHRoaXMuX3JlbmRlckF4aXModGhpcy5lbGVtZW50KSx0aGlzLl9oYW5kbGVzPWEoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmRpc2FibGVTZWxlY3Rpb24oKSx0aGlzLl9oYW5kbGVzLm1vdXNlb3ZlcihmdW5jdGlvbigpe2lmKCFiLnJlc2l6aW5nKXtpZih0aGlzLmNsYXNzTmFtZSl2YXIgYT10aGlzLmNsYXNzTmFtZS5tYXRjaCgvdWktcmVzaXphYmxlLShzZXxzd3xuZXxud3xufGV8c3x3KS9pKTtiLmF4aXM9YSYmYVsxXT9hWzFdOiJzZSJ9fSksYy5hdXRvSGlkZSYmKHRoaXMuX2hhbmRsZXMuaGlkZSgpLGEodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikuaG92ZXIoZnVuY3Rpb24oKXtjLmRpc2FibGVkfHwoYSh0aGlzKS5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIiksYi5faGFuZGxlcy5zaG93KCkpfSxmdW5jdGlvbigpe2MuZGlzYWJsZWR8fGIucmVzaXppbmd8fChhKHRoaXMpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxiLl9oYW5kbGVzLmhpZGUoKSl9KSksdGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgYj1mdW5jdGlvbihiKXthKGIpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCl9O2lmKHRoaXMuZWxlbWVudElzV3JhcHBlcil7Yih0aGlzLmVsZW1lbnQpO3ZhciBjPXRoaXMuZWxlbWVudDtjLmFmdGVyKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246Yy5jc3MoInBvc2l0aW9uIiksd2lkdGg6Yy5vdXRlcldpZHRoKCksaGVpZ2h0OmMub3V0ZXJIZWlnaHQoKSx0b3A6Yy5jc3MoInRvcCIpLGxlZnQ6Yy5jc3MoImxlZnQiKX0pKS5yZW1vdmUoKX10aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKSxiKHRoaXMub3JpZ2luYWxFbGVtZW50KTtyZXR1cm4gdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihiKXt2YXIgYz0hMTtmb3IodmFyIGQgaW4gdGhpcy5oYW5kbGVzKWEodGhpcy5oYW5kbGVzW2RdKVswXT09Yi50YXJnZXQmJihjPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZjfSxfbW91c2VTdGFydDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLmVsZW1lbnQucG9zaXRpb24oKSxmPXRoaXMuZWxlbWVudDt0aGlzLnJlc2l6aW5nPSEwLHRoaXMuZG9jdW1lbnRTY3JvbGw9e3RvcDphKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OmEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKX0sKGYuaXMoIi51aS1kcmFnZ2FibGUiKXx8L2Fic29sdXRlLy50ZXN0KGYuY3NzKCJwb3NpdGlvbiIpKSkmJmYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDplLnRvcCxsZWZ0OmUubGVmdH0pLGEuYnJvd3Nlci5vcGVyYSYmL3JlbGF0aXZlLy50ZXN0KGYuY3NzKCJwb3NpdGlvbiIpKSYmZi5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pLHRoaXMuX3JlbmRlclByb3h5KCk7dmFyIGc9Yyh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSksaD1jKHRoaXMuaGVscGVyLmNzcygidG9wIikpO2QuY29udGFpbm1lbnQmJihnKz1hKGQuY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKXx8MCxoKz1hKGQuY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpfHwwKSx0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLnBvc2l0aW9uPXtsZWZ0OmcsdG9wOmh9LHRoaXMuc2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOmYub3V0ZXJXaWR0aCgpLGhlaWdodDpmLm91dGVySGVpZ2h0KCl9Ont3aWR0aDpmLndpZHRoKCksaGVpZ2h0OmYuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6Zi5vdXRlcldpZHRoKCksaGVpZ2h0OmYub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmYud2lkdGgoKSxoZWlnaHQ6Zi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmcsdG9wOmh9LHRoaXMuc2l6ZURpZmY9e3dpZHRoOmYub3V0ZXJXaWR0aCgpLWYud2lkdGgoKSxoZWlnaHQ6Zi5vdXRlckhlaWdodCgpLWYuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OmIucGFnZVgsdG9wOmIucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89dHlwZW9mIGQuYXNwZWN0UmF0aW89PSJudW1iZXIiP2QuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxO3ZhciBpPWEoIi51aS1yZXNpemFibGUtIit0aGlzLmF4aXMpLmNzcygiY3Vyc29yIik7YSgiYm9keSIpLmNzcygiY3Vyc29yIixpPT0iYXV0byI/dGhpcy5heGlzKyItcmVzaXplIjppKSxmLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0YXJ0IixiKTtyZXR1cm4hMH0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmhlbHBlcixkPXRoaXMub3B0aW9ucyxlPXt9LGY9dGhpcyxnPXRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uLGg9dGhpcy5heGlzLGk9Yi5wYWdlWC1nLmxlZnR8fDAsaj1iLnBhZ2VZLWcudG9wfHwwLGs9dGhpcy5fY2hhbmdlW2hdO2lmKCFrKXJldHVybiExO3ZhciBsPWsuYXBwbHkodGhpcyxbYixpLGpdKSxtPWEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3LG49dGhpcy5zaXplRGlmZjt0aGlzLl91cGRhdGVWaXJ0dWFsQm91bmRhcmllcyhiLnNoaWZ0S2V5KTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleSlsPXRoaXMuX3VwZGF0ZVJhdGlvKGwsYik7bD10aGlzLl9yZXNwZWN0U2l6ZShsLGIpLHRoaXMuX3Byb3BhZ2F0ZSgicmVzaXplIixiKSxjLmNzcyh7dG9wOnRoaXMucG9zaXRpb24udG9wKyJweCIsbGVmdDp0aGlzLnBvc2l0aW9uLmxlZnQrInB4Iix3aWR0aDp0aGlzLnNpemUud2lkdGgrInB4IixoZWlnaHQ6dGhpcy5zaXplLmhlaWdodCsicHgifSksIXRoaXMuX2hlbHBlciYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGgmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCksdGhpcy5fdXBkYXRlQ2FjaGUobCksdGhpcy5fdHJpZ2dlcigicmVzaXplIixiLHRoaXMudWkoKSk7cmV0dXJuITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dGhpcy5yZXNpemluZz0hMTt2YXIgYz10aGlzLm9wdGlvbnMsZD10aGlzO2lmKHRoaXMuX2hlbHBlcil7dmFyIGU9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxmPWUubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KGVbMF0ubm9kZU5hbWUpLGc9ZiYmYS51aS5oYXNTY3JvbGwoZVswXSwibGVmdCIpPzA6ZC5zaXplRGlmZi5oZWlnaHQsaD1mPzA6ZC5zaXplRGlmZi53aWR0aCxpPXt3aWR0aDpkLmhlbHBlci53aWR0aCgpLWgsaGVpZ2h0OmQuaGVscGVyLmhlaWdodCgpLWd9LGo9cGFyc2VJbnQoZC5lbGVtZW50LmNzcygibGVmdCIpLDEwKSsoZC5wb3NpdGlvbi5sZWZ0LWQub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxrPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsoZC5wb3NpdGlvbi50b3AtZC5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGw7Yy5hbmltYXRlfHx0aGlzLmVsZW1lbnQuY3NzKGEuZXh0ZW5kKGkse3RvcDprLGxlZnQ6an0pKSxkLmhlbHBlci5oZWlnaHQoZC5zaXplLmhlaWdodCksZC5oZWxwZXIud2lkdGgoZC5zaXplLndpZHRoKSx0aGlzLl9oZWxwZXImJiFjLmFuaW1hdGUmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCl9YSgiYm9keSIpLmNzcygiY3Vyc29yIiwiYXV0byIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdG9wIixiKSx0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpO3JldHVybiExfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGMsZSxmLGcsaDtoPXttaW5XaWR0aDpkKGIubWluV2lkdGgpP2IubWluV2lkdGg6MCxtYXhXaWR0aDpkKGIubWF4V2lkdGgpP2IubWF4V2lkdGg6SW5maW5pdHksbWluSGVpZ2h0OmQoYi5taW5IZWlnaHQpP2IubWluSGVpZ2h0OjAsbWF4SGVpZ2h0OmQoYi5tYXhIZWlnaHQpP2IubWF4SGVpZ2h0OkluZmluaXR5fTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8YSljPWgubWluSGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sZj1oLm1pbldpZHRoL3RoaXMuYXNwZWN0UmF0aW8sZT1oLm1heEhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLGc9aC5tYXhXaWR0aC90aGlzLmFzcGVjdFJhdGlvLGM+aC5taW5XaWR0aCYmKGgubWluV2lkdGg9YyksZj5oLm1pbkhlaWdodCYmKGgubWluSGVpZ2h0PWYpLGU8aC5tYXhXaWR0aCYmKGgubWF4V2lkdGg9ZSksZzxoLm1heEhlaWdodCYmKGgubWF4SGVpZ2h0PWcpO3RoaXMuX3ZCb3VuZGFyaWVzPWh9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnM7dGhpcy5vZmZzZXQ9dGhpcy5oZWxwZXIub2Zmc2V0KCksZChhLmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PWEubGVmdCksZChhLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1hLnRvcCksZChhLmhlaWdodCkmJih0aGlzLnNpemUuaGVpZ2h0PWEuaGVpZ2h0KSxkKGEud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPWEud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLm9wdGlvbnMsZT10aGlzLnBvc2l0aW9uLGY9dGhpcy5zaXplLGc9dGhpcy5heGlzO2QoYS5oZWlnaHQpP2Eud2lkdGg9YS5oZWlnaHQqdGhpcy5hc3BlY3RSYXRpbzpkKGEud2lkdGgpJiYoYS5oZWlnaHQ9YS53aWR0aC90aGlzLmFzcGVjdFJhdGlvKSxnPT0ic3ciJiYoYS5sZWZ0PWUubGVmdCsoZi53aWR0aC1hLndpZHRoKSxhLnRvcD1udWxsKSxnPT0ibnciJiYoYS50b3A9ZS50b3ArKGYuaGVpZ2h0LWEuaGVpZ2h0KSxhLmxlZnQ9ZS5sZWZ0KyhmLndpZHRoLWEud2lkdGgpKTtyZXR1cm4gYX0sX3Jlc3BlY3RTaXplOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5oZWxwZXIsZT10aGlzLl92Qm91bmRhcmllcyxmPXRoaXMuX2FzcGVjdFJhdGlvfHxiLnNoaWZ0S2V5LGc9dGhpcy5heGlzLGg9ZChhLndpZHRoKSYmZS5tYXhXaWR0aCYmZS5tYXhXaWR0aDxhLndpZHRoLGk9ZChhLmhlaWdodCkmJmUubWF4SGVpZ2h0JiZlLm1heEhlaWdodDxhLmhlaWdodCxqPWQoYS53aWR0aCkmJmUubWluV2lkdGgmJmUubWluV2lkdGg+YS53aWR0aCxrPWQoYS5oZWlnaHQpJiZlLm1pbkhlaWdodCYmZS5taW5IZWlnaHQ+YS5oZWlnaHQ7aiYmKGEud2lkdGg9ZS5taW5XaWR0aCksayYmKGEuaGVpZ2h0PWUubWluSGVpZ2h0KSxoJiYoYS53aWR0aD1lLm1heFdpZHRoKSxpJiYoYS5oZWlnaHQ9ZS5tYXhIZWlnaHQpO3ZhciBsPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLG09dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxuPS9zd3xud3x3Ly50ZXN0KGcpLG89L253fG5lfG4vLnRlc3QoZyk7aiYmbiYmKGEubGVmdD1sLWUubWluV2lkdGgpLGgmJm4mJihhLmxlZnQ9bC1lLm1heFdpZHRoKSxrJiZvJiYoYS50b3A9bS1lLm1pbkhlaWdodCksaSYmbyYmKGEudG9wPW0tZS5tYXhIZWlnaHQpO3ZhciBwPSFhLndpZHRoJiYhYS5oZWlnaHQ7cCYmIWEubGVmdCYmYS50b3A/YS50b3A9bnVsbDpwJiYhYS50b3AmJmEubGVmdCYmKGEubGVmdD1udWxsKTtyZXR1cm4gYX0sX3Byb3BvcnRpb25hbGx5UmVzaXplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zO2lmKCEhdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGgpe3ZhciBjPXRoaXMuaGVscGVyfHx0aGlzLmVsZW1lbnQ7Zm9yKHZhciBkPTA7ZDx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aDtkKyspe3ZhciBlPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHNbZF07aWYoIXRoaXMuYm9yZGVyRGlmKXt2YXIgZj1bZS5jc3MoImJvcmRlclRvcFdpZHRoIiksZS5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSxlLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSxlLmNzcygiYm9yZGVyTGVmdFdpZHRoIildLGc9W2UuY3NzKCJwYWRkaW5nVG9wIiksZS5jc3MoInBhZGRpbmdSaWdodCIpLGUuY3NzKCJwYWRkaW5nQm90dG9tIiksZS5jc3MoInBhZGRpbmdMZWZ0IildO3RoaXMuYm9yZGVyRGlmPWEubWFwKGYsZnVuY3Rpb24oYSxiKXt2YXIgYz1wYXJzZUludChhLDEwKXx8MCxkPXBhcnNlSW50KGdbYl0sMTApfHwwO3JldHVybiBjK2R9KX1pZihhLmJyb3dzZXIubXNpZSYmKCEhYShjKS5pcygiOmhpZGRlbiIpfHwhIWEoYykucGFyZW50cygiOmhpZGRlbiIpLmxlbmd0aCkpY29udGludWU7ZS5jc3Moe2hlaWdodDpjLmhlaWdodCgpLXRoaXMuYm9yZGVyRGlmWzBdLXRoaXMuYm9yZGVyRGlmWzJdfHwwLHdpZHRoOmMud2lkdGgoKS10aGlzLmJvcmRlckRpZlsxXS10aGlzLmJvcmRlckRpZlszXXx8MH0pfX19LF9yZW5kZXJQcm94eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudCxjPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnRPZmZzZXQ9Yi5vZmZzZXQoKTtpZih0aGlzLl9oZWxwZXIpe3RoaXMuaGVscGVyPXRoaXMuaGVscGVyfHxhKCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48L2Rpdj4nKTt2YXIgZD1hLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248NyxlPWQ/MTowLGY9ZD8yOi0xO3RoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpK2YsaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpK2YscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LWUrInB4Iix0b3A6dGhpcy5lbGVtZW50T2Zmc2V0LnRvcC1lKyJweCIsekluZGV4OisrYy56SW5kZXh9KSx0aGlzLmhlbHBlci5hcHBlbmRUbygiYm9keSIpLmRpc2FibGVTZWxlY3Rpb24oKX1lbHNlIHRoaXMuaGVscGVyPXRoaXMuZWxlbWVudH0sX2NoYW5nZTp7ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK2J9fSx3OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLm9yaWdpbmFsU2l6ZSxmPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpmLmxlZnQrYix3aWR0aDplLndpZHRoLWJ9fSxuOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLm9yaWdpbmFsU2l6ZSxmPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOmYudG9wK2MsaGVpZ2h0OmUuaGVpZ2h0LWN9fSxzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtjfX0sc2U6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbYixjLGRdKSl9LHN3OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW2IsYyxkXSkpfSxuZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtiLGMsZF0pKX0sbnc6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbYixjLGRdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKGIsYyl7YS51aS5wbHVnaW4uY2FsbCh0aGlzLGIsW2MsdGhpcy51aSgpXSksYiE9InJlc2l6ZSImJnRoaXMuX3RyaWdnZXIoYixjLHRoaXMudWkoKSl9LHBsdWdpbnM6e30sdWk6ZnVuY3Rpb24oKXtyZXR1cm57b3JpZ2luYWxFbGVtZW50OnRoaXMub3JpZ2luYWxFbGVtZW50LGVsZW1lbnQ6dGhpcy5lbGVtZW50LGhlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLHNpemU6dGhpcy5zaXplLG9yaWdpbmFsU2l6ZTp0aGlzLm9yaWdpbmFsU2l6ZSxvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbn19fSksYS5leHRlbmQoYS51aS5yZXNpemFibGUse3ZlcnNpb246IjEuOC4xNyJ9KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFsc29SZXNpemUiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1mdW5jdGlvbihiKXthKGIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2IuZGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiLHt3aWR0aDpwYXJzZUludChiLndpZHRoKCksMTApLGhlaWdodDpwYXJzZUludChiLmhlaWdodCgpLDEwKSxsZWZ0OnBhcnNlSW50KGIuY3NzKCJsZWZ0IiksMTApLHRvcDpwYXJzZUludChiLmNzcygidG9wIiksMTApLHBvc2l0aW9uOmIuY3NzKCJwb3NpdGlvbiIpfSl9KX07dHlwZW9mIGUuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFlLmFsc29SZXNpemUucGFyZW50Tm9kZT9lLmFsc29SZXNpemUubGVuZ3RoPyhlLmFsc29SZXNpemU9ZS5hbHNvUmVzaXplWzBdLGYoZS5hbHNvUmVzaXplKSk6YS5lYWNoKGUuYWxzb1Jlc2l6ZSxmdW5jdGlvbihhKXtmKGEpfSk6ZihlLmFsc29SZXNpemUpfSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5vcmlnaW5hbFNpemUsZz1kLm9yaWdpbmFsUG9zaXRpb24saD17aGVpZ2h0OmQuc2l6ZS5oZWlnaHQtZi5oZWlnaHR8fDAsd2lkdGg6ZC5zaXplLndpZHRoLWYud2lkdGh8fDAsdG9wOmQucG9zaXRpb24udG9wLWcudG9wfHwwLGxlZnQ6ZC5wb3NpdGlvbi5sZWZ0LWcubGVmdHx8MH0saT1mdW5jdGlvbihiLGUpe2EoYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyksZj1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIiksZz17fSxpPWUmJmUubGVuZ3RoP2U6Yi5wYXJlbnRzKGMub3JpZ2luYWxFbGVtZW50WzBdKS5sZW5ndGg/WyJ3aWR0aCIsImhlaWdodCJdOlsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il07YS5lYWNoKGksZnVuY3Rpb24oYSxiKXt2YXIgYz0oZltiXXx8MCkrKGhbYl18fDApO2MmJmM+PTAmJihnW2JdPWN8fG51bGwpfSksYS5icm93c2VyLm9wZXJhJiYvcmVsYXRpdmUvLnRlc3QoYi5jc3MoInBvc2l0aW9uIikpJiYoZC5fcmV2ZXJ0VG9SZWxhdGl2ZVBvc2l0aW9uPSEwLGIuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiYXV0byIsbGVmdDoiYXV0byJ9KSksYi5jc3MoZyl9KX07dHlwZW9mIGUuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFlLmFsc29SZXNpemUubm9kZVR5cGU/YS5lYWNoKGUuYWxzb1Jlc2l6ZSxmdW5jdGlvbihhLGIpe2koYSxiKX0pOmkoZS5hbHNvUmVzaXplKX0sc3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1mdW5jdGlvbihiKXthKGIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2IuY3NzKHtwb3NpdGlvbjpiLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIikucG9zaXRpb259KX0pfTtkLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb24mJihkLl9yZXZlcnRUb1JlbGF0aXZlUG9zaXRpb249ITEsdHlwZW9mIGUuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFlLmFsc29SZXNpemUubm9kZVR5cGU/YS5lYWNoKGUuYWxzb1Jlc2l6ZSxmdW5jdGlvbihhKXtmKGEpfSk6ZihlLmFsc29SZXNpemUpKSxhKHRoaXMpLnJlbW92ZURhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIil9fSksYS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbmltYXRlIix7c3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGc9Zi5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoZlswXS5ub2RlTmFtZSksaD1nJiZhLnVpLmhhc1Njcm9sbChmWzBdLCJsZWZ0Iik/MDpkLnNpemVEaWZmLmhlaWdodCxpPWc/MDpkLnNpemVEaWZmLndpZHRoLGo9e3dpZHRoOmQuc2l6ZS53aWR0aC1pLGhlaWdodDpkLnNpemUuaGVpZ2h0LWh9LGs9cGFyc2VJbnQoZC5lbGVtZW50LmNzcygibGVmdCIpLDEwKSsoZC5wb3NpdGlvbi5sZWZ0LWQub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxsPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsoZC5wb3NpdGlvbi50b3AtZC5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGw7ZC5lbGVtZW50LmFuaW1hdGUoYS5leHRlbmQoaixsJiZrP3t0b3A6bCxsZWZ0Omt9Ont9KSx7ZHVyYXRpb246ZS5hbmltYXRlRHVyYXRpb24sZWFzaW5nOmUuYW5pbWF0ZUVhc2luZyxzdGVwOmZ1bmN0aW9uKCl7dmFyIGM9e3dpZHRoOnBhcnNlSW50KGQuZWxlbWVudC5jc3MoIndpZHRoIiksMTApLGhlaWdodDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJoZWlnaHQiKSwxMCksdG9wOnBhcnNlSW50KGQuZWxlbWVudC5jc3MoInRvcCIpLDEwKSxsZWZ0OnBhcnNlSW50KGQuZWxlbWVudC5jc3MoImxlZnQiKSwxMCl9O2YmJmYubGVuZ3RoJiZhKGZbMF0pLmNzcyh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KSxkLl91cGRhdGVDYWNoZShjKSxkLl9wcm9wYWdhdGUoInJlc2l6ZSIsYil9fSl9fSksYS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJjb250YWlubWVudCIse3N0YXJ0OmZ1bmN0aW9uKGIsZCl7dmFyIGU9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxmPWUub3B0aW9ucyxnPWUuZWxlbWVudCxoPWYuY29udGFpbm1lbnQsaT1oIGluc3RhbmNlb2YgYT9oLmdldCgwKTovcGFyZW50Ly50ZXN0KGgpP2cucGFyZW50KCkuZ2V0KDApOmg7aWYoISFpKXtlLmNvbnRhaW5lckVsZW1lbnQ9YShpKTtpZigvZG9jdW1lbnQvLnRlc3QoaCl8fGg9PWRvY3VtZW50KWUuY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9LGUuY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH0sZS5wYXJlbnREYXRhPXtlbGVtZW50OmEoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDphKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDphKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH07ZWxzZXt2YXIgaj1hKGkpLGs9W107YShbIlRvcCIsIlJpZ2h0IiwiTGVmdCIsIkJvdHRvbSJdKS5lYWNoKGZ1bmN0aW9uKGEsYil7a1thXT1jKGouY3NzKCJwYWRkaW5nIitiKSl9KSxlLmNvbnRhaW5lck9mZnNldD1qLm9mZnNldCgpLGUuY29udGFpbmVyUG9zaXRpb249ai5wb3NpdGlvbigpLGUuY29udGFpbmVyU2l6ZT17aGVpZ2h0OmouaW5uZXJIZWlnaHQoKS1rWzNdLHdpZHRoOmouaW5uZXJXaWR0aCgpLWtbMV19O3ZhciBsPWUuY29udGFpbmVyT2Zmc2V0LG09ZS5jb250YWluZXJTaXplLmhlaWdodCxuPWUuY29udGFpbmVyU2l6ZS53aWR0aCxvPWEudWkuaGFzU2Nyb2xsKGksImxlZnQiKT9pLnNjcm9sbFdpZHRoOm4scD1hLnVpLmhhc1Njcm9sbChpKT9pLnNjcm9sbEhlaWdodDptO2UucGFyZW50RGF0YT17ZWxlbWVudDppLGxlZnQ6bC5sZWZ0LHRvcDpsLnRvcCx3aWR0aDpvLGhlaWdodDpwfX19fSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5jb250YWluZXJTaXplLGc9ZC5jb250YWluZXJPZmZzZXQsaD1kLnNpemUsaT1kLnBvc2l0aW9uLGo9ZC5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXksaz17dG9wOjAsbGVmdDowfSxsPWQuY29udGFpbmVyRWxlbWVudDtsWzBdIT1kb2N1bWVudCYmL3N0YXRpYy8udGVzdChsLmNzcygicG9zaXRpb24iKSkmJihrPWcpLGkubGVmdDwoZC5faGVscGVyP2cubGVmdDowKSYmKGQuc2l6ZS53aWR0aD1kLnNpemUud2lkdGgrKGQuX2hlbHBlcj9kLnBvc2l0aW9uLmxlZnQtZy5sZWZ0OmQucG9zaXRpb24ubGVmdC1rLmxlZnQpLGomJihkLnNpemUuaGVpZ2h0PWQuc2l6ZS53aWR0aC9lLmFzcGVjdFJhdGlvKSxkLnBvc2l0aW9uLmxlZnQ9ZS5oZWxwZXI/Zy5sZWZ0OjApLGkudG9wPChkLl9oZWxwZXI/Zy50b3A6MCkmJihkLnNpemUuaGVpZ2h0PWQuc2l6ZS5oZWlnaHQrKGQuX2hlbHBlcj9kLnBvc2l0aW9uLnRvcC1nLnRvcDpkLnBvc2l0aW9uLnRvcCksaiYmKGQuc2l6ZS53aWR0aD1kLnNpemUuaGVpZ2h0KmUuYXNwZWN0UmF0aW8pLGQucG9zaXRpb24udG9wPWQuX2hlbHBlcj9nLnRvcDowKSxkLm9mZnNldC5sZWZ0PWQucGFyZW50RGF0YS5sZWZ0K2QucG9zaXRpb24ubGVmdCxkLm9mZnNldC50b3A9ZC5wYXJlbnREYXRhLnRvcCtkLnBvc2l0aW9uLnRvcDt2YXIgbT1NYXRoLmFicygoZC5faGVscGVyP2Qub2Zmc2V0LmxlZnQtay5sZWZ0OmQub2Zmc2V0LmxlZnQtay5sZWZ0KStkLnNpemVEaWZmLndpZHRoKSxuPU1hdGguYWJzKChkLl9oZWxwZXI/ZC5vZmZzZXQudG9wLWsudG9wOmQub2Zmc2V0LnRvcC1nLnRvcCkrZC5zaXplRGlmZi5oZWlnaHQpLG89ZC5jb250YWluZXJFbGVtZW50LmdldCgwKT09ZC5lbGVtZW50LnBhcmVudCgpLmdldCgwKSxwPS9yZWxhdGl2ZXxhYnNvbHV0ZS8udGVzdChkLmNvbnRhaW5lckVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKTtvJiZwJiYobS09ZC5wYXJlbnREYXRhLmxlZnQpLG0rZC5zaXplLndpZHRoPj1kLnBhcmVudERhdGEud2lkdGgmJihkLnNpemUud2lkdGg9ZC5wYXJlbnREYXRhLndpZHRoLW0saiYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLndpZHRoL2QuYXNwZWN0UmF0aW8pKSxuK2Quc2l6ZS5oZWlnaHQ+PWQucGFyZW50RGF0YS5oZWlnaHQmJihkLnNpemUuaGVpZ2h0PWQucGFyZW50RGF0YS5oZWlnaHQtbixqJiYoZC5zaXplLndpZHRoPWQuc2l6ZS5oZWlnaHQqZC5hc3BlY3RSYXRpbykpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQucG9zaXRpb24sZz1kLmNvbnRhaW5lck9mZnNldCxoPWQuY29udGFpbmVyUG9zaXRpb24saT1kLmNvbnRhaW5lckVsZW1lbnQsaj1hKGQuaGVscGVyKSxrPWoub2Zmc2V0KCksbD1qLm91dGVyV2lkdGgoKS1kLnNpemVEaWZmLndpZHRoLG09ai5vdXRlckhlaWdodCgpLWQuc2l6ZURpZmYuaGVpZ2h0O2QuX2hlbHBlciYmIWUuYW5pbWF0ZSYmL3JlbGF0aXZlLy50ZXN0KGkuY3NzKCJwb3NpdGlvbiIpKSYmYSh0aGlzKS5jc3Moe2xlZnQ6ay5sZWZ0LWgubGVmdC1nLmxlZnQsd2lkdGg6bCxoZWlnaHQ6bX0pLGQuX2hlbHBlciYmIWUuYW5pbWF0ZSYmL3N0YXRpYy8udGVzdChpLmNzcygicG9zaXRpb24iKSkmJmEodGhpcykuY3NzKHtsZWZ0OmsubGVmdC1oLmxlZnQtZy5sZWZ0LHdpZHRoOmwsaGVpZ2h0Om19KX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdob3N0Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5zaXplO2QuZ2hvc3Q9ZC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKSxkLmdob3N0LmNzcyh7b3BhY2l0eTouMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OmYuaGVpZ2h0LHdpZHRoOmYud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKHR5cGVvZiBlLmdob3N0PT0ic3RyaW5nIj9lLmdob3N0OiIiKSxkLmdob3N0LmFwcGVuZFRvKGQuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucztkLmdob3N0JiZkLmdob3N0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6ZC5zaXplLmhlaWdodCx3aWR0aDpkLnNpemUud2lkdGh9KX0sc3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnM7ZC5naG9zdCYmZC5oZWxwZXImJmQuaGVscGVyLmdldCgwKS5yZW1vdmVDaGlsZChkLmdob3N0LmdldCgwKSl9fSksYS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJncmlkIix7cmVzaXplOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQuc2l6ZSxnPWQub3JpZ2luYWxTaXplLGg9ZC5vcmlnaW5hbFBvc2l0aW9uLGk9ZC5heGlzLGo9ZS5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXk7ZS5ncmlkPXR5cGVvZiBlLmdyaWQ9PSJudW1iZXIiP1tlLmdyaWQsZS5ncmlkXTplLmdyaWQ7dmFyIGs9TWF0aC5yb3VuZCgoZi53aWR0aC1nLndpZHRoKS8oZS5ncmlkWzBdfHwxKSkqKGUuZ3JpZFswXXx8MSksbD1NYXRoLnJvdW5kKChmLmhlaWdodC1nLmhlaWdodCkvKGUuZ3JpZFsxXXx8MSkpKihlLmdyaWRbMV18fDEpOy9eKHNlfHN8ZSkkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCk6L14obmUpJC8udGVzdChpKT8oZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi50b3A9aC50b3AtbCk6L14oc3cpJC8udGVzdChpKT8oZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi5sZWZ0PWgubGVmdC1rKTooZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi50b3A9aC50b3AtbCxkLnBvc2l0aW9uLmxlZnQ9aC5sZWZ0LWspfX0pO3ZhciBjPWZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUludChhLDEwKXx8MH0sZD1mdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VJbnQoYSwxMCkpfX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIFNlbGVjdGFibGUgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9TZWxlY3RhYmxlcwogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkubW91c2UuanMKICoJanF1ZXJ5LnVpLndpZGdldC5qcwogKi8oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuc2VsZWN0YWJsZSIsYS51aS5tb3VzZSx7b3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9SZWZyZXNoOiEwLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIiksdGhpcy5kcmFnZ2VkPSExO3ZhciBjO3RoaXMucmVmcmVzaD1mdW5jdGlvbigpe2M9YShiLm9wdGlvbnMuZmlsdGVyLGIuZWxlbWVudFswXSksYy5hZGRDbGFzcygidWktc2VsZWN0ZWUiKSxjLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9Yi5vZmZzZXQoKTthLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIix7ZWxlbWVudDp0aGlzLCRlbGVtZW50OmIsbGVmdDpjLmxlZnQsdG9wOmMudG9wLHJpZ2h0OmMubGVmdCtiLm91dGVyV2lkdGgoKSxib3R0b206Yy50b3ArYi5vdXRlckhlaWdodCgpLHN0YXJ0c2VsZWN0ZWQ6ITEsc2VsZWN0ZWQ6Yi5oYXNDbGFzcygidWktc2VsZWN0ZWQiKSxzZWxlY3Rpbmc6Yi5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksdW5zZWxlY3Rpbmc6Yi5oYXNDbGFzcygidWktdW5zZWxlY3RpbmciKX0pfSl9LHRoaXMucmVmcmVzaCgpLHRoaXMuc2VsZWN0ZWVzPWMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksdGhpcy5fbW91c2VJbml0KCksdGhpcy5oZWxwZXI9YSgiPGRpdiBjbGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PiIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZXMucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVlIikucmVtb3ZlRGF0YSgic2VsZWN0YWJsZS1pdGVtIiksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RhYmxlIHVpLXNlbGVjdGFibGUtZGlzYWJsZWQiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlIikudW5iaW5kKCIuc2VsZWN0YWJsZSIpLHRoaXMuX21vdXNlRGVzdHJveSgpO3JldHVybiB0aGlzfSxfbW91c2VTdGFydDpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3RoaXMub3Bvcz1bYi5wYWdlWCxiLnBhZ2VZXTtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkKXt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9YShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKSxhKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlciksdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIuY2xpZW50WCx0b3A6Yi5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KSxkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC5zdGFydHNlbGVjdGVkPSEwLCFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJihkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGQuc2VsZWN0ZWQ9ITEsZC4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxkLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSl9KSxhKGIudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoZCl7dmFyIGU9IWIubWV0YUtleSYmIWIuY3RybEtleXx8IWQuJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcyhlPyJ1aS11bnNlbGVjdGluZyI6InVpLXNlbGVjdGVkIikuYWRkQ2xhc3MoZT8idWktc2VsZWN0aW5nIjoidWktdW5zZWxlY3RpbmciKSxkLnVuc2VsZWN0aW5nPSFlLGQuc2VsZWN0aW5nPWUsZC5zZWxlY3RlZD1lLGU/Yy5fdHJpZ2dlcigic2VsZWN0aW5nIixiLHtzZWxlY3Rpbmc6ZC5lbGVtZW50fSk6Yy5fdHJpZ2dlcigidW5zZWxlY3RpbmciLGIse3Vuc2VsZWN0aW5nOmQuZWxlbWVudH0pO3JldHVybiExfX0pfX0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3RoaXMuZHJhZ2dlZD0hMDtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLm9wb3NbMF0sZj10aGlzLm9wb3NbMV0sZz1iLnBhZ2VYLGg9Yi5wYWdlWTtpZihlPmcpe3ZhciBpPWc7Zz1lLGU9aX1pZihmPmgpe3ZhciBpPWg7aD1mLGY9aX10aGlzLmhlbHBlci5jc3Moe2xlZnQ6ZSx0b3A6Zix3aWR0aDpnLWUsaGVpZ2h0OmgtZn0pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoISFpJiZpLmVsZW1lbnQhPWMuZWxlbWVudFswXSl7dmFyIGo9ITE7ZC50b2xlcmFuY2U9PSJ0b3VjaCI/aj0hKGkubGVmdD5nfHxpLnJpZ2h0PGV8fGkudG9wPmh8fGkuYm90dG9tPGYpOmQudG9sZXJhbmNlPT0iZml0IiYmKGo9aS5sZWZ0PmUmJmkucmlnaHQ8ZyYmaS50b3A+ZiYmaS5ib3R0b208aCksaj8oaS5zZWxlY3RlZCYmKGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIiksaS5zZWxlY3RlZD0hMSksaS51bnNlbGVjdGluZyYmKGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksaS51bnNlbGVjdGluZz0hMSksaS5zZWxlY3Rpbmd8fChpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMCxjLl90cmlnZ2VyKCJzZWxlY3RpbmciLGIse3NlbGVjdGluZzppLmVsZW1lbnR9KSkpOihpLnNlbGVjdGluZyYmKChiLm1ldGFLZXl8fGIuY3RybEtleSkmJmkuc3RhcnRzZWxlY3RlZD8oaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSEwKTooaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITEsaS5zdGFydHNlbGVjdGVkJiYoaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwKSxjLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsYix7dW5zZWxlY3Rpbmc6aS5lbGVtZW50fSkpKSxpLnNlbGVjdGVkJiYhYi5tZXRhS2V5JiYhYi5jdHJsS2V5JiYhaS5zdGFydHNlbGVjdGVkJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSExLGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksaS51bnNlbGVjdGluZz0hMCxjLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsYix7dW5zZWxlY3Rpbmc6aS5lbGVtZW50fSkpKX19KTtyZXR1cm4hMX19LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLmRyYWdnZWQ9ITE7dmFyIGQ9dGhpcy5vcHRpb25zO2EoIi51aS11bnNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2QuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksZC51bnNlbGVjdGluZz0hMSxkLnN0YXJ0c2VsZWN0ZWQ9ITEsYy5fdHJpZ2dlcigidW5zZWxlY3RlZCIsYix7dW5zZWxlY3RlZDpkLmVsZW1lbnR9KX0pLGEoIi51aS1zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxkLnNlbGVjdGluZz0hMSxkLnNlbGVjdGVkPSEwLGQuc3RhcnRzZWxlY3RlZD0hMCxjLl90cmlnZ2VyKCJzZWxlY3RlZCIsYix7c2VsZWN0ZWQ6ZC5lbGVtZW50fSl9KSx0aGlzLl90cmlnZ2VyKCJzdG9wIixiKSx0aGlzLmhlbHBlci5yZW1vdmUoKTtyZXR1cm4hMX19KSxhLmV4dGVuZChhLnVpLnNlbGVjdGFibGUse3ZlcnNpb246IjEuOC4xNyJ9KX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIFNvcnRhYmxlIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvU29ydGFibGVzCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS5tb3VzZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLyhmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5zb3J0YWJsZSIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InNvcnQiLG9wdGlvbnM6e2FwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFdpdGg6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxkcm9wT25FbXB0eTohMCxmb3JjZVBsYWNlaG9sZGVyU2l6ZTohMSxmb3JjZUhlbHBlclNpemU6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaXRlbXM6Ij4gKiIsb3BhY2l0eTohMSxwbGFjZWhvbGRlcjohMSxyZXZlcnQ6ITEsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9uczt0aGlzLmNvbnRhaW5lckNhY2hlPXt9LHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc29ydGFibGUiKSx0aGlzLnJlZnJlc2goKSx0aGlzLmZsb2F0aW5nPXRoaXMuaXRlbXMubGVuZ3RoP2EuYXhpcz09PSJ4Inx8L2xlZnR8cmlnaHQvLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZmxvYXQiKSl8fC9pbmxpbmV8dGFibGUtY2VsbC8udGVzdCh0aGlzLml0ZW1zWzBdLml0ZW0uY3NzKCJkaXNwbGF5IikpOiExLHRoaXMub2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKSx0aGlzLl9tb3VzZUluaXQoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc29ydGFibGUgdWktc29ydGFibGUtZGlzYWJsZWQiKSx0aGlzLl9tb3VzZURlc3Ryb3koKTtmb3IodmFyIGE9dGhpcy5pdGVtcy5sZW5ndGgtMTthPj0wO2EtLSl0aGlzLml0ZW1zW2FdLml0ZW0ucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIik7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT09ImRpc2FibGVkIj8odGhpcy5vcHRpb25zW2JdPWMsdGhpcy53aWRnZXQoKVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXNvcnRhYmxlLWRpc2FibGVkIikpOmEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXM7aWYodGhpcy5yZXZlcnRpbmcpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLm9wdGlvbnMudHlwZT09InN0YXRpYyIpcmV0dXJuITE7dGhpcy5fcmVmcmVzaEl0ZW1zKGIpO3ZhciBlPW51bGwsZj10aGlzLGc9YShiLnRhcmdldCkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtpZihhLmRhdGEodGhpcyxkLndpZGdldE5hbWUrIi1pdGVtIik9PWYpe2U9YSh0aGlzKTtyZXR1cm4hMX19KTthLmRhdGEoYi50YXJnZXQsZC53aWRnZXROYW1lKyItaXRlbSIpPT1mJiYoZT1hKGIudGFyZ2V0KSk7aWYoIWUpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLmhhbmRsZSYmIWMpe3ZhciBoPSExO2EodGhpcy5vcHRpb25zLmhhbmRsZSxlKS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT1iLnRhcmdldCYmKGg9ITApfSk7aWYoIWgpcmV0dXJuITF9dGhpcy5jdXJyZW50SXRlbT1lLHRoaXMuX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zKCk7cmV0dXJuITB9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGIsYyxkKXt2YXIgZT10aGlzLm9wdGlvbnMsZj10aGlzO3RoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXMuaGVscGVyPXRoaXMuX2NyZWF0ZUhlbHBlcihiKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCksdGhpcy5vZmZzZXQ9dGhpcy5jdXJyZW50SXRlbS5vZmZzZXQoKSx0aGlzLm9mZnNldD17dG9wOnRoaXMub2Zmc2V0LnRvcC10aGlzLm1hcmdpbnMudG9wLGxlZnQ6dGhpcy5vZmZzZXQubGVmdC10aGlzLm1hcmdpbnMubGVmdH0sdGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIiksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksYS5leHRlbmQodGhpcy5vZmZzZXQse2NsaWNrOntsZWZ0OmIucGFnZVgtdGhpcy5vZmZzZXQubGVmdCx0b3A6Yi5wYWdlWS10aGlzLm9mZnNldC50b3B9LHBhcmVudDp0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSxyZWxhdGl2ZTp0aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpfSksdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYiksdGhpcy5vcmlnaW5hbFBhZ2VYPWIucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPWIucGFnZVksZS5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihlLmN1cnNvckF0KSx0aGlzLmRvbVBvc2l0aW9uPXtwcmV2OnRoaXMuY3VycmVudEl0ZW0ucHJldigpWzBdLHBhcmVudDp0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdfSx0aGlzLmhlbHBlclswXSE9dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5jdXJyZW50SXRlbS5oaWRlKCksdGhpcy5fY3JlYXRlUGxhY2Vob2xkZXIoKSxlLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLGUuY3Vyc29yJiYoYSgiYm9keSIpLmNzcygiY3Vyc29yIikmJih0aGlzLl9zdG9yZWRDdXJzb3I9YSgiYm9keSIpLmNzcygiY3Vyc29yIikpLGEoImJvZHkiKS5jc3MoImN1cnNvciIsZS5jdXJzb3IpKSxlLm9wYWNpdHkmJih0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSYmKHRoaXMuX3N0b3JlZE9wYWNpdHk9dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IikpLHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsZS5vcGFjaXR5KSksZS56SW5kZXgmJih0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpJiYodGhpcy5fc3RvcmVkWkluZGV4PXRoaXMuaGVscGVyLmNzcygiekluZGV4IikpLHRoaXMuaGVscGVyLmNzcygiekluZGV4IixlLnpJbmRleCkpLHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiJiYodGhpcy5vdmVyZmxvd09mZnNldD10aGlzLnNjcm9sbFBhcmVudC5vZmZzZXQoKSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLGIsdGhpcy5fdWlIYXNoKCkpLHRoaXMuX3ByZXNlcnZlSGVscGVyUHJvcG9ydGlvbnN8fHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKTtpZighZClmb3IodmFyIGc9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2c+PTA7Zy0tKXRoaXMuY29udGFpbmVyc1tnXS5fdHJpZ2dlcigiYWN0aXZhdGUiLGIsZi5fdWlIYXNoKHRoaXMpKTthLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksYS51aS5kZG1hbmFnZXImJiFlLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsYiksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKGIpO3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyk7aWYodGhpcy5vcHRpb25zLnNjcm9sbCl7dmFyIGM9dGhpcy5vcHRpb25zLGQ9ITE7dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCI/KHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC1iLnBhZ2VZPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Muc2Nyb2xsU3BlZWQ6Yi5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLWMuc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1iLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDpiLnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtYy5zY3JvbGxTcGVlZCkpOihiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLmhlaWdodCgpLShiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxjLnNjcm9sbFNlbnNpdGl2aXR5JiYoZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCkpLGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1jLnNjcm9sbFNwZWVkKTphKHdpbmRvdykud2lkdGgoKS0oYi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkPWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpKSksZCE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKX10aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4Ijtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGY9dGhpcy5pdGVtc1tlXSxnPWYuaXRlbVswXSxoPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihmKTtpZighaCljb250aW51ZTtpZihnIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLnBsYWNlaG9sZGVyW2g9PTE/Im5leHQiOiJwcmV2Il0oKVswXSE9ZyYmIWEudWkuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxnKSYmKHRoaXMub3B0aW9ucy50eXBlPT0ic2VtaS1keW5hbWljIj8hYS51aS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sZyk6ITApKXt0aGlzLmRpcmVjdGlvbj1oPT0xPyJkb3duIjoidXAiO2lmKHRoaXMub3B0aW9ucy50b2xlcmFuY2U9PSJwb2ludGVyInx8dGhpcy5faW50ZXJzZWN0c1dpdGhTaWRlcyhmKSl0aGlzLl9yZWFycmFuZ2UoYixmKTtlbHNlIGJyZWFrO3RoaXMuX3RyaWdnZXIoImNoYW5nZSIsYix0aGlzLl91aUhhc2goKSk7YnJlYWt9fXRoaXMuX2NvbnRhY3RDb250YWluZXJzKGIpLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYiksdGhpcy5fdHJpZ2dlcigic29ydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicztyZXR1cm4hMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiLGMpe2lmKCEhYil7YS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGIpO2lmKHRoaXMub3B0aW9ucy5yZXZlcnQpe3ZhciBkPXRoaXMsZT1kLnBsYWNlaG9sZGVyLm9mZnNldCgpO2QucmV2ZXJ0aW5nPSEwLGEodGhpcy5oZWxwZXIpLmFuaW1hdGUoe2xlZnQ6ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LWQubWFyZ2lucy5sZWZ0Kyh0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpLHRvcDplLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLWQubWFyZ2lucy50b3ArKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsVG9wKX0scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydCwxMCl8fDUwMCxmdW5jdGlvbigpe2QuX2NsZWFyKGIpfSl9ZWxzZSB0aGlzLl9jbGVhcihiLGMpO3JldHVybiExfX0sY2FuY2VsOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcztpZih0aGlzLmRyYWdnaW5nKXt0aGlzLl9tb3VzZVVwKHt0YXJnZXQ6bnVsbH0pLHRoaXMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCI/dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIik6dGhpcy5jdXJyZW50SXRlbS5zaG93KCk7Zm9yKHZhciBjPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtjPj0wO2MtLSl0aGlzLmNvbnRhaW5lcnNbY10uX3RyaWdnZXIoImRlYWN0aXZhdGUiLG51bGwsYi5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1tjXS5fdHJpZ2dlcigib3V0IixudWxsLGIuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9dGhpcy5wbGFjZWhvbGRlciYmKHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMub3B0aW9ucy5oZWxwZXIhPSJvcmlnaW5hbCImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSxhLmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzohMSxyZXZlcnRpbmc6ITEsX25vRmluYWxTb3J0Om51bGx9KSx0aGlzLmRvbVBvc2l0aW9uLnByZXY/YSh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOmEodGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSkpO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShiJiZiLmNvbm5lY3RlZCksZD1bXTtiPWJ8fHt9LGEoYykuZWFjaChmdW5jdGlvbigpe3ZhciBjPShhKGIuaXRlbXx8dGhpcykuYXR0cihiLmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRjaChiLmV4cHJlc3Npb258fC8oLispWy09X10oLispLyk7YyYmZC5wdXNoKChiLmtleXx8Y1sxXSsiW10iKSsiPSIrKGIua2V5JiZiLmV4cHJlc3Npb24/Y1sxXTpjWzJdKSl9KSwhZC5sZW5ndGgmJmIua2V5JiZkLnB1c2goYi5rZXkrIj0iKTtyZXR1cm4gZC5qb2luKCImIil9LHRvQXJyYXk6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShiJiZiLmNvbm5lY3RlZCksZD1bXTtiPWJ8fHt9LGMuZWFjaChmdW5jdGlvbigpe2QucHVzaChhKGIuaXRlbXx8dGhpcykuYXR0cihiLmF0dHJpYnV0ZXx8ImlkIil8fCIiKX0pO3JldHVybiBkfSxfaW50ZXJzZWN0c1dpdGg6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGM9Yit0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLGQ9dGhpcy5wb3NpdGlvbkFicy50b3AsZT1kK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGY9YS5sZWZ0LGc9ZithLndpZHRoLGg9YS50b3AsaT1oK2EuaGVpZ2h0LGo9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGs9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxsPWQraj5oJiZkK2o8aSYmYitrPmYmJmIrazxnO3JldHVybiB0aGlzLm9wdGlvbnMudG9sZXJhbmNlPT0icG9pbnRlciJ8fHRoaXMub3B0aW9ucy5mb3JjZVBvaW50ZXJGb3JDb250YWluZXJzfHx0aGlzLm9wdGlvbnMudG9sZXJhbmNlIT0icG9pbnRlciImJnRoaXMuaGVscGVyUHJvcG9ydGlvbnNbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT5hW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0/bDpmPGIrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZjLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMjxnJiZoPGQrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMiYmZS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPGl9LF9pbnRlcnNlY3RzV2l0aFBvaW50ZXI6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxiLnRvcCxiLmhlaWdodCksZD1hLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsYi5sZWZ0LGIud2lkdGgpLGU9YyYmZCxmPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLGc9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtpZighZSlyZXR1cm4hMTtyZXR1cm4gdGhpcy5mbG9hdGluZz9nJiZnPT0icmlnaHQifHxmPT0iZG93biI/MjoxOmYmJihmPT0iZG93biI/MjoxKX0sX2ludGVyc2VjdHNXaXRoU2lkZXM6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxiLnRvcCtiLmhlaWdodC8yLGIuaGVpZ2h0KSxkPWEudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCxiLmxlZnQrYi53aWR0aC8yLGIud2lkdGgpLGU9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksZj10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiB0aGlzLmZsb2F0aW5nJiZmP2Y9PSJyaWdodCImJmR8fGY9PSJsZWZ0IiYmIWQ6ZSYmKGU9PSJkb3duIiYmY3x8ZT09InVwIiYmIWMpfSxfZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wO3JldHVybiBhIT0wJiYoYT4wPyJkb3duIjoidXAiKX0sX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubGFzdFBvc2l0aW9uQWJzLmxlZnQ7cmV0dXJuIGEhPTAmJihhPjA/InJpZ2h0IjoibGVmdCIpfSxyZWZyZXNoOmZ1bmN0aW9uKGEpe3RoaXMuX3JlZnJlc2hJdGVtcyhhKSx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKTtyZXR1cm4gdGhpc30sX2Nvbm5lY3RXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zO3JldHVybiBhLmNvbm5lY3RXaXRoLmNvbnN0cnVjdG9yPT1TdHJpbmc/W2EuY29ubmVjdFdpdGhdOmEuY29ubmVjdFdpdGh9LF9nZXRJdGVtc0FzalF1ZXJ5OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD1bXSxlPVtdLGY9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihmJiZiKWZvcih2YXIgZz1mLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1hKGZbZ10pO2Zvcih2YXIgaT1oLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgaj1hLmRhdGEoaFtpXSx0aGlzLndpZGdldE5hbWUpO2omJmohPXRoaXMmJiFqLm9wdGlvbnMuZGlzYWJsZWQmJmUucHVzaChbYS5pc0Z1bmN0aW9uKGoub3B0aW9ucy5pdGVtcyk/ai5vcHRpb25zLml0ZW1zLmNhbGwoai5lbGVtZW50KTphKGoub3B0aW9ucy5pdGVtcyxqLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksal0pfX1lLnB1c2goW2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCxudWxsLHtvcHRpb25zOnRoaXMub3B0aW9ucyxpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksdGhpc10pO2Zvcih2YXIgZz1lLmxlbmd0aC0xO2c+PTA7Zy0tKWVbZ11bMF0uZWFjaChmdW5jdGlvbigpe2QucHVzaCh0aGlzKX0pO3JldHVybiBhKGQpfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIrdGhpcy53aWRnZXROYW1lKyItaXRlbSkiKTtmb3IodmFyIGI9MDtiPHRoaXMuaXRlbXMubGVuZ3RoO2IrKylmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdPT10aGlzLml0ZW1zW2JdLml0ZW1bMF0mJnRoaXMuaXRlbXMuc3BsaWNlKGIsMSl9LF9yZWZyZXNoSXRlbXM6ZnVuY3Rpb24oYil7dGhpcy5pdGVtcz1bXSx0aGlzLmNvbnRhaW5lcnM9W3RoaXNdO3ZhciBjPXRoaXMuaXRlbXMsZD10aGlzLGU9W1thLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYix7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6YSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KSx0aGlzXV0sZj10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGYpZm9yKHZhciBnPWYubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBoPWEoZltnXSk7Zm9yKHZhciBpPWgubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBqPWEuZGF0YShoW2ldLHRoaXMud2lkZ2V0TmFtZSk7aiYmaiE9dGhpcyYmIWoub3B0aW9ucy5kaXNhYmxlZCYmKGUucHVzaChbYS5pc0Z1bmN0aW9uKGoub3B0aW9ucy5pdGVtcyk/ai5vcHRpb25zLml0ZW1zLmNhbGwoai5lbGVtZW50WzBdLGIse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmEoai5vcHRpb25zLml0ZW1zLGouZWxlbWVudCksal0pLHRoaXMuY29udGFpbmVycy5wdXNoKGopKX19Zm9yKHZhciBnPWUubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBrPWVbZ11bMV0sbD1lW2ddWzBdO2Zvcih2YXIgaT0wLG09bC5sZW5ndGg7aTxtO2krKyl7dmFyIG49YShsW2ldKTtuLmRhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIsayksYy5wdXNoKHtpdGVtOm4saW5zdGFuY2U6ayx3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MH0pfX19LHJlZnJlc2hQb3NpdGlvbnM6ZnVuY3Rpb24oYil7dGhpcy5vZmZzZXRQYXJlbnQmJnRoaXMuaGVscGVyJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKTtmb3IodmFyIGM9dGhpcy5pdGVtcy5sZW5ndGgtMTtjPj0wO2MtLSl7dmFyIGQ9dGhpcy5pdGVtc1tjXTtpZihkLmluc3RhbmNlIT10aGlzLmN1cnJlbnRDb250YWluZXImJnRoaXMuY3VycmVudENvbnRhaW5lciYmZC5pdGVtWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdKWNvbnRpbnVlO3ZhciBlPXRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50P2EodGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQsZC5pdGVtKTpkLml0ZW07Ynx8KGQud2lkdGg9ZS5vdXRlcldpZHRoKCksZC5oZWlnaHQ9ZS5vdXRlckhlaWdodCgpKTt2YXIgZj1lLm9mZnNldCgpO2QubGVmdD1mLmxlZnQsZC50b3A9Zi50b3B9aWYodGhpcy5vcHRpb25zLmN1c3RvbSYmdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycyl0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyk7ZWxzZSBmb3IodmFyIGM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZj10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vZmZzZXQoKTt0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUubGVmdD1mLmxlZnQsdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLnRvcD1mLnRvcCx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUud2lkdGg9dGhpcy5jb250YWluZXJzW2NdLmVsZW1lbnQub3V0ZXJXaWR0aCgpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5oZWlnaHQ9dGhpcy5jb250YWluZXJzW2NdLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX1yZXR1cm4gdGhpc30sX2NyZWF0ZVBsYWNlaG9sZGVyOmZ1bmN0aW9uKGIpe3ZhciBjPWJ8fHRoaXMsZD1jLm9wdGlvbnM7aWYoIWQucGxhY2Vob2xkZXJ8fGQucGxhY2Vob2xkZXIuY29uc3RydWN0b3I9PVN0cmluZyl7dmFyIGU9ZC5wbGFjZWhvbGRlcjtkLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGI9YShkb2N1bWVudC5jcmVhdGVFbGVtZW50KGMuY3VycmVudEl0ZW1bMF0ubm9kZU5hbWUpKS5hZGRDbGFzcyhlfHxjLmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSsiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIikucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpWzBdO2V8fChiLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpO3JldHVybiBifSx1cGRhdGU6ZnVuY3Rpb24oYSxiKXtpZighZXx8ISFkLmZvcmNlUGxhY2Vob2xkZXJTaXplKWIuaGVpZ2h0KCl8fGIuaGVpZ2h0KGMuY3VycmVudEl0ZW0uaW5uZXJIZWlnaHQoKS1wYXJzZUludChjLmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ1RvcCIpfHwwLDEwKS1wYXJzZUludChjLmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0JvdHRvbSIpfHwwLDEwKSksYi53aWR0aCgpfHxiLndpZHRoKGMuY3VycmVudEl0ZW0uaW5uZXJXaWR0aCgpLXBhcnNlSW50KGMuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nTGVmdCIpfHwwLDEwKS1wYXJzZUludChjLmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ1JpZ2h0Iil8fDAsMTApKX19fWMucGxhY2Vob2xkZXI9YShkLnBsYWNlaG9sZGVyLmVsZW1lbnQuY2FsbChjLmVsZW1lbnQsYy5jdXJyZW50SXRlbSkpLGMuY3VycmVudEl0ZW0uYWZ0ZXIoYy5wbGFjZWhvbGRlciksZC5wbGFjZWhvbGRlci51cGRhdGUoYyxjLnBsYWNlaG9sZGVyKX0sX2NvbnRhY3RDb250YWluZXJzOmZ1bmN0aW9uKGIpe3ZhciBjPW51bGwsZD1udWxsO2Zvcih2YXIgZT10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7ZT49MDtlLS0pe2lmKGEudWkuY29udGFpbnModGhpcy5jdXJyZW50SXRlbVswXSx0aGlzLmNvbnRhaW5lcnNbZV0uZWxlbWVudFswXSkpY29udGludWU7aWYodGhpcy5faW50ZXJzZWN0c1dpdGgodGhpcy5jb250YWluZXJzW2VdLmNvbnRhaW5lckNhY2hlKSl7aWYoYyYmYS51aS5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbZV0uZWxlbWVudFswXSxjLmVsZW1lbnRbMF0pKWNvbnRpbnVlO2M9dGhpcy5jb250YWluZXJzW2VdLGQ9ZX1lbHNlIHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNoZS5vdmVyJiYodGhpcy5jb250YWluZXJzW2VdLl90cmlnZ2VyKCJvdXQiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZV0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKX1pZighIWMpaWYodGhpcy5jb250YWluZXJzLmxlbmd0aD09PTEpdGhpcy5jb250YWluZXJzW2RdLl90cmlnZ2VyKCJvdmVyIixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2RdLmNvbnRhaW5lckNhY2hlLm92ZXI9MTtlbHNlIGlmKHRoaXMuY3VycmVudENvbnRhaW5lciE9dGhpcy5jb250YWluZXJzW2RdKXt2YXIgZj0xZTQsZz1udWxsLGg9dGhpcy5wb3NpdGlvbkFic1t0aGlzLmNvbnRhaW5lcnNbZF0uZmxvYXRpbmc/ImxlZnQiOiJ0b3AiXTtmb3IodmFyIGk9dGhpcy5pdGVtcy5sZW5ndGgtMTtpPj0wO2ktLSl7aWYoIWEudWkuY29udGFpbnModGhpcy5jb250YWluZXJzW2RdLmVsZW1lbnRbMF0sdGhpcy5pdGVtc1tpXS5pdGVtWzBdKSljb250aW51ZTt2YXIgaj10aGlzLml0ZW1zW2ldW3RoaXMuY29udGFpbmVyc1tkXS5mbG9hdGluZz8ibGVmdCI6InRvcCJdO01hdGguYWJzKGotaCk8ZiYmKGY9TWF0aC5hYnMoai1oKSxnPXRoaXMuaXRlbXNbaV0pfWlmKCFnJiYhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KXJldHVybjt0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcy5jb250YWluZXJzW2RdLGc/dGhpcy5fcmVhcnJhbmdlKGIsZyxudWxsLCEwKTp0aGlzLl9yZWFycmFuZ2UoYixudWxsLHRoaXMuY29udGFpbmVyc1tkXS5lbGVtZW50LCEwKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGIsdGhpcy5fdWlIYXNoKCkpLHRoaXMuY29udGFpbmVyc1tkXS5fdHJpZ2dlcigiY2hhbmdlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsdGhpcy5wbGFjZWhvbGRlciksdGhpcy5jb250YWluZXJzW2RdLl90cmlnZ2VyKCJvdmVyIixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2RdLmNvbnRhaW5lckNhY2hlLm92ZXI9MX19LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9YS5pc0Z1bmN0aW9uKGMuaGVscGVyKT9hKGMuaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbYix0aGlzLmN1cnJlbnRJdGVtXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuY3VycmVudEl0ZW0uY2xvbmUoKTp0aGlzLmN1cnJlbnRJdGVtO2QucGFyZW50cygiYm9keSIpLmxlbmd0aHx8YShjLmFwcGVuZFRvIT0icGFyZW50Ij9jLmFwcGVuZFRvOnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSlbMF0uYXBwZW5kQ2hpbGQoZFswXSksZFswXT09dGhpcy5jdXJyZW50SXRlbVswXSYmKHRoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0Iil9KSwoZFswXS5zdHlsZS53aWR0aD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpLChkWzBdLnN0eWxlLmhlaWdodD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSk7cmV0dXJuIGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpO3JldHVybnt0b3A6YS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OmEubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCl9fXJldHVybnt0b3A6MCxsZWZ0OjB9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luVG9wIiksMTApfHwwfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5jb250YWlubWVudD09InBhcmVudCImJihiLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpO2lmKGIuY29udGFpbm1lbnQ9PSJkb2N1bWVudCJ8fGIuY29udGFpbm1lbnQ9PSJ3aW5kb3ciKXRoaXMuY29udGFpbm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCwwLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLGEoYi5jb250YWlubWVudD09ImRvY3VtZW50Ij9kb2N1bWVudDp3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkpe3ZhciBjPWEoYi5jb250YWlubWVudClbMF0sZD1hKGIuY29udGFpbm1lbnQpLm9mZnNldCgpLGU9YShjKS5jc3MoIm92ZXJmbG93IikhPSJoaWRkZW4iO3RoaXMuY29udGFpbm1lbnQ9W2QubGVmdCsocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLmxlZnQsZC50b3ArKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKS10aGlzLm1hcmdpbnMudG9wLGQubGVmdCsoZT9NYXRoLm1heChjLnNjcm9sbFdpZHRoLGMub2Zmc2V0V2lkdGgpOmMub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGMpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxkLnRvcCsoZT9NYXRoLm1heChjLnNjcm9sbEhlaWdodCxjLm9mZnNldEhlaWdodCk6Yy5vZmZzZXRIZWlnaHQpLShwYXJzZUludChhKGMpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF19fSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24oYixjKXtjfHwoYz10aGlzLnBvc2l0aW9uKTt2YXIgZD1iPT0iYWJzb2x1dGUiPzE6LTEsZT10aGlzLm9wdGlvbnMsZj10aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiYodGhpcy5zY3JvbGxQYXJlbnRbMF09PWRvY3VtZW50fHwhYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkpP3RoaXMub2Zmc2V0UGFyZW50OnRoaXMuc2Nyb2xsUGFyZW50LGc9LyhodG1sfGJvZHkpL2kudGVzdChmWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6Yy50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKmQrdGhpcy5vZmZzZXQucGFyZW50LnRvcCpkLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6Zz8wOmYuc2Nyb2xsTGVmdCgpKSpkKX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZT0vKGh0bWx8Ym9keSkvaS50ZXN0KGRbMF0udGFnTmFtZSk7dGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8dGhpcy5zY3JvbGxQYXJlbnRbMF09PXRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHRoaXMub2Zmc2V0LnJlbGF0aXZlPXRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCkpO3ZhciBmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dGhpcy5jb250YWlubWVudCYmKGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdJiYoZj10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0mJihnPXRoaXMuY29udGFpbm1lbnRbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSxiLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSYmKGY9dGhpcy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxiLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdJiYoZz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCkpO2lmKGMuZ3JpZCl7dmFyIGg9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKGctdGhpcy5vcmlnaW5hbFBhZ2VZKS9jLmdyaWRbMV0pKmMuZ3JpZFsxXTtnPXRoaXMuY29udGFpbm1lbnQ/aC10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXXx8aC10aGlzLm9mZnNldC5jbGljay50b3A+dGhpcy5jb250YWlubWVudFszXT9oLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdP2grYy5ncmlkWzFdOmgtYy5ncmlkWzFdOmg6aDt2YXIgaT10aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgoZi10aGlzLm9yaWdpbmFsUGFnZVgpL2MuZ3JpZFswXSkqYy5ncmlkWzBdO2Y9dGhpcy5jb250YWlubWVudD9pLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXXx8aS10aGlzLm9mZnNldC5jbGljay5sZWZ0PnRoaXMuY29udGFpbm1lbnRbMl0/aS10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0/aStjLmdyaWRbMF06aS1jLmdyaWRbMF06aTppfX1yZXR1cm57dG9wOmctdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKyhhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6dGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6ZT8wOmQuc2Nyb2xsVG9wKCkpLGxlZnQ6Zi10aGlzLm9mZnNldC5jbGljay5sZWZ0LXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9yZWFycmFuZ2U6ZnVuY3Rpb24oYSxiLGMsZCl7Yz9jWzBdLmFwcGVuZENoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOmIuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLHRoaXMuZGlyZWN0aW9uPT0iZG93biI/Yi5pdGVtWzBdOmIuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBlPXRoaXMsZj10aGlzLmNvdW50ZXI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPT1lLmNvdW50ZXImJmUucmVmcmVzaFBvc2l0aW9ucyghZCl9LDApfSxfY2xlYXI6ZnVuY3Rpb24oYixjKXt0aGlzLnJldmVydGluZz0hMTt2YXIgZD1bXSxlPXRoaXM7IXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbDtpZih0aGlzLmhlbHBlclswXT09dGhpcy5jdXJyZW50SXRlbVswXSl7Zm9yKHZhciBmIGluIHRoaXMuX3N0b3JlZENTUylpZih0aGlzLl9zdG9yZWRDU1NbZl09PSJhdXRvInx8dGhpcy5fc3RvcmVkQ1NTW2ZdPT0ic3RhdGljIil0aGlzLl9zdG9yZWRDU1NbZl09IiI7dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIil9ZWxzZSB0aGlzLmN1cnJlbnRJdGVtLnNob3coKTt0aGlzLmZyb21PdXRzaWRlJiYhYyYmZC5wdXNoKGZ1bmN0aW9uKGEpe3RoaXMuX3RyaWdnZXIoInJlY2VpdmUiLGEsdGhpcy5fdWlIYXNoKHRoaXMuZnJvbU91dHNpZGUpKX0pLCh0aGlzLmZyb21PdXRzaWRlfHx0aGlzLmRvbVBvc2l0aW9uLnByZXYhPXRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdfHx0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCE9dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXSkmJiFjJiZkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigidXBkYXRlIixhLHRoaXMuX3VpSGFzaCgpKX0pO2lmKCFhLnVpLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmN1cnJlbnRJdGVtWzBdKSl7Y3x8ZC5wdXNoKGZ1bmN0aW9uKGEpe3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsYSx0aGlzLl91aUhhc2goKSl9KTtmb3IodmFyIGY9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Y+PTA7Zi0tKWEudWkuY29udGFpbnModGhpcy5jb250YWluZXJzW2ZdLmVsZW1lbnRbMF0sdGhpcy5jdXJyZW50SXRlbVswXSkmJiFjJiYoZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJyZWNlaXZlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ZdKSksZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJ1cGRhdGUiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSl9Zm9yKHZhciBmPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtmPj0wO2YtLSljfHxkLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2EuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSx0aGlzLmNvbnRhaW5lcnNbZl0uY29udGFpbmVyQ2FjaGUub3ZlciYmKGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigib3V0IixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ZdKSksdGhpcy5jb250YWluZXJzW2ZdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7dGhpcy5fc3RvcmVkQ3Vyc29yJiZhKCJib2R5IikuY3NzKCJjdXJzb3IiLHRoaXMuX3N0b3JlZEN1cnNvciksdGhpcy5fc3RvcmVkT3BhY2l0eSYmdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9zdG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcygiekluZGV4Iix0aGlzLl9zdG9yZWRaSW5kZXg9PSJhdXRvIj8iIjp0aGlzLl9zdG9yZWRaSW5kZXgpLHRoaXMuZHJhZ2dpbmc9ITE7aWYodGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsKXtpZighYyl7dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsYix0aGlzLl91aUhhc2goKSk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5jYWxsKHRoaXMsYik7dGhpcy5fdHJpZ2dlcigic3RvcCIsYix0aGlzLl91aUhhc2goKSl9cmV0dXJuITF9Y3x8dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsO2lmKCFjKXtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmNhbGwodGhpcyxiKTt0aGlzLl90cmlnZ2VyKCJzdG9wIixiLHRoaXMuX3VpSGFzaCgpKX10aGlzLmZyb21PdXRzaWRlPSExO3JldHVybiEwfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT0hMSYmdGhpcy5jYW5jZWwoKX0sX3VpSGFzaDpmdW5jdGlvbihiKXt2YXIgYz1ifHx0aGlzO3JldHVybntoZWxwZXI6Yy5oZWxwZXIscGxhY2Vob2xkZXI6Yy5wbGFjZWhvbGRlcnx8YShbXSkscG9zaXRpb246Yy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOmMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6Yy5wb3NpdGlvbkFicyxpdGVtOmMuY3VycmVudEl0ZW0sc2VuZGVyOmI/Yi5lbGVtZW50Om51bGx9fX0pLGEuZXh0ZW5kKGEudWkuc29ydGFibGUse3ZlcnNpb246IjEuOC4xNyJ9KX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIEFjY29yZGlvbiAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0FjY29yZGlvbgogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLyhmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5hY2NvcmRpb24iLHtvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlZDoic2xpZGUiLGF1dG9IZWlnaHQ6ITAsY2xlYXJTdHlsZTohMSxjb2xsYXBzaWJsZTohMSxldmVudDoiY2xpY2siLGZpbGxTcGFjZTohMSxoZWFkZXI6Ij4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIixpY29uczp7aGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtZSIsaGVhZGVyU2VsZWN0ZWQ6InVpLWljb24tdHJpYW5nbGUtMS1zIn0sbmF2aWdhdGlvbjohMSxuYXZpZ2F0aW9uRmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHJlZi50b0xvd2VyQ2FzZSgpPT09bG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1iLm9wdGlvbnM7Yi5ydW5uaW5nPTAsYi5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLmNoaWxkcmVuKCJsaSIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tbGktZml4IiksYi5oZWFkZXJzPWIuZWxlbWVudC5maW5kKGMuaGVhZGVyKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuYmluZCgibW91c2VlbnRlci5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7Yy5kaXNhYmxlZHx8YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmJpbmQoIm1vdXNlbGVhdmUuYWNjb3JkaW9uIixmdW5jdGlvbigpe2MuZGlzYWJsZWR8fGEodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5iaW5kKCJmb2N1cy5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7Yy5kaXNhYmxlZHx8YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmJpbmQoImJsdXIuYWNjb3JkaW9uIixmdW5jdGlvbigpe2MuZGlzYWJsZWR8fGEodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KSxiLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpO2lmKGMubmF2aWdhdGlvbil7dmFyIGQ9Yi5lbGVtZW50LmZpbmQoImEiKS5maWx0ZXIoYy5uYXZpZ2F0aW9uRmlsdGVyKS5lcSgwKTtpZihkLmxlbmd0aCl7dmFyIGU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWhlYWRlciIpO2UubGVuZ3RoP2IuYWN0aXZlPWU6Yi5hY3RpdmU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWNvbnRlbnQiKS5wcmV2KCl9fWIuYWN0aXZlPWIuX2ZpbmRBY3RpdmUoYi5hY3RpdmV8fGMuYWN0aXZlKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1zdGF0ZS1hY3RpdmUiKS50b2dnbGVDbGFzcygidWktY29ybmVyLWFsbCIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItdG9wIiksYi5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSxiLl9jcmVhdGVJY29ucygpLGIucmVzaXplKCksYi5lbGVtZW50LmF0dHIoInJvbGUiLCJ0YWJsaXN0IiksYi5oZWFkZXJzLmF0dHIoInJvbGUiLCJ0YWIiKS5iaW5kKCJrZXlkb3duLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX2tleWRvd24oYSl9KS5uZXh0KCkuYXR0cigicm9sZSIsInRhYnBhbmVsIiksYi5oZWFkZXJzLm5vdChiLmFjdGl2ZXx8IiIpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmhpZGUoKSxiLmFjdGl2ZS5sZW5ndGg/Yi5hY3RpdmUuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KTpiLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLGEuYnJvd3Nlci5zYWZhcml8fGIuaGVhZGVycy5maW5kKCJhIikuYXR0cigidGFiSW5kZXgiLC0xKSxjLmV2ZW50JiZiLmhlYWRlcnMuYmluZChjLmV2ZW50LnNwbGl0KCIgIikuam9pbigiLmFjY29yZGlvbiAiKSsiLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7Yi5fY2xpY2tIYW5kbGVyLmNhbGwoYixhLHRoaXMpLGEucHJldmVudERlZmF1bHQoKX0pfSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5pY29ucyYmKGEoIjxzcGFuPjwvc3Bhbj4iKS5hZGRDbGFzcygidWktaWNvbiAiK2IuaWNvbnMuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSx0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLWljb24iKS50b2dnbGVDbGFzcyhiLmljb25zLmhlYWRlcikudG9nZ2xlQ2xhc3MoYi5pY29ucy5oZWFkZXJTZWxlY3RlZCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuaGVhZGVycy51bmJpbmQoIi5hY2NvcmRpb24iKS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktaGVscGVyLXJlc2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1hY3RpdmUgdWktc3RhdGUtZGlzYWJsZWQgdWktY29ybmVyLXRvcCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1zZWxlY3RlZCIpLnJlbW92ZUF0dHIoInRhYkluZGV4IiksdGhpcy5oZWFkZXJzLmZpbmQoImEiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLHRoaXMuX2Rlc3Ryb3lJY29ucygpO3ZhciBjPXRoaXMuaGVhZGVycy5uZXh0KCkuY3NzKCJkaXNwbGF5IiwiIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS1hY2NvcmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUgdWktYWNjb3JkaW9uLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIik7KGIuYXV0b0hlaWdodHx8Yi5maWxsSGVpZ2h0KSYmYy5jc3MoImhlaWdodCIsIiIpO3JldHVybiBhLldpZGdldC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsYyl7YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGI9PSJhY3RpdmUiJiZ0aGlzLmFjdGl2YXRlKGMpLGI9PSJpY29ucyImJih0aGlzLl9kZXN0cm95SWNvbnMoKSxjJiZ0aGlzLl9jcmVhdGVJY29ucygpKSxiPT0iZGlzYWJsZWQiJiZ0aGlzLmhlYWRlcnMuYWRkKHRoaXMuaGVhZGVycy5uZXh0KCkpW2M/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktYWNjb3JkaW9uLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIil9LF9rZXlkb3duOmZ1bmN0aW9uKGIpe2lmKCEodGhpcy5vcHRpb25zLmRpc2FibGVkfHxiLmFsdEtleXx8Yi5jdHJsS2V5KSl7dmFyIGM9YS51aS5rZXlDb2RlLGQ9dGhpcy5oZWFkZXJzLmxlbmd0aCxlPXRoaXMuaGVhZGVycy5pbmRleChiLnRhcmdldCksZj0hMTtzd2l0Y2goYi5rZXlDb2RlKXtjYXNlIGMuUklHSFQ6Y2FzZSBjLkRPV046Zj10aGlzLmhlYWRlcnNbKGUrMSklZF07YnJlYWs7Y2FzZSBjLkxFRlQ6Y2FzZSBjLlVQOmY9dGhpcy5oZWFkZXJzWyhlLTErZCklZF07YnJlYWs7Y2FzZSBjLlNQQUNFOmNhc2UgYy5FTlRFUjp0aGlzLl9jbGlja0hhbmRsZXIoe3RhcmdldDpiLnRhcmdldH0sYi50YXJnZXQpLGIucHJldmVudERlZmF1bHQoKX1pZihmKXthKGIudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGEoZikuYXR0cigidGFiSW5kZXgiLDApLGYuZm9jdXMoKTtyZXR1cm4hMX1yZXR1cm4hMH19LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucyxjO2lmKGIuZmlsbFNwYWNlKXtpZihhLmJyb3dzZXIubXNpZSl7dmFyIGQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmNzcygib3ZlcmZsb3ciKTt0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpfWM9dGhpcy5lbGVtZW50LnBhcmVudCgpLmhlaWdodCgpLGEuYnJvd3Nlci5tc2llJiZ0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsZCksdGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24oKXtjLT1hKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2EodGhpcykuaGVpZ2h0KE1hdGgubWF4KDAsYy1hKHRoaXMpLmlubmVySGVpZ2h0KCkrYSh0aGlzKS5oZWlnaHQoKSkpfSkuY3NzKCJvdmVyZmxvdyIsImF1dG8iKX1lbHNlIGIuYXV0b0hlaWdodCYmKGM9MCx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtjPU1hdGgubWF4KGMsYSh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChjKSk7cmV0dXJuIHRoaXN9LGFjdGl2YXRlOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucy5hY3RpdmU9YTt2YXIgYj10aGlzLl9maW5kQWN0aXZlKGEpWzBdO3RoaXMuX2NsaWNrSGFuZGxlcih7dGFyZ2V0OmJ9LGIpO3JldHVybiB0aGlzfSxfZmluZEFjdGl2ZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90eXBlb2YgYj09Im51bWJlciI/dGhpcy5oZWFkZXJzLmZpbHRlcigiOmVxKCIrYisiKSIpOnRoaXMuaGVhZGVycy5ub3QodGhpcy5oZWFkZXJzLm5vdChiKSk6Yj09PSExP2EoW10pOnRoaXMuaGVhZGVycy5maWx0ZXIoIjplcSgwKSIpfSxfY2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5vcHRpb25zO2lmKCFkLmRpc2FibGVkKXtpZighYi50YXJnZXQpe2lmKCFkLmNvbGxhcHNpYmxlKXJldHVybjt0aGlzLmFjdGl2ZS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCkuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXIpLHRoaXMuYWN0aXZlLm5leHQoKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIik7dmFyIGU9dGhpcy5hY3RpdmUubmV4dCgpLGY9e29wdGlvbnM6ZCxuZXdIZWFkZXI6YShbXSksb2xkSGVhZGVyOmQuYWN0aXZlLG5ld0NvbnRlbnQ6YShbXSksb2xkQ29udGVudDplfSxnPXRoaXMuYWN0aXZlPWEoW10pO3RoaXMuX3RvZ2dsZShnLGUsZik7cmV0dXJufXZhciBoPWEoYi5jdXJyZW50VGFyZ2V0fHxjKSxpPWhbMF09PT10aGlzLmFjdGl2ZVswXTtkLmFjdGl2ZT1kLmNvbGxhcHNpYmxlJiZpPyExOnRoaXMuaGVhZGVycy5pbmRleChoKTtpZih0aGlzLnJ1bm5pbmd8fCFkLmNvbGxhcHNpYmxlJiZpKXJldHVybjt2YXIgaj10aGlzLmFjdGl2ZSxnPWgubmV4dCgpLGU9dGhpcy5hY3RpdmUubmV4dCgpLGY9e29wdGlvbnM6ZCxuZXdIZWFkZXI6aSYmZC5jb2xsYXBzaWJsZT9hKFtdKTpoLG9sZEhlYWRlcjp0aGlzLmFjdGl2ZSxuZXdDb250ZW50OmkmJmQuY29sbGFwc2libGU/YShbXSk6ZyxvbGRDb250ZW50OmV9LGs9dGhpcy5oZWFkZXJzLmluZGV4KHRoaXMuYWN0aXZlWzBdKT50aGlzLmhlYWRlcnMuaW5kZXgoaFswXSk7dGhpcy5hY3RpdmU9aT9hKFtdKTpoLHRoaXMuX3RvZ2dsZShnLGUsZixpLGspLGoucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmNoaWxkcmVuKCIudWktaWNvbiIpLnJlbW92ZUNsYXNzKGQuaWNvbnMuaGVhZGVyU2VsZWN0ZWQpLmFkZENsYXNzKGQuaWNvbnMuaGVhZGVyKSxpfHwoaC5yZW1vdmVDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlQ2xhc3MoZC5pY29ucy5oZWFkZXIpLmFkZENsYXNzKGQuaWNvbnMuaGVhZGVyU2VsZWN0ZWQpLGgubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSk7cmV0dXJufX0sX3RvZ2dsZTpmdW5jdGlvbihiLGMsZCxlLGYpe3ZhciBnPXRoaXMsaD1nLm9wdGlvbnM7Zy50b1Nob3c9YixnLnRvSGlkZT1jLGcuZGF0YT1kO3ZhciBpPWZ1bmN0aW9uKCl7aWYoISFnKXJldHVybiBnLl9jb21wbGV0ZWQuYXBwbHkoZyxhcmd1bWVudHMpfTtnLl90cmlnZ2VyKCJjaGFuZ2VzdGFydCIsbnVsbCxnLmRhdGEpLGcucnVubmluZz1jLnNpemUoKT09PTA/Yi5zaXplKCk6Yy5zaXplKCk7aWYoaC5hbmltYXRlZCl7dmFyIGo9e307aC5jb2xsYXBzaWJsZSYmZT9qPXt0b1Nob3c6YShbXSksdG9IaWRlOmMsY29tcGxldGU6aSxkb3duOmYsYXV0b0hlaWdodDpoLmF1dG9IZWlnaHR8fGguZmlsbFNwYWNlfTpqPXt0b1Nob3c6Yix0b0hpZGU6Yyxjb21wbGV0ZTppLGRvd246ZixhdXRvSGVpZ2h0OmguYXV0b0hlaWdodHx8aC5maWxsU3BhY2V9LGgucHJveGllZHx8KGgucHJveGllZD1oLmFuaW1hdGVkKSxoLnByb3hpZWREdXJhdGlvbnx8KGgucHJveGllZER1cmF0aW9uPWguZHVyYXRpb24pLGguYW5pbWF0ZWQ9YS5pc0Z1bmN0aW9uKGgucHJveGllZCk/aC5wcm94aWVkKGopOmgucHJveGllZCxoLmR1cmF0aW9uPWEuaXNGdW5jdGlvbihoLnByb3hpZWREdXJhdGlvbik/aC5wcm94aWVkRHVyYXRpb24oaik6aC5wcm94aWVkRHVyYXRpb247dmFyIGs9YS51aS5hY2NvcmRpb24uYW5pbWF0aW9ucyxsPWguZHVyYXRpb24sbT1oLmFuaW1hdGVkO20mJiFrW21dJiYhYS5lYXNpbmdbbV0mJihtPSJzbGlkZSIpLGtbbV18fChrW21dPWZ1bmN0aW9uKGEpe3RoaXMuc2xpZGUoYSx7ZWFzaW5nOm0sZHVyYXRpb246bHx8NzAwfSl9KSxrW21dKGopfWVsc2UgaC5jb2xsYXBzaWJsZSYmZT9iLnRvZ2dsZSgpOihjLmhpZGUoKSxiLnNob3coKSksaSghMCk7Yy5wcmV2KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KS5ibHVyKCksYi5wcmV2KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KS5mb2N1cygpfSxfY29tcGxldGVkOmZ1bmN0aW9uKGEpe3RoaXMucnVubmluZz1hPzA6LS10aGlzLnJ1bm5pbmc7dGhpcy5ydW5uaW5nfHwodGhpcy5vcHRpb25zLmNsZWFyU3R5bGUmJnRoaXMudG9TaG93LmFkZCh0aGlzLnRvSGlkZSkuY3NzKHtoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KSx0aGlzLnRvSGlkZS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIiksdGhpcy50b0hpZGUubGVuZ3RoJiYodGhpcy50b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lPXRoaXMudG9IaWRlLnBhcmVudCgpWzBdLmNsYXNzTmFtZSksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixudWxsLHRoaXMuZGF0YSkpfX0pLGEuZXh0ZW5kKGEudWkuYWNjb3JkaW9uLHt2ZXJzaW9uOiIxLjguMTciLGFuaW1hdGlvbnM6e3NsaWRlOmZ1bmN0aW9uKGIsYyl7Yj1hLmV4dGVuZCh7ZWFzaW5nOiJzd2luZyIsZHVyYXRpb246MzAwfSxiLGMpO2lmKCFiLnRvSGlkZS5zaXplKCkpYi50b1Nob3cuYW5pbWF0ZSh7aGVpZ2h0OiJzaG93IixwYWRkaW5nVG9wOiJzaG93IixwYWRkaW5nQm90dG9tOiJzaG93In0sYik7ZWxzZXtpZighYi50b1Nob3cuc2l6ZSgpKXtiLnRvSGlkZS5hbmltYXRlKHtoZWlnaHQ6ImhpZGUiLHBhZGRpbmdUb3A6ImhpZGUiLHBhZGRpbmdCb3R0b206ImhpZGUifSxiKTtyZXR1cm59dmFyIGQ9Yi50b1Nob3cuY3NzKCJvdmVyZmxvdyIpLGU9MCxmPXt9LGc9e30saD1bImhlaWdodCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0saSxqPWIudG9TaG93O2k9alswXS5zdHlsZS53aWR0aCxqLndpZHRoKGoucGFyZW50KCkud2lkdGgoKS1wYXJzZUZsb2F0KGouY3NzKCJwYWRkaW5nTGVmdCIpKS1wYXJzZUZsb2F0KGouY3NzKCJwYWRkaW5nUmlnaHQiKSktKHBhcnNlRmxvYXQoai5jc3MoImJvcmRlckxlZnRXaWR0aCIpKXx8MCktKHBhcnNlRmxvYXQoai5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSl8fDApKSxhLmVhY2goaCxmdW5jdGlvbihjLGQpe2dbZF09ImhpZGUiO3ZhciBlPSgiIithLmNzcyhiLnRvU2hvd1swXSxkKSkubWF0Y2goL14oW1xkKy0uXSspKC4qKSQvKTtmW2RdPXt2YWx1ZTplWzFdLHVuaXQ6ZVsyXXx8InB4In19KSxiLnRvU2hvdy5jc3Moe2hlaWdodDowLG92ZXJmbG93OiJoaWRkZW4ifSkuc2hvdygpLGIudG9IaWRlLmZpbHRlcigiOmhpZGRlbiIpLmVhY2goYi5jb21wbGV0ZSkuZW5kKCkuZmlsdGVyKCI6dmlzaWJsZSIpLmFuaW1hdGUoZyx7c3RlcDpmdW5jdGlvbihhLGMpe2MucHJvcD09ImhlaWdodCImJihlPWMuZW5kLWMuc3RhcnQ9PT0wPzA6KGMubm93LWMuc3RhcnQpLyhjLmVuZC1jLnN0YXJ0KSksYi50b1Nob3dbMF0uc3R5bGVbYy5wcm9wXT1lKmZbYy5wcm9wXS52YWx1ZStmW2MucHJvcF0udW5pdH0sZHVyYXRpb246Yi5kdXJhdGlvbixlYXNpbmc6Yi5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmF1dG9IZWlnaHR8fGIudG9TaG93LmNzcygiaGVpZ2h0IiwiIiksYi50b1Nob3cuY3NzKHt3aWR0aDppLG92ZXJmbG93OmR9KSxiLmNvbXBsZXRlKCl9fSl9fSxib3VuY2VzbGlkZTpmdW5jdGlvbihhKXt0aGlzLnNsaWRlKGEse2Vhc2luZzphLmRvd24/ImVhc2VPdXRCb3VuY2UiOiJzd2luZyIsZHVyYXRpb246YS5kb3duPzFlMzoyMDB9KX19fSl9KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBBdXRvY29tcGxldGUgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9BdXRvY29tcGxldGUKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LnVpLmNvcmUuanMKICoJanF1ZXJ5LnVpLndpZGdldC5qcwogKglqcXVlcnkudWkucG9zaXRpb24uanMKICovKGZ1bmN0aW9uKGEsYil7dmFyIGM9MDthLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIix7b3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbH0scGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQsZDt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLmF0dHIoe3JvbGU6InRleHRib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Imxpc3QiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9KS5iaW5kKCJrZXlkb3duLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYyl7aWYoIWIub3B0aW9ucy5kaXNhYmxlZCYmIWIuZWxlbWVudC5wcm9wQXR0cigicmVhZE9ubHkiKSl7ZD0hMTt2YXIgZT1hLnVpLmtleUNvZGU7c3dpdGNoKGMua2V5Q29kZSl7Y2FzZSBlLlBBR0VfVVA6Yi5fbW92ZSgicHJldmlvdXNQYWdlIixjKTticmVhaztjYXNlIGUuUEFHRV9ET1dOOmIuX21vdmUoIm5leHRQYWdlIixjKTticmVhaztjYXNlIGUuVVA6Yi5fbW92ZSgicHJldmlvdXMiLGMpLGMucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIGUuRE9XTjpiLl9tb3ZlKCJuZXh0IixjKSxjLnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBlLkVOVEVSOmNhc2UgZS5OVU1QQURfRU5URVI6Yi5tZW51LmFjdGl2ZSYmKGQ9ITAsYy5wcmV2ZW50RGVmYXVsdCgpKTtjYXNlIGUuVEFCOmlmKCFiLm1lbnUuYWN0aXZlKXJldHVybjtiLm1lbnUuc2VsZWN0KGMpO2JyZWFrO2Nhc2UgZS5FU0NBUEU6Yi5lbGVtZW50LnZhbChiLnRlcm0pLGIuY2xvc2UoYyk7YnJlYWs7ZGVmYXVsdDpjbGVhclRpbWVvdXQoYi5zZWFyY2hpbmcpLGIuc2VhcmNoaW5nPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtiLnRlcm0hPWIuZWxlbWVudC52YWwoKSYmKGIuc2VsZWN0ZWRJdGVtPW51bGwsYi5zZWFyY2gobnVsbCxjKSl9LGIub3B0aW9ucy5kZWxheSl9fX0pLmJpbmQoImtleXByZXNzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7ZCYmKGQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKX0pLmJpbmQoImZvY3VzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oKXtiLm9wdGlvbnMuZGlzYWJsZWR8fChiLnNlbGVjdGVkSXRlbT1udWxsLGIucHJldmlvdXM9Yi5lbGVtZW50LnZhbCgpKX0pLmJpbmQoImJsdXIuYXV0b2NvbXBsZXRlIixmdW5jdGlvbihhKXtiLm9wdGlvbnMuZGlzYWJsZWR8fChjbGVhclRpbWVvdXQoYi5zZWFyY2hpbmcpLGIuY2xvc2luZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jbG9zZShhKSxiLl9jaGFuZ2UoYSl9LDE1MCkpfSksdGhpcy5faW5pdFNvdXJjZSgpLHRoaXMucmVzcG9uc2U9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fcmVzcG9uc2UuYXBwbHkoYixhcmd1bWVudHMpfSx0aGlzLm1lbnU9YSgiPHVsPjwvdWw+IikuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZSIpLmFwcGVuZFRvKGEodGhpcy5vcHRpb25zLmFwcGVuZFRvfHwiYm9keSIsYylbMF0pLm1vdXNlZG93bihmdW5jdGlvbihjKXt2YXIgZD1iLm1lbnUuZWxlbWVudFswXTthKGMudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikubGVuZ3RofHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YShkb2N1bWVudCkub25lKCJtb3VzZWRvd24iLGZ1bmN0aW9uKGMpe2MudGFyZ2V0IT09Yi5lbGVtZW50WzBdJiZjLnRhcmdldCE9PWQmJiFhLnVpLmNvbnRhaW5zKGQsYy50YXJnZXQpJiZiLmNsb3NlKCl9KX0sMSksc2V0VGltZW91dChmdW5jdGlvbigpe2NsZWFyVGltZW91dChiLmNsb3NpbmcpfSwxMyl9KS5tZW51KHtmb2N1czpmdW5jdGlvbihhLGMpe3ZhciBkPWMuaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpOyExIT09Yi5fdHJpZ2dlcigiZm9jdXMiLGEse2l0ZW06ZH0pJiYvXmtleS8udGVzdChhLm9yaWdpbmFsRXZlbnQudHlwZSkmJmIuZWxlbWVudC52YWwoZC52YWx1ZSl9LHNlbGVjdGVkOmZ1bmN0aW9uKGEsZCl7dmFyIGU9ZC5pdGVtLmRhdGEoIml0ZW0uYXV0b2NvbXBsZXRlIiksZj1iLnByZXZpb3VzO2IuZWxlbWVudFswXSE9PWMuYWN0aXZlRWxlbWVudCYmKGIuZWxlbWVudC5mb2N1cygpLGIucHJldmlvdXM9ZixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5wcmV2aW91cz1mLGIuc2VsZWN0ZWRJdGVtPWV9LDEpKSwhMSE9PWIuX3RyaWdnZXIoInNlbGVjdCIsYSx7aXRlbTplfSkmJmIuZWxlbWVudC52YWwoZS52YWx1ZSksYi50ZXJtPWIuZWxlbWVudC52YWwoKSxiLmNsb3NlKGEpLGIuc2VsZWN0ZWRJdGVtPWV9LGJsdXI6ZnVuY3Rpb24oYSxjKXtiLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmYi5lbGVtZW50LnZhbCgpIT09Yi50ZXJtJiZiLmVsZW1lbnQudmFsKGIudGVybSl9fSkuekluZGV4KHRoaXMuZWxlbWVudC56SW5kZXgoKSsxKS5jc3Moe3RvcDowLGxlZnQ6MH0pLmhpZGUoKS5kYXRhKCJtZW51IiksYS5mbi5iZ2lmcmFtZSYmdGhpcy5tZW51LmVsZW1lbnQuYmdpZnJhbWUoKSxiLmJlZm9yZXVubG9hZEhhbmRsZXI9ZnVuY3Rpb24oKXtiLmVsZW1lbnQucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIil9LGEod2luZG93KS5iaW5kKCJiZWZvcmV1bmxvYWQiLGIuYmVmb3JldW5sb2FkSGFuZGxlcil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWF1dG9jb21wbGV0ZSIpLnJlbW92ZUF0dHIoImFyaWEtaGFzcG9wdXAiKSx0aGlzLm1lbnUuZWxlbWVudC5yZW1vdmUoKSxhKHdpbmRvdykudW5iaW5kKCJiZWZvcmV1bmxvYWQiLHRoaXMuYmVmb3JldW5sb2FkSGFuZGxlciksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2EuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiPT09InNvdXJjZSImJnRoaXMuX2luaXRTb3VyY2UoKSxiPT09ImFwcGVuZFRvIiYmdGhpcy5tZW51LmVsZW1lbnQuYXBwZW5kVG8oYShjfHwiYm9keSIsdGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQpWzBdKSxiPT09ImRpc2FibGVkIiYmYyYmdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCl9LF9pbml0U291cmNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxkLGU7YS5pc0FycmF5KHRoaXMub3B0aW9ucy5zb3VyY2UpPyhkPXRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy5zb3VyY2U9ZnVuY3Rpb24oYixjKXtjKGEudWkuYXV0b2NvbXBsZXRlLmZpbHRlcihkLGIudGVybSkpfSk6dHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2U9PSJzdHJpbmciPyhlPXRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy5zb3VyY2U9ZnVuY3Rpb24oZCxmKXtiLnhociYmYi54aHIuYWJvcnQoKSxiLnhocj1hLmFqYXgoe3VybDplLGRhdGE6ZCxkYXRhVHlwZToianNvbiIsYXV0b2NvbXBsZXRlUmVxdWVzdDorK2Msc3VjY2VzczpmdW5jdGlvbihhLGIpe3RoaXMuYXV0b2NvbXBsZXRlUmVxdWVzdD09PWMmJmYoYSl9LGVycm9yOmZ1bmN0aW9uKCl7dGhpcy5hdXRvY29tcGxldGVSZXF1ZXN0PT09YyYmZihbXSl9fSl9KTp0aGlzLnNvdXJjZT10aGlzLm9wdGlvbnMuc291cmNlfSxzZWFyY2g6ZnVuY3Rpb24oYSxiKXthPWEhPW51bGw/YTp0aGlzLmVsZW1lbnQudmFsKCksdGhpcy50ZXJtPXRoaXMuZWxlbWVudC52YWwoKTtpZihhLmxlbmd0aDx0aGlzLm9wdGlvbnMubWluTGVuZ3RoKXJldHVybiB0aGlzLmNsb3NlKGIpO2NsZWFyVGltZW91dCh0aGlzLmNsb3NpbmcpO2lmKHRoaXMuX3RyaWdnZXIoInNlYXJjaCIsYikhPT0hMSlyZXR1cm4gdGhpcy5fc2VhcmNoKGEpfSxfc2VhcmNoOmZ1bmN0aW9uKGEpe3RoaXMucGVuZGluZysrLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlLWxvYWRpbmciKSx0aGlzLnNvdXJjZSh7dGVybTphfSx0aGlzLnJlc3BvbnNlKX0sX3Jlc3BvbnNlOmZ1bmN0aW9uKGEpeyF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmEmJmEubGVuZ3RoPyhhPXRoaXMuX25vcm1hbGl6ZShhKSx0aGlzLl9zdWdnZXN0KGEpLHRoaXMuX3RyaWdnZXIoIm9wZW4iKSk6dGhpcy5jbG9zZSgpLHRoaXMucGVuZGluZy0tLHRoaXMucGVuZGluZ3x8dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpfSxjbG9zZTpmdW5jdGlvbihhKXtjbGVhclRpbWVvdXQodGhpcy5jbG9zaW5nKSx0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmKHRoaXMubWVudS5lbGVtZW50LmhpZGUoKSx0aGlzLm1lbnUuZGVhY3RpdmF0ZSgpLHRoaXMuX3RyaWdnZXIoImNsb3NlIixhKSl9LF9jaGFuZ2U6ZnVuY3Rpb24oYSl7dGhpcy5wcmV2aW91cyE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixhLHtpdGVtOnRoaXMuc2VsZWN0ZWRJdGVtfSl9LF9ub3JtYWxpemU6ZnVuY3Rpb24oYil7aWYoYi5sZW5ndGgmJmJbMF0ubGFiZWwmJmJbMF0udmFsdWUpcmV0dXJuIGI7cmV0dXJuIGEubWFwKGIsZnVuY3Rpb24oYil7aWYodHlwZW9mIGI9PSJzdHJpbmciKXJldHVybntsYWJlbDpiLHZhbHVlOmJ9O3JldHVybiBhLmV4dGVuZCh7bGFiZWw6Yi5sYWJlbHx8Yi52YWx1ZSx2YWx1ZTpiLnZhbHVlfHxiLmxhYmVsfSxiKX0pfSxfc3VnZ2VzdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm1lbnUuZWxlbWVudC5lbXB0eSgpLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSk7dGhpcy5fcmVuZGVyTWVudShjLGIpLHRoaXMubWVudS5kZWFjdGl2YXRlKCksdGhpcy5tZW51LnJlZnJlc2goKSxjLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksYy5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dChuZXcgYS5FdmVudCgibW91c2VvdmVyIikpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWVudS5lbGVtZW50O2Eub3V0ZXJXaWR0aChNYXRoLm1heChhLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpczthLmVhY2goYyxmdW5jdGlvbihhLGMpe2QuX3JlbmRlckl0ZW0oYixjKX0pfSxfcmVuZGVySXRlbTpmdW5jdGlvbihiLGMpe3JldHVybiBhKCI8bGk+PC9saT4iKS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIsYykuYXBwZW5kKGEoIjxhPjwvYT4iKS50ZXh0KGMubGFiZWwpKS5hcHBlbmRUbyhiKX0sX21vdmU6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpdGhpcy5zZWFyY2gobnVsbCxiKTtlbHNle2lmKHRoaXMubWVudS5maXJzdCgpJiYvXnByZXZpb3VzLy50ZXN0KGEpfHx0aGlzLm1lbnUubGFzdCgpJiYvXm5leHQvLnRlc3QoYSkpe3RoaXMuZWxlbWVudC52YWwodGhpcy50ZXJtKSx0aGlzLm1lbnUuZGVhY3RpdmF0ZSgpO3JldHVybn10aGlzLm1lbnVbYV0oYil9fSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51LmVsZW1lbnR9fSksYS5leHRlbmQoYS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csIlxcJCYiKX0sZmlsdGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IFJlZ0V4cChhLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleChjKSwiaSIpO3JldHVybiBhLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gZC50ZXN0KGEubGFiZWx8fGEudmFsdWV8fGEpfSl9fSl9KShqUXVlcnkpLGZ1bmN0aW9uKGEpe2Eud2lkZ2V0KCJ1aS5tZW51Iix7X2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToibGlzdGJveCIsImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6InVpLWFjdGl2ZS1tZW51aXRlbSJ9KS5jbGljayhmdW5jdGlvbihjKXshYShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSBhIikubGVuZ3RofHwoYy5wcmV2ZW50RGVmYXVsdCgpLGIuc2VsZWN0KGMpKX0pLHRoaXMucmVmcmVzaCgpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPXRoaXMuZWxlbWVudC5jaGlsZHJlbigibGk6bm90KC51aS1tZW51LWl0ZW0pOmhhcyhhKSIpLmFkZENsYXNzKCJ1aS1tZW51LWl0ZW0iKS5hdHRyKCJyb2xlIiwibWVudWl0ZW0iKTtjLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLWNvcm5lci1hbGwiKS5hdHRyKCJ0YWJpbmRleCIsLTEpLm1vdXNlZW50ZXIoZnVuY3Rpb24oYyl7Yi5hY3RpdmF0ZShjLGEodGhpcykucGFyZW50KCkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2IuZGVhY3RpdmF0ZSgpfSl9LGFjdGl2YXRlOmZ1bmN0aW9uKGEsYil7dGhpcy5kZWFjdGl2YXRlKCk7aWYodGhpcy5oYXNTY3JvbGwoKSl7dmFyIGM9Yi5vZmZzZXQoKS50b3AtdGhpcy5lbGVtZW50Lm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5zY3JvbGxUb3AoKSxlPXRoaXMuZWxlbWVudC5oZWlnaHQoKTtjPDA/dGhpcy5lbGVtZW50LnNjcm9sbFRvcChkK2MpOmM+PWUmJnRoaXMuZWxlbWVudC5zY3JvbGxUb3AoZCtjLWUrYi5oZWlnaHQoKSl9dGhpcy5hY3RpdmU9Yi5lcSgwKS5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLmF0dHIoImlkIiwidWktYWN0aXZlLW1lbnVpdGVtIikuZW5kKCksdGhpcy5fdHJpZ2dlcigiZm9jdXMiLGEse2l0ZW06Yn0pfSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7IXRoaXMuYWN0aXZlfHwodGhpcy5hY3RpdmUuY2hpbGRyZW4oImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKS5yZW1vdmVBdHRyKCJpZCIpLHRoaXMuX3RyaWdnZXIoImJsdXIiKSx0aGlzLmFjdGl2ZT1udWxsKX0sbmV4dDpmdW5jdGlvbihhKXt0aGlzLm1vdmUoIm5leHQiLCIudWktbWVudS1pdGVtOmZpcnN0IixhKX0scHJldmlvdXM6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlKCJwcmV2IiwiLnVpLW1lbnUtaXRlbTpsYXN0IixhKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sbW92ZTpmdW5jdGlvbihhLGIsYyl7aWYoIXRoaXMuYWN0aXZlKXRoaXMuYWN0aXZhdGUoYyx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oYikpO2Vsc2V7dmFyIGQ9dGhpcy5hY3RpdmVbYSsiQWxsIl0oIi51aS1tZW51LWl0ZW0iKS5lcSgwKTtkLmxlbmd0aD90aGlzLmFjdGl2YXRlKGMsZCk6dGhpcy5hY3RpdmF0ZShjLHRoaXMuZWxlbWVudC5jaGlsZHJlbihiKSl9fSxuZXh0UGFnZTpmdW5jdGlvbihiKXtpZih0aGlzLmhhc1Njcm9sbCgpKXtpZighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpO3JldHVybn12YXIgYz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuaGVpZ2h0KCksZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLm9mZnNldCgpLnRvcC1jLWQrYSh0aGlzKS5oZWlnaHQoKTtyZXR1cm4gYjwxMCYmYj4tMTB9KTtlLmxlbmd0aHx8KGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSksdGhpcy5hY3RpdmF0ZShiLGUpfWVsc2UgdGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpPyI6Zmlyc3QiOiI6bGFzdCIpKX0scHJldmlvdXNQYWdlOmZ1bmN0aW9uKGIpe2lmKHRoaXMuaGFzU2Nyb2xsKCkpe2lmKCF0aGlzLmFjdGl2ZXx8dGhpcy5maXJzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSk7cmV0dXJufXZhciBjPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5oZWlnaHQoKTtyZXN1bHQ9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKS5vZmZzZXQoKS50b3AtYytkLWEodGhpcykuaGVpZ2h0KCk7cmV0dXJuIGI8MTAmJmI+LTEwfSkscmVzdWx0Lmxlbmd0aHx8KHJlc3VsdD10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW06Zmlyc3QiKSksdGhpcy5hY3RpdmF0ZShiLHJlc3VsdCl9ZWxzZSB0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKCF0aGlzLmFjdGl2ZXx8dGhpcy5maXJzdCgpPyI6bGFzdCI6IjpmaXJzdCIpKX0saGFzU2Nyb2xsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5oZWlnaHQoKTx0aGlzLmVsZW1lbnRbYS5mbi5wcm9wPyJwcm9wIjoiYXR0ciJdKCJzY3JvbGxIZWlnaHQiKX0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMuX3RyaWdnZXIoInNlbGVjdGVkIixhLHtpdGVtOnRoaXMuYWN0aXZlfSl9fSl9KGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIEJ1dHRvbiAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0J1dHRvbgogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLyhmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9InVpLWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIixoPSJ1aS1zdGF0ZS1ob3ZlciB1aS1zdGF0ZS1hY3RpdmUgIixpPSJ1aS1idXR0b24taWNvbnMtb25seSB1aS1idXR0b24taWNvbi1vbmx5IHVpLWJ1dHRvbi10ZXh0LWljb25zIHVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSB1aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSB1aS1idXR0b24tdGV4dC1vbmx5IixqPWZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKS5maW5kKCI6dWktYnV0dG9uIik7c2V0VGltZW91dChmdW5jdGlvbigpe2IuYnV0dG9uKCJyZWZyZXNoIil9LDEpfSxrPWZ1bmN0aW9uKGIpe3ZhciBjPWIubmFtZSxkPWIuZm9ybSxlPWEoW10pO2MmJihkP2U9YShkKS5maW5kKCJbbmFtZT0nIitjKyInXSIpOmU9YSgiW25hbWU9JyIrYysiJ10iLGIub3duZXJEb2N1bWVudCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZm9ybX0pKTtyZXR1cm4gZX07YS53aWRnZXQoInVpLmJ1dHRvbiIse29wdGlvbnM6e2Rpc2FibGVkOm51bGwsdGV4dDohMCxsYWJlbDpudWxsLGljb25zOntwcmltYXJ5Om51bGwsc2Vjb25kYXJ5Om51bGx9fSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmNsb3Nlc3QoImZvcm0iKS51bmJpbmQoInJlc2V0LmJ1dHRvbiIpLmJpbmQoInJlc2V0LmJ1dHRvbiIsaiksdHlwZW9mIHRoaXMub3B0aW9ucy5kaXNhYmxlZCE9ImJvb2xlYW4iJiYodGhpcy5vcHRpb25zLmRpc2FibGVkPXRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiKSksdGhpcy5fZGV0ZXJtaW5lQnV0dG9uVHlwZSgpLHRoaXMuaGFzVGl0bGU9ISF0aGlzLmJ1dHRvbkVsZW1lbnQuYXR0cigidGl0bGUiKTt2YXIgYj10aGlzLGg9dGhpcy5vcHRpb25zLGk9dGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIixsPSJ1aS1zdGF0ZS1ob3ZlciIrKGk/IiI6IiB1aS1zdGF0ZS1hY3RpdmUiKSxtPSJ1aS1zdGF0ZS1mb2N1cyI7aC5sYWJlbD09PW51bGwmJihoLmxhYmVsPXRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpLHRoaXMuZWxlbWVudC5pcygiOmRpc2FibGVkIikmJihoLmRpc2FibGVkPSEwKSx0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoZykuYXR0cigicm9sZSIsImJ1dHRvbiIpLmJpbmQoIm1vdXNlZW50ZXIuYnV0dG9uIixmdW5jdGlvbigpe2guZGlzYWJsZWR8fChhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXM9PT1jJiZhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSl9KS5iaW5kKCJtb3VzZWxlYXZlLmJ1dHRvbiIsZnVuY3Rpb24oKXtoLmRpc2FibGVkfHxhKHRoaXMpLnJlbW92ZUNsYXNzKGwpfSkuYmluZCgiY2xpY2suYnV0dG9uIixmdW5jdGlvbihhKXtoLmRpc2FibGVkJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5lbGVtZW50LmJpbmQoImZvY3VzLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MobSl9KS5iaW5kKCJibHVyLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MobSl9KSxpJiYodGhpcy5lbGVtZW50LmJpbmQoImNoYW5nZS5idXR0b24iLGZ1bmN0aW9uKCl7Znx8Yi5yZWZyZXNoKCl9KSx0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duLmJ1dHRvbiIsZnVuY3Rpb24oYSl7aC5kaXNhYmxlZHx8KGY9ITEsZD1hLnBhZ2VYLGU9YS5wYWdlWSl9KS5iaW5kKCJtb3VzZXVwLmJ1dHRvbiIsZnVuY3Rpb24oYSl7IWguZGlzYWJsZWQmJihkIT09YS5wYWdlWHx8ZSE9PWEucGFnZVkpJiYoZj0hMCl9KSksdGhpcy50eXBlPT09ImNoZWNrYm94Ij90aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgiY2xpY2suYnV0dG9uIixmdW5jdGlvbigpe2lmKGguZGlzYWJsZWR8fGYpcmV0dXJuITE7YSh0aGlzKS50b2dnbGVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksYi5idXR0b25FbGVtZW50LmF0dHIoImFyaWEtcHJlc3NlZCIsYi5lbGVtZW50WzBdLmNoZWNrZWQpfSk6dGhpcy50eXBlPT09InJhZGlvIj90aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgiY2xpY2suYnV0dG9uIixmdW5jdGlvbigpe2lmKGguZGlzYWJsZWR8fGYpcmV0dXJuITE7YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksYi5idXR0b25FbGVtZW50LmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTt2YXIgYz1iLmVsZW1lbnRbMF07ayhjKS5ub3QoYykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6KHRoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCJtb3VzZWRvd24uYnV0dG9uIixmdW5jdGlvbigpe2lmKGguZGlzYWJsZWQpcmV0dXJuITE7YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksYz10aGlzLGEoZG9jdW1lbnQpLm9uZSgibW91c2V1cCIsZnVuY3Rpb24oKXtjPW51bGx9KX0pLmJpbmQoIm1vdXNldXAuYnV0dG9uIixmdW5jdGlvbigpe2lmKGguZGlzYWJsZWQpcmV0dXJuITE7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KS5iaW5kKCJrZXlkb3duLmJ1dHRvbiIsZnVuY3Rpb24oYil7aWYoaC5kaXNhYmxlZClyZXR1cm4hMTsoYi5rZXlDb2RlPT1hLnVpLmtleUNvZGUuU1BBQ0V8fGIua2V5Q29kZT09YS51aS5rZXlDb2RlLkVOVEVSKSYmYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KS5iaW5kKCJrZXl1cC5idXR0b24iLGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KSx0aGlzLmJ1dHRvbkVsZW1lbnQuaXMoImEiKSYmdGhpcy5idXR0b25FbGVtZW50LmtleXVwKGZ1bmN0aW9uKGIpe2Iua2V5Q29kZT09PWEudWkua2V5Q29kZS5TUEFDRSYmYSh0aGlzKS5jbGljaygpfSkpLHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLGguZGlzYWJsZWQpLHRoaXMuX3Jlc2V0QnV0dG9uKCl9LF9kZXRlcm1pbmVCdXR0b25UeXBlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tib3giKT90aGlzLnR5cGU9ImNoZWNrYm94Ijp0aGlzLmVsZW1lbnQuaXMoIjpyYWRpbyIpP3RoaXMudHlwZT0icmFkaW8iOnRoaXMuZWxlbWVudC5pcygiaW5wdXQiKT90aGlzLnR5cGU9ImlucHV0Ijp0aGlzLnR5cGU9ImJ1dHRvbiI7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIil7dmFyIGE9dGhpcy5lbGVtZW50LnBhcmVudHMoKS5maWx0ZXIoIjpsYXN0IiksYj0ibGFiZWxbZm9yPSciK3RoaXMuZWxlbWVudC5hdHRyKCJpZCIpKyInXSI7dGhpcy5idXR0b25FbGVtZW50PWEuZmluZChiKSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwoYT1hLmxlbmd0aD9hLnNpYmxpbmdzKCk6dGhpcy5lbGVtZW50LnNpYmxpbmdzKCksdGhpcy5idXR0b25FbGVtZW50PWEuZmlsdGVyKGIpLHRoaXMuYnV0dG9uRWxlbWVudC5sZW5ndGh8fCh0aGlzLmJ1dHRvbkVsZW1lbnQ9YS5maW5kKGIpKSksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKTt2YXIgYz10aGlzLmVsZW1lbnQuaXMoIjpjaGVja2VkIik7YyYmdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIixjKX1lbHNlIHRoaXMuYnV0dG9uRWxlbWVudD10aGlzLmVsZW1lbnR9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1dHRvbkVsZW1lbnR9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhnKyIgIitoKyIgIitpKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1wcmVzc2VkIikuaHRtbCh0aGlzLmJ1dHRvbkVsZW1lbnQuZmluZCgiLnVpLWJ1dHRvbi10ZXh0IikuaHRtbCgpKSx0aGlzLmhhc1RpdGxlfHx0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQXR0cigidGl0bGUiKSxhLldpZGdldC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsYyl7YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpO2I9PT0iZGlzYWJsZWQiP2M/dGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIsITApOnRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiLCExKTp0aGlzLl9yZXNldEJ1dHRvbigpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LmlzKCI6ZGlzYWJsZWQiKTtiIT09dGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixiKSx0aGlzLnR5cGU9PT0icmFkaW8iP2sodGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5pcygiOmNoZWNrZWQiKT9hKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTphKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIil9KTp0aGlzLnR5cGU9PT0iY2hlY2tib3giJiYodGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpP3RoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpOnRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKSl9LF9yZXNldEJ1dHRvbjpmdW5jdGlvbigpe2lmKHRoaXMudHlwZT09PSJpbnB1dCIpdGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLmVsZW1lbnQudmFsKHRoaXMub3B0aW9ucy5sYWJlbCk7ZWxzZXt2YXIgYj10aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoaSksYz1hKCI8c3Bhbj48L3NwYW4+Iix0aGlzLmVsZW1lbnRbMF0ub3duZXJEb2N1bWVudCkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKGIuZW1wdHkoKSkudGV4dCgpLGQ9dGhpcy5vcHRpb25zLmljb25zLGU9ZC5wcmltYXJ5JiZkLnNlY29uZGFyeSxmPVtdO2QucHJpbWFyeXx8ZC5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZmLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhlPyJzIjpkLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxkLnByaW1hcnkmJmIucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK2QucHJpbWFyeSsiJz48L3NwYW4+IiksZC5zZWNvbmRhcnkmJmIuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitkLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChmLnB1c2goZT8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8Yi5hdHRyKCJ0aXRsZSIsYykpKTpmLnB1c2goInVpLWJ1dHRvbi10ZXh0LW9ubHkiKSxiLmFkZENsYXNzKGYuam9pbigiICIpKX19fSksYS53aWRnZXQoInVpLmJ1dHRvbnNldCIse29wdGlvbnM6e2l0ZW1zOiI6YnV0dG9uLCA6c3VibWl0LCA6cmVzZXQsIDpjaGVja2JveCwgOnJhZGlvLCBhLCA6ZGF0YShidXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT09ImRpc2FibGVkIiYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixiLGMpLGEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCI7dGhpcy5idXR0b25zPXRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZmlsdGVyKCI6dWktYnV0dG9uIikuYnV0dG9uKCJyZWZyZXNoIikuZW5kKCkubm90KCI6dWktYnV0dG9uIikuYnV0dG9uKCkuZW5kKCkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIpLmZpbHRlcigiOmZpcnN0IikuYWRkQ2xhc3MoYj8idWktY29ybmVyLXJpZ2h0IjoidWktY29ybmVyLWxlZnQiKS5lbmQoKS5maWx0ZXIoIjpsYXN0IikuYWRkQ2xhc3MoYj8idWktY29ybmVyLWxlZnQiOiJ1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5lbmQoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYnV0dG9uc2V0IiksdGhpcy5idXR0b25zLm1hcChmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IikuZW5kKCkuYnV0dG9uKCJkZXN0cm95IiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX19KX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIERpYWxvZyAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0RpYWxvZwogKgogKiBEZXBlbmRzOgogKglqcXVlcnkudWkuY29yZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqICBqcXVlcnkudWkuYnV0dG9uLmpzCiAqCWpxdWVyeS51aS5kcmFnZ2FibGUuanMKICoJanF1ZXJ5LnVpLm1vdXNlLmpzCiAqCWpxdWVyeS51aS5wb3NpdGlvbi5qcwogKglqcXVlcnkudWkucmVzaXphYmxlLmpzCiAqLyhmdW5jdGlvbihhLGIpe3ZhciBjPSJ1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgIixkPXtidXR0b25zOiEwLGhlaWdodDohMCxtYXhIZWlnaHQ6ITAsbWF4V2lkdGg6ITAsbWluSGVpZ2h0OiEwLG1pbldpZHRoOiEwLHdpZHRoOiEwfSxlPXttYXhIZWlnaHQ6ITAsbWF4V2lkdGg6ITAsbWluSGVpZ2h0OiEwLG1pbldpZHRoOiEwfSxmPWEuYXR0ckZufHx7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwLGNsaWNrOiEwfTthLndpZGdldCgidWkuZGlhbG9nIix7b3B0aW9uczp7YXV0b09wZW46ITAsYnV0dG9uczp7fSxjbG9zZU9uRXNjYXBlOiEwLGNsb3NlVGV4dDoiY2xvc2UiLGRpYWxvZ0NsYXNzOiIiLGRyYWdnYWJsZTohMCxoaWRlOm51bGwsaGVpZ2h0OiJhdXRvIixtYXhIZWlnaHQ6ITEsbWF4V2lkdGg6ITEsbWluSGVpZ2h0OjE1MCxtaW5XaWR0aDoxNTAsbW9kYWw6ITEscG9zaXRpb246e215OiJjZW50ZXIiLGF0OiJjZW50ZXIiLGNvbGxpc2lvbjoiZml0Iix1c2luZzpmdW5jdGlvbihiKXt2YXIgYz1hKHRoaXMpLmNzcyhiKS5vZmZzZXQoKS50b3A7YzwwJiZhKHRoaXMpLmNzcygidG9wIixiLnRvcC1jKX19LHJlc2l6YWJsZTohMCxzaG93Om51bGwsc3RhY2s6ITAsdGl0bGU6IiIsd2lkdGg6MzAwLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9yaWdpbmFsVGl0bGU9dGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIiksdHlwZW9mIHRoaXMub3JpZ2luYWxUaXRsZSE9InN0cmluZyImJih0aGlzLm9yaWdpbmFsVGl0bGU9IiIpLHRoaXMub3B0aW9ucy50aXRsZT10aGlzLm9wdGlvbnMudGl0bGV8fHRoaXMub3JpZ2luYWxUaXRsZTt2YXIgYj10aGlzLGQ9Yi5vcHRpb25zLGU9ZC50aXRsZXx8IiYjMTYwOyIsZj1hLnVpLmRpYWxvZy5nZXRUaXRsZUlkKGIuZWxlbWVudCksZz0oYi51aURpYWxvZz1hKCI8ZGl2PjwvZGl2PiIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5oaWRlKCkuYWRkQ2xhc3MoYytkLmRpYWxvZ0NsYXNzKS5jc3Moe3pJbmRleDpkLnpJbmRleH0pLmF0dHIoInRhYkluZGV4IiwtMSkuY3NzKCJvdXRsaW5lIiwwKS5rZXlkb3duKGZ1bmN0aW9uKGMpe2QuY2xvc2VPbkVzY2FwZSYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMua2V5Q29kZSYmYy5rZXlDb2RlPT09YS51aS5rZXlDb2RlLkVTQ0FQRSYmKGIuY2xvc2UoYyksYy5wcmV2ZW50RGVmYXVsdCgpKX0pLmF0dHIoe3JvbGU6ImRpYWxvZyIsImFyaWEtbGFiZWxsZWRieSI6Zn0pLm1vdXNlZG93bihmdW5jdGlvbihhKXtiLm1vdmVUb1RvcCghMSxhKX0pLGg9Yi5lbGVtZW50LnNob3coKS5yZW1vdmVBdHRyKCJ0aXRsZSIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmFwcGVuZFRvKGcpLGk9KGIudWlEaWFsb2dUaXRsZWJhcj1hKCI8ZGl2PjwvZGl2PiIpKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCB1aS1oZWxwZXItY2xlYXJmaXgiKS5wcmVwZW5kVG8oZyksaj1hKCc8YSBocmVmPSIjIj48L2E+JykuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSB1aS1jb3JuZXItYWxsIikuYXR0cigicm9sZSIsImJ1dHRvbiIpLmhvdmVyKGZ1bmN0aW9uKCl7ai5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXtqLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkuZm9jdXMoZnVuY3Rpb24oKXtqLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuYmx1cihmdW5jdGlvbigpe2oucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KS5jbGljayhmdW5jdGlvbihhKXtiLmNsb3NlKGEpO3JldHVybiExfSkuYXBwZW5kVG8oaSksaz0oYi51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PWEoIjxzcGFuPjwvc3Bhbj4iKSkuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIikudGV4dChkLmNsb3NlVGV4dCkuYXBwZW5kVG8oaiksbD1hKCI8c3Bhbj48L3NwYW4+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZSIpLmF0dHIoImlkIixmKS5odG1sKGUpLnByZXBlbmRUbyhpKTthLmlzRnVuY3Rpb24oZC5iZWZvcmVjbG9zZSkmJiFhLmlzRnVuY3Rpb24oZC5iZWZvcmVDbG9zZSkmJihkLmJlZm9yZUNsb3NlPWQuYmVmb3JlY2xvc2UpLGkuZmluZCgiKiIpLmFkZChpKS5kaXNhYmxlU2VsZWN0aW9uKCksZC5kcmFnZ2FibGUmJmEuZm4uZHJhZ2dhYmxlJiZiLl9tYWtlRHJhZ2dhYmxlKCksZC5yZXNpemFibGUmJmEuZm4ucmVzaXphYmxlJiZiLl9tYWtlUmVzaXphYmxlKCksYi5fY3JlYXRlQnV0dG9ucyhkLmJ1dHRvbnMpLGIuX2lzT3Blbj0hMSxhLmZuLmJnaWZyYW1lJiZnLmJnaWZyYW1lKCl9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmF1dG9PcGVuJiZ0aGlzLm9wZW4oKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5vdmVybGF5JiZhLm92ZXJsYXkuZGVzdHJveSgpLGEudWlEaWFsb2cuaGlkZSgpLGEuZWxlbWVudC51bmJpbmQoIi5kaWFsb2ciKS5yZW1vdmVEYXRhKCJkaWFsb2ciKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5oaWRlKCkuYXBwZW5kVG8oImJvZHkiKSxhLnVpRGlhbG9nLnJlbW92ZSgpLGEub3JpZ2luYWxUaXRsZSYmYS5lbGVtZW50LmF0dHIoInRpdGxlIixhLm9yaWdpbmFsVGl0bGUpO3JldHVybiBhfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sY2xvc2U6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkLGU7aWYoITEhPT1jLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsYikpe2Mub3ZlcmxheSYmYy5vdmVybGF5LmRlc3Ryb3koKSxjLnVpRGlhbG9nLnVuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIiksYy5faXNPcGVuPSExLGMub3B0aW9ucy5oaWRlP2MudWlEaWFsb2cuaGlkZShjLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe2MuX3RyaWdnZXIoImNsb3NlIixiKX0pOihjLnVpRGlhbG9nLmhpZGUoKSxjLl90cmlnZ2VyKCJjbG9zZSIsYikpLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCksYy5vcHRpb25zLm1vZGFsJiYoZD0wLGEoIi51aS1kaWFsb2ciKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcyE9PWMudWlEaWFsb2dbMF0mJihlPWEodGhpcykuY3NzKCJ6LWluZGV4IiksaXNOYU4oZSl8fChkPU1hdGgubWF4KGQsZSkpKX0pLGEudWkuZGlhbG9nLm1heFo9ZCk7cmV0dXJuIGN9fSxpc09wZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNPcGVufSxtb3ZlVG9Ub3A6ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzLGU9ZC5vcHRpb25zLGY7aWYoZS5tb2RhbCYmIWJ8fCFlLnN0YWNrJiYhZS5tb2RhbClyZXR1cm4gZC5fdHJpZ2dlcigiZm9jdXMiLGMpO2UuekluZGV4PmEudWkuZGlhbG9nLm1heFomJihhLnVpLmRpYWxvZy5tYXhaPWUuekluZGV4KSxkLm92ZXJsYXkmJihhLnVpLmRpYWxvZy5tYXhaKz0xLGQub3ZlcmxheS4kZWwuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5vdmVybGF5Lm1heFo9YS51aS5kaWFsb2cubWF4WikpLGY9e3Njcm9sbFRvcDpkLmVsZW1lbnQuc2Nyb2xsVG9wKCksc2Nyb2xsTGVmdDpkLmVsZW1lbnQuc2Nyb2xsTGVmdCgpfSxhLnVpLmRpYWxvZy5tYXhaKz0xLGQudWlEaWFsb2cuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5tYXhaKSxkLmVsZW1lbnQuYXR0cihmKSxkLl90cmlnZ2VyKCJmb2N1cyIsYyk7cmV0dXJuIGR9LG9wZW46ZnVuY3Rpb24oKXtpZighdGhpcy5faXNPcGVuKXt2YXIgYj10aGlzLGM9Yi5vcHRpb25zLGQ9Yi51aURpYWxvZztiLm92ZXJsYXk9Yy5tb2RhbD9uZXcgYS51aS5kaWFsb2cub3ZlcmxheShiKTpudWxsLGIuX3NpemUoKSxiLl9wb3NpdGlvbihjLnBvc2l0aW9uKSxkLnNob3coYy5zaG93KSxiLm1vdmVUb1RvcCghMCksYy5tb2RhbCYmZC5iaW5kKCJrZXlkb3duLnVpLWRpYWxvZyIsZnVuY3Rpb24oYil7aWYoYi5rZXlDb2RlPT09YS51aS5rZXlDb2RlLlRBQil7dmFyIGM9YSgiOnRhYmJhYmxlIix0aGlzKSxkPWMuZmlsdGVyKCI6Zmlyc3QiKSxlPWMuZmlsdGVyKCI6bGFzdCIpO2lmKGIudGFyZ2V0PT09ZVswXSYmIWIuc2hpZnRLZXkpe2QuZm9jdXMoMSk7cmV0dXJuITF9aWYoYi50YXJnZXQ9PT1kWzBdJiZiLnNoaWZ0S2V5KXtlLmZvY3VzKDEpO3JldHVybiExfX19KSxhKGIuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKS5nZXQoKS5jb25jYXQoZC5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUgOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZ2V0KCkpKSkuZXEoMCkuZm9jdXMoKSxiLl9pc09wZW49ITAsYi5fdHJpZ2dlcigib3BlbiIpO3JldHVybiBifX0sX2NyZWF0ZUJ1dHRvbnM6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkPSExLGU9YSgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiksZz1hKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9uc2V0IikuYXBwZW5kVG8oZSk7Yy51aURpYWxvZy5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUiKS5yZW1vdmUoKSx0eXBlb2YgYj09Im9iamVjdCImJmIhPT1udWxsJiZhLmVhY2goYixmdW5jdGlvbigpe3JldHVybiEoZD0hMCl9KSxkJiYoYS5lYWNoKGIsZnVuY3Rpb24oYixkKXtkPWEuaXNGdW5jdGlvbihkKT97Y2xpY2s6ZCx0ZXh0OmJ9OmQ7dmFyIGU9YSgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPicpLmNsaWNrKGZ1bmN0aW9uKCl7ZC5jbGljay5hcHBseShjLmVsZW1lbnRbMF0sYXJndW1lbnRzKX0pLmFwcGVuZFRvKGcpO2EuZWFjaChkLGZ1bmN0aW9uKGEsYil7YSE9PSJjbGljayImJihhIGluIGY/ZVthXShiKTplLmF0dHIoYSxiKSl9KSxhLmZuLmJ1dHRvbiYmZS5idXR0b24oKX0pLGUuYXBwZW5kVG8oYy51aURpYWxvZykpfSxfbWFrZURyYWdnYWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGYoYSl7cmV0dXJue3Bvc2l0aW9uOmEucG9zaXRpb24sb2Zmc2V0OmEub2Zmc2V0fX12YXIgYj10aGlzLGM9Yi5vcHRpb25zLGQ9YShkb2N1bWVudCksZTtiLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihkLGcpe2U9Yy5oZWlnaHQ9PT0iYXV0byI/ImF1dG8iOmEodGhpcykuaGVpZ2h0KCksYSh0aGlzKS5oZWlnaHQoYSh0aGlzKS5oZWlnaHQoKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLGIuX3RyaWdnZXIoImRyYWdTdGFydCIsZCxmKGcpKX0sZHJhZzpmdW5jdGlvbihhLGMpe2IuX3RyaWdnZXIoImRyYWciLGEsZihjKSl9LHN0b3A6ZnVuY3Rpb24oZyxoKXtjLnBvc2l0aW9uPVtoLnBvc2l0aW9uLmxlZnQtZC5zY3JvbGxMZWZ0KCksaC5wb3NpdGlvbi50b3AtZC5zY3JvbGxUb3AoKV0sYSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIikuaGVpZ2h0KGUpLGIuX3RyaWdnZXIoImRyYWdTdG9wIixnLGYoaCkpLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGgoYSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246YS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTphLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjphLnBvc2l0aW9uLHNpemU6YS5zaXplfX1jPWM9PT1iP3RoaXMub3B0aW9ucy5yZXNpemFibGU6Yzt2YXIgZD10aGlzLGU9ZC5vcHRpb25zLGY9ZC51aURpYWxvZy5jc3MoInBvc2l0aW9uIiksZz10eXBlb2YgYz09InN0cmluZyI/YzoibixlLHMsdyxzZSxzdyxuZSxudyI7ZC51aURpYWxvZy5yZXNpemFibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50Iixjb250YWlubWVudDoiZG9jdW1lbnQiLGFsc29SZXNpemU6ZC5lbGVtZW50LG1heFdpZHRoOmUubWF4V2lkdGgsbWF4SGVpZ2h0OmUubWF4SGVpZ2h0LG1pbldpZHRoOmUubWluV2lkdGgsbWluSGVpZ2h0OmQuX21pbkhlaWdodCgpLGhhbmRsZXM6ZyxzdGFydDpmdW5jdGlvbihiLGMpe2EodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLGQuX3RyaWdnZXIoInJlc2l6ZVN0YXJ0IixiLGgoYykpfSxyZXNpemU6ZnVuY3Rpb24oYSxiKXtkLl90cmlnZ2VyKCJyZXNpemUiLGEsaChiKSl9LHN0b3A6ZnVuY3Rpb24oYixjKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctcmVzaXppbmciKSxlLmhlaWdodD1hKHRoaXMpLmhlaWdodCgpLGUud2lkdGg9YSh0aGlzKS53aWR0aCgpLGQuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLGIsaChjKSksYS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KS5jc3MoInBvc2l0aW9uIixmKS5maW5kKCIudWktcmVzaXphYmxlLXNlIikuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwLWRpYWdvbmFsLXNlIil9LF9taW5IZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIGEuaGVpZ2h0PT09ImF1dG8iP2EubWluSGVpZ2h0Ok1hdGgubWluKGEubWluSGVpZ2h0LGEuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPVtdLGQ9WzAsMF0sZTtpZihiKXtpZih0eXBlb2YgYj09InN0cmluZyJ8fHR5cGVvZiBiPT0ib2JqZWN0IiYmIjAiaW4gYiljPWIuc3BsaXQ/Yi5zcGxpdCgiICIpOltiWzBdLGJbMV1dLGMubGVuZ3RoPT09MSYmKGNbMV09Y1swXSksYS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGEsYil7K2NbYV09PT1jW2FdJiYoZFthXT1jW2FdLGNbYV09Yil9KSxiPXtteTpjLmpvaW4oIiAiKSxhdDpjLmpvaW4oIiAiKSxvZmZzZXQ6ZC5qb2luKCIgIil9O2I9YS5leHRlbmQoe30sYS51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb24sYil9ZWxzZSBiPWEudWkuZGlhbG9nLnByb3RvdHlwZS5vcHRpb25zLnBvc2l0aW9uO2U9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKSxlfHx0aGlzLnVpRGlhbG9nLnNob3coKSx0aGlzLnVpRGlhbG9nLmNzcyh7dG9wOjAsbGVmdDowfSkucG9zaXRpb24oYS5leHRlbmQoe29mOndpbmRvd30sYikpLGV8fHRoaXMudWlEaWFsb2cuaGlkZSgpfSxfc2V0T3B0aW9uczpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGY9e30sZz0hMTthLmVhY2goYixmdW5jdGlvbihhLGIpe2MuX3NldE9wdGlvbihhLGIpLGEgaW4gZCYmKGc9ITApLGEgaW4gZSYmKGZbYV09Yil9KSxnJiZ0aGlzLl9zaXplKCksdGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIixmKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMsZj1lLnVpRGlhbG9nO3N3aXRjaChiKXtjYXNlImJlZm9yZWNsb3NlIjpiPSJiZWZvcmVDbG9zZSI7YnJlYWs7Y2FzZSJidXR0b25zIjplLl9jcmVhdGVCdXR0b25zKGQpO2JyZWFrO2Nhc2UiY2xvc2VUZXh0IjplLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQudGV4dCgiIitkKTticmVhaztjYXNlImRpYWxvZ0NsYXNzIjpmLnJlbW92ZUNsYXNzKGUub3B0aW9ucy5kaWFsb2dDbGFzcykuYWRkQ2xhc3MoYytkKTticmVhaztjYXNlImRpc2FibGVkIjpkP2YuYWRkQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpOmYucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpO2JyZWFrO2Nhc2UiZHJhZ2dhYmxlIjp2YXIgZz1mLmlzKCI6ZGF0YShkcmFnZ2FibGUpIik7ZyYmIWQmJmYuZHJhZ2dhYmxlKCJkZXN0cm95IiksIWcmJmQmJmUuX21ha2VEcmFnZ2FibGUoKTticmVhaztjYXNlInBvc2l0aW9uIjplLl9wb3NpdGlvbihkKTticmVhaztjYXNlInJlc2l6YWJsZSI6dmFyIGg9Zi5pcygiOmRhdGEocmVzaXphYmxlKSIpO2gmJiFkJiZmLnJlc2l6YWJsZSgiZGVzdHJveSIpLGgmJnR5cGVvZiBkPT0ic3RyaW5nIiYmZi5yZXNpemFibGUoIm9wdGlvbiIsImhhbmRsZXMiLGQpLCFoJiZkIT09ITEmJmUuX21ha2VSZXNpemFibGUoZCk7YnJlYWs7Y2FzZSJ0aXRsZSI6YSgiLnVpLWRpYWxvZy10aXRsZSIsZS51aURpYWxvZ1RpdGxlYmFyKS5odG1sKCIiKyhkfHwiJiMxNjA7IikpfWEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KGUsYXJndW1lbnRzKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMsYyxkLGU9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKTt0aGlzLmVsZW1lbnQuc2hvdygpLmNzcyh7d2lkdGg6ImF1dG8iLG1pbkhlaWdodDowLGhlaWdodDowfSksYi5taW5XaWR0aD5iLndpZHRoJiYoYi53aWR0aD1iLm1pbldpZHRoKSxjPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOmIud2lkdGh9KS5oZWlnaHQoKSxkPU1hdGgubWF4KDAsYi5taW5IZWlnaHQtYyk7aWYoYi5oZWlnaHQ9PT0iYXV0byIpaWYoYS5zdXBwb3J0Lm1pbkhlaWdodCl0aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6ZCxoZWlnaHQ6ImF1dG8ifSk7ZWxzZXt0aGlzLnVpRGlhbG9nLnNob3coKTt2YXIgZj10aGlzLmVsZW1lbnQuY3NzKCJoZWlnaHQiLCJhdXRvIikuaGVpZ2h0KCk7ZXx8dGhpcy51aURpYWxvZy5oaWRlKCksdGhpcy5lbGVtZW50LmhlaWdodChNYXRoLm1heChmLGQpKX1lbHNlIHRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoYi5oZWlnaHQtYywwKSk7dGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9fSksYS5leHRlbmQoYS51aS5kaWFsb2cse3ZlcnNpb246IjEuOC4xNyIsdXVpZDowLG1heFo6MCxnZXRUaXRsZUlkOmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cigiaWQiKTtifHwodGhpcy51dWlkKz0xLGI9dGhpcy51dWlkKTtyZXR1cm4idWktZGlhbG9nLXRpdGxlLSIrYn0sb3ZlcmxheTpmdW5jdGlvbihiKXt0aGlzLiRlbD1hLnVpLmRpYWxvZy5vdmVybGF5LmNyZWF0ZShiKX19KSxhLmV4dGVuZChhLnVpLmRpYWxvZy5vdmVybGF5LHtpbnN0YW5jZXM6W10sb2xkSW5zdGFuY2VzOltdLG1heFo6MCxldmVudHM6YS5tYXAoImZvY3VzLG1vdXNlZG93bixtb3VzZXVwLGtleWRvd24sa2V5cHJlc3MsY2xpY2siLnNwbGl0KCIsIiksZnVuY3Rpb24oYSl7cmV0dXJuIGErIi5kaWFsb2ctb3ZlcmxheSJ9KS5qb2luKCIgIiksY3JlYXRlOmZ1bmN0aW9uKGIpe3RoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMubGVuZ3RoJiZhKGRvY3VtZW50KS5iaW5kKGEudWkuZGlhbG9nLm92ZXJsYXkuZXZlbnRzLGZ1bmN0aW9uKGIpe2lmKGEoYi50YXJnZXQpLnpJbmRleCgpPGEudWkuZGlhbG9nLm92ZXJsYXkubWF4WilyZXR1cm4hMX0pfSwxKSxhKGRvY3VtZW50KS5iaW5kKCJrZXlkb3duLmRpYWxvZy1vdmVybGF5IixmdW5jdGlvbihjKXtiLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMua2V5Q29kZSYmYy5rZXlDb2RlPT09YS51aS5rZXlDb2RlLkVTQ0FQRSYmKGIuY2xvc2UoYyksYy5wcmV2ZW50RGVmYXVsdCgpKX0pLGEod2luZG93KS5iaW5kKCJyZXNpemUuZGlhbG9nLW92ZXJsYXkiLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKSk7dmFyIGM9KHRoaXMub2xkSW5zdGFuY2VzLnBvcCgpfHxhKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5jc3Moe3dpZHRoOnRoaXMud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWlnaHQoKX0pO2EuZm4uYmdpZnJhbWUmJmMuYmdpZnJhbWUoKSx0aGlzLmluc3RhbmNlcy5wdXNoKGMpO3JldHVybiBjfSxkZXN0cm95OmZ1bmN0aW9uKGIpe3ZhciBjPWEuaW5BcnJheShiLHRoaXMuaW5zdGFuY2VzKTtjIT0tMSYmdGhpcy5vbGRJbnN0YW5jZXMucHVzaCh0aGlzLmluc3RhbmNlcy5zcGxpY2UoYywxKVswXSksdGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCYmYShbZG9jdW1lbnQsd2luZG93XSkudW5iaW5kKCIuZGlhbG9nLW92ZXJsYXkiKSxiLnJlbW92ZSgpO3ZhciBkPTA7YS5lYWNoKHRoaXMuaW5zdGFuY2VzLGZ1bmN0aW9uKCl7ZD1NYXRoLm1heChkLHRoaXMuY3NzKCJ6LWluZGV4IikpfSksdGhpcy5tYXhaPWR9LGhlaWdodDpmdW5jdGlvbigpe3ZhciBiLGM7aWYoYS5icm93c2VyLm1zaWUmJmEuYnJvd3Nlci52ZXJzaW9uPDcpe2I9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCksYz1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KTtyZXR1cm4gYjxjP2Eod2luZG93KS5oZWlnaHQoKSsicHgiOmIrInB4In1yZXR1cm4gYShkb2N1bWVudCkuaGVpZ2h0KCkrInB4In0sd2lkdGg6ZnVuY3Rpb24oKXt2YXIgYixjO2lmKGEuYnJvd3Nlci5tc2llKXtiPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCxkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKSxjPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCxkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoKTtyZXR1cm4gYjxjP2Eod2luZG93KS53aWR0aCgpKyJweCI6YisicHgifXJldHVybiBhKGRvY3VtZW50KS53aWR0aCgpKyJweCJ9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPWEoW10pO2EuZWFjaChhLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcyxmdW5jdGlvbigpe2I9Yi5hZGQodGhpcyl9KSxiLmNzcyh7d2lkdGg6MCxoZWlnaHQ6MH0pLmNzcyh7d2lkdGg6YS51aS5kaWFsb2cub3ZlcmxheS53aWR0aCgpLGhlaWdodDphLnVpLmRpYWxvZy5vdmVybGF5LmhlaWdodCgpfSl9fSksYS5leHRlbmQoYS51aS5kaWFsb2cub3ZlcmxheS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXthLnVpLmRpYWxvZy5vdmVybGF5LmRlc3Ryb3kodGhpcy4kZWwpfX0pfSkoalF1ZXJ5KTsvKgogKiBqUXVlcnkgVUkgU2xpZGVyIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvU2xpZGVyCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS5tb3VzZS5qcwogKglqcXVlcnkudWkud2lkZ2V0LmpzCiAqLyhmdW5jdGlvbihhLGIpe3ZhciBjPTU7YS53aWRnZXQoInVpLnNsaWRlciIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InNsaWRlIixvcHRpb25zOnthbmltYXRlOiExLGRpc3RhbmNlOjAsbWF4OjEwMCxtaW46MCxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmFuZ2U6ITEsc3RlcDoxLHZhbHVlOjAsdmFsdWVzOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGQ9dGhpcy5vcHRpb25zLGU9dGhpcy5lbGVtZW50LmZpbmQoIi51aS1zbGlkZXItaGFuZGxlIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLGY9IjxhIGNsYXNzPSd1aS1zbGlkZXItaGFuZGxlIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcgaHJlZj0nIyc+PC9hPiIsZz1kLnZhbHVlcyYmZC52YWx1ZXMubGVuZ3RofHwxLGg9W107dGhpcy5fa2V5U2xpZGluZz0hMSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zbGlkZXIgdWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbisiIHVpLXdpZGdldCIrIiB1aS13aWRnZXQtY29udGVudCIrIiB1aS1jb3JuZXItYWxsIisoZC5kaXNhYmxlZD8iIHVpLXNsaWRlci1kaXNhYmxlZCB1aS1kaXNhYmxlZCI6IiIpKSx0aGlzLnJhbmdlPWEoW10pLGQucmFuZ2UmJihkLnJhbmdlPT09ITAmJihkLnZhbHVlc3x8KGQudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldKSxkLnZhbHVlcy5sZW5ndGgmJmQudmFsdWVzLmxlbmd0aCE9PTImJihkLnZhbHVlcz1bZC52YWx1ZXNbMF0sZC52YWx1ZXNbMF1dKSksdGhpcy5yYW5nZT1hKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXNsaWRlci1yYW5nZSB1aS13aWRnZXQtaGVhZGVyIisoZC5yYW5nZT09PSJtaW4ifHxkLnJhbmdlPT09Im1heCI/IiB1aS1zbGlkZXItcmFuZ2UtIitkLnJhbmdlOiIiKSkpO2Zvcih2YXIgaT1lLmxlbmd0aDtpPGc7aSs9MSloLnB1c2goZik7dGhpcy5oYW5kbGVzPWUuYWRkKGEoaC5qb2luKCIiKSkuYXBwZW5kVG8oYi5lbGVtZW50KSksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5hZGQodGhpcy5yYW5nZSkuZmlsdGVyKCJhIikuY2xpY2soZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSkuaG92ZXIoZnVuY3Rpb24oKXtkLmRpc2FibGVkfHxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2QuZGlzYWJsZWQ/YSh0aGlzKS5ibHVyKCk6KGEoIi51aS1zbGlkZXIgLnVpLXN0YXRlLWZvY3VzIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIiksYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKSl9KS5ibHVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGIpe2EodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIsYil9KSx0aGlzLmhhbmRsZXMua2V5ZG93bihmdW5jdGlvbihkKXt2YXIgZT0hMCxmPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpLGcsaCxpLGo7aWYoIWIub3B0aW9ucy5kaXNhYmxlZCl7c3dpdGNoKGQua2V5Q29kZSl7Y2FzZSBhLnVpLmtleUNvZGUuSE9NRTpjYXNlIGEudWkua2V5Q29kZS5FTkQ6Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIGEudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSBhLnVpLmtleUNvZGUuVVA6Y2FzZSBhLnVpLmtleUNvZGUuUklHSFQ6Y2FzZSBhLnVpLmtleUNvZGUuRE9XTjpjYXNlIGEudWkua2V5Q29kZS5MRUZUOmU9ITE7aWYoIWIuX2tleVNsaWRpbmcpe2IuX2tleVNsaWRpbmc9ITAsYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksZz1iLl9zdGFydChkLGYpO2lmKGc9PT0hMSlyZXR1cm59fWo9Yi5vcHRpb25zLnN0ZXAsYi5vcHRpb25zLnZhbHVlcyYmYi5vcHRpb25zLnZhbHVlcy5sZW5ndGg/aD1pPWIudmFsdWVzKGYpOmg9aT1iLnZhbHVlKCk7c3dpdGNoKGQua2V5Q29kZSl7Y2FzZSBhLnVpLmtleUNvZGUuSE9NRTppPWIuX3ZhbHVlTWluKCk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuRU5EOmk9Yi5fdmFsdWVNYXgoKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5QQUdFX1VQOmk9Yi5fdHJpbUFsaWduVmFsdWUoaCsoYi5fdmFsdWVNYXgoKS1iLl92YWx1ZU1pbigpKS9jKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5QQUdFX0RPV046aT1iLl90cmltQWxpZ25WYWx1ZShoLShiLl92YWx1ZU1heCgpLWIuX3ZhbHVlTWluKCkpL2MpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLlVQOmNhc2UgYS51aS5rZXlDb2RlLlJJR0hUOmlmKGg9PT1iLl92YWx1ZU1heCgpKXJldHVybjtpPWIuX3RyaW1BbGlnblZhbHVlKGgraik7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuRE9XTjpjYXNlIGEudWkua2V5Q29kZS5MRUZUOmlmKGg9PT1iLl92YWx1ZU1pbigpKXJldHVybjtpPWIuX3RyaW1BbGlnblZhbHVlKGgtail9Yi5fc2xpZGUoZCxmLGkpO3JldHVybiBlfX0pLmtleXVwKGZ1bmN0aW9uKGMpe3ZhciBkPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpO2IuX2tleVNsaWRpbmcmJihiLl9rZXlTbGlkaW5nPSExLGIuX3N0b3AoYyxkKSxiLl9jaGFuZ2UoYyxkKSxhKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSl9KSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVzLnJlbW92ZSgpLHRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXIgdWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIHVpLXNsaWRlci1kaXNhYmxlZCB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnJlbW92ZURhdGEoInNsaWRlciIpLnVuYmluZCgiLnNsaWRlciIpLHRoaXMuX21vdXNlRGVzdHJveSgpO3JldHVybiB0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkLGUsZixnLGgsaSxqLGssbDtpZihjLmRpc2FibGVkKXJldHVybiExO3RoaXMuZWxlbWVudFNpemU9e3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpfSx0aGlzLmVsZW1lbnRPZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLGQ9e3g6Yi5wYWdlWCx5OmIucGFnZVl9LGU9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGQpLGY9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKzEsaD10aGlzLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguYWJzKGUtaC52YWx1ZXMoYikpO2Y+YyYmKGY9YyxnPWEodGhpcyksaT1iKX0pLGMucmFuZ2U9PT0hMCYmdGhpcy52YWx1ZXMoMSk9PT1jLm1pbiYmKGkrPTEsZz1hKHRoaXMuaGFuZGxlc1tpXSkpLGo9dGhpcy5fc3RhcnQoYixpKTtpZihqPT09ITEpcmV0dXJuITE7dGhpcy5fbW91c2VTbGlkaW5nPSEwLGguX2hhbmRsZUluZGV4PWksZy5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxrPWcub2Zmc2V0KCksbD0hYShiLnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1sP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OmIucGFnZVgtay5sZWZ0LWcud2lkdGgoKS8yLHRvcDpiLnBhZ2VZLWsudG9wLWcuaGVpZ2h0KCkvMi0ocGFyc2VJbnQoZy5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZy5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZy5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUoYixpLGUpLHRoaXMuX2FuaW1hdGVPZmY9ITA7cmV0dXJuITB9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGEpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGEpe3ZhciBiPXt4OmEucGFnZVgseTphLnBhZ2VZfSxjPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShiKTt0aGlzLl9zbGlkZShhLHRoaXMuX2hhbmRsZUluZGV4LGMpO3JldHVybiExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX3N0b3AoYSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5fY2hhbmdlKGEsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fY2xpY2tPZmZzZXQ9bnVsbCx0aGlzLl9hbmltYXRlT2ZmPSExO3JldHVybiExfSxfZGV0ZWN0T3JpZW50YXRpb246ZnVuY3Rpb24oKXt0aGlzLm9yaWVudGF0aW9uPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbj09PSJ2ZXJ0aWNhbCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LF9ub3JtVmFsdWVGcm9tTW91c2U6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZjt0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyhiPXRoaXMuZWxlbWVudFNpemUud2lkdGgsYz1hLngtdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LmxlZnQ6MCkpOihiPXRoaXMuZWxlbWVudFNpemUuaGVpZ2h0LGM9YS55LXRoaXMuZWxlbWVudE9mZnNldC50b3AtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LnRvcDowKSksZD1jL2IsZD4xJiYoZD0xKSxkPDAmJihkPTApLHRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiYoZD0xLWQpLGU9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpLGY9dGhpcy5fdmFsdWVNaW4oKStkKmU7cmV0dXJuIHRoaXMuX3RyaW1BbGlnblZhbHVlKGYpfSxfc3RhcnQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz17aGFuZGxlOnRoaXMuaGFuZGxlc1tiXSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoYy52YWx1ZT10aGlzLnZhbHVlcyhiKSxjLnZhbHVlcz10aGlzLnZhbHVlcygpKTtyZXR1cm4gdGhpcy5fdHJpZ2dlcigic3RhcnQiLGEsYyl9LF9zbGlkZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoPyhkPXRoaXMudmFsdWVzKGI/MDoxKSx0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD09PTImJnRoaXMub3B0aW9ucy5yYW5nZT09PSEwJiYoYj09PTAmJmM+ZHx8Yj09PTEmJmM8ZCkmJihjPWQpLGMhPT10aGlzLnZhbHVlcyhiKSYmKGU9dGhpcy52YWx1ZXMoKSxlW2JdPWMsZj10aGlzLl90cmlnZ2VyKCJzbGlkZSIsYSx7aGFuZGxlOnRoaXMuaGFuZGxlc1tiXSx2YWx1ZTpjLHZhbHVlczplfSksZD10aGlzLnZhbHVlcyhiPzA6MSksZiE9PSExJiZ0aGlzLnZhbHVlcyhiLGMsITApKSk6YyE9PXRoaXMudmFsdWUoKSYmKGY9dGhpcy5fdHJpZ2dlcigic2xpZGUiLGEse2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6Y30pLGYhPT0hMSYmdGhpcy52YWx1ZShjKSl9LF9zdG9wOmZ1bmN0aW9uKGEsYil7dmFyIGM9e2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6dGhpcy52YWx1ZSgpfTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKGMudmFsdWU9dGhpcy52YWx1ZXMoYiksYy52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcigic3RvcCIsYSxjKX0sX2NoYW5nZTpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLl9rZXlTbGlkaW5nJiYhdGhpcy5fbW91c2VTbGlkaW5nKXt2YXIgYz17aGFuZGxlOnRoaXMuaGFuZGxlc1tiXSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoYy52YWx1ZT10aGlzLnZhbHVlcyhiKSxjLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGEsYyl9fSx2YWx1ZTpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl90cmltQWxpZ25WYWx1ZShhKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKTtlbHNlIHJldHVybiB0aGlzLl92YWx1ZSgpfSx2YWx1ZXM6ZnVuY3Rpb24oYixjKXt2YXIgZCxlLGY7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXRoaXMub3B0aW9ucy52YWx1ZXNbYl09dGhpcy5fdHJpbUFsaWduVmFsdWUoYyksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsYik7ZWxzZXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdmFsdWVzKCk7aWYoIWEuaXNBcnJheShhcmd1bWVudHNbMF0pKXJldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLl92YWx1ZXMoYik6dGhpcy52YWx1ZSgpO2Q9dGhpcy5vcHRpb25zLnZhbHVlcyxlPWFyZ3VtZW50c1swXTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9MSlkW2ZdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGVbZl0pLHRoaXMuX2NoYW5nZShudWxsLGYpO3RoaXMuX3JlZnJlc2hWYWx1ZSgpfX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe3ZhciBkLGU9MDthLmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihlPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7c3dpdGNoKGIpe2Nhc2UiZGlzYWJsZWQiOmM/KHRoaXMuaGFuZGxlcy5maWx0ZXIoIi51aS1zdGF0ZS1mb2N1cyIpLmJsdXIoKSx0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5oYW5kbGVzLnByb3BBdHRyKCJkaXNhYmxlZCIsITApLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZGlzYWJsZWQiKSk6KHRoaXMuaGFuZGxlcy5wcm9wQXR0cigiZGlzYWJsZWQiLCExKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRpc2FibGVkIikpO2JyZWFrO2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCk7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpO2ZvcihkPTA7ZDxlO2QrPTEpdGhpcy5fY2hhbmdlKG51bGwsZCk7dGhpcy5fYW5pbWF0ZU9mZj0hMX19LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy52YWx1ZTthPXRoaXMuX3RyaW1BbGlnblZhbHVlKGEpO3JldHVybiBhfSxfdmFsdWVzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtpZihhcmd1bWVudHMubGVuZ3RoKXtiPXRoaXMub3B0aW9ucy52YWx1ZXNbYV0sYj10aGlzLl90cmltQWxpZ25WYWx1ZShiKTtyZXR1cm4gYn1jPXRoaXMub3B0aW9ucy52YWx1ZXMuc2xpY2UoKTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCs9MSljW2RdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGNbZF0pO3JldHVybiBjfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24oYSl7aWYoYTw9dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZihhPj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciBiPXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxjPShhLXRoaXMuX3ZhbHVlTWluKCkpJWIsZD1hLWM7TWF0aC5hYnMoYykqMj49YiYmKGQrPWM+MD9iOi1iKTtyZXR1cm4gcGFyc2VGbG9hdChkLnRvRml4ZWQoNSkpfSxfdmFsdWVNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1pbn0sX3ZhbHVlTWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMucmFuZ2UsYz10aGlzLm9wdGlvbnMsZD10aGlzLGU9dGhpcy5fYW5pbWF0ZU9mZj8hMTpjLmFuaW1hdGUsZixnPXt9LGgsaSxqLGs7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYixpKXtmPShkLnZhbHVlcyhiKS1kLl92YWx1ZU1pbigpKS8oZC5fdmFsdWVNYXgoKS1kLl92YWx1ZU1pbigpKSoxMDAsZ1tkLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyJsZWZ0IjoiYm90dG9tIl09ZisiJSIsYSh0aGlzKS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKGcsYy5hbmltYXRlKSxkLm9wdGlvbnMucmFuZ2U9PT0hMCYmKGQub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/KGI9PT0wJiZkLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2xlZnQ6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PTEmJmQucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpmLWgrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSkpOihiPT09MCYmZC5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHtib3R0b206ZisiJSJ9LGMuYW5pbWF0ZSksYj09PTEmJmQucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6Zi1oKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmMuYW5pbWF0ZX0pKSksaD1mfSk6KGk9dGhpcy52YWx1ZSgpLGo9dGhpcy5fdmFsdWVNaW4oKSxrPXRoaXMuX3ZhbHVlTWF4KCksZj1rIT09aj8oaS1qKS8oay1qKSoxMDA6MCxnW2Qub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1mKyIlIix0aGlzLmhhbmRsZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKGcsYy5hbmltYXRlKSxiPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2U/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiJiZ0aGlzLnJhbmdlW2U/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6MTAwLWYrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSksYj09PSJtaW4iJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDoxMDAtZisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSl9fSksYS5leHRlbmQoYS51aS5zbGlkZXIse3ZlcnNpb246IjEuOC4xNyJ9KX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIFRhYnMgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9UYWJzCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZigpe3JldHVybisrZH1mdW5jdGlvbiBlKCl7cmV0dXJuKytjfXZhciBjPTAsZD0wO2Eud2lkZ2V0KCJ1aS50YWJzIix7b3B0aW9uczp7YWRkOm51bGwsYWpheE9wdGlvbnM6bnVsbCxjYWNoZTohMSxjb29raWU6bnVsbCxjb2xsYXBzaWJsZTohMSxkaXNhYmxlOm51bGwsZGlzYWJsZWQ6W10sZW5hYmxlOm51bGwsZXZlbnQ6ImNsaWNrIixmeDpudWxsLGlkUHJlZml4OiJ1aS10YWJzLSIsbG9hZDpudWxsLHBhbmVsVGVtcGxhdGU6IjxkaXY+PC9kaXY+IixyZW1vdmU6bnVsbCxzZWxlY3Q6bnVsbCxzaG93Om51bGwsc3Bpbm5lcjoiPGVtPkxvYWRpbmcmIzgyMzA7PC9lbT4iLHRhYlRlbXBsYXRlOiI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+In0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3RhYmlmeSghMCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0ic2VsZWN0ZWQiKXtpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJmI9PXRoaXMub3B0aW9ucy5zZWxlY3RlZClyZXR1cm47dGhpcy5zZWxlY3QoYil9ZWxzZSB0aGlzLm9wdGlvbnNbYV09Yix0aGlzLl90YWJpZnkoKX0sX3RhYklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpdGxlJiZhLnRpdGxlLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKC9bXlx3XHUwMGMwLVx1RkZGRi1dL2csIiIpfHx0aGlzLm9wdGlvbnMuaWRQcmVmaXgrZSgpfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC86L2csIlxcOiIpfSxfY29va2llOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrZigpKTtyZXR1cm4gYS5jb29raWUuYXBwbHkobnVsbCxbYl0uY29uY2F0KGEubWFrZUFycmF5KGFyZ3VtZW50cykpKX0sX3VpOmZ1bmN0aW9uKGEsYil7cmV0dXJue3RhYjphLHBhbmVsOmIsaW5kZXg6dGhpcy5hbmNob3JzLmluZGV4KGEpfX0sX2NsZWFudXA6ZnVuY3Rpb24oKXt0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1wcm9jZXNzaW5nIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKS5maW5kKCJzcGFuOmRhdGEobGFiZWwudGFicykiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtiLmh0bWwoYi5kYXRhKCJsYWJlbC50YWJzIikpLnJlbW92ZURhdGEoImxhYmVsLnRhYnMiKX0pfSxfdGFiaWZ5OmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIG0oYixjKXtiLmNzcygiZGlzcGxheSIsIiIpLCFhLnN1cHBvcnQub3BhY2l0eSYmYy5vcGFjaXR5JiZiWzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9dmFyIGQ9dGhpcyxlPXRoaXMub3B0aW9ucyxmPS9eIy4rLzt0aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCksdGhpcy5saXM9YSgiID4gbGk6aGFzKGFbaHJlZl0pIix0aGlzLmxpc3QpLHRoaXMuYW5jaG9ycz10aGlzLmxpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSgiYSIsdGhpcylbMF19KSx0aGlzLnBhbmVscz1hKFtdKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBnPWEoYykuYXR0cigiaHJlZiIpLGg9Zy5zcGxpdCgiIyIpWzBdLGk7aCYmKGg9PT1sb2NhdGlvbi50b1N0cmluZygpLnNwbGl0KCIjIilbMF18fChpPWEoImJhc2UiKVswXSkmJmg9PT1pLmhyZWYpJiYoZz1jLmhhc2gsYy5ocmVmPWcpO2lmKGYudGVzdChnKSlkLnBhbmVscz1kLnBhbmVscy5hZGQoZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihnKSkpO2Vsc2UgaWYoZyYmZyE9PSIjIil7YS5kYXRhKGMsImhyZWYudGFicyIsZyksYS5kYXRhKGMsImxvYWQudGFicyIsZy5yZXBsYWNlKC8jLiokLywiIikpO3ZhciBqPWQuX3RhYklkKGMpO2MuaHJlZj0iIyIrajt2YXIgaz1kLmVsZW1lbnQuZmluZCgiIyIraik7ay5sZW5ndGh8fChrPWEoZS5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaikuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGQucGFuZWxzW2ItMV18fGQubGlzdCksay5kYXRhKCJkZXN0cm95LnRhYnMiLCEwKSksZC5wYW5lbHM9ZC5wYW5lbHMuYWRkKGspfWVsc2UgZS5kaXNhYmxlZC5wdXNoKGIpfSksYz8odGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5saXN0LmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLHRoaXMubGlzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiksZS5zZWxlY3RlZD09PWI/KGxvY2F0aW9uLmhhc2gmJnRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGEsYil7aWYoYi5oYXNoPT1sb2NhdGlvbi5oYXNoKXtlLnNlbGVjdGVkPWE7cmV0dXJuITF9fSksdHlwZW9mIGUuc2VsZWN0ZWQhPSJudW1iZXIiJiZlLmNvb2tpZSYmKGUuc2VsZWN0ZWQ9cGFyc2VJbnQoZC5fY29va2llKCksMTApKSx0eXBlb2YgZS5zZWxlY3RlZCE9Im51bWJlciImJnRoaXMubGlzLmZpbHRlcigiLnVpLXRhYnMtc2VsZWN0ZWQiKS5sZW5ndGgmJihlLnNlbGVjdGVkPXRoaXMubGlzLmluZGV4KHRoaXMubGlzLmZpbHRlcigiLnVpLXRhYnMtc2VsZWN0ZWQiKSkpLGUuc2VsZWN0ZWQ9ZS5zZWxlY3RlZHx8KHRoaXMubGlzLmxlbmd0aD8wOi0xKSk6ZS5zZWxlY3RlZD09PW51bGwmJihlLnNlbGVjdGVkPS0xKSxlLnNlbGVjdGVkPWUuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9yc1tlLnNlbGVjdGVkXXx8ZS5zZWxlY3RlZDwwP2Uuc2VsZWN0ZWQ6MCxlLmRpc2FibGVkPWEudW5pcXVlKGUuZGlzYWJsZWQuY29uY2F0KGEubWFwKHRoaXMubGlzLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIiksZnVuY3Rpb24oYSxiKXtyZXR1cm4gZC5saXMuaW5kZXgoYSl9KSkpLnNvcnQoKSxhLmluQXJyYXkoZS5zZWxlY3RlZCxlLmRpc2FibGVkKSE9LTEmJmUuZGlzYWJsZWQuc3BsaWNlKGEuaW5BcnJheShlLnNlbGVjdGVkLGUuZGlzYWJsZWQpLDEpLHRoaXMucGFuZWxzLmFkZENsYXNzKCJ1aS10YWJzLWhpZGUiKSx0aGlzLmxpcy5yZW1vdmVDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxlLnNlbGVjdGVkPj0wJiZ0aGlzLmFuY2hvcnMubGVuZ3RoJiYoZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihkLmFuY2hvcnNbZS5zZWxlY3RlZF0uaGFzaCkpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWhpZGUiKSx0aGlzLmxpcy5lcShlLnNlbGVjdGVkKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7ZC5fdHJpZ2dlcigic2hvdyIsbnVsbCxkLl91aShkLmFuY2hvcnNbZS5zZWxlY3RlZF0sZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihkLmFuY2hvcnNbZS5zZWxlY3RlZF0uaGFzaCkpWzBdKSl9KSx0aGlzLmxvYWQoZS5zZWxlY3RlZCkpLGEod2luZG93KS5iaW5kKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7ZC5saXMuYWRkKGQuYW5jaG9ycykudW5iaW5kKCIudGFicyIpLGQubGlzPWQuYW5jaG9ycz1kLnBhbmVscz1udWxsfSkpOmUuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKSx0aGlzLmVsZW1lbnRbZS5jb2xsYXBzaWJsZT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJ1aS10YWJzLWNvbGxhcHNpYmxlIiksZS5jb29raWUmJnRoaXMuX2Nvb2tpZShlLnNlbGVjdGVkLGUuY29va2llKTtmb3IodmFyIGc9MCxoO2g9dGhpcy5saXNbZ107ZysrKWEoaClbYS5pbkFycmF5KGcsZS5kaXNhYmxlZCkhPS0xJiYhYShoKS5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXN0YXRlLWRpc2FibGVkIik7ZS5jYWNoZT09PSExJiZ0aGlzLmFuY2hvcnMucmVtb3ZlRGF0YSgiY2FjaGUudGFicyIpLHRoaXMubGlzLmFkZCh0aGlzLmFuY2hvcnMpLnVuYmluZCgiLnRhYnMiKTtpZihlLmV2ZW50IT09Im1vdXNlb3ZlciIpe3ZhciBpPWZ1bmN0aW9uKGEsYil7Yi5pcygiOm5vdCgudWktc3RhdGUtZGlzYWJsZWQpIikmJmIuYWRkQ2xhc3MoInVpLXN0YXRlLSIrYSl9LGo9ZnVuY3Rpb24oYSxiKXtiLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS0iK2EpfTt0aGlzLmxpcy5iaW5kKCJtb3VzZW92ZXIudGFicyIsZnVuY3Rpb24oKXtpKCJob3ZlciIsYSh0aGlzKSl9KSx0aGlzLmxpcy5iaW5kKCJtb3VzZW91dC50YWJzIixmdW5jdGlvbigpe2ooImhvdmVyIixhKHRoaXMpKX0pLHRoaXMuYW5jaG9ycy5iaW5kKCJmb2N1cy50YWJzIixmdW5jdGlvbigpe2koImZvY3VzIixhKHRoaXMpLmNsb3Nlc3QoImxpIikpfSksdGhpcy5hbmNob3JzLmJpbmQoImJsdXIudGFicyIsZnVuY3Rpb24oKXtqKCJmb2N1cyIsYSh0aGlzKS5jbG9zZXN0KCJsaSIpKX0pfXZhciBrLGw7ZS5meCYmKGEuaXNBcnJheShlLmZ4KT8oaz1lLmZ4WzBdLGw9ZS5meFsxXSk6az1sPWUuZngpO3ZhciBuPWw/ZnVuY3Rpb24oYixjKXthKGIpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYy5oaWRlKCkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLmFuaW1hdGUobCxsLmR1cmF0aW9ufHwibm9ybWFsIixmdW5jdGlvbigpe20oYyxsKSxkLl90cmlnZ2VyKCJzaG93IixudWxsLGQuX3VpKGIsY1swXSkpfSl9OmZ1bmN0aW9uKGIsYyl7YShiKS5jbG9zZXN0KCJsaSIpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLGQuX3RyaWdnZXIoInNob3ciLG51bGwsZC5fdWkoYixjWzBdKSl9LG89az9mdW5jdGlvbihhLGIpe2IuYW5pbWF0ZShrLGsuZHVyYXRpb258fCJub3JtYWwiLGZ1bmN0aW9uKCl7ZC5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYi5hZGRDbGFzcygidWktdGFicy1oaWRlIiksbShiLGspLGQuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIil9KX06ZnVuY3Rpb24oYSxiLGMpe2QubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGIuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpLGQuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIil9O3RoaXMuYW5jaG9ycy5iaW5kKGUuZXZlbnQrIi50YWJzIixmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1hKGIpLmNsb3Nlc3QoImxpIiksZj1kLnBhbmVscy5maWx0ZXIoIjpub3QoLnVpLXRhYnMtaGlkZSkiKSxnPWQuZWxlbWVudC5maW5kKGQuX3Nhbml0aXplU2VsZWN0b3IoYi5oYXNoKSk7aWYoYy5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiYhZS5jb2xsYXBzaWJsZXx8Yy5oYXNDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKXx8Yy5oYXNDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpfHxkLnBhbmVscy5maWx0ZXIoIjphbmltYXRlZCIpLmxlbmd0aHx8ZC5fdHJpZ2dlcigic2VsZWN0IixudWxsLGQuX3VpKHRoaXMsZ1swXSkpPT09ITEpe3RoaXMuYmx1cigpO3JldHVybiExfWUuc2VsZWN0ZWQ9ZC5hbmNob3JzLmluZGV4KHRoaXMpLGQuYWJvcnQoKTtpZihlLmNvbGxhcHNpYmxlKXtpZihjLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikpe2Uuc2VsZWN0ZWQ9LTEsZS5jb29raWUmJmQuX2Nvb2tpZShlLnNlbGVjdGVkLGUuY29va2llKSxkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7byhiLGYpfSkuZGVxdWV1ZSgidGFicyIpLHRoaXMuYmx1cigpO3JldHVybiExfWlmKCFmLmxlbmd0aCl7ZS5jb29raWUmJmQuX2Nvb2tpZShlLnNlbGVjdGVkLGUuY29va2llKSxkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7bihiLGcpfSksZC5sb2FkKGQuYW5jaG9ycy5pbmRleCh0aGlzKSksdGhpcy5ibHVyKCk7cmV0dXJuITF9fWUuY29va2llJiZkLl9jb29raWUoZS5zZWxlY3RlZCxlLmNvb2tpZSk7aWYoZy5sZW5ndGgpZi5sZW5ndGgmJmQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtvKGIsZil9KSxkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7bihiLGcpfSksZC5sb2FkKGQuYW5jaG9ycy5pbmRleCh0aGlzKSk7ZWxzZSB0aHJvdyJqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21lbnQgaWRlbnRpZmllci4iO2EuYnJvd3Nlci5tc2llJiZ0aGlzLmJsdXIoKX0pLHRoaXMuYW5jaG9ycy5iaW5kKCJjbGljay50YWJzIixmdW5jdGlvbigpe3JldHVybiExfSl9LF9nZXRJbmRleDpmdW5jdGlvbihhKXt0eXBlb2YgYT09InN0cmluZyImJihhPXRoaXMuYW5jaG9ycy5pbmRleCh0aGlzLmFuY2hvcnMuZmlsdGVyKCJbaHJlZiQ9IithKyJdIikpKTtyZXR1cm4gYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmFib3J0KCksdGhpcy5lbGVtZW50LnVuYmluZCgiLnRhYnMiKS5yZW1vdmVDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIikucmVtb3ZlRGF0YSgidGFicyIpLHRoaXMubGlzdC5yZW1vdmVDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEuZGF0YSh0aGlzLCJocmVmLnRhYnMiKTtiJiYodGhpcy5ocmVmPWIpO3ZhciBjPWEodGhpcykudW5iaW5kKCIudGFicyIpO2EuZWFjaChbImhyZWYiLCJsb2FkIiwiY2FjaGUiXSxmdW5jdGlvbihhLGIpe2MucmVtb3ZlRGF0YShiKyIudGFicyIpfSl9KSx0aGlzLmxpcy51bmJpbmQoIi50YWJzIikuYWRkKHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7YS5kYXRhKHRoaXMsImRlc3Ryb3kudGFicyIpP2EodGhpcykucmVtb3ZlKCk6YSh0aGlzKS5yZW1vdmVDbGFzcyhbInVpLXN0YXRlLWRlZmF1bHQiLCJ1aS1jb3JuZXItdG9wIiwidWktdGFicy1zZWxlY3RlZCIsInVpLXN0YXRlLWFjdGl2ZSIsInVpLXN0YXRlLWhvdmVyIiwidWktc3RhdGUtZm9jdXMiLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsInVpLXRhYnMtcGFuZWwiLCJ1aS13aWRnZXQtY29udGVudCIsInVpLWNvcm5lci1ib3R0b20iLCJ1aS10YWJzLWhpZGUiXS5qb2luKCIgIikpfSksYi5jb29raWUmJnRoaXMuX2Nvb2tpZShudWxsLGIuY29va2llKTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGMsZCxlKXtlPT09YiYmKGU9dGhpcy5hbmNob3JzLmxlbmd0aCk7dmFyIGY9dGhpcyxnPXRoaXMub3B0aW9ucyxoPWEoZy50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxjKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZCkpLGk9Yy5pbmRleE9mKCIjIik/dGhpcy5fdGFiSWQoYSgiYSIsaClbMF0pOmMucmVwbGFjZSgiIyIsIiIpO2guYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoImRlc3Ryb3kudGFicyIsITApO3ZhciBqPWYuZWxlbWVudC5maW5kKCIjIitpKTtqLmxlbmd0aHx8KGo9YShnLnBhbmVsVGVtcGxhdGUpLmF0dHIoImlkIixpKS5kYXRhKCJkZXN0cm95LnRhYnMiLCEwKSksai5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLXRhYnMtaGlkZSIpLGU+PXRoaXMubGlzLmxlbmd0aD8oaC5hcHBlbmRUbyh0aGlzLmxpc3QpLGouYXBwZW5kVG8odGhpcy5saXN0WzBdLnBhcmVudE5vZGUpKTooaC5pbnNlcnRCZWZvcmUodGhpcy5saXNbZV0pLGouaW5zZXJ0QmVmb3JlKHRoaXMucGFuZWxzW2VdKSksZy5kaXNhYmxlZD1hLm1hcChnLmRpc2FibGVkLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGE+PWU/KythOmF9KSx0aGlzLl90YWJpZnkoKSx0aGlzLmFuY2hvcnMubGVuZ3RoPT0xJiYoZy5zZWxlY3RlZD0wLGguYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksai5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIiksdGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe2YuX3RyaWdnZXIoInNob3ciLG51bGwsZi5fdWkoZi5hbmNob3JzWzBdLGYucGFuZWxzWzBdKSl9KSx0aGlzLmxvYWQoMCkpLHRoaXMuX3RyaWdnZXIoImFkZCIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbZV0sdGhpcy5wYW5lbHNbZV0pKTtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksZT10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTtkLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJnRoaXMuYW5jaG9ycy5sZW5ndGg+MSYmdGhpcy5zZWxlY3QoYisoYisxPHRoaXMuYW5jaG9ycy5sZW5ndGg/MTotMSkpLGMuZGlzYWJsZWQ9YS5tYXAoYS5ncmVwKGMuZGlzYWJsZWQsZnVuY3Rpb24oYSxjKXtyZXR1cm4gYSE9Yn0pLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE+PWI/LS1hOmF9KSx0aGlzLl90YWJpZnkoKSx0aGlzLl90cmlnZ2VyKCJyZW1vdmUiLG51bGwsdGhpcy5fdWkoZC5maW5kKCJhIilbMF0sZVswXSkpO3JldHVybiB0aGlzfSxlbmFibGU6ZnVuY3Rpb24oYil7Yj10aGlzLl9nZXRJbmRleChiKTt2YXIgYz10aGlzLm9wdGlvbnM7aWYoYS5pbkFycmF5KGIsYy5kaXNhYmxlZCkhPS0xKXt0aGlzLmxpcy5lcShiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxjLmRpc2FibGVkPWEuZ3JlcChjLmRpc2FibGVkLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPWJ9KSx0aGlzLl90cmlnZ2VyKCJlbmFibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2JdLHRoaXMucGFuZWxzW2JdKSk7cmV0dXJuIHRoaXN9fSxkaXNhYmxlOmZ1bmN0aW9uKGEpe2E9dGhpcy5fZ2V0SW5kZXgoYSk7dmFyIGI9dGhpcyxjPXRoaXMub3B0aW9uczthIT1jLnNlbGVjdGVkJiYodGhpcy5saXMuZXEoYSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZC5wdXNoKGEpLGMuZGlzYWJsZWQuc29ydCgpLHRoaXMuX3RyaWdnZXIoImRpc2FibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2FdLHRoaXMucGFuZWxzW2FdKSkpO3JldHVybiB0aGlzfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7YT10aGlzLl9nZXRJbmRleChhKTtpZihhPT0tMSlpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJnRoaXMub3B0aW9ucy5zZWxlY3RlZCE9LTEpYT10aGlzLm9wdGlvbnMuc2VsZWN0ZWQ7ZWxzZSByZXR1cm4gdGhpczt0aGlzLmFuY2hvcnMuZXEoYSkudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrIi50YWJzIik7cmV0dXJuIHRoaXN9LGxvYWQ6ZnVuY3Rpb24oYil7Yj10aGlzLl9nZXRJbmRleChiKTt2YXIgYz10aGlzLGQ9dGhpcy5vcHRpb25zLGU9dGhpcy5hbmNob3JzLmVxKGIpWzBdLGY9YS5kYXRhKGUsImxvYWQudGFicyIpO3RoaXMuYWJvcnQoKTtpZighZnx8dGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIikubGVuZ3RoIT09MCYmYS5kYXRhKGUsImNhY2hlLnRhYnMiKSl0aGlzLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO2Vsc2V7dGhpcy5saXMuZXEoYikuYWRkQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKTtpZihkLnNwaW5uZXIpe3ZhciBnPWEoInNwYW4iLGUpO2cuZGF0YSgibGFiZWwudGFicyIsZy5odG1sKCkpLmh0bWwoZC5zcGlubmVyKX10aGlzLnhocj1hLmFqYXgoYS5leHRlbmQoe30sZC5hamF4T3B0aW9ucyx7dXJsOmYsc3VjY2VzczpmdW5jdGlvbihmLGcpe2MuZWxlbWVudC5maW5kKGMuX3Nhbml0aXplU2VsZWN0b3IoZS5oYXNoKSkuaHRtbChmKSxjLl9jbGVhbnVwKCksZC5jYWNoZSYmYS5kYXRhKGUsImNhY2hlLnRhYnMiLCEwKSxjLl90cmlnZ2VyKCJsb2FkIixudWxsLGMuX3VpKGMuYW5jaG9yc1tiXSxjLnBhbmVsc1tiXSkpO3RyeXtkLmFqYXhPcHRpb25zLnN1Y2Nlc3MoZixnKX1jYXRjaChoKXt9fSxlcnJvcjpmdW5jdGlvbihhLGYsZyl7Yy5fY2xlYW51cCgpLGMuX3RyaWdnZXIoImxvYWQiLG51bGwsYy5fdWkoYy5hbmNob3JzW2JdLGMucGFuZWxzW2JdKSk7dHJ5e2QuYWpheE9wdGlvbnMuZXJyb3IoYSxmLGIsZSl9Y2F0Y2goZyl7fX19KSksYy5lbGVtZW50LmRlcXVldWUoInRhYnMiKTtyZXR1cm4gdGhpc319LGFib3J0OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnF1ZXVlKFtdKSx0aGlzLnBhbmVscy5zdG9wKCExLCEwKSx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIpLnNwbGljZSgtMiwyKSksdGhpcy54aHImJih0aGlzLnhoci5hYm9ydCgpLGRlbGV0ZSB0aGlzLnhociksdGhpcy5fY2xlYW51cCgpO3JldHVybiB0aGlzfSx1cmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmFuY2hvcnMuZXEoYSkucmVtb3ZlRGF0YSgiY2FjaGUudGFicyIpLmRhdGEoImxvYWQudGFicyIsYik7cmV0dXJuIHRoaXN9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuY2hvcnMubGVuZ3RofX0pLGEuZXh0ZW5kKGEudWkudGFicyx7dmVyc2lvbjoiMS44LjE3In0pLGEuZXh0ZW5kKGEudWkudGFicy5wcm90b3R5cGUse3JvdGF0aW9uOm51bGwscm90YXRlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPXRoaXMub3B0aW9ucyxlPWMuX3JvdGF0ZXx8KGMuX3JvdGF0ZT1mdW5jdGlvbihiKXtjbGVhclRpbWVvdXQoYy5yb3RhdGlvbiksYy5yb3RhdGlvbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9ZC5zZWxlY3RlZDtjLnNlbGVjdCgrK2E8Yy5hbmNob3JzLmxlbmd0aD9hOjApfSxhKSxiJiZiLnN0b3BQcm9wYWdhdGlvbigpfSksZj1jLl91bnJvdGF0ZXx8KGMuX3Vucm90YXRlPWI/ZnVuY3Rpb24oYSl7dD1kLnNlbGVjdGVkLGUoKX06ZnVuY3Rpb24oYSl7YS5jbGllbnRYJiZjLnJvdGF0ZShudWxsKX0pO2E/KHRoaXMuZWxlbWVudC5iaW5kKCJ0YWJzc2hvdyIsZSksdGhpcy5hbmNob3JzLmJpbmQoZC5ldmVudCsiLnRhYnMiLGYpLGUoKSk6KGNsZWFyVGltZW91dChjLnJvdGF0aW9uKSx0aGlzLmVsZW1lbnQudW5iaW5kKCJ0YWJzc2hvdyIsZSksdGhpcy5hbmNob3JzLnVuYmluZChkLmV2ZW50KyIudGFicyIsZiksZGVsZXRlIHRoaXMuX3JvdGF0ZSxkZWxldGUgdGhpcy5fdW5yb3RhdGUpO3JldHVybiB0aGlzfX0pfSkoalF1ZXJ5KTsvKgogKiBqUXVlcnkgVUkgRGF0ZXBpY2tlciAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0RhdGVwaWNrZXIKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LnVpLmNvcmUuanMKICovKGZ1bmN0aW9uKCQsdW5kZWZpbmVkKXtmdW5jdGlvbiBpc0FycmF5KGEpe3JldHVybiBhJiYoJC5icm93c2VyLnNhZmFyaSYmdHlwZW9mIGE9PSJvYmplY3QiJiZhLmxlbmd0aHx8YS5jb25zdHJ1Y3RvciYmYS5jb25zdHJ1Y3Rvci50b1N0cmluZygpLm1hdGNoKC9cQXJyYXlcKFwpLykpfWZ1bmN0aW9uIGV4dGVuZFJlbW92ZShhLGIpeyQuZXh0ZW5kKGEsYik7Zm9yKHZhciBjIGluIGIpaWYoYltjXT09bnVsbHx8YltjXT09dW5kZWZpbmVkKWFbY109YltjXTtyZXR1cm4gYX1mdW5jdGlvbiBiaW5kSG92ZXIoYSl7dmFyIGI9ImJ1dHRvbiwgLnVpLWRhdGVwaWNrZXItcHJldiwgLnVpLWRhdGVwaWNrZXItbmV4dCwgLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdGQgYSI7cmV0dXJuIGEuYmluZCgibW91c2VvdXQiLGZ1bmN0aW9uKGEpe3ZhciBjPSQoYS50YXJnZXQpLmNsb3Nlc3QoYik7IWMubGVuZ3RofHxjLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciB1aS1kYXRlcGlja2VyLXByZXYtaG92ZXIgdWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9KS5iaW5kKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKGMpe3ZhciBkPSQoYy50YXJnZXQpLmNsb3Nlc3QoYik7ISQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoaW5zdEFjdGl2ZS5pbmxpbmU/YS5wYXJlbnQoKVswXTppbnN0QWN0aXZlLmlucHV0WzBdKSYmISFkLmxlbmd0aCYmKGQucGFyZW50cygiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKS5maW5kKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksZC5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKSxkLmhhc0NsYXNzKCJ1aS1kYXRlcGlja2VyLXByZXYiKSYmZC5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksZC5oYXNDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0IikmJmQuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpKX0pfWZ1bmN0aW9uIERhdGVwaWNrZXIoKXt0aGlzLmRlYnVnPSExLHRoaXMuX2N1ckluc3Q9bnVsbCx0aGlzLl9rZXlFdmVudD0hMSx0aGlzLl9kaXNhYmxlZElucHV0cz1bXSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSx0aGlzLl9pbkRpYWxvZz0hMSx0aGlzLl9tYWluRGl2SWQ9InVpLWRhdGVwaWNrZXItZGl2Iix0aGlzLl9pbmxpbmVDbGFzcz0idWktZGF0ZXBpY2tlci1pbmxpbmUiLHRoaXMuX2FwcGVuZENsYXNzPSJ1aS1kYXRlcGlja2VyLWFwcGVuZCIsdGhpcy5fdHJpZ2dlckNsYXNzPSJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiLHRoaXMuX2RpYWxvZ0NsYXNzPSJ1aS1kYXRlcGlja2VyLWRpYWxvZyIsdGhpcy5fZGlzYWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIix0aGlzLl91bnNlbGVjdGFibGVDbGFzcz0idWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiLHRoaXMuX2N1cnJlbnRDbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSIsdGhpcy5fZGF5T3ZlckNsYXNzPSJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIix0aGlzLnJlZ2lvbmFsPVtdLHRoaXMucmVnaW9uYWxbIiJdPXtjbG9zZVRleHQ6IkRvbmUiLHByZXZUZXh0OiJQcmV2IixuZXh0VGV4dDoiTmV4dCIsY3VycmVudFRleHQ6IlRvZGF5Iixtb250aE5hbWVzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxkYXlOYW1lczpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5TmFtZXNTaG9ydDpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLGRheU5hbWVzTWluOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSx3ZWVrSGVhZGVyOiJXayIsZGF0ZUZvcm1hdDoibW0vZGQveXkiLGZpcnN0RGF5OjAsaXNSVEw6ITEsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLHllYXJTdWZmaXg6IiJ9LHRoaXMuX2RlZmF1bHRzPXtzaG93T246ImZvY3VzIixzaG93QW5pbToiZmFkZUluIixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6IiIsYnV0dG9uVGV4dDoiLi4uIixidXR0b25JbWFnZToiIixidXR0b25JbWFnZU9ubHk6ITEsaGlkZUlmTm9QcmV2TmV4dDohMSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiExLGdvdG9DdXJyZW50OiExLGNoYW5nZU1vbnRoOiExLGNoYW5nZVllYXI6ITEseWVhclJhbmdlOiJjLTEwOmMrMTAiLHNob3dPdGhlck1vbnRoczohMSxzZWxlY3RPdGhlck1vbnRoczohMSxzaG93V2VlazohMSxjYWxjdWxhdGVXZWVrOnRoaXMuaXNvODYwMVdlZWssc2hvcnRZZWFyQ3V0b2ZmOiIrMTAiLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGwsZHVyYXRpb246ImZhc3QiLGJlZm9yZVNob3dEYXk6bnVsbCxiZWZvcmVTaG93Om51bGwsb25TZWxlY3Q6bnVsbCxvbkNoYW5nZU1vbnRoWWVhcjpudWxsLG9uQ2xvc2U6bnVsbCxudW1iZXJPZk1vbnRoczoxLHNob3dDdXJyZW50QXRQb3M6MCxzdGVwTW9udGhzOjEsc3RlcEJpZ01vbnRoczoxMixhbHRGaWVsZDoiIixhbHRGb3JtYXQ6IiIsY29uc3RyYWluSW5wdXQ6ITAsc2hvd0J1dHRvblBhbmVsOiExLGF1dG9TaXplOiExLGRpc2FibGVkOiExfSwkLmV4dGVuZCh0aGlzLl9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5kcERpdj1iaW5kSG92ZXIoJCgnPGRpdiBpZD0iJyt0aGlzLl9tYWluRGl2SWQrJyIgY2xhc3M9InVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSl9JC5leHRlbmQoJC51aSx7ZGF0ZXBpY2tlcjp7dmVyc2lvbjoiMS44LjE3In19KTt2YXIgUFJPUF9OQU1FPSJkYXRlcGlja2VyIixkcHV1aWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksaW5zdEFjdGl2ZTskLmV4dGVuZChEYXRlcGlja2VyLnByb3RvdHlwZSx7bWFya2VyQ2xhc3NOYW1lOiJoYXNEYXRlcGlja2VyIixtYXhSb3dzOjQsbG9nOmZ1bmN0aW9uKCl7dGhpcy5kZWJ1ZyYmY29uc29sZS5sb2cuYXBwbHkoIiIsYXJndW1lbnRzKX0sX3dpZGdldERhdGVwaWNrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kcERpdn0sc2V0RGVmYXVsdHM6ZnVuY3Rpb24oYSl7ZXh0ZW5kUmVtb3ZlKHRoaXMuX2RlZmF1bHRzLGF8fHt9KTtyZXR1cm4gdGhpc30sX2F0dGFjaERhdGVwaWNrZXI6ZnVuY3Rpb24odGFyZ2V0LHNldHRpbmdzKXt2YXIgaW5saW5lU2V0dGluZ3M9bnVsbDtmb3IodmFyIGF0dHJOYW1lIGluIHRoaXMuX2RlZmF1bHRzKXt2YXIgYXR0clZhbHVlPXRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGU6IithdHRyTmFtZSk7aWYoYXR0clZhbHVlKXtpbmxpbmVTZXR0aW5ncz1pbmxpbmVTZXR0aW5nc3x8e307dHJ5e2lubGluZVNldHRpbmdzW2F0dHJOYW1lXT1ldmFsKGF0dHJWYWx1ZSl9Y2F0Y2goZXJyKXtpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV09YXR0clZhbHVlfX19dmFyIG5vZGVOYW1lPXRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGlubGluZT1ub2RlTmFtZT09ImRpdiJ8fG5vZGVOYW1lPT0ic3BhbiI7dGFyZ2V0LmlkfHwodGhpcy51dWlkKz0xLHRhcmdldC5pZD0iZHAiK3RoaXMudXVpZCk7dmFyIGluc3Q9dGhpcy5fbmV3SW5zdCgkKHRhcmdldCksaW5saW5lKTtpbnN0LnNldHRpbmdzPSQuZXh0ZW5kKHt9LHNldHRpbmdzfHx7fSxpbmxpbmVTZXR0aW5nc3x8e30pLG5vZGVOYW1lPT0iaW5wdXQiP3RoaXMuX2Nvbm5lY3REYXRlcGlja2VyKHRhcmdldCxpbnN0KTppbmxpbmUmJnRoaXMuX2lubGluZURhdGVwaWNrZXIodGFyZ2V0LGluc3QpfSxfbmV3SW5zdDpmdW5jdGlvbihhLGIpe3ZhciBjPWFbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05Xy1dKS9nLCJcXFxcJDEiKTtyZXR1cm57aWQ6YyxpbnB1dDphLHNlbGVjdGVkRGF5OjAsc2VsZWN0ZWRNb250aDowLHNlbGVjdGVkWWVhcjowLGRyYXdNb250aDowLGRyYXdZZWFyOjAsaW5saW5lOmIsZHBEaXY6Yj9iaW5kSG92ZXIoJCgnPGRpdiBjbGFzcz0iJyt0aGlzLl9pbmxpbmVDbGFzcysnIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSk6dGhpcy5kcERpdn19LF9jb25uZWN0RGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPSQoYSk7Yi5hcHBlbmQ9JChbXSksYi50cmlnZ2VyPSQoW10pO2MuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpfHwodGhpcy5fYXR0YWNobWVudHMoYyxiKSxjLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRoaXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCkuYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMsZCl7Yi5zZXR0aW5nc1tjXT1kfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLl9nZXQoYixjKX0pLHRoaXMuX2F1dG9TaXplKGIpLCQuZGF0YShhLFBST1BfTkFNRSxiKSxiLnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcihhKSl9LF9hdHRhY2htZW50czpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldChiLCJhcHBlbmRUZXh0IiksZD10aGlzLl9nZXQoYiwiaXNSVEwiKTtiLmFwcGVuZCYmYi5hcHBlbmQucmVtb3ZlKCksYyYmKGIuYXBwZW5kPSQoJzxzcGFuIGNsYXNzPSInK3RoaXMuX2FwcGVuZENsYXNzKyciPicrYysiPC9zcGFuPiIpLGFbZD8iYmVmb3JlIjoiYWZ0ZXIiXShiLmFwcGVuZCkpLGEudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLGIudHJpZ2dlciYmYi50cmlnZ2VyLnJlbW92ZSgpO3ZhciBlPXRoaXMuX2dldChiLCJzaG93T24iKTsoZT09ImZvY3VzInx8ZT09ImJvdGgiKSYmYS5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlcik7aWYoZT09ImJ1dHRvbiJ8fGU9PSJib3RoIil7dmFyIGY9dGhpcy5fZ2V0KGIsImJ1dHRvblRleHQiKSxnPXRoaXMuX2dldChiLCJidXR0b25JbWFnZSIpO2IudHJpZ2dlcj0kKHRoaXMuX2dldChiLCJidXR0b25JbWFnZU9ubHkiKT8kKCI8aW1nLz4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmF0dHIoe3NyYzpnLGFsdDpmLHRpdGxlOmZ9KTokKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5odG1sKGc9PSIiP2Y6JCgiPGltZy8+IikuYXR0cih7c3JjOmcsYWx0OmYsdGl0bGU6Zn0pKSksYVtkPyJiZWZvcmUiOiJhZnRlciJdKGIudHJpZ2dlciksYi50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7JC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWFbMF0/JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOiQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoYVswXSk7cmV0dXJuITF9KX19LF9hdXRvU2l6ZTpmdW5jdGlvbihhKXtpZih0aGlzLl9nZXQoYSwiYXV0b1NpemUiKSYmIWEuaW5saW5lKXt2YXIgYj1uZXcgRGF0ZSgyMDA5LDExLDIwKSxjPXRoaXMuX2dldChhLCJkYXRlRm9ybWF0Iik7aWYoYy5tYXRjaCgvW0RNXS8pKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmxlbmd0aD5iJiYoYj1hW2RdLmxlbmd0aCxjPWQpO3JldHVybiBjfTtiLnNldE1vbnRoKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvTU0vKT8ibW9udGhOYW1lcyI6Im1vbnRoTmFtZXNTaG9ydCIpKSksYi5zZXREYXRlKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvREQvKT8iZGF5TmFtZXMiOiJkYXlOYW1lc1Nob3J0IikpKzIwLWIuZ2V0RGF5KCkpfWEuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZShhLGIpLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPSQoYSk7Yy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSl8fChjLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5hcHBlbmQoYi5kcERpdikuYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMsZCl7Yi5zZXR0aW5nc1tjXT1kfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLl9nZXQoYixjKX0pLCQuZGF0YShhLFBST1BfTkFNRSxiKSx0aGlzLl9zZXREYXRlKGIsdGhpcy5fZ2V0RGVmYXVsdERhdGUoYiksITApLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoYiksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGIpLGIuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKGEpLGIuZHBEaXYuY3NzKCJkaXNwbGF5IiwiYmxvY2siKSl9LF9kaWFsb2dEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9dGhpcy5fZGlhbG9nSW5zdDtpZighZil7dGhpcy51dWlkKz0xO3ZhciBnPSJkcCIrdGhpcy51dWlkO3RoaXMuX2RpYWxvZ0lucHV0PSQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJytnKyciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OyB6LWluZGV4OiAtMTA7Ii8+JyksdGhpcy5fZGlhbG9nSW5wdXQua2V5ZG93bih0aGlzLl9kb0tleURvd24pLCQoImJvZHkiKS5hcHBlbmQodGhpcy5fZGlhbG9nSW5wdXQpLGY9dGhpcy5fZGlhbG9nSW5zdD10aGlzLl9uZXdJbnN0KHRoaXMuX2RpYWxvZ0lucHV0LCExKSxmLnNldHRpbmdzPXt9LCQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSxQUk9QX05BTUUsZil9ZXh0ZW5kUmVtb3ZlKGYuc2V0dGluZ3MsZHx8e30pLGI9YiYmYi5jb25zdHJ1Y3Rvcj09RGF0ZT90aGlzLl9mb3JtYXREYXRlKGYsYik6Yix0aGlzLl9kaWFsb2dJbnB1dC52YWwoYiksdGhpcy5fcG9zPWU/ZS5sZW5ndGg/ZTpbZS5wYWdlWCxlLnBhZ2VZXTpudWxsO2lmKCF0aGlzLl9wb3Mpe3ZhciBoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsaj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LGs9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7dGhpcy5fcG9zPVtoLzItMTAwK2osaS8yLTE1MCtrXX10aGlzLl9kaWFsb2dJbnB1dC5jc3MoImxlZnQiLHRoaXMuX3Bvc1swXSsyMCsicHgiKS5jc3MoInRvcCIsdGhpcy5fcG9zWzFdKyJweCIpLGYuc2V0dGluZ3Mub25TZWxlY3Q9Yyx0aGlzLl9pbkRpYWxvZz0hMCx0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKSx0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSksJC5ibG9ja1VJJiYkLmJsb2NrVUkodGhpcy5kcERpdiksJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxmKTtyZXR1cm4gdGhpc30sX2Rlc3Ryb3lEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz0kLmRhdGEoYSxQUk9QX05BTUUpO2lmKCEhYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpe3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTskLnJlbW92ZURhdGEoYSxQUk9QX05BTUUpLGQ9PSJpbnB1dCI/KGMuYXBwZW5kLnJlbW92ZSgpLGMudHJpZ2dlci5yZW1vdmUoKSxiLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlcikudW5iaW5kKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLnVuYmluZCgia2V5cHJlc3MiLHRoaXMuX2RvS2V5UHJlc3MpLnVuYmluZCgia2V5dXAiLHRoaXMuX2RvS2V5VXApKTooZD09ImRpdiJ8fGQ9PSJzcGFuIikmJmIucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCl9fSxfZW5hYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighIWIuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXt2YXIgZD1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoZD09ImlucHV0IilhLmRpc2FibGVkPSExLGMudHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSExfSkuZW5kKCkuZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6IjEuMCIsY3Vyc29yOiIifSk7ZWxzZSBpZihkPT0iZGl2Inx8ZD09InNwYW4iKXt2YXIgZT1iLmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7ZS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLGUuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfXRoaXMuX2Rpc2FibGVkSW5wdXRzPSQubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKGIpe3JldHVybiBiPT1hP251bGw6Yn0pfX0sX2Rpc2FibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz0kLmRhdGEoYSxQUk9QX05BTUUpO2lmKCEhYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpe3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihkPT0iaW5wdXQiKWEuZGlzYWJsZWQ9ITAsYy50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITB9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMC41IixjdXJzb3I6ImRlZmF1bHQifSk7ZWxzZSBpZihkPT0iZGl2Inx8ZD09InNwYW4iKXt2YXIgZT1iLmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7ZS5jaGlsZHJlbigpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLGUuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIil9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oYil7cmV0dXJuIGI9PWE/bnVsbDpifSksdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT1hfX0sX2lzRGlzYWJsZWREYXRlcGlja2VyOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO2Zvcih2YXIgYj0wO2I8dGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoO2IrKylpZih0aGlzLl9kaXNhYmxlZElucHV0c1tiXT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sX2dldEluc3Q6ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiAkLmRhdGEoYSxQUk9QX05BTUUpfWNhdGNoKGIpe3Rocm93Ik1pc3NpbmcgaW5zdGFuY2UgZGF0YSBmb3IgdGhpcyBkYXRlcGlja2VyIn19LF9vcHRpb25EYXRlcGlja2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9nZXRJbnN0KGEpO2lmKGFyZ3VtZW50cy5sZW5ndGg9PTImJnR5cGVvZiBiPT0ic3RyaW5nIilyZXR1cm4gYj09ImRlZmF1bHRzIj8kLmV4dGVuZCh7fSwkLmRhdGVwaWNrZXIuX2RlZmF1bHRzKTpkP2I9PSJhbGwiPyQuZXh0ZW5kKHt9LGQuc2V0dGluZ3MpOnRoaXMuX2dldChkLGIpOm51bGw7dmFyIGU9Ynx8e307dHlwZW9mIGI9PSJzdHJpbmciJiYoZT17fSxlW2JdPWMpO2lmKGQpe3RoaXMuX2N1ckluc3Q9PWQmJnRoaXMuX2hpZGVEYXRlcGlja2VyKCk7dmFyIGY9dGhpcy5fZ2V0RGF0ZURhdGVwaWNrZXIoYSwhMCksZz10aGlzLl9nZXRNaW5NYXhEYXRlKGQsIm1pbiIpLGg9dGhpcy5fZ2V0TWluTWF4RGF0ZShkLCJtYXgiKTtleHRlbmRSZW1vdmUoZC5zZXR0aW5ncyxlKSxnIT09bnVsbCYmZS5kYXRlRm9ybWF0IT09dW5kZWZpbmVkJiZlLm1pbkRhdGU9PT11bmRlZmluZWQmJihkLnNldHRpbmdzLm1pbkRhdGU9dGhpcy5fZm9ybWF0RGF0ZShkLGcpKSxoIT09bnVsbCYmZS5kYXRlRm9ybWF0IT09dW5kZWZpbmVkJiZlLm1heERhdGU9PT11bmRlZmluZWQmJihkLnNldHRpbmdzLm1heERhdGU9dGhpcy5fZm9ybWF0RGF0ZShkLGgpKSx0aGlzLl9hdHRhY2htZW50cygkKGEpLGQpLHRoaXMuX2F1dG9TaXplKGQpLHRoaXMuX3NldERhdGUoZCxmKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoZCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihkKX19LF9jaGFuZ2VEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYixjKXt0aGlzLl9vcHRpb25EYXRlcGlja2VyKGEsYixjKX0sX3JlZnJlc2hEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldEluc3QoYSk7YiYmdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihiKX0sX3NldERhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZ2V0SW5zdChhKTtjJiYodGhpcy5fc2V0RGF0ZShjLGIpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoYyksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGMpKX0sX2dldERhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZ2V0SW5zdChhKTtjJiYhYy5pbmxpbmUmJnRoaXMuX3NldERhdGVGcm9tRmllbGQoYyxiKTtyZXR1cm4gYz90aGlzLl9nZXREYXRlKGMpOm51bGx9LF9kb0tleURvd246ZnVuY3Rpb24oYSl7dmFyIGI9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGEudGFyZ2V0KSxjPSEwLGQ9Yi5kcERpdi5pcygiLnVpLWRhdGVwaWNrZXItcnRsIik7Yi5fa2V5RXZlbnQ9ITA7aWYoJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZylzd2l0Y2goYS5rZXlDb2RlKXtjYXNlIDk6JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLGM9ITE7YnJlYWs7Y2FzZSAxMzp2YXIgZT0kKCJ0ZC4iKyQuZGF0ZXBpY2tlci5fZGF5T3ZlckNsYXNzKyI6bm90KC4iKyQuZGF0ZXBpY2tlci5fY3VycmVudENsYXNzKyIpIixiLmRwRGl2KTtlWzBdJiYkLmRhdGVwaWNrZXIuX3NlbGVjdERheShhLnRhcmdldCxiLnNlbGVjdGVkTW9udGgsYi5zZWxlY3RlZFllYXIsZVswXSk7dmFyIGY9JC5kYXRlcGlja2VyLl9nZXQoYiwib25TZWxlY3QiKTtpZihmKXt2YXIgZz0kLmRhdGVwaWNrZXIuX2Zvcm1hdERhdGUoYik7Zi5hcHBseShiLmlucHV0P2IuaW5wdXRbMF06bnVsbCxbZyxiXSl9ZWxzZSAkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7cmV0dXJuITE7Y2FzZSAyNzokLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7YnJlYWs7Y2FzZSAzMzokLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsYS5jdHJsS2V5Py0kLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwQmlnTW9udGhzIik6LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzQ6JC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8rJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOiskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM1OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fY2xlYXJEYXRlKGEudGFyZ2V0KSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzY6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9nb3RvVG9kYXkoYS50YXJnZXQpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXk7YnJlYWs7Y2FzZSAzNzooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsZD8xOi0xLCJEIiksYz1hLmN0cmxLZXl8fGEubWV0YUtleSxhLm9yaWdpbmFsRXZlbnQuYWx0S2V5JiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsYS5jdHJsS2V5Py0kLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwQmlnTW9udGhzIik6LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzg6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LC03LCJEIiksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztjYXNlIDM5OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxkPy0xOjEsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5LGEub3JpZ2luYWxFdmVudC5hbHRLZXkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTorJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSA0MDooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsNywiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXk7YnJlYWs7ZGVmYXVsdDpjPSExfWVsc2UgYS5rZXlDb2RlPT0zNiYmYS5jdHJsS2V5PyQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIodGhpcyk6Yz0hMTtjJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpfSxfZG9LZXlQcmVzczpmdW5jdGlvbihhKXt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYS50YXJnZXQpO2lmKCQuZGF0ZXBpY2tlci5fZ2V0KGIsImNvbnN0cmFpbklucHV0Iikpe3ZhciBjPSQuZGF0ZXBpY2tlci5fcG9zc2libGVDaGFycygkLmRhdGVwaWNrZXIuX2dldChiLCJkYXRlRm9ybWF0IikpLGQ9U3RyaW5nLmZyb21DaGFyQ29kZShhLmNoYXJDb2RlPT11bmRlZmluZWQ/YS5rZXlDb2RlOmEuY2hhckNvZGUpO3JldHVybiBhLmN0cmxLZXl8fGEubWV0YUtleXx8ZDwiICJ8fCFjfHxjLmluZGV4T2YoZCk+LTF9fSxfZG9LZXlVcDpmdW5jdGlvbihhKXt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYS50YXJnZXQpO2lmKGIuaW5wdXQudmFsKCkhPWIubGFzdFZhbCl0cnl7dmFyIGM9JC5kYXRlcGlja2VyLnBhcnNlRGF0ZSgkLmRhdGVwaWNrZXIuX2dldChiLCJkYXRlRm9ybWF0IiksYi5pbnB1dD9iLmlucHV0LnZhbCgpOm51bGwsJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoYikpO2MmJigkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoYiksJC5kYXRlcGlja2VyLl91cGRhdGVBbHRlcm5hdGUoYiksJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGIpKX1jYXRjaChhKXskLmRhdGVwaWNrZXIubG9nKGEpfXJldHVybiEwfSxfc2hvd0RhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7YT1hLnRhcmdldHx8YSxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPSJpbnB1dCImJihhPSQoImlucHV0IixhLnBhcmVudE5vZGUpWzBdKTtpZighJC5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihhKSYmJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPWEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhKTskLmRhdGVwaWNrZXIuX2N1ckluc3QmJiQuZGF0ZXBpY2tlci5fY3VySW5zdCE9YiYmKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5kcERpdi5zdG9wKCEwLCEwKSxiJiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5pbnB1dFswXSkpO3ZhciBjPSQuZGF0ZXBpY2tlci5fZ2V0KGIsImJlZm9yZVNob3ciKSxkPWM/Yy5hcHBseShhLFthLGJdKTp7fTtpZihkPT09ITEpcmV0dXJuO2V4dGVuZFJlbW92ZShiLnNldHRpbmdzLGQpLGIubGFzdFZhbD1udWxsLCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PWEsJC5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGIpLCQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJihhLnZhbHVlPSIiKSwkLmRhdGVwaWNrZXIuX3Bvc3x8KCQuZGF0ZXBpY2tlci5fcG9zPSQuZGF0ZXBpY2tlci5fZmluZFBvcyhhKSwkLmRhdGVwaWNrZXIuX3Bvc1sxXSs9YS5vZmZzZXRIZWlnaHQpO3ZhciBlPSExOyQoYSkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtlfD0kKHRoaXMpLmNzcygicG9zaXRpb24iKT09ImZpeGVkIjtyZXR1cm4hZX0pLGUmJiQuYnJvd3Nlci5vcGVyYSYmKCQuZGF0ZXBpY2tlci5fcG9zWzBdLT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCwkLmRhdGVwaWNrZXIuX3Bvc1sxXS09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk7dmFyIGY9e2xlZnQ6JC5kYXRlcGlja2VyLl9wb3NbMF0sdG9wOiQuZGF0ZXBpY2tlci5fcG9zWzFdfTskLmRhdGVwaWNrZXIuX3Bvcz1udWxsLGIuZHBEaXYuZW1wdHkoKSxiLmRwRGl2LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJibG9jayIsdG9wOiItMTAwMHB4In0pLCQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihiKSxmPSQuZGF0ZXBpY2tlci5fY2hlY2tPZmZzZXQoYixmLGUpLGIuZHBEaXYuY3NzKHtwb3NpdGlvbjokLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYkLmJsb2NrVUk/InN0YXRpYyI6ZT8iZml4ZWQiOiJhYnNvbHV0ZSIsZGlzcGxheToibm9uZSIsbGVmdDpmLmxlZnQrInB4Iix0b3A6Zi50b3ArInB4In0pO2lmKCFiLmlubGluZSl7dmFyIGc9JC5kYXRlcGlja2VyLl9nZXQoYiwic2hvd0FuaW0iKSxoPSQuZGF0ZXBpY2tlci5fZ2V0KGIsImR1cmF0aW9uIiksaT1mdW5jdGlvbigpe3ZhciBhPWIuZHBEaXYuZmluZCgiaWZyYW1lLnVpLWRhdGVwaWNrZXItY292ZXIiKTtpZighIWEubGVuZ3RoKXt2YXIgYz0kLmRhdGVwaWNrZXIuX2dldEJvcmRlcnMoYi5kcERpdik7YS5jc3Moe2xlZnQ6LWNbMF0sdG9wOi1jWzFdLHdpZHRoOmIuZHBEaXYub3V0ZXJXaWR0aCgpLGhlaWdodDpiLmRwRGl2Lm91dGVySGVpZ2h0KCl9KX19O2IuZHBEaXYuekluZGV4KCQoYSkuekluZGV4KCkrMSksJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZz0hMCwkLmVmZmVjdHMmJiQuZWZmZWN0c1tnXT9iLmRwRGl2LnNob3coZywkLmRhdGVwaWNrZXIuX2dldChiLCJzaG93T3B0aW9ucyIpLGgsaSk6Yi5kcERpdltnfHwic2hvdyJdKGc/aDpudWxsLGkpLCghZ3x8IWgpJiZpKCksYi5pbnB1dC5pcygiOnZpc2libGUiKSYmIWIuaW5wdXQuaXMoIjpkaXNhYmxlZCIpJiZiLmlucHV0LmZvY3VzKCksJC5kYXRlcGlja2VyLl9jdXJJbnN0PWJ9fX0sX3VwZGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLm1heFJvd3M9NDt2YXIgYz0kLmRhdGVwaWNrZXIuX2dldEJvcmRlcnMoYS5kcERpdik7aW5zdEFjdGl2ZT1hLGEuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGEpKTt2YXIgZD1hLmRwRGl2LmZpbmQoImlmcmFtZS51aS1kYXRlcGlja2VyLWNvdmVyIik7IWQubGVuZ3RofHxkLmNzcyh7bGVmdDotY1swXSx0b3A6LWNbMV0sd2lkdGg6YS5kcERpdi5vdXRlcldpZHRoKCksaGVpZ2h0OmEuZHBEaXYub3V0ZXJIZWlnaHQoKX0pLGEuZHBEaXYuZmluZCgiLiIrdGhpcy5fZGF5T3ZlckNsYXNzKyIgYSIpLm1vdXNlb3ZlcigpO3ZhciBlPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGY9ZVsxXSxnPTE3O2EuZHBEaXYucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktMiB1aS1kYXRlcGlja2VyLW11bHRpLTMgdWktZGF0ZXBpY2tlci1tdWx0aS00Iikud2lkdGgoIiIpLGY+MSYmYS5kcERpdi5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0iK2YpLmNzcygid2lkdGgiLGcqZisiZW0iKSxhLmRwRGl2WyhlWzBdIT0xfHxlWzFdIT0xPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpLGEuZHBEaXZbKHRoaXMuX2dldChhLCJpc1JUTCIpPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1ydGwiKSxhPT0kLmRhdGVwaWNrZXIuX2N1ckluc3QmJiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmEuaW5wdXQmJmEuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFhLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmYS5pbnB1dFswXSE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmYS5pbnB1dC5mb2N1cygpO2lmKGEueWVhcnNodG1sKXt2YXIgaD1hLnllYXJzaHRtbDtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aD09PWEueWVhcnNodG1sJiZhLnllYXJzaHRtbCYmYS5kcERpdi5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyOmZpcnN0IikucmVwbGFjZVdpdGgoYS55ZWFyc2h0bWwpLGg9YS55ZWFyc2h0bWw9bnVsbH0sMCl9fSxfZ2V0Qm9yZGVyczpmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm57dGhpbjoxLG1lZGl1bToyLHRoaWNrOjN9W2FdfHxhfTtyZXR1cm5bcGFyc2VGbG9hdChiKGEuY3NzKCJib3JkZXItbGVmdC13aWR0aCIpKSkscGFyc2VGbG9hdChiKGEuY3NzKCJib3JkZXItdG9wLXdpZHRoIikpKV19LF9jaGVja09mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5kcERpdi5vdXRlcldpZHRoKCksZT1hLmRwRGl2Lm91dGVySGVpZ2h0KCksZj1hLmlucHV0P2EuaW5wdXQub3V0ZXJXaWR0aCgpOjAsZz1hLmlucHV0P2EuaW5wdXQub3V0ZXJIZWlnaHQoKTowLGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKyQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSxpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQrJChkb2N1bWVudCkuc2Nyb2xsVG9wKCk7Yi5sZWZ0LT10aGlzLl9nZXQoYSwiaXNSVEwiKT9kLWY6MCxiLmxlZnQtPWMmJmIubGVmdD09YS5pbnB1dC5vZmZzZXQoKS5sZWZ0PyQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTowLGIudG9wLT1jJiZiLnRvcD09YS5pbnB1dC5vZmZzZXQoKS50b3ArZz8kKGRvY3VtZW50KS5zY3JvbGxUb3AoKTowLGIubGVmdC09TWF0aC5taW4oYi5sZWZ0LGIubGVmdCtkPmgmJmg+ZD9NYXRoLmFicyhiLmxlZnQrZC1oKTowKSxiLnRvcC09TWF0aC5taW4oYi50b3AsYi50b3ArZT5pJiZpPmU/TWF0aC5hYnMoZStnKTowKTtyZXR1cm4gYn0sX2ZpbmRQb3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0SW5zdChhKSxjPXRoaXMuX2dldChiLCJpc1JUTCIpO3doaWxlKGEmJihhLnR5cGU9PSJoaWRkZW4ifHxhLm5vZGVUeXBlIT0xfHwkLmV4cHIuZmlsdGVycy5oaWRkZW4oYSkpKWE9YVtjPyJwcmV2aW91c1NpYmxpbmciOiJuZXh0U2libGluZyJdO3ZhciBkPSQoYSkub2Zmc2V0KCk7cmV0dXJuW2QubGVmdCxkLnRvcF19LF9oaWRlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9jdXJJbnN0O2lmKCEoIWJ8fGEmJmIhPSQuZGF0YShhLFBST1BfTkFNRSkpJiZ0aGlzLl9kYXRlcGlja2VyU2hvd2luZyl7dmFyIGM9dGhpcy5fZ2V0KGIsInNob3dBbmltIiksZD10aGlzLl9nZXQoYiwiZHVyYXRpb24iKSxlPXRoaXMsZj1mdW5jdGlvbigpeyQuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhiKSxlLl9jdXJJbnN0PW51bGx9OyQuZWZmZWN0cyYmJC5lZmZlY3RzW2NdP2IuZHBEaXYuaGlkZShjLCQuZGF0ZXBpY2tlci5fZ2V0KGIsInNob3dPcHRpb25zIiksZCxmKTpiLmRwRGl2W2M9PSJzbGlkZURvd24iPyJzbGlkZVVwIjpjPT0iZmFkZUluIj8iZmFkZU91dCI6ImhpZGUiXShjP2Q6bnVsbCxmKSxjfHxmKCksdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITE7dmFyIGc9dGhpcy5fZ2V0KGIsIm9uQ2xvc2UiKTtnJiZnLmFwcGx5KGIuaW5wdXQ/Yi5pbnB1dFswXTpudWxsLFtiLmlucHV0P2IuaW5wdXQudmFsKCk6IiIsYl0pLHRoaXMuX2xhc3RJbnB1dD1udWxsLHRoaXMuX2luRGlhbG9nJiYodGhpcy5fZGlhbG9nSW5wdXQuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6IjAiLHRvcDoiLTEwMHB4In0pLCQuYmxvY2tVSSYmKCQudW5ibG9ja1VJKCksJCgiYm9keSIpLmFwcGVuZCh0aGlzLmRwRGl2KSkpLHRoaXMuX2luRGlhbG9nPSExfX0sX3RpZHlEaWFsb2c6ZnVuY3Rpb24oYSl7YS5kcERpdi5yZW1vdmVDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcykudW5iaW5kKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpfSxfY2hlY2tFeHRlcm5hbENsaWNrOmZ1bmN0aW9uKGEpe2lmKCEhJC5kYXRlcGlja2VyLl9jdXJJbnN0KXt2YXIgYj0kKGEudGFyZ2V0KSxjPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChiWzBdKTsoYlswXS5pZCE9JC5kYXRlcGlja2VyLl9tYWluRGl2SWQmJmIucGFyZW50cygiIyIrJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aD09MCYmIWIuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiFiLmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5fdHJpZ2dlckNsYXNzKSYmJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmKCEkLmRhdGVwaWNrZXIuX2luRGlhbG9nfHwhJC5ibG9ja1VJKXx8Yi5oYXNDbGFzcygkLmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSYmJC5kYXRlcGlja2VyLl9jdXJJbnN0IT1jKSYmJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpfX0sX2FkanVzdERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSQoYSksZT10aGlzLl9nZXRJbnN0KGRbMF0pO3RoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGRbMF0pfHwodGhpcy5fYWRqdXN0SW5zdERhdGUoZSxiKyhjPT0iTSI/dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKTowKSxjKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGUpKX0sX2dvdG9Ub2RheTpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9dGhpcy5fZ2V0SW5zdChiWzBdKTtpZih0aGlzLl9nZXQoYywiZ290b0N1cnJlbnQiKSYmYy5jdXJyZW50RGF5KWMuc2VsZWN0ZWREYXk9Yy5jdXJyZW50RGF5LGMuZHJhd01vbnRoPWMuc2VsZWN0ZWRNb250aD1jLmN1cnJlbnRNb250aCxjLmRyYXdZZWFyPWMuc2VsZWN0ZWRZZWFyPWMuY3VycmVudFllYXI7ZWxzZXt2YXIgZD1uZXcgRGF0ZTtjLnNlbGVjdGVkRGF5PWQuZ2V0RGF0ZSgpLGMuZHJhd01vbnRoPWMuc2VsZWN0ZWRNb250aD1kLmdldE1vbnRoKCksYy5kcmF3WWVhcj1jLnNlbGVjdGVkWWVhcj1kLmdldEZ1bGxZZWFyKCl9dGhpcy5fbm90aWZ5Q2hhbmdlKGMpLHRoaXMuX2FkanVzdERhdGUoYil9LF9zZWxlY3RNb250aFllYXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSQoYSksZT10aGlzLl9nZXRJbnN0KGRbMF0pO2VbInNlbGVjdGVkIisoYz09Ik0iPyJNb250aCI6IlllYXIiKV09ZVsiZHJhdyIrKGM9PSJNIj8iTW9udGgiOiJZZWFyIildPXBhcnNlSW50KGIub3B0aW9uc1tiLnNlbGVjdGVkSW5kZXhdLnZhbHVlLDEwKSx0aGlzLl9ub3RpZnlDaGFuZ2UoZSksdGhpcy5fYWRqdXN0RGF0ZShkKX0sX3NlbGVjdERheTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT0kKGEpO2lmKCEkKGQpLmhhc0NsYXNzKHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKSYmIXRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGVbMF0pKXt2YXIgZj10aGlzLl9nZXRJbnN0KGVbMF0pO2Yuc2VsZWN0ZWREYXk9Zi5jdXJyZW50RGF5PSQoImEiLGQpLmh0bWwoKSxmLnNlbGVjdGVkTW9udGg9Zi5jdXJyZW50TW9udGg9YixmLnNlbGVjdGVkWWVhcj1mLmN1cnJlbnRZZWFyPWMsdGhpcy5fc2VsZWN0RGF0ZShhLHRoaXMuX2Zvcm1hdERhdGUoZixmLmN1cnJlbnREYXksZi5jdXJyZW50TW9udGgsZi5jdXJyZW50WWVhcikpfX0sX2NsZWFyRGF0ZTpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9dGhpcy5fZ2V0SW5zdChiWzBdKTt0aGlzLl9zZWxlY3REYXRlKGIsIiIpfSxfc2VsZWN0RGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPSQoYSksZD10aGlzLl9nZXRJbnN0KGNbMF0pO2I9YiE9bnVsbD9iOnRoaXMuX2Zvcm1hdERhdGUoZCksZC5pbnB1dCYmZC5pbnB1dC52YWwoYiksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGQpO3ZhciBlPXRoaXMuX2dldChkLCJvblNlbGVjdCIpO2U/ZS5hcHBseShkLmlucHV0P2QuaW5wdXRbMF06bnVsbCxbYixkXSk6ZC5pbnB1dCYmZC5pbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKSxkLmlubGluZT90aGlzLl91cGRhdGVEYXRlcGlja2VyKGQpOih0aGlzLl9oaWRlRGF0ZXBpY2tlcigpLHRoaXMuX2xhc3RJbnB1dD1kLmlucHV0WzBdLHR5cGVvZiBkLmlucHV0WzBdIT0ib2JqZWN0IiYmZC5pbnB1dC5mb2N1cygpLHRoaXMuX2xhc3RJbnB1dD1udWxsKX0sX3VwZGF0ZUFsdGVybmF0ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9nZXQoYSwiYWx0RmllbGQiKTtpZihiKXt2YXIgYz10aGlzLl9nZXQoYSwiYWx0Rm9ybWF0Iil8fHRoaXMuX2dldChhLCJkYXRlRm9ybWF0IiksZD10aGlzLl9nZXREYXRlKGEpLGU9dGhpcy5mb3JtYXREYXRlKGMsZCx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOyQoYikuZWFjaChmdW5jdGlvbigpeyQodGhpcykudmFsKGUpfSl9fSxub1dlZWtlbmRzOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0RGF5KCk7cmV0dXJuW2I+MCYmYjw2LCIiXX0saXNvODYwMVdlZWs6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGUoYS5nZXRUaW1lKCkpO2Iuc2V0RGF0ZShiLmdldERhdGUoKSs0LShiLmdldERheSgpfHw3KSk7dmFyIGM9Yi5nZXRUaW1lKCk7Yi5zZXRNb250aCgwKSxiLnNldERhdGUoMSk7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yb3VuZCgoYy1iKS84NjRlNSkvNykrMX0scGFyc2VEYXRlOmZ1bmN0aW9uKGEsYixjKXtpZihhPT1udWxsfHxiPT1udWxsKXRocm93IkludmFsaWQgYXJndW1lbnRzIjtiPXR5cGVvZiBiPT0ib2JqZWN0Ij9iLnRvU3RyaW5nKCk6YisiIjtpZihiPT0iIilyZXR1cm4gbnVsbDt2YXIgZD0oYz9jLnNob3J0WWVhckN1dG9mZjpudWxsKXx8dGhpcy5fZGVmYXVsdHMuc2hvcnRZZWFyQ3V0b2ZmO2Q9dHlwZW9mIGQhPSJzdHJpbmciP2Q6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludChkLDEwKTt2YXIgZT0oYz9jLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQsZj0oYz9jLmRheU5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcyxnPShjP2MubW9udGhOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQsaD0oYz9jLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXMsaT0tMSxqPS0xLGs9LTEsbD0tMSxtPSExLG49ZnVuY3Rpb24oYil7dmFyIGM9cysxPGEubGVuZ3RoJiZhLmNoYXJBdChzKzEpPT1iO2MmJnMrKztyZXR1cm4gY30sbz1mdW5jdGlvbihhKXt2YXIgYz1uKGEpLGQ9YT09IkAiPzE0OmE9PSIhIj8yMDphPT0ieSImJmM/NDphPT0ibyI/MzoyLGU9bmV3IFJlZ0V4cCgiXlxcZHsxLCIrZCsifSIpLGY9Yi5zdWJzdHJpbmcocikubWF0Y2goZSk7aWYoIWYpdGhyb3ciTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gIityO3IrPWZbMF0ubGVuZ3RoO3JldHVybiBwYXJzZUludChmWzBdLDEwKX0scD1mdW5jdGlvbihhLGMsZCl7dmFyIGU9JC5tYXAobihhKT9kOmMsZnVuY3Rpb24oYSxiKXtyZXR1cm5bW2IsYV1dfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybi0oYVsxXS5sZW5ndGgtYlsxXS5sZW5ndGgpfSksZj0tMTskLmVhY2goZSxmdW5jdGlvbihhLGMpe3ZhciBkPWNbMV07aWYoYi5zdWJzdHIocixkLmxlbmd0aCkudG9Mb3dlckNhc2UoKT09ZC50b0xvd2VyQ2FzZSgpKXtmPWNbMF0scis9ZC5sZW5ndGg7cmV0dXJuITF9fSk7aWYoZiE9LTEpcmV0dXJuIGYrMTt0aHJvdyJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gIityfSxxPWZ1bmN0aW9uKCl7aWYoYi5jaGFyQXQocikhPWEuY2hhckF0KHMpKXRocm93IlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAiK3I7cisrfSxyPTA7Zm9yKHZhciBzPTA7czxhLmxlbmd0aDtzKyspaWYobSlhLmNoYXJBdChzKT09IiciJiYhbigiJyIpP209ITE6cSgpO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KHMpKXtjYXNlImQiOms9bygiZCIpO2JyZWFrO2Nhc2UiRCI6cCgiRCIsZSxmKTticmVhaztjYXNlIm8iOmw9bygibyIpO2JyZWFrO2Nhc2UibSI6aj1vKCJtIik7YnJlYWs7Y2FzZSJNIjpqPXAoIk0iLGcsaCk7YnJlYWs7Y2FzZSJ5IjppPW8oInkiKTticmVhaztjYXNlIkAiOnZhciB0PW5ldyBEYXRlKG8oIkAiKSk7aT10LmdldEZ1bGxZZWFyKCksaj10LmdldE1vbnRoKCkrMSxrPXQuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiISI6dmFyIHQ9bmV3IERhdGUoKG8oIiEiKS10aGlzLl90aWNrc1RvMTk3MCkvMWU0KTtpPXQuZ2V0RnVsbFllYXIoKSxqPXQuZ2V0TW9udGgoKSsxLGs9dC5nZXREYXRlKCk7YnJlYWs7Y2FzZSInIjpuKCInIik/cSgpOm09ITA7YnJlYWs7ZGVmYXVsdDpxKCl9aWYocjxiLmxlbmd0aCl0aHJvdyJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6ICIrYi5zdWJzdHJpbmcocik7aT09LTE/aT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCk6aTwxMDAmJihpKz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCktKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCsoaTw9ZD8wOi0xMDApKTtpZihsPi0xKXtqPTEsaz1sO2Zvcig7Oyl7dmFyIHU9dGhpcy5fZ2V0RGF5c0luTW9udGgoaSxqLTEpO2lmKGs8PXUpYnJlYWs7aisrLGstPXV9fXZhciB0PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGksai0xLGspKTtpZih0LmdldEZ1bGxZZWFyKCkhPWl8fHQuZ2V0TW9udGgoKSsxIT1qfHx0LmdldERhdGUoKSE9ayl0aHJvdyJJbnZhbGlkIGRhdGUiO3JldHVybiB0fSxBVE9NOiJ5eS1tbS1kZCIsQ09PS0lFOiJELCBkZCBNIHl5IixJU09fODYwMToieXktbW0tZGQiLFJGQ184MjI6IkQsIGQgTSB5IixSRkNfODUwOiJERCwgZGQtTS15IixSRkNfMTAzNjoiRCwgZCBNIHkiLFJGQ18xMTIzOiJELCBkIE0geXkiLFJGQ18yODIyOiJELCBkIE0geXkiLFJTUzoiRCwgZCBNIHkiLFRJQ0tTOiIhIixUSU1FU1RBTVA6IkAiLFczQzoieXktbW0tZGQiLF90aWNrc1RvMTk3MDooNzE4Njg1K01hdGguZmxvb3IoNDkyLjUpLU1hdGguZmxvb3IoMTkuNykrTWF0aC5mbG9vcig0LjkyNSkpKjI0KjYwKjYwKjFlNyxmb3JtYXREYXRlOmZ1bmN0aW9uKGEsYixjKXtpZighYilyZXR1cm4iIjt2YXIgZD0oYz9jLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQsZT0oYz9jLmRheU5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcyxmPShjP2MubW9udGhOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQsZz0oYz9jLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXMsaD1mdW5jdGlvbihiKXt2YXIgYz1tKzE8YS5sZW5ndGgmJmEuY2hhckF0KG0rMSk9PWI7YyYmbSsrO3JldHVybiBjfSxpPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iIitiO2lmKGgoYSkpd2hpbGUoZC5sZW5ndGg8YylkPSIwIitkO3JldHVybiBkfSxqPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBoKGEpP2RbYl06Y1tiXX0saz0iIixsPSExO2lmKGIpZm9yKHZhciBtPTA7bTxhLmxlbmd0aDttKyspaWYobClhLmNoYXJBdChtKT09IiciJiYhaCgiJyIpP2w9ITE6ays9YS5jaGFyQXQobSk7ZWxzZSBzd2l0Y2goYS5jaGFyQXQobSkpe2Nhc2UiZCI6ays9aSgiZCIsYi5nZXREYXRlKCksMik7YnJlYWs7Y2FzZSJEIjprKz1qKCJEIixiLmdldERheSgpLGQsZSk7YnJlYWs7Y2FzZSJvIjprKz1pKCJvIixNYXRoLnJvdW5kKCgobmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLGIuZ2V0TW9udGgoKSxiLmdldERhdGUoKSkpLmdldFRpbWUoKS0obmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLDAsMCkpLmdldFRpbWUoKSkvODY0ZTUpLDMpO2JyZWFrO2Nhc2UibSI6ays9aSgibSIsYi5nZXRNb250aCgpKzEsMik7YnJlYWs7Y2FzZSJNIjprKz1qKCJNIixiLmdldE1vbnRoKCksZixnKTticmVhaztjYXNlInkiOmsrPWgoInkiKT9iLmdldEZ1bGxZZWFyKCk6KGIuZ2V0WWVhcigpJTEwMDwxMD8iMCI6IiIpK2IuZ2V0WWVhcigpJTEwMDticmVhaztjYXNlIkAiOmsrPWIuZ2V0VGltZSgpO2JyZWFrO2Nhc2UiISI6ays9Yi5nZXRUaW1lKCkqMWU0K3RoaXMuX3RpY2tzVG8xOTcwO2JyZWFrO2Nhc2UiJyI6aCgiJyIpP2srPSInIjpsPSEwO2JyZWFrO2RlZmF1bHQ6ays9YS5jaGFyQXQobSl9cmV0dXJuIGt9LF9wb3NzaWJsZUNoYXJzOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9ITEsZD1mdW5jdGlvbihiKXt2YXIgYz1lKzE8YS5sZW5ndGgmJmEuY2hhckF0KGUrMSk9PWI7YyYmZSsrO3JldHVybiBjfTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylpZihjKWEuY2hhckF0KGUpPT0iJyImJiFkKCInIik/Yz0hMTpiKz1hLmNoYXJBdChlKTtlbHNlIHN3aXRjaChhLmNoYXJBdChlKSl7Y2FzZSJkIjpjYXNlIm0iOmNhc2UieSI6Y2FzZSJAIjpiKz0iMDEyMzQ1Njc4OSI7YnJlYWs7Y2FzZSJEIjpjYXNlIk0iOnJldHVybiBudWxsO2Nhc2UiJyI6ZCgiJyIpP2IrPSInIjpjPSEwO2JyZWFrO2RlZmF1bHQ6Yis9YS5jaGFyQXQoZSl9cmV0dXJuIGJ9LF9nZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zZXR0aW5nc1tiXSE9PXVuZGVmaW5lZD9hLnNldHRpbmdzW2JdOnRoaXMuX2RlZmF1bHRzW2JdfSxfc2V0RGF0ZUZyb21GaWVsZDpmdW5jdGlvbihhLGIpe2lmKGEuaW5wdXQudmFsKCkhPWEubGFzdFZhbCl7dmFyIGM9dGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKSxkPWEubGFzdFZhbD1hLmlucHV0P2EuaW5wdXQudmFsKCk6bnVsbCxlLGY7ZT1mPXRoaXMuX2dldERlZmF1bHREYXRlKGEpO3ZhciBnPXRoaXMuX2dldEZvcm1hdENvbmZpZyhhKTt0cnl7ZT10aGlzLnBhcnNlRGF0ZShjLGQsZyl8fGZ9Y2F0Y2goaCl7dGhpcy5sb2coaCksZD1iPyIiOmR9YS5zZWxlY3RlZERheT1lLmdldERhdGUoKSxhLmRyYXdNb250aD1hLnNlbGVjdGVkTW9udGg9ZS5nZXRNb250aCgpLGEuZHJhd1llYXI9YS5zZWxlY3RlZFllYXI9ZS5nZXRGdWxsWWVhcigpLGEuY3VycmVudERheT1kP2UuZ2V0RGF0ZSgpOjAsYS5jdXJyZW50TW9udGg9ZD9lLmdldE1vbnRoKCk6MCxhLmN1cnJlbnRZZWFyPWQ/ZS5nZXRGdWxsWWVhcigpOjAsdGhpcy5fYWRqdXN0SW5zdERhdGUoYSl9fSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGEsdGhpcy5fZGV0ZXJtaW5lRGF0ZShhLHRoaXMuX2dldChhLCJkZWZhdWx0RGF0ZSIpLG5ldyBEYXRlKSl9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZTtiLnNldERhdGUoYi5nZXREYXRlKCkrYSk7cmV0dXJuIGJ9LGU9ZnVuY3Rpb24oYil7dHJ5e3JldHVybiAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGEsImRhdGVGb3JtYXQiKSxiLCQuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKGEpKX1jYXRjaChjKXt9dmFyIGQ9KGIudG9Mb3dlckNhc2UoKS5tYXRjaCgvXmMvKT8kLmRhdGVwaWNrZXIuX2dldERhdGUoYSk6bnVsbCl8fG5ldyBEYXRlLGU9ZC5nZXRGdWxsWWVhcigpLGY9ZC5nZXRNb250aCgpLGc9ZC5nZXREYXRlKCksaD0vKFsrLV0/WzAtOV0rKVxzKihkfER8d3xXfG18TXx5fFkpPy9nLGk9aC5leGVjKGIpO3doaWxlKGkpe3N3aXRjaChpWzJdfHwiZCIpe2Nhc2UiZCI6Y2FzZSJEIjpnKz1wYXJzZUludChpWzFdLDEwKTticmVhaztjYXNlInciOmNhc2UiVyI6Zys9cGFyc2VJbnQoaVsxXSwxMCkqNzticmVhaztjYXNlIm0iOmNhc2UiTSI6Zis9cGFyc2VJbnQoaVsxXSwxMCksZz1NYXRoLm1pbihnLCQuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoZSxmKSk7YnJlYWs7Y2FzZSJ5IjpjYXNlIlkiOmUrPXBhcnNlSW50KGlbMV0sMTApLGc9TWF0aC5taW4oZywkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGUsZikpfWk9aC5leGVjKGIpfXJldHVybiBuZXcgRGF0ZShlLGYsZyl9LGY9Yj09bnVsbHx8Yj09PSIiP2M6dHlwZW9mIGI9PSJzdHJpbmciP2UoYik6dHlwZW9mIGI9PSJudW1iZXIiP2lzTmFOKGIpP2M6ZChiKTpuZXcgRGF0ZShiLmdldFRpbWUoKSk7Zj1mJiZmLnRvU3RyaW5nKCk9PSJJbnZhbGlkIERhdGUiP2M6ZixmJiYoZi5zZXRIb3VycygwKSxmLnNldE1pbnV0ZXMoMCksZi5zZXRTZWNvbmRzKDApLGYuc2V0TWlsbGlzZWNvbmRzKDApKTtyZXR1cm4gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoZil9LF9kYXlsaWdodFNhdmluZ0FkanVzdDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gbnVsbDthLnNldEhvdXJzKGEuZ2V0SG91cnMoKT4xMj9hLmdldEhvdXJzKCkrMjowKTtyZXR1cm4gYX0sX3NldERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSFiLGU9YS5zZWxlY3RlZE1vbnRoLGY9YS5zZWxlY3RlZFllYXIsZz10aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RldGVybWluZURhdGUoYSxiLG5ldyBEYXRlKSk7YS5zZWxlY3RlZERheT1hLmN1cnJlbnREYXk9Zy5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWEuY3VycmVudE1vbnRoPWcuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWEuY3VycmVudFllYXI9Zy5nZXRGdWxsWWVhcigpLChlIT1hLnNlbGVjdGVkTW9udGh8fGYhPWEuc2VsZWN0ZWRZZWFyKSYmIWMmJnRoaXMuX25vdGlmeUNoYW5nZShhKSx0aGlzLl9hZGp1c3RJbnN0RGF0ZShhKSxhLmlucHV0JiZhLmlucHV0LnZhbChkPyIiOnRoaXMuX2Zvcm1hdERhdGUoYSkpfSxfZ2V0RGF0ZTpmdW5jdGlvbihhKXt2YXIgYj0hYS5jdXJyZW50WWVhcnx8YS5pbnB1dCYmYS5pbnB1dC52YWwoKT09IiI/bnVsbDp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLmN1cnJlbnRZZWFyLGEuY3VycmVudE1vbnRoLGEuY3VycmVudERheSkpO3JldHVybiBifSxfZ2VuZXJhdGVIVE1MOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBEYXRlO2I9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLGIuZ2V0TW9udGgoKSxiLmdldERhdGUoKSkpO3ZhciBjPXRoaXMuX2dldChhLCJpc1JUTCIpLGQ9dGhpcy5fZ2V0KGEsInNob3dCdXR0b25QYW5lbCIpLGU9dGhpcy5fZ2V0KGEsImhpZGVJZk5vUHJldk5leHQiKSxmPXRoaXMuX2dldChhLCJuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0IiksZz10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhhKSxoPXRoaXMuX2dldChhLCJzaG93Q3VycmVudEF0UG9zIiksaT10aGlzLl9nZXQoYSwic3RlcE1vbnRocyIpLGo9Z1swXSE9MXx8Z1sxXSE9MSxrPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KGEuY3VycmVudERheT9uZXcgRGF0ZShhLmN1cnJlbnRZZWFyLGEuY3VycmVudE1vbnRoLGEuY3VycmVudERheSk6bmV3IERhdGUoOTk5OSw5LDkpKSxsPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWluIiksbT10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1heCIpLG49YS5kcmF3TW9udGgtaCxvPWEuZHJhd1llYXI7bjwwJiYobis9MTIsby0tKTtpZihtKXt2YXIgcD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShtLmdldEZ1bGxZZWFyKCksbS5nZXRNb250aCgpLWdbMF0qZ1sxXSsxLG0uZ2V0RGF0ZSgpKSk7cD1sJiZwPGw/bDpwO3doaWxlKHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbiwxKSk+cCluLS0sbjwwJiYobj0xMSxvLS0pfWEuZHJhd01vbnRoPW4sYS5kcmF3WWVhcj1vO3ZhciBxPXRoaXMuX2dldChhLCJwcmV2VGV4dCIpO3E9Zj90aGlzLmZvcm1hdERhdGUocSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4taSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTpxO3ZhciByPXRoaXMuX2NhbkFkanVzdE1vbnRoKGEsLTEsbyxuKT8nPGEgY2xhc3M9InVpLWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXItYWxsIiBvbmNsaWNrPSJEUF9qUXVlcnlfJytkcHV1aWQrIi5kYXRlcGlja2VyLl9hZGp1c3REYXRlKCcjIithLmlkKyInLCAtIitpKyIsICdNJyk7XCIiKycgdGl0bGU9IicrcSsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJlIjoidyIpKyciPicrcSsiPC9zcGFuPjwvYT4iOmU/IiI6JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrcSsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJlIjoidyIpKyciPicrcSsiPC9zcGFuPjwvYT4iLHM9dGhpcy5fZ2V0KGEsIm5leHRUZXh0Iik7cz1mP3RoaXMuZm9ybWF0RGF0ZShzLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbitpLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnM7dmFyIHQ9dGhpcy5fY2FuQWRqdXN0TW9udGgoYSwxLG8sbik/JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCIgb25jbGljaz0iRFBfalF1ZXJ5XycrZHB1dWlkKyIuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSgnIyIrYS5pZCsiJywgKyIraSsiLCAnTScpO1wiIisnIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+IjplPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+Iix1PXRoaXMuX2dldChhLCJjdXJyZW50VGV4dCIpLHY9dGhpcy5fZ2V0KGEsImdvdG9DdXJyZW50IikmJmEuY3VycmVudERheT9rOmI7dT1mP3RoaXMuZm9ybWF0RGF0ZSh1LHYsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTp1O3ZhciB3PWEuaW5saW5lPyIiOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwiIG9uY2xpY2s9IkRQX2pRdWVyeV8nK2RwdXVpZCsnLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7Ij4nK3RoaXMuX2dldChhLCJjbG9zZVRleHQiKSsiPC9idXR0b24+Iix4PWQ/JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCI+JysoYz93OiIiKSsodGhpcy5faXNJblJhbmdlKGEsdik/JzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50IHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktc2Vjb25kYXJ5IHVpLWNvcm5lci1hbGwiIG9uY2xpY2s9IkRQX2pRdWVyeV8nK2RwdXVpZCsiLmRhdGVwaWNrZXIuX2dvdG9Ub2RheSgnIyIrYS5pZCsiJyk7XCIiKyI+Iit1KyI8L2J1dHRvbj4iOiIiKSsoYz8iIjp3KSsiPC9kaXY+IjoiIix5PXBhcnNlSW50KHRoaXMuX2dldChhLCJmaXJzdERheSIpLDEwKTt5PWlzTmFOKHkpPzA6eTt2YXIgej10aGlzLl9nZXQoYSwic2hvd1dlZWsiKSxBPXRoaXMuX2dldChhLCJkYXlOYW1lcyIpLEI9dGhpcy5fZ2V0KGEsImRheU5hbWVzU2hvcnQiKSxDPXRoaXMuX2dldChhLCJkYXlOYW1lc01pbiIpLEQ9dGhpcy5fZ2V0KGEsIm1vbnRoTmFtZXMiKSxFPXRoaXMuX2dldChhLCJtb250aE5hbWVzU2hvcnQiKSxGPXRoaXMuX2dldChhLCJiZWZvcmVTaG93RGF5IiksRz10aGlzLl9nZXQoYSwic2hvd090aGVyTW9udGhzIiksSD10aGlzLl9nZXQoYSwic2VsZWN0T3RoZXJNb250aHMiKSxJPXRoaXMuX2dldChhLCJjYWxjdWxhdGVXZWVrIil8fHRoaXMuaXNvODYwMVdlZWssSj10aGlzLl9nZXREZWZhdWx0RGF0ZShhKSxLPSIiO2Zvcih2YXIgTD0wO0w8Z1swXTtMKyspe3ZhciBNPSIiO3RoaXMubWF4Um93cz00O2Zvcih2YXIgTj0wO048Z1sxXTtOKyspe3ZhciBPPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbixhLnNlbGVjdGVkRGF5KSksUD0iIHVpLWNvcm5lci1hbGwiLFE9IiI7aWYoail7USs9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItZ3JvdXAnO2lmKGdbMV0+MSlzd2l0Y2goTil7Y2FzZSAwOlErPSIgdWktZGF0ZXBpY2tlci1ncm91cC1maXJzdCIsUD0iIHVpLWNvcm5lci0iKyhjPyJyaWdodCI6ImxlZnQiKTticmVhaztjYXNlIGdbMV0tMTpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCIsUD0iIHVpLWNvcm5lci0iKyhjPyJsZWZ0IjoicmlnaHQiKTticmVhaztkZWZhdWx0OlErPSIgdWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUiLFA9IiJ9USs9JyI+J31RKz0nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgnK1ArJyI+JysoL2FsbHxsZWZ0Ly50ZXN0KFApJiZMPT0wP2M/dDpyOiIiKSsoL2FsbHxyaWdodC8udGVzdChQKSYmTD09MD9jP3I6dDoiIikrdGhpcy5fZ2VuZXJhdGVNb250aFllYXJIZWFkZXIoYSxuLG8sbCxtLEw+MHx8Tj4wLEQsRSkrJzwvZGl2Pjx0YWJsZSBjbGFzcz0idWktZGF0ZXBpY2tlci1jYWxlbmRhciI+PHRoZWFkPicrIjx0cj4iO3ZhciBSPXo/Jzx0aCBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWNvbCI+Jyt0aGlzLl9nZXQoYSwid2Vla0hlYWRlciIpKyI8L3RoPiI6IiI7Zm9yKHZhciBTPTA7Uzw3O1MrKyl7dmFyIFQ9KFMreSklNztSKz0iPHRoIisoKFMreSs2KSU3Pj01PycgY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1lbmQiJzoiIikrIj4iKyc8c3BhbiB0aXRsZT0iJytBW1RdKyciPicrQ1tUXSsiPC9zcGFuPjwvdGg+In1RKz1SKyI8L3RyPjwvdGhlYWQ+PHRib2R5PiI7dmFyIFU9dGhpcy5fZ2V0RGF5c0luTW9udGgobyxuKTtvPT1hLnNlbGVjdGVkWWVhciYmbj09YS5zZWxlY3RlZE1vbnRoJiYoYS5zZWxlY3RlZERheT1NYXRoLm1pbihhLnNlbGVjdGVkRGF5LFUpKTt2YXIgVj0odGhpcy5fZ2V0Rmlyc3REYXlPZk1vbnRoKG8sbikteSs3KSU3LFc9TWF0aC5jZWlsKChWK1UpLzcpLFg9aj90aGlzLm1heFJvd3M+Vz90aGlzLm1heFJvd3M6VzpXO3RoaXMubWF4Um93cz1YO3ZhciBZPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbiwxLVYpKTtmb3IodmFyIFo9MDtaPFg7WisrKXtRKz0iPHRyPiI7dmFyIF89ej8nPHRkIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstY29sIj4nK3RoaXMuX2dldChhLCJjYWxjdWxhdGVXZWVrIikoWSkrIjwvdGQ+IjoiIjtmb3IodmFyIFM9MDtTPDc7UysrKXt2YXIgYmE9Rj9GLmFwcGx5KGEuaW5wdXQ/YS5pbnB1dFswXTpudWxsLFtZXSk6WyEwLCIiXSxiYj1ZLmdldE1vbnRoKCkhPW4sYmM9YmImJiFIfHwhYmFbMF18fGwmJlk8bHx8bSYmWT5tO18rPSc8dGQgY2xhc3M9IicrKChTK3krNiklNz49NT8iIHVpLWRhdGVwaWNrZXItd2Vlay1lbmQiOiIiKSsoYmI/IiB1aS1kYXRlcGlja2VyLW90aGVyLW1vbnRoIjoiIikrKFkuZ2V0VGltZSgpPT1PLmdldFRpbWUoKSYmbj09YS5zZWxlY3RlZE1vbnRoJiZhLl9rZXlFdmVudHx8Si5nZXRUaW1lKCk9PVkuZ2V0VGltZSgpJiZKLmdldFRpbWUoKT09Ty5nZXRUaW1lKCk/IiAiK3RoaXMuX2RheU92ZXJDbGFzczoiIikrKGJjPyIgIit0aGlzLl91bnNlbGVjdGFibGVDbGFzcysiIHVpLXN0YXRlLWRpc2FibGVkIjoiIikrKGJiJiYhRz8iIjoiICIrYmFbMV0rKFkuZ2V0VGltZSgpPT1rLmdldFRpbWUoKT8iICIrdGhpcy5fY3VycmVudENsYXNzOiIiKSsoWS5nZXRUaW1lKCk9PWIuZ2V0VGltZSgpPyIgdWktZGF0ZXBpY2tlci10b2RheSI6IiIpKSsnIicrKCghYmJ8fEcpJiZiYVsyXT8nIHRpdGxlPSInK2JhWzJdKyciJzoiIikrKGJjPyIiOicgb25jbGljaz0iRFBfalF1ZXJ5XycrZHB1dWlkKyIuZGF0ZXBpY2tlci5fc2VsZWN0RGF5KCcjIithLmlkKyInLCIrWS5nZXRNb250aCgpKyIsIitZLmdldEZ1bGxZZWFyKCkrJywgdGhpcyk7cmV0dXJuIGZhbHNlOyInKSsiPiIrKGJiJiYhRz8iJiN4YTA7IjpiYz8nPHNwYW4gY2xhc3M9InVpLXN0YXRlLWRlZmF1bHQiPicrWS5nZXREYXRlKCkrIjwvc3Bhbj4iOic8YSBjbGFzcz0idWktc3RhdGUtZGVmYXVsdCcrKFkuZ2V0VGltZSgpPT1iLmdldFRpbWUoKT8iIHVpLXN0YXRlLWhpZ2hsaWdodCI6IiIpKyhZLmdldFRpbWUoKT09ay5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1hY3RpdmUiOiIiKSsoYmI/IiB1aS1wcmlvcml0eS1zZWNvbmRhcnkiOiIiKSsnIiBocmVmPSIjIj4nK1kuZ2V0RGF0ZSgpKyI8L2E+IikrIjwvdGQ+IixZLnNldERhdGUoWS5nZXREYXRlKCkrMSksWT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChZKX1RKz1fKyI8L3RyPiJ9bisrLG4+MTEmJihuPTAsbysrKSxRKz0iPC90Ym9keT48L3RhYmxlPiIrKGo/IjwvZGl2PiIrKGdbMF0+MCYmTj09Z1sxXS0xPyc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXJvdy1icmVhayI+PC9kaXY+JzoiIik6IiIpLE0rPVF9Sys9TX1LKz14KygkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24sMTApPDcmJiFhLmlubGluZT8nPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBjbGFzcz0idWktZGF0ZXBpY2tlci1jb3ZlciIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPic6IiIpLGEuX2tleUV2ZW50PSExO3JldHVybiBLfSxfZ2VuZXJhdGVNb250aFllYXJIZWFkZXI6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2YXIgaT10aGlzLl9nZXQoYSwiY2hhbmdlTW9udGgiKSxqPXRoaXMuX2dldChhLCJjaGFuZ2VZZWFyIiksaz10aGlzCi5fZ2V0KGEsInNob3dNb250aEFmdGVyWWVhciIpLGw9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItdGl0bGUiPicsbT0iIjtpZihmfHwhaSltKz0nPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiPicrZ1tiXSsiPC9zcGFuPiI7ZWxzZXt2YXIgbj1kJiZkLmdldEZ1bGxZZWFyKCk9PWMsbz1lJiZlLmdldEZ1bGxZZWFyKCk9PWM7bSs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiIG9uY2hhbmdlPSJEUF9qUXVlcnlfJytkcHV1aWQrIi5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoJyMiK2EuaWQrIicsIHRoaXMsICdNJyk7XCIgIisiPiI7Zm9yKHZhciBwPTA7cDwxMjtwKyspKCFufHxwPj1kLmdldE1vbnRoKCkpJiYoIW98fHA8PWUuZ2V0TW9udGgoKSkmJihtKz0nPG9wdGlvbiB2YWx1ZT0iJytwKyciJysocD09Yj8nIHNlbGVjdGVkPSJzZWxlY3RlZCInOiIiKSsiPiIraFtwXSsiPC9vcHRpb24+Iik7bSs9Ijwvc2VsZWN0PiJ9a3x8KGwrPW0rKGZ8fCFpfHwhaj8iJiN4YTA7IjoiIikpO2lmKCFhLnllYXJzaHRtbCl7YS55ZWFyc2h0bWw9IiI7aWYoZnx8IWopbCs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicrYysiPC9zcGFuPiI7ZWxzZXt2YXIgcT10aGlzLl9nZXQoYSwieWVhclJhbmdlIikuc3BsaXQoIjoiKSxyPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxzPWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL2NbKy1dLiovKT9jK3BhcnNlSW50KGEuc3Vic3RyaW5nKDEpLDEwKTphLm1hdGNoKC9bKy1dLiovKT9yK3BhcnNlSW50KGEsMTApOnBhcnNlSW50KGEsMTApO3JldHVybiBpc05hTihiKT9yOmJ9LHQ9cyhxWzBdKSx1PU1hdGgubWF4KHQscyhxWzFdfHwiIikpO3Q9ZD9NYXRoLm1heCh0LGQuZ2V0RnVsbFllYXIoKSk6dCx1PWU/TWF0aC5taW4odSxlLmdldEZ1bGxZZWFyKCkpOnUsYS55ZWFyc2h0bWwrPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiIG9uY2hhbmdlPSJEUF9qUXVlcnlfJytkcHV1aWQrIi5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoJyMiK2EuaWQrIicsIHRoaXMsICdZJyk7XCIgIisiPiI7Zm9yKDt0PD11O3QrKylhLnllYXJzaHRtbCs9JzxvcHRpb24gdmFsdWU9IicrdCsnIicrKHQ9PWM/JyBzZWxlY3RlZD0ic2VsZWN0ZWQiJzoiIikrIj4iK3QrIjwvb3B0aW9uPiI7YS55ZWFyc2h0bWwrPSI8L3NlbGVjdD4iLGwrPWEueWVhcnNodG1sLGEueWVhcnNodG1sPW51bGx9fWwrPXRoaXMuX2dldChhLCJ5ZWFyU3VmZml4IiksayYmKGwrPShmfHwhaXx8IWo/IiYjeGEwOyI6IiIpK20pLGwrPSI8L2Rpdj4iO3JldHVybiBsfSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZHJhd1llYXIrKGM9PSJZIj9iOjApLGU9YS5kcmF3TW9udGgrKGM9PSJNIj9iOjApLGY9TWF0aC5taW4oYS5zZWxlY3RlZERheSx0aGlzLl9nZXREYXlzSW5Nb250aChkLGUpKSsoYz09IkQiP2I6MCksZz10aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGQsZSxmKSkpO2Euc2VsZWN0ZWREYXk9Zy5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWcuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWcuZ2V0RnVsbFllYXIoKSwoYz09Ik0ifHxjPT0iWSIpJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoYSl9LF9yZXN0cmljdE1pbk1heDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWluIiksZD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1heCIpLGU9YyYmYjxjP2M6YjtlPWQmJmU+ZD9kOmU7cmV0dXJuIGV9LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsIm9uQ2hhbmdlTW9udGhZZWFyIik7YiYmYi5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbYS5zZWxlY3RlZFllYXIsYS5zZWxlY3RlZE1vbnRoKzEsYV0pfSxfZ2V0TnVtYmVyT2ZNb250aHM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsIm51bWJlck9mTW9udGhzIik7cmV0dXJuIGI9PW51bGw/WzEsMV06dHlwZW9mIGI9PSJudW1iZXIiP1sxLGJdOmJ9LF9nZXRNaW5NYXhEYXRlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoYSx0aGlzLl9nZXQoYSxiKyJEYXRlIiksbnVsbCl9LF9nZXREYXlzSW5Nb250aDpmdW5jdGlvbihhLGIpe3JldHVybiAzMi10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLGIsMzIpKS5nZXREYXRlKCl9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4obmV3IERhdGUoYSxiLDEpKS5nZXREYXkoKX0sX2NhbkFkanVzdE1vbnRoOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGY9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYyxkKyhiPDA/YjplWzBdKmVbMV0pLDEpKTtiPDAmJmYuc2V0RGF0ZSh0aGlzLl9nZXREYXlzSW5Nb250aChmLmdldEZ1bGxZZWFyKCksZi5nZXRNb250aCgpKSk7cmV0dXJuIHRoaXMuX2lzSW5SYW5nZShhLGYpfSxfaXNJblJhbmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtaW4iKSxkPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWF4Iik7cmV0dXJuKCFjfHxiLmdldFRpbWUoKT49Yy5nZXRUaW1lKCkpJiYoIWR8fGIuZ2V0VGltZSgpPD1kLmdldFRpbWUoKSl9LF9nZXRGb3JtYXRDb25maWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsInNob3J0WWVhckN1dG9mZiIpO2I9dHlwZW9mIGIhPSJzdHJpbmciP2I6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludChiLDEwKTtyZXR1cm57c2hvcnRZZWFyQ3V0b2ZmOmIsZGF5TmFtZXNTaG9ydDp0aGlzLl9nZXQoYSwiZGF5TmFtZXNTaG9ydCIpLGRheU5hbWVzOnRoaXMuX2dldChhLCJkYXlOYW1lcyIpLG1vbnRoTmFtZXNTaG9ydDp0aGlzLl9nZXQoYSwibW9udGhOYW1lc1Nob3J0IiksbW9udGhOYW1lczp0aGlzLl9nZXQoYSwibW9udGhOYW1lcyIpfX0sX2Zvcm1hdERhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7Ynx8KGEuY3VycmVudERheT1hLnNlbGVjdGVkRGF5LGEuY3VycmVudE1vbnRoPWEuc2VsZWN0ZWRNb250aCxhLmN1cnJlbnRZZWFyPWEuc2VsZWN0ZWRZZWFyKTt2YXIgZT1iP3R5cGVvZiBiPT0ib2JqZWN0Ij9iOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGQsYyxiKSk6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYS5jdXJyZW50WWVhcixhLmN1cnJlbnRNb250aCxhLmN1cnJlbnREYXkpKTtyZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuX2dldChhLCJkYXRlRm9ybWF0IiksZSx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpfX0pLCQuZm4uZGF0ZXBpY2tlcj1mdW5jdGlvbihhKXtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7JC5kYXRlcGlja2VyLmluaXRpYWxpemVkfHwoJChkb2N1bWVudCkubW91c2Vkb3duKCQuZGF0ZXBpY2tlci5fY2hlY2tFeHRlcm5hbENsaWNrKS5maW5kKCJib2R5IikuYXBwZW5kKCQuZGF0ZXBpY2tlci5kcERpdiksJC5kYXRlcGlja2VyLmluaXRpYWxpemVkPSEwKTt2YXIgYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYoYT09ImlzRGlzYWJsZWQifHxhPT0iZ2V0RGF0ZSJ8fGE9PSJ3aWRnZXQiKSlyZXR1cm4gJC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoYikpO2lmKGE9PSJvcHRpb24iJiZhcmd1bWVudHMubGVuZ3RoPT0yJiZ0eXBlb2YgYXJndW1lbnRzWzFdPT0ic3RyaW5nIilyZXR1cm4gJC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoYikpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0eXBlb2YgYT09InN0cmluZyI/JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzXS5jb25jYXQoYikpOiQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLGEpfSl9LCQuZGF0ZXBpY2tlcj1uZXcgRGF0ZXBpY2tlciwkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITEsJC5kYXRlcGlja2VyLnV1aWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksJC5kYXRlcGlja2VyLnZlcnNpb249IjEuOC4xNyIsd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdPSR9KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBQcm9ncmVzc2JhciAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL1Byb2dyZXNzYmFyCiAqCiAqIERlcGVuZHM6CiAqICAganF1ZXJ5LnVpLmNvcmUuanMKICogICBqcXVlcnkudWkud2lkZ2V0LmpzCiAqLyhmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5wcm9ncmVzc2JhciIse29wdGlvbnM6e3ZhbHVlOjAsbWF4OjEwMH0sbWluOjAsX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJwcm9ncmVzc2JhciIsImFyaWEtdmFsdWVtaW4iOnRoaXMubWluLCJhcmlhLXZhbHVlbWF4Ijp0aGlzLm9wdGlvbnMubWF4LCJhcmlhLXZhbHVlbm93Ijp0aGlzLl92YWx1ZSgpfSksdGhpcy52YWx1ZURpdj1hKCI8ZGl2IGNsYXNzPSd1aS1wcm9ncmVzc2Jhci12YWx1ZSB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1sZWZ0Jz48L2Rpdj4iKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpLHRoaXMub2xkVmFsdWU9dGhpcy5fdmFsdWUoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy52YWx1ZURpdi5yZW1vdmUoKSxhLldpZGdldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHZhbHVlOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzLl92YWx1ZSgpO3RoaXMuX3NldE9wdGlvbigidmFsdWUiLGEpO3JldHVybiB0aGlzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsYyl7Yj09PSJ2YWx1ZSImJih0aGlzLm9wdGlvbnMudmFsdWU9Yyx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl92YWx1ZSgpPT09dGhpcy5vcHRpb25zLm1heCYmdGhpcy5fdHJpZ2dlcigiY29tcGxldGUiKSksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMudmFsdWU7dHlwZW9mIGEhPSJudW1iZXIiJiYoYT0wKTtyZXR1cm4gTWF0aC5taW4odGhpcy5vcHRpb25zLm1heCxNYXRoLm1heCh0aGlzLm1pbixhKSl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLl92YWx1ZSgpL3RoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZhbHVlKCksYj10aGlzLl9wZXJjZW50YWdlKCk7dGhpcy5vbGRWYWx1ZSE9PWEmJih0aGlzLm9sZFZhbHVlPWEsdGhpcy5fdHJpZ2dlcigiY2hhbmdlIikpLHRoaXMudmFsdWVEaXYudG9nZ2xlKGE+dGhpcy5taW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItcmlnaHQiLGE9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aChiLnRvRml4ZWQoMCkrIiUiKSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS12YWx1ZW5vdyIsYSl9fSksYS5leHRlbmQoYS51aS5wcm9ncmVzc2Jhcix7dmVyc2lvbjoiMS44LjE3In0pfSkoalF1ZXJ5KTsvKgogKiBqUXVlcnkgVUkgRWZmZWN0cyAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0VmZmVjdHMvCiAqL2pRdWVyeS5lZmZlY3RzfHxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGwoYil7aWYoIWJ8fHR5cGVvZiBiPT0ibnVtYmVyInx8YS5meC5zcGVlZHNbYl0pcmV0dXJuITA7aWYodHlwZW9mIGI9PSJzdHJpbmciJiYhYS5lZmZlY3RzW2JdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGsoYixjLGQsZSl7dHlwZW9mIGI9PSJvYmplY3QiJiYoZT1jLGQ9bnVsbCxjPWIsYj1jLmVmZmVjdCksYS5pc0Z1bmN0aW9uKGMpJiYoZT1jLGQ9bnVsbCxjPXt9KTtpZih0eXBlb2YgYz09Im51bWJlciJ8fGEuZnguc3BlZWRzW2NdKWU9ZCxkPWMsYz17fTthLmlzRnVuY3Rpb24oZCkmJihlPWQsZD1udWxsKSxjPWN8fHt9LGQ9ZHx8Yy5kdXJhdGlvbixkPWEuZngub2ZmPzA6dHlwZW9mIGQ9PSJudW1iZXIiP2Q6ZCBpbiBhLmZ4LnNwZWVkcz9hLmZ4LnNwZWVkc1tkXTphLmZ4LnNwZWVkcy5fZGVmYXVsdCxlPWV8fGMuY29tcGxldGU7cmV0dXJuW2IsYyxkLGVdfWZ1bmN0aW9uIGooYSxiKXt2YXIgYz17XzowfSxkO2ZvcihkIGluIGIpYVtkXSE9YltkXSYmKGNbZF09YltkXSk7cmV0dXJuIGN9ZnVuY3Rpb24gaShiKXt2YXIgYyxkO2ZvcihjIGluIGIpZD1iW2NdLChkPT1udWxsfHxhLmlzRnVuY3Rpb24oZCl8fGMgaW4gZ3x8L3Njcm9sbGJhci8udGVzdChjKXx8IS9jb2xvci9pLnRlc3QoYykmJmlzTmFOKHBhcnNlRmxvYXQoZCkpKSYmZGVsZXRlIGJbY107cmV0dXJuIGJ9ZnVuY3Rpb24gaCgpe3ZhciBhPWRvY3VtZW50LmRlZmF1bHRWaWV3P2RvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKTp0aGlzLmN1cnJlbnRTdHlsZSxiPXt9LGMsZDtpZihhJiZhLmxlbmd0aCYmYVswXSYmYVthWzBdXSl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWM9YVtlXSx0eXBlb2YgYVtjXT09InN0cmluZyImJihkPWMucmVwbGFjZSgvXC0oXHcpL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSksYltkXT1hW2NdKX1lbHNlIGZvcihjIGluIGEpdHlwZW9mIGFbY109PSJzdHJpbmciJiYoYltjXT1hW2NdKTtyZXR1cm4gYn1mdW5jdGlvbiBkKGIsZCl7dmFyIGU7ZG97ZT1hLmN1ckNTUyhiLGQpO2lmKGUhPSIiJiZlIT0idHJhbnNwYXJlbnQifHxhLm5vZGVOYW1lKGIsImJvZHkiKSlicmVhaztkPSJiYWNrZ3JvdW5kQ29sb3IifXdoaWxlKGI9Yi5wYXJlbnROb2RlKTtyZXR1cm4gYyhlKX1mdW5jdGlvbiBjKGIpe3ZhciBjO2lmKGImJmIuY29uc3RydWN0b3I9PUFycmF5JiZiLmxlbmd0aD09MylyZXR1cm4gYjtpZihjPS9yZ2JcKFxzKihbMC05XXsxLDN9KVxzKixccyooWzAtOV17MSwzfSlccyosXHMqKFswLTldezEsM30pXHMqXCkvLmV4ZWMoYikpcmV0dXJuW3BhcnNlSW50KGNbMV0sMTApLHBhcnNlSW50KGNbMl0sMTApLHBhcnNlSW50KGNbM10sMTApXTtpZihjPS9yZ2JcKFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqXCkvLmV4ZWMoYikpcmV0dXJuW3BhcnNlRmxvYXQoY1sxXSkqMi41NSxwYXJzZUZsb2F0KGNbMl0pKjIuNTUscGFyc2VGbG9hdChjWzNdKSoyLjU1XTtpZihjPS8jKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pLy5leGVjKGIpKXJldHVybltwYXJzZUludChjWzFdLDE2KSxwYXJzZUludChjWzJdLDE2KSxwYXJzZUludChjWzNdLDE2KV07aWYoYz0vIyhbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pKFthLWZBLUYwLTldKS8uZXhlYyhiKSlyZXR1cm5bcGFyc2VJbnQoY1sxXStjWzFdLDE2KSxwYXJzZUludChjWzJdK2NbMl0sMTYpLHBhcnNlSW50KGNbM10rY1szXSwxNildO2lmKGM9L3JnYmFcKDAsIDAsIDAsIDBcKS8uZXhlYyhiKSlyZXR1cm4gZS50cmFuc3BhcmVudDtyZXR1cm4gZVthLnRyaW0oYikudG9Mb3dlckNhc2UoKV19YS5lZmZlY3RzPXt9LGEuZWFjaChbImJhY2tncm91bmRDb2xvciIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyTGVmdENvbG9yIiwiYm9yZGVyUmlnaHRDb2xvciIsImJvcmRlclRvcENvbG9yIiwiYm9yZGVyQ29sb3IiLCJjb2xvciIsIm91dGxpbmVDb2xvciJdLGZ1bmN0aW9uKGIsZSl7YS5meC5zdGVwW2VdPWZ1bmN0aW9uKGEpe2EuY29sb3JJbml0fHwoYS5zdGFydD1kKGEuZWxlbSxlKSxhLmVuZD1jKGEuZW5kKSxhLmNvbG9ySW5pdD0hMCksYS5lbGVtLnN0eWxlW2VdPSJyZ2IoIitNYXRoLm1heChNYXRoLm1pbihwYXJzZUludChhLnBvcyooYS5lbmRbMF0tYS5zdGFydFswXSkrYS5zdGFydFswXSwxMCksMjU1KSwwKSsiLCIrTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoYS5wb3MqKGEuZW5kWzFdLWEuc3RhcnRbMV0pK2Euc3RhcnRbMV0sMTApLDI1NSksMCkrIiwiK01hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGEucG9zKihhLmVuZFsyXS1hLnN0YXJ0WzJdKSthLnN0YXJ0WzJdLDEwKSwyNTUpLDApKyIpIn19KTt2YXIgZT17YXF1YTpbMCwyNTUsMjU1XSxhenVyZTpbMjQwLDI1NSwyNTVdLGJlaWdlOlsyNDUsMjQ1LDIyMF0sYmxhY2s6WzAsMCwwXSxibHVlOlswLDAsMjU1XSxicm93bjpbMTY1LDQyLDQyXSxjeWFuOlswLDI1NSwyNTVdLGRhcmtibHVlOlswLDAsMTM5XSxkYXJrY3lhbjpbMCwxMzksMTM5XSxkYXJrZ3JleTpbMTY5LDE2OSwxNjldLGRhcmtncmVlbjpbMCwxMDAsMF0sZGFya2toYWtpOlsxODksMTgzLDEwN10sZGFya21hZ2VudGE6WzEzOSwwLDEzOV0sZGFya29saXZlZ3JlZW46Wzg1LDEwNyw0N10sZGFya29yYW5nZTpbMjU1LDE0MCwwXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0XSxkYXJrcmVkOlsxMzksMCwwXSxkYXJrc2FsbW9uOlsyMzMsMTUwLDEyMl0sZGFya3Zpb2xldDpbMTQ4LDAsMjExXSxmdWNoc2lhOlsyNTUsMCwyNTVdLGdvbGQ6WzI1NSwyMTUsMF0sZ3JlZW46WzAsMTI4LDBdLGluZGlnbzpbNzUsMCwxMzBdLGtoYWtpOlsyNDAsMjMwLDE0MF0sbGlnaHRibHVlOlsxNzMsMjE2LDIzMF0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NV0sbGlnaHRncmVlbjpbMTQ0LDIzOCwxNDRdLGxpZ2h0Z3JleTpbMjExLDIxMSwyMTFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTNdLGxpZ2h0eWVsbG93OlsyNTUsMjU1LDIyNF0sbGltZTpbMCwyNTUsMF0sbWFnZW50YTpbMjU1LDAsMjU1XSxtYXJvb246WzEyOCwwLDBdLG5hdnk6WzAsMCwxMjhdLG9saXZlOlsxMjgsMTI4LDBdLG9yYW5nZTpbMjU1LDE2NSwwXSxwaW5rOlsyNTUsMTkyLDIwM10scHVycGxlOlsxMjgsMCwxMjhdLHZpb2xldDpbMTI4LDAsMTI4XSxyZWQ6WzI1NSwwLDBdLHNpbHZlcjpbMTkyLDE5MiwxOTJdLHdoaXRlOlsyNTUsMjU1LDI1NV0seWVsbG93OlsyNTUsMjU1LDBdLHRyYW5zcGFyZW50OlsyNTUsMjU1LDI1NV19LGY9WyJhZGQiLCJyZW1vdmUiLCJ0b2dnbGUiXSxnPXtib3JkZXI6MSxib3JkZXJCb3R0b206MSxib3JkZXJDb2xvcjoxLGJvcmRlckxlZnQ6MSxib3JkZXJSaWdodDoxLGJvcmRlclRvcDoxLGJvcmRlcldpZHRoOjEsbWFyZ2luOjEscGFkZGluZzoxfTthLmVmZmVjdHMuYW5pbWF0ZUNsYXNzPWZ1bmN0aW9uKGIsYyxkLGUpe2EuaXNGdW5jdGlvbihkKSYmKGU9ZCxkPW51bGwpO3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGc9YSh0aGlzKSxrPWcuYXR0cigic3R5bGUiKXx8IiAiLGw9aShoLmNhbGwodGhpcykpLG0sbj1nLmF0dHIoImNsYXNzIik7YS5lYWNoKGYsZnVuY3Rpb24oYSxjKXtiW2NdJiZnW2MrIkNsYXNzIl0oYltjXSl9KSxtPWkoaC5jYWxsKHRoaXMpKSxnLmF0dHIoImNsYXNzIixuKSxnLmFuaW1hdGUoaihsLG0pLHtxdWV1ZTohMSxkdXJhdGlvbjpjLGVhc2luZzpkLGNvbXBsZXRlOmZ1bmN0aW9uKCl7YS5lYWNoKGYsZnVuY3Rpb24oYSxjKXtiW2NdJiZnW2MrIkNsYXNzIl0oYltjXSl9KSx0eXBlb2YgZy5hdHRyKCJzdHlsZSIpPT0ib2JqZWN0Ij8oZy5hdHRyKCJzdHlsZSIpLmNzc1RleHQ9IiIsZy5hdHRyKCJzdHlsZSIpLmNzc1RleHQ9ayk6Zy5hdHRyKCJzdHlsZSIsayksZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS5kZXF1ZXVlKHRoaXMpfX0pfSl9LGEuZm4uZXh0ZW5kKHtfYWRkQ2xhc3M6YS5mbi5hZGRDbGFzcyxhZGRDbGFzczpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYz9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3thZGQ6Yn0sYyxkLGVdKTp0aGlzLl9hZGRDbGFzcyhiKX0sX3JlbW92ZUNsYXNzOmEuZm4ucmVtb3ZlQ2xhc3MscmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYixjLGQsZSl7cmV0dXJuIGM/YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7cmVtb3ZlOmJ9LGMsZCxlXSk6dGhpcy5fcmVtb3ZlQ2xhc3MoYil9LF90b2dnbGVDbGFzczphLmZuLnRvZ2dsZUNsYXNzLHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGMsZCxlLGYsZyl7cmV0dXJuIHR5cGVvZiBkPT0iYm9vbGVhbiJ8fGQ9PT1iP2U/YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFtkP3thZGQ6Y306e3JlbW92ZTpjfSxlLGYsZ10pOnRoaXMuX3RvZ2dsZUNsYXNzKGMsZCk6YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7dG9nZ2xlOmN9LGQsZSxmXSl9LHN3aXRjaENsYXNzOmZ1bmN0aW9uKGIsYyxkLGUsZil7cmV0dXJuIGEuZWZmZWN0cy5hbmltYXRlQ2xhc3MuYXBwbHkodGhpcyxbe2FkZDpjLHJlbW92ZTpifSxkLGUsZl0pfX0pLGEuZXh0ZW5kKGEuZWZmZWN0cyx7dmVyc2lvbjoiMS44LjE3IixzYXZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspYltjXSE9PW51bGwmJmEuZGF0YSgiZWMuc3RvcmFnZS4iK2JbY10sYVswXS5zdHlsZVtiW2NdXSl9LHJlc3RvcmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdIT09bnVsbCYmYS5jc3MoYltjXSxhLmRhdGEoImVjLnN0b3JhZ2UuIitiW2NdKSl9LHNldE1vZGU6ZnVuY3Rpb24oYSxiKXtiPT0idG9nZ2xlIiYmKGI9YS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpO3JldHVybiBifSxnZXRCYXNlbGluZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ7c3dpdGNoKGFbMF0pe2Nhc2UidG9wIjpjPTA7YnJlYWs7Y2FzZSJtaWRkbGUiOmM9LjU7YnJlYWs7Y2FzZSJib3R0b20iOmM9MTticmVhaztkZWZhdWx0OmM9YVswXS9iLmhlaWdodH1zd2l0Y2goYVsxXSl7Y2FzZSJsZWZ0IjpkPTA7YnJlYWs7Y2FzZSJjZW50ZXIiOmQ9LjU7YnJlYWs7Y2FzZSJyaWdodCI6ZD0xO2JyZWFrO2RlZmF1bHQ6ZD1hWzFdL2Iud2lkdGh9cmV0dXJue3g6ZCx5OmN9fSxjcmVhdGVXcmFwcGVyOmZ1bmN0aW9uKGIpe2lmKGIucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSlyZXR1cm4gYi5wYXJlbnQoKTt2YXIgYz17d2lkdGg6Yi5vdXRlcldpZHRoKCEwKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCghMCksImZsb2F0IjpiLmNzcygiZmxvYXQiKX0sZD1hKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLXdyYXBwZXIiKS5jc3Moe2ZvbnRTaXplOiIxMDAlIixiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixtYXJnaW46MCxwYWRkaW5nOjB9KSxlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7Yi53cmFwKGQpLChiWzBdPT09ZXx8YS5jb250YWlucyhiWzBdLGUpKSYmYShlKS5mb2N1cygpLGQ9Yi5wYXJlbnQoKSxiLmNzcygicG9zaXRpb24iKT09InN0YXRpYyI/KGQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSksYi5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9KSk6KGEuZXh0ZW5kKGMse3Bvc2l0aW9uOmIuY3NzKCJwb3NpdGlvbiIpLHpJbmRleDpiLmNzcygiei1pbmRleCIpfSksYS5lYWNoKFsidG9wIiwibGVmdCIsImJvdHRvbSIsInJpZ2h0Il0sZnVuY3Rpb24oYSxkKXtjW2RdPWIuY3NzKGQpLGlzTmFOKHBhcnNlSW50KGNbZF0sMTApKSYmKGNbZF09ImF1dG8iKX0pLGIuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDowLGxlZnQ6MCxyaWdodDoiYXV0byIsYm90dG9tOiJhdXRvIn0pKTtyZXR1cm4gZC5jc3MoYykuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKGIpe3ZhciBjLGQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZihiLnBhcmVudCgpLmlzKCIudWktZWZmZWN0cy13cmFwcGVyIikpe2M9Yi5wYXJlbnQoKS5yZXBsYWNlV2l0aChiKSwoYlswXT09PWR8fGEuY29udGFpbnMoYlswXSxkKSkmJmEoZCkuZm9jdXMoKTtyZXR1cm4gY31yZXR1cm4gYn0sc2V0VHJhbnNpdGlvbjpmdW5jdGlvbihiLGMsZCxlKXtlPWV8fHt9LGEuZWFjaChjLGZ1bmN0aW9uKGEsYyl7dW5pdD1iLmNzc1VuaXQoYyksdW5pdFswXT4wJiYoZVtjXT11bml0WzBdKmQrdW5pdFsxXSl9KTtyZXR1cm4gZX19KSxhLmZuLmV4dGVuZCh7ZWZmZWN0OmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpLGc9e29wdGlvbnM6ZlsxXSxkdXJhdGlvbjpmWzJdLGNhbGxiYWNrOmZbM119LGg9Zy5vcHRpb25zLm1vZGUsaT1hLmVmZmVjdHNbYl07aWYoYS5meC5vZmZ8fCFpKXJldHVybiBoP3RoaXNbaF0oZy5kdXJhdGlvbixnLmNhbGxiYWNrKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtnLmNhbGxiYWNrJiZnLmNhbGxiYWNrLmNhbGwodGhpcyl9KTtyZXR1cm4gaS5jYWxsKHRoaXMsZyl9LF9zaG93OmEuZm4uc2hvdyxzaG93OmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX3Nob3cuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO2JbMV0ubW9kZT0ic2hvdyI7cmV0dXJuIHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9oaWRlOmEuZm4uaGlkZSxoaWRlOmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX2hpZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO2JbMV0ubW9kZT0iaGlkZSI7cmV0dXJuIHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9fdG9nZ2xlOmEuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihiKXtpZihsKGIpfHx0eXBlb2YgYj09ImJvb2xlYW4ifHxhLmlzRnVuY3Rpb24oYikpcmV0dXJuIHRoaXMuX190b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBjPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO2NbMV0ubW9kZT0idG9nZ2xlIjtyZXR1cm4gdGhpcy5lZmZlY3QuYXBwbHkodGhpcyxjKX0sY3NzVW5pdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmNzcyhiKSxkPVtdO2EuZWFjaChbImVtIiwicHgiLCIlIiwicHQiXSxmdW5jdGlvbihhLGIpe2MuaW5kZXhPZihiKT4wJiYoZD1bcGFyc2VGbG9hdChjKSxiXSl9KTtyZXR1cm4gZH19KSxhLmVhc2luZy5qc3dpbmc9YS5lYXNpbmcuc3dpbmcsYS5leHRlbmQoYS5lYXNpbmcse2RlZjoiZWFzZU91dFF1YWQiLHN3aW5nOmZ1bmN0aW9uKGIsYyxkLGUsZil7cmV0dXJuIGEuZWFzaW5nW2EuZWFzaW5nLmRlZl0oYixjLGQsZSxmKX0sZWFzZUluUXVhZDpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBkKihiLz1lKSpiK2N9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuLWQqKGIvPWUpKihiLTIpK2N9LGVhc2VJbk91dFF1YWQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZigoYi89ZS8yKTwxKXJldHVybiBkLzIqYipiK2M7cmV0dXJuLWQvMiooLS1iKihiLTIpLTEpK2N9LGVhc2VJbkN1YmljOmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGQqKGIvPWUpKmIqYitjfSxlYXNlT3V0Q3ViaWM6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gZCooKGI9Yi9lLTEpKmIqYisxKStjfSxlYXNlSW5PdXRDdWJpYzpmdW5jdGlvbihhLGIsYyxkLGUpe2lmKChiLz1lLzIpPDEpcmV0dXJuIGQvMipiKmIqYitjO3JldHVybiBkLzIqKChiLT0yKSpiKmIrMikrY30sZWFzZUluUXVhcnQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gZCooYi89ZSkqYipiKmIrY30sZWFzZU91dFF1YXJ0OmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuLWQqKChiPWIvZS0xKSpiKmIqYi0xKStjfSxlYXNlSW5PdXRRdWFydDpmdW5jdGlvbihhLGIsYyxkLGUpe2lmKChiLz1lLzIpPDEpcmV0dXJuIGQvMipiKmIqYipiK2M7cmV0dXJuLWQvMiooKGItPTIpKmIqYipiLTIpK2N9LGVhc2VJblF1aW50OmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGQqKGIvPWUpKmIqYipiKmIrY30sZWFzZU91dFF1aW50OmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGQqKChiPWIvZS0xKSpiKmIqYipiKzEpK2N9LGVhc2VJbk91dFF1aW50OmZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoKGIvPWUvMik8MSlyZXR1cm4gZC8yKmIqYipiKmIqYitjO3JldHVybiBkLzIqKChiLT0yKSpiKmIqYipiKzIpK2N9LGVhc2VJblNpbmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4tZCpNYXRoLmNvcyhiL2UqKE1hdGguUEkvMikpK2QrY30sZWFzZU91dFNpbmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gZCpNYXRoLnNpbihiL2UqKE1hdGguUEkvMikpK2N9LGVhc2VJbk91dFNpbmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4tZC8yKihNYXRoLmNvcyhNYXRoLlBJKmIvZSktMSkrY30sZWFzZUluRXhwbzpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBiPT0wP2M6ZCpNYXRoLnBvdygyLDEwKihiL2UtMSkpK2N9LGVhc2VPdXRFeHBvOmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGI9PWU/YytkOmQqKC1NYXRoLnBvdygyLC0xMCpiL2UpKzEpK2N9LGVhc2VJbk91dEV4cG86ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihiPT0wKXJldHVybiBjO2lmKGI9PWUpcmV0dXJuIGMrZDtpZigoYi89ZS8yKTwxKXJldHVybiBkLzIqTWF0aC5wb3coMiwxMCooYi0xKSkrYztyZXR1cm4gZC8yKigtTWF0aC5wb3coMiwtMTAqLS1iKSsyKStjfSxlYXNlSW5DaXJjOmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuLWQqKE1hdGguc3FydCgxLShiLz1lKSpiKS0xKStjfSxlYXNlT3V0Q2lyYzpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBkKk1hdGguc3FydCgxLShiPWIvZS0xKSpiKStjfSxlYXNlSW5PdXRDaXJjOmZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoKGIvPWUvMik8MSlyZXR1cm4tZC8yKihNYXRoLnNxcnQoMS1iKmIpLTEpK2M7cmV0dXJuIGQvMiooTWF0aC5zcXJ0KDEtKGItPTIpKmIpKzEpK2N9LGVhc2VJbkVsYXN0aWM6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0xLjcwMTU4LGc9MCxoPWQ7aWYoYj09MClyZXR1cm4gYztpZigoYi89ZSk9PTEpcmV0dXJuIGMrZDtnfHwoZz1lKi4zKTtpZihoPE1hdGguYWJzKGQpKXtoPWQ7dmFyIGY9Zy80fWVsc2UgdmFyIGY9Zy8oMipNYXRoLlBJKSpNYXRoLmFzaW4oZC9oKTtyZXR1cm4tKGgqTWF0aC5wb3coMiwxMCooYi09MSkpKk1hdGguc2luKChiKmUtZikqMipNYXRoLlBJL2cpKStjfSxlYXNlT3V0RWxhc3RpYzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTEuNzAxNTgsZz0wLGg9ZDtpZihiPT0wKXJldHVybiBjO2lmKChiLz1lKT09MSlyZXR1cm4gYytkO2d8fChnPWUqLjMpO2lmKGg8TWF0aC5hYnMoZCkpe2g9ZDt2YXIgZj1nLzR9ZWxzZSB2YXIgZj1nLygyKk1hdGguUEkpKk1hdGguYXNpbihkL2gpO3JldHVybiBoKk1hdGgucG93KDIsLTEwKmIpKk1hdGguc2luKChiKmUtZikqMipNYXRoLlBJL2cpK2QrY30sZWFzZUluT3V0RWxhc3RpYzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTEuNzAxNTgsZz0wLGg9ZDtpZihiPT0wKXJldHVybiBjO2lmKChiLz1lLzIpPT0yKXJldHVybiBjK2Q7Z3x8KGc9ZSouMyoxLjUpO2lmKGg8TWF0aC5hYnMoZCkpe2g9ZDt2YXIgZj1nLzR9ZWxzZSB2YXIgZj1nLygyKk1hdGguUEkpKk1hdGguYXNpbihkL2gpO2lmKGI8MSlyZXR1cm4tMC41KmgqTWF0aC5wb3coMiwxMCooYi09MSkpKk1hdGguc2luKChiKmUtZikqMipNYXRoLlBJL2cpK2M7cmV0dXJuIGgqTWF0aC5wb3coMiwtMTAqKGItPTEpKSpNYXRoLnNpbigoYiplLWYpKjIqTWF0aC5QSS9nKSouNStkK2N9LGVhc2VJbkJhY2s6ZnVuY3Rpb24oYSxjLGQsZSxmLGcpe2c9PWImJihnPTEuNzAxNTgpO3JldHVybiBlKihjLz1mKSpjKigoZysxKSpjLWcpK2R9LGVhc2VPdXRCYWNrOmZ1bmN0aW9uKGEsYyxkLGUsZixnKXtnPT1iJiYoZz0xLjcwMTU4KTtyZXR1cm4gZSooKGM9Yy9mLTEpKmMqKChnKzEpKmMrZykrMSkrZH0sZWFzZUluT3V0QmFjazpmdW5jdGlvbihhLGMsZCxlLGYsZyl7Zz09YiYmKGc9MS43MDE1OCk7aWYoKGMvPWYvMik8MSlyZXR1cm4gZS8yKmMqYyooKChnKj0xLjUyNSkrMSkqYy1nKStkO3JldHVybiBlLzIqKChjLT0yKSpjKigoKGcqPTEuNTI1KSsxKSpjK2cpKzIpK2R9LGVhc2VJbkJvdW5jZTpmdW5jdGlvbihiLGMsZCxlLGYpe3JldHVybiBlLWEuZWFzaW5nLmVhc2VPdXRCb3VuY2UoYixmLWMsMCxlLGYpK2R9LGVhc2VPdXRCb3VuY2U6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4oYi89ZSk8MS8yLjc1P2QqNy41NjI1KmIqYitjOmI8Mi8yLjc1P2QqKDcuNTYyNSooYi09MS41LzIuNzUpKmIrLjc1KStjOmI8Mi41LzIuNzU/ZCooNy41NjI1KihiLT0yLjI1LzIuNzUpKmIrLjkzNzUpK2M6ZCooNy41NjI1KihiLT0yLjYyNS8yLjc1KSpiKy45ODQzNzUpK2N9LGVhc2VJbk91dEJvdW5jZTpmdW5jdGlvbihiLGMsZCxlLGYpe2lmKGM8Zi8yKXJldHVybiBhLmVhc2luZy5lYXNlSW5Cb3VuY2UoYixjKjIsMCxlLGYpKi41K2Q7cmV0dXJuIGEuZWFzaW5nLmVhc2VPdXRCb3VuY2UoYixjKjItZiwwLGUsZikqLjUrZSouNStkfX0pfShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBFZmZlY3RzIEJsaW5kIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9CbGluZAogKgogKiBEZXBlbmRzOgogKglqcXVlcnkuZWZmZWN0cy5jb3JlLmpzCiAqLyhmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5ibGluZD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWY9PSJ2ZXJ0aWNhbCI/ImhlaWdodCI6IndpZHRoIixpPWY9PSJ2ZXJ0aWNhbCI/Zy5oZWlnaHQoKTpnLndpZHRoKCk7ZT09InNob3ciJiZnLmNzcyhoLDApO3ZhciBqPXt9O2pbaF09ZT09InNob3ciP2k6MCxnLmFuaW1hdGUoaixiLmR1cmF0aW9uLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIEVmZmVjdHMgQm91bmNlIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9Cb3VuY2UKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LmVmZmVjdHMuY29yZS5qcwogKi8oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuYm91bmNlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ1cCIsZz1iLm9wdGlvbnMuZGlzdGFuY2V8fDIwLGg9Yi5vcHRpb25zLnRpbWVzfHw1LGk9Yi5kdXJhdGlvbnx8MjUwOy9zaG93fGhpZGUvLnRlc3QoZSkmJmQucHVzaCgib3BhY2l0eSIpLGEuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixnPWIub3B0aW9ucy5kaXN0YW5jZXx8KGo9PSJ0b3AiP2Mub3V0ZXJIZWlnaHQoe21hcmdpbjohMH0pLzM6Yy5vdXRlcldpZHRoKHttYXJnaW46ITB9KS8zKTtlPT0ic2hvdyImJmMuY3NzKCJvcGFjaXR5IiwwKS5jc3MoaixrPT0icG9zIj8tZzpnKSxlPT0iaGlkZSImJihnPWcvKGgqMikpLGUhPSJoaWRlIiYmaC0tO2lmKGU9PSJzaG93Iil7dmFyIGw9e29wYWNpdHk6MX07bFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShsLGkvMixiLm9wdGlvbnMuZWFzaW5nKSxnPWcvMixoLS19Zm9yKHZhciBtPTA7bTxoO20rKyl7dmFyIG49e30scD17fTtuW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2cscFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShuLGkvMixiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKHAsaS8yLGIub3B0aW9ucy5lYXNpbmcpLGc9ZT09ImhpZGUiP2cqMjpnLzJ9aWYoZT09ImhpZGUiKXt2YXIgbD17b3BhY2l0eTowfTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csYy5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9ZWxzZXt2YXIgbj17fSxwPXt9O25bal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxwW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKG4saS8yLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxpLzIsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2EuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1jLnF1ZXVlKCJmeCIsZnVuY3Rpb24oKXtjLmRlcXVldWUoKX0pLGMuZGVxdWV1ZSgpfSl9fSkoalF1ZXJ5KTsvKgogKiBqUXVlcnkgVUkgRWZmZWN0cyBDbGlwIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9DbGlwCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS5lZmZlY3RzLmNvcmUuanMKICovKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmNsaXA9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWNbMF0udGFnTmFtZT09IklNRyI/ZzpjLGk9e3NpemU6Zj09InZlcnRpY2FsIj8iaGVpZ2h0Ijoid2lkdGgiLHBvc2l0aW9uOmY9PSJ2ZXJ0aWNhbCI/InRvcCI6ImxlZnQifSxqPWY9PSJ2ZXJ0aWNhbCI/aC5oZWlnaHQoKTpoLndpZHRoKCk7ZT09InNob3ciJiYoaC5jc3MoaS5zaXplLDApLGguY3NzKGkucG9zaXRpb24sai8yKSk7dmFyIGs9e307a1tpLnNpemVdPWU9PSJzaG93Ij9qOjAsa1tpLnBvc2l0aW9uXT1lPT0ic2hvdyI/MDpqLzIsaC5hbmltYXRlKGsse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBFZmZlY3RzIERyb3AgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL0Ryb3AKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LmVmZmVjdHMuY29yZS5qcwogKi8oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZHJvcD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3BhY2l0eSJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJsZWZ0IjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KHttYXJnaW46ITB9KS8yOmMub3V0ZXJXaWR0aCh7bWFyZ2luOiEwfSkvMik7ZT09InNob3ciJiZjLmNzcygib3BhY2l0eSIsMCkuY3NzKGcsaD09InBvcyI/LWk6aSk7dmFyIGo9e29wYWNpdHk6ZT09InNob3ciPzE6MH07altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBFZmZlY3RzIEV4cGxvZGUgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL0V4cGxvZGUKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LmVmZmVjdHMuY29yZS5qcwogKi8oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZXhwbG9kZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWIub3B0aW9ucy5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQoYi5vcHRpb25zLnBpZWNlcykpOjMsZD1iLm9wdGlvbnMucGllY2VzP01hdGgucm91bmQoTWF0aC5zcXJ0KGIub3B0aW9ucy5waWVjZXMpKTozO2Iub3B0aW9ucy5tb2RlPWIub3B0aW9ucy5tb2RlPT0idG9nZ2xlIj9hKHRoaXMpLmlzKCI6dmlzaWJsZSIpPyJoaWRlIjoic2hvdyI6Yi5vcHRpb25zLm1vZGU7dmFyIGU9YSh0aGlzKS5zaG93KCkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksZj1lLm9mZnNldCgpO2YudG9wLT1wYXJzZUludChlLmNzcygibWFyZ2luVG9wIiksMTApfHwwLGYubGVmdC09cGFyc2VJbnQoZS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDA7dmFyIGc9ZS5vdXRlcldpZHRoKCEwKSxoPWUub3V0ZXJIZWlnaHQoITApO2Zvcih2YXIgaT0wO2k8YztpKyspZm9yKHZhciBqPTA7ajxkO2orKyllLmNsb25lKCkuYXBwZW5kVG8oImJvZHkiKS53cmFwKCI8ZGl2PjwvZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJ2aXNpYmxlIixsZWZ0Oi1qKihnL2QpLHRvcDotaSooaC9jKX0pLnBhcmVudCgpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLWV4cGxvZGUiKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6Zy9kLGhlaWdodDpoL2MsbGVmdDpmLmxlZnQraiooZy9kKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8oai1NYXRoLmZsb29yKGQvMikpKihnL2QpOjApLHRvcDpmLnRvcCtpKihoL2MpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPyhpLU1hdGguZmxvb3IoYy8yKSkqKGgvYyk6MCksb3BhY2l0eTpiLm9wdGlvbnMubW9kZT09InNob3ciPzA6MX0pLmFuaW1hdGUoe2xlZnQ6Zi5sZWZ0K2oqKGcvZCkrKGIub3B0aW9ucy5tb2RlPT0ic2hvdyI/MDooai1NYXRoLmZsb29yKGQvMikpKihnL2QpKSx0b3A6Zi50b3AraSooaC9jKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8wOihpLU1hdGguZmxvb3IoYy8yKSkqKGgvYykpLG9wYWNpdHk6Yi5vcHRpb25zLm1vZGU9PSJzaG93Ij8xOjB9LGIuZHVyYXRpb258fDUwMCk7c2V0VGltZW91dChmdW5jdGlvbigpe2Iub3B0aW9ucy5tb2RlPT0ic2hvdyI/ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSk6ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSkuaGlkZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoZVswXSksZS5kZXF1ZXVlKCksYSgiZGl2LnVpLWVmZmVjdHMtZXhwbG9kZSIpLnJlbW92ZSgpfSxiLmR1cmF0aW9ufHw1MDApfSl9fSkoalF1ZXJ5KTsvKgogKiBqUXVlcnkgVUkgRWZmZWN0cyBGYWRlIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9GYWRlCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS5lZmZlY3RzLmNvcmUuanMKICovKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmZhZGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTtjLmFuaW1hdGUoe29wYWNpdHk6ZH0se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIEVmZmVjdHMgRm9sZCAxLjguMTcKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJL0VmZmVjdHMvRm9sZAogKgogKiBEZXBlbmRzOgogKglqcXVlcnkuZWZmZWN0cy5jb3JlLmpzCiAqLyhmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5mb2xkPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZj1iLm9wdGlvbnMuc2l6ZXx8MTUsZz0hIWIub3B0aW9ucy5ob3JpekZpcnN0LGg9Yi5kdXJhdGlvbj9iLmR1cmF0aW9uLzI6YS5meC5zcGVlZHMuX2RlZmF1bHQvMjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBpPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxqPWU9PSJzaG93IiE9ZyxrPWo/WyJ3aWR0aCIsImhlaWdodCJdOlsiaGVpZ2h0Iiwid2lkdGgiXSxsPWo/W2kud2lkdGgoKSxpLmhlaWdodCgpXTpbaS5oZWlnaHQoKSxpLndpZHRoKCldLG09LyhbMC05XSspJS8uZXhlYyhmKTttJiYoZj1wYXJzZUludChtWzFdLDEwKS8xMDAqbFtlPT0iaGlkZSI/MDoxXSksZT09InNob3ciJiZpLmNzcyhnP3toZWlnaHQ6MCx3aWR0aDpmfTp7aGVpZ2h0OmYsd2lkdGg6MH0pO3ZhciBuPXt9LHA9e307bltrWzBdXT1lPT0ic2hvdyI/bFswXTpmLHBba1sxXV09ZT09InNob3ciP2xbMV06MCxpLmFuaW1hdGUobixoLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxoLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIEVmZmVjdHMgSGlnaGxpZ2h0IDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9IaWdobGlnaHQKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LmVmZmVjdHMuY29yZS5qcwogKi8oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuaGlnaGxpZ2h0PWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZENvbG9yIiwib3BhY2l0eSJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8InNob3ciKSxmPXtiYWNrZ3JvdW5kQ29sb3I6Yy5jc3MoImJhY2tncm91bmRDb2xvciIpfTtlPT0iaGlkZSImJihmLm9wYWNpdHk9MCksYS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKS5jc3Moe2JhY2tncm91bmRJbWFnZToibm9uZSIsYmFja2dyb3VuZENvbG9yOmIub3B0aW9ucy5jb2xvcnx8IiNmZmZmOTkifSkuYW5pbWF0ZShmLHtxdWV1ZTohMSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGU9PSJzaG93IiYmIWEuc3VwcG9ydC5vcGFjaXR5JiZ0aGlzLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIiksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBFZmZlY3RzIFB1bHNhdGUgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL1B1bHNhdGUKICoKICogRGVwZW5kczoKICoJanF1ZXJ5LmVmZmVjdHMuY29yZS5qcwogKi8oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMucHVsc2F0ZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpO3RpbWVzPShiLm9wdGlvbnMudGltZXN8fDUpKjItMSxkdXJhdGlvbj1iLmR1cmF0aW9uP2IuZHVyYXRpb24vMjphLmZ4LnNwZWVkcy5fZGVmYXVsdC8yLGlzVmlzaWJsZT1jLmlzKCI6dmlzaWJsZSIpLGFuaW1hdGVUbz0wLGlzVmlzaWJsZXx8KGMuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCksYW5pbWF0ZVRvPTEpLChkPT0iaGlkZSImJmlzVmlzaWJsZXx8ZD09InNob3ciJiYhaXNWaXNpYmxlKSYmdGltZXMtLTtmb3IodmFyIGU9MDtlPHRpbWVzO2UrKyljLmFuaW1hdGUoe29wYWNpdHk6YW5pbWF0ZVRvfSxkdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nKSxhbmltYXRlVG89KGFuaW1hdGVUbysxKSUyO2MuYW5pbWF0ZSh7b3BhY2l0eTphbmltYXRlVG99LGR1cmF0aW9uLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXthbmltYXRlVG89PTAmJmMuaGlkZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KS5kZXF1ZXVlKCl9KX19KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBFZmZlY3RzIFNjYWxlIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9TY2FsZQogKgogKiBEZXBlbmRzOgogKglqcXVlcnkuZWZmZWN0cy5jb3JlLmpzCiAqLyhmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5wdWZmPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZT1wYXJzZUludChiLm9wdGlvbnMucGVyY2VudCwxMCl8fDE1MCxmPWUvMTAwLGc9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07YS5leHRlbmQoYi5vcHRpb25zLHtmYWRlOiEwLG1vZGU6ZCxwZXJjZW50OmQ9PSJoaWRlIj9lOjEwMCxmcm9tOmQ9PSJoaWRlIj9nOntoZWlnaHQ6Zy5oZWlnaHQqZix3aWR0aDpnLndpZHRoKmZ9fSksYy5lZmZlY3QoInNjYWxlIixiLm9wdGlvbnMsYi5kdXJhdGlvbixiLmNhbGxiYWNrKSxjLmRlcXVldWUoKX0pfSxhLmVmZmVjdHMuc2NhbGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5leHRlbmQoITAse30sYi5vcHRpb25zKSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPXBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKXx8KHBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKT09MD8wOmU9PSJoaWRlIj8wOjEwMCksZz1iLm9wdGlvbnMuZGlyZWN0aW9ufHwiYm90aCIsaD1iLm9wdGlvbnMub3JpZ2luO2UhPSJlZmZlY3QiJiYoZC5vcmlnaW49aHx8WyJtaWRkbGUiLCJjZW50ZXIiXSxkLnJlc3RvcmU9ITApO3ZhciBpPXtoZWlnaHQ6Yy5oZWlnaHQoKSx3aWR0aDpjLndpZHRoKCl9O2MuZnJvbT1iLm9wdGlvbnMuZnJvbXx8KGU9PSJzaG93Ij97aGVpZ2h0OjAsd2lkdGg6MH06aSk7dmFyIGo9e3k6ZyE9Imhvcml6b250YWwiP2YvMTAwOjEseDpnIT0idmVydGljYWwiP2YvMTAwOjF9O2MudG89e2hlaWdodDppLmhlaWdodCpqLnksd2lkdGg6aS53aWR0aCpqLnh9LGIub3B0aW9ucy5mYWRlJiYoZT09InNob3ciJiYoYy5mcm9tLm9wYWNpdHk9MCxjLnRvLm9wYWNpdHk9MSksZT09ImhpZGUiJiYoYy5mcm9tLm9wYWNpdHk9MSxjLnRvLm9wYWNpdHk9MCkpLGQuZnJvbT1jLmZyb20sZC50bz1jLnRvLGQubW9kZT1lLGMuZWZmZWN0KCJzaXplIixkLGIuZHVyYXRpb24sYi5jYWxsYmFjayksYy5kZXF1ZXVlKCl9KX0sYS5lZmZlY3RzLnNpemU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sZT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sZj1bIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciXSxnPVsiZm9udFNpemUiXSxoPVsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0saT1bImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLGo9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGs9Yi5vcHRpb25zLnJlc3RvcmV8fCExLGw9Yi5vcHRpb25zLnNjYWxlfHwiYm90aCIsbT1iLm9wdGlvbnMub3JpZ2luLG49e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPWIub3B0aW9ucy5mcm9tfHxuLGMudG89Yi5vcHRpb25zLnRvfHxuO2lmKG0pe3ZhciBwPWEuZWZmZWN0cy5nZXRCYXNlbGluZShtLG4pO2MuZnJvbS50b3A9KG4uaGVpZ2h0LWMuZnJvbS5oZWlnaHQpKnAueSxjLmZyb20ubGVmdD0obi53aWR0aC1jLmZyb20ud2lkdGgpKnAueCxjLnRvLnRvcD0obi5oZWlnaHQtYy50by5oZWlnaHQpKnAueSxjLnRvLmxlZnQ9KG4ud2lkdGgtYy50by53aWR0aCkqcC54fXZhciBxPXtmcm9tOnt5OmMuZnJvbS5oZWlnaHQvbi5oZWlnaHQseDpjLmZyb20ud2lkdGgvbi53aWR0aH0sdG86e3k6Yy50by5oZWlnaHQvbi5oZWlnaHQseDpjLnRvLndpZHRoL24ud2lkdGh9fTtpZihsPT0iYm94Inx8bD09ImJvdGgiKXEuZnJvbS55IT1xLnRvLnkmJihkPWQuY29uY2F0KGgpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGgscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLnRvLnksYy50bykpLHEuZnJvbS54IT1xLnRvLngmJihkPWQuY29uY2F0KGkpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS5mcm9tLngsYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLnRvLngsYy50bykpOyhsPT0iY29udGVudCJ8fGw9PSJib3RoIikmJnEuZnJvbS55IT1xLnRvLnkmJihkPWQuY29uY2F0KGcpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGcscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsZyxxLnRvLnksYy50bykpLGEuZWZmZWN0cy5zYXZlKGMsaz9kOmUpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLGMuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpLmNzcyhjLmZyb20pO2lmKGw9PSJjb250ZW50Inx8bD09ImJvdGgiKWg9aC5jb25jYXQoWyJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iXSkuY29uY2F0KGcpLGk9aS5jb25jYXQoWyJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiXSksZj1kLmNvbmNhdChoKS5jb25jYXQoaSksYy5maW5kKCIqW3dpZHRoXSIpLmVhY2goZnVuY3Rpb24oKXtjaGlsZD1hKHRoaXMpLGsmJmEuZWZmZWN0cy5zYXZlKGNoaWxkLGYpO3ZhciBjPXtoZWlnaHQ6Y2hpbGQuaGVpZ2h0KCksd2lkdGg6Y2hpbGQud2lkdGgoKX07Y2hpbGQuZnJvbT17aGVpZ2h0OmMuaGVpZ2h0KnEuZnJvbS55LHdpZHRoOmMud2lkdGgqcS5mcm9tLnh9LGNoaWxkLnRvPXtoZWlnaHQ6Yy5oZWlnaHQqcS50by55LHdpZHRoOmMud2lkdGgqcS50by54fSxxLmZyb20ueSE9cS50by55JiYoY2hpbGQuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjaGlsZCxoLHEuZnJvbS55LGNoaWxkLmZyb20pLGNoaWxkLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGNoaWxkLGgscS50by55LGNoaWxkLnRvKSkscS5mcm9tLnghPXEudG8ueCYmKGNoaWxkLmZyb209YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oY2hpbGQsaSxxLmZyb20ueCxjaGlsZC5mcm9tKSxjaGlsZC50bz1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjaGlsZCxpLHEudG8ueCxjaGlsZC50bykpLGNoaWxkLmNzcyhjaGlsZC5mcm9tKSxjaGlsZC5hbmltYXRlKGNoaWxkLnRvLGIuZHVyYXRpb24sYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2smJmEuZWZmZWN0cy5yZXN0b3JlKGNoaWxkLGYpfSl9KTtjLmFuaW1hdGUoYy50byx7cXVldWU6ITEsZHVyYXRpb246Yi5kdXJhdGlvbixlYXNpbmc6Yi5vcHRpb25zLmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2MudG8ub3BhY2l0eT09PTAmJmMuY3NzKCJvcGFjaXR5IixjLmZyb20ub3BhY2l0eSksaj09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGs/ZDplKSxhLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihjKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0pKGpRdWVyeSk7LyoKICogalF1ZXJ5IFVJIEVmZmVjdHMgU2hha2UgMS44LjE3CiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9FZmZlY3RzL1NoYWtlCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS5lZmZlY3RzLmNvcmUuanMKICovKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnNoYWtlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJsZWZ0IixnPWIub3B0aW9ucy5kaXN0YW5jZXx8MjAsaD1iLm9wdGlvbnMudGltZXN8fDMsaT1iLmR1cmF0aW9ufHxiLm9wdGlvbnMuZHVyYXRpb258fDE0MDthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpO3ZhciBqPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaz1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsbD17fSxtPXt9LG49e307bFtqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnLG1bal09KGs9PSJwb3MiPyIrPSI6Ii09IikrZyoyLG5bal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyoyLGMuYW5pbWF0ZShsLGksYi5vcHRpb25zLmVhc2luZyk7Zm9yKHZhciBwPTE7cDxoO3ArKyljLmFuaW1hdGUobSxpLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUobixpLGIub3B0aW9ucy5lYXNpbmcpO2MuYW5pbWF0ZShtLGksYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShsLGkvMixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7YS5lZmZlY3RzLnJlc3RvcmUoYyxkKSxhLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihjKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGMucXVldWUoImZ4IixmdW5jdGlvbigpe2MuZGVxdWV1ZSgpfSksYy5kZXF1ZXVlKCl9KX19KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBFZmZlY3RzIFNsaWRlIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9TbGlkZQogKgogKiBEZXBlbmRzOgogKglqcXVlcnkuZWZmZWN0cy5jb3JlLmpzCiAqLyhmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5zbGlkZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYykuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KHttYXJnaW46ITB9KTpjLm91dGVyV2lkdGgoe21hcmdpbjohMH0pKTtlPT0ic2hvdyImJmMuY3NzKGcsaD09InBvcyI/aXNOYU4oaSk/Ii0iK2k6LWk6aSk7dmFyIGo9e307altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOy8qCiAqIGpRdWVyeSBVSSBFZmZlY3RzIFRyYW5zZmVyIDEuOC4xNwogKgogKiBDb3B5cmlnaHQgMjAxMSwgQVVUSE9SUy50eHQgKGh0dHA6Ly9qcXVlcnl1aS5jb20vYWJvdXQpCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vVUkvRWZmZWN0cy9UcmFuc2ZlcgogKgogKiBEZXBlbmRzOgogKglqcXVlcnkuZWZmZWN0cy5jb3JlLmpzCiAqLyhmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy50cmFuc2Zlcj1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1hKGIub3B0aW9ucy50byksZT1kLm9mZnNldCgpLGY9e3RvcDplLnRvcCxsZWZ0OmUubGVmdCxoZWlnaHQ6ZC5pbm5lckhlaWdodCgpLHdpZHRoOmQuaW5uZXJXaWR0aCgpfSxnPWMub2Zmc2V0KCksaD1hKCc8ZGl2IGNsYXNzPSJ1aS1lZmZlY3RzLXRyYW5zZmVyIj48L2Rpdj4nKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5hZGRDbGFzcyhiLm9wdGlvbnMuY2xhc3NOYW1lKS5jc3Moe3RvcDpnLnRvcCxsZWZ0OmcubGVmdCxoZWlnaHQ6Yy5pbm5lckhlaWdodCgpLHdpZHRoOmMuaW5uZXJXaWR0aCgpLHBvc2l0aW9uOiJhYnNvbHV0ZSJ9KS5hbmltYXRlKGYsYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7aC5yZW1vdmUoKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KGNbMF0sYXJndW1lbnRzKSxjLmRlcXVldWUoKX0pfSl9fSkoalF1ZXJ5KTs='
tenjsn = 'jquery-1.7.1.min.js'
tenjsd = 'LyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN2KGEpe2lmKCFja1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2x8fChjbD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNsLmZyYW1lQm9yZGVyPWNsLndpZHRoPWNsLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNsKTtpZighY218fCFjbC5jcmVhdGVFbGVtZW50KWNtPShjbC5jb250ZW50V2luZG93fHxjbC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNtLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbS5jbG9zZSgpO2Q9Y20uY3JlYXRlRWxlbWVudChhKSxjbS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2wpfWNrW2FdPWV9cmV0dXJuIGNrW2FdfWZ1bmN0aW9uIGN1KGEsYil7dmFyIGM9e307Zi5lYWNoKGNxLmNvbmNhdC5hcHBseShbXSxjcS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGN0KCl7Y3I9Yn1mdW5jdGlvbiBjcygpe3NldFRpbWVvdXQoY3QsMCk7cmV0dXJuIGNyPWYubm93KCl9ZnVuY3Rpb24gY2ooKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYyhhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2IoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBjYShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRS50ZXN0KGEpP2QoYSxlKTpjYShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiljYShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYl8oYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiJChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlQsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iJChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iJChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlooYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiUCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJDKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/Yng6YnksZz0wLGg9ZS5sZW5ndGg7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtnPGg7ZysrKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2VbZ10pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrZVtnXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ6KGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZzxoO2crKylkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnAoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4xIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9CPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihCPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksZS5yZWFkeSgpKX0pO3JldHVybiBlfSgpLGc9e307Zi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT1hP2dbYV18fGgoYSk6e307dmFyIGM9W10sZD1bXSxlLGksaixrLGwsbT1mdW5jdGlvbihiKXt2YXIgZCxlLGcsaCxpO2ZvcihkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWc9YltkXSxoPWYudHlwZShnKSxoPT09ImFycmF5Ij9tKGcpOmg9PT0iZnVuY3Rpb24iJiYoIWEudW5pcXVlfHwhby5oYXMoZykpJiZjLnB1c2goZyl9LG49ZnVuY3Rpb24oYixmKXtmPWZ8fFtdLGU9IWEubWVtb3J5fHxbYixmXSxpPSEwLGw9anx8MCxqPTAsaz1jLmxlbmd0aDtmb3IoO2MmJmw8aztsKyspaWYoY1tsXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aT0hMSxjJiYoYS5vbmNlP2U9PT0hMD9vLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCksby5maXJlV2l0aChlWzBdLGVbMV0pKSl9LG89e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO20oYXJndW1lbnRzKSxpP2s9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaj1hLG4oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2kmJmY8PWsmJihrLS0sZjw9bCYmbC0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJm8uZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaT9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbihiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe28uZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZX19O3JldHVybiBvfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtpLmRvbmUuYXBwbHkoaSxhcmd1bWVudHMpLmZhaWwuYXBwbHkoaSxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxwaXBlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkKXtmLmVhY2goe2RvbmU6W2EsInJlc29sdmUiXSxmYWlsOltiLCJyZWplY3QiXSxwcm9ncmVzczpbYywibm90aWZ5Il19LGZ1bmN0aW9uKGEsYil7dmFyIGM9YlswXSxlPWJbMV0sZztmLmlzRnVuY3Rpb24oYyk/aVthXShmdW5jdGlvbigpe2c9Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksZyYmZi5pc0Z1bmN0aW9uKGcucHJvbWlzZSk/Zy5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QsZC5ub3RpZnkpOmRbZSsiV2l0aCJdKHRoaXM9PT1pP2Q6dGhpcyxbZ10pfSk6aVthXShkW2VdKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpYT1oO2Vsc2UgZm9yKHZhciBiIGluIGgpYVtiXT1oW2JdO3JldHVybiBhfX0saT1oLnByb21pc2Uoe30pLGo7Zm9yKGogaW4gZylpW2pdPWdbal0uZmlyZSxpW2orIldpdGgiXT1nW2pdLmZpcmVXaXRoO2kuZG9uZShmdW5jdGlvbigpe2U9InJlc29sdmVkIn0sYy5kaXNhYmxlLGQubG9jaykuZmFpbChmdW5jdGlvbigpe2U9InJlamVjdGVkIn0sYi5kaXNhYmxlLGQubG9jayksYSYmYS5jYWxsKGksaSk7cmV0dXJuIGl9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbShhKXtyZXR1cm4gZnVuY3Rpb24oYil7ZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpiLGoubm90aWZ5V2l0aChrLGUpfX1mdW5jdGlvbiBsKGEpe3JldHVybiBmdW5jdGlvbihjKXtiW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmMsLS1nfHxqLnJlc29sdmVXaXRoKGosYil9fXZhciBiPWkuY2FsbChhcmd1bWVudHMsMCksYz0wLGQ9Yi5sZW5ndGgsZT1BcnJheShkKSxnPWQsaD1kLGo9ZDw9MSYmYSYmZi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpmLkRlZmVycmVkKCksaz1qLnByb21pc2UoKTtpZihkPjEpe2Zvcig7YzxkO2MrKyliW2NdJiZiW2NdLnByb21pc2UmJmYuaXNGdW5jdGlvbihiW2NdLnByb21pc2UpP2JbY10ucHJvbWlzZSgpLnRoZW4obChjKSxqLnJlamVjdCxtKGMpKTotLWc7Z3x8ai5yZXNvbHZlV2l0aChqLGIpfWVsc2UgaiE9PWEmJmoucmVzb2x2ZVdpdGgoaixkP1thXTpbXSk7cmV0dXJuIGt9fSksZi5zdXBwb3J0PWZ1bmN0aW9uKCl7dmFyIGIsZCxlLGcsaCxpLGosayxsLG0sbixvLHAscT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHI9Yy5kb2N1bWVudEVsZW1lbnQ7cS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxxLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0ndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGQ9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGU9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCFkfHwhZC5sZW5ndGh8fCFlKXJldHVybnt9O2c9Yy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxoPWcuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksaT1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGI9e2xlYWRpbmdXaGl0ZXNwYWNlOnEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFxLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi90b3AvLnRlc3QoZS5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmUuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1Ly50ZXN0KGUuc3R5bGUub3BhY2l0eSksY3NzRmxvYXQ6ISFlLnN0eWxlLmNzc0Zsb2F0LGNoZWNrT246aS52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6aC5zZWxlY3RlZCxnZXRTZXRBdHRyaWJ1dGU6cS5jbGFzc05hbWUhPT0idCIsZW5jdHlwZTohIWMuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsaHRtbDVDbG9uZTpjLmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSghMCkub3V0ZXJIVE1MIT09Ijw6bmF2PjwvOm5hdj4iLHN1Ym1pdEJ1YmJsZXM6ITAsY2hhbmdlQnViYmxlczohMCxmb2N1c2luQnViYmxlczohMSxkZWxldGVFeHBhbmRvOiEwLG5vQ2xvbmVFdmVudDohMCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiExLHNocmlua1dyYXBCbG9ja3M6ITEscmVsaWFibGVNYXJnaW5SaWdodDohMH0saS5jaGVja2VkPSEwLGIubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxiLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgcS50ZXN0fWNhdGNoKHMpe2IuZGVsZXRlRXhwYW5kbz0hMX0hcS5hZGRFdmVudExpc3RlbmVyJiZxLmF0dGFjaEV2ZW50JiZxLmZpcmVFdmVudCYmKHEuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7Yi5ub0Nsb25lRXZlbnQ9ITF9KSxxLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxiLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxxLmFwcGVuZENoaWxkKGkpLGs9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksay5hcHBlbmRDaGlsZChxLmxhc3RDaGlsZCksYi5jaGVja0Nsb25lPWsuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuYXBwZW5kQ2hlY2tlZD1pLmNoZWNrZWQsay5yZW1vdmVDaGlsZChpKSxrLmFwcGVuZENoaWxkKHEpLHEuaW5uZXJIVE1MPSIiLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGo9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxqLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLm1hcmdpblJpZ2h0PSIwIixxLnN0eWxlLndpZHRoPSIycHgiLHEuYXBwZW5kQ2hpbGQoaiksYi5yZWxpYWJsZU1hcmdpblJpZ2h0PShwYXJzZUludCgoYS5nZXRDb21wdXRlZFN0eWxlKGosbnVsbCl8fHttYXJnaW5SaWdodDowfSkubWFyZ2luUmlnaHQsMTApfHwwKT09PTApO2lmKHEuYXR0YWNoRXZlbnQpZm9yKG8gaW57c3VibWl0OjEsY2hhbmdlOjEsZm9jdXNpbjoxfSluPSJvbiIrbyxwPW4gaW4gcSxwfHwocS5zZXRBdHRyaWJ1dGUobiwicmV0dXJuOyIpLHA9dHlwZW9mIHFbbl09PSJmdW5jdGlvbiIpLGJbbysiQnViYmxlcyJdPXA7ay5yZW1vdmVDaGlsZChxKSxrPWc9aD1qPXE9aT1udWxsLGYoZnVuY3Rpb24oKXt2YXIgYSxkLGUsZyxoLGksaixrLG0sbixvLHI9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOyFyfHwoaj0xLGs9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDttYXJnaW46MDsiLG09InZpc2liaWxpdHk6aGlkZGVuO2JvcmRlcjowOyIsbj0ic3R5bGU9JyIraysiYm9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDsnIixvPSI8ZGl2ICIrbisiPjxkaXY+PC9kaXY+PC9kaXY+IisiPHRhYmxlICIrbisiIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+IisiPHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4iLGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLnN0eWxlLmNzc1RleHQ9bSsid2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoiK2orInB4IixyLmluc2VydEJlZm9yZShhLHIuZmlyc3RDaGlsZCkscT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuYXBwZW5kQ2hpbGQocSkscS5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixsPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIikscD1sWzBdLm9mZnNldEhlaWdodD09PTAsbFswXS5zdHlsZS5kaXNwbGF5PSIiLGxbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsYi5yZWxpYWJsZUhpZGRlbk9mZnNldHM9cCYmbFswXS5vZmZzZXRIZWlnaHQ9PT0wLHEuaW5uZXJIVE1MPSIiLHEuc3R5bGUud2lkdGg9cS5zdHlsZS5wYWRkaW5nTGVmdD0iMXB4IixmLmJveE1vZGVsPWIuYm94TW9kZWw9cS5vZmZzZXRXaWR0aD09PTIsdHlwZW9mIHEuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihxLnN0eWxlLmRpc3BsYXk9ImlubGluZSIscS5zdHlsZS56b29tPTEsYi5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PXEub2Zmc2V0V2lkdGg9PT0yLHEuc3R5bGUuZGlzcGxheT0iIixxLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IixiLnNocmlua1dyYXBCbG9ja3M9cS5vZmZzZXRXaWR0aCE9PTIpLHEuc3R5bGUuY3NzVGV4dD1rK20scS5pbm5lckhUTUw9byxkPXEuZmlyc3RDaGlsZCxlPWQuZmlyc3RDaGlsZCxoPWQubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkLGk9e2RvZXNOb3RBZGRCb3JkZXI6ZS5vZmZzZXRUb3AhPT01LGRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzOmgub2Zmc2V0VG9wPT09NX0sZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGUuc3R5bGUudG9wPSIyMHB4IixpLmZpeGVkUG9zaXRpb249ZS5vZmZzZXRUb3A9PT0yMHx8ZS5vZmZzZXRUb3A9PT0xNSxlLnN0eWxlLnBvc2l0aW9uPWUuc3R5bGUudG9wPSIiLGQuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGkuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWUub2Zmc2V0VG9wPT09LTUsaS5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1yLm9mZnNldFRvcCE9PWosci5yZW1vdmVDaGlsZChhKSxxPWE9bnVsbCxmLmV4dGVuZChiLGkpKX0pO3JldHVybiBifSgpO3ZhciBqPS9eKD86XHsuKlx9fFxbLipcXSkkLyxrPS8oW0EtWl0pL2c7Zi5leHRlbmQoe2NhY2hlOnt9LHV1aWQ6MCxleHBhbmRvOiJqUXVlcnkiKyhmLmZuLmpxdWVyeStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oYSl7YT1hLm5vZGVUeXBlP2YuY2FjaGVbYVtmLmV4cGFuZG9dXTphW2YuZXhwYW5kb107cmV0dXJuISFhJiYhbShhKX0sZGF0YTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWYuYWNjZXB0RGF0YShhKSl7dmFyIGcsaCxpLGo9Zi5leHBhbmRvLGs9dHlwZW9mIGM9PSJzdHJpbmciLGw9YS5ub2RlVHlwZSxtPWw/Zi5jYWNoZTphLG49bD9hW2pdOmFbal0mJmosbz1jPT09ImV2ZW50cyI7aWYoKCFufHwhbVtuXXx8IW8mJiFlJiYhbVtuXS5kYXRhKSYmayYmZD09PWIpcmV0dXJuO258fChsP2Fbal09bj0rK2YudXVpZDpuPWopLG1bbl18fChtW25dPXt9LGx8fChtW25dLnRvSlNPTj1mLm5vb3ApKTtpZih0eXBlb2YgYz09Im9iamVjdCJ8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWU/bVtuXT1mLmV4dGVuZChtW25dLGMpOm1bbl0uZGF0YT1mLmV4dGVuZChtW25dLmRhdGEsYyk7Zz1oPW1bbl0sZXx8KGguZGF0YXx8KGguZGF0YT17fSksaD1oLmRhdGEpLGQhPT1iJiYoaFtmLmNhbWVsQ2FzZShjKV09ZCk7aWYobyYmIWhbY10pcmV0dXJuIGcuZXZlbnRzO2s/KGk9aFtjXSxpPT1udWxsJiYoaT1oW2YuY2FtZWxDYXNlKGMpXSkpOmk9aDtyZXR1cm4gaX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiLGMpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZCxlLGcsaD1mLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9mLmNhY2hlOmEsaz1pP2FbaF06aDtpZighaltrXSlyZXR1cm47aWYoYil7ZD1jP2pba106altrXS5kYXRhO2lmKGQpe2YuaXNBcnJheShiKXx8KGIgaW4gZD9iPVtiXTooYj1mLmNhbWVsQ2FzZShiKSxiIGluIGQ/Yj1bYl06Yj1iLnNwbGl0KCIgIikpKTtmb3IoZT0wLGc9Yi5sZW5ndGg7ZTxnO2UrKylkZWxldGUgZFtiW2VdXTtpZighKGM/bTpmLmlzRW1wdHlPYmplY3QpKGQpKXJldHVybn19aWYoIWMpe2RlbGV0ZSBqW2tdLmRhdGE7aWYoIW0oaltrXSkpcmV0dXJufWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvfHwhai5zZXRJbnRlcnZhbD9kZWxldGUgaltrXTpqW2tdPW51bGwsaSYmKGYuc3VwcG9ydC5kZWxldGVFeHBhbmRvP2RlbGV0ZSBhW2hdOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGgpOmFbaF09bnVsbCl9fSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGF0YShhLGIsYywhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oYSl7aWYoYS5ub2RlTmFtZSl7dmFyIGI9Zi5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihiKXJldHVybiBiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifXJldHVybiEwfX0pLGYuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxnLGg9bnVsbDtpZih0eXBlb2YgYT09InVuZGVmaW5lZCIpe2lmKHRoaXMubGVuZ3RoKXtoPWYuZGF0YSh0aGlzWzBdKTtpZih0aGlzWzBdLm5vZGVUeXBlPT09MSYmIWYuX2RhdGEodGhpc1swXSwicGFyc2VkQXR0cnMiKSl7ZT10aGlzWzBdLmF0dHJpYnV0ZXM7Zm9yKHZhciBpPTAsaj1lLmxlbmd0aDtpPGo7aSsrKWc9ZVtpXS5uYW1lLGcuaW5kZXhPZigiZGF0YS0iKT09PTAmJihnPWYuY2FtZWxDYXNlKGcuc3Vic3RyaW5nKDUpKSxsKHRoaXNbMF0sZyxoW2ddKSk7Zi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIsITApfX1yZXR1cm4gaH1pZih0eXBlb2YgYT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGF0YSh0aGlzLGEpfSk7ZD1hLnNwbGl0KCIuIiksZFsxXT1kWzFdPyIuIitkWzFdOiIiO2lmKGM9PT1iKXtoPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2RbMV0rIiEiLFtkWzBdXSksaD09PWImJnRoaXMubGVuZ3RoJiYoaD1mLmRhdGEodGhpc1swXSxhKSxoPWwodGhpc1swXSxhLGgpKTtyZXR1cm4gaD09PWImJmRbMV0/dGhpcy5kYXRhKGRbMF0pOmh9cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksZT1bZFswXSxjXTtiLnRyaWdnZXJIYW5kbGVyKCJzZXREYXRhIitkWzFdKyIhIixlKSxmLmRhdGEodGhpcyxhLGMpLGIudHJpZ2dlckhhbmRsZXIoImNoYW5nZURhdGEiK2RbMV0rIiEiLGUpfSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe19tYXJrOmZ1bmN0aW9uKGEsYil7YSYmKGI9KGJ8fCJmeCIpKyJtYXJrIixmLl9kYXRhKGEsYiwoZi5fZGF0YShhLGIpfHwwKSsxKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxiLGMpe2EhPT0hMCYmKGM9YixiPWEsYT0hMSk7aWYoYil7Yz1jfHwiZngiO3ZhciBkPWMrIm1hcmsiLGU9YT8wOihmLl9kYXRhKGIsZCl8fDEpLTE7ZT9mLl9kYXRhKGIsZCxlKTooZi5yZW1vdmVEYXRhKGIsZCwhMCksbihiLGMsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIixkPWYuX2RhdGEoYSxiKSxjJiYoIWR8fGYuaXNBcnJheShjKT9kPWYuX2RhdGEoYSxiLGYubWFrZUFycmF5KGMpKTpkLnB1c2goYykpO3JldHVybiBkfHxbXX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9Zi5xdWV1ZShhLGIpLGQ9Yy5zaGlmdCgpLGU9e307ZD09PSJpbnByb2dyZXNzIiYmKGQ9Yy5zaGlmdCgpKSxkJiYoYj09PSJmeCImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGYuX2RhdGEoYSxiKyIucnVuIixlKSxkLmNhbGwoYSxmdW5jdGlvbigpe2YuZGVxdWV1ZShhLGIpfSxlKSksYy5sZW5ndGh8fChmLnJlbW92ZURhdGEoYSxiKyJxdWV1ZSAiK2IrIi5ydW4iLCEwKSxuKGEsYiwicXVldWUiKSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9ImZ4Iik7aWYoYz09PWIpcmV0dXJuIGYucXVldWUodGhpc1swXSxhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zi5xdWV1ZSh0aGlzLGEsYyk7YT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJmYuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1mLmZ4P2YuZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gbSgpey0taHx8ZC5yZXNvbHZlV2l0aChlLFtlXSl9dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9YiksYT1hfHwiZngiO3ZhciBkPWYuRGVmZXJyZWQoKSxlPXRoaXMsZz1lLmxlbmd0aCxoPTEsaT1hKyJkZWZlciIsaj1hKyJxdWV1ZSIsaz1hKyJtYXJrIixsO3doaWxlKGctLSlpZihsPWYuZGF0YShlW2ddLGksYiwhMCl8fChmLmRhdGEoZVtnXSxqLGIsITApfHxmLmRhdGEoZVtnXSxrLGIsITApKSYmZi5kYXRhKGVbZ10saSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwhMCkpaCsrLGwuYWRkKG0pO20oKTtyZXR1cm4gZC5wcm9taXNlKCl9fSk7dmFyIG89L1tcblx0XHJdL2cscD0vXHMrLyxxPS9cci9nLHI9L14oPzpidXR0b258aW5wdXQpJC9pLHM9L14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksdD0vXmEoPzpyZWEpPyQvaSx1PS9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLHY9Zi5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZSx3LHgseTtmLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLmF0dHIpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZUF0dHIodGhpcyxhKX0pfSxwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYucHJvcCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7YT1mLnByb3BGaXhbYV18fGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPWIsZGVsZXRlIHRoaXNbYV19Y2F0Y2goYyl7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnLGgsaTtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nIil7Yj1hLnNwbGl0KHApO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtlPXRoaXNbY107aWYoZS5ub2RlVHlwZT09PTEpaWYoIWUuY2xhc3NOYW1lJiZiLmxlbmd0aD09PTEpZS5jbGFzc05hbWU9YTtlbHNle2c9IiAiK2UuY2xhc3NOYW1lKyIgIjtmb3IoaD0wLGk9Yi5sZW5ndGg7aDxpO2grKyl+Zy5pbmRleE9mKCIgIitiW2hdKyIgIil8fChnKz1iW2hdKyIgIik7ZS5jbGFzc05hbWU9Zi50cmltKGcpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnLGgsaSxqO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmcifHxhPT09Yil7Yz0oYXx8IiIpLnNwbGl0KHApO2ZvcihkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXtnPXRoaXNbZF07aWYoZy5ub2RlVHlwZT09PTEmJmcuY2xhc3NOYW1lKWlmKGEpe2g9KCIgIitnLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpO2ZvcihpPTAsaj1jLmxlbmd0aDtpPGo7aSsrKWg9aC5yZXBsYWNlKCIgIitjW2ldKyIgIiwiICIpO2cuY2xhc3NOYW1lPWYudHJpbShoKX1lbHNlIGcuY2xhc3NOYW1lPSIifX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYSxkPXR5cGVvZiBiPT0iYm9vbGVhbiI7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGM9PT0ic3RyaW5nIil7dmFyIGUsZz0wLGg9Zih0aGlzKSxpPWIsaj1hLnNwbGl0KHApO3doaWxlKGU9altnKytdKWk9ZD9pOiFoLmhhc0NsYXNzKGUpLGhbaT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoYz09PSJ1bmRlZmluZWQifHxjPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NOYW1lJiZmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7Zm9yKDtjPGQ7YysrKWlmKHRoaXNbY10ubm9kZVR5cGU9PT0xJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnPXRoaXNbMF07e2lmKCEhYXJndW1lbnRzLmxlbmd0aCl7ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldfHxmLnZhbEhvb2tzW3RoaXMudHlwZV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9aWYoZyl7Yz1mLnZhbEhvb2tzW2cubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbZy50eXBlXTtpZihjJiYiZ2V0ImluIGMmJihkPWMuZ2V0KGcsInZhbHVlIikpIT09YilyZXR1cm4gZDtkPWcudmFsdWU7cmV0dXJuIHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UocSwiIik6ZD09bnVsbD8iIjpkfX19fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCEhYSYmaiE9PTMmJmohPT04JiZqIT09Mil7aWYoZSYmYyBpbiBmLmF0dHJGbilyZXR1cm4gZihhKVtjXShkKTtpZih0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJufWlmKGgmJiJzZXQiaW4gaCYmaSYmKGc9aC5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGc7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihoJiYiZ2V0ImluIGgmJmkmJihnPWguZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gZztnPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBnPT09bnVsbD9iOmd9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaD0wO2lmKGImJmEubm9kZVR5cGU9PT0xKXtkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChwKSxnPWQubGVuZ3RoO2Zvcig7aDxnO2grKyllPWRbaF0sZSYmKGM9Zi5wcm9wRml4W2VdfHxlLGYuYXR0cihhLGUsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHY/ZTpjKSx1LnRlc3QoZSkmJmMgaW4gYSYmKGFbY109ITEpKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoci50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUpZi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighZi5zdXBwb3J0LnJhZGlvVmFsdWUmJmI9PT0icmFkaW8iJiZmLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpO3JldHVybiBifX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oYSxiKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LmdldChhLGIpO3JldHVybiBiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaT1hLm5vZGVUeXBlO2lmKCEhYSYmaSE9PTMmJmkhPT04JiZpIT09Mil7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP3BhcnNlSW50KGMudmFsdWUsMTApOnMudGVzdChhLm5vZGVOYW1lKXx8dC50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpifX19fSksZi5hdHRySG9va3MudGFiaW5kZXg9Zi5wcm9wSG9va3MudGFiSW5kZXgseD17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT1mLnByb3AoYSxjKTtyZXR1cm4gZT09PSEwfHx0eXBlb2YgZSE9ImJvb2xlYW4iJiYoZD1hLmdldEF0dHJpYnV0ZU5vZGUoYykpJiZkLm5vZGVWYWx1ZSE9PSExP2MudG9Mb3dlckNhc2UoKTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2I9PT0hMT9mLnJlbW92ZUF0dHIoYSxjKTooZD1mLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gY319LHZ8fCh5PXtuYW1lOiEwLGlkOiEwfSx3PWYudmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZDtkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZCYmKHlbY10/ZC5ub2RlVmFsdWUhPT0iIjpkLnNwZWNpZmllZCk/ZC5ub2RlVmFsdWU6Yn0sc2V0OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1hLmdldEF0dHJpYnV0ZU5vZGUoZCk7ZXx8KGU9Yy5jcmVhdGVBdHRyaWJ1dGUoZCksYS5zZXRBdHRyaWJ1dGVOb2RlKGUpKTtyZXR1cm4gZS5ub2RlVmFsdWU9YisiIn19LGYuYXR0ckhvb2tzLnRhYmluZGV4LnNldD13LnNldCxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5hdHRySG9va3NbYl09Zi5leHRlbmQoZi5hdHRySG9va3NbYl0se3NldDpmdW5jdGlvbihhLGMpe2lmKGM9PT0iIil7YS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpO3JldHVybiBjfX19KX0pLGYuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17Z2V0OncuZ2V0LHNldDpmdW5jdGlvbihhLGIsYyl7Yj09PSIiJiYoYj0iZmFsc2UiKSx3LnNldChhLGIsYyl9fSksZi5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHxmLmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGMpe2YuYXR0ckhvb2tzW2NdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2NdLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoYywyKTtyZXR1cm4gZD09PW51bGw/YjpkfX0pfSksZi5zdXBwb3J0LnN0eWxlfHwoZi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fGJ9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9IiIrYn19KSxmLnN1cHBvcnQub3B0U2VsZWN0ZWR8fChmLnByb3BIb29rcy5zZWxlY3RlZD1mLmV4dGVuZChmLnByb3BIb29rcy5zZWxlY3RlZCx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpO3JldHVybiBudWxsfX0pKSxmLnN1cHBvcnQuZW5jdHlwZXx8KGYucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpLGYuc3VwcG9ydC5jaGVja09ufHxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmEudmFsdWV9fX0pLGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109Zi5leHRlbmQoZi52YWxIb29rc1t0aGlzXSx7c2V0OmZ1bmN0aW9uKGEsYil7aWYoZi5pc0FycmF5KGIpKXJldHVybiBhLmNoZWNrZWQ9Zi5pbkFycmF5KGYoYSkudmFsKCksYik+PTB9fSl9KTt2YXIgej0vXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksQT0vXihbXlwuXSopPyg/OlwuKC4rKSk/JC8sQj0vXGJob3ZlcihcLlxTKyk/XGIvLEM9L15rZXkvLEQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLEU9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLEY9L14oXHcqKSg/OiMoW1x3XC1dKykpPyg/OlwuKFtcd1wtXSspKT8kLyxHPWZ1bmN0aW9uKGEpe3ZhciBiPUYuZXhlYyhhKTtiJiYoYlsxXT0oYlsxXXx8IiIpLnRvTG93ZXJDYXNlKCksYlszXT1iWzNdJiZuZXcgUmVnRXhwKCIoPzpefFxccykiK2JbM10rIig/Olxcc3wkKSIpKTtyZXR1cm4gYn0sSD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYXR0cmlidXRlc3x8e307cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHwoYy5pZHx8e30pLnZhbHVlPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KChjWyJjbGFzcyJdfHx7fSkudmFsdWUpKX0sST1mdW5jdGlvbihhKXtyZXR1cm4gZi5ldmVudC5zcGVjaWFsLmhvdmVyP2E6YS5yZXBsYWNlKEIsIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07CmYuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWN8fCFkfHwhKGg9Zi5fZGF0YShhKSkpKXtkLmhhbmRsZXImJihwPWQsZD1wLmhhbmRsZXIpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPWYudHJpbShJKGMpKS5zcGxpdCgiICIpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspe2w9QS5leGVjKGNba10pfHxbXSxtPWxbMV0sbj0obFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxtPShnP3MuZGVsZWdhdGVUeXBlOnMuYmluZFR5cGUpfHxtLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxvPWYuZXh0ZW5kKHt0eXBlOm0sb3JpZ1R5cGU6bFsxXSxkYXRhOmUsaGFuZGxlcjpkLGd1aWQ6ZC5ndWlkLHNlbGVjdG9yOmcscXVpY2s6RyhnKSxuYW1lc3BhY2U6bi5qb2luKCIuIil9LHApLHI9alttXTtpZighcil7cj1qW21dPVtdLHIuZGVsZWdhdGVDb3VudD0wO2lmKCFzLnNldHVwfHxzLnNldHVwLmNhbGwoYSxlLG4saSk9PT0hMSlhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKG0saSwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK20saSl9cy5hZGQmJihzLmFkZC5jYWxsKGEsbyksby5oYW5kbGVyLmd1aWR8fChvLmhhbmRsZXIuZ3VpZD1kLmd1aWQpKSxnP3Iuc3BsaWNlKHIuZGVsZWdhdGVDb3VudCsrLDAsbyk6ci5wdXNoKG8pLGYuZXZlbnQuZ2xvYmFsW21dPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZz1mLmhhc0RhdGEoYSkmJmYuX2RhdGEoYSksaCxpLGosayxsLG0sbixvLHAscSxyLHM7aWYoISFnJiYhIShvPWcuZXZlbnRzKSl7Yj1mLnRyaW0oSShifHwiIikpLnNwbGl0KCIgIik7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKyl7aT1BLmV4ZWMoYltoXSl8fFtdLGo9az1pWzFdLGw9aVsyXTtpZighail7Zm9yKGogaW4gbylmLmV2ZW50LnJlbW92ZShhLGorYltoXSxjLGQsITApO2NvbnRpbnVlfXA9Zi5ldmVudC5zcGVjaWFsW2pdfHx7fSxqPShkP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxqLHI9b1tqXXx8W10sbT1yLmxlbmd0aCxsPWw/bmV3IFJlZ0V4cCgiKF58XFwuKSIrbC5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsO2ZvcihuPTA7bjxyLmxlbmd0aDtuKyspcz1yW25dLChlfHxrPT09cy5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cy5ndWlkKSYmKCFsfHxsLnRlc3Qocy5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cy5zZWxlY3Rvcnx8ZD09PSIqKiImJnMuc2VsZWN0b3IpJiYoci5zcGxpY2Uobi0tLDEpLHMuc2VsZWN0b3ImJnIuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEscykpO3IubGVuZ3RoPT09MCYmbSE9PXIubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoYSxsKT09PSExKSYmZi5yZW1vdmVFdmVudChhLGosZy5oYW5kbGUpLGRlbGV0ZSBvW2pdKX1mLmlzRW1wdHlPYmplY3QobykmJihxPWcuaGFuZGxlLHEmJihxLmVsZW09bnVsbCksZi5yZW1vdmVEYXRhKGEsWyJldmVudHMiLCJoYW5kbGUiXSwhMCkpfX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxlLGcpe2lmKCFlfHxlLm5vZGVUeXBlIT09MyYmZS5ub2RlVHlwZSE9PTgpe3ZhciBoPWMudHlwZXx8YyxpPVtdLGosayxsLG0sbixvLHAscSxyLHM7aWYoRS50ZXN0KGgrZi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtoLmluZGV4T2YoIiEiKT49MCYmKGg9aC5zbGljZSgwLC0xKSxrPSEwKSxoLmluZGV4T2YoIi4iKT49MCYmKGk9aC5zcGxpdCgiLiIpLGg9aS5zaGlmdCgpLGkuc29ydCgpKTtpZigoIWV8fGYuZXZlbnQuY3VzdG9tRXZlbnRbaF0pJiYhZi5ldmVudC5nbG9iYWxbaF0pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbZi5leHBhbmRvXT9jOm5ldyBmLkV2ZW50KGgsYyk6bmV3IGYuRXZlbnQoaCksYy50eXBlPWgsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9ayxjLm5hbWVzcGFjZT1pLmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGwsbz1oLmluZGV4T2YoIjoiKTwwPyJvbiIraDoiIjtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxtPUUudGVzdChzK2gpP2U6ZS5wYXJlbnROb2RlLG49bnVsbDtmb3IoO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2wrKyltPXJbbF1bMF0sYy50eXBlPXJbbF1bMV0scT0oZi5fZGF0YShtLCJldmVudHMiKXx8e30pW2MudHlwZV0mJmYuX2RhdGEobSwiaGFuZGxlIikscSYmcS5hcHBseShtLGQpLHE9byYmbVtvXSxxJiZmLmFjY2VwdERhdGEobSkmJnEuYXBwbHkobSxkKT09PSExJiZjLnByZXZlbnREZWZhdWx0KCk7Yy50eXBlPWgsIWcmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkoZS5vd25lckRvY3VtZW50LGQpPT09ITEpJiYoaCE9PSJjbGljayJ8fCFmLm5vZGVOYW1lKGUsImEiKSkmJmYuYWNjZXB0RGF0YShlKSYmbyYmZVtoXSYmKGghPT0iZm9jdXMiJiZoIT09ImJsdXIifHxjLnRhcmdldC5vZmZzZXRXaWR0aCE9PTApJiYhZi5pc1dpbmRvdyhlKSYmKG49ZVtvXSxuJiYoZVtvXT1udWxsKSxmLmV2ZW50LnRyaWdnZXJlZD1oLGVbaF0oKSxmLmV2ZW50LnRyaWdnZXJlZD1iLG4mJihlW29dPW4pKTtyZXR1cm4gYy5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihjKXtjPWYuZXZlbnQuZml4KGN8fGEuZXZlbnQpO3ZhciBkPShmLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYy50eXBlXXx8W10sZT1kLmRlbGVnYXRlQ291bnQsZz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxoPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLGk9W10saixrLGwsbSxuLG8scCxxLHIscyx0O2dbMF09YyxjLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoZSYmIWMudGFyZ2V0LmRpc2FibGVkJiYoIWMuYnV0dG9ufHxjLnR5cGUhPT0iY2xpY2siKSl7bT1mKHRoaXMpLG0uY29udGV4dD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXM7Zm9yKGw9Yy50YXJnZXQ7bCE9dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcyl7bz17fSxxPVtdLG1bMF09bDtmb3Ioaj0wO2o8ZTtqKyspcj1kW2pdLHM9ci5zZWxlY3RvcixvW3NdPT09YiYmKG9bc109ci5xdWljaz9IKGwsci5xdWljayk6bS5pcyhzKSksb1tzXSYmcS5wdXNoKHIpO3EubGVuZ3RoJiZpLnB1c2goe2VsZW06bCxtYXRjaGVzOnF9KX19ZC5sZW5ndGg+ZSYmaS5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGo9MDtqPGkubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2orKyl7cD1pW2pdLGMuY3VycmVudFRhcmdldD1wLmVsZW07Zm9yKGs9MDtrPHAubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7aysrKXtyPXAubWF0Y2hlc1trXTtpZihofHwhYy5uYW1lc3BhY2UmJiFyLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qoci5uYW1lc3BhY2UpKWMuZGF0YT1yLmRhdGEsYy5oYW5kbGVPYmo9cixuPSgoZi5ldmVudC5zcGVjaWFsW3Iub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxyLmhhbmRsZXIpLmFwcGx5KHAuZWxlbSxnKSxuIT09YiYmKGMucmVzdWx0PW4sbj09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19cmV0dXJuIGMucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGQpe3ZhciBlLGYsZyxoPWQuYnV0dG9uLGk9ZC5mcm9tRWxlbWVudDthLnBhZ2VYPT1udWxsJiZkLmNsaWVudFghPW51bGwmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGMsZj1lLmRvY3VtZW50RWxlbWVudCxnPWUuYm9keSxhLnBhZ2VYPWQuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxnJiZnLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGcmJmcuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1kLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxnJiZnLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxnJiZnLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmkmJihhLnJlbGF0ZWRUYXJnZXQ9aT09PWEudGFyZ2V0P2QudG9FbGVtZW50OmkpLCFhLndoaWNoJiZoIT09YiYmKGEud2hpY2g9aCYxPzE6aCYyPzM6aCY0PzI6MCk7cmV0dXJuIGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtmLmV4cGFuZG9dKXJldHVybiBhO3ZhciBkLGUsZz1hLGg9Zi5ldmVudC5maXhIb29rc1thLnR5cGVdfHx7fSxpPWgucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoaC5wcm9wcyk6dGhpcy5wcm9wczthPWYuRXZlbnQoZyk7Zm9yKGQ9aS5sZW5ndGg7ZDspZT1pWy0tZF0sYVtlXT1nW2VdO2EudGFyZ2V0fHwoYS50YXJnZXQ9Zy5zcmNFbGVtZW50fHxjKSxhLnRhcmdldC5ub2RlVHlwZT09PTMmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9PT1iJiYoYS5tZXRhS2V5PWEuY3RybEtleSk7cmV0dXJuIGguZmlsdGVyP2guZmlsdGVyKGEsZyk6YX0sc3BlY2lhbDp7cmVhZHk6e3NldHVwOmYuYmluZFJlYWR5fSxsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e2RlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e2RlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixjKXtmLmlzV2luZG93KHRoaXMpJiYodGhpcy5vbmJlZm9yZXVubG9hZD1jKX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXt0aGlzLm9uYmVmb3JldW5sb2FkPT09YiYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5leHRlbmQobmV3IGYuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP2YuZXZlbnQudHJpZ2dlcihlLG51bGwsYik6Zi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sZi5ldmVudC5oYW5kbGU9Zi5ldmVudC5kaXNwYXRjaCxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/SzpKKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxmLm5vdygpLHRoaXNbZi5leHBhbmRvXT0hMH0sZi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Szt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1LLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpKLGlzUHJvcGFnYXRpb25TdG9wcGVkOkosaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Sn0sZi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1hLnJlbGF0ZWRUYXJnZXQsZT1hLmhhbmRsZU9iaixnPWUuc2VsZWN0b3IsaDtpZighZHx8ZCE9PWMmJiFmLmNvbnRhaW5zKGMsZCkpYS50eXBlPWUub3JpZ1R5cGUsaD1lLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iO3JldHVybiBofX19KSxmLnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5hZGQodGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihhKXt2YXIgYz1hLnRhcmdldCxkPWYubm9kZU5hbWUoYywiaW5wdXQiKXx8Zi5ub2RlTmFtZShjLCJidXR0b24iKT9jLmZvcm06YjtkJiYhZC5fc3VibWl0X2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGQuX3N1Ym1pdF9hdHRhY2hlZD0hMCl9KX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLGYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZih6LnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpZi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7YS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSxmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7ei50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJiFhLmlzVHJpZ2dlciYmZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxiLl9jaGFuZ2VfYXR0YWNoZWQ9ITApfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIik7cmV0dXJuIHoudGVzdCh0aGlzLm5vZGVOYW1lKX19KSxmLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fGYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9ZnVuY3Rpb24oYSl7Zi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LGYuZXZlbnQuZml4KGEpLCEwKX07Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxjLGQsZSxnKXt2YXIgaCxpO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7dHlwZW9mIGMhPSJzdHJpbmciJiYoZD1jLGM9Yik7Zm9yKGkgaW4gYSl0aGlzLm9uKGksYyxkLGFbaV0sZyk7cmV0dXJuIHRoaXN9ZD09bnVsbCYmZT09bnVsbD8oZT1jLGQ9Yz1iKTplPT1udWxsJiYodHlwZW9mIGM9PSJzdHJpbmciPyhlPWQsZD1iKTooZT1kLGQ9YyxjPWIpKTtpZihlPT09ITEpZT1KO2Vsc2UgaWYoIWUpcmV0dXJuIHRoaXM7Zz09PTEmJihoPWUsZT1mdW5jdGlvbihhKXtmKCkub2ZmKGEpO3JldHVybiBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWguZ3VpZHx8KGguZ3VpZD1mLmd1aWQrKykpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGEsZSxkLGMpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbi5jYWxsKHRoaXMsYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYyxkKXtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iail7dmFyIGU9YS5oYW5kbGVPYmo7ZihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZS5uYW1lc3BhY2U/ZS50eXBlKyIuIitlLm5hbWVzcGFjZTplLnR5cGUsZS5zZWxlY3RvcixlLmhhbmRsZXIpO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ib2JqZWN0Iil7Zm9yKHZhciBnIGluIGEpdGhpcy5vZmYoZyxjLGFbZ10pO3JldHVybiB0aGlzfWlmKGM9PT0hMXx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZD1jLGM9YjtkPT09ITEmJihkPUopO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnJlbW92ZSh0aGlzLGEsZCxjKX0pfSxiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sbGl2ZTpmdW5jdGlvbihhLGIsYyl7Zih0aGlzLmNvbnRleHQpLm9uKGEsdGhpcy5zZWxlY3RvcixiLGMpO3JldHVybiB0aGlzfSxkaWU6ZnVuY3Rpb24oYSxiKXtmKHRoaXMuY29udGV4dCkub2ZmKGEsdGhpcy5zZWxlY3Rvcnx8IioqIixiKTtyZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT0xP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhLGMpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzWzBdKXJldHVybiBmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0sITApfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YXJndW1lbnRzLGM9YS5ndWlkfHxmLmd1aWQrKyxkPTAsZT1mdW5jdGlvbihjKXt2YXIgZT0oZi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQpfHwwKSVkO2YuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGUrMSksYy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2UuZ3VpZD1jO3doaWxlKGQ8Yi5sZW5ndGgpYltkKytdLmd1aWQ9YztyZXR1cm4gdGhpcy5jbGljayhlKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSksZi5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Zi5mbltiXT1mdW5jdGlvbihhLGMpe2M9PW51bGwmJihjPWEsYT1udWxsKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfSxmLmF0dHJGbiYmKGYuYXR0ckZuW2JdPSEwKSxDLnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQua2V5SG9va3MpLEQudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5tb3VzZUhvb2tzKX0pLGZ1bmN0aW9uKCl7ZnVuY3Rpb24geChhLGIsYyxlLGYsZyl7Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj1lW2hdO2lmKGope3ZhciBrPSExO2o9althXTt3aGlsZShqKXtpZihqW2RdPT09Yyl7az1lW2ouc2l6c2V0XTticmVha31pZihqLm5vZGVUeXBlPT09MSl7Z3x8KGpbZF09YyxqLnNpenNldD1oKTtpZih0eXBlb2YgYiE9InN0cmluZyIpe2lmKGo9PT1iKXtrPSEwO2JyZWFrfX1lbHNlIGlmKG0uZmlsdGVyKGIsW2pdKS5sZW5ndGg+MCl7az1qO2JyZWFrfX1qPWpbYV19ZVtoXT1rfX19ZnVuY3Rpb24gdyhhLGIsYyxlLGYsZyl7Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj1lW2hdO2lmKGope3ZhciBrPSExO2o9althXTt3aGlsZShqKXtpZihqW2RdPT09Yyl7az1lW2ouc2l6c2V0XTticmVha31qLm5vZGVUeXBlPT09MSYmIWcmJihqW2RdPWMsai5zaXpzZXQ9aCk7aWYoai5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yil7az1qO2JyZWFrfWo9althXX1lW2hdPWt9fX12YXIgYT0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXlxbXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteXFtcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLGQ9InNpemNhY2hlIisoTWF0aC5yYW5kb20oKSsiIikucmVwbGFjZSgiLiIsIiIpLGU9MCxnPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsaD0hMSxpPSEwLGo9L1xcL2csaz0vXHJcbi9nLGw9L1xXLztbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7aT0hMTtyZXR1cm4gMH0pO3ZhciBtPWZ1bmN0aW9uKGIsZCxlLGYpe2U9ZXx8W10sZD1kfHxjO3ZhciBoPWQ7aWYoZC5ub2RlVHlwZSE9PTEmJmQubm9kZVR5cGUhPT05KXJldHVybltdO2lmKCFifHx0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIGU7dmFyIGksaixrLGwsbixxLHIsdCx1PSEwLHY9bS5pc1hNTChkKSx3PVtdLHg9Yjtkb3thLmV4ZWMoIiIpLGk9YS5leGVjKHgpO2lmKGkpe3g9aVszXSx3LnB1c2goaVsxXSk7aWYoaVsyXSl7bD1pWzNdO2JyZWFrfX19d2hpbGUoaSk7aWYody5sZW5ndGg+MSYmcC5leGVjKGIpKWlmKHcubGVuZ3RoPT09MiYmby5yZWxhdGl2ZVt3WzBdXSlqPXkod1swXSt3WzFdLGQsZik7ZWxzZXtqPW8ucmVsYXRpdmVbd1swXV0/W2RdOm0ody5zaGlmdCgpLGQpO3doaWxlKHcubGVuZ3RoKWI9dy5zaGlmdCgpLG8ucmVsYXRpdmVbYl0mJihiKz13LnNoaWZ0KCkpLGo9eShiLGosZil9ZWxzZXshZiYmdy5sZW5ndGg+MSYmZC5ub2RlVHlwZT09PTkmJiF2JiZvLm1hdGNoLklELnRlc3Qod1swXSkmJiFvLm1hdGNoLklELnRlc3Qod1t3Lmxlbmd0aC0xXSkmJihuPW0uZmluZCh3LnNoaWZ0KCksZCx2KSxkPW4uZXhwcj9tLmZpbHRlcihuLmV4cHIsbi5zZXQpWzBdOm4uc2V0WzBdKTtpZihkKXtuPWY/e2V4cHI6dy5wb3AoKSxzZXQ6cyhmKX06bS5maW5kKHcucG9wKCksdy5sZW5ndGg9PT0xJiYod1swXT09PSJ+Inx8d1swXT09PSIrIikmJmQucGFyZW50Tm9kZT9kLnBhcmVudE5vZGU6ZCx2KSxqPW4uZXhwcj9tLmZpbHRlcihuLmV4cHIsbi5zZXQpOm4uc2V0LHcubGVuZ3RoPjA/az1zKGopOnU9ITE7d2hpbGUody5sZW5ndGgpcT13LnBvcCgpLHI9cSxvLnJlbGF0aXZlW3FdP3I9dy5wb3AoKTpxPSIiLHI9PW51bGwmJihyPWQpLG8ucmVsYXRpdmVbcV0oayxyLHYpfWVsc2Ugaz13PVtdfWt8fChrPWopLGt8fG0uZXJyb3IocXx8Yik7aWYoZy5jYWxsKGspPT09IltvYmplY3QgQXJyYXldIilpZighdSllLnB1c2guYXBwbHkoZSxrKTtlbHNlIGlmKGQmJmQubm9kZVR5cGU9PT0xKWZvcih0PTA7a1t0XSE9bnVsbDt0Kyspa1t0XSYmKGtbdF09PT0hMHx8a1t0XS5ub2RlVHlwZT09PTEmJm0uY29udGFpbnMoZCxrW3RdKSkmJmUucHVzaChqW3RdKTtlbHNlIGZvcih0PTA7a1t0XSE9bnVsbDt0Kyspa1t0XSYma1t0XS5ub2RlVHlwZT09PTEmJmUucHVzaChqW3RdKTtlbHNlIHMoayxlKTtsJiYobShsLGgsZSxmKSxtLnVuaXF1ZVNvcnQoZSkpO3JldHVybiBlfTttLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7aWYodSl7aD1pLGEuc29ydCh1KTtpZihoKWZvcih2YXIgYj0xO2I8YS5sZW5ndGg7YisrKWFbYl09PT1hW2ItMV0mJmEuc3BsaWNlKGItLSwxKX1yZXR1cm4gYX0sbS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG0oYSxudWxsLG51bGwsYil9LG0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG0oYixudWxsLG51bGwsW2FdKS5sZW5ndGg+MH0sbS5maW5kPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGk7aWYoIWEpcmV0dXJuW107Zm9yKGU9MCxmPW8ub3JkZXIubGVuZ3RoO2U8ZjtlKyspe2g9by5vcmRlcltlXTtpZihnPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpe2k9Z1sxXSxnLnNwbGljZSgxLDEpO2lmKGkuc3Vic3RyKGkubGVuZ3RoLTEpIT09IlxcIil7Z1sxXT0oZ1sxXXx8IiIpLnJlcGxhY2UoaiwiIiksZD1vLmZpbmRbaF0oZyxiLGMpO2lmKGQhPW51bGwpe2E9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2JyZWFrfX19fWR8fChkPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6W10pO3JldHVybntzZXQ6ZCxleHByOmF9fSxtLmZpbHRlcj1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLHAscT1hLHI9W10scz1jLHQ9YyYmY1swXSYmbS5pc1hNTChjWzBdKTt3aGlsZShhJiZjLmxlbmd0aCl7Zm9yKGggaW4gby5maWx0ZXIpaWYoKGY9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSkhPW51bGwmJmZbMl0pe2s9by5maWx0ZXJbaF0sbD1mWzFdLGc9ITEsZi5zcGxpY2UoMSwxKTtpZihsLnN1YnN0cihsLmxlbmd0aC0xKT09PSJcXCIpY29udGludWU7cz09PXImJihyPVtdKTtpZihvLnByZUZpbHRlcltoXSl7Zj1vLnByZUZpbHRlcltoXShmLHMsZCxyLGUsdCk7aWYoIWYpZz1pPSEwO2Vsc2UgaWYoZj09PSEwKWNvbnRpbnVlfWlmKGYpZm9yKG49MDsoaj1zW25dKSE9bnVsbDtuKyspaiYmKGk9ayhqLGYsbixzKSxwPWVeaSxkJiZpIT1udWxsP3A/Zz0hMDpzW25dPSExOnAmJihyLnB1c2goaiksZz0hMCkpO2lmKGkhPT1iKXtkfHwocz1yKSxhPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTtpZighZylyZXR1cm5bXTticmVha319aWYoYT09PXEpaWYoZz09bnVsbCltLmVycm9yKGEpO2Vsc2UgYnJlYWs7cT1hfXJldHVybiBzfSxtLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX07dmFyIG49bS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1hLm5vZGVUeXBlLGU9IiI7aWYoZCl7aWYoZD09PTF8fGQ9PT05KXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7dmFyIHM9ZnVuY3Rpb24oYSxiKXthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCk7aWYoYil7Yi5wdXNoLmFwcGx5KGIsYSk7cmV0dXJuIGJ9cmV0dXJuIGF9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHQpe3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9Ynx8W107aWYoZy5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGEpO2Vsc2UgaWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGU9YS5sZW5ndGg7YzxlO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHUsdjtjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj91PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToodT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtoPSEwO3JldHVybiAwfWlmKGEuc291cmNlSW5kZXgmJmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXSxnPWEucGFyZW50Tm9kZSxpPWIucGFyZW50Tm9kZSxqPWc7aWYoZz09PWkpcmV0dXJuIHYoYSxiKTtpZighZylyZXR1cm4tMTtpZighaSlyZXR1cm4gMTt3aGlsZShqKWUudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtqPWk7d2hpbGUoailmLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaz0wO2s8YyYmazxkO2srKylpZihlW2tdIT09ZltrXSlyZXR1cm4gdihlW2tdLGZba10pO3JldHVybiBrPT09Yz92KGEsZltrXSwtMSk6dihlW2tdLGIsMSl9LHY9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PT1iKXJldHVybiBjO3ZhciBkPWEubmV4dFNpYmxpbmc7d2hpbGUoZCl7aWYoZD09PWIpcmV0dXJuLTE7ZD1kLm5leHRTaWJsaW5nfXJldHVybiAxfSksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZT1jLmRvY3VtZW50RWxlbWVudDthLmlubmVySFRNTD0iPGEgbmFtZT0nIitkKyInLz4iLGUuaW5zZXJ0QmVmb3JlKGEsZS5maXJzdENoaWxkKSxjLmdldEVsZW1lbnRCeUlkKGQpJiYoby5maW5kLklEPWZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2VdOmI6W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KSxlLnJlbW92ZUNoaWxkKGEpLGU9YT1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmFwcGVuZENoaWxkKGMuY3JlYXRlQ29tbWVudCgiIikpLGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCYmKG8uZmluZC5UQUc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pO2lmKGFbMV09PT0iKiIpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2NbZV07ZSsrKWNbZV0ubm9kZVR5cGU9PT0xJiZkLnB1c2goY1tlXSk7Yz1kfXJldHVybiBjfSksYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihvLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1tLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXttPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIW0uaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBzKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmby5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHMoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcyhbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcyhbaV0sZil9dHJ5e3JldHVybiBzKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgaz1lLGw9ZS5nZXRBdHRyaWJ1dGUoImlkIiksbj1sfHxkLHA9ZS5wYXJlbnROb2RlLHE9L15ccypbK35dLy50ZXN0KGIpO2w/bj1uLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbikscSYmcCYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXF8fHApcmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbisiJ10gIitiKSxmKX1jYXRjaChyKXt9ZmluYWxseXtsfHxrLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfW0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFtLmlzWE1MKGEpKXRyeXtpZihlfHwhby5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBtKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MCl7YS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0xKXJldHVybjtvLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksby5maW5kLkNMQVNTPWZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT0idW5kZWZpbmVkIiYmIWMpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhWzFdKX0sYT1udWxsfX0oKSxjLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEwKX06Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/bS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTptLmNvbnRhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG0uaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1bXSxmPSIiLGc9Yi5ub2RlVHlwZT9bYl06Yjt3aGlsZShkPW8ubWF0Y2guUFNFVURPLmV4ZWMoYSkpZis9ZFswXSxhPWEucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIik7YT1vLnJlbGF0aXZlW2FdP2ErIioiOmE7Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKW0oYSxnW2hdLGUsYyk7cmV0dXJuIG0uZmlsdGVyKGYsZSl9O20uYXR0cj1mLmF0dHIsbS5zZWxlY3RvcnMuYXR0ck1hcD17fSxmLmZpbmQ9bSxmLmV4cHI9bS5zZWxlY3RvcnMsZi5leHByWyI6Il09Zi5leHByLmZpbHRlcnMsZi51bmlxdWU9bS51bmlxdWVTb3J0LGYudGV4dD1tLmdldFRleHQsZi5pc1hNTERvYz1tLmlzWE1MLGYuY29udGFpbnM9bS5jb250YWluc30oKTt2YXIgTD0vVW50aWwkLyxNPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLE49LywvLE89L14uW146I1xbXC4sXSokLyxQPUFycmF5LnByb3RvdHlwZS5zbGljZSxRPWYuZXhwci5tYXRjaC5QT1MsUj17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGMsZDtpZih0eXBlb2YgYSE9InN0cmluZyIpcmV0dXJuIGYoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGM9MCxkPWIubGVuZ3RoO2M8ZDtjKyspaWYoZi5jb250YWlucyhiW2NdLHRoaXMpKXJldHVybiEwfSk7dmFyIGU9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxpO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtnPWUubGVuZ3RoLGYuZmluZChhLHRoaXNbY10sZSk7aWYoYz4wKWZvcihoPWc7aDxlLmxlbmd0aDtoKyspZm9yKGk9MDtpPGc7aSsrKWlmKGVbaV09PT1lW2hdKXtlLnNwbGljZShoLS0sMSk7YnJlYWt9fXJldHVybiBlfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPWIubGVuZ3RoO2E8YzthKyspaWYoZi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITEpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQodGhpcyxhLCEwKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiYodHlwZW9mIGE9PSJzdHJpbmciP1EudGVzdChhKT9mKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpmLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQsZSxnPXRoaXNbMF07aWYoZi5pc0FycmF5KGEpKXt2YXIgaD0xO3doaWxlKGcmJmcub3duZXJEb2N1bWVudCYmZyE9PWIpe2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZihnKS5pcyhhW2RdKSYmYy5wdXNoKHtzZWxlY3RvcjphW2RdLGVsZW06ZyxsZXZlbDpofSk7Zz1nLnBhcmVudE5vZGUsaCsrfXJldHVybiBjfXZhciBpPVEudGVzdChhKXx8dHlwZW9mIGEhPSJzdHJpbmciP2YoYSxifHx0aGlzLmNvbnRleHQpOjA7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTt3aGlsZShnKXtpZihpP2kuaW5kZXgoZyk+LTE6Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1ifHxnLm5vZGVUeXBlPT09MTEpYnJlYWt9fWM9Yy5sZW5ndGg+MT9mLnVuaXF1ZShjKTpjO3JldHVybiB0aGlzLnB1c2hTdGFjayhjLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTE7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBmLmluQXJyYXkodGhpc1swXSxmKGEpKTtyZXR1cm4gZi5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJzdHJpbmciP2YoYSxiKTpmLm1ha2VBcnJheShhJiZhLm5vZGVUeXBlP1thXTphKSxkPWYubWVyZ2UodGhpcy5nZXQoKSxjKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhjWzBdKXx8UyhkWzBdKT9kOmYudW5pcXVlKGQpKX0sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpfX0pLGYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5ub2RlVHlwZSE9PTExP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Zi5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPWYubWFwKHRoaXMsYixjKTtMLnRlc3QoYSl8fChkPWMpLGQmJnR5cGVvZiBkPT0ic3RyaW5nIiYmKGU9Zi5maWx0ZXIoZCxlKSksZT10aGlzLmxlbmd0aD4xJiYhUlthXT9mLnVuaXF1ZShlKTplLCh0aGlzLmxlbmd0aD4xfHxOLnRlc3QoZCkpJiZNLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSxhLFAuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSksZi5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsYyl7YyYmKGE9Ijpub3QoIithKyIpIik7cmV0dXJuIGIubGVuZ3RoPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmYuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGMsZCl7dmFyIGU9W10sZz1hW2NdO3doaWxlKGcmJmcubm9kZVR5cGUhPT05JiYoZD09PWJ8fGcubm9kZVR5cGUhPT0xfHwhZihnKS5pcyhkKSkpZy5ub2RlVHlwZT09PTEmJmUucHVzaChnKSxnPWdbY107cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsYyxkKXtiPWJ8fDE7dmFyIGU9MDtmb3IoO2E7YT1hW2NdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2U9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7dmFyIGM9W107Zm9yKDthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KTt2YXIgVj0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGNhbnZhc3xkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsVz0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFg9L15ccysvLFk9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZyxaPS88KFtcdzpdKykvLCQ9Lzx0Ym9keS9pLF89Lzx8JiM/XHcrOy8sYmE9LzwoPzpzY3JpcHR8c3R5bGUpL2ksYmI9LzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSxiYz1uZXcgUmVnRXhwKCI8KD86IitWKyIpIiwiaSIpLGJkPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJlPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmY9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmc9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYmg9VShjKTtiZy5vcHRncm91cD1iZy5vcHRpb24sYmcudGJvZHk9YmcudGZvb3Q9YmcuY29sZ3JvdXA9YmcuY2FwdGlvbj1iZy50aGVhZCxiZy50aD1iZy50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJnLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MudGV4dChhLmNhbGwodGhpcyxiLGMudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9Im9iamVjdCImJmEhPT1iKXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gZi50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1mKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Yubm9kZU5hbWUodGhpcywiYm9keSIpfHxmKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPWYuY2xlYW4oYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGEsImJlZm9yZSIsYXJndW1lbnRzKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmLmNsZWFuKGFyZ3VtZW50cykpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZDsoZD10aGlzW2NdKSE9bnVsbDtjKyspaWYoIWF8fGYuZmlsdGVyKGEsW2RdKS5sZW5ndGgpIWImJmQubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSxmLmNsZWFuRGF0YShbZF0pKSxkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKQp7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09YilyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShXLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJhLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFYLnRlc3QoYSkpJiYhYmdbKFouZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3RyeXtmb3IodmFyIGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspdGhpc1tjXS5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YSh0aGlzW2NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHRoaXNbY10uaW5uZXJIVE1MPWEpfWNhdGNoKGUpe3RoaXMuZW1wdHkoKS5hcHBlbmQoYSl9fWVsc2UgZi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MuaHRtbChhLmNhbGwodGhpcyxiLGMuaHRtbCgpKSl9KTp0aGlzLmVtcHR5KCkuYXBwZW5kKGEpO3JldHVybiB0aGlzfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihhKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyksZD1jLmh0bWwoKTtjLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZCkpfSk7dHlwZW9mIGEhPSJzdHJpbmciJiYoYT1mKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxjPXRoaXMucGFyZW50Tm9kZTtmKHRoaXMpLnJlbW92ZSgpLGI/ZihiKS5iZWZvcmUoYSk6ZihjKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2soZihmLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSk6dGhpc30sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpLGo9YVswXSxrPVtdO2lmKCFmLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYmQudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5kb21NYW5pcChhLGMsZCwhMCl9KTtpZihmLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZz1mKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2cuaHRtbCgpOmIpLGcuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7aT1qJiZqLnBhcmVudE5vZGUsZi5zdXBwb3J0LnBhcmVudE5vZGUmJmkmJmkubm9kZVR5cGU9PT0xMSYmaS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP2U9e2ZyYWdtZW50Oml9OmU9Zi5idWlsZEZyYWdtZW50KGEsdGhpcyxrKSxoPWUuZnJhZ21lbnQsaC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/Zz1oPWguZmlyc3RDaGlsZDpnPWguZmlyc3RDaGlsZDtpZihnKXtjPWMmJmYubm9kZU5hbWUoZywidHIiKTtmb3IodmFyIGw9MCxtPXRoaXMubGVuZ3RoLG49bS0xO2w8bTtsKyspZC5jYWxsKGM/YmkodGhpc1tsXSxnKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHxtPjEmJmw8bj9mLmNsb25lKGgsITAsITApOmgpfWsubGVuZ3RoJiZmLmVhY2goayxicCl9cmV0dXJuIHRoaXN9fSksZi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxnLGgsaSxqPWFbMF07YiYmYlswXSYmKGk9YlswXS5vd25lckRvY3VtZW50fHxiWzBdKSxpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnR8fChpPWMpLGEubGVuZ3RoPT09MSYmdHlwZW9mIGo9PSJzdHJpbmciJiZqLmxlbmd0aDw1MTImJmk9PT1jJiZqLmNoYXJBdCgwKT09PSI8IiYmIWJiLnRlc3QoaikmJihmLnN1cHBvcnQuY2hlY2tDbG9uZXx8IWJkLnRlc3QoaikpJiYoZi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KGopKSYmKGc9ITAsaD1mLmZyYWdtZW50c1tqXSxoJiZoIT09MSYmKGU9aCkpLGV8fChlPWkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGYuY2xlYW4oYSxpLGUsZCkpLGcmJihmLmZyYWdtZW50c1tqXT1oP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmd9fSxmLmZyYWdtZW50cz17fSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyl7dmFyIGQ9W10sZT1mKGMpLGc9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZyYmZy5ub2RlVHlwZT09PTExJiZnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZS5sZW5ndGg9PT0xKXtlW2JdKHRoaXNbMF0pO3JldHVybiB0aGlzfWZvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9KGg+MD90aGlzLmNsb25lKCEwKTp0aGlzKS5nZXQoKTtmKGVbaF0pW2JdKGopLGQ9ZC5jb25jYXQoail9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQsYSxlLnNlbGVjdG9yKX19KSxmLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZyxoPWYuc3VwcG9ydC5odG1sNUNsb25lfHwhYmMudGVzdCgiPCIrYS5ub2RlTmFtZSk/YS5jbG9uZU5vZGUoITApOmJvKGEpO2lmKCghZi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IWYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihhLm5vZGVUeXBlPT09MXx8YS5ub2RlVHlwZT09PTExKSYmIWYuaXNYTUxEb2MoYSkpe2JrKGEsaCksZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpZVtnXSYmYmsoZFtnXSxlW2ddKX1pZihiKXtiaihhLGgpO2lmKGMpe2Q9YmwoYSksZT1ibChoKTtmb3IoZz0wO2RbZ107KytnKWJqKGRbZ10sZVtnXSl9fWQ9ZT1udWxsO3JldHVybiBofSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZztiPWJ8fGMsdHlwZW9mIGIuY3JlYXRlRWxlbWVudD09InVuZGVmaW5lZCImJihiPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxjKTt2YXIgaD1bXSxpO2Zvcih2YXIgaj0wLGs7KGs9YVtqXSkhPW51bGw7aisrKXt0eXBlb2Ygaz09Im51bWJlciImJihrKz0iIik7aWYoIWspY29udGludWU7aWYodHlwZW9mIGs9PSJzdHJpbmciKWlmKCFfLnRlc3Qoaykpaz1iLmNyZWF0ZVRleHROb2RlKGspO2Vsc2V7az1rLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dmFyIGw9KFouZXhlYyhrKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxtPWJnW2xdfHxiZy5fZGVmYXVsdCxuPW1bMF0sbz1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2I9PT1jP2JoLmFwcGVuZENoaWxkKG8pOlUoYikuYXBwZW5kQ2hpbGQobyksby5pbm5lckhUTUw9bVsxXStrK21bMl07d2hpbGUobi0tKW89by5sYXN0Q2hpbGQ7aWYoIWYuc3VwcG9ydC50Ym9keSl7dmFyIHA9JC50ZXN0KGspLHE9bD09PSJ0YWJsZSImJiFwP28uZmlyc3RDaGlsZCYmby5maXJzdENoaWxkLmNoaWxkTm9kZXM6bVsxXT09PSI8dGFibGU+IiYmIXA/by5jaGlsZE5vZGVzOltdO2ZvcihpPXEubGVuZ3RoLTE7aT49MDstLWkpZi5ub2RlTmFtZShxW2ldLCJ0Ym9keSIpJiYhcVtpXS5jaGlsZE5vZGVzLmxlbmd0aCYmcVtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHFbaV0pfSFmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJlgudGVzdChrKSYmby5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShYLmV4ZWMoaylbMF0pLG8uZmlyc3RDaGlsZCksaz1vLmNoaWxkTm9kZXN9dmFyIHI7aWYoIWYuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWlmKGtbMF0mJnR5cGVvZiAocj1rLmxlbmd0aCk9PSJudW1iZXIiKWZvcihpPTA7aTxyO2krKylibihrW2ldKTtlbHNlIGJuKGspO2subm9kZVR5cGU/aC5wdXNoKGspOmg9Zi5tZXJnZShoLGspfWlmKGQpe2c9ZnVuY3Rpb24oYSl7cmV0dXJuIWEudHlwZXx8YmUudGVzdChhLnR5cGUpfTtmb3Ioaj0wO2hbal07aisrKWlmKGUmJmYubm9kZU5hbWUoaFtqXSwic2NyaXB0IikmJighaFtqXS50eXBlfHxoW2pdLnR5cGUudG9Mb3dlckNhc2UoKT09PSJ0ZXh0L2phdmFzY3JpcHQiKSllLnB1c2goaFtqXS5wYXJlbnROb2RlP2hbal0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoW2pdKTpoW2pdKTtlbHNle2lmKGhbal0ubm9kZVR5cGU9PT0xKXt2YXIgcz1mLmdyZXAoaFtqXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksZyk7aC5zcGxpY2UuYXBwbHkoaCxbaisxLDBdLmNvbmNhdChzKSl9ZC5hcHBlbmRDaGlsZChoW2pdKX19cmV0dXJuIGh9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXt2YXIgYixjLGQ9Zi5jYWNoZSxlPWYuZXZlbnQuc3BlY2lhbCxnPWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvO2Zvcih2YXIgaD0wLGk7KGk9YVtoXSkhPW51bGw7aCsrKXtpZihpLm5vZGVOYW1lJiZmLm5vRGF0YVtpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKWNvbnRpbnVlO2M9aVtmLmV4cGFuZG9dO2lmKGMpe2I9ZFtjXTtpZihiJiZiLmV2ZW50cyl7Zm9yKHZhciBqIGluIGIuZXZlbnRzKWVbal0/Zi5ldmVudC5yZW1vdmUoaSxqKTpmLnJlbW92ZUV2ZW50KGksaixiLmhhbmRsZSk7Yi5oYW5kbGUmJihiLmhhbmRsZS5lbGVtPW51bGwpfWc/ZGVsZXRlIGlbZi5leHBhbmRvXTppLnJlbW92ZUF0dHJpYnV0ZSYmaS5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKSxkZWxldGUgZFtjXX19fX0pO3ZhciBicT0vYWxwaGFcKFteKV0qXCkvaSxicj0vb3BhY2l0eT0oW14pXSopLyxicz0vKFtBLVpdfF5tcykvZyxidD0vXi0/XGQrKD86cHgpPyQvaSxidT0vXi0/XGQvLGJ2PS9eKFtcLStdKT0oW1wtKy5cZGVdKykvLGJ3PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxieD1bIkxlZnQiLCJSaWdodCJdLGJ5PVsiVG9wIiwiQm90dG9tIl0sYnosYkEsYkI7Zi5mbi5jc3M9ZnVuY3Rpb24oYSxjKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MiYmYz09PWIpcmV0dXJuIHRoaXM7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxjLCEwLGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gZCE9PWI/Zi5zdHlsZShhLGMsZCk6Zi5jc3MoYSxjKX0pfSxmLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWJ6KGEsIm9wYWNpdHkiLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y31yZXR1cm4gYS5zdHlsZS5vcGFjaXR5fX19LGNzc051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOmYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFhJiZhLm5vZGVUeXBlIT09MyYmYS5ub2RlVHlwZSE9PTgmJiEhYS5zdHlsZSl7dmFyIGcsaCxpPWYuY2FtZWxDYXNlKGMpLGo9YS5zdHlsZSxrPWYuY3NzSG9va3NbaV07Yz1mLmNzc1Byb3BzW2ldfHxpO2lmKGQ9PT1iKXtpZihrJiYiZ2V0ImluIGsmJihnPWsuZ2V0KGEsITEsZSkpIT09YilyZXR1cm4gZztyZXR1cm4galtjXX1oPXR5cGVvZiBkLGg9PT0ic3RyaW5nIiYmKGc9YnYuZXhlYyhkKSkmJihkPSsoZ1sxXSsxKSorZ1syXStwYXJzZUZsb2F0KGYuY3NzKGEsYykpLGg9Im51bWJlciIpO2lmKGQ9PW51bGx8fGg9PT0ibnVtYmVyIiYmaXNOYU4oZCkpcmV0dXJuO2g9PT0ibnVtYmVyIiYmIWYuY3NzTnVtYmVyW2ldJiYoZCs9InB4Iik7aWYoIWt8fCEoInNldCJpbiBrKXx8KGQ9ay5zZXQoYSxkKSkhPT1iKXRyeXtqW2NdPWR9Y2F0Y2gobCl7fX19LGNzczpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZztjPWYuY2FtZWxDYXNlKGMpLGc9Zi5jc3NIb29rc1tjXSxjPWYuY3NzUHJvcHNbY118fGMsYz09PSJjc3NGbG9hdCImJihjPSJmbG9hdCIpO2lmKGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxkKSkhPT1iKXJldHVybiBlO2lmKGJ6KXJldHVybiBieihhLGMpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fTtmb3IodmFyIGUgaW4gYilkW2VdPWEuc3R5bGVbZV0sYS5zdHlsZVtlXT1iW2VdO2MuY2FsbChhKTtmb3IoZSBpbiBiKWEuc3R5bGVbZV09ZFtlXX19KSxmLmN1ckNTUz1mLmNzcyxmLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZTtpZihjKXtpZihhLm9mZnNldFdpZHRoIT09MClyZXR1cm4gYkMoYSxiLGQpO2Yuc3dhcChhLGJ3LGZ1bmN0aW9uKCl7ZT1iQyhhLGIsZCl9KTtyZXR1cm4gZX19LHNldDpmdW5jdGlvbihhLGIpe2lmKCFidC50ZXN0KGIpKXJldHVybiBiO2I9cGFyc2VGbG9hdChiKTtpZihiPj0wKXJldHVybiBiKyJweCJ9fX0pLGYuc3VwcG9ydC5vcGFjaXR5fHwoZi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYnIudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpP3BhcnNlRmxvYXQoUmVnRXhwLiQxKS8xMDArIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPWYuaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrYioxMDArIikiOiIiLGc9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MTtpZihiPj0xJiZmLnRyaW0oZy5yZXBsYWNlKGJxLCIiKSk9PT0iIil7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9YnEudGVzdChnKT9nLnJlcGxhY2UoYnEsZSk6ZysiICIrZX19KSxmKGZ1bmN0aW9uKCl7Zi5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChmLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYztmLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sZnVuY3Rpb24oKXtiP2M9YnooYSwibWFyZ2luLXJpZ2h0IiwibWFyZ2luUmlnaHQiKTpjPWEuc3R5bGUubWFyZ2luUmlnaHR9KTtyZXR1cm4gY319KX0pLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGJBPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2I9Yi5yZXBsYWNlKGJzLCItJDEiKS50b0xvd2VyQ2FzZSgpLChkPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykmJihlPWQuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKSYmKGM9ZS5nZXRQcm9wZXJ0eVZhbHVlKGIpLGM9PT0iIiYmIWYuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGM9Zi5zdHlsZShhLGIpKSk7cmV0dXJuIGN9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiQj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09PW51bGwmJmcmJihlPWdbYl0pJiYoZj1lKSwhYnQudGVzdChmKSYmYnUudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDAsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYno9YkF8fGJCLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYkQ9LyUyMC9nLGJFPS9cW1xdJC8sYkY9L1xyP1xuL2csYkc9LyMuKiQvLGJIPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYkk9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJKPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYks9L14oPzpHRVR8SEVBRCkkLyxiTD0vXlwvXC8vLGJNPS9cPy8sYk49LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYk89L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYlA9L1xzKy8sYlE9LyhbPyZdKV89W14mXSovLGJSPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiUz1mLmZuLmxvYWQsYlQ9e30sYlU9e30sYlYsYlcsYlg9WyIqLyJdK1siKiJdO3RyeXtiVj1lLmhyZWZ9Y2F0Y2goYlkpe2JWPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJWLmhyZWY9IiIsYlY9YlYuaHJlZn1iVz1iUi5leGVjKGJWLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiUylyZXR1cm4gYlMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYk4sIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJPLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJJLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJGLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiRiwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksZi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYyl7ZltjXT1mdW5jdGlvbihhLGQsZSxnKXtmLmlzRnVuY3Rpb24oZCkmJihnPWd8fGUsZT1kLGQ9Yik7cmV0dXJuIGYuYWpheCh7dHlwZTpjLHVybDphLGRhdGE6ZCxzdWNjZXNzOmUsZGF0YVR5cGU6Z30pfX0pLGYuZXh0ZW5kKHtnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZi5nZXQoYSxiLGMsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5nZXQoYSxiLGMsImpzb24iKX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7Yj9iXyhhLGYuYWpheFNldHRpbmdzKTooYj1hLGE9Zi5hamF4U2V0dGluZ3MpLGJfKGEsYik7cmV0dXJuIGF9LGFqYXhTZXR0aW5nczp7dXJsOmJWLGlzTG9jYWw6YkoudGVzdChiV1sxXSksZ2xvYmFsOiEwLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHRleHQ6InRleHQvcGxhaW4iLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsIioiOmJYfSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0In0sY29udmVydGVyczp7IiogdGV4dCI6YS5TdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6Zi5wYXJzZUpTT04sInRleHQgeG1sIjpmLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7Y29udGV4dDohMCx1cmw6ITB9fSxhamF4UHJlZmlsdGVyOmJaKGJUKSxhamF4VHJhbnNwb3J0OmJaKGJVKSxhamF4OmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gdyhhLGMsbCxtKXtpZihzIT09Mil7cz0yLHEmJmNsZWFyVGltZW91dChxKSxwPWIsbj1tfHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MDt2YXIgbyxyLHUsdz1jLHg9bD9jYihkLHYsbCk6Yix5LHo7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNCl7aWYoZC5pZk1vZGlmaWVkKXtpZih5PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSlmLmxhc3RNb2RpZmllZFtrXT15O2lmKHo9di5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpKWYuZXRhZ1trXT16fWlmKGE9PT0zMDQpdz0ibm90bW9kaWZpZWQiLG89ITA7ZWxzZSB0cnl7cj1jYyhkLHgpLHc9InN1Y2Nlc3MiLG89ITB9Y2F0Y2goQSl7dz0icGFyc2VyZXJyb3IiLHU9QX19ZWxzZXt1PXc7aWYoIXd8fGEpdz0iZXJyb3IiLGE8MCYmKGE9MCl9di5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9IiIrKGN8fHcpLG8/aC5yZXNvbHZlV2l0aChlLFtyLHcsdl0pOmgucmVqZWN0V2l0aChlLFt2LHcsdV0pLHYuc3RhdHVzQ29kZShqKSxqPWIsdCYmZy50cmlnZ2VyKCJhamF4Iisobz8iU3VjY2VzcyI6IkVycm9yIiksW3YsZCxvP3I6dV0pLGkuZmlyZVdpdGgoZSxbdix3XSksdCYmKGcudHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixkXSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKX19dHlwZW9mIGE9PSJvYmplY3QiJiYoYz1hLGE9YiksYz1jfHx7fTt2YXIgZD1mLmFqYXhTZXR1cCh7fSxjKSxlPWQuY29udGV4dHx8ZCxnPWUhPT1kJiYoZS5ub2RlVHlwZXx8ZSBpbnN0YW5jZW9mIGYpP2YoZSk6Zi5ldmVudCxoPWYuRGVmZXJyZWQoKSxpPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGo9ZC5zdGF0dXNDb2RlfHx7fSxrLGw9e30sbT17fSxuLG8scCxxLHIscz0wLHQsdSx2PXtyZWFkeVN0YXRlOjAsc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe2lmKCFzKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7YT1tW2NdPW1bY118fGEsbFthXT1ifXJldHVybiB0aGlzfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcz09PTI/bjpudWxsfSxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYztpZihzPT09Mil7aWYoIW8pe289e307d2hpbGUoYz1iSC5leGVjKG4pKW9bY1sxXS50b0xvd2VyQ2FzZSgpXT1jWzJdfWM9b1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBjPT09Yj9udWxsOmN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7c3x8KGQubWltZVR5cGU9YSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe2E9YXx8ImFib3J0IixwJiZwLmFib3J0KGEpLHcoMCxhKTtyZXR1cm4gdGhpc319O2gucHJvbWlzZSh2KSx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLHYuY29tcGxldGU9aS5hZGQsdi5zdGF0dXNDb2RlPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiO2lmKHM8Milmb3IoYiBpbiBhKWpbYl09W2pbYl0sYVtiXV07ZWxzZSBiPWFbdi5zdGF0dXNdLHYudGhlbihiLGIpfXJldHVybiB0aGlzfSxkLnVybD0oKGF8fGQudXJsKSsiIikucmVwbGFjZShiRywiIikucmVwbGFjZShiTCxiV1sxXSsiLy8iKSxkLmRhdGFUeXBlcz1mLnRyaW0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KGJQKSxkLmNyb3NzRG9tYWluPT1udWxsJiYocj1iUi5leGVjKGQudXJsLnRvTG93ZXJDYXNlKCkpLGQuY3Jvc3NEb21haW49ISghcnx8clsxXT09YldbMV0mJnJbMl09PWJXWzJdJiYoclszXXx8KHJbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0oYldbM118fChiV1sxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJnR5cGVvZiBkLmRhdGEhPSJzdHJpbmciJiYoZC5kYXRhPWYucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSxiJChiVCxkLGMsdik7aWYocz09PTIpcmV0dXJuITE7dD1kLmdsb2JhbCxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFiSy50ZXN0KGQudHlwZSksdCYmZi5hY3RpdmUrKz09PTAmJmYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWQuaGFzQ29udGVudCl7ZC5kYXRhJiYoZC51cmwrPShiTS50ZXN0KGQudXJsKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksaz1kLnVybDtpZihkLmNhY2hlPT09ITEpe3ZhciB4PWYubm93KCkseT1kLnVybC5yZXBsYWNlKGJRLCIkMV89Iit4KTtkLnVybD15Kyh5PT09ZC51cmw/KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpKyJfPSIreDoiIil9fShkLmRhdGEmJmQuaGFzQ29udGVudCYmZC5jb250ZW50VHlwZSE9PSExfHxjLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLGQuaWZNb2RpZmllZCYmKGs9a3x8ZC51cmwsZi5sYXN0TW9kaWZpZWRba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGYubGFzdE1vZGlmaWVkW2tdKSxmLmV0YWdba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW2tdKSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKGQuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrYlgrIjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pO2Zvcih1IGluIGQuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIodSxkLmhlYWRlcnNbdV0pO2lmKGQuYmVmb3JlU2VuZCYmKGQuYmVmb3JlU2VuZC5jYWxsKGUsdixkKT09PSExfHxzPT09Mikpe3YuYWJvcnQoKTtyZXR1cm4hMX1mb3IodSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W3VdKGRbdV0pO3A9YiQoYlUsZCxjLHYpO2lmKCFwKXcoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7di5yZWFkeVN0YXRlPTEsdCYmZy50cmlnZ2VyKCJhamF4U2VuZCIsW3YsZF0pLGQuYXN5bmMmJmQudGltZW91dD4wJiYocT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7cz0xLHAuc2VuZChsLHcpfWNhdGNoKHope2lmKHM8Mil3KC0xLHopO2Vsc2UgdGhyb3cgen19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpY2EoZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkQsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2Q9Zi5ub3coKSxjZT0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjZCsrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuY29udGVudFR5cGU9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmdHlwZW9mIGIuZGF0YT09InN0cmluZyI7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZS50ZXN0KGIudXJsKXx8ZSYmY2UudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2UsbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNlLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2Y9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNoKWNoW2FdKDAsMSl9OiExLGNnPTAsY2g7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNpKCl8fGNqKCl9OmNpLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2YmJmRlbGV0ZSBjaFtpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pLG0udGV4dD1oLnJlc3BvbnNlVGV4dDt0cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjZyxjZiYmKGNofHwoY2g9e30sZihhKS51bmxvYWQoY2YpKSxjaFtpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY2s9e30sY2wsY20sY249L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNvPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY3AsY3E9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3I7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdSgic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSxlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lIiYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjdihkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdSgiaGlkZSIsMyksYSxiLGMpO3ZhciBkLGUsZz0wLGg9dGhpcy5sZW5ndGg7Zm9yKDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1mLmNzcyhkLCJkaXNwbGF5IiksZSE9PSJub25lIiYmIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGUpKTtmb3IoZz0wO2c8aDtnKyspdGhpc1tnXS5zdHlsZSYmKHRoaXNbZ10uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjdSgidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBnKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG87Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSksaD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN2KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNuLnRlc3QoaCk/KG89Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxvPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxvPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbb10oKSk6altoXSgpKTooaz1jby5leGVjKGgpLGw9ai5jdXIoKSxrPyhtPXBhcnNlRmxvYXQoa1syXSksbj1rWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IiksbiE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwobXx8MSkrbiksbD0obXx8MSkvai5jdXIoKSpsLGYuc3R5bGUodGhpcyxpLGwrbikpLGtbMV0mJihtPShrWzFdPT09Ii09Ij8tMToxKSptK2wpLGouY3VzdG9tKGwsbSxuKSk6ai5jdXN0b20obCxoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0mJmdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3UoInNob3ciLDEpLHNsaWRlVXA6Y3UoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN1KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjK2QqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjUpKmQrY319LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jcnx8Y3MoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2Uub3B0aW9ucy5oaWRlJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3ApPT09YiYmZi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjcCYmKGNwPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3J8fGNzKCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY3ApLGNwPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykrYS51bml0KX19KSxmLmV4cHImJmYuZXhwci5maWx0ZXJzJiYoZi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZ3JlcChmLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBjdz0vXnQoPzphYmxlfGR8aCkkL2ksY3g9L14oPzpib2R5fGh0bWwpJC9pOyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gYy5kb2N1bWVudEVsZW1lbnQ/Zi5mbi5vZmZzZXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxjO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtjPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZCl7fXZhciBlPWIub3duZXJEb2N1bWVudCxnPWUuZG9jdW1lbnRFbGVtZW50O2lmKCFjfHwhZi5jb250YWlucyhnLGIpKXJldHVybiBjP3t0b3A6Yy50b3AsbGVmdDpjLmxlZnR9Ont0b3A6MCxsZWZ0OjB9O3ZhciBoPWUuYm9keSxpPWN5KGUpLGo9Zy5jbGllbnRUb3B8fGguY2xpZW50VG9wfHwwLGs9Zy5jbGllbnRMZWZ0fHxoLmNsaWVudExlZnR8fDAsbD1pLnBhZ2VZT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmcuc2Nyb2xsVG9wfHxoLnNjcm9sbFRvcCxtPWkucGFnZVhPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxMZWZ0fHxoLnNjcm9sbExlZnQsbj1jLnRvcCtsLWosbz1jLmxlZnQrbS1rO3JldHVybnt0b3A6bixsZWZ0Om99fTpmLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3ZhciBjLGQ9Yi5vZmZzZXRQYXJlbnQsZT1iLGc9Yi5vd25lckRvY3VtZW50LGg9Zy5kb2N1bWVudEVsZW1lbnQsaT1nLmJvZHksaj1nLmRlZmF1bHRWaWV3LGs9aj9qLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSxsPWIub2Zmc2V0VG9wLG09Yi5vZmZzZXRMZWZ0O3doaWxlKChiPWIucGFyZW50Tm9kZSkmJmIhPT1pJiZiIT09aCl7aWYoZi5zdXBwb3J0LmZpeGVkUG9zaXRpb24mJmsucG9zaXRpb249PT0iZml4ZWQiKWJyZWFrO2M9aj9qLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSxsLT1iLnNjcm9sbFRvcCxtLT1iLnNjcm9sbExlZnQsYj09PWQmJihsKz1iLm9mZnNldFRvcCxtKz1iLm9mZnNldExlZnQsZi5zdXBwb3J0LmRvZXNOb3RBZGRCb3JkZXImJighZi5zdXBwb3J0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzfHwhY3cudGVzdChiLm5vZGVOYW1lKSkmJihsKz1wYXJzZUZsb2F0KGMuYm9yZGVyVG9wV2lkdGgpfHwwLG0rPXBhcnNlRmxvYXQoYy5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxlPWQsZD1iLm9mZnNldFBhcmVudCksZi5zdXBwb3J0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmYy5vdmVyZmxvdyE9PSJ2aXNpYmxlIiYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGs9Y31pZihrLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ay5wb3NpdGlvbj09PSJzdGF0aWMiKWwrPWkub2Zmc2V0VG9wLG0rPWkub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCImJihsKz1NYXRoLm1heChoLnNjcm9sbFRvcCxpLnNjcm9sbFRvcCksbSs9TWF0aC5tYXgoaC5zY3JvbGxMZWZ0LGkuc2Nyb2xsTGVmdCkpO3JldHVybnt0b3A6bCxsZWZ0Om19fSxmLm9mZnNldD17Ym9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxjPWEub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmN9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWYuY3NzKGEsInBvc2l0aW9uIik7ZD09PSJzdGF0aWMiJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZT1mKGEpLGc9ZS5vZmZzZXQoKSxoPWYuY3NzKGEsInRvcCIpLGk9Zi5jc3MoYSwibGVmdCIpLGo9KGQ9PT0iYWJzb2x1dGUifHxkPT09ImZpeGVkIikmJmYuaW5BcnJheSgiYXV0byIsW2gsaV0pPi0xLGs9e30sbD17fSxtLG47aj8obD1lLnBvc2l0aW9uKCksbT1sLnRvcCxuPWwubGVmdCk6KG09cGFyc2VGbG9hdChoKXx8MCxuPXBhcnNlRmxvYXQoaSl8fDApLGYuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxnKSksYi50b3AhPW51bGwmJihrLnRvcD1iLnRvcC1nLnRvcCttKSxiLmxlZnQhPW51bGwmJihrLmxlZnQ9Yi5sZWZ0LWcubGVmdCtuKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxrKTplLmNzcyhrKX19LGYuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWN4LnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtjLnRvcC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYy5sZWZ0LT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDAsZC50b3ArPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsZC5sZWZ0Kz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjLmJvZHk7d2hpbGUoYSYmIWN4LnRlc3QoYS5ub2RlTmFtZSkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIilhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSksZi5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9InNjcm9sbCIrYztmLmZuW2RdPWZ1bmN0aW9uKGMpe3ZhciBlLGc7aWYoYz09PWIpe2U9dGhpc1swXTtpZighZSlyZXR1cm4gbnVsbDtnPWN5KGUpO3JldHVybiBnPyJwYWdlWE9mZnNldCJpbiBnP2dbYT8icGFnZVlPZmZzZXQiOiJwYWdlWE9mZnNldCJdOmYuc3VwcG9ydC5ib3hNb2RlbCYmZy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF18fGcuZG9jdW1lbnQuYm9keVtkXTplW2RdfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtnPWN5KHRoaXMpLGc/Zy5zY3JvbGxUbyhhP2YoZykuc2Nyb2xsTGVmdCgpOmMsYT9jOmYoZykuc2Nyb2xsVG9wKCkpOnRoaXNbZF09Y30pfX0pLGYuZWFjaChbIkhlaWdodCIsIldpZHRoIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD1jLnRvTG93ZXJDYXNlKCk7Zi5mblsiaW5uZXIiK2NdPWZ1bmN0aW9uKCl7dmFyIGE9dGhpc1swXTtyZXR1cm4gYT9hLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYSxkLCJwYWRkaW5nIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuWyJvdXRlciIrY109ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtyZXR1cm4gYj9iLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYixkLGE/Im1hcmdpbiI6ImJvcmRlciIpKTp0aGlzW2RdKCk6bnVsbH0sZi5mbltkXT1mdW5jdGlvbihhKXt2YXIgZT10aGlzWzBdO2lmKCFlKXJldHVybiBhPT1udWxsP251bGw6dGhpcztpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2NbZF0oYS5jYWxsKHRoaXMsYixjW2RdKCkpKX0pO2lmKGYuaXNXaW5kb3coZSkpe3ZhciBnPWUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2NdLGg9ZS5kb2N1bWVudC5ib2R5O3JldHVybiBlLmRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJmd8fGgmJmhbImNsaWVudCIrY118fGd9aWYoZS5ub2RlVHlwZT09PTkpcmV0dXJuIE1hdGgubWF4KGUuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2NdLGUuYm9keVsic2Nyb2xsIitjXSxlLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIitjXSxlLmJvZHlbIm9mZnNldCIrY10sZS5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIrY10pO2lmKGE9PT1iKXt2YXIgaT1mLmNzcyhlLGQpLGo9cGFyc2VGbG9hdChpKTtyZXR1cm4gZi5pc051bWVyaWMoaik/ajppfXJldHVybiB0aGlzLmNzcyhkLHR5cGVvZiBhPT0ic3RyaW5nIj9hOmErInB4Iil9fSksYS5qUXVlcnk9YS4kPWYsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBmfSl9KSh3aW5kb3cpOw=='
jsList = [onejsn, twojsn, threejsn, fourjsn, fivejsn, sixjsn, sevenjsn, eightjsn, ninejsn, tenjsn]
jsData = [onejsd, twojsd, threejsd, fourjsd, fivejsd, sixjsd, sevenjsd, eightjsd, ninejsd, tenjsd]
for item in jsList:
a = open(prevram+'/js/'+item, 'w')
b = jsData[jsList.index(item)]
a.write(b.decode('base64'))
a.close()
##################################################
#This is the main report web page generated.
tfpage = '<html>\n<head>\n<style>body{background-color:#404040;}iframe {overflow-x:hidden;width:100%;height:95%;background-color:#FFFFFF;}.main {width:100%;height:100%;}.menuBar {width:100%;height:5%;display:bloolor:#k;top:0;left:0;background-color:#000;}.bmenuBar {width:33.33333%;height:5%;bottom:0px;background-color:#404040;position:absolute;left:33.33333%;}.menuSel {width:33.33333%;height:100%;float:left;color:#2E9AFE;font-weight:bold;}.bmenuSel {width:100%;height:100%;color:#0B0B61;font-weight:bold;}</style><title>Test Page!</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> \r<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>\r<script type="text/javascript" src="js/jquery-ui-1.8.17.custom.min.js"></script>\r<script type="text/javascript" src="js/jspdf.js"></script>\r<script type="text/javascript" src="js/FileSaver.js"></script>\r<script type="text/javascript" src="js/BlobBuilder.js"></script>\r<script type="text/javascript" src="js/jspdf.plugin.addimage.js"></script>\r<script type="text/javascript" src="js/jspdf.plugin.standard_fonts_metrics.js"></script>\r<script type="text/javascript" src="js/jspdf.plugin.split_text_to_size.js"></script>\r<script type="text/javascript" src="js/jspdf.plugin.from_html.js"></script>\r<script type="text/javascript" src="js/basic.js"></script><script type="text/javascript">\r\rfunction genRep() {\rvar rep = new jsPDF();\rrep.setFontSize(20)\rrep.text(20, 8, "PyReview Generated Report")\rrep.setLineWidth(1.5)\rrep.line(20, 10, 190, 10)\rvar cnt = 0;\rvar cnt2 = 15;\rvar arrlen = genL.length;\rfor (var i = 0; i < arrlen; i++){\rvar spanId = "span"+genL[i];\rvar imgInfo = document.getElementById(spanId).innerHTML;\rvar imgArr = imgInfo.split("*");\rvar imgData = imgArr[0];\rvar imgPath = imgArr[1];\rvar imgHmd5 = imgArr[2];\rvar imgHsha = imgArr[3];\rrep.setFontSize(10);\r\rif (imgPath.length > 100){\rrep.setFontSize(7);\r}\rif (imgPath.length > 150){\rrep.setFontSize(4);\r}\rrep.addImage(imgData, "JPEG", 15, cnt2, 32, 32);\rrep.text(15, cnt2+36, "PATH: "+imgPath);\rrep.setFontSize(10);\rrep.text(15, cnt2+40, "MD5: "+imgHmd5);\rrep.text(15, cnt2+44, "SHA1: "+imgHsha);\rcnt = cnt + 1;\rcnt2 = cnt2 + 45;\rif (cnt % 5 === 0)\r{\rcnt2 = 15;\rrep.addPage();\r}\r}\rrep.save("Report.pdf");\r}\rgenL = new Array();\rpageNo = 0;\rfunction chgSrc(repSelect) {\rdocument.getElementById("framePage").src=(repSelect);\rpageNo = document.getElementById("selOpt").selectedIndex;\r}\rfunction prevP() {\rif(pageNo > 0) { pageNo--; }\rvar baseUrl = document.getElementById("baseurl").innerHTML;\rvar prevEl = document.getElementById("framePage");\rprevEl.src = baseUrl + pageNo + ".html";\rvar selOpt = document.getElementById("selOpt");\rselOpt.selectedIndex=pageNo;\r}\rfunction nextP() {\rvar lPageNo = document.getElementById("lPageNo").innerHTML;\rif(pageNo<lPageNo) { pageNo++; }\rvar baseUrl = document.getElementById("baseurl").innerHTML;\rvar nextEl = document.getElementById("framePage");\rnextEl.src = baseUrl + pageNo + ".html";\rvar selOpt = document.getElementById("selOpt");\rselOpt.selectedIndex=pageNo;\r}\r</script></head><body><center><div class="main"><div class="menuBar"><div class="menuSel">Preview Report</div><div class="menuSel"><a href="'+prevram+'/html/log.html">Log</a></div><div class="menuSel"><input type="button" onClick="genRep()" value="Generate Report"></div></div><iframe src="'+prevram+'/html/page0.html" frameBorder="0" id="framePage"></iframe><div class="bmenuBar"><div class="bmenuSel"><input type="button" onClick="prevP()" value="Previous"><select id="selOpt">'
cOpts = ''
fOpts = ''
##################################################
#This is a iframe page that is used in the main report web page, these are generated per 1,000 thumbnails.
topP = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style>td\r{\rborder: 2px solid #0B0B61;\rwidth:150px;\rheight:150px;\r}\r.topImg {\rwidth:100%;\rheight:129px;\r}\r.botChk {\rwidth:100%;\rheight:21px;\r}\rimg {\rfloat:left;\r}\rinput {\rfloat:right;\r}\r</style><script type="text/javascript">\rfunction repGenChk(valNam) {\rvar chkN = valNam.id;\rif (parent.genL.indexOf(chkN)>=0) { var index = parent.genL.indexOf(chkN); parent.genL.splice(index, 1);}\relse { parent.genL.push(chkN); }\r}\rwindow.onload = function chkSet() {\rfor (var i = 0; i < parent.genL.length; i++) {\rif (document.getElementById(parent.genL[i]) != null) { document.getElementById(parent.genL[i]).checked=true; }\r}\r}\rfunction fillCans() {\rvar cnt = document.getElementById("pgCnt").innerHTML;\rvar cnt = cnt.split("-");\rvar cnt1 = cnt[0];\rvar cnt2 = cnt[1];\rfor (var i=cnt1; i <= cnt2; i++) {\r(function(iterable){\rvar c = document.getElementById("can"+iterable);\rvar ctx = c.getContext("2d");\rctx.fillStyle="#FFFFFF";\rctx.fillRect(0,0,128,128);\rvar image = new Image();\rvar imgSrc = parent.document.getElementById("span"+iterable).innerHTML;\rimgSrc = imgSrc.split("*");\rimage.onload = function() {\rctx.drawImage(image, 0, 0);\r};\rimage.src = imgSrc[0];\r})(i);\r}\r}\r</script></head><body onload="fillCans()"><center><table><tr>'
midP = '</table><hr><br /><br />'
botP = '</center></body></html>'
print 'Generating report...'
##################################################
#Here we create thumbnails for each item in the filelist, then do some hashing for each item and create some inline HTML data for the main page which is used in the generation of the pdf report.
for item in filelist:
try:
alti = item.split('/')
alti[0:3] = []
alti = 'root/'+'/'.join(alti)
thumb = Image.open(item)
thumb.thumbnail(size, Image.ANTIALIAS)
imgbuf = StringIO()
thumb.convert('RGB').save(imgbuf, "JPEG")
imgb64 = imgbuf.getvalue()
imgb64e = 'data:image/jpeg;base64,'+base64.b64encode(imgb64)
m = hashlib.md5()
m.update(open(item, 'rb').read())
altmd5 = m.hexdigest()
s = hashlib.sha1()
s.update(open(item, 'rb').read())
altsha = s.hexdigest()
repb = '<td>\r<a href="'+item+'"><div class="topImg">\r<canvas id="can'+str(cnt)+'" width="128" height="128" title="'+str(alti)+'"></canvas>\r</a>\r</div>\r<div class=botChk">\r<input type="checkbox" id="'+str(cnt)+'" onClick="repGenChk(this);">\r</div>\r</td>'
repm = repm+repb
span = span+'\r<span id="span'+str(cnt)+'" style="display:none;">'+imgb64e+'*'+alti+'*'+altmd5+'*'+altsha+'</span>\r'
if cnt % 8 == 0:
repm = repm+'\r</tr>\r<tr>\r'
if cnt % 1000 == 0:
cOpts = '\r<option id="opt'+str(ptit)+'" onClick="chgSrc('+"'"+prevram+'/html/page'+str(ptit)+'.html'+"'"+');">Page '+str(ptit+1)+'\r</option>'
fOpts = fOpts+cOpts
repm = repm+'</tr>'
repp = topP+repm+midP+'<span id="pgCnt" style="display:none;">'+str(cnt-999)+'-'+str(cnt)+'</span>'+botP
reportw = open(prevram+'/html/page'+str(ptit)+'.html', 'w')
reportw.write(repp)
reportw.close()
repm = ''
ptit = ptit+1
cnt = cnt+1
except IOError:
ecnt = ecnt+1
eList.append(alti+": IOError")
except IndexError:
ecnt = ecnt+1
eList.append(alti+": IndexError")
except SyntaxError:
ecnt = ecnt+1
eList.append(alti+": SyntaxError")
except KeyboardInterrupt:
print "Caught keyboard interrupt. Mounted evidence and script generated files are likely located in /tmp/ under prevramX and prevmntX directories."
##################################################
#More creation of the web pages and report, basically gluing all the HTML data together and writing the actual report HTML files down to the mounted ram disk.
repe = ''
for item in eList:
repe = repe+'<br>'+item
if cnt <= 1000:
repp = topP+repm+midP+'<span id="pgCnt" style="display:none;">1-'+str(cnt-1)+'</span>'+botP
reportw = open(prevram+'/html/page'+str(ptit)+'.html', 'w')
reportw.write(repp)
reportw.close()
##################################################
#bfpage var. is the selection menu on the bottom of the preview html page.
bfpage = '</select>\r<input type="button" onClick="nextP()" value="Next"></div></div></div></center><span id="baseurl" style="display:none;">'+prevram+'/html/page</span>\r<span id="lPageNo" style="display:none;">'+str(ptit)+'</span>\r'+span+'</body>\r</html>'
cOpts = '\r<option id="opt'+str(ptit)+'" onClick="chgSrc('+"'"+prevram+'/html/page'+str(ptit)+'.html'+"'"+');">Page '+str(ptit+1)+'</option>'
fOpts = fOpts+cOpts
frepp = tfpage+fOpts+bfpage
freportw = open(prevram+'/report.html', 'w')
freportw.write(frepp)
freportw.close()
ereportw = open(prevram+'/html/log.html', 'w')
ereportw.write(repe)
ereportw.close()
#################################################
#This portion is cleanup/finishing. The script will run on selected volume filesystems, if they are unavailable/cannot be mounted, or the RAMDISK cannot be create/used, or some other error prevents the program from gathering evidence it will attempt to run some cleanup procedures. Such as unmounting directorys created from previous runs of the script, deleting defunct prior mount point, etc etc.
if cnt-1 == 0:
print "No items were added to the report, either the volume selected is mounted or there were no detectable image files."
print "\n"
print "Unmounting volumes mounted by script and cleaning up."
print "\n"
print "Sometimes after cleaning up the script will work again, running this script again MIGHT work."
mounts = os.listdir('/tmp/')
for item in mounts:
if item.startswith("prev"):
umpath = '/tmp/'+item
subprocess.Popen(["umount", "-f", umpath], stderr=open(os.devnull, 'wb'))
subprocess.Popen(["rm", "-r", umpath], stderr=open(os.devnull, 'wb'))
else:
print str(cnt-1)+' total items added to preview report...'
print str(ecnt)+' total items skipped due to error. A list of errored items is detailed in the "Log" link on the preview page.'
opn = shlex.split('firefox '+prevram+'/report.html')
subprocess.Popen(opn)