DIR : /home/kozerus/public_html/ko.py3
/home/kozerus/public_html
#!/usr/bin/python
# ko.py 20190225_1605 komeux
# ko.py 20190225_1605 komeux t snake
## ok.py 20190223_0400
# ok.py 20190223_0300
# ht.py 20190222_2200 ok.py def go ... gocmds goread
# pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
# ht.py 20190221_2200 sql3_ko[0,1,2,_0,_1,_2 komenu sql3_INSERTS
# ht.py 20190220_2200 sql3_ko ko ko0 ko1 ko2 ko_...ko9__
# ht.py 20190220_0300 sql3_ko ko ko0 ko1 ko2
# ht.py 20190220_0300 sql3_ko kofiles
# ht.py 20190219_2400 sql3 inserts
# ht.py 20190217_2400 sql_schema import ko_cfg
# ht.py 20190216_1200 _main_ htm_ko_(css,js,htm)
# bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd
# cambodia wild|https://www.youtube.com/watch?v=FKTVGXbV-GM
# ht.py 20190215_2300 _main_ htm_ko_(css,js,htm)
# ht.py 20190215_0303
# x import pymouse
# x import pyautogui
# X import exifread
# X import exiftool
import curses
import sys
import os, time
import re
import subprocess
# import sqlite3
import sqlite3 as db3
import glob
import base64
import ko_cfg
# (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(ifile)
# mp4gif("./index.mp4", "./imgs/mp4gif/index.png", "./imgs/mp4gif/index.gif" )
def ko_dttm(fmt):
import datetime
import time
now = datetime.datetime.now();
today = now.date();
moment = now.time();
today = datetime.date.today()
dttm = now.strftime('%Y-%m-%d_%H:%M:%S') # This writes "06/24/1984"
dt = now.strftime('%Y%m%d_%H%M%S') # This writes "06/24/1984"
tm = now.strftime('%H%M%S') # This writes "06/24/1984"
yyyy = now.strftime('%Y') # This writes "06/24/1984"
yyyymmdd = now.strftime('%Y%m%d') # This writes "06/24/1984"
dt=dttm.replace("-","").replace(":","")
if( fmt == "" ): return(dt)
if( fmt == "dttm"): return(dttm)
if( fmt == "dt"): return(dt)
if( fmt == "tm"): return(tm)
if( fmt == "yyyy"): return(yyyy)
if( fmt == "yyyymmdd"): return(yyyymmdd)
if( fmt == "yyyy"): return(yyyy)
if( fmt == "yyyy"): return(yyyy)
return(dttm)
# pppppppppppppppppppppppppppp
def main_sqlite(args):
import ko_cfg
fildb3=ko_cfg.fildb3
# fildb3="ko.db3"
# database = "C:\\sqlite\db\pythonsqlite.db"
# create a database connection
sql3 = sql3_db(fildb3)
with sql3:
sql3_update_task(sql3, (2, '2015-01-04', '2015-01-06',2))
def sql3_db(fildb3):
# """ create a database connection to the SQLite database
# specified by db_file
# :param db_file: database file
# :return: Connection object or None
# """
try:
sql3 = db3.connect(fildb3)
return sql3
except Exception as e:
# except Exception, e:
print( "e" )
# sql3.rollback()
# print "{} {} ERR sql3_ko1 sql3_db3() {}-{} sqlcmd={} e={}".format(progid,dttm, j,k, sqlcmd, e)
print( "BUGS_14 sql3_insert.py")
raise e
finally:
print( "sql3_ko0 sql3_ko1")
# sql3.close()
# Error as e:
# except as e:
# print(e)
return None
def sql_ver(args):
# import sqlite3 as db3
# import sys
import ko_cfg
dttm=ko_dttm("")
a0=args[0]
fildb3=ko_cfg.fildb3
sqltbl=ko_cfg.sqltbl
sqlcmd=ko_cfg.sqlcmd
if( sqlcmd == "" ): sqlcmd="select sqlite_version()"
print( "{} {} SQL_VER {}-{} fildb3={} sqltbl={} sqlcmd={}".format( progid,dttm, j,k, fildb3, sqltbl, sqlcmd ))
db = None
try:
sql3 = sql3_db(fildbe)
db = sql3.cursor()
db.execute(sqlcmd)
data = db.fetchone()
logtxt = "SQL_VER fildb3={} sqltbl={} sqlcmd={} data={}".format(fildb3, sqltbl, sqlcmd, data)
except db3.Error, e:
# except: db3.Error e:
# except: db3.Error as e:
# except: db3.Error, e:
# except: db3.Error as e:
print "Error {}:".format(e.args[0])
sys.exit(1)
finally:
if db:
db.close()
return()
def sql_pragma(args):
print "SQL_PRAGMA"
def sql_table(args):
print "SQL_PRAGMA"
def sql_schemas(sqltbl,sqlopt,sqlfld,sqlcmd):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
fildb3="{}.db3".format(progid)
db3nam="{}".format(fildb3.split(".")[0])
dttm=ko_dttm("dt")
# print "BEG_3160 {} {} -= sql_schema {} =- {}_{} {}-{} fildb3={} sqltbl={}".format( progid,dttm, sqlopt, db3nam,sqltbl, j,k, fildb3,sqltbl )
return()
def sql_schema(sqltbl,sqlopt,sqlfld,sqlcmd):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
fildb3="{}.db3".format(progid)
db3nam="{}".format(fildb3.split(".")[0])
dttm=ko_dttm("dt")
# print "BEG_3160 {} {} -= sql_schema {} =- {}_{} {}-{} fildb3={} sqltbl={}".format( progid,dttm, sqlopt, db3nam,sqltbl, j,k, fildb3,sqltbl )
def replace_last(source_string, replace_what, replace_with):
head, _sep, tail = source_string.rpartition(replace_what)
return head + replace_with + tail
def readImage():
fin = None
try:
fin = open(img, "rb")
img = fin.read()
fin.close()
return img
except IOError, e:
print e
sys.exit(1)
finally:
if fin:
fin.close()
return()
def sql_b64ins(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
img=a4
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( img == "" ): img="imgs/btn/koeye.png"
if( sqlcmd == "" ): sqlcmd='insert into {}'.format( sqltbl )
fildb3 = "{}_b64.db3".format( a0.split(".")[0])
filnames = (
'imgs/btn/koeye.png',
'imgs/btn/koeyeb.png',
'imgs/btn/koeyew.png',
'imgs/btn/ko.png',
'imgs/btn/ok.png',
'imgs/btn/kop12.png',
'imgs/btn/kop23.png',
'imgs/btn/kop34.png',
'imgs/btn/kop14.png',
'imgs/btn/kob.png',
'imgs/btn/kow.png'
)
sqlcmd_cr = " CREATE TABLE if not exists {} (id INTEGER PRIMARY KEY,filnam text, data BLOB);".format(sqltbl)
print "{} {} SQL_INSERT_IMG fildb3={} sqltbl={} sqlcmd={} img={}".format( a0,dttm, fildb3, sqltbl, sqlcmd, img )
try:
db = db3.connect(fildb3)
cur = db.cursor()
data = readImage()
binary = db3.Binary(data)
for filnam in filnames:
print "sql_insb64 filnam={}".format(filnam)
# sql_insb64 = "insert or replace into {} (filnam,dttm,data) values(?,?,?)"
# cur.execute("INSERT or replace INTO {} (filnam, dttm, data) VALUES (?,?,?)",filnam, dttm, (binary,) )'.format( sqltbl, img, dttm )
db.commit()
except db3.Error, e:
if db:
db.rollback()
print e
sys.exit(1)
finally:
if db:
db.close()
return()
def writeImage(img, data):
fout = None
try:
fout = open(img,'wb')
fout.write(data)
except IOError, e:
print e
sys.exit(1)
finally:
if fout:
fout.close()
return()
def koreadline( ifile ):
if( ifile == "" ): ifile="kofiles.txt"
i = open(ifile, "r")
print (i.readline());
i.close()
if( not os.path.exists(ifile)):
print "{}_{} -= koreadline ERR_5325 NOTFOUND {} {}-{}".format( progid,dttm, ifile, j,k)
exit()
f = open(ifile, "r")
lines = ""
while(True):
line = f.readline()
if line == "":
print("::DONE::")
break
if line == "\n":
print("::EMPTY LINE::")
continue
lines += line
stripped = line.strip()
print("::LINE::")
print(stripped)
return(lines)
def kofindt_vols(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlfal, filtxt ):
exts = "mov mp4 jpg html db3 js pdf mp3 txt b64"
volids_ka11 = "ka11|/Volumes/ka1tbr1"
volids_ka12 = "ka12|/Volumes/ka1tbr2"
volids_ka1 = "{} {}".format( volids_ka12, volids_ka11 )
volids=volids_ka1
# for paths in i.readline():
ifile="topdirs_todo.txt"
pathdirs=""
i=open( ifile, "r" )
j=0
for pathdir in i.readlines():
# pathdir=pathdir.replace("\n", "")
j=j+1
pathdirs +=pathdir
i.close()
for pathdir in pathdirs.split():
pathfile=pathdir
pathdir=pathdir.replace("\n","")
path=os.path.basename(pathdir)
base=os.path.basename(pathdir)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace( ".", "" )
# print "BUGS_5790 {}.{}".format( j, pathdir)
k=0
for ext in exts.split():
k=k+1
ofile = "find_{}_{}.txt".format( base,ext)
namematch="*.{}".format(ext)
sysexe = "ls -lat"
opts=""
syscmd_find = 'find {} -name "{}" -exec {} \; >> {}'.format( pathdir, namematch, sysexe, ofile)
print "MSGB_5800 j={} findcmd={}".format( j, syscmd_find )
# print "BUGS_5792 j={} pathdir={} ext={}".format(j, pathdir, ext )
sysout=""
syserr=""
(sysout, syserr ) = kosys( syscmd_find,opts )
olen=len(sysout)
elen=len(syserr)
print "TODO_5841: {}.pathfile={} path={} base={} file={} ext={}".format(j,pathfile,path,base,file,ext)
print "BUGS_5842 END syscmd_find={} opts={} olen={} elen={} ofile={}".format(syscmd_find, opts, olen, elen, ofile)
# if( j > 1 ): exit()
exit()
j=0
for num_pathdir in pathdirs.split():
pathdir=num_pathdir.split("|")[0]
j=j+1
print "BUGS_5791 j={} pathdir={} ".format(j, pathdir )
k=0
for ext in exts.split():
k=k+1
# print "BUGS_5792 j={} pathdir={} ext={}".format(j, pathdir, ext )
opts=""
sysout=""
syserr=""
sysout=""
syserr=""
(sysout, syserr ) = kosys( syscmd_find,opts )
olen=len(sysout)
elen=len(syserr)
print "TODO_5841: {}.pathfile={} path={} base={} file={} ext={}".format(j,pathfile,path,base,file,ext)
print "BUGS_5842 END syscmd_find={} opts={} olen={} elen={} ofile={}".format(syscmd_find, opts, olen, elen, ofile)
if( j > 1 ): exit()
continue
exit()
def koread(ifile,opt):
if( not os.path.exists(ifile)):
print "koread NOTFOUND ifile={} opt={}".format(ifile,opt)
return
lines = []
with open(ifile, "r") as ins:
for line in ins:
lines.append(line)
return(lines)
lines=""
i = open( ifile,"r" )
j=0
for line in i.readlines():
j=j+1
print "msg_6176: {}. {}".format(j, line)
lines += "{}|{}|".format(j, line)
return(lines)
def kowrite(ofile,lines,opts):
dttm=ko_dttm("")
dt=ko_dttm("dt")
path=os.path.dirname(ofile)
base=os.path.basename(ofile)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace(".", "" )
oldfil="{}/{}_{}.{}".format(path,file,dt,ext)
newfil=ofile
if( not os.path.exists(ofile)):
print "koread NOTFOUND ifile={} opt={}".format(ifile,opt)
return
if( os.path.exists(ofile)):
print "koread EXISTS ofile={} oldfil={} opts={}|backup|append".format(ofile,oldfil,opts)
if( opts == "backup" ):
syscmd_cp = "cp {} {}".format( ofile, oldfil )
print "koread BACKUP syscmd_cp={}".format(syscmd_cp)
opts=""
(sysout, syserr) = kocmd(syscmd_cp,opts)
if( opts == "append" ):
print "koread APPEND ofile={}".format(ofile)
o = open(ofile, "a")
o.write( "{}".format( lines ))
o.close()
o = open( ofile, "w")
o.write( "{}".format( lines ))
o.close()
return
def kofind(topdir,filematch,opts,cmd):
import ko_cfg
progid=ko_cfg.progid
dttm=dttm("")
j=ko_cfg.j
k=ko_cfg.k
syscmd_find='find {} {} -name "{}" -exec cmd {} \;'.format(topdir,filematch,opts,cmd )
print "kofind msg_5880 {} {} -= syscmd_find={} =- {}={}".format( progid, dttm, syscmd_find, j,k )
(out, err ) =kocmd( syscmd_find )
return( out,err)
def kofindt_stub(ifile,findmatch,tailmatch,ofile):
print "kofindt msg_5900 ifile={} findmatch={} tailmatch={} ofile={}".format(ifile,findmatch,tailmatch,ofile)
return(findlines)
def kosys(cmd,opts):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
dttm=ko_dttm("")
kosys = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = kosys.communicate()
if ( opts == "br") or (opts == "brief"):
return( out, err )
j=0
for sysout in out.split("\n"):
j=j+1
print "{}_{} -= kocmd =- {}-{} sysout={}".format(progid,dttm, j,k, sysout)
k=0
for syserr in err.split("\n"):
k=k+1
print "{}_{} -= kocmd =- {}-{} syserr={}".format(progid,dttm, j,k, syserr)
return( out, err )
def go_topdirs():
topdirs = "i ht kb o1 i1 vixia3_ko1 epson photos webcam2_jtfdc_ko1 eyetv iphoto saic scan ko1tbr1_graid webcam2_jtfd c_20160609_0945 sk_ko0us mts vixia2_ko1 eulura Pictures video2_20150811 video o i imgs kb mp4"
return( topdirs )
def ht_ani(img,size):
# print "{} htmout_ani . .".format(a0)
path=os.path.dirname(img)
base=os.path.basename(img)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace(".", "" )
tag="{}".format(file)
btn="imgs/gifs/firebubble.gif"
img1="imgs/gifs/rings.gif"
img2="imgs/gifs/knot.gif"
url="/?q={}".format(img)
htmout_ani = (
'<html>',
' <head>',
' <title>-= htmout_ani =- {}_{}_{} -= 20192015_0200 =-</title>'.format(tag,w,h),
' ',
' <script type = "text/javascript">',
' var pattern = new Image();',
' ',
' function animate() {',
' pattern.src = \"{}\";.format(img),\n',
' setInterval(drawShape, 100);',
' }',
' ',
' function drawShape() {',
' ',
' // get the canvas element using the DOM',
' var canvas = document.getElementById("canvas_{}");'.format(tag),
' ',
' // Make sure we dont execute when canvas isnt supported',
' if (canvas.getContext) {',
' ',
' // use getContext to use the canvas for drawing',
' var ctx = canvas.getContext("2d");',
' ',
' ctx.fillStyle = "rgba(0,0,0,0.4)";',
' ctx.strokeStyle = "rgba(0,153,255,0.4)";',
' ctx.save();',
' ctx.translate(150,150); ',
' ',
' var time = new Date(); ',
' ctx.rotate( ((2*Math.PI)/6)*time.getSeconds() + ( (2*Math.PI)/6000)*time.getMilliseconds() );',
' ctx.translate(0,28.5);',
' ctx.drawImage(pattern,-3.5,-3.5);',
' ctx.restore();',
' } else {',
' alert("You need Safari or Firefox 1.5+ to see this demo.");',
' }',
' }',
' </script>',
' </head>',
'<body onload = "animate();">',
'<a href"{}" target=_blank class="thumbnail" id="drag">'.format(url),
' <img src="{}" border=0 alt="{}" class="drg" >'.format( img1,tag ),
' <span><img src="{}" border=0 alt="{}" class="drg" ></span>'.format( img2,tag ),
' </a>',
' <h1> canvas_{} width={} height={}></h1>'.format(tag,w,h),
' <canvas id = "canvas_{}" width = "{}" height = "{}"></canvas>'.format(tag,w,h),
' </html>'
)
return(htmout_ani)
def go_kludge(args):
sqlopt=a2
print "MSG_40 go_kludge args={} a1={} a2={} a3={} a4={}".format( args, a1,a2,a3,a4)
print "JJJJJJJJJJJJJJJ def go_kludge(args): KKKKKKKKKKKKKKKKKKKKKKK"
exit()
go_cmds(sqlopt)
return
def koset(fildb3,sqltbl,sqlcmd,sqlopt,sqlfld,sqlval):
import ko_cfg
if sqlopt == "set":
ko_cfg.fld = sqlval
return(sqlval)
if sqlopt == "get":
sqlval = ko_cfg.fld
return(cfgval)
progid=ko_cfg.progid
progid=ko_cfg.dttm
# progid=ko_cfg.fildb3 progid=ko_cfg.sqltbl progid=ko_cfg.sqlcmd progid=ko_cfg.sqlopt progid=ko_cfg.sqlfld progid=ko_cfg.sqlval progid=ko_cfg.db3nam
# progid=ko_cfg.filsql progid=ko_cfg.filpsv progid=ko_cfg.filcsv progid=ko_cfg.filtxt progid=ko_cfg.filmp4 progid=ko_cfg.filpng progid=ko_cfg.filgif progid=ko_cfg.filpdf progid=ko_cfg.oldfil progid=ko_cfg.newfil
# progid=ko_cfg.j progid=ko_cfg.k progid=ko_cfg.t progid=ko_cfg.x progid=ko_cfg.y progid=ko_cfg.z progid=ko_cfg.b64
progid=ko_cfg.desc
progid=ko_cfg.progid
dttm=ko_cfg.dttm
fildb3=ko_cfg.fildb3
db3nam=ko_cfg.db3nam
j=ko_cfg.j
k=ko_cfg.k
filb64=ko_cfg.filb64
twhxyz="ko_cfg.t w=ko_cfg.w h=ko_cfg.h x=ko_cfg.x y=ko_cfg.y z=ko_cfg.z"
sqltbls="ko_cfg.sqltbl sqlopt=ko_cfg.sqlopt sqlcmd=ko_cfg.sqlcmd sqlfld=ko_cfg.sqlfld sqlval=ko_cfg.sqlval filsql=ko_cfg.filsql filpsv=ko_cfg.filpsv"
txtset= ""
txtset += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
txtset += "koset: {} {} -= {} {} {} =- {}_{} {}-{} {}=".format( progid,dttm, sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd )
txtset += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return( txtset )
def go_cmds(sqlopt):
if( sqlopt=="set" ):
otext = koset(fildb3,sqltbl,sqlcmd,sqlopt,sqlfld,sqlval)
print "{}".txtset
return(otext)
if( sqlopt == "kotables" ):
otext=kotables(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlval, filtxt )
return(otext)
if( sqlopt == "kofiles" ):
otext=kotables(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlval, filtxt )
return(otext)
if( sqlopt == "kofindt" ):
otext=findt(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlval, ifile,findmatch,tailmatch,ofile )
return(otext)
if( sqlopt == "kodb" ):
otext=findt(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlval, ifile,findmatch,tailmatch,ofile )
return(otext)
if( sqlopt == "komenu" ):
otext=komenu(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlval, ifile,findmatch,tailmatch,ofile )
return(otext)
if( sqlopt == "kohelp" ):
otext=komenu(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlval, ifile,findmatch,tailmatch,ofile )
return(otext)
if( sqlopt == "kosys" ):
syscmd=a2
sysopt=a3
(sysout,syserr)=kocmd(syscmd,sysopt)
return(sysout,syserr)
if( sqlopt == "koread" ):
ifile=a2
filopt=a3
lines=koread(ifile,filopt)
return(lines)
if( sqlopt == "kowrite" ):
lines=kowrite(ofile,lines,filopt)
return(lines)
otext=komenu(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlval, ifile,findmatch,tailmatch,ofile )
otext+= "err:100 unsupported option={}".format(sqlopt)
kolog(otext)
def kohelp(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlfal, filtxt ):
cmds="komenu kodb kofindt kotables kofiles koset"
otext = ""
j=0
for cmd in cmds.split(" "):
otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
otext += "kohelp: {} {} -= cmd={}.{} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm,j,cmd, sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd )
otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(otext)
def kodb(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlfal, filtxt ):
# if( not os.path.exists(filtxt)):
# otext = ""
# otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
# otext += "kodb: {} {} -= err100:NOTFOUND filtxt={} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm,filtxt sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd )
# otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
# return(otext)
i = open( filtxt, "r" )
lines=""
otext=""
j=0
for line in i.readline():
lines += line
print "{}. {}".format(j, line )
otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
otext += "kotables: {} {} -= {} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm, sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd, filtxt )
otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(lines)
return(otext)
def kotables0(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlfal, filtxt ):
if( not os.path.exists(filtxt)):
otext = ""
# otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
# otext += "kotables: {} {} -= err100:NOTFOUND filtxt={} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm,filtxt sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd )
# otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(otext)
i = open( filtxt, "r" )
lines=""
otext=""
j=0
for line in i.readline():
lines += line
print "{}. {}".format(j, line )
otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
otext += "kotables: {} {} -= {} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm, sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd, filtxt )
otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(lines)
return(otext)
def kofiles(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlfal, filtxt ):
if( not os.path.exists(filtxt)):
otext = ""
# otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
# otext += "kofiles: {} {} -= err100:NOTFOUND filtxt={} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm,filtxt sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd )
# otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(otext)
i = open( filtxt, "r" )
lines=""
otext=""
j=0
for line in i.readline():
lines += line
print "{}. {}".format(j, line )
otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
otext += "kofiles: {} {} -= {} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm, sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd, filtxt )
otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(lines)
return(otext)
def kofindt(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlfal, filtxt ):
if( not os.path.exists(filtxt)):
otext = ""
# otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
# otext += "kofindt: {} {} -= err100:NOTFOUND filtxt={} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm,filtxt sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd )
# otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(otext)
i = open( filtxt, "r" )
lines=""
otext=""
j=0
for line in i.readline():
lines += line
print "{}. {}".format(j, line )
otext += "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
otext += "kotables: {} {} -= {} {} {} =- {}_{} {}-{} {} {}=".format( progid,dttm, sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd, filtxt )
otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return(lines)
return(otext)
# "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
# ( progid,dttm,filtxt sqlopt,sqlfld,sqlval, db3nam,sqltbl, j,k, sqlcmd )
# "go_end: {} {} -= :{} {} {} =- {}_{} {}-{} {} {}="
# "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
def mp4gifs():
progid=a0
dttm=ko_dttm("")
htroot="."
j=0
# for line in open( "mp4.txt", "r" ):
for line in open( "tracex.txt", "r" ):
j=j+1
# mp4=line.split("=" )[1].replace(";","").replace("\"", "" ).replace(" ","")
# mp4="{}{}".format( htroot,mp4 )
# mp4=mp4.replace(';','' ).replace('"', "" )
linelen = len( line.split(" "))
print "BUGS LINELEN={} line={}".format(linelen, line)
mp4 = line.split(" ")[linelen-1]
print "j={} linelen={} {}".format(j,linelen, mp4 )
if( os.path.exists( mp4 )):
print "NOTFOUND j={} mp4={}".format( j, mp4)
else:
print "FOUND j={} mp4={}".format( j, mp4)
mp4gif( mp4 )
# print "BUGS mp4={}".format(mp4)
if( j < 11 ): continue
# continue
# if( j>3 ): exit()
# if( re.search('avlist\+\+\]', line )):
# mp4=line.split('"')[1]
# print "FIND j={} mp4={}=".format( j, mp4 )
# else:
# print "SKIP j={} line={}=".format( j, line )
def path_leaf(path):
return path.strip('/').strip('\\').split('/')[-1].split('\\')[-1]
def namefix(ifile,fixit):
paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c', 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
head, tail = os.path.split(ifile)
[path_leaf(path) for path in paths]
for path in paths:
os.path.basename(os.path.normpath(path))
# """Extracts basename of a given path. Should Work with any OS Path on any OS"""
def extract_basename(path):
# basename = re.search(r'[^\\/]+(?=[\\/]?$)', path)
# if basename:
# return basename.group(0)
# print([extract_basename(path) for path in paths])
# ['c', 'c', 'c', 'c', 'c', 'c', 'c']
# extra_paths = ['C:\\', 'alone', '/a/space in filename', 'C:\\multi\nline']
# print([extract_basename(path) for path in extra_paths])
# ['C:', 'alone', 'space in filename', 'multi\nline']
# ef remove(value, deletechars):
# for c in deletechars:
# value = value.replace(c,'')
# return value;
# print remove(filename, '\/:*?"<>|')
# re.sub('[^\w\-_\. ]', '_', filename)
# path = os.getcwd()
# filenames = os.listdir(path)
# for filename in filenames:
# os.rename(os.path.join(path, filename), os.path.join(path, filename.replace(' ', '-')))
if( ifile != ofile ):
if( os.path.exists( ifile )):
syscp='cp "{}" "{}"'.format(ifile,ofile)
print "{} {} namefix\n CP sys_cp={}".format( sys_cp )
if( fixit == "y" ): os.system(sys_cp)
if( fixit == "x" ): os.system(sys_cp)
sysrm='rm "{}"'.format(ifile)
print "{} {} namefix RM sys_rm={}".format( sys_rm )
if( fixit == "x" ): os.system(sys_rm)
return()
# def namefix2():
# import string
# class FileExists(Exception):
# pass
# def rename_files(path, ext, remove_existing=True):
# for fname in os.listdir(path):
# test if the file name ends with the expected
# extension else skip it
# if not fname.endswith(ext):
# continue
# chdir is not a good idea, better to work
# with absolute path whenever possible
# oldpath = os.path.join(path, fname)
# remove _leading_ digits then remove all whitespaces
# newname = fname.lstrip(string.digits).strip()
# newpath = os.path.join(path, newname)
# check if the file already exists
# if os.path.exists(newpath):
# if remove_existing:
# it exists and we were told to
# remove existing file:
# os.remove(newpath)
# else:
# it exists and we were told to
# NOT remove existing file:
# raise FileExists(newpath)
# ok now we should be safe
# os.rename(oldpath, newpath)
# only execute the function if we are called directly
# we dont want to do anything if we are just imported
# from the Python shell or another script or module
# if __name__ == "__main__":
# exercice left to the reader:
# add command line options / arguments handling
# to specify the path to browse, the target
# extension and whether to remove existing files
# or not
# rename_files(r"E:\NEW", ".mp3", True)
def mp4gif(mp4):
progid=a0
dttm=ko_dttm("")
mp4gif_path="./imgs/mp4gif"
mp4gif_path="/Volumes/ka1tbr1/tracex/mp4gif"
mp4_path=os.path.dirname(mp4)
mp4_base=os.path.basename(mp4)
mp4_file=os.path.splitext(mp4_base)[0]
mp4_ext=os.path.splitext(mp4_base)[1].replace( ".", "" )
mp4=mp4.replace("\'","")
mp4=mp4.replace("^\/","")
mp4=mp4.replace("\n","")
fixit=""
fixmp4 = namefix(mp4,fixit)
mp4=fixmp4
print "mp4_path={} mp4_file={} mp4_ext={}".format( mp4_path, mp4_file, mp4_ext )
if( os.path.exists(mp4) ):
print "FOUND ={}=".format(mp4)
else:
print "NOTFOUND ={}=".format(mp4)
mp4png="{}/{}.png".format( mp4_path, mp4_file ).replace("//", "/")
if( mp4_path == "" ) or ( mp4_path == "/" ):
mp4png="{}/{}.png".format( mp4gif_path, mp4_file )
mp4gif="{}/{}.gif".format( mp4gif_path, mp4_file )
else:
mp4png="{}/{}.png".format( mp4gif_path, mp4_file )
mp4gif="{}/{}.gif".format( mp4gif_path, mp4_file )
print "mp4png={}".format(mp4png)
print "mp4jpg={}".format(mp4png)
print "mp4gif={}".format(mp4gif)
vframes=1
ss="0.5"
s="480x300"
t=1
if( os.path.exists(mp4) ):
for ss in "0.5 30 60 120 240 480":
sstag = ss.replace(".", "")
if( mp4_path == "" ) or ( mp4_path == "/" ):
mp4jpg="{}/{}.jpg".format( mp4gif_path, mp4_file, sstag )
else:
mp4jpg="{}/{}.jpg".format( mp4gif_path, mp4_file, sstag )
ffmpeg_mp4jpg = "ffmpeg -ss {} -i {} -t {} -s {} -f image2 {}".format( ss, mp4, t, s, mp4jpg )
# -vframes 1: limit to 1 frame extracted
# -ss 0.5: point of movie to extract from (ie seek to 0.5 seconds; you can also use HH:MM:SS.ZZZZ sexagesimal format)
# -s 480x300: frame size of image to output (image resized to fit dimensions)
# -f image2: forces format
print "{} {} mp4gif mp4jpg ffmpeg_mp4jpg={}".format(mp4jpg)
os.system(ffmpet_mp4jpg)
ffmpeg_mp4png="ffmpeg -y -ss 30 -t 3 -i {} -vf 'fps=10,scale=320:-1:flags=lanczos,palettegen' {}".format(mp4, mp4png )
print "ffmpeg mp4png={}".format( ffmpeg_mp4png )
os.system( ffmpeg_mp4png )
ffmpeg_mp4gif="ffmpeg -ss 30 -t 3 -i {} -i {} -filter_complex 'fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse' {}".format( mp4, mp4png, mp4gif )
print "ffmpeg mp4gif={}".format( ffmpeg_mp4gif )
os.system( ffmpeg_mp4gif )
else:
print "gif2mp4 NOTFOUND mp4={}".format(mp4)
def wiisk( a1,a2,a3 ):
progid=a0
dttm=ko_dttm("")
print "wiisk ".format()
exit()
def wiijk( a1,a2,a3 ):
progid=a0
dttm=ko_dttm("")
print "wiijk ".format()
exit()
# def wii( ):
progid=a0
dttm=ko_dttm("")
def wii(a1,a2,a3 ):
print "wii ".format()
print "WII pqpqpqpqpqpqpqpqpqpqpqpq"
exit()
png = "./heart/koeye.png"
gif = "./heart/heart.gif"
im_converts = {}
im_converts['kheart_pagepage'] = "convert {} -delay 100 -dispose None \ ".format( png )
im_converts['kheart_pagepage'] += "-page 100x100+5+10 balloon.gif \ "
im_converts['kheart_pagepage'] += "-page +35+30 {} \ ".format( "./imgs/btn/kop1.png" )
im_converts['kheart_pagepage'] += "-page +62+50 {} \ ".format( "./imgs/btn/kop2.png" )
im_converts['kheart_pagepage'] += "-page +10+55 {} \ ".format( ".imgs/btn/kop3.png" )
im_converts['kheart_pagepage'] += "-page +100+0 {} \ ".format( ".imgs/btn/kop4.png" )
im_converts['kheart_pagepage'] += "-loop 0 {}".format( "./heart/kheart_pagepage.gif" )
im_converts['kheart_frame'] = "convert {} -scene 1 +adjoin {} {}".format( png, gif, "./heart/kheart_frame_\%03d.gif" )
im_converts['heart_adjoinpg'] = "convert {} +repage -set delay 0 -set dispose None +adjoin {}".format( gif, "./heart/heart_repage_\%03d.gif" )
im_converts['heart_adjoin'] = "convert {} +repage +adjoin {}".format( gif, "./heart/heart_adjoin_\%02d.gif" )
im_converts['montage'] = "montage {} -coalesce \ ".format(gif)
im_converts['montage'] += "-tile x1 -frame 4 -geometry '+2+2' \ "
im_converts['montage'] += "-background none -bordercolor none {}".format("./heart/heart_montage.gif" )
im_converts['kheart_parts'] = "convert {} ".format(png)
im_converts['kheart_parts'] += "-dispose Background {} -matte \ "
im_converts['kheart_parts'] += "-compose Copy -bordercolor black -border 1x1 -compose Over \ "
im_converts['kheart_parts'] += "-coalesce -bordercolor none -frame 4x4+2+2 \ "
im_converts['kheart_parts'] += "-bordercolor none -border 2x2 +append {} {}".format( gif, "./heart/kheart_parts.gif" )
im_converts['heartk_parts'] = "convert {} ".format(gif)
im_converts['heartk_parts'] += "-dispose Background {} -matte \ "
im_converts['heartk_parts'] += "-compose Copy -bordercolor black -border 1x1 -compose Over \ "
im_converts['heartk_parts'] += "-coalesce -bordercolor none -frame 4x4+2+2 \ "
im_converts['heartk_parts'] += "-bordercolor none -border 2x2 +append {} {}".format( png, "./heart/heartk_parts.gif" )
im_converts['heart_quiet'] = "convert {} -quiet -layers CompareClear {}".format( gif, "./heart/heart_quiet.gif" )
im_converts['koeye_quiet'] = "convert {} -quiet -layers CompareClear {}".format( png, "./heart/koeye_quiet.png" )
im_converts['kheart_compare'] = "convert {} -layers CompareOverlay {} {}".format( png, gif, "./heart/kheart_compare.gif" )
im_converts['heartk_compare'] = "convert {} -layers CompareOverlay {} {}".format( gif, png, "./heart/heartk_compare.gif" )
im_converts['kheart'] = "convert {} {} -loop 0 {}".format( png, gif, "./kheart.gif")
im_converts['heartk'] = "convert {} {} -loop 0 {}".format( gif, png, "./heartk.gif")
im_converts['kh_repage_5_15'] = "{} \( {} -repage 0x0+5+15 \) -loop 0 {}".format( png, gif, "./kheart/kheart_repage_5_15.gif" )
im_converts['hk_repage_5_15'] = "{} \( {} -repage 0x0+5+15 \) -loop 0 {}".format( gif, png, "./heartk/kheart_repage_5_15.gif" )
im_converts['kh_repage_0_25'] = "{} \( {} -repage 0x0+0+25 \) -loop 0 {}".format( png, gif, "./kheart/kheart_repage_0_25.gif" )
im_converts['hk_repage_0_25'] = "{} \( {} -repage 0x0+0+25 \) -loop 0 {}".format( gif, png, "./heartk/kheart_repage_0_25.gif" )
im_converts['kh_repage_0_50'] = "{} \( {} -repage 0x0+0+50 \) -loop 0 {}".format( png, gif, "./kheart/kheart_repage_0_50.gif" )
im_converts['hk_repage_0_50'] = "{} \( {} -repage 0x0+0+50 \) -loop 0 {}".format( gif, png, "./heartk/kheart_repage_0_50.gif" )
im_converts['kh_repage_0_100'] = "{} \( {} -repage 0x0+0+100 \) -loop 0 {}".format( png, gif, "./kheart/kheart_repage_0_100.gif" )
im_converts['hk_repage_0_100'] = "{} \( {} -repage 0x0+0+100 \) -loop 0 {}".format( gif, png, "./heartk/kheart_repage_0_100.gif" )
im_converts['kh_repage_25_25'] = "{} \( {} -repage 0x0+25+25 \) -loop 0 {}".format( png, gif, "./kheart/kheart_repage_25_25.gif" )
im_converts['hk_repage_25_25'] = "{} \( {} -repage 0x0+25+25 \) -loop 0 {}".format( gif, png, "./heartk/kheart_repage_25_25.gif" )
im_converts['kh_repage_50_50'] = "{} \( {} -repage 0x0+50+50 \) -loop 0 {}".format( png, gif, "./kheart/kheart_repage_50_50.gif" )
im_converts['hk_repage_50_50'] = "{} \( {} -repage 0x0+50+50 \) -loop 0 {}".format( gif, png, "./heartk/kheart_repage_50_50.gif" )
im_converts['kh_repage_100_100'] = "{} \( {} -repage 0x0+100+100 \) -loop 0 {}".format( png, gif, "./kheart/kheart_repage_100_100.gif" )
im_converts['hk_repage_100_100'] = "{} \( {} -repage 0x0+100+100 \) -loop 0 {}".format( gif, png, "./heartk/kheart_repage_100_100.gif" )
im_converts['prev'] = "convert {} -layers Dispose {}".format( gif, "./heart/heart_prev.gif" )
im_converts['hk_1'] = "{} \( {} -repage 0x0+5+15\! \) \ ".format( gif, png )
im_converts['hk_1'] += "-coalesce -delete 0 -deconstruct -loop 0 {}".format( png, gif, "./heart/hk_1.gif" )
im_converts['kh_1'] = "{} \( {} -repage 0x0+5+15\! \) \ ".format( png, gif )
im_converts['kh_1'] += "-coalesce -delete 0 -deconstruct -loop 0 {}".format( png, gif, "./heart/kh_1.gif" )
im_converts['dispose'] = "convert {} -layers Dispose {}".format( gif, "./heart/heart_dispost.gif" )
im_converts['coalese'] = "convert {} -coalesce {}".format( gif, "./heart/heart_coalesce.gif" )
im_converts['decon'] = "convert {} -coalesce -deconstruct {}".format( gif, "./heart/heart_decon.gif" )
im_converts['compare'] = "convert {} -layers CompareAny {} {} ".format( png, gif, "./heart/kheart_compare.gif" )
im_converts['clear'] = "convert {} -quiet -layers {} {}".format(png, gif, "./heart/kheart_clear.gif" )
listlen=len(im_converts)
print "listlen={}".format(listlen)
# bugs print "im_convert.keys keys={}".format(im_converts.keys)
w=400
h=182
size="{}x{}".format(w,h)
png = "./heart/koeye.png"
png_path=os.path.dirname(png)
png_base=os.path.basename(png)
png_file=os.path.splitext(png_base)[0]
png_ext=os.path.splitext(png_base)[1].replace( ".", "" )
pngs = "{}/{}_%d.{}".format( png_path, png_file, png_ext )
gif = "./heart/heart.gif"
gif_path=os.path.dirname(gif)
gif_base=os.path.basename(gif)
gif_file=os.path.splitext(gif_base)[0]
gif_ext=os.path.splitext(gif_base)[1].replace(".", "" )
pngnew = "{}/{}{}.{}".format( png_path, png_file, w, png_ext )
gifnew = "{}/{}{}.{}".format( gif_path, gif_file, w, gif_ext )
giftmp = "{}/{}t{}.{}".format( gif_path, gif_file, w, gif_ext )
# imk_converts = {}
# imk_converts['resize_png'] = "convert {} -resize {} -coalesce {}".format(png,size,pngnew)
# imk_converts['resize_gif'] = "convert {} -resize {} -coalesce {}".format(gif,size,gifnew)
# imk_converts['gif2pngs'] = "convert {} {}_%d.{}".format( gif, gif_file,png_ext )
j=0;
im_converts ={}
list = (
"identify {}".format(png),
"identify {}".format(gif),
"convert {} -resize {} -coalesce {}".format(png,size,pngnew),
"convert {} -resize {} -coalesce {}".format(gif,size,giftmp),
"convert -size 40x40 {} -resize 400x180 {}".format( giftmp, newgif ),
"identify {}".format(gifnew),
"convert {} {}/{}_%d.{}".format( gif, gif_path,gif_file, png_ext )
)
# print "im_list={}".format(im_list)
# list = "a,b,c".split(",")
# lines = list.split(",")
# print "lines={}".format(lines)
for line in list:
j=j+1
print "line={}".format(line)
syscmd=line
print "j={} line={} syscmd={}".format( j, line,syscmd )
os.system( syscmd )
exit()
file="im.txt"
list = {}
j=0
for line in open(file, "r"):
j=j+1
print "{} {}".format( j, line )
# x=prog.match(line)
# dict[x.group(1)]=[x.group(2)]
print "bdbdbdbdbdbdbdbdbdbdbdbd"
exit()
def find(args):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
dttm=ko_dttm("")
print "{} {} -= find =- {}-{} ".format( progid, dttm, j, k )
def args2findt(ifile,findmatch, headmatch, ofile):
j=0
match=""
# ifile=""
# ofile=""
for arg in args:
j=j+1
if( j == 1 ): continue
if ( arg.find("." ) > 0 ):
if( ifile == "" ):
ifile=arg
continue
if( ofile == "" ):
ofile=arg
continue
else:
if( j > 2 ):
if( match == "" ):
match=arg
continue
return(ifile,match,ofile)
def findts(args):
wlfile="htfind.txt"
ofile="./htm/index_new.html"
j=0
j=j+1
ifile=""
match=""
findmatch=match
tailmatch=match
ofile="index_new.html"
if( os.path.exists(wlfile)):
j=0
filelist=""
i=open(wlfile, "r")
for line in i.readlines():
j=j+1
print "j={} line={}".format( j, line)
ifile=line.split("|")[1]
findmatch=line.split("|")[0]
tailmatch=findmatch
filelist += "{}".format(line)
txthtm = findt( ifile, findmatch,tailmatch, ofile )
print "FINDDT_400: j={} findmatch={} ifile={} line={} ofile={}".format( j, findmatch, ifile, line, ofile)
exit()
ifile=line.split(" ")[1]
print "{}. {} {} {}".format(j, ifile, findmatch, tailmatch, ofile )
exit()
def findt(ifile, findmatch, tailmatch, ofile ):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
j=0
k=0
# ifile=""
# match=""
# ofile=""
# (ifile, match, ofile) = args2findt(args)
print "MSG_400: {} {} -= findt =- {}-{} ifile={} findmatch={}{} ofile={}".format( progid, dttm, j, k, ifile, findmatch, tailmatch, ofile )
print "EXIT_500 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
if( os.path.exists(ifile)):
print "{} {} -= findt =- {}-{} ___FOUND ifile={} findmatch={} ofile={}".format( progid, dttm, j, k, ifile, findmatch, ofile )
else:
print "{} {} -= findt =- {}-{} NOTFOUND ifile={} findmatch={} ofile={}".format( progid, dttm, j, k, ifile, findmatch, ofile )
return()
findflag=""
tailflag=""
headtext=""
findtext=""
tailtext=""
findflag = ""
tailflag = ""
tailmatches = '</script </style </div'.split(" ")
# tailmatch = match
j=0
findflat=""
headtext=""
findtext=""
tailtext=""
ofile = "index_new.html"
o = open( ofile, "a")
for line in open( ifile,"r" ):
j=j+1
if(findflag == "" ) and ( line.find(findmatch) > 0):
findflag="FIND"
findtext += line
print "match j={} line={}".format(j, line)
continue
# for tailmatch in tailmatches:
if(findflag == "FIND" ) and ( line.find(tailmatch) > 0):
findflag="TAIL"
tailflag="y"
o.write( "{}\n".format(line) )
findtext += line
print "TAIL j={} line={}".format(j, line)
continue
if( findflag == "HEAD" ):
headtext += line
if( findflag == "FIND"):
print "FIND j={} line={}".format( j, line)
findtext += line
if(findflag == "TAIL"):
tailtext += line
print "tail j={} line={}".format( j, line)
tailtext += line
# print "{} {} {}-{} headtext={}".format( progid,dttm, j,k, headtext )
# print "{} {} {}-{} findtext={}".format( progid,dttm, j,k, findtext )
# print "{} {} {}-{} tailtext={}".format( progid,dttm, j,k, tailtext )
# findlabel=findlabel.replace("\"","")
# findlabel=findlabel.replace("id=","")
# findlabel=findlabel.replace("script","")
# findlabel=findlabel.replace("style","")
# findlabel=findlabel.replace("div","")
# findlabel=findlabel.replace("<","")
# findlabel=findlabel.replace(" ","")
# findlabel=findlabel.replace("__","_")
o.close()
return(findtext)
filelabel=progid
findlabel=findmatch
if( ofile == "" ):
filelabel=progid
ext="txt"
else:
filelabel=ofile.split(".")[0]
ext=ofile.split(".")[1]
ext="htm"
headfile="{}_head.{}".format( findlabel,ext)
findfile="{}_find.{}".format( findlabel,ext)
tailfile="{}_tail.{}".format( findlabel,ext)
# headfile="{}_{}_head.{}".format(filelabel, findlabel,ext)
# findfile="{}_{}_find.{}".format(filelabel, findlabel,ext)
# tailfile="{}_{}_tail.{}".format(filelabel, findlabel,ext)
# print "\m{} {} FINDT {}-{} |\n findmatch=\[{}\]\n hf={}\n ff={}\n tf={}\n".format(progid,dttm, j,k, findmatch, headfile,findfile,tailfile)
# print "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
# human ragnbone jorganjames:https://www.youtube.com/watch?v=mguL895wN_w
# beth hart-baloise_session_20181030|https://www.youtube.com/watch?v=Cebj_w4tATw
# rocknswing biancalocatelli-nils_andren_worldcupmoscoow|https://www.youtube.com/watch?v=Tm7f7SEoQ6o
# joshturner-feeling_good:https://www.youtube.com/watch?v=1dxt20OqE7E
# joshturner-stuckinthemiddle|https://www.youtube.com/watch?v=1T3B502Ut94
# jsohturner-justlikeheaven|https://www.youtube.com/watch?v=cEp7r38PFN8
# joshturner-https://www.youtube.com/watch?v=cEp7r38PFN8
# joshturner-mybabyjustcaresforme|https://www.youtube.com/watch?v=cEp7r38PFN8
# joshturner-judyblueeyes|https://www.youtube.com/watch?v=cUhdL_hUi3w
# joshturner-bludesind|https://www.youtube.com/watch?v=7sZp0XzHNJ8
# joshtruner-forwhatitsworth|https://www.youtube.com/watch?v=MeCu3pm8IxE
# joshturner-dooley|https://www.youtube.com/watch?v=HukVqlfa-6I
# joshturner-theweight|https://www.youtube.com/watch?v=CJPFimuge24
# jsohturner-nieteenandaimless|https://www.youtube.com/watch?v=h_lop2MKRT0
# joshturner-crazy|https://www.youtube.com/watch?v=An-PQEAxsF8
# joshturner-feellikemakinlover|https://www.youtube.com/watch?v=yIDu9GosRi0
# nils_bianca-|https://www.youtube.com/watch?v=alLi8i9BQK4
# joshturner-canthelpfallinginlove|https://www.youtube.com/watch?v=j5mmhokV24Q
# joshturner-heygoodlookin|https://www.youtube.com/watch?v=1EIeJ-6jUmQ
# joshturner-blackvelvet|https://www.youtube.com/watch?v=QqWtthJXp8k
# joshturner-wagonwheel|https://www.youtube.com/watch?v=1jk4eYY4GLE
# joshturner-graceland|https://www.youtube.com/watch?v=NtYKjQLgnOs
# joshturner-kathysgong|https://www.youtube.com/watch?v=PBRQmzGkJXs
# joshturner-misty|https://www.youtube.com/watch?v=cH7-q6n_cPY
# joshturner-isawherstandinther|https://www.youtube.com/watch?v=xfpqQSMERSY
# joshturner-marthamydear|https://www.youtube.com/watch?v=5cagNn1bmF8
# joshturner-diamondsonthesolesofhershoes|https://www.youtube.com/watch?v=rASnJcaQ1M8
# joshtruner-sleep|https://www.youtube.com/watch?v=I_D0kyS17xM
# nilsnbianc-teachershow2017|https://www.youtube.com/watch?v=GFXAUSyWWSY
# joshtruner-helloadele|https://www.youtube.com/watch?v=vndwHYvjhWQ
# joshturner-alliwant|https://www.youtube.com/watch?v=t-xl44vFgfE
# joshturner-sloopjohnb|https://www.youtube.com/watch?v=Xy1nPA9tBjQ
# joshturner-parlezmoidamour_lessontheory|https://www.youtube.com/watch?v=Tqq9TNi9Ung
# joshturner-dontthinktwice_lesson|https://www.youtube.com/watch?v=NNVYwE-KGkQ
# swinn_chanzie-rtsf2016_nittygritty|https://www.youtube.com/watch?v=m01f4uAn1AA
# swing_chanzienstephen|letgettogether|https://www.youtube.com/watch?v=WkJoP2PLe6g
# swing_bianca_nils|kissmegoodnight|https://www.youtube.com/watch?v=vdOFotyWwy4
# calebbrown_varnfloyd-2017proam|https://www.youtube.com/watch?v=xawrVKCNrm8
# swing_chanzie_stephe-shaglyfesival2018|https://www.youtube.com/watch?v=P70mx-Utif8
# swing_chandraeroettig_stephensayer-twist2012camp|https://www.youtube.com/watch?v=LwPYV_KtYME&list=RDP70mx-Utif8&index=5
# swing_chanzie_steve-cantyouhearthewindblow|https://www.youtube.com/watch?v=jCVEh1IzyMo
# swing_chnzie_steve-6count_sugarpushes|https://www.youtube.com/watch?v=bK6HSM3UYGE
# swing_chanzie_steve-shag|https://www.youtube.com/watch?v=yhbCNoJ4j4A
# swing_chanzie_steve-swingouvars|https://www.youtube.com/watch?v=hoUbnwihyMg
#
#
oh = open(headfile, "w")
oh.write( headtext )
oh.close()
of=open(findfile, "w")
of.write( findtext )
of.close()
ot=open( tailfile, "w")
ot.write( tailtext )
ot.close()
j=0
syscmd="ls -lat {}_{}_*.{}".format(filelabel, findlabel,ext)
# sysout = os.system( syscmd )
# for line in sysout.split("/n"):
# j=j+1
# print "j={} sysout={}".format(j, sysout)
print "\m{} {} FINDT {}-{} |\n findmatch=\[{}\]\n hf={}\n ff={}\n tf={}\n".format(progid,dttm, j,k, findmatch, headfile,findfile,tailfile)
print "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return( headtext, findtext, tailtext );
# proc = subprocess.Popen(["ls -lat", "*_find.htm"], stdout=subprocess.PIPE, shell=True)
# (out, err) = proc.communicate()
# print "proc output:", out
syscmd="ls -lat index_??.html"
sys_in, sys_out, sys_err = os.popen3(syscmd)
sys_outs = "".join(sys_out.read()).split("\n")
sys_out_len = len( sys_outs )
print "BUGS_410 sys_out_len={} sys_outs={}\n".format( sys_out_len, sys_outs )
j=0
for sys_out in sys_outs:
j=j+1
print "BUGS_430 j={} sys_out={}".format(j,sys_out)
return()
def findf(args):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
dttm=ko_dttm("")
print "{} {} -= findf =- {}-{} ".format( progid, dttm, j, k )
def findd(args):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
dttm=ko_dttm("")
print "{} {} -= findd =- {}-{} ".format( progid, dttm, j, k )
def sqlite3(args):
progid=a0
dttm=ko_dttm("")
print "{} {} SQLITE3 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="im.db3"
sqltbl="list"
sqlcmd="select * from list"
print "{} {} SQLITE3 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit()
# pppppppppppppppppppppppppppp
def main_sql3(args):
import ko_cfg
fildb3=ko_cfg.fildb3
# fildb3="ko.db3"
# database = "C:\\sqlite\db\pythonsqlite.db"
# create a database connection
sql3 = sql3_db(fildb3)
with sql3:
sql3_update_task(sql3, (2, '2015-01-04', '2015-01-06',2))
def sql3_update_task(conn, task):
"""
update priority, begin_date, and end date of a task
:param conn:
:param task:
:return: project id
"""
sqlcmd = ''' UPDATE tasks
SET prioritql3_ko7
= ? ,
begin_date = ? ,
end_date = ?
WHERE id = ?'''
db = sql3.cursor()
db.execute(sqlcmd, task)
def sql3_db(fildb3):
# """ create a database connection to the SQLite database
# specified by db_file
# :param db_file: database file
# :return: Connection object or None
# """
try:
sql3 = db3.connect(fildb3)
return sql3
# except Exception as e:
except Exception, e:
print "e"
# sql3.rollback()
# print "{} {} ERR sql3_ko1 sql3_db3() {}-{} sqlcmd={} e={}".format(progid,dttm, j,k, sqlcmd, e)
print "BUGS_14 sql3_insert.py"
raise e
finally:
print "sql3_ko0 sql3_ko1"
# sql3.close()
# Error as e:
# except as e:
# print(e)
return None
# def sql3_cr_ko0(sql3, sqltbl):
def sql3_cr_ko0(sql3, fildb3, sqltbl, sqlopt,sqlcmd, sqlfld, sqlval):
import ko_cfg
progid=ko_cfg.progid
sqltbl="ko0"
sqlcmd="select * from ko0"
sqlopt=""
# """
# Create a new ko0 into the ko0 table
# :param sql3:
# :param ko0:
# :return: ko0id
# """
db = sql3.cursor()
# sql = """create table if exists ko0 ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists ko0 ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists ko0 ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into ko0 values('ko0_sk_100','begdt_sk_100', 'begdt_sk_100' )"
db.execute(sql)
sql="insert into ko0 values('ko0_sk_200','begdt_sk_200', 'begdt_sk_200' )"
db.execute(sql)
sql="insert into ko0 values('ko0_sk_300','begdt_sk_300', 'begdt_sk_300' )"
db.execute(sql)
sql="insert into ko0 values('ko0_sk_500','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into ko0 values('ko0_sk_600','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into ko0 values('ko0_sk_700','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into ko0 values('ko0_jk_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into ko0 values('ko0_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko0 values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# def sql3_cr_ko1(sql3, sqltbl):
def sql3_cr_ko1(sql3, fildb3, sqltbl, sqlopt,sqlcmd, sqlfld, sqlval):
import ko_cfg
progid=ko_cfg.progid
sqltbl="ko1"
sqlcmd="select * from ko1"
sqlopt=""
# """
# Create a new ko0 into the ko0 table
# :param sql3:
# :param ko0:
# :return: ko0id
# """
db = sql3.cursor()
# sql = """create table if exists ko1 ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists ko1 ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists ko1 ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_sk_100', 'begdt_sk_100' )"
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_sk_200', 'begdt_sk_200' )"
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_sk_300', 'begdt_sk_300' )"
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into ko1 values('ko1','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko1 values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# def sql3_cr_ko2(sql3, sqltbl):
def sql3_cr_ko2(sql3, fildb3, sqltbl, sqlopt,sqlcmd, sqlfld, sqlval):
import ko_cfg
progid=ko_cfg.progid
sqltbl="ko2"
sqlcmd="select * from ko2"
sqlopt=""
# """
# Create a new ko2 into the ko2 table
# :param sql3:
# :param ko2:
# :return: ko2
# """
db = sql3.cursor()
# sql = """create table if exists ko2 ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists ko2 ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists ko2 ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_sk_100', 'begdt_sk_100' )"
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_sk_200', 'begdt_sk_200' )"
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_sk_300', 'begdt_sk_300' )"
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into ko2 values('ko2','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko2 values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# def sql3_cr_ko3(sql3, sqltbl):
def sql3_cr_ko3(sql3, fildb3, sqltbl, sqlopt,sqlcmd, sqlfld, sqlval):
import ko_cfg
progid=ko_cfg.progid
sqltbl="ko3"
sqlcmd="select * from ko3"
sqlopt=""
# """
# Create a new ko3 into the ko3 table
# :param sql3:
# :param ko3:
# :return: ko3
# """
db = sql3.cursor()
# sql = """create table if exists ko3 ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists ko3 ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists ko3 ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_sk_100', 'begdt_sk_100' )"
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_sk_200', 'begdt_sk_200' )"
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_sk_300', 'begdt_sk_300' )"
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into ko3 values('ko3','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko3 values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# def sql3_ko1(args):
def sql3_ko1(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
args = []
a0=""
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("dt")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
filpsv="{}.psv".format(progid)
filsql="{}.sql".format(progid)
filtxt="{}.txt".format(progid)
# ------------------
# ------------------ sql3_ko1
sqltbl="{}".format("kofiles")
sqlcmd="{}".format("select * from kofiles")
sqlopt="create"
sqltbl="kofiles"
sql3 = sql3_db(fildb3)
with sql3:
kofiles = sql3_cr_ko0(fildb3, sqltbl,sqlopt,sqlcmd)
kofiles = sql3_cr_ko1(fildb3, sqltbl,sqlopt,sqlcmd)
kofiles = sql3_cr_ko2(fildb3, sqltbl,sqlopt,sqlcmd)
kofiles = sql3_cr_ko_0(fildb3, sqltbl,sqlopt,sqlcmd)
kofiles = sql3_cr_ko_1(fildb3, sqltbl,sqlopt,sqlcmd)
kofiles = sql3_cr_ko_2(fildb3, sqltbl,sqlopt,sqlcmd)
kofiles_vals = ('sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
kofiles = sql3_cr_kofiles(fildb3, sqltbl,sqlopt,sqlcmd)
# ------------------
db = sql3.cursor()
# sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql_cr_kofiles = sql_schema(fildb3,"kofiles", "create","select * from kofiles")
sql_drop_kofiles = "DROP TABLE kofiles"
sql_cr_kofiles = 'CREATE TABLE IF NOT EXISTS kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, mm varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
logtxt = "{} {} sql3_ko {}={} sql_cr_kofiles={}".format(progid, dttm, j,k, sql_cr_kofiles )
kolog( logtxt )
# db.execute(sql_drop_kofiles)
db.execute(sql_cr_kofiles)
o = open( filsql, "w")
o.write(sql_cr_kofiles)
o.close()
filsql="{}.sql".format(progid)
filpsv="{}.psv".format(progid)
txtsql = "INSERT OR REPLACE INTO kofiles values ('koid_1','dttm_1','status_1','perms_1','k1_1','k2_1','permu_1','permg_1','kludge_1','size_1','mth_1','dd_1','hhmm_1','pathfile_1','path_1','file_1','ext_1','oldfil_1','newfil_1','exif_1','exifdt_1','yyyy_1','mm_1','begdt_1','enddt_1','url_1','img_1','tn_1','grp_1','id_1','desc_1' )"
txtpsv = txtsql.split("(")[1]
txtpsv = txtpsv.replace("'","")
txtpsv = txtpsv.replace(",", "|")
txtpsv = txtpsv.replace(" )", "")
j=1
k=100
pathfile="./imgs/links/ko{}.png".format(0)
pathfile1="./imgs/btn/koeye_{}.png".format(1)
pathfile2="./imgs/btn/koeye_{}.png".format(2)
pathfile3="./imgs/btn/koeye_{}.png".format(3)
pathfile4="./imgs/btn/koeye_{}.png".format(4)
url="http://ko2.us?q=koid{}".format(0)
url1="http://ko2.us?q=koid{}".format(1)
url2="http://ko2.us?q=koid{}".format(2)
url3="http://ko2.us?q=koid{}".format(3)
url4="http://ko2.us?q=koid{}".format(4)
tn="./imgs/links/tn/tn_bg_{}.jpg".format(0)
tn1="./imgs/links/tn/tn_bg_{}.jpg".format(1)
tn2="./imgs/links/tn/tn_bg_{}.jpg".format(2)
tn3="./imgs/links/tn/tn_bg_{}.jpg".format(3)
tn4="./imgs/links/tn/tn_bg_{}.jpg".format(4)
img="./imgs/bg/bg_{}.jpg".format(0)
img1="./imgs/bg/bg_{}.jpg".format(1)
img2="./imgs/bg/bg_{}.jpg".format(2)
img3="./imgs/bg/bg_{}.jpg".format(3)
img4="./imgs/bg/bg_{}.jpg".format(4)
sql_insert_val1 = "INSERT OR REPLACE INTO kofiles ('pathfile') values ('./imgs/btn/koeye.png' );"
sql_insert_val2 = "INSERT OR REPLACE INTO kofiles ('pathfile','img') values ('{}', '{}' );".format(pathfile1,img)
sql_insert_val3 = "INSERT OR REPLACE INTO kofiles ('dttm','pathfile','url') values ('{}', './imgs/btn/koeyeb.png','http://ko2.us' );".format(dttm)
sql_insert_vals = "INSERT OR REPLACE INTO kofiles values ('koid_1','dttm_1','status_1','perms_1','k1_1','k2_1','permu_1','permg_1','kludge_1','size_1','mth_1','dd_1','hhmm_1','pathfile_1','path_1','file_1','ext_1','oldfil_1','newfil_1','exif_1','exifdt_1','yyyy_1','mm_1','begdt_1','enddt_1','url_1','img_1','tn_1','grp_1','id_1','desc_1' )"
sql_inserti = "INSERT OR REPLACE INTO {} ".format(sqltbl)
sql_insertf = "('koid','dttm','status','perms','k1','k2','permu','permg','kludge','size','mth','dd','hhmm','pathfile','path','file','ext','oldfil','newfil','exif','exifdt','yyyy','mm','begdt','enddt','url','img','tn','grp','id','desc' )"
sql_insertv = "('koid_{}','{}','status_{}','perms_{}', '{}','k2_{}', 'permu_{}','permg_{}','{}','size_{}','mth_{}','dd_{}','hhmm_{}','{}', 'path_{}','file_{}','ext_{}','oldfil_{}','newfil_{}','exif_{}', '{}_{}','yyyy_{}','mm_{}','{}_{}','{}_{}','url_{}','img_{}', 'tn_{}','grp_{}','id_{}','desc_{}' );".format(j,dttm,j,j,img2,j, j,j,img1,j,j,j,j,tn1, j,j,j,j,j,j, dttm,j, j,j,img3,j, img3,j, url1, img1, j,j,j,dttm,j,j,url1,img1,tn1, tn2,j,j,dttm)
sql_insert_fv = "{} {} values {} ".format( sql_inserti,sql_insertf,sql_insertv )
# sawherther|https://www.youtube.com/watch?v=RgS3TdgVdC8
sql_insert_val1="{}\n".format(sql_insert_val1)
o = open( filsql, "a")
o.write(sql_insert_val1)
o.close()
db.execute(sql_insert_val1)
print "{} {} sql3_ko {}-{} sql_insert_val1={} ".format(progid,dttm, j,k, sql_insert_val1)
sql_insert_val2="{}\n".format(sql_insert_val2)
o = open( filsql, "a")
o.write(sql_insert_val2)
o.close()
db.execute(sql_insert_val2)
print "{} {} sql3_ko {}-{} sql_insert_val2={} ".format(progid,dttm, j,k, sql_insert_val2)
sql_insert_val3="{}\n".format(sql_insert_val3)
o = open( filsql, "a")
o.write(sql_insert_val3)
o.close()
db.execute(sql_insert_val3)
print "{} {} sql3_ko {}-{} sql_insert_val3={} ".format(progid,dttm, j,k, sql_insert_val3)
sql_insert_vals="{}\n".format(sql_insert_vals)
o = open( filsql, "a")
o.write(sql_insert_vals)
o.close()
db.execute(sql_insert_vals)
print "{} {} sql3_ko {}-{} sql_insert_vals={} ".format(progid,dttm, j,k, sql_insert_vals)
dttm=ko_dttm("dt")
sql_insert_jk="insert into kofiles ( 'desc' ) values ( 'desc_jk');"
sql_insert_jk1="insert into kofiles ('dttm') values ('{}');".format(dttm)
sql_insert_jk="{}\n".format(sql_insert_jk)
o = open( filsql, "a")
o.write(sql_insert_jk)
o.close()
db.execute(sql_insert_jk)
print "{} {} sql3_ko {}-{} sql_insert_jk={} ".format(progid,dttm, j,k, sql_insert_jk)
o = open(filpsv, "a")
o.write( txtpsv)
o.close()
syssql3_sql = "sqlite3 {} < {}".format(fildb3,filsql)
osout_sql = os.system( syssql3_sql )
print "{} {} sql3_ko {}-{} syssql3_sql={} osout_sql={}".format(progid,dttm, j,k, syssql3_sql, osout_sql )
syssql3_psv = "sqlite3 {} \".import {} {}\"".format( fildb3,filpsv,sqltbl)
osout_psv = os.system( syssql3_psv )
print "{} {} sql3_ko {}-{} syssql3_psv={} osout_psv={}".format(progid,dttm, j,k, syssql3_psv, osout_psv )
print "{} {} EXIT_700 sql3_ko {}={} sql_insert_val1={}".format(progid, dttm, j,k, sql_insert_val1 )
exit()
# sql ="insert into kofiles values('dttm','pathfile', 'path','file','ext', 'url','img','tn','desc','grp','id' )"
sql_insert_tblnam="insert into {}".format(sqltbl)
sql_fields="('dttm','pathfile', 'path','file','ext', 'url','img','tn','desc','grp','id' )"
# sql_values=" values('dttm','pathfile', 'path','file','ext', 'url','img','tn','desc','grp','id' );"
sql_values="('dttm','pathfile', 'path','file','ext', 'url','img','tn','desc','grp','id' )"
sql_insert= "{} {} values {}".format( sql_insert_tblnam, sql_fields, sql_values )
# sql_insert= 'INSERT INTO TABLE kofiles values ( koid, dttm, status, perms, k1, k2, permu, permg, k6, size, mth, dd, hhmm, pathfile, path, file, ext, oldfil, newfil, exif, yyyy, mm, dd,begdt varchar, enddt varchar, url varchar, img varchar, tn , grp , id , desc );'
sql_insert_values="""INSERT INTO TABLE kofiles values ( "koid","dttm","status","perms","k1","k2","permu","permg","k6","size","mth","dd","hhmm","pathfile","path","file","ext","oldfil","newfil","exif","yyyy","mm","dd","begdt","enddt","url","img","tn","grp","id","desc");"""
sql_insert1 = """insert into table kofiles ("pathfile", "dttm", "desc" ) values ( "./imgs/btn/koeye.png", dttm, "desc_20190220" )"""
sql_insert2 = """insert into table kofiles ("dttm") values ("dttm_insert2");"""
print "{} {} SQL_INSERT_700 sql3_ko {}={} sql_insert={}".format(progid, dttm, j,k, sql_insert )
sql_insert_values='INSERT INTO kofiles values ( "koid","dttm","status","perms","k1","k2","permu","permg","k6","size","mth","dd","hhmm","pathfile","path","file","ext","exif","yyyy","mm","dd","begdt","enddt","url","img","tn","grp","id","desc");'
sql_insert1 = 'insert into kofiles ("pathfile", "url", "desc" ) values ( "./imgs/btn/koeye.png", "http://ko2.us", "desc_20190220" )'
pathfile="./imgs/tmp/pathfile_{}".format(dttm)
sql_insert2 = 'insert into kofiles ("pathfile") values ("{}");'.format(pathfile)
# sql_jk="insert into kofiles ('pathfile') values ('./imgs/btn/koeye.png')"
sql_jk="insert into kofiles ('pathfile','dttm') values ('./img/btn/koeyeb.png','{}')".format(dttm)
db.execute(sql_jk)
print "{} {} EXIT_700 sql3_ko {}={} sql_jk={}".format(progid, dttm, j,k, sql_jk )
exit()
db.execute(sql_insert_values)
db.execute(sql_insert)
db.execute(sql_insert1)
db.execute(sql_insert2)
print "{} {} EXIT_700 sql3_ko {}={} sql_insert={}".format(progid, dttm, j,k, sql_insert )
exit()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
sql= 'INSERT INTO TABLE kofiles values ( koid, dttm, status, perms, k1, k2, permu, permg, k6, size, mth, dd, hhmm, pathfile, path, file, ext, oldfil, newfil, exif, yyyy, mm, ddbegdt, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# ------------------
print "{} {} SQL3_ko fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_cr_kofiles(fildb3,sqltbl,sqlopt,sqlcmd):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("dt")
a0=""
a1=""
a2=""
a3=""
a4=""
a5=""
j=0
k=0
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
filpsv="{}.psv".format(progid)
filsql="{}.sql".format(progid)
filtxt="{}.txt".format(progid)
filjs="{}.js".format(progid)
filcss="{}.css".format(progid)
filhtml="{}.html".format(progid)
sqltbl="kofiles"
sqlcmd="select * from kofiles"
# arglen=len(args)
# if( arglen > 0 ): a0=args[0]
# if( arglen > 1 ): a1=args[1]
# if( arglen > 2 ): a2=args[2]
# if( arglen > 3 ): a3=args[3]
# if( arglen > 4 ): a4=args[4]
# if( arglen > 5 ): a5=args[5]
sqltbl="kofiles"
sqlopt="create"
sqlcmd="select * from kofiles"
# sql_cr_kofiles1 = sql_schema(fildb3,sqltbl, sqlopt, sqlcmd )
# sql_cr_kofiles = sql_cr_kofiles1
# sql_cr_kofiles = sql_schema( fildb3, "kofiles", "create", "" )
# sql_cr_kofiles = sql_schema( fildb3, "", "", "" )
import ko_cfg
import csv
a0=""
a1=""
a2=""
a3=""
a4=""
# arglen=len(args)
# if( arglen >1 ): a1=args[1]
# if( arglen >2 ): a2=args[2]
# if( arglen >3 ): a3=args[3]
# if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko1
# fildb3 = "ko.db3"
sql3 = sql3_db(fildb3)
with sql3:
proj = ('sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
projid = sql3_cr_proj(sql3, proj)
sql_cr_kofiles = 'CREATE TABLE IF NOT EXISTS kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, k6 varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, yyyy varchar, mm varchar dd varchar begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
print "BIGS_830 sql_cr_kofiles -= {} =-".format( sql_cr_kofiles )
return( sql_cr_kofiles )
# print "{} {} sql3_cr_kofiles {}-{} sql_cr={}".format( progid, dttm, j,k, sql_cr_kofiles )
# print "{} {} sql3_cr_kofiles1 {}-{} sql_cr={}".format( progid, dttm, j,k, sql_cr_kofiles1 )
# print "{} {} EXIT_800 sql3_cr_kofiles2 {}-{} sql_cr={}".format( progid, dttm, j,k, sql_cr_kofiles2 )
# print "sql_cr_kofiles1 -= {} =-".format( sql_cr_kofiles1 )
# print "sql_cr_kofiles2 -= {} =-".format( sql_cr_kofiles2 )
#def sql3_ko_1(args):
def sql3_ko_1(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
args=[]
a0=""
a1=""
a2=""
a3=""
a4=""
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko1
# fildb3 = "ko.db3"
sql3 = sql3_db(fildb3)
with sql3:
proj = ('sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
projid = sql3_cr_proj(sql3, proj)
# sql3_db3(fildb3)
# create_proj(sql3, proj)
# create_proj(sql3, project)
# ------------------
# ------------------
print "{} {} SQL3_ko1 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# import sqlite3
import sqlite3 as db3
def sql3_db(fildb3):
# """ create a database connection to the SQLite database
# specified by db_file
# :param db_file: database file
# :return: Connection object or None
# """
# fildb3="ko.db3"
try:
# sql3 = sqlite3.connect(fildb3)
sql3 = db3.connect(fildb3)
return sql3
except Exception, e:
# except Exception as e:
print "e"
# sql3.rollback()
# print "{} {} ERR sql3_ko1 sql3_db3() {}-{} sqlcmd={} e={}".format(progid,dttm, j,k, sqlcmd, e)
print "BUGS_14 sql3_insert.py"
raise e
finally:
print "BUGS_54 ko.py sql3_ko1"
# sql3.close()
# Error as e:
# except as e:
# print(e)
return None
def sql3_ko(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
a0=""
a1=""
a2=""
a3=""
a4=""
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko1
# fildb3 = "ko.db3"
ifile="find_mov.txt"
sql3 = sql3_db(fildb3)
with sql3:
sqltbl = ('sql3_ko1 sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
# projid = sql3_cr_files(sql3, sqltbl)
# projid = sql3_cr_proj(sql3, sqltbl)
ko = sql3_cr_proj(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_files(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_ko(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
kofiles = sql3_cr_kofiles(sql3, sqltbl)
# sql3_db3(fildb3)
# create_proj(sql3, proj)
# create_proj(sql3, project)
# ------------------
# ------------------ sql3_ko1
print "{} {} SQL3_ko1 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# import sqlite3
import sqlite3 as db3
# def sql3_cr_ko(sql3, proj):
def sql3_cr_ko(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def sql3_ko(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
a0=""
a1=""
a2=""
a3=""
a4=""
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko1
# fildb3 = "ko.db3"
ifile="find_mov.txt"
sql3 = sql3_db(fildb3)
with sql3:
sqltbl = ('sql3_ko1 sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
# projid = sql3_cr_files(sql3, sqltbl)
# projid = sql3_cr_proj(sql3, sqltbl)
ko = sql3_cr_proj(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_files(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_ko(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_kofiles(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
# sql3_db3(fildb3)
# create_proj(sql3, proj)
# create_proj(sql3, project)
# ------------------
# ------------------ sql3_ko1
print "{} {} SQL3_ko1 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# import sqlite3
import sqlite3 as db3
# def sql3_cr_ko(sql3, proj):
def sql3_cr_proj(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def sql3_cr_proj1(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
a0=""
a1=""
a2=""
a3=""
a4=""
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko1
# fildb3 = "ko.db3"
ifile="find_mov.txt"
sql3 = sql3_db(fildb3)
with sql3:
sqltbl = ('sql3_ko1 sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
# projid = sql3_cr_files(sql3, sqltbl)
# projid = sql3_cr_proj(sql3, sqltbl)
ko = sql3_cr_proj(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_files(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_ko(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
ko = sql3_cr_kofiles(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
# sql3_db3(fildb3)
# create_proj(sql3, proj)
# create_proj(sql3, project)
# ------------------
# ------------------ sql3_ko1
print "{} {} SQL3_ko1 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# import sqlite3
import sqlite3 as db3
# def sql3_cr_ko(sql3, proj):
def sql3_cr_files(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def sql3_cr_kofiles(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
# pppppppppppppppppppppppppppppp sql3_ko3() beg
# def sql3_ko1(args):
def sql3_ko1(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
args = []
progid= ko_cfg.progid
dttm=ko_dttm("dt")
fildb3="{}.db3".format(progid)
fildb3="ko0.db3"
sqltbl="ko0"
sqlopt=""
sqlcmd="select * from ko0"
db3nam="{}.db3".format(fildb3)
db3nam = fildb3.split(".")[0]
db3tbl = "{}_{}".format( db3nam, sqltbl)
filsql="{}_{}.sql".format(db3nam, sqltbl)
filpsv="{}_{}.psv".format(db3nam, sqltbl)
filcsv="{}_{}.csv".format(db3nam, sqltbl)
filtxt="{}_{}.txt".format(db3nam, sqltbl)
txtsql=""
txtpsv=""
txtcsv=""
txttxt=""
sqlfld=""
sqlopt="create"
sqlcmd="select * from ko0"
j=0
k=0
arglen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
# ------------------
# pqpqpqpqpqpqpqpqpq sql3_ko0
sql3 = sql3_db(fildb3)
# print "SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} db3tbl={} sql3={} ".format ( progid, dttm, fildb3, sqltbl, j,k, fildb3, db3tbl, sql3)
# print "EXIT_830 SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} sql3={} ".format ( progid, dttm, db3nam, sqltbl, j,k, fildb3, sql3)
with sql3:
ko0_title = ('sql3_ko0 sqlite3 python and mejkwii make three', '20190219_0100', '20190219_0245');
sql3_cr_ko0_text = sql3_cr_ko1(sql3, fildb3, sqltbl, sqlopt, sqlfld, sqlcmd)
# ------------------
# bdbdbdbdbdbdbdbdbd sql3_ko0
print "{} {} SQL3_ko0 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
print "SQL3_KO0_TAIL: {} {} -= sql3_ko0 =- {}_{} {}-{} ".format ( progid, dttm, fildb3, sqltbl, j,k )
exit
# import sqlite3
def sql3_cr_ko1(sql3, fildb3, sqltbl, sqlopt, sqlfld, sqlcmd):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("dt")
# fildb3="ko0.db3"
# sqltbl="ko11
db3nam=fildb3.split(".")[0]
filsql="{}.sql".format(db3nam)
filpsv="{}.psv".format(db3nam)
filcsv="{}.csv".format(db3nam)
filtxt="{}.txt".format(db3nam)
txtsql=""
txtpsv=""
txtcsv=""
txttxt=""
# sqlopt=""
# sqlfld=""
# sqlcmd=""
j=0
k=0
# """
# Create a new ko0 into the ko0 table
# :param sql3:
# :param ko0:
# :return: ko0id
# """
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
db3nam=fildb3.split(".")[0]
sqltbl="ko0"
sql_drop_q3 = """DROP TABLE IF EXISTS {} """.format( sqltbl )
sql_drop_q1 = "DROP TABLE IF EXISTS {}".format( sqltbl )
sql_drop_jk = "DROP TABLE IF EXISTS ko0"
sql_drop = sql_drop_q3
logtxt = "{} {} -= sql3_ko0 DROP =- {}_{} {}-{} fildb3={} sql_drop={}".format ( progid, dttm, db3nam, sqltbl, j,k, fildb3, sql_drop )
kolog( logtxt )
print "{}\n".format( logtxt )
# db.execute(sql_drop)
sql_cr_q3 = """CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );"""
sql_cr_q1 ='CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );'
# sql_cr_ko0 = sql_schema(fildb3,sqltbl, "create", "select * from {}".format(sqltbl))
# sql_cr_schema_text = sql_schema( fildb3,"ko0","create", "" )
# sql_cr_schema=sql_cr_jk
# sql_cr = sql_cr_jk
sql_cr_jk_best ="CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );"
sql_cr_jk ="CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );"
sql_cr="CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );"
sql_values="'ko0id','ko0dt','status','pathfile','url','img','tn','title','name','begdt','enddt','j','k','desc','h','w','x','y','z','color','speed','b64'"
sql_fields="ko0id ko0dt status pathfile url img tn title name begdt enddt j k desc h'w x y z color speed b64"
txtpsv=sql_fields.replace(" ", "|" )
txtpsv=sql_fields.replace("(", "" )
txtpsv=sql_fields.replace(")", "" )
txtcsv=sql_fields.replace(" ", "," )
txtscp=sql_cr
db.execute(sql_cr_jk)
# print "EXIT_1582 sql3_ko0 sql_cr_jk={}".format( sql_cr_jk )
# exit()
# txtsql=sql_cr_jk
# txtpsv=txtsql
# txtpsv=txtpsv.split("(")[1]
# txtpsv=txtpsv .replace( "CREATE TABLE IF NOT EXISTS","")
# txtpsv=txtpsv .replace( "create table if not exists","")
# txtpsv=txtpsv .replace( "CREATE TABLE","")
# txtpsv=txtpsv .replace( "create table","")
# txtpsv=txtpsv.replace("VARCHAR","")
# txtpsv=txtpsv.replace("vatchar","")
# txtpsv=txtpsv.replace(",","|" )
# txtpsv=txtpsv.replace("'", "")
# txtpsv=txtpsv.replace(")", "")
# txtpsv=txtpsv.replace(" ", "")
# txtcsv=txtpsv.replace("|", ",")
o = open( filsql, "w")
o.write( "{}".format(txtsql))
o.close()
o = open( filpsv, "w")
o.write( "{}".format(txtpsv))
o.close()
o = open( filcsv, "w")
o.write( "{}".format(txtcsv))
o.close()
logtxt = "{} {} -= sql3_ko0 CREATE =- {}_{} {}-{} fildb3={} sql_create={}".format ( progid, dttm, db3nam, sqltbl, j,k, fildb3, sql_create )
kolog( logtxt )
print "{}\n".format( logtxt )
db.execute(sql_cr)
# print "EXIT_830: SQL3_CR_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} ".format ( progid, dttm, fildb3, sqltbl, j,k )
db3nam="{}".format(fildb3.split(".")[0])
db3tbl="{}_{}".format(db3nam,sqltbl)
sql_ins="INSERT INTO {} VALUES( {} );".format( sqltbl, sql_values )
sql_ins_vals="INSERT INTO {} VALUES( {} );".format( sqltbl, sql_values )
db.execute(sql_ins_vals)
sql_ins_fldvals="INSERT INTO {} ( {} ) VALUES( {} );".format( sqltbl, sql_values, sql_values )
db.execute(sql_ins_fldvals)
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
sql="insert into ko0 values('proj_200','begdt_200', 'begdt_200' )"
sql="insert into ko0 values('ko0id','ko0dt','status','pathfile','url','img','tn','title','name','begdt','enddt','j','k','desc','h','w','x','y','z','color','speed','b64')"
db.execute(sql)
sql_ins_val1='insert into ko0 ( "ko0id" ) values ("ko0id_1");'
db.execute(sql_ins_val1)
sql_ins_val2='insert into ko0 ( "ko0id","ko0dt" ) values ("ko0id_1","dttm_1");'
db.execute(sql_ins_val2)
sql_ins_val3='insert into ko0 ( "ko0id","ko0dt","pathfile" ) values ("ko0id_1","dttm_1","pathfile_1");'
db.execute(sql_ins_val3)
sql_ins_val4='insert into ko0 ( "ko0id","ko0dt","status", "pathfile" ) values ("ko0id_1","dttm_1","status_1","pathfile_1");'
sql_ins_q3="""insert into ko0 ( "ko0id" ) values ("ko0id_1")"""
db.execute(sql_ins_q3)
print "{} {} -= sql3_ko0 =- {}_{} {}-{} sql_ins={}".format ( progid, dttm, db3tbl, sqltbl, j,k, sql_ins )
sql_ins="insert into ko0 ('ko0id') values ('ko0id_1')"
db.execute(sql_ins)
sql_ins="insert into ko0 ('ko0dt') values ('ko0dt_1')"
db.execute(sql_ins)
sql_ins="insert into ko0 ('pathfile') values ('pathfile_1')"
db.execute(sql_ins)
sql_ins="insert into ko0 ('url') values ('url_1');"
db.execute(sql_ins)
sql_ins="insert into ko0 ('b64') values ('b64_1')"
db.execute(sql_ins)
sql_ins="insert into ko0 ('status') values ('status_1')"
db.execute(sql_ins)
sql_ins="""insert into ko0 ("ko0dt") values ("ko0dt_1");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("status") values ("status_1");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("pathfile") values ("pathfile_1");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("img") values ("img_1");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("url") values ("url_");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("b64") values ("b64_1")"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("ko0id") values ("ko0id_1")"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("ko0dt") values ("ko0dt_1")"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("status") values ("status_1");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("pathfile") values ("pathfile_1")"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("img") values ("img_1");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("url") values ("url_");"""
db.execute(sql_ins)
sql_ins="""insert into ko0 ("b64") values ("b64_1")"""
db.execute(sql_ins)
print "MSG_1660 {} {} sql_ko0 sqltbl={} sqltbl={} {}-{} sql_inds={}".format(progid,dttm,fildb3,sqltbl, j,k, sql_ins )
exit()
sql_sel="SELECT * FROM {} ".format( sqltbl)
print "{} {} -= sql3_ko0 =- {}_{} {}-{} sql_sel={}".format ( progid, dttm, db3tbl, sqltbl, j,k, sql_sel )
db.execute(sql_sel)
rows = db.fetchall()
j=0
for row in rows:
j=j+1
print "{} {} {} {} {}".format( j,row[0], row[1], row[2], row[3],row[4])
lastrowid= db.lastrowid
print "{} {} -= sql3_ko0 =- {}_{} {}-{} lastrowid={}".format ( progid, dttm, fildb3, sqltbl, j,k, lastrowid )
# print "EXIT_86x {} {} -= sql3_ko0 =- {}_{} {}-{} {}={}".format ( progid, dttm, db3tbl, sqltbl, j,k, 'field", "value" )
print "EXIT_860{} {} -= sql3_ko0 =- {}_{} {}-{} lastrowid={}".format ( progid, dttm, fildb3, sqltbl, j,k, lastrowid )
exit()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
def sql3_ko2(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
args = []
alen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko2
sql3 = sql3_db(fildb3)
with sql3:
kolabel = ('ko sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
koid = sql3_cr_ko2(sql3, sqltbl )
# ------------------
# ------------------
print "{} {} SQL3_ko2 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_cr_ko2(sql3, sqltbl):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
sqltbl="ko"
dttm=ko_dttm("dt")
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
## sql = """create table if not exists ko ( name varchar, begdt varchar, enddt varchar );"""
sql = """create table if not exists ko ( koid varchar, dttm varchar, name varchar, begdt varchar, enddt varchar, desc varchar );"""
db.execute(sql)
sql="insert into ko values('koid', 'dttm','proj_sk_100','begdt_sk_100', 'begdt_sk_100','desc' )"
db.execute(sql)
sql="insert into {} values('koid_{}', '{}', 'proj_sk_200','begdt_sk_200', 'begdt_sk_200', 'desc' )".format( sqltbl, progid, dttm)
db.execute(sql)
sql="insert into ko values('koid_proj_sk_300', 'dttm_proj_sk_300', 'ko_proj_sk_300','ko_begdt_sk_300', 'ko_begdt_sk_300','ko_desc_sk_300' )"
db.execute(sql)
sql="insert into proj values('proj_sk_500','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into proj values('proj_sk_600','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into proj values('proj_sk_700','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into proj values('proj_jk_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko values('koid_{}', 'dttm_{}', 'proj_{}','begdt_{}', 'begdt_{}', 'desc_{}' )".format(j,j,j,j,j,j)
print "{} {} sql3_ko1 sql3_cr_ko3 {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# def sql3_ko3(args):
def sql3_ko3(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
args=[]
alen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko2
sql3 = sql3_db(fildb3)
with sql3:
kolabel = ('ko sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
koid = sql3_cr_ko3(sql3, sqltbl )
# ------------------
# ------------------
print "{} {} SQL3_ko2 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_cr_ko3(sql3, sqltbl):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
sqltbl="ko"
dttm=ko_dttm("dt")
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
## sql = """create table if not exists ko ( name varchar, begdt varchar, enddt varchar );"""
sql = """create table if not exists ko ( koid varchar, dttm varchar, name varchar, begdt varchar, enddt varchar, desc varchar );"""
db.execute(sql)
sql="insert into ko values('koid', 'dttm','proj_sk_100','begdt_sk_100', 'begdt_sk_100','desc' )"
db.execute(sql)
sql="insert into {} values('koid_{}', '{}', 'proj_sk_200','begdt_sk_200', 'begdt_sk_200', 'desc' )".format( sqltbl, progid, dttm)
db.execute(sql)
sql="insert into ko values('koid_proj_sk_300', 'dttm_proj_sk_300', 'ko_proj_sk_300','ko_begdt_sk_300', 'ko_begdt_sk_300','ko_desc_sk_300' )"
db.execute(sql)
sql="insert into proj values('proj_sk_500','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into proj values('proj_sk_600','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into proj values('proj_sk_700','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into proj values('proj_jk_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko values('koid_{}', 'dttm_{}', 'proj_{}','begdt_{}', 'begdt_{}', 'desc_{}' )".format(j,j,j,j,j,j)
print "{} {} sql3_ko1 sql3_cr_ko2 {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# def sql3_cr_proj(sql3, proj):
def sql3_cr_prog(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into proj values('proj_sk_100','begdt_sk_100', 'begdt_sk_100' )"
db.execute(sql)
sql="insert into proj values('proj_sk_200','begdt_sk_200', 'begdt_sk_200' )"
db.execute(sql)
sql="insert into proj values('proj_sk_300','begdt_sk_300', 'begdt_sk_300' )"
db.execute(sql)
sql="insert into proj values('proj_sk_500','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into proj values('proj_sk_600','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into proj values('proj_sk_700','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into proj values('proj_jk_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
def sql3_insert(db, sqltbl, row):
cols = ', '.join('"{}"'.format(col) for col in row.keys())
vals = ', '.join(':{}'.format(col) for col in row.keys())
sqlcmd = 'INSERT INTO "{0}" ({1}) VALUES ({2})'.format(sqltbl, cols, vals)
db.cursor().execute(sql, row)
db.commit()
def sql3_insert_stocks(db):
stocks=( 'stocks', {'created_at': '2016-04-17', 'type': 'BUY', 'amount': 500, 'price': 45.00} )
return()
# INSERT statement will add a row into the SQLite table "Student".
# Since there is no column list sp
sql3_values1=(1,"John", "Maxwell", "141, Market Street, Edison, NJ")
sql3_insert1="INSERT INTO {} values {}".format(sqltbl,sql3_values1)
fld1="fld1"
fld2="fld2"
val1="val1"
val2="val2"
sql3_insert2="INSERT INTO {} ({}, {}) values ({},{})".format(sqltbl, fld1, fld2, val1, val2 )
sqltbl1=sqltbl
sqltbl2="sqltbl2.db3"
sql3_insert3=" INSERT INTO {} select * from {};".format(sqltbl1, sqltbl2 )
sql3_insert4="INSERT INTO {} DEFAULT VALUES;".format(sqltbl)
# Larger example
tlist= [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
('2006-04-06', 'SELL', 'IBM', 500, 53.00),
]
for t in tlist:
db.execute('insert into stocks values (?,?,?,?,?)', t)
sql3 = sql3_db(fildb3)
db = sql3.cursor()
for item in my_list:
db.execute('insert into {} values (?,?,?)'.format(sqltbl), item)
# Larger example
rows = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
('2006-04-06', 'SELL', 'IBM', 500, 53.00)]
db.executemany('insert into stocks values (?,?,?,?,?)', rows)
sql3.commit()
def sql3_ko_0(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
args=[]
(alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = args2a(args)
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko2
sql3 = sql3_db(fildb3)
with sql3:
kolabel = ('ko sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
koid = sql3_cr_ko_0(sql3, sqltbl )
# ------------------
# ------------------
print "{} {} SQL3_ko2 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_cr_ko_0(sql3, sqltbl):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
sqltbl="ko"
dttm=ko_dttm("dt")
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
## sql = """create table if not exists ko ( name varchar, begdt varchar, enddt varchar );"""
sql = """create table if not exists ko ( koid varchar, dttm varchar, name varchar, begdt varchar, enddt varchar, desc varchar );"""
db.execute(sql)
sql="insert into ko values('koid', 'dttm','proj_sk_100','begdt_sk_100', 'begdt_sk_100','desc' )"
db.execute(sql)
sql="insert into {} values('koid_{}', '{}', 'proj_sk_200','begdt_sk_200', 'begdt_sk_200', 'desc' )".format( sqltbl, progid, dttm)
db.execute(sql)
sql="insert into ko values('koid_proj_sk_300', 'dttm_proj_sk_300', 'ko_proj_sk_300','ko_begdt_sk_300', 'ko_begdt_sk_300','ko_desc_sk_300' )"
db.execute(sql)
sql="insert into proj values('proj_sk_500','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into proj values('proj_sk_600','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into proj values('proj_sk_700','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into proj values('proj_jk_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko values('koid_{}', 'dttm_{}', 'proj_{}','begdt_{}', 'begdt_{}', 'desc_{}' )".format(j,j,j,j,j,j)
print "{} {} sql3_ko1 sql3_cr_ko {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
def sql3_ko_1(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
arglen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko1
# fildb3 = "ko.db3"
sql3 = sql3_db(fildb3)
with sql3:
sqltbl = ('sql3_ko1 sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
projid = sql3_cr_proj(sql3, sqltbl)
ko = sql3_cr_ko_1(sql3, sqltbl)
# sql3_db3(fildb3)
# create_proj(sql3, proj)
# create_proj(sql3, project)
# ------------------
# ------------------ sql3_ko1
print "{} {} SQL3_ko1 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# import sqlite3
import sqlite3 as db3
def sql3_cr_ko_1(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into proj values('proj_100','begdt_100', 'begdt_100' )"
db.execute(sql)
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
#
def sql3_ko3(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
arglen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("proj")
sqlcmd="{}".format("select * from proj")
# ------------------
# ------------------ sql3_ko1
# fildb3 = "ko.db3"
sql3 = sql3_db(fildb3)
with sql3:
sqltbl = ('sql3_ko1 sqlite3 python and me jkwii', '20190219_0100', '20190219_0245');
projid = sql3_cr_proj(sql3, sqltbl)
ko = sql3_cr_ko2(sql3, sqltbl)
# sql3_db3(fildb3)
# create_proj(sql3, proj)
# create_proj(sql3, project)
# ------------------
# ------------------ sql3_ko1
print "{} {} SQL3_ko1 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# import sqlite3
import sqlite3 as db3
def sql3_cr_ko2(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into proj values('proj_100','begdt_100', 'begdt_100' )"
db.execute(sql)
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
#
def sql3_ko_3(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
progid=a0
dttm=ko_dttm("")
print "{} {} SQL3_ko3 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="im.db3"
sqltbl="list"
sqlcmd="select * from list"
# ------------------
import csv, sqlite3
# `with` statement available in 2.5+
# csv.DictReader uses first line in file for column headings by default
# use your column names here
col1="col1"
col2="col2"
sql3 = sql3_db(":memory:")
db = sql3.cursor()
db.execute("CREATE TABLE t (col1, col2);")
filcsv="ko.csv"
with open(filcsv,'rb') as fin:
dr = csv.DictReader(fin) # comma is default delimiter
to_db = [(i['col1'], i['col2']) for i in dr]
db.executemany("INSERT INTO t (col1, col2) VALUES (?, ?);", to_db)
db.commit()
db.close()
df = pandas.read_csv(filcsv)
df.to_sql(sqltbl, db, if_exists='append', index=False)
# ------------------
print "{} {} SQL3_ko3 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_ko_4(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
progid=a0
dttm=ko_dttm("")
print "{} {} SQL3_ko4 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="im.db3"
sqltbl="list"
sqlcmd="select * from list"
# ------------------
import csv, sqlite3
import logging
def sql3_ko0(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
import ko_cfg
import csv
progid= ko_cfg.progid
dttm=ko_dttm("dt")
fildb3="{}.db3".format(progid)
fildb3="ko0.db3"
sqltbl="ko0"
sqlopt=""
sqlcmd="select * from ko0"
db3nam="{}.db3".format(fildb3)
db3nam = fildb3.split(".")[0]
db3tbl = "{}_{}".format( db3nam, sqltbl)
sqlfld=""
sqlval=""
filsql="{}_{}.sql".format(db3nam, sqltbl)
filpsv="{}_{}.psv".format(db3nam, sqltbl)
filcsv="{}_{}.csv".format(db3nam, sqltbl)
filtxt="{}_{}.txt".format(db3nam, sqltbl)
txtsql=""
txtpsv=""
txtcsv=""
txttxt=""
sqlfld=""
sqlopt="create"
sqlcmd="select * from ko0"
j=0
k=0
a0=""
a1=""
a2=""
a3=""
a4=""
# arglen=len(args)
# if( arglen >1 ): a1=args[1]
# if( arglen >2 ): a2=args[2]
# if( arglen >3 ): a3=args[3]
# if( arglen >4 ): a4=args[4]
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
# ------------------
# pqpqpqpqpqpqpqpqpq sql3_ko0
sqlcmd=""
sql3 = sql3_db(fildb3)
# print "SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} db3tbl={} sql3={} ".format ( progid, dttm, fildb3, sqltbl, j,k, fildb3, db3tbl, sql3)
# print "EXIT_830 SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} sql3={} ".format ( progid, dttm, db3nam, sqltbl, j,k, fildb3, sql3)
with sql3:
ko0_title = ('sql3_ko0 sqlite3 python and mejkwii make three', '20190219_0100', '20190219_0245');
# sql3_cr_ko0(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
sql3_cr_ko0_text = sql3_cr_ko0(sql3, fildb3, sqltbl, sqlopt,sqlcmd, sqlfld, sqlval)
# ------------------
# bdbdbdbdbdbdbdbdbd sql3_ko0
print "{} {} SQL3_ko0 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
print "SQL3_KO0_TAIL: {} {} -= sql3_ko0 =- {}_{} {}-{} ".format ( progid, dttm, fildb3, sqltbl, j,k )
exit
def sql3_ko0_schemas(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
import ko_cfg
import csv
progid= ko_cfg.progid
dttm=ko_dttm("dt")
fildb3="{}.db3".format(progid)
fildb3="ko0.db3"
sqltbl="ko0"
sqlopt=""
sqlcmd="select * from ko0"
db3nam="{}.db3".format(fildb3)
db3nam = fildb3.split(".")[0]
db3tbl = "{}_{}".format( db3nam, sqltbl)
sqlfld=""
sqlval=""
filsql="{}_{}.sql".format(db3nam, sqltbl)
filpsv="{}_{}.psv".format(db3nam, sqltbl)
filcsv="{}_{}.csv".format(db3nam, sqltbl)
filtxt="{}_{}.txt".format(db3nam, sqltbl)
txtsql=""
txtpsv=""
txtcsv=""
txttxt=""
sqlfld=""
sqlopt="create"
sqlcmd="select * from ko0"
j=0
k=0
a0=""
a1=""
a2=""
a3=""
a4=""
# arglen=len(args)
# if( arglen >1 ): a1=args[1]
# if( arglen >2 ): a2=args[2]
# if( arglen >3 ): a3=args[3]
# if( arglen >4 ): a4=args[4]
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
# ------------------
# pqpqpqpqpqpqpqpqpq sql3_ko0_schemas
sqlcmd=""
sql3 = sql3_db(fildb3)
# print "SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} db3tbl={} sql3={} ".format ( progid, dttm, fildb3, sqltbl, j,k, fildb3, db3tbl, sql3)
# print "EXIT_830 SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} sql3={} ".format ( progid, dttm, db3nam, sqltbl, j,k, fildb3, sql3)
with sql3:
ko0_schemas = ('sql3_ko0 sqlite3 python and mejkwii make three', '20190219_0100', '20190219_0245');
# sql3_cr_ko0(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
sql3_cr_ko0_schemas_text = sql3_cr_ko0_schemas(sql3, fildb3, sqltbl, sqlopt,sqlcmd, sqlfld, sqlval)
# ------------------
# bdbdbdbdbdbdbdbdbd sql3_ko0
print "{} {} SQL3_ko0 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
print "SQL3_KO0_TAIL: {} {} -= sql3_ko0_schemas =- {}_{} {}-{} ".format ( progid, dttm, fildb3, sqltbl, j,k )
exit
def sql3_cr_ko0_schemas(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
import ko_cfg
progid=ko_cfg.progid
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
fildb3="{}.db3".format(progid)
db3nam="{}".format(fildb3.split(".")[0])
dttm=ko_dttm("dt")
# print "BEG_3160 {} {} -= sql_schema {} =- {}_{} {}-{} fildb3={} sqltbl={}".format( progid,dttm, sqlopt, db3nam,sqltbl, j,k, fildb3,sqltbl )
sql_tables = (
'CREATE TABLE IF NOT EXISTS cfaa ( lines varchar);',
'CREATE TABLE IF NOT EXISTS list ( line varchar);',
'CREATE TABLE IF NOT EXISTS csv ( r varchar, c varchar, rlen varchar, clen varchar, c0 varchar, c1 varchar, c2 varchar, c3 varchar varchar, c4 varchar, c5 varchar, c6 varchar, c7 varchar, c8 varchar, c9 varchar, c10 varchar, c11 varchar, c12 varchar, c13 varchar, c14 varchar, c15 varchar, c16 varchar );',
'CREATE TABLE IF NOT EXISTS file ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
'CREATE TABLE IF NOT EXISTS file1 ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
'CREATE TABLE IF NOT EXISTS file2 ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
'CREATE TABLE IF NOT EXISTS file3 ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
'CREATE TABLE IF NOT EXISTS files ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
"CREATE TABLE IF NOT EXISTS ko ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko1 ( ko1id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko2 ( ko2id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko3 ( ko3id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
'CREATE TABLE IF NOT EXISTS ip ( myid text, mydt text, hostname text, ip text, desc text);',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_type VARCHAR, led_date VARCHAR, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os );',
'CREATE TABLE IF NOT EXISTS data ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, k6 varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, yyyy varchar, mm varchar dd varchar begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS files ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
'CREATE TABLE IF NOT EXISTS uslist ( usid varchar, dttm varchar, status varchar, url varchar, img varchar, tn varchar, id varchar, grp varchar, begdt varchar, enddt varchar, yyyy varchar, mm varchar, dd varchar, mth varchar, pathfile varchar, file varchar, ext varchar, size varchar, x varchar, y varchar, z varchar, width varchar, height varchar, perms varchar, permu varchar, permg varchar, temp varchar, args varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar); ',
'CREATE TABLE IF NOT EXISTS cabs( myid text, mydt text, rowname text, cab text, cabamps text, "desc" text);',
'CREATE TABLE IF NOT EXISTS cfg ( fld text, val text );',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS fp (fp_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, label VARCHAR, title VARCHAR, width VARCHAR, height VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR);',
'CREATE TABLE IF NOT EXISTS grid (grid_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, org VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS equip ( f1 text,f2 text,machine text,cab text,position text,fld06 text,network text,model text,cpumem text,bluetag text,hrcnum text,sn text,franksid text,purchased text,enddate text,amps text,rpdu_bank text,rpdu_outlets text,switch text,port text,connection text,pmm text,circuit text,panel text,breaker text,feed text, temp text );',
'CREATE TABLE IF NOT EXISTS ko_hw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab1 text, cab2 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, flag_vm text, width text, height text, weight text, im_width text, im_height text, machinename text, temp text);',
'CREATE TABLE IF NOT EXISTS ko_plans ( myid text, mydt text, planid text, loadmode text, cabnum text, cablim text, cab text, zone text, grp text, vendor text, item text, cab2 text, zone2 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text, hostname text, sn text, hrctag text, bluetag text, franksid text, os text, osver text, ip text, ips text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab0 text, cab1 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, temp text);',
'CREATE TABLE IF NOT EXISTS kocab ( myid text, mydt text, rowname text, rowseq text, cab text, amps text, items text, status text, type text, maxamps text, min_hdrspace text, min_ftrspace text, desc text);',
'CREATE TABLE IF NOT EXISTS kohw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, f12 text, f13 text, f14 text, f15 text, f16 text, f17 text, f18 text, f19 text, f20 text, f21 text, f22 text, f23 text, f24 text, f25 text, f26 text, f27 text, f28 text, f29 text, f30 text, f31 text, f32 text, f33 text, f34 text, f35 text, f36 text); ',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_type VARCHAR, led_date VARCHAR, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os );',
'CREATE TABLE IF NOT EXISTS menus ( menus_id INTEGER PRIMARY KEY DESC, role VARCHAR, url VARCHAR, levels VARCHAR);',
'CREATE TABLE IF NOT EXISTS details ( cab text,zone text,grp text,vendor text,item text,cab1 text,zone1 text,grp1 text,btu text,watts text,amps text,vac text,height text,width text,depth text,weight text,spectext text, temp text );',
'CREATE TABLE IF NOT EXISTS n11 (n11_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, ip VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS obj ( obj_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS pano ( pano_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS periods ( yyyy text, fy text, p text, q text, wk text, begdt text, begday text, enddt text, endday text, oy text, est text, f3 text, f4 text, f5 text, f6 text, status text, desc text);',
'CREATE TABLE IF NOT EXISTS plans ( myid text, mydt text, cab text, item text, model text, cab0 text, cab2 text, amps text, os text, ip text, upos text, uheight text, enclave text, network text, cpumem text, hrcnum text, sn text, frankid text, purchased text, enddate text, rpdu_bank text, rpdu_outlets text, switch text, port text, connection text, pmm text, circuit text, panel text, breaker text, feed text, height text, width text, depth text, weight text, grp1 text, grp2 text);',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS rpts ( rptnum text, rptcode text, rptdesc text, rptsql text, dbfile text, sqlfile text, outfile text, status text);',
'CREATE TABLE IF NOT EXISTS shelves ( cab text, zone text, grp text, vendor text, item text, cab1 text, zone1 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text); ',
'CREATE TABLE IF NOT EXISTS us (us_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR ); ',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoom ( zoom_id INTEGER PRIMARY KEY, code VARCHAR, name VARCHAR, status VARCHAR, dttm VARCHAR, color VARCHAR, speed VARCHAR, city VARCHAR, bldg VARCHAR, loc VARCHAR, floor VARCHAR, groups VARCHAR, orgs VARCHAR, title VARCHAR, published VARCHAR, comment VARCHAR, filename VARCHAR, width VARCHAR, height VARCHAR, autoloop VARCHAR, choicelist VARCHAR, listsource VARCHAR, initialvisibility VARCHAR, minscale VARCHAR, maxscale VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoomxml ( zoomxml_id INTEGER PRIMARY KEY, code VARCHAR, type VARCHAR, hs_id VARCHAR, name VARCHAR, desc VARCHAR, loc VARCHAR, org VARCHAR, email VARCHAR, phone VARCHAR, sn VARCHAR, ip VARCHAR, caption VARCHAR, x VARCHAR, y VARCHAR, zoom VARCHAR, media VARCHAR, url VARCHAR, mediatype VARCHAR, urltarget VARCHAR, transition VARCHAR, interval VARCHAR, duration VARCHAR );',
'CREATE TABLE IF NOT EXISTS cfg (idx varchar,status varchar,dttm varchar,kode varchar,grp varchar,progid varchar,key varchar,val varchar,text varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS cmds ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS cpapi2 ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS funcs ( idx varchar, status varchar, dttm varchar, koko varchar, koco varchar, coko varchar, coco varchar, type varchar, func varchar, args varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS inv ( status text, dttm text, id text, grp text, strain text, room text, hold text, phase text, phasedt text, phaselen text, harvest text, notes text, desc text );',
'CREATE TABLE IF NOT EXISTS kono ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS koye ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS kup ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS kup_tn ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS lab ( status text, dttm text, llno text, lab text, package text, item text, cat text, test text, testdt text, overall text, testname text, passed text, result text, resultdt text, notes text, desc text);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS links ( idx varchar, status varchar, dttm varchar, grp varchar, cat varchar, code varchar, url varchar, img varchar, tn varchar, img1 varchar, img2 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS log (idx varchar,status varchar,dttm varchar,kode varchar,progid varchar,logtext varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os varchar, led_type varchar, led_date varchar, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS pot ( licence text, dttm text, status text, name text, test1_dt text, test1_val text, test2_dt text, test2_val text, test3_dt text, test3_val text, test4_dt text, test4_val text, test5_dt text, test5_val text, notes text, desc text); ',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS tl (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tla (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tlc (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tld (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS tle (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS us ( us_id, status varchar, dttm varchar, code varchar, grp varchar, my_id varchar, x varchar, y varchar, name varchar, phone varchar, email varchar, twitter varchar, fb varchar, yt varchar, url_http varchar, url_here varchar, url_imgvarchar, url_img1 varchar, url_img2 varchar, url_tn varchar, title varchar, comment varchar, desc varcher); ',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
''
)
# 'CREATE TABLE IF NOT EXISTS vol ( vol varchar, status varchar, kludge1 varchar, usr varchar, grp varchar, size varchar, mth varchar, dd varchar, yytm varchar, dir varchar, desc varchar );',
# 'CREATE TABLE IF NOT EXISTS vols ( vol varchar, status varchar, kludge1 varchar, usr varchar, grp varchar, size varchar, mth varchar, dd varchar, yytm varchar, dir varchar, desc varchar );',
# print "EXIT_3240 {} {} -= sql_schema sqlopt={} =- {}_{} {}-{} fildb3={} sqltbl={} ".format(progid, dttm, sqlopt, db3nam,sqltbl, j,k, fildb3,sqltbl )
j=0
k=0
for sql_table in sql_tables:
j=j+1
print "{}. {}".format(j, sql_table)
tblnames=""
fildb3="ko0.db3"
sqltbl="schema"
sql3=sql3_db(fildb3)
db = sql3.cursor()
sql_drop_schema ="drop table {}".format( sqltbl )
db.execute(sql_drop_schema)
sql_cr_schema="CREATE TABLE IF NOT EXISTS schema ( koid varchar, kodt varchar, kostat varchar, j varchar, k varchar, tblid varchar, tblnam varchar, fldcnt varchar, fldnames varchar, sqlcr varchar, values varchar, b64 varchar );"
db.execute(sql_cr_schema)
sqltbl="schemas"
sql_drop_schemas ="drop table {}".format( sqltbl )
db.execute(sql_drop_schemas)
sql_cr_schemas="CREATE TABLE IF NOT EXISTS schemas ( koid varchar, kodt varchar, kostat varchar, j varchar, k varchar, tblid varchar, tblnam varchar, fldcnt varchar, fldnames varchar, sqlcr varchar, values varchar, desc varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );"
db.execute(sql_cr_schemas)
print "EXIT_2755 xxxxxxxxxxxxxxxxxxxxxxxx"
exit()
sqltbl="schema"
sql_ins_schema="INSERT OR REPLACE INTO schema ( koid varchar, kodt varchar, kostat varchar, j varchar, k varchar, tblid varchar, tblnam varchar, fldcnt varchar, fldnames varchar, sqlcr varchar, values varchar, b64 varchar );"
db.execute(sql_ins_schema)
sqltbl="schemas"
sql_ins_schemas="INSERT OR REPLACE INTO schemas ( koid varchar, kodt varchar, kostat varchar, j varchar, k varchar, tblid varchar, tblnam varchar, fldcnt varchar, fldnames varchar, sqlcr varchar, values varchar, b64 varchar );"
db.execute(sql_ins_schemas)
sql_schem_fields = 'koid, kodt, kostat, j, k, tblid, tblnam, fldcnt, fldnames, sqlcr, values, b64',
sql_schem_values = "'koid','kodt','kostat','j','k','tblid','tblnam','fldcnt','fldnames','sqlcr','values','b64'",
sql_ins_schem="insert into schem values ( {} );".format( sqltbl, sql_schem_fields, sql_schem_values )
sqltbl="schema"
sql_schema_fields = "koid, kodt, kostat, j, k, tblid, tblnam, fldcnt, fldnames, sqlcr, values, desc, pathfile, url, img, tn, title, name, begdt, enddt, desc, h, w, x, y, z, color, speed, b64"
sql_schema_values = "koid','kodt','kostat','j','k','tblid','tblnam','fldcnt','fldnames','sqlcr','values','desc','pathfile','url','img','tn','title','name','begdt','enddt','desc','h','w','x','y','z','color','speed','b64'"
sql_ins_schema = "insert into {} ( {} ) values ( {} );".format( sqltbl, sql_schema_fields, sql_schema_values )
db.execute( sql_ins_schema )
sql_ins_schem_val1 = """insert into schem ( koid ) values ( 'schem_koid-1');"""
db.execute(sql_ins_schem_val1)
for sql_table in sql_tables:
if( len(sql_table) <30 ):
k=k+1
continue
j=j+1
tbltext=sql_table
tbltext=tbltext.split( "(" )[0]
tbltext=tbltext.replace("(", "")
spacecnt=len(tbltext.split(" "))
tbltext=tbltext.replace("CREATE TABLE IF NOT EXISTS", "")
tbltext=tbltext.replace("CREATE TABLE", "")
tbltext=tbltext.replace("create table if not exists", "")
tbltext=tbltext.replace("create table", "")
tbltext=tbltext.replace(" ", "")
tblnam=tbltext
tblnames += "{} ".format(tblnam)
# print "BUGS_3240 {} {} -= sql_schema sqlopt={} =- {}-{} sqltbl={} tblnam={} tblnames={}\n\n".format( progid, dttm, sqlopt, j,k,sqltbl,tblnam,tblnames)
# print "BUGS_3250 {} {} -= sql_schema sqlopt={} =- {}-{} sqltbl={} tblnam={} tblnames={}\n\n".format( progid, dttm, sqlopt, j,k,sqltbl,tblnam,tblnames)
if( sqltbl == "" ):
return( tblnames)
tblcnt=len(sql_tables)
if( sqltbl.isdigit() == True):
tblnum=sqltbl
print "BUGS_3271 FIND_BY_NUM sqltbl={} tblcnt={}".format(sqltbl, tblcnt)
else:
print "BUGS_3272 FIND_BY_ANME sqltbl={} tblcnt={}".format(sqltbl, tblcnt)
table=""
if( sqltbl.isdigit() == True ):
"BUGS_3271 ISDIGIT TBL_BY_NUMBER FIND sqltbl={}".format(sqltbl)
tblnum = sqltbl
tbllen=len(sql_tables)
if( tblnum > tbllen ):
return( tblnames)
j=0
for sql_table in sql_tables:
j=j+1
if( tblnum == j ):
print "FOIND_3285 j={} tblnum={} sql_table={}".format(j,tblnum, sql_table)
return(sql_table)
if( tblnum <= tbllen ):
"BUGS_3260 ISDIGIT TBL_BY_NUMBER DONE tblnum={} tbllen={} sqltbl={}".format(tblnum,tbllen,sqltbl)
tblnum=tbllen-1
sql_table = sql_tables[tblnum]
return( sql_table)
else:
return( tblnames )
"EXIT_3290 ISDIGIT TBL_BY_NUMBER NOTFOUND sqltbl={}".format(sqltbl)
exit()
# """
# Create a new ko0 into the ko0 table
# :param sql3:
# :param ko0:
# :return: ko0
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists ko0 ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists ko0 ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists ko0 ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """insert into ko0 ( name varchar, begdt varchar, enddt varchar );"""
dttm=ko_dttm
sql3=sql3_db(fildb3)
txtpsv=""
rows = ["","","","","","","","","","","","","","","","","","","","","","",""]
# row=""
for r in range(0,20):
rows[r]="ko0_{}".format(r)
for j in range(1,100):
dttm=ko_dttm("")
ko0id="{}".format(rows[0])
# ko0dt="{}".format(rows[1])
ko0dt="{}".format(dttm)
status="{}".format(rows[2])
pathfile="{}".format(rows[3])
url="{}".format(rows[4])
img="{}".format(rows[5])
tn="{}".format(rows[6])
title="{}".format(rows[7])
name="{}".format(rows[8])
begdt="{}".format(rows[9])
enddt="{}".format(rows[10])
j="{}".format(rows[11])
k="{}".format(rows[12])
desc="{}".format(rows[13])
h="{}".format(rows[14])
w="{}".format(rows[15])
x="{}".format(rows[16])
y="{}".format(rows[17])
z="{}".format(rows[17])
color="{}".format(rows[18])
speed="{}".format(rows[19])
b64="{}".format(rows[20])
sql_ko0_fields="'ko0id','ko0dt','status','pathfile','url', 'img','tn','title','name','begdt','enddt','j','k','desc','h', 'w','x','y','z','color','speed','b64'"
sql_ko0_values = "'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}', '{}','{}','{}','{}','{}','{}','{}','{}'".format(ko0id,ko0dt,status,pathfile,url,img,tn,title,name,begdt,enddt,j,k,desc,h,w,x,y,z,color,speed,b64)
txtpsv += "'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'| '{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'\n".format(ko0id,ko0dt,status,pathfile,url,img,tn,title,name,begdt,enddt,j,k,desc,h,w,x,y,z,color,speed,b64)
sql_ins_ko0_v = "insert into {} values( {} )".format( sqltbl, sql_ko0_values )
# db = sql3.cursor()
db.execute( sql_ins_ko0_v )
sql_ins_ko0_fv = "insert into {} ( {} ) values ( {} )".format( sqltbl,sql_ko0_fields, sql_ko0_values )
# db = sql3.cursor()
db.execute( sql_ins_ko0_fv )
sql="insert into ko0 ( ko0id,ko0dt,status) values('ko0','begdt_sk_100', 'begdt_sk_100' )"
db.execute(sql)
sql="insert into ko0 ( pathfile,url,img ) values('ko0','begdt_sk_200', 'begdt_sk_200' )"
db.execute(sql)
sql="insert into ko0 ( j,k,z ) values('ko0','begdt_sk_300', 'begdt_sk_300' )"
db.execute(sql)
sql="insert into ko0 (w,h,z) values('ko0','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into ko0 (begdt,enddt,status) values('ko0','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into ko0 (b64,desc,img) values('ko0','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into ko0 ('ko0id','ko0dt','status') values('ko0','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into ko0 (ko0id,begdt,enddt) values('ko0','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko0 ('ko0id','ko0dt','status' ) values('ko0{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko0 sql3_cr_ko0 {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into ko0 values('ko0_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "ko0 j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO ko0 (name,begdt,enddt) VALUES(?,?,?)"
# ko0 = ("name1","begdt1","enddt1")
# db.execute(sql, ko0)
# ko0 = ("name2","begdt2","enddt2")
# db.execute(sql, ko0)
return db.lastrowid
def sql3_ko0_kofiles(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
import ko_cfg
import csv
progid= ko_cfg.progid
dttm=ko_dttm("dt")
fildb3="{}.db3".format(progid)
fildb3="ko0.db3"
sqltbl="ko0"
sqlopt=""
sqlcmd="select * from ko0"
db3nam="{}.db3".format(fildb3)
db3nam = fildb3.split(".")[0]
db3tbl = "{}_{}".format( db3nam, sqltbl)
sqlfld=""
sqlval=""
filsql="{}_{}.sql".format(db3nam, sqltbl)
filpsv="{}_{}.psv".format(db3nam, sqltbl)
filcsv="{}_{}.csv".format(db3nam, sqltbl)
filtxt="{}_{}.txt".format(db3nam, sqltbl)
txtsql=""
txtpsv=""
txtcsv=""
txttxt=""
sqlfld=""
sqlopt="create"
sqlcmd="select * from ko0"
j=0
k=0
a0=""
a1=""
a2=""
a3=""
a4=""
# arglen=len(args)
# if( arglen >1 ): a1=args[1]
# if( arglen >2 ): a2=args[2]
# if( arglen >3 ): a3=args[3]
# if( arglen >4 ): a4=args[4]
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
# ------------------
# pqpqpqpqpqpqpqpqpq sql3_ko0
sqlcmd=""
sql3 = sql3_db(fildb3)
# print "SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} db3tbl={} sql3={} ".format ( progid, dttm, fildb3, sqltbl, j,k, fildb3, db3tbl, sql3)
# print "EXIT_830 SQL3_KO0_HEAD: {} {} -= sql3_ko0 =- {}_{} {}-{} fildb3={} sql3={} ".format ( progid, dttm, db3nam, sqltbl, j,k, fildb3, sql3)
with sql3:
ko0_title = ('sql3_ko0 sqlite3 python and mejkwii make three', '20190219_0100', '20190219_0245');
# sql3_cr_ko0(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
sql3_cr_ko0_kofiles_text = sql3_cr_ko0_kofiles(sql3, fildb3, sqltbl, sqlopt,sqlcmd, sqlfld, sqlval)
# ------------------
# bdbdbdbdbdbdbdbdbd sql3_ko0
print "{} {} SQL3_ko0 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
print "SQL3_KO0_TAIL: {} {} -= sql3_ko0 =- {}_{} {}-{} ".format ( progid, dttm, fildb3, sqltbl, j,k )
exit
def sql3_cr_ko0_kofiles(sql3, fildb3, sqltbl, sqlopt, sqlcmd, sqlfld, sqlval):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new ko0 into the ko0 table
# :param sql3:
# :param ko0:
# :return: ko0
# """
j=0
k=0
# for sql_table in sql_tables:
# j=j+1
# print "{}. {}".format(j, sql_table)
tblnames=""
fildb3="ko0.db3"
sqltbl="kofiles"
db3nam = "{}".format(fildb3.split(".")[0])
filsql="{}_{}.sql".format(db3nam,sqltbl)
filpsv="{}_{}.psv".format(db3nam,sqltbl)
filcsv="{}_{}.csv".format(db3nam,sqltbl)
filtxt="{}_{}.txt".format(db3nam,sqltbl)
sql3=sql3_db(fildb3)
db = sql3.cursor()
sqltbl="kofiles"
sql_drop_ko0_kofiles ="DROP TABLE {}".format( sqltbl )
db.execute(sql_drop_ko0_kofiles)
db.execute("drop table files")
db.execute("drop table kofiles")
db.execute( "create table kofiles ( koid varchar, kodt varchar, desc varchar )" )
db.execute( "insert into kofiles ('koid', 'kodt', 'desc' ) values ( 'koid0', 'kodt0', 'desc0' )" )
db.execute( "insert into kofiles ('koid', 'kodt', 'desc' ) values ( 'koid1', 'kodt1', 'desc1' )" )
db.execute( "insert into kofiles ('koid', 'kodt', 'desc' ) values ( 'koid2', 'kodt2', 'desc2' )" )
sql_cr_ko0_kofiles = "CREATE TABLE IF NOT EXISTS {} ( ko0id varchar, ko0dt varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, b64 varchar )".format(sqltbl)
sql_cr_ko0_kofiles = "create table kofiles ( koid varchar, kodt varchar, kostat varchar, line varchar )"
db.execute(sql_cr_ko0_kofiles)
sql_ins_jk = "insert into kofiles ( 'koid', 'kodt', 'kostat', 'list' ) values( 'koid_0', 'kodt_0', 'kostat_0', 'list_0' )"
db.execute(sql_ins_jk )
sql_ins_jk = "insert into kofiles values( 'koid_0', 'kodt_0', 'kostat_0', 'list_0' )"
db.execute(sql_ins_jk)
sql_ins_jk = "insert into kofiles values( 'koid_1', 'kodt_1', 'kostat_1', 'list_1' )"
db.execute(sql_ins_jk)
sql_ins_jk = "insert into kofiles values( 'koid_2', 'kodt_2', 'kostat_2', 'list_2' )"
db.execute(sql_ins_jk)
# sql_ins_jk = "insert into kofiles ( ko0id ) values ( 'ko0id_0' )"
# db.execute(sql_ins_jk)
# sqltbl="test"
# sql_cr_ko0_test = "CREATE TABLE IF NOT EXISTS {} ( koid varchar, dttm varchar, status varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, oldfil varchar, newfil varchar, exif varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, b64 varchar )".format(sqltbl)
# db.execute(sql_cr_ko0_kofiles)
koid="koid_{}".format( j )
status="status_{}".format( j )
pathfile="pathfile{}".format( j )
img="imgt_{}".format( j )
desc="desc_{}".format( j )
sql_ins_jk = "INSERT OR REPLACE INTO kofiles ( 'dttm', 'status', 'pathfile', 'img', 'desc' ) values ( 'dttm_v', 'status_v', 'pathfile_v', 'img_v', 'desc_v' )"
sql_ins_jk = "insert into kofiles ( koid ) values ( 'koid_py1' )"
# db.execute(sql_ins_jk)
exit()
sql_kofiles_v = txtpsv = "'koid','dttm','status','perms','k1','k2','permu','permg','kludge','size','mth','dd','hhmm','pathfile','path','ilevarchar','oldfil','newfil','exifvarchar','yyyy','begdt','enddt','url','img','tn','grp','id','desc','b64'"
txtsql = "INDSERT OR REPLACE INTO {} ( {} )".format( sqltbl, sql_kofiles_v )
o = open( filsql, "w")
o.write( "{}\n".format( txtsql))
o.close()
rows = {}
kofiles = {
'koid': "{}".format('row_0'),
'dttm': "{}".format('row_1'),
'status': "{}".format('row_2'),
'perms': "{}".format('row_3'),
'k1': "{}".format('row_4'),
'k2': "{}".format('row_5'),
'permu': "{}".format('row_6'),
'permg': "{}".format('row_7'),
'kludge': "{}".format('row_9'),
'size': "{}".format('row_10'),
'mth': "{}".format('row_11'),
'dd': "{}".format('row_12'),
'hhmm': "{}".format('row_13'),
'pathfile': "{}".format('row_14'),
'path' : "{}".format('row_15'),
'ilevarchar' : "{}".format('row_16'),
'oldfil' : "{}".format('row_17'),
'newfil' : "{}".format('row_18'),
'exifvarchar' : "{}".format('row_19'),
'yyyy' : "{}".format('row_20'),
'begdt' : "{}".format('row_21'),
'enddt' : "{}".format('row_22'),
'url' : "{}".format('row_23'),
'img' : "{}".format('row_24'),
'tn' : "{}".format('row_25'),
'grp' : "{}".format('row_226'),
'id' : "{}".format('row_27'),
'desc' : "{}".format('row_28'),
'b64' : "{}".format('row_29')
}
# sql_ko0_kofiles_v = "'{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{{', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}'".format( koid,dttm,status,perms,k1,k2,permu,permg,kludge,size,mth,dd,hhmm,pathfile,path,ilevarchar,oldfil,newfil,exifvarchar,yyyy,,begdt,enddt,url,img,tn,grp,id,desc,b64)
sql_ko0_kofiles_v = ""
sql_ins_ko0_kofiles = "INSERT OR REPLACE INTO TABKE {} values ( {} )".format( sqltbl, sql_ko0_kofiles_v )
# db.execute(sql_ins_ko0_kofiles)
o = open( filsql, "a" )
o.write( "{}\n".format( sql_ins_ko0_kofiles ))
o.close()
koid="koid_ko0"
# txtpsv = "{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{{|{}|{}|{}|{}|{}|{}|{}|{}|{}|{{| ".format( kofiles{koid}, kofiles{dttm},kofiles{status},perms,k1,k2,permu,permg,kludge,size,mth,dd,hhmm,pathfile, path,file,oldfil,newfil,exif,yyyy,begdt,enddt,url,img,tn,grp,id,desc,b64)
txtpsv = "koid|dttm|status|perms|k1|k2|permu|permg|kludge|size|mth|dd|hhmm|pathfile|path|ilevarchar|oldfil|newfil|exifvarchar|yyyy||begdt|enddt|url|img|tn|grp|id|desc|b64"
o = open( filpsv, "a")
o.write( "{}\n".format(txtpsv))
o.close()
txtcsv=txtpsv.replace("|", ",")
o= open( filcsv, "a")
o.write( "{}\n".format(txtcsv))
o.close()
print "EXIT_3100 xxxxxxxxxxxxxxxxxxxxxxxx KOFILES"
exit()
sqltbl="kofiles"
sql_ins_ko2_kofiles_val1 = "( koid ) values ( 'ko0id_0' );"
db.execute(sql_ins_ko0_kofiles_val1)
sql_ins_ko0_kofiles_val2 = "( koid, dttm ) values ('ko0id_1','dttm_1' )"
db.execute(sql_ins_ko0_kofiles_val2)
sql_ins_ko0_kofiles_val2 = "( koid, dttm, status ) values ('ko0id_2', 'dttm_2', 'status_1' )"
db.execute(sql_ins_ko0_kofiles_val3)
sql_ins_ko0_kofiles_vals = "INSERT OR REPLACE INTO values ( 'koid_0', 'dttm_0', 'status_0', 'perms' ,'k1_0','k2_0','permu_0','permg_0','kludge_0','size_0','mth_0','dd_0','hhmm_0','pathfile_0','path_0','file_0','ext_0','oldfil_0','newfil_0','exif_0','exifdt_0','yyyy_0','mm_0','begdt_0','enddt_0','url_0','img_0','tn_0','grp_0','id_0','desc');"
db.execute(sql_ins_ko0_kofiles_vals)
rows = {}
kofiles = {
'koid' : "{}".format('row_0'),
'dttm': "{}".format('row_1'),
'status' : "{}".format('row_2'),
'perms' : "{}".format('row_3'),
'k1' : "{}".format('row_4'),
'k2' : "{}".format('row_5'),
'permu' : "{}".format('row_6'),
'permg' : "{}".format('row_7'),
'kludge' : "{}".format('row_9'),
'size' : "{}".format('row_10'),
'mth' : "{}".format('row_11'),
'dd' : "{}".format('row_12'),
'hhmm' : "{}".format('row_13'),
'pathfile' : "{}".format('row_14'),
'path' : "{}".format('row_15'),
'ilevarchar' : "{}".format('row_16'),
'oldfil' : "{}".format('row_17'),
'newfil' : "{}".format('row_18'),
'exifvarchar' : "{}".format('row_19'),
'yyyy' : "{}".format('row_20'),
'begdt' : "{}".format('row_21'),
'enddt' : "{}".format('row_22'),
'url' : "{}".format('row_23'),
'img' : "{}".format('row_24'),
'tn' : "{}".format('row_25'),
'grp' : "{}".format('row_226'),
'id' : "{}".format('row_27'),
'desc' : "{}".format('row_28'),
'b64' : "{}".format('row_29')
}
# .format( koid,dttm,tatus,perms,k1,2,permu,permg,kludge,size,mth,dd,hhmm,pathfile,path,file,ext,oldfil,newfil,exif,exifdt,yyyy,mm,begdt,enddt,url,img,tn,grp,id,desc)
sql_cr_ko0_kofiles_f = "'koid','dttm','status','perms','k1','k2','permu','permg','kludge','size','mth','dd','hhmm','pathfile','path','file','ext','oldfil','newfil','exif','exifdt','yyyy','mm','begdt','enddt','url','img','tn','grp','id','desc');"
sql_cr_ko0_kofiles_v = "'koid_{}','dttm_{}',_{}'status_{}','perms_{}','k1_{}','k2_{}','permu_{}','permg_{}','kludge_{}','size_{}','mth_{}','dd_{}','hhmm_{}','pathfile_{}','path_{}','file_{}','ext_{}','oldfil_{}','newfil_{}','exif_{}','exifdt_{}','yyyy_{}','mm_{}','begdt_{}','enddt_{}','url_{}','img_{}','tn_{}','grp_{}','id_{}','desc_{}');".format( koid,dttm,tatus,perms,k1,2,permu,permg,kludge,size,mth,dd,hhmm,pathfile,path,file,ext,oldfil,newfil,exif,exifdt,yyyy,mm,begdt,enddt,url,img,tn,grp,id,desc)
sql_cr_ko0_kofiles_fv = "INSERT OR REPLACE INTO {} ( {} ) values ( {} )".format( sqltbl, cr_ko0_kofiles_f, cr_ko0_kofiles_v )
db.execute( sql_cr_ko0_kofiles_fv )
sql_cr_ko0_kofiles = 'CREATE TABLE IF NOT EXISTS kofiles ( koid, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, mm varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
db.execute(sql_ins_ko0_kofiles)
print "BUGS_3134 {} {} -= sql_ko0_kofiles sqlopt={} =- {}-{} sqltbl={} tblnam={} tblnames={}\n\n".format( progid, dttm, sqlopt, j,k,sqltbl,tblnam,tblnames)
exit()
for sql_table in sql_tables:
if( len(sql_table) <30 ):
k=k+1
continue
j=j+1
tbltext=sql_table
tbltext=tbltext.split( "(" )[0]
tbltext=tbltext.replace("(", "")
spacecnt=len(tbltext.split(" "))
tbltext=tbltext.replace("CREATE TABLE IF NOT EXISTS", "")
tbltext=tbltext.replace("CREATE TABLE", "")
tbltext=tbltext.replace("create table if not exists", "")
tbltext=tbltext.replace("create table", "")
tbltext=tbltext.replace(" ", "")
tblnam=tbltext
tblnames += "{} ".format(tblnam)
# print "BUGS_3240 {} {} -= sql_schema sqlopt={} =- {}-{} sqltbl={} tblnam={} tblnames={}\n\n".format( progid, dttm, sqlopt, j,k,sqltbl,tblnam,tblnames)
# print "BUGS_3250 {} {} -= sql_schema sqlopt={} =- {}-{} sqltbl={} tblnam={} tblnames={}\n\n".format( progid, dttm, sqlopt, j,k,sqltbl,tblnam,tblnames)
if( sqltbl == "" ):
return( tblnames)
tblcnt=len(sql_tables)
if( sqltbl.isdigit() == True):
tblnum=sqltbl
print "BUGS_3271 FIND_BY_NUM sqltbl={} tblcnt={}".format(sqltbl, tblcnt)
else:
print "BUGS_3272 FIND_BY_ANME sqltbl={} tblcnt={}".format(sqltbl, tblcnt)
table=""
if( sqltbl.isdigit() == True ):
"BUGS_3271 ISDIGIT TBL_BY_NUMBER FIND sqltbl={}".format(sqltbl)
tblnum = sqltbl
tbllen=len(sql_tables)
if( tblnum > tbllen ):
return( tblnames)
j=0
for sql_table in sql_tables:
j=j+1
if( tblnum == j ):
print "FOIND_3285 j={} tblnum={} sql_table={}".format(j,tblnum, sql_table)
return(sql_table)
if( tblnum <= tbllen ):
"BUGS_3260 ISDIGIT TBL_BY_NUMBER DONE tblnum={} tbllen={} sqltbl={}".format(tblnum,tbllen,sqltbl)
tblnum=tbllen-1
sql_table = sql_tables[tblnum]
return( sql_table)
else:
return( tblnames )
"EXIT_3290 ISDIGIT TBL_BY_NUMBER NOTFOUND sqltbl={}".format(sqltbl)
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists ko0 ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists ko0 ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists ko0 ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """insert into ko0 ( name varchar, begdt varchar, enddt varchar );"""
dttm=ko_dttm
sql3=sql3_db(fildb3)
txtpsv=""
rows = ["","","","","","","","","","","","","","","","","","","","","","",""]
# row=""
for r in range(0,20):
rows[r]="ko0_{}".format(r)
for j in range(1,100):
dttm=ko_dttm("")
ko0id="{}".format(rows[0])
# ko0dt="{}".format(rows[1])
ko0dt="{}".format(dttm)
status="{}".format(rows[2])
pathfile="{}".format(rows[3])
url="{}".format(rows[4])
img="{}".format(rows[5])
tn="{}".format(rows[6])
title="{}".format(rows[7])
name="{}".format(rows[8])
begdt="{}".format(rows[9])
enddt="{}".format(rows[10])
j="{}".format(rows[11])
k="{}".format(rows[12])
desc="{}".format(rows[13])
h="{}".format(rows[14])
w="{}".format(rows[15])
x="{}".format(rows[16])
y="{}".format(rows[17])
z="{}".format(rows[17])
color="{}".format(rows[18])
speed="{}".format(rows[19])
b64="{}".format(rows[20])
sql_ko0_fields="'ko0id','ko0dt','status','pathfile','url', 'img','tn','title','name','begdt','enddt','j','k','desc','h', 'w','x','y','z','color','speed','b64'"
sql_ko0_values = "'{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}', '{}','{}','{}','{}','{}','{}','{}','{}'".format(ko0id,ko0dt,status,pathfile,url,img,tn,title,name,begdt,enddt,j,k,desc,h,w,x,y,z,color,speed,b64)
txtpsv += "'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'| '{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'|'{}'\n".format(ko0id,ko0dt,status,pathfile,url,img,tn,title,name,begdt,enddt,j,k,desc,h,w,x,y,z,color,speed,b64)
sql_ins_ko0_v = "insert into {} values( {} )".format( sqltbl, sql_ko0_values )
# db = sql3.cursor()
db.execute( sql_ins_ko0_v )
sql_ins_ko0_fv = "insert into {} ( {} ) values ( {} )".format( sqltbl,sql_ko0_fields, sql_ko0_values )
# db = sql3.cursor()
db.execute( sql_ins_ko0_fv )
sql="insert into ko0 ( ko0id,ko0dt,status) values('ko0','begdt_sk_100', 'begdt_sk_100' )"
db.execute(sql)
sql="insert into ko0 ( pathfile,url,img ) values('ko0','begdt_sk_200', 'begdt_sk_200' )"
db.execute(sql)
sql="insert into ko0 ( j,k,z ) values('ko0','begdt_sk_300', 'begdt_sk_300' )"
db.execute(sql)
sql="insert into ko0 (w,h,z) values('ko0','begdt_sk_500', 'begdt_sk_500' )"
db.execute(sql)
sql="insert into ko0 (begdt,enddt,status) values('ko0','begdt_sk_600', 'begdt_sk_600' )"
db.execute(sql)
sql="insert into ko0 (b64,desc,img) values('ko0','begdt_sk_700', 'begdt_sk_700' )"
db.execute(sql)
sql="insert into ko0 ('ko0id','ko0dt','status') values('ko0','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into ko0 (ko0id,begdt,enddt) values('ko0','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into ko0 ('ko0id','ko0dt','status' ) values('ko0{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko0 sql3_cr_ko0 {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into ko0 values('ko0_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "ko0 j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO ko0 (name,begdt,enddt) VALUES(?,?,?)"
# ko0 = ("name1","begdt1","enddt1")
# db.execute(sql, ko0)
# ko0 = ("name2","begdt2","enddt2")
# db.execute(sql, ko0)
return db.lastrowid
def _get_col_datatypes(fin):
dr = csv.DictReader(fin) # comma is default delimiter
fieldTypes = {}
for entry in dr:
feildslLeft = [f for f in dr.fieldnames if f not in fieldTypes.keys()]
if not feildslLeft: break # We're done
for field in feildslLeft:
data = entry[field]
# Need data to decide
# TODO: Currently there's no support for DATE in sqllite
if len(data) == 0:
continue
if data.isdigit():
fieldTypes[field] = "INTEGER"
else:
fieldTypes[field] = "TEXT"
if len(feildslLeft) > 0:
raise Exception("Failed to find all the columns data types - Maybe some are empty?")
return fieldTypes
def escapingGenerator(f):
for line in f:
yield line.encode("ascii", "xmlcharrefreplace").decode("ascii")
# TODO: implement output to file
def csvToDb(csvFile, outputToFile = False):
# Keep the order of the columns name just as in the CSV
# Set field and type
# Generate create table statement:
with open(csvFile,mode='r', encoding="ISO-8859-1") as fin:
dt = _get_col_datatypes(fin)
fin.seek(0)
reader = csv.DictReader(fin)
fields = reader.fieldnames
cols = []
for f in fields:
cols.append("%s %s" % (f, dt[f]))
sqlcmd = "CREATE TABLE ads (%s)" % ",".join(cols)
db = sql3.cursor()
db.execute(sql)
fin.seek(0)
reader = csv.reader(escapingGenerator(fin))
# Generate insert statement:
sqlcmd = "INSERT INTO ads VALUES(%s);" % ','.join('?' * len(cols))
db.executemany(sqlcmd, reader)
db.commit()
return db
# ------------------
print "{} {} SQL3_ko4 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_ko_5(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
arglen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
filpsv="{}.psv".format(progid)
filtxt="{}.txt".format(progid)
sqltbl = "csv"
dttm=ko_dttm("")
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
# ------------------
import csv
with open(filcsv) as file_csv:
reader_csv = csv.reader(file_csv, delimiter=',')
line_count = 0
for row in reader_csv:
if line_count == 0:
print "row={}".format(row)
# print(f'Column names are {", ".join(row)}')
line_count += 1
else:
# print(f'\t{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
print "row1={} row2={}".format(row[1], row[2])
line_count += 1
# print(f'Processed {line_count} lines.')
# sql3 = sql3_db(sys.argv[1]) # database file input
# checks to see if table exists and makes a fresh table.
sql3 = sql3_db(fildb3)
db = sql3.cursor()
db.executescript("""
DROP TABLE IF EXISTS csv;
CREATE TABLE IF NOT EXISTS csv (COL1 TEXT, COL2 TEXT);
""")
sqlcmd_drop="DROP TABLE IF EXISTS csv"
print "BUGS_950 sqlcmd_drop={}".format(sqlcmd_drop)
db.execute(sqlcmd_drop)
sqlcmd_create=" CREATE TABLE IF NOT EXISTS csv (COL1 TEXT, COL2 TEXT);"
print "BUGS_950 sqlcmd_create={}".format(sqlcmd_create)
db.execute(sqlcmd_create)
# with open(sys.argv[2], "rb") as f: # CSV file input
# with open(filcsv) as csv_file:
# csv_reader = csv.reader(csv_file, delimiter=',')
# no header information with delimiter
# CSV file input
sqlcmd=""
# print( "BUGS_960 filcsv={}".format(filcsv)
# with open(filcsv, "rb") as f:
# reader = f.reader(f, delimiter=',')
# csv_reader = csv.reader(csv_file, delimiter=',')
sqltbl="csv"
filcsv="{}.csv".format(progid)
print "BUGS_970 filcsv={}".format(filcsv)
j=0
with open(filcsv) as file_csv:
reader_csv = csv.reader(file_csv, delimiter=',')
line_count = 0
print "BUGS_980 reader_csv={}".format(reader_csv)
# Appends data from CSV file representing and handling of text
j=0
for row in reader_csv:
j=j+1
print "{} {} SQL3_ko5 filcsv={} row={} sqlcmd={} filcsv={}".format(progid,dttm,j, fildb3,sqltbl,sqlcmd, filcsv)
sqlcmd = [unicode(row[0], "utf8"), unicode(row[1], "utf8")]
print "BUGSCSV row0={} row1={} filcsv={}".format( row[0], row[1], filcsv )
# db.execute("INSERT INTO {} (COL1, COL2) VALUES(?, ?);".format(sqltbl)(row[0], row[1]))
sqlcmd='insert into {} (COL1,COL2) values("{}","{}");\n'.format( sqltbl, row[0], row[1] )
print "BUGSCSV sqlcmd={} filcsv={}".format( sqlcmd, filcsv )
sql3.commit()
# sql3.close() # closes c
# ------------------
print "{} {} SQL3_ko5 fildb3={} sqltbl={} sqlcmd={} filcsv={}".format(progid,dttm,fildb3,sqltbl,sqlcmd, filcsv)
exit
def sql3_ko_6(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv, sqlite3
arglen=len(args)
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="list"
sqlcmd="select * from list"
# ------------------
def _get_col_datatypes(fin):
dr = csv.DictReader(fin) # comma is default delimiter
fieldTypes = {}
for entry in dr:
feildslLeft = [f for f in dr.fieldnames if f not in fieldTypes.keys()]
if not feildslLeft: break # We're done
for field in feildslLeft:
data = entry[field]
# Need data to decide
if len(data) == 0:
continue
if data.isdigit():
fieldTypes[field] = "INTEGER"
else:
fieldTypes[field] = "TEXT"
# TODO: Currently there's no support for DATE in sqllite
if len(feildslLeft) > 0:
raise Exception("Failed to find all the columns data types - Maybe some are empty?")
return fieldTypes
def escapingGenerator(f):
for line in f:
yield line.encode("ascii", "xmlcharrefreplace").decode("ascii")
# TODO: implement output to file
# Keep the order of the columns name just as in the CSV
def csvToDb(csvFile,dbFile,tablename, outputToFile = False):
# Set field and type
with open(csvFile,mode='r', encoding="ISO-8859-1") as fin:
dt = _get_col_datatypes(fin)
fin.seek(0)
reader = csv.DictReader(fin)
fields = reader.fieldnames
cols = []
for f in fields:
cols.append("\"%s\" %s" % (f, dt[f]))
# Generate create table statement:
# Generate create table statement:
# Generate insert statement:
sqlcmd = "create table if not exists \"" + tablename + "\" (%s)" % ",".join(cols)
print(sqlcmd)
sql3 = sql3_db(fildb3)
db = sql3.cursor()
db.execute(sqlcmd)
fin.seek(0)
reader = csv.reader(escapingGenerator(fin))
sqlcmd = "INSERT INTO \"" + tablename + "\" VALUES(%s);" % ','.join('?' * len(cols))
db.executemany(sqlcmd, reader)
db.commit()
db.close()
# ------------------
print "{} {} SQL3_ko6 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_ko_7(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
arglen=len(args)
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="tbl"
sqlcmd="select * from tbl"
# ------------------
# ------------------
tbl="tbl"
tbl1="{}1".format(tbl)
tbl2="{}2".format(tbl)
fld1="tblid"
fld2="dttm"
fld3="text"
tbl_text ="tbl_text"
tbl1_text="tbl1_text"
tbl2_text="tbl2_text"
tbl_val1="{}_val1".format(tbl)
tbl_val2="{}_val2_{}".format(tbl,dttm)
tbl_val3="{}_val3_{}".format(tbl, tbl_text)
tbl1_val1="{}_val1".format(tbl1)
tbl1_val2="{}_val2_{}".format(tbl1,dttm)
tbl1_val3="{}_val3_{}".format(tbl1, tbl1_text)
tbl2_val1="{}_val1".format(tbl2)
tbl2_val2="{}_val2_{}".format(tbl2, dttm)
tbl2_val3="{}_val3_{}".format(tbl2, tbl2_text)
print "{} {} MSG_1050 SQL3_ko7 {}-{} fildb3={} csvfil={}".format( progid,dttm,j,k, fildb3,filcsv)
if( os.path.exists(fildb3)):
# sql3 = sqlite3.connect(fildb3)
sql3 = sql3_db(fildb3)
db = sql3.cursor()
# sqlcmd = 'begin transaciton'
# db.execute(sqlcmd)
sqlcmd = "CREATE TABLE IF NOT EXISTS {} ( {} varchar, {} varchar, {} varchar );".format(tbl,fld1,fld2,fld3)
db.execute(sqlcmd)
sqlcmd = "CREATE TABLE IF NOT EXISTS {} ( {} varchar, {} varchar, {} varchar );".format(tbl1,fld1,fld2,fld3)
db.execute(sqlcmd)
sqlcmd = "CREATE TABLE IF NOT EXISTS {} ( {} varchar, {} varchar, {} varchar );".format(tbl2,fld1,fld2,fld3)
db.execute(sqlcmd)
# *** is there an implicit commit at this point ?! ***
# err "INSERT INTO tbl ("tblid1", "tbl_val2_20190219_184232", "tbl_val3_tbl_text" );"
# err "INSERT INTO tbl ("tblid", "dttm", "text" ) values ("tbl_val1", "20190219", "text1" )"
# mgs "INSERT INTO tbl ('tblid', 'dttm', 'text' ) values ('tblid1', '20190219', 'text1')"
# db = db.cursor()
# db = sql3.cursor()
name1 = 'jkwii'
phone1 = '3366858'
email1 = 'jkwii@example.com'
password1 = '12345'
name2 = 'skwii'
phone2 = '5557241'
email2 = 'skwii@example.com'
password2 = 'abcdef'
# Insert user 1
# db.execute('''INSERT INTO users(name, phone, email, password) VALUES(?,?,?,?)''', (name1,phone1, email1, password1))
sqlcmd='insert into users (name, phone, email, password) values ( "jkwii", "355-0111", "jkwii@somewhere.com", ".." )'
sqlcmd='insert into users ("name") values ("jkwii")'
sqlcmd='insert into users ("name") values ("jkwii_{}")'.format( j )
k=0
filsql="{}.sql".format(progid)
filpsv="{}.psv".format(progid)
filcsv="{}.csv".format(progid)
filtxt="{}.txt".format(progid)
txtsql=""
txtcsv=""
txtpsv=""
txttxt=""
o=open(filsql, "w")
o.close()
o=open(filpsv, "w")
o.close()
o=open(filcsv, "w")
o.close()
o=open(filtxt, "w")
o.close()
for j in "a b c 1 2 3".split(" "):
k=k+1
name="jkwii_{}".format(j)
phone="553-011{}".format(j)
email="jkwii_{}@shomwhere_{}.com".format(j,j)
password="{}{}{}{}{}".format(j,j,j,j,j)
pkey="j"
sqlcmd="insert into users values ('{}', '{}', '{}', '{}', '{}')".format(pkey,name,phone,email,password)
dttm=ko_dttm("dt")
tblid="jkwii_{}-{}".format(j,k)
dt="{}_{}-{}".format(dttm,j,k)
text="text_{}_{}-{}: abc123_{}-{}".format(j,k, dttm, j,k)
sqlcmd="insert into tbl values ('py_{}', '{}', 'py_{}_py')".format(tblid,dt,text)
txtsql="insert into tbl values ('sql_{}', '{}', 'sql_{}_sql')".format(tblid,dt,text)
txtsql="{};\n".format(sqlcmd)
txtsql=txtsql.replace( "py_", "sql_")
txtpsv="psv_{}|{}|psv_{}_psv\n".format(tblid,dt,text)
txtcsv="csv_{},{},csv_{}_csv\n".format(tblid,dt,text)
txttxt="txt_{} {} txt_{}_txt\n".format(tblid,dt,text)
o=open(filsql,"a")
txtsql="{}\n".format(txtsql)
o.write(txtsql)
o.close()
o=open(filcsv,"a")
o.write(txtcsv)
o.close()
o=open(filpsv,"a")
o.write(txtpsv)
o.close()
o=open(filtxt,"a")
o.write(txttxt)
o.close()
# sql3 = sql3_db(fildb3)
# db = sql3.cursor()
db.execute(sqlcmd)
#E db.close
print('First user inserted fildb3={} sqlcmd={}'.format(fildb3, sqlcmd) )
syscmd="sqlite3 {} < {}".format( fildb3, filsql )
print "{} {} sql3_ko7 SQL {}-{} syscmd={}".format(progid,dttm, j,k, syscmd)
# syscmd="ls -lat ko.*"
osout = os.system(syscmd)
print "osout={}".format(osout)
print "{} {} sql3_ko7 sql {}-{} syscmd={}".format(progid,dttm, j,k, syscmd)
syscmd='sqlite3 {} ".import {} {}"'.format( fildb3, filpsv, sqltbl )
print "{} {} sql3_ko7 PSV {}-{} syscmd={}".format(progid,dttm, j,k, syscmd)
osout = os.system(syscmd)
print "osout={}".format(osout)
print "{} {} sql3_ko7 psv {}-{} syscmd={}".format(progid,dttm, j,k, syscmd)
syscmd='sqlite3 -csv {} ".import {} {}"'.format( fildb3, filcsv, sqltbl )
print "{} {} sql3_ko7 CSV {}-{} syscmd={}".format(progid,dttm, j,k, syscmd)
osout = os.system(syscmd)
print "osout={}".format(osout)
print "{} {} sql3_ko7 csv {}-{} syscmd={}".format(progid,dttm, j,k, syscmd)
# Insert user 2
db.execute('''INSERT INTO users(name, phone, email, password)
VALUES(?,?,?,?)''', (name2,phone2, email2, password2))
print('Second user inserted')
# cursor.execute('''INSERT INTO users(name, phone, email, password)
# VALUES(:name,:phone, :email, :password)''',
# {'name':name1, 'phone':phone1, 'email':email1, 'password':password1})
#
# users = [(name1,phone1, email1, password1),
# (name2,phone2, email2, password2),
# (name3,phone3, email3, password3)]
# cursor.executemany(''' INSERT INTO users(name, phone, email, password) VALUES(?,?,?,?)''', users)
# db.commit()
#
# # 1
#
id = db.lastrowid
print('BUGS_1220 sql3_ko7 Last row id: %d' % id)
db.execute('''SELECT name, email, phone FROM users''')
user1 = db.fetchone() #retrieve the first row
print(user1[0]) #Print the first column retrieved(user's name)
# returns the first column in the query (name), row[1] returns email column.
all_rows = db.fetchall()
for row in all_rows:
row[0]
print('{0} : {1}, {2}'.format(row[0], row[1], row[2]))
# row[0] returns the first column in the query (name), row[1] returns email column.
db.execute('''SELECT name, email, phone FROM users''')
# for row in cursor:
all_rows = db.fetchall()
for row in all_rows:
print('{0} : {1}, {2}'.format(row[0], row[1], row[2]))
user_id = 3
db.execute('''SELECT name, email, phone FROM users WHERE id=?''', (user_id,))
user = db.fetchone()
# Update user with id 1
newphone = '3113093164'
userid = 1
db.execute('''UPDATE users SET phone = ? WHERE id = ? ''', (newphone, userid))
# Delete user with id 2
# delete_userid = 2
# db.execute('''DELETE FROM users WHERE id = ? ''', (delete_userid,))
# db.commit()
j=0
sqlcmd = "INSERT INTO {} ( '{}', '{}', '{}' ) values ( '{}', '{}', '{}' )".format(tbl,fld1,fld2,fld3,tbl_val1,tbl_val2,tbl_val3)
for k in "0 1 2 3 10 11 12 13 100 200 300".split(" "):
for tbl in "tbl tbl1 tbl2".split(" "):
j=j+1
a0="a0_{}".format(j)
a1="a1_{}".format(j)
a2="a2_{}".format(j)
args= (a0,a1,a2)
# sqlcmd= "insert into {} values ( 'tblid_{}', 'dttm_{}', 'text_{}')".format( tbl, k,k,k )
sqlcmd= "insert into tbl values ( ?, ?, ? )"
print "BUGS_1081 j={} k={} sqlcmd={}".format( j,k, sqlcmd )
# db.execute(sqlcmd,("v1","v2","v3") )
# db.execute(sqlcmd,(tbl_val1,tbl_val2,tbl_val3))
sqlcmd="insert into tbl values ('t1', 't2', 't3')"
db.execute(sqlcmd)
print "BUGS_1082 k={} sqlcmd={}".format( k, sqlcmd )
sqlcmd = "INSERT INTO {} ( '{}', '{}', '{}' ) values ( '{}', '{}', '{}' )".format(tbl1,fld1,fld2,fld3,tbl1_val1,tbl1_val2, tbl1_val3)
print "BUGS_1280 sqlcmd={}".format(sqlcmd)
db.execute(sqlcmd)
sqlcmd = "INSERT INTO {} ( '{}', '{}', '{}' ) values ( '{}', '{}', '{}' )".format(tbl2,fld1,fld2,fld3,tbl2_val1,tbl2_val2,tbl2_val3)
print "BUGS_1285 sqlcmd={}".format(sqlcmd)
db.execute(sqlcmd)
db.close()
print "dddddddddddddddddddd"
exit()
sqlcmd = "DROP TABLE IF EXISTS {};".format(tbl)
# db.execute(sqlcmd)
sqlcmd = "DROP TABLE IF EXISTS {};".format(tbl1)
# db.execute(sqlcmd)
sqlcmd = "DROP TABLE IF EXISTS {};".format(tbl2)
# db.execute(sqlcmd)
db.commit()
# ------------------
print "{} {} SQL3_ko7 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
def sql3_ko_8(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
arglen=len(args)
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("tbl")
sqlcmd="{}".format("select * from tbl")
# ------------------
# ------------------
# ------------------
# Creates or opens a file called mydb with a SQLite3 DB
# Get a cursor object
# Check if table users does not exist and create it
# Commit the change
# Catch the exception
# Roll back any change if something goes wrong
# Close the db connection
try:
print "try"
# sqlcmd= "CREATE TABLE IF NOT EXISTS users( id INTEGER PRIMARY KEY, name TEXT, phone TEXT, email TEXT unique, password TEXT )"
sqlcmd='CREATE TABLE IF NOT EXISTS kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, k6 varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);',
print "{} {} MSG sql_ko8 sql3_db() {}-{} sqlcmd={}".format(progid,dttm, j,k, sqlcmd)
# db = sql3.connect(fildb3)
sql3 = sql3_db(fildb3)
db = sql3.cursor()
db.execute(sqlcmd)
for j in "2 4 6 8".split(" "):
name="jkwii_{}".format(j)
phn="phn_355-01{}{}".format(j,j)
email="jkwii_{}\@somewhere.com".format(j)
password="12{}345{}".format(j,j)
sqlcmd='insert into users values ( "{}", "{}", "{}", "{}" )'.format(name, phone, email,password )
db.execute(syscmd)
print "sqlcmd={}".format(sqlcmd)
sql3.commit()
sql3.close()
# exception as e:
except e:
print "e"
print "{} {} ERR sql_ko8 sql3_db() {}-{} sqlcmd={} e={}".format(progid,dttm, j,k, sqlcmd, e)
db.rollback()
raise e
finally:
db.close()
# ------------------
print "{} {} SQL3_ko8 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# def sql3_ko_9(args):
def sql3_ko_9(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval):
import ko_cfg
import csv
arglen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
if( arglen >1 ): a1=args[1]
if( arglen >2 ): a2=args[2]
if( arglen >3 ): a3=args[3]
if( arglen >4 ): a4=args[4]
progid= ko_cfg.progid
dttm=ko_dttm("")
j=0;
k=0;
print "{} {} SQL3_ko6 a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
fildb3="{}.db3".format(progid)
filcsv="{}.csv".format(progid)
sqltbl="{}".format("tbl")
sqlcmd="{}".format("select * from tbl")
# ------------------
# ------------------
sqlcmd_cr="CREATE TABLE cars(id INT, name TEXT, price INT)"
print "BUGS_535 sql_cr sqlcmd_cr={}".format(sqlcmd_cr)
sqlcmd_inserts = (
'INSERT or replace INTO cars VALUES(1,"Audi",52642)',
'INSERT or replace INTO cars VALUES(2,"Mercedes",57127)',
'INSERT or replace INTO cars VALUES(3,"Skoda",9000)',
'INSERT or replace INTO cars VALUES(4,"Volvo",29000)',
'INSERT or replace INTO cars VALUES(5,"Bentley",350000)',
'INSERT or replace INTO cars VALUES(6,"Citroen",21000)',
'INSERT or replace INTO cars VALUES(7,"Hummer",41400)',
'INSERT or replace INTO cars VALUES(8,"Volkswagen",21600)',
'INSERT or replace INTO cars VALUES(9,"mustang",22500)',
'INSERT or replace INTO cars VALUES(10,"chevy",23300)',
'INSERT or replace INTO cars VALUES(11,"american_moters",24100)',
'INSERT or replace INTO cars VALUES(12,"tesla",15600)',
'INSERT or replace INTO cars VALUES(13,"fiat",16600)'
)
print "{} {} BUGS_SQL_CR sqlcmd_inserts={}".format( a0,dttm, sqlcmd_inserts )
print "{} {} SQL_CR fildb3={} sqltbl={} sqlcmd_cr={}".format( a0,dttm, fildb3, sqltbl, sqlcmd_cr )
j=0
for sqlcmd_insert in sqlcmd_inserts:
j=j+1
# print "{} {} SQL_CR_INSERT sqlcmd_insert=_{}".format( a0,dttm, j, sqlcmd_insert )
# print "{} {} SQL_CR fildb3={} sqltbl={} sqlcmd_cr={}".format( a0,dttm, fildb3, sqltbl, sqlcmd_cr )
db = None
try:
sql3 = db3.connect(fildb3)
# db = sql3.cursor()
# print "BUGS_651: {} {} SQL_DROP fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
# db.execute(sqlcmd)
# sql3.close()
db.execute("CREATE TABLE IF NOT EXISTS cars(id INT, name TEXT, price INT)")
db.execute("INSERT INTO cars VALUES(1,'Audi',52642)")
db.execute("INSERT INTO cars VALUES(2,'Mercedes',57127)")
db.execute("INSERT INTO cars VALUES(3,'Skoda',9000)")
db.execute("INSERT INTO cars VALUES(4,'Volvo',29000)")
db.execute("INSERT INTO cars VALUES(5,'Bentley',350000)")
db.execute("INSERT INTO cars VALUES(6,'Citroen',21000)")
db.execute("INSERT INTO cars VALUES(7,'Hummer',41400)")
db.execute("INSERT INTO cars VALUES(8,'Volkswagen',21600)")
print "BUGS_660: SQL_DROP fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
except sql3.Error, e:
print "Error {}:".format(e.args[0])
sys.exit(1)
finally:
if sql3:
sql3.close()
return()
# ------------------
# ------------------
print "{} {} SQL3_ko9 fildb3={} sqltbl={} sqlcmd={} ".format(progid,dttm,fildb3,sqltbl,sqlcmd)
exit
# qqqqqqqqqqqqqqqqqqqqqqqqqqqqq
def sql_ver(args):
# import sqlite3 as db3
# import sys
import ko_cfg
dttm=ko_dttm("")
a0=args[0]
fildb3=ko_cfg.fildb3
sqltbl=ko_cfg.sqltbl
sqlcmd=ko_cfg.sqlcmd
if( sqlcmd == "" ): sqlcmd="select sqlite_version()"
print "{} {} SQL_VER {}-{} fildb3={} sqltbl={} sqlcmd={}".format( progid,dttm, j,k, fildb3, sqltbl, sqlcmd )
db = None
try:
db = db3.connect(fildb3)
cur = db.cursor()
cur.execute(sqlcmd)
data = cur.fetchone()
print "SQL_VER fildb3={} sqltbl={} sqlcmd={} data={}".format(fildb3, sqltbl, sqlcmd, data)
except db3.Error, e:
print "Error {}:".format(e.args[0])
sys.exit(1)
finally:
if db:
db.close()
return()
def sql_pragma(args):
print "SQL_PRAGMA"
def sql_table(args):
print "SQL_PRAGMA"
def sql_schemas(sqltbl,sqlopt,sqlfld,sqlcmd):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
fildb3="{}.db3".format(progid)
db3nam="{}".format(fildb3.split(".")[0])
dttm=ko_dttm("dt")
# print "BEG_3160 {} {} -= sql_schema {} =- {}_{} {}-{} fildb3={} sqltbl={}".format( progid,dttm, sqlopt, db3nam,sqltbl, j,k, fildb3,sqltbl )
return()
def sql_schema(sqltbl,sqlopt,sqlfld,sqlcmd):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
fildb3="{}.db3".format(progid)
db3nam="{}".format(fildb3.split(".")[0])
dttm=ko_dttm("dt")
# print "BEG_3160 {} {} -= sql_schema {} =- {}_{} {}-{} fildb3={} sqltbl={}".format( progid,dttm, sqlopt, db3nam,sqltbl, j,k, fildb3,sqltbl )
sql_tables = (
'CREATE TABLE IF NOT EXISTS cfaa ( lines varchar);',
'CREATE TABLE IF NOT EXISTS list ( line varchar);',
'CREATE TABLE IF NOT EXISTS csv ( r varchar, c varchar, rlen varchar, clen varchar, c0 varchar, c1 varchar, c2 varchar, c3 varchar varchar, c4 varchar, c5 varchar, c6 varchar, c7 varchar, c8 varchar, c9 varchar, c10 varchar, c11 varchar, c12 varchar, c13 varchar, c14 varchar, c15 varchar, c16 varchar );',
"CREATE TABLE IF NOT EXISTS ko ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko1 ( ko1id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko2 ( ko2id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko3 ( ko3id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
'CREATE TABLE IF NOT EXISTS ip ( myid text, mydt text, hostname text, ip text, desc text);',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_type VARCHAR, led_date VARCHAR, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os );',
'CREATE TABLE IF NOT EXISTS data ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, k6 varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, yyyy varchar, mm varchar dd varchar begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS files ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
'CREATE TABLE IF NOT EXISTS uslist ( usid varchar, dttm varchar, status varchar, url varchar, img varchar, tn varchar, id varchar, grp varchar, begdt varchar, enddt varchar, yyyy varchar, mm varchar, dd varchar, mth varchar, pathfile varchar, file varchar, ext varchar, size varchar, x varchar, y varchar, z varchar, width varchar, height varchar, perms varchar, permu varchar, permg varchar, temp varchar, args varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar); ',
'CREATE TABLE IF NOT EXISTS cabs( myid text, mydt text, rowname text, cab text, cabamps text, "desc" text);',
'CREATE TABLE IF NOT EXISTS cfg ( fld text, val text );',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS fp (fp_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, label VARCHAR, title VARCHAR, width VARCHAR, height VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR);',
'CREATE TABLE IF NOT EXISTS grid (grid_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, org VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS equip ( f1 text,f2 text,machine text,cab text,position text,fld06 text,network text,model text,cpumem text,bluetag text,hrcnum text,sn text,franksid text,purchased text,enddate text,amps text,rpdu_bank text,rpdu_outlets text,switch text,port text,connection text,pmm text,circuit text,panel text,breaker text,feed text, temp text );',
'CREATE TABLE IF NOT EXISTS ko_hw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab1 text, cab2 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, flag_vm text, width text, height text, weight text, im_width text, im_height text, machinename text, temp text);',
'CREATE TABLE IF NOT EXISTS ko_plans ( myid text, mydt text, planid text, loadmode text, cabnum text, cablim text, cab text, zone text, grp text, vendor text, item text, cab2 text, zone2 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text, hostname text, sn text, hrctag text, bluetag text, franksid text, os text, osver text, ip text, ips text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab0 text, cab1 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, temp text);',
'CREATE TABLE IF NOT EXISTS kocab ( myid text, mydt text, rowname text, rowseq text, cab text, amps text, items text, status text, type text, maxamps text, min_hdrspace text, min_ftrspace text, desc text);',
'CREATE TABLE IF NOT EXISTS kohw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, f12 text, f13 text, f14 text, f15 text, f16 text, f17 text, f18 text, f19 text, f20 text, f21 text, f22 text, f23 text, f24 text, f25 text, f26 text, f27 text, f28 text, f29 text, f30 text, f31 text, f32 text, f33 text, f34 text, f35 text, f36 text); ',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_type VARCHAR, led_date VARCHAR, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os );',
'CREATE TABLE IF NOT EXISTS menus ( menus_id INTEGER PRIMARY KEY DESC, role VARCHAR, url VARCHAR, levels VARCHAR);',
'CREATE TABLE IF NOT EXISTS details ( cab text,zone text,grp text,vendor text,item text,cab1 text,zone1 text,grp1 text,btu text,watts text,amps text,vac text,height text,width text,depth text,weight text,spectext text, temp text );',
'CREATE TABLE IF NOT EXISTS n11 (n11_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, ip VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS obj ( obj_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS pano ( pano_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS periods ( yyyy text, fy text, p text, q text, wk text, begdt text, begday text, enddt text, endday text, oy text, est text, f3 text, f4 text, f5 text, f6 text, status text, desc text);',
'CREATE TABLE IF NOT EXISTS plans ( myid text, mydt text, cab text, item text, model text, cab0 text, cab2 text, amps text, os text, ip text, upos text, uheight text, enclave text, network text, cpumem text, hrcnum text, sn text, frankid text, purchased text, enddate text, rpdu_bank text, rpdu_outlets text, switch text, port text, connection text, pmm text, circuit text, panel text, breaker text, feed text, height text, width text, depth text, weight text, grp1 text, grp2 text);',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS rpts ( rptnum text, rptcode text, rptdesc text, rptsql text, dbfile text, sqlfile text, outfile text, status text);',
'CREATE TABLE IF NOT EXISTS shelves ( cab text, zone text, grp text, vendor text, item text, cab1 text, zone1 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text); ',
'CREATE TABLE IF NOT EXISTS us (us_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR ); ',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoom ( zoom_id INTEGER PRIMARY KEY, code VARCHAR, name VARCHAR, status VARCHAR, dttm VARCHAR, color VARCHAR, speed VARCHAR, city VARCHAR, bldg VARCHAR, loc VARCHAR, floor VARCHAR, groups VARCHAR, orgs VARCHAR, title VARCHAR, published VARCHAR, comment VARCHAR, filename VARCHAR, width VARCHAR, height VARCHAR, autoloop VARCHAR, choicelist VARCHAR, listsource VARCHAR, initialvisibility VARCHAR, minscale VARCHAR, maxscale VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoomxml ( zoomxml_id INTEGER PRIMARY KEY, code VARCHAR, type VARCHAR, hs_id VARCHAR, name VARCHAR, desc VARCHAR, loc VARCHAR, org VARCHAR, email VARCHAR, phone VARCHAR, sn VARCHAR, ip VARCHAR, caption VARCHAR, x VARCHAR, y VARCHAR, zoom VARCHAR, media VARCHAR, url VARCHAR, mediatype VARCHAR, urltarget VARCHAR, transition VARCHAR, interval VARCHAR, duration VARCHAR );',
'CREATE TABLE IF NOT EXISTS cfg (idx varchar,status varchar,dttm varchar,kode varchar,grp varchar,progid varchar,key varchar,val varchar,text varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS cmds ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS cpapi2 ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS funcs ( idx varchar, status varchar, dttm varchar, koko varchar, koco varchar, coko varchar, coco varchar, type varchar, func varchar, args varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS inv ( status text, dttm text, id text, grp text, strain text, room text, hold text, phase text, phasedt text, phaselen text, harvest text, notes text, desc text );',
'CREATE TABLE IF NOT EXISTS kono ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS koye ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS kup ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS kup_tn ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS lab ( status text, dttm text, llno text, lab text, package text, item text, cat text, test text, testdt text, overall text, testname text, passed text, result text, resultdt text, notes text, desc text);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS links ( idx varchar, status varchar, dttm varchar, grp varchar, cat varchar, code varchar, url varchar, img varchar, tn varchar, img1 varchar, img2 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS log (idx varchar,status varchar,dttm varchar,kode varchar,progid varchar,logtext varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os varchar, led_type varchar, led_date varchar, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS pot ( licence text, dttm text, status text, name text, test1_dt text, test1_val text, test2_dt text, test2_val text, test3_dt text, test3_val text, test4_dt text, test4_val text, test5_dt text, test5_val text, notes text, desc text); ',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS tl (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tla (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tlc (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tld (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS tle (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS us ( us_id, status varchar, dttm varchar, code varchar, grp varchar, my_id varchar, x varchar, y varchar, name varchar, phone varchar, email varchar, twitter varchar, fb varchar, yt varchar, url_http varchar, url_here varchar, url_imgvarchar, url_img1 varchar, url_img2 varchar, url_tn varchar, title varchar, comment varchar, desc varcher); ',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
''
)
# 'CREATE TABLE IF NOT EXISTS vol ( vol varchar, status varchar, kludge1 varchar, usr varchar, grp varchar, size varchar, mth varchar, dd varchar, yytm varchar, dir varchar, desc varchar );',
# 'CREATE TABLE IF NOT EXISTS vols ( vol varchar, status varchar, kludge1 varchar, usr varchar, grp varchar, size varchar, mth varchar, dd varchar, yytm varchar, dir varchar, desc varchar );',
# print "EXIT_3240 {} {} -= sql_schema sqlopt={} =- {}_{} {}-{} fildb3={} sqltbl={} ".format(progid, dttm, sqlopt, db3nam,sqltbl, j,k, fildb3,sqltbl )
j=0
k=0
tblnames=""
sql_table=""
for sql_table in sql_tables:
if( len(sql_table) <30 ):
k=k+1
continue
j=j+1
tbltext=sql_table
tbltext=tbltext.split( "(" )[0]
tbltext=tbltext.replace("(", "")
spacecnt=len(tbltext.split(" "))
tbltext=tbltext.replace("CREATE TABLE IF NOT EXISTS", "")
tbltext=tbltext.replace("CREATE TABLE", "")
tbltext=tbltext.replace("create table if not exists", "")
tbltext=tbltext.replace("create table", "")
tbltext=tbltext.replace(" ", "")
tblnam=tbltext
tblnames += "{} ".format(tblnam)
# print "BUGS_3240 {} {} -= sql_schema sqlopt={} =- {}-{} sqltbl={} tblnam={} tblnames={}\n\n".format( progid, dttm, sqlopt, j,k,sqltbl,tblnam,tblnames)
# print "BUGS_3250 {} {} -= sql_schema sqlopt={} =- {}-{} sqltbl={} tblnam={} tblnames={}\n\n".format( progid, dttm, sqlopt, j,k,sqltbl,tblnam,tblnames)
if( sqltbl == "" ):
return( tblnames)
tblcnt=len(sql_tables)
if( sqltbl.isdigit() == True):
tblnum=sqltbl
print "BUGS_3271 FIND_BY_NUM sqltbl={} tblcnt={}".format(sqltbl, tblcnt)
else:
print "BUGS_3272 FIND_BY_ANME sqltbl={} tblcnt={}".format(sqltbl, tblcnt)
table=""
if( sqltbl.isdigit() == True ):
"BUGS_3271 ISDIGIT TBL_BY_NUMBER FIND sqltbl={}".format(sqltbl)
tblnum = sqltbl
tbllen=len(sql_tables)
if( tblnum > tbllen ):
return( tblnames)
j=0
for sql_table in sql_tables:
j=j+1
if( tblnum == j ):
print "FOIND_3285 j={} tblnum={} sql_table={}".format(j,tblnum, sql_table)
return(sql_table)
if( tblnum <= tbllen ):
"BUGS_3260 ISDIGIT TBL_BY_NUMBER DONE tblnum={} tbllen={} sqltbl={}".format(tblnum,tbllen,sqltbl)
tblnum=tbllen-1
sql_table = sql_tables[tblnum]
return( sql_table)
else:
return( tblnames )
"EXIT_3290 ISDIGIT TBL_BY_NUMBER NOTFOUND sqltbl={}".format(sqltbl)
exit()
tblnum=0
for tblnam in tblnames.split(" "):
if( sqltbl == tblnam ):
sql_table=sql_tables[tblnum]
return(sql_table)
tblnum=tblnum+1
return(tblnames)
print "EXIT_3300 {} {} -= sql_schema {} =- {}_{} {}-{} sqltbl={} tblnam={} sql_table={}".format( progid, dttm, sqlopt, db3nam, sqltbl, j,k, tblnam, sql_table )
exit()
fldnam=""
fldnames=""
fields=table.split("(")[1]
fields=table.replace("VARCHAR","")
fields=table.replace("varchar","")
fields=table.replace(" ","")
fields=table.replace(")","")
values=fields.replace(",", "','")
for field in fields.splie(","):
fldnamss += field
if( sqlopt == "create" ):
return(table)
if( sqlopt == "fields" ):
return(fields)
if( sqlopt == "values" ):
return(values)
print "SQLTBL_3230 sqltbl={} sql_create_txt={}".format(fildb3,sqltbl,"sqltbl,sql_create_txt")
return(tblnames)
def sql_schema_mess(args):
import ko_cfg
dttm=ko_dttm("")
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
fildb3=ko_cfg.fildb3
sqltbl=ko_cfg.sqltbl
sqlcmd=ko_cfg.sqlcmd
fildb3=ko_cfg.fildb3
dttm=ko_dttm("")
dttm="-={}=-".format(dttm)
progid=ko_cfg.progid
fildb3=ko_cfg.fildb3
# sqltbl=ko_cfg.sqltbl
filsql=ko_cfg.filsql
filtxt=ko_cfg.filtxt
a1=""
a2=""
a3=""
a4=""
sqltbl=""
fmt=""
arglen=len(args)
if( arglen > 1 ): a1=args[1]
if( arglen > 2 ): a2=args[2]
if( arglen > 3 ): a3=args[3]
if( arglen > 4 ): a4=args[4]
if( a2 != "" ): sqltbl=a2
if( a3 != "" ): fmt=a2
print "{} {} SQL_SCHEMA {}-{} fildb3={} sqltbl={} filsql={} filtxt={}".format(progid,dttm, j,k, fildb3, sqltbl, filsql, filtxt )
if( os.path.exists(fildb3)):
# print "{} {} FOUND=== fildb3={} sqltbl={}".format(progid,dttm,fildb3,sqltbl)
kludge=0
else:
print "{} {} NOTFOUND fildb3={} sqltbl={}".format(progid,dttm,fildb3,sqltbl)
exit()
# print "{} {} sql_schema: fildb3={} sqltbl={} ".format(progid,dttm,fildb3,sqltbl)
sql_schema_text = (
'CREATE TABLE IF NOT EXISTS cfaa ( lines varchar);',
'CREATE TABLE IF NOT EXISTS data ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, k6 varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, yyyy varchar, mm varchar dd varchar begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS ko( id integer primary key autoincrement, perms varchar, f2 varchar, own varchar, grp varchar, size varchar, mth varchar, dd varchar, yyyy varchar, parh varchar, file varchar, ext varchar, begdt varchar, enddt varchar, title varchar, url varchar, img varchar, tn varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_type VARCHAR, led_date VARCHAR, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os );',
'CREATE TABLE IF NOT EXISTS menus ( menus_id INTEGER PRIMARY KEY DESC, role VARCHAR, url VARCHAR, levels VARCHAR);',
'CREATE TABLE IF NOT EXISTS plans ( cab text,zone text,grp text,vendor text,item text,cab1 text,zone1 text,grp1 text,btu text,watts text,amps text,vac text,height text,width text,depth text,weight text,spectext text, temp text );',
'CREATE TABLE IF NOT EXISTS n11 (n11_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, ip VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS obj ( obj_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS pano ( pano_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS periods ( yyyy text, fy text, p text, q text, wk text, begdt text, begday text, enddt text, endday text, oy text, est text, f3 text, f4 text, f5 text, f6 text, status text, desc text);',
'CREATE TABLE IF NOT EXISTS plans ( myid text, mydt text, cab text, item text, model text, cab0 text, cab2 text, amps text, os text, ip text, upos text, uheight text, enclave text, network text, cpumem text, hrcnum text, sn text, frankid text, purchased text, enddate text, rpdu_bank text, rpdu_outlets text, switch text, port text, connection text, pmm text, circuit text, panel text, breaker text, feed text, height text, width text, depth text, weight text, grp1 text, grp2 text);',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS rpts ( rptnum text, rptcode text, rptdesc text, rptsql text, dbfile text, sqlfile text, outfile text, status text);',
'CREATE TABLE IF NOT EXISTS shelves( cab text, zone text, grp text, vendor text, item text, cab1 text, zone1 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text); ',
'CREATE TABLE IF NOT EXISTS us (us_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR ); ',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoom ( zoom_id INTEGER PRIMARY KEY, code VARCHAR, name VARCHAR, status VARCHAR, dttm VARCHAR, color VARCHAR, speed VARCHAR, city VARCHAR, bldg VARCHAR, loc VARCHAR, floor VARCHAR, groups VARCHAR, orgs VARCHAR, title VARCHAR, published VARCHAR, comment VARCHAR, filename VARCHAR, width VARCHAR, height VARCHAR, autoloop VARCHAR, choicelist VARCHAR, listsource VARCHAR, initialvisibility VARCHAR, minscale VARCHAR, maxscale VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoomxml ( zoomxml_id INTEGER PRIMARY KEY, code VARCHAR, type VARCHAR, hs_id VARCHAR, name VARCHAR, desc VARCHAR, loc VARCHAR, org VARCHAR, email VARCHAR, phone VARCHAR, sn VARCHAR, ip VARCHAR, caption VARCHAR, x VARCHAR, y VARCHAR, zoom VARCHAR, media VARCHAR, url VARCHAR, mediatype VARCHAR, urltarget VARCHAR, transition VARCHAR, interval VARCHAR, duration, VARCHAR );',
'CREATE TABLE IF NOT EXISTS cfg (idx varchar,status varchar,dttm varchar,kode varchar,grp varchar,progid varchar,key varchar,val varchar,text varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS cmds ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS cpapi2 ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS functions ( idx varchar, status varchar, dttm varchar, koko varchar, koco varchar, coko varchar, coco varchar, type varchar, func varchar, args varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS inv ( status text, dttm text, id text, grp text, strain text, room text, hold text, phase text, phasedt text, phaselen text, harvest text, notes text, desc text );',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS kono ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS koye ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS kup ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS kup_tn ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS lab ( status text, dttm text, llno text, lab text, package text, item text, cat text, test text, testdt text, overall text, testname text, passed text, result text, resultdt text, notes text, desc text);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS links ( idx varchar, status varchar, dttm varchar, grp varchar, cat varchar, code varchar, url varchar, img varchar, tn varchar, img1 varchar, img2 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS log (idx varchar,status varchar,dttm varchar,kode varchar,progid varchar,logtext varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os varchar, led_type varchar, led_date varchar, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS pot ( licence text, dttm text, status text, name text, test1_dt text, test1_val text, test2_dt text, test2_val text, test3_dt text, test3_val text, test4_dt text, test4_val text, test5_dt text, test5_val text, notes text, desc text); ',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS tl (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS kolist ( id integer primary key autoincrement, perms varchar, f2 varchar, own varchar, grp varchar, size varchar, mth varchar, dd varchar, yyyy varchar, parh varchar, file varchar, ext varchar, begdt varchar, enddt varchar, title varchar, url varchar, img varchar, tn varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar); ',
'CREATE TABLE IF NOT EXISTS list ( line varchar);',
'CREATE TABLE IF NOT EXISTS uslist ( usid varchar, dttm varchar, status varchar, url varchar, img varchar, tn varchar, id varchar, grp varchar, begdt varchar, enddt varchar, yyyy varchar, mm varchar, dd varchar, mth varchar, pathfile varchar, file varchar, ext varchar, size varchar, x varchar, y varchar, z varchar, width varchar, height varchar, perms varchar, permu varchar, permg varchar, temp varchar, args varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS cabs( myid text, mydt text, rowname text, cab text, cabamps text, "desc" text);',
'CREATE TABLE IF NOT EXISTS tla (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tlc (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tld (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS tle (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS us ( us_id, status varchar, dttm varchar, code varchar, grp varchar, my_id varchar, x varchar, y varchar, name varchar, phone varchar, email varchar, twitter varchar, fb varchar, yt varchar, url_http varchar, url_here varchar, url_imgvarchar, url_img1 varchar, url_img2 varchar, url_tn varchar, title varchar, comment varchar, desc varcher); ',
'CREATE TABLE IF NOT EXISTS cfg ( fld text, val text );',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS defrag_plan ( oldrowname text,cab text,upos text,fld04 text,network text,model text,cpumem text,hrctag text,sn text,franksid text,purchased text,enddate text,amps text,rpdu_bank text,rpdu_outlets text,switch text,port text,connection text,pmm text,circuit text,panel text,breaker text,feed text,fld24 text, temp text );',
'CREATE TABLE IF NOT EXISTS es_hw ( bladeid text, oldbladeid text, hostname text, item text, itemdesc text, ip text, ip_ilo text, ip_console text, ip_oa1 text, ip_oa2 text, zone text, sn text, hrctag text, desc text);',
'CREATE TABLE IF NOT EXISTS es_ip ( myid text, mydt text, hostname text, ip text, desc text);',
'CREATE TABLE IF NOT EXISTS fp (fp_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, label VARCHAR, title VARCHAR, width VARCHAR, height VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR);',
'CREATE TABLE IF NOT EXISTS grid (grid_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, org VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS equipment ( f1 text,f2 text,machine text,cab text,position text,fld06 text,network text,model text,cpumem text,bluetag text,hrcnum text,sn text,franksid text,purchased text,enddate text,amps text,rpdu_bank text,rpdu_outlets text,switch text,port text,connection text,pmm text,circuit text,panel text,breaker text,feed text, temp text );',
'CREATE TABLE IF NOT EXISTS ko_hw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab1 text, cab2 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, flag_vm text, width text, height text, weight text, im_width text, im_height text, machinename text, temp text);',
'CREATE TABLE IF NOT EXISTS ko_plans ( myid text, mydt text, planid text, loadmode text, cabnum text, cablim text, cab text, zone text, grp text, vendor text, item text, cab2 text, zone2 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text, hostname text, sn text, hrctag text, bluetag text, franksid text, os text, osver text, ip text, ips text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab0 text, cab1 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, temp text);',
'CREATE TABLE IF NOT EXISTS kocab ( myid text, mydt text, rowname text, rowseq text, cab text, amps text, items text, status text, type text, maxamps text, min_hdrspace text, min_ftrspace text, desc text);',
'CREATE TABLE IF NOT EXISTS kohw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, f12 text, f13 text, f14 text, f15 text, f16 text, f17 text, f18 text, f19 text, f20 text, f21 text, f22 text, f23 text, f24 text, f25 text, f26 text, f27 text, f28 text, f29 text, f30 text, f31 text, f32 text, f33 text, f34 text, f35 text, f36 text); ',
'CREATE TABLE IF NOT EXISTS barcodes ( id INTEGER PRIMARY KEY AUTOINCREMENT, Barcode VARCHAR(255));',
''
)
# 'CREATE TABLE IF NOT EXISTS vol ( vol varchar, status varchar, kludge1 varchar, usr varchar, grp varchar, size varchar, mth varchar, dd varchar, yytm varchar, dir varchar, desc varchar );',
# 'CREATE TABLE IF NOT EXISTS vols ( vol varchar, status varchar, kludge1 varchar, usr varchar, grp varchar, size varchar, mth varchar, dd varchar, yytm varchar, dir varchar, desc varchar );',
j=0
skipcnt=0
for line in sql_schema_text:
if( line == "" ): continue
j=j+1
tbl="-=table=-"
flds="-=flds=-"
linesplit=line.split("( ")
# linesplit=line.split("TABLE")
splitlen=len(linesplit)
if( splitlen == 1 ):
tbl=linesplit[0]
flds="-----=flds=-------"
skipcnt=skipcnt+1
# print "{} {} SQL_SCHEMA_TABLE: SKIP {} tbl={} flds={}".format(progid,dttm,skipcnt,tbl,"-----=flds=-----")
continue
else:
tbl=linesplit[0]
tbl=tbl.replace("CREATE TABLE IF NOT EXISTS","")
tbl=tbl.replace("CREATE TABLE","")
tbl=tbl.replace("create table if not exists","")
tbl=tbl.replace("create table","")
tbl=tbl.replace(" ","").replace("\n","")
flds=linesplit[1]
# ". ^ $ * + ? { } [ ] \ | ( )"
if( sqltbl == "" ):
kludge=2
else:
if ( re.search(sqltbl,line)):
kludge=31
print "MATCH___ sql_schema_601 sqltbl={} line={}".format(sqltbl,"-= line =-")
else:
kludge=32
# print "MATCHNOT sql_schema_612 sqltbl={} line={}".format(sqltbl,line)
continue
print "{} {} {}-{} SQL_SCHEMA_TABLE_600: sqlcmd={} tbl={} flds={}".format(progid, dttm, j,k, sqlcmd, tbl,"-----=flds=-----")
k=0
print "{} {} sql_schema_620 TBL j={} k={} tbl={} flds={}".format( progid,dttm, j,k,tbl,"-== flds ==-" )
sql_create_text = line
sql_fields_text = ""
sql_fields_text = "( "
sql_values_text = ""
sql_list_text = ""
for fld in flds.split(","):
# fld=fld.split(" ")[0]
fld=fld.replace(" VARCHAR","")
fld=fld.replace(" varchar","")
fld=fld.replace("INTEGER PRIMARY KEY","")
fld=fld.replace(" ","")
fld=fld.replace(");","")
k=k+1
sql_fields_text += '"{}", '.format(fld)
sql_values_text += '{}, '.format(fld)
sql_list_text += "{} ".format(fld)
sql_fields_text += ")"
sql_fields_text = replace_last(sql_fields_text,", )", " )" )
sql_list_text = replace_last(sql_list_text,", ", "" )
sql_values_text = replace_last(sql_values_text,", ", " -=eol=-" )
# sql_list_text = re.sub(r"</?\[\d+>", "", sql_list_text )
# line = re.sub(r"""
# (?x) # Use free-spacing mode.
# < # Match a literal '<'
# /? # Optionally match a '/'
# \[ # Match a literal '['
# \d+ # Match one or more digits
# > # Match a literal '>'
# """, "", line)
print "CREATE sql_create_text={}\n\n".format(sql_create_text)
print "FIELDS sql_fields_text={}\n]n".format(sql_fields_text)
print "VALUES sql_values_text={}\n\n".format(sql_values_text)
print "{} {} sql_schema FLD j={} k={} tbl={} fld={}".format( progid,dttm, j,k,tbl,fld )
if( fmt == "create" ):
print "CREATE sql_create={}".format(sql_create_text)
return( sql_create_text )
if( fmt == "fields" ) or ( fmt == "flds" ):
print "FIELDS sql_fields={}".format(sql_fields_text)
return( sql_fields_text )
if( fmt == "values" ) or ( fmt == "vals" ):
print "VALUES sql_values={}".format(sql_values)
return( sql_values )
if( fmt == "list" ) or ( fmt == "" ):
print "LIST sql_values={}".format(sql_list_text)
return( sql_list_text )
# print "sql_schema {} tbl={}\n fld={}\n line={}".format(j,k,tbl,fld,line)
# print "sql_schema sql_schema_text={}".format(sql_schema_text)
return(sql_schema_text)
def replace_last(source_string, replace_what, replace_with):
head, _sep, tail = source_string.rpartition(replace_what)
return head + replace_with + tail
def sql_create(args):
dttm=ko_dttm("")
progid=a0.split(".")[0]
fildb3_default="{}.db3".format(progid)
sqltbl_default="{}".format(progid)
filtxt_default="{}.txt".format(progid)
fildb3=a1
sqltbl=a2
sqlcmd=a3
filtxt=a4
fildb3_default="ko.db3"
sqltbl_default="table"
filtxt_default="{}.psv".format(sqltbl)
if( fildb3==""): fildb3=fildb3_default
if( sqltbl==""): sqltbl=sqltbl_default
if( filtxt==""): filtxt=filtxt_default
print "{} {} sql_export: fildb3={} sqltbl={} sqlcmd={} a4={}".format(progid,dttm,fildb3,sqltbl,sqlcmd,a4)
return()
def sql_insert(args):
dttm=ko_dttm("")
progid=a0.split(".")[0]
fildb3_default="{}.db3".format(progid)
sqltbl_default="{}".format(progid)
filtxt_default="{}.txt".format(progid)
fildb3=a1
sqltbl=a2
sqlcmd=a3
filtxt=a4
fildb3_default="ko.db3"
sqltbl_default="table"
filtxt_default="{}.psv".format(sqltbl)
if( fildb3==""): fildb3=fildb3_default
if( sqltbl==""): sqltbl=sqltbl_default
if( filtxt==""): filtxt=filtxt_default
print "{} {} sql_export: fildb3={} sqltbl={} sqlcmd={} a4={}".format(progid,dttm,fildb3,sqltbl,sqlcmd,a4)
return()
def sql_import(args):
dttm=ko_dttm("")
progid=a0.split(".")[0]
fildb3_default="{}.db3".format(progid)
sqltbl_default="{}".format(progid)
filtxt_default="{}.txt".format(progid)
fildb3=a1
sqltbl=a2
sqlcmd=a3
filtxt=a4
fildb3_default="ko.db3"
sqltbl_default="table"
filtxt_default="{}.psv".format(sqltbl)
if( fildb3==""): fildb3=fildb3_default
if( sqltbl==""): sqltbl=sqltbl_default
if( filtxt==""): filtxt=filtxt_default
print "{} {} sql_import: fildb3={} sqltbl={} sqlcmd={} a4={}".format(progid,dttm,fildb3,sqltbl,sqlcmd,a4)
syssql_import='sqlite3 {} ".import {} {}'.format(fildb3,filtxt,sqltbl )
print "{} {} sql_import: syssql_import={}".format(progid,dttm,syssql_import)
os.system( syssql_import )
return()
def sql_export(args):
dttm=ko_dttm("")
progid=a0.split(".")[0]
fildb3_default="{}.db3".format(progid)
sqltbl_default="{}".format(progid)
filtxt_default="{}.txt".format(progid)
fildb3=a1
sqltbl=a2
sqlcmd=a3
filtxt=a4
fildb3_default="ko.db3"
sqltbl_default="table"
filtxt_default="{}.psv".format(sqltbl)
if( fildb3==""): fildb3=fildb3_default
if( sqltbl==""): sqltbl=sqltbl_default
if( filtxt==""): filtxt=filtxt_default
print "{} {} sql_export: fildb3={} sqltbl={} sqlcmd={} a4={}".format(progid,dttm,fildb3,sqltbl,sqlcmd,a4)
syssql_export='sqlite3 -header {} "select * from {} > {}'.format(fildb3,sqltbl,filtxt )
print "{} {} sql_export: syssql_export={}".format(progid,dttm,syssql_export)
os.system( syssql_export )
return()
def sql_vals(args):
usid =""
dttm = ko_dttm("")
status = ""
url="url"
img="img"
tn="tn"
title="title"
id=""
grp=""
title=""
ctime=""
mtime=""
begdt=""
enddt=""
yyyy=""
mm=""
dd=""
mth=""
pathfile=""
path=""
file=""
ext=""
oldfil=""
newfil=""
size=""
x=""
y=""
z=""
width=""
height=""
perms=""
permu=""
permg=""
temp=""
args=""
desc=""
b64=""
sql_vals= ""
sql_vals+= '"{}", '.format(usid)
sql_vals+= '"{}", '.format(status)
sql_vals+= '"{}", '.format(url)
sql_vals+= '"{}",'.format(img)
sql_vals+= '"{}", '.format(tn)
sql_vals+= '"{}", '.format(id)
sql_vals+= '"{}", '.format(grp)
sql_vals+= '"{}", '.format(ctime)
sql_vals+= '"{}", '.format(mtime)
sql_vals+= '"{}", '.format(begdt)
sql_vals+= '"{}", '.format(enddt)
sql_vals+= '"{}", '.format(yyyy)
sql_vals+= '"{}", '.format(mm)
sql_vals+= '"{}", '.format(dd)
sql_vals+= '"{}", '.format(mth)
sql_vals+= '"{}", '.format(pathfile)
sql_vals+= '"{}", '.format(path)
sql_vals+= '"{}", '.format(file)
sql_vals+= '"{}", '.format(ext)
sql_vals+= '"{}", '.format(oldfil)
sql_vals+= '"{}", '.format(newfil)
sql_vals+= '"{}", '.format(size)
sql_vals+= '"{}", '.format(x)
sql_vals+= '"{}", '.format(y)
sql_vals+= '"{}", '.format(z)
sql_vals+= '"{}", '.format(width)
sql_vals+= '"{}", '.format(height)
sql_vals+= '"{}", '.format(perms)
sql_vals+= '"{}", '.format(permu)
sql_vals+= '"{}", '.format(permg)
sql_vals+= '"{}", '.format(temp)
sql_vals+= '"{}", '.format(args)
sql_vals+= '"{}", '.format(desc)
sql_vals+= '"{}", '.format(b64)
print "BUGS_524 sql_vals={}".format(sql_vals)
return (sql_vals)
def sqlcmd_create(args):
flds= ""
sqltbl="files"
flds+= 'usid dttm status '
flds+= 'url img tn id grp title '
flds+= 'ctime mtime begdt enddt yyyy mm dd mth '
flds+= 'pathfile path file ext oldfil newfil '
flds+= 'size x y z width height '
flds+= 'perms permu permg temp args desc b64'
sqlcmd= ""
sqlcmd+= "create table if not exists {} ( ".format(sqltbl)
for fld in flds.split(" "):
sqlcmd+= "{} varchar, ".format(fld)
sqlcmd+= ");"
sqlcmd=sqlcmd.replace( ", )", ")" )
# print "BUGS_520 sqlcmd={}".format( sqlcmd)
return (sqlcmd)
def sql_cr(args):
dttm=ko_dttm("")
fildb3="ht.db3"
sqltbl="files"
sqlcmd_cr=a3
a0=args[0]
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqltbl == "" ): sqltbl="files"
# if( sqlcmd_cr == "" ): sqlcmd_cr="create table if not exists {} ({} )".format(sqltbl, flds )
# print "BUGS_535 sql_cr sqlcmd_cr={}".format(sqlcmd_cr)
# sqlcmd_inserts = (
# 'INSERT or replace INTO cars VALUES(1,"Audi",52642)',
# 'INSERT or replace INTO cars VALUES(2,"Mercedes",57127)',
# 'INSERT or replace INTO cars VALUES(3,"Skoda",9000)',
# 'INSERT or replace INTO cars VALUES(4,"Volvo",29000)',
# 'INSERT or replace INTO cars VALUES(5,"Bentley",350000)',
# 'INSERT or replace INTO cars VALUES(6,"Citroen",21000)',
# 'INSERT or replace INTO cars VALUES(7,"Hummer",41400)',
# 'INSERT or replace INTO cars VALUES(8,"Volkswagen",21600)',
# 'INSERT or replace INTO cars VALUES(9,"mustang",22500)',
# 'INSERT or replace INTO cars VALUES(10,"chevy",23300)',
# 'INSERT or replace INTO cars VALUES(11,"american_moters",24100)',
# 'INSERT or replace INTO cars VALUES(12,"tesla",15600)',
# 'INSERT or replace INTO cars VALUES(13,"fiat",16600)'
# )
# print "{} {} BUGS_SQL_CR sqlcmd_inserts={}".format( a0,dttm, sqlcmd_inserts )
# print "{} {} SQL_CR fildb3={} sqltbl={} sqlcmd_cr={}".format( a0,dttm, fildb3, sqltbl, sqlcmd_cr )
# j=0
# for sqlcmd_insert in sqlcmd_inserts:
# j=j+1
# print "{} {} SQL_CR_INSERT sqlcmd_insert=_{}".format( a0,dttm, j, sqlcmd_insert )
#
# print "{} {} SQL_CR fildb3={} sqltbl={} sqlcmd_cr={}".format( a0,dttm, fildb3, sqltbl, sqlcmd_cr )
fildb3="ht.db3"
sqltbl="files"
db = None
try:
db = db3.connect(fildb3)
cur = db.cursor()
sql_create=sqlcmd_create(args)
print "BUGS_570 sql_create={}".format( sql_create )
cur.execute(sql_create)
# for sqlcmd_insert in sqlcmd_inserts:
oldfil=""
newfil=""
j=0
for line in open("ht.txt", "r"):
pathfile=line.replace("\n","")
path=os.path.dirname(pathfile)
base=os.path.basename(pathfile)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace( ".", "" )
if( os.path.exists(pathfile)):
status="found"
oldfil=file
newfil=file.lower()
if( oldfil != newfil ):
status="todo_case"
oldfil=newfil
badchrs='!@#$%^&*()_+=|}{][;:<>,./'
for c in badchrs:
newfil = newfil.replace( c,'')
if( oldfil != newfil ):
status="todo_chrs"
splitcount=len(file.split(" "))
newfil=file.split(" ")[0]
if( splitcount >1 ):
status="todo_space"
newfil=newfil.replace(" ","_" )
newfil=newfil.replace("__","_")
if(len(file) > 30):
newfil=newfil[:30]
status="todo_trunc"
oldfil=file
else:
status="notfound"
j=j+1
sql_insert = ''
sqltbl="files"
# sql_insert = 'insert or replace into {} ("dttm","pathfile","status","path","file","ext","oldfil","newfil","desc");'.format(sqltbl)
dttm=ko_dttm("")
dttm="20190217_0010"
# sql_insert += " values ('{}','{}','{}', '{}','{}','{}','{}','{}','desc_{}')".format( dttm, pathfile, status, path, file, ext, oldfil, newfil, j )
sql_insert = 'insert or replace into files ("dttm","status","pathfile") values ("20190217_00{}","status_{}","/ht/imgs/btn/ab_cd");'.format(j,j)
sql_insert = 'insert or replace into files ("pathfile") values ("imgs/btn/tst.png");'
print "BUGS_610 SQL_CR_INSERT fildb3={} sqltbl={} sql_insert={} ".format(fildb3, sqltbl, sql_insert)
print "{}".format(sql_insert)
cur.execute(sql_insert)
db.close()
# 'INSERT or replace INTO cars VALUES(13,"fiat",16600)'
# print "BUGS_576 SQL_CR_INSERT fildb3={} sqltbl={} sqlcmd_cr={} ".format(fildb3, sqltbl, sqlcmd_cr)
except db3.Error, e:
print "Error {}:".format(e.args[0])
sys.exit(1)
finally:
if db:
db.close()
return()
def sql_drop(args):
import ko_cfg
dttm=ko_dttm("")
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
fildb3=ko_cfg.fildb3
sqltbl=ko_cfg.sqltbl
sqlcmd=ko_cfg.sqlcmd
fildb3=ko_cfg_fildb3
if( sqlcmd == "" ): sqlcmd="drop table if exists {}".format(sqltbl)
print "BUGS_640: {} {} SQL_DROP fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
db = None
try:
db = db3.connect(fildb3)
cur = db.cursor()
print "BUGS_651: {} {} SQL_DROP fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
cur.execute(sqlcmd)
db.close()
# cur.execute("CREATE TABLE cars(id INT, name TEXT, price INT)")
# cur.execute("INSERT INTO cars VALUES(1,'Audi',52642)")
# cur.execute("INSERT INTO cars VALUES(2,'Mercedes',57127)")
# cur.execute("INSERT INTO cars VALUES(3,'Skoda',9000)")
# cur.execute("INSERT INTO cars VALUES(4,'Volvo',29000)")
# cur.execute("INSERT INTO cars VALUES(5,'Bentley',350000)")
# cur.execute("INSERT INTO cars VALUES(6,'Citroen',21000)")
# cur.execute("INSERT INTO cars VALUES(7,'Hummer',41400)")
# cur.execute("INSERT INTO cars VALUES(8,'Volkswagen',21600)")
print "BUGS_660: SQL_DROP fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
except db3.Error, e:
print "Error {}:".format(e.args[0])
sys.exit(1)
finally:
if db:
db.close()
return()
def sql_selmem(args):
dttm=ko_dttm("")
sqltbl=a2
sqlcmd=a3
fildb3="ht.db3"
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd="select sqlite_version()"
print "{} {} SQL_SELMEM fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
# exit()
db = None
# try:
# db = db3.connect(':memory:')
# cur = db.cursor()
# with db:
# cur = con.cursor()
# cur.execute("CREATE TABLE friends(id INTEGER PRIMARY KEY, name TEXT);")
# cur.execute("INSERT INTO friends(name) VALUES ('Tom');")
# cur.execute("INSERT INTO friends(name) VALUES ('Rebecca');")
# cur.execute("INSERT INTO friends(name) VALUES ('Jim');")
# cur.execute("INSERT INTO friends(name) VALUES ('Robert');")
# last_row_id = cur.lastrowid
# print "The last Id of the inserted row is {}".format(last_row_id)
# db.close()
# print "SQL_MEM fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
# except db3.Error, e:
# print "Error {}:".format(e.args[0])
# sys.exit(1)
# finally:
# if db:
# db.close()
return()
def sql_selall(args):
dttm=ko_dttm("")
sqltbl=a2
sqlcmd=a3
fildb3="ht.db3"
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd="select * from cars"
print "{} {} SQL_SEL2 fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
# exit()
# db = None
# try:
# db = db3.connect(fildb3)
# cur = db.cursor()
#
# with db:
# cur = con.cursor()
# cur.execute(sqlcmd)
# rows = cur.fetchall()
#
# for row in rows:
# print row
# db.close()
# print "SQL_SEL2 fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
# except db3.Error, e:
# print "Error {}:".format(e.args[0])
# sys.exit(1)
# finally:
# if db:
# db.close()
return()
def sql_selrow(args):
dttm=ko_dttm("")
sqltbl=a2
sqlcmd=a3
fildb3="ht.db3"
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd="select * from cars"
print "{} {} SQL_SEL1 fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
# exit()
db = None
# try:
# db = db3.connect(fildb3)
# cur = db.cursor()
# with db:
# db = con.cursor()
# cur.execute(sqlcmd)
# while True:
# row = cur.fetchone()
# if row == None: break
#
# print row[0], row[1], row[2]
# db.close()
# print "SQL_SEL1 fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
# except db3.Error, e:
# print "Error {}:".format(e.args[0])
# sys.exit(1)
# finally:
# if db:
# db.close()
#
return()
def sql_selnam(args):
dttm=ko_dttm("")
sqltbl=a2
sqlcmd=a3
fildb3="ht.db3"
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd="select sqlite_version()"
print "{} {} SQL_SELNAM fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
# exit()
# db = None
# try:
# db = db3.connect(fildb3)
# cur = db.cursor()
# with db:
# db.row_factory = db3.Row
# cur = db.cursor()
# cur.execute(sqlcmd)
# rows = cur.fetchall()
# for row in rows:
# print "{} {} {}".format(row["id"], row["name"], row["price"])
# db.close()
# print "SQL_SELNAM fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
# except db3.Error, e:
# print "Error {}:".format(e.args[0])
# sys.exit(1)
# finally:
# if db:
# db.close()
return()
def sql_updqm(args):
dttm=ko_dttm("")
sqltbl=a2
sqlcmd=a3
fildb3="ht.db3"
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd ='UPDATE cars SET price=? WHERE id=?", (uPrice, uId)'
print "{} {} SQL_UPDQ fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
# exit()
# db = None
# try:
# db = db3.connect(fildb3)
# cur = db.cursor()
# uId = 1
# uPrice = 62300
# db = db3.connect(fildb3)
# with db:
# cur = db.cursor()
# cur.execute(sqlcmd)
# db.commit()
#
# print "Number of rows updated: {}".format(cur.rowcount)
# db.close()
# print "SQL_UPD fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
# except db3.Error, e:
# print "Error {}:".format(e.args[0])
# sys.exit(1)
# finally:
# if db:
# db.close()
return()
def sql_updid(args):
dttm=ko_dttm("")
filddb3=a1
sqltbl=a2
sqlcmd=a3
fildb3="ht.db3"
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd='SELECT name, price FROM cars WHERE Id=:Id,\ {"Id": uId\}'
print "{} {} SQL_UPDID fildb3={} sqltbl={} sqlcmd={}".format( a0,dttm, fildb3, sqltbl, sqlcmd )
exit()
# db = None
# try:
# db = db3.connect(fildb3)
# cur = db.cursor()
# uId = 4
# with db:
# cur.execute("SELECT name, price FROM cars WHERE Id=:Id", {"Id": uId})
# db.commit()
#
# row = cur.fetchone()
# print row[0], row[1]
# cur.execute(sqlcmd)
# db.close()
# print "SQL_UPDID fildb3={} sqltbl={} sqlcmd={} ".format(fildb3, sqltbl, sqlcmd)
# except db3.Error, e:
# print "Error {}:".format(e.args[0])
# sys.exit(1)
# finally:
# if db:
# db.close()
# return()
#
def readImage():
fin = None
try:
fin = open(img, "rb")
img = fin.read()
fin.close()
return img
except IOError, e:
print e
sys.exit(1)
finally:
if fin:
fin.close()
return()
def sql_b64ins(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
img=a4
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( img == "" ): img="imgs/btn/koeye.png"
if( sqlcmd == "" ): sqlcmd='insert into {}'.format( sqltbl )
fildb3 = "{}_b64.db3".format( a0.split(".")[0])
filnames = (
'imgs/btn/koeye.png',
'imgs/btn/koeyeb.png',
'imgs/btn/koeyew.png',
'imgs/btn/ko.png',
'imgs/btn/ok.png',
'imgs/btn/kop12.png',
'imgs/btn/kop23.png',
'imgs/btn/kop34.png',
'imgs/btn/kop14.png',
'imgs/btn/kob.png',
'imgs/btn/kow.png'
)
sqlcmd_cr = " CREATE TABLE if not exists {} (id INTEGER PRIMARY KEY,filnam text, data BLOB);".format(sqltbl)
print "{} {} SQL_INSERT_IMG fildb3={} sqltbl={} sqlcmd={} img={}".format( a0,dttm, fildb3, sqltbl, sqlcmd, img )
try:
db = db3.connect(fildb3)
cur = db.cursor()
data = readImage()
binary = db3.Binary(data)
for filnam in filnames:
print "sql_insb64 filnam={}".format(filnam)
# sql_insb64 = "insert or replace into {} (filnam,dttm,data) values(?,?,?)"
# cur.execute("INSERT or replace INTO {} (filnam, dttm, data) VALUES (?,?,?)",filnam, dttm, (binary,) )'.format( sqltbl, img, dttm )
db.commit()
except db3.Error, e:
if db:
db.rollback()
print e
sys.exit(1)
finally:
if db:
db.close()
return()
def writeImage(img, data):
fout = None
try:
fout = open(img,'wb')
fout.write(data)
except IOError, e:
print e
sys.exit(1)
finally:
if fout:
fout.close()
return()
def sql_b64sel(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
filnam=a4
if( fildb3 == "" ): fildb3="{}_b64.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd='insert into {}'.format( sqltbl )
fildb3_b64 = "{}_b64.db3".format( a0.split(".")[0])
img = "imgs/btn/koeye.png"
try:
db = db3.connect(sqltbl)
cur = con.cursor()
sqlcmd_selb64= 'select filnam, dttm, data from {} where filnam like "{}"'.format( sqltbl, filnam )
cur.execute(sqlcmd_selb64)
filnam = cur.fetchone()[1]
dttm = cur.fetchone()[2]
data = cur.fetchone()[3]
writeImage(filnam, data)
except lite.Error, e:
print e
sys.exit(1)
finally:
if con:
con.close()
return()
def sql_selmega(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
filnam=a4
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqlcmd == "" ): sqlcmd_pragma = "pragma table_info({})".format( sqltbl)
fildb3 = "{}.db3".format( a0.split(".")[0])
img = "imgs/btn/koeye.png"
db = db3.connect(fildb3)
with db:
cur = db.cursor()
cur.execute(sqlcmd_pragman)
data = cur.fetchall()
for d in data:
print d[0], d[1], d[2]
return()
def sql_selhdr(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
filnam=a4
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqltbl == "" ): "{}".format( a0.split(".")[0] )
if( sqlcmd == "" ): sqlcmd="select * from {}".format(sqltbl)
db= db3.connect(fildb3)
with db:
db = con.cursor()
cur.execute(sqlcmd)
col_names = [cn[0] for cn in cur.description]
rows = cur.fetchall()
print "{:3} {:10} {:7}".format(col_names[0], col_names[1], col_names[2])
for row in rows:
print "{:<3} {:<10} {:7}".format(row[0], row[1], row[2])
return()
def sql_tables(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
filnam=a4
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqltbl == "" ): "{}".format( a0.split(".")[0] )
if( sqlcmd == "" ): sqlcmd= 'SELECT name FROM sqlite_master WHERE type="table"'
db = db3.connect(fildb3)
with db:
cur = con.cursor()
cur.execute(sqlcmd)
rows = cur.fetchall()
for row in rows:
print row[0]
return()
def sql_export(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
filnam=a4
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqltbl == "" ): "{}".format( a0.split(".")[0] )
if( sqlcmd == "" ): sqlcmd= 'SELECT name FROM sqlite_master WHERE type="table"'
db = db3.connect(fildb3)
cars = (
(1, 'Audi', 52643),
(2, 'Mercedes', 57642),
(3, 'Skoda', 9000),
(4, 'Volvo', 29000),
(5, 'Bentley', 350000),
(6, 'Hummer', 41400),
(7, 'Volkswagen', 21600)
)
def writeData(filsql, data):
f = open(filsql, 'w')
with f:
f.write(data)
f.close
db = db3.connect(':memory:')
with db:
cur = db.cursor()
cur.execute("DROP TABLE IF EXISTS cars")
cur.execute("CREATE TABLE cars(id INT, name TEXT, price INT)")
cur.executemany("INSERT INTO cars VALUES(?, ?, ?)", cars)
cur.execute("DELETE FROM cars WHERE price < 30000")
dta = '\n'.join(db.iterdump())
filnam="{}_{}.sql".format( a0.split(".")[0], sqltbl )
writeData(filnam, dta)
def writedata(filnam, data):
f = open(filnam, 'w')
with f:
f.write(data)
f.close()
return()
def readdata(ifile):
i = open(ifile, 'r')
with f:
data = i.read()
i.close()
return data
def readData( sqlfil):
f = open(sqlfil, 'r')
with f:
data = f.read()
return data
# youb pinky brain|https://www.youtube.com/watch?v=OqMs9WsJg2k
# youb_bringithome|https://www.youtube.com/watch?v=ATIz6i2qf6w
# youb ohmeomy|https://www.youtube.com/watch?v=c5Un3qe4b1k
# youb realydontcar|https://www.youtube.com/watch?v=EddjOiFcp9Y
# youb crytome|https://www.youtube.com/watch?v=uNH7AVNTSdU
# ukelel slas sweet child|https://www.youtube.com/watch?v=hqTBxTqbInk
# mamb jazzaroband|https://www.youtube.com/watch?v=3W_IqKU1qAg
# cry to me touch of class|https://www.youtube.com/watch?v=8ZWizoqnwg8
# valintina cry to me|https://www.youtube.com/watch?v=NWMRLkc2dt4
# higherground stevewonder|https://www.youtube.com/watch?v=4wZ3ZG_Wams
# odessa higherground|https://www.youtube.com/watch?v=xqoLCvsy8_c
def sql_import(args):
dttm=ko_dttm("")
fildb3=a1
sqltbl=a2
sqlcmd=a3
filnam=a4
if( fildb3 == "" ): fildb3="{}.db3".format(a0.split(".")[0])
if( sqltbl == "" ): "{}".format( a0.split(".")[0] )
if( sqlcmd == "" ): sqlcmd= 'SELECT name FROM sqlite_master WHERE type="table"'
db = db3.connect(fildb3)
db = lite.connect(':memory:')
with db:
cur = db.cursor()
sql = readdata()
cur.executescript(sqlcmd)
cur.execute("SELECT * FROM data")
rows = cur.fetchall()
for row in rows:
print row
return()
def ht(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
a0=""
a1=""
a2=""
a3=""
a4=""
arglen=len(args)
if( arglen == 1): a1=args[1]
if( arglen > 1): a1=args[1]
if( arglen > 2): a2=args[2]
if( arglen > 3): a3=args[3]
if( arglen > 4): a4=args[4]
j=0
k=0
progid=a0.split(".")[0]
dttm=ko_dttm("")
htmfil=a2
print "{} {} HT a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
ht_css = ""
ht_js = ""
ht_htm = ""
# ht_ko_yokk_css = ()
# ht_ko_popover_css = {}
# ht_ko_thumbnail_css = {}
# ht_ko_input_css = ""
# ht_ko_buttons_css = ""
# ht_ko_csv_css = ""
# ht_ko_drop_css = ""
htmout = ""
# ht_css = ht_ko_css(a1,a2,a3,a4)
for line in ht_ko_yokk_css(args):
htmout += line
# for line in ht_ko_yokk_css: htmout += line
for line in ht_ko_popover_css(args):
htmout += line
# for line in ht_ko_popover_css: htmout += line
for line in ht_ko_thumbnail_css(args):
htmout += line
# for line in ht_ko_thumbnail_css: htmout += line
for line in ht_ko_drop_css(args):
htmout += line
# for line in ht_ko_drop_css: htmout += line
# for line in ht_ko_input_css(args):
# htmout += line
# for line in ht_ko_input_css: htmout += line
for line in ht_ko_buttons_css(args):
htmout += line
# for line in ht_ko_buttons_css: htmout += line
for line in ht_ko_csv_css(args):
htmout += line
# for line in ht_ko_csv_css: htmout += line
for line in ht_ko_js(a1,a2,a3,a4):
htmout += line
# for line in ht_ko_js: htmout += line
for line in ht_ko_htm(a1,a2,a3,a4):
htmout += line
# for line in ht_ko_htm: htmout += line
# for line in ht_css:
# htmout += line
# for line in ht_js:
# htmout += line
# for line in ht_htm:
# htmout += line
if( htmfil != "" ):
o = open( htmfil, "wb" )
o.write(htmout)
o.close()
print "{} {} HT htmfil={}".format(progid, dttm, htmfil)
else:
print htmout
exit()
# pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
# def go bge
# bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd
def kotables_text(args):
tables = (
'CREATE TABLE IF NOT EXISTS cfaa ( lines varchar);',
'CREATE TABLE IF NOT EXISTS list ( line varchar);',
'CREATE TABLE IF NOT EXISTS csv ( r varchar, c varchar, rlen varchar, clen varchar, c0 varchar, c1 varchar, c2 varchar, c3 varchar varchar, c4 varchar, c5 varchar, c6 varchar, c7 varchar, c8 varchar, c9 varchar, c10 varchar, c11 varchar, c12 varchar, c13 varchar, c14 varchar, c15 varchar, c16 varchar );',
"CREATE TABLE IF NOT EXISTS ko ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko0 ( ko0id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko1 ( ko1id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko2 ( ko2id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
"CREATE TABLE IF NOT EXISTS ko3 ( ko3id varchar, ko0dt varchar, status varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar );",
'CREATE TABLE IF NOT EXISTS ip ( myid text, mydt text, hostname text, ip text, desc text);',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_type VARCHAR, led_date VARCHAR, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os );',
'CREATE TABLE IF NOT EXISTS data ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, k6 varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, yyyy varchar, mm varchar dd varchar begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);',
'create table if not exists proj ( koid varchar, begdt varchar, enddt varchar )',
'CREATE TABLE IF NOT EXISTS files ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar );',
'CREATE TABLE IF NOT EXISTS uslist ( usid varchar, dttm varchar, status varchar, url varchar, img varchar, tn varchar, id varchar, grp varchar, begdt varchar, enddt varchar, yyyy varchar, mm varchar, dd varchar, mth varchar, pathfile varchar, file varchar, ext varchar, size varchar, x varchar, y varchar, z varchar, width varchar, height varchar, perms varchar, permu varchar, permg varchar, temp varchar, args varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar); ',
'CREATE TABLE IF NOT EXISTS cabs( myid text, mydt text, rowname text, cab text, cabamps text, "desc" text);',
'CREATE TABLE IF NOT EXISTS cfg ( fld text, val text );',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS fp (fp_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, label VARCHAR, title VARCHAR, width VARCHAR, height VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR);',
'CREATE TABLE IF NOT EXISTS grid (grid_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, org VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS equip ( f1 text,f2 text,machine text,cab text,position text,fld06 text,network text,model text,cpumem text,bluetag text,hrcnum text,sn text,franksid text,purchased text,enddate text,amps text,rpdu_bank text,rpdu_outlets text,switch text,port text,connection text,pmm text,circuit text,panel text,breaker text,feed text, temp text );',
'CREATE TABLE IF NOT EXISTS ko_hw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab1 text, cab2 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, flag_vm text, width text, height text, weight text, im_width text, im_height text, machinename text, temp text);',
'CREATE TABLE IF NOT EXISTS ko_plans ( myid text, mydt text, planid text, loadmode text, cabnum text, cablim text, cab text, zone text, grp text, vendor text, item text, cab2 text, zone2 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text, hostname text, sn text, hrctag text, bluetag text, franksid text, os text, osver text, ip text, ips text, contact text, flag1 text, flag2 text, network text, domain text, enclave text, comply1 text, comply2 text, comply3 text, cab0 text, cab1 text, flag_defrag text, flag_iperms text, flag_srvapp text, flag_srvdb text, flag_srvweb text, temp text);',
'CREATE TABLE IF NOT EXISTS kocab ( myid text, mydt text, rowname text, rowseq text, cab text, amps text, items text, status text, type text, maxamps text, min_hdrspace text, min_ftrspace text, desc text);',
'CREATE TABLE IF NOT EXISTS kohw ( myid text, mydt text, cab text, upos1 text, upos2 text, status text, item text, hostname text, hrctag text, sn text, franksid text, purchased text, enddt text, amps text, rpdu_bank text, rpdu_outnum text, switch text, port text, conn text, pmm text, circuit text, panel text, breaker text, feed text, os text, osver text, ip text, ips text, bluetag text, host text, f12 text, f13 text, f14 text, f15 text, f16 text, f17 text, f18 text, f19 text, f20 text, f21 text, f22 text, f23 text, f24 text, f25 text, f26 text, f27 text, f28 text, f29 text, f30 text, f31 text, f32 text, f33 text, f34 text, f35 text, f36 text); ',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_type VARCHAR, led_date VARCHAR, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os );',
'CREATE TABLE IF NOT EXISTS menus ( menus_id INTEGER PRIMARY KEY DESC, role VARCHAR, url VARCHAR, levels VARCHAR);',
'CREATE TABLE IF NOT EXISTS details ( cab text,zone text,grp text,vendor text,item text,cab1 text,zone1 text,grp1 text,btu text,watts text,amps text,vac text,height text,width text,depth text,weight text,spectext text, temp text );',
'CREATE TABLE IF NOT EXISTS n11 (n11_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, ip VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS obj ( obj_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS pano ( pano_id INTEGER PRIMARY KEY, filename VARCHAR, width VARCHAR, height VARCHAR, nhor VARCHAR, nvert VARCHAR, title VARCHAR, desc VARCHAR );',
'CREATE TABLE IF NOT EXISTS periods ( yyyy text, fy text, p text, q text, wk text, begdt text, begday text, enddt text, endday text, oy text, est text, f3 text, f4 text, f5 text, f6 text, status text, desc text);',
'CREATE TABLE IF NOT EXISTS plans ( myid text, mydt text, cab text, item text, model text, cab0 text, cab2 text, amps text, os text, ip text, upos text, uheight text, enclave text, network text, cpumem text, hrcnum text, sn text, frankid text, purchased text, enddate text, rpdu_bank text, rpdu_outlets text, switch text, port text, connection text, pmm text, circuit text, panel text, breaker text, feed text, height text, width text, depth text, weight text, grp1 text, grp2 text);',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS rpts ( rptnum text, rptcode text, rptdesc text, rptsql text, dbfile text, sqlfile text, outfile text, status text);',
'CREATE TABLE IF NOT EXISTS shelves ( cab text, zone text, grp text, vendor text, item text, cab1 text, zone1 text, grp1 text, btu text, watts text, amps text, vac text, height text, width text, depth text, weight text, spectext text); ',
'CREATE TABLE IF NOT EXISTS us (us_id INTEGER PRIMARY KEY, code VARCHAR, status VARCHAR, x VARCHAR, y VARCHAR, grp VARCHAR, name VARCHAR, phone VARCHAR, email VARCHAR, dttm VARCHAR, comment VARCHAR, unique_id VARCHAR ); ',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoom ( zoom_id INTEGER PRIMARY KEY, code VARCHAR, name VARCHAR, status VARCHAR, dttm VARCHAR, color VARCHAR, speed VARCHAR, city VARCHAR, bldg VARCHAR, loc VARCHAR, floor VARCHAR, groups VARCHAR, orgs VARCHAR, title VARCHAR, published VARCHAR, comment VARCHAR, filename VARCHAR, width VARCHAR, height VARCHAR, autoloop VARCHAR, choicelist VARCHAR, listsource VARCHAR, initialvisibility VARCHAR, minscale VARCHAR, maxscale VARCHAR );',
'CREATE TABLE IF NOT EXISTS zoomxml ( zoomxml_id INTEGER PRIMARY KEY, code VARCHAR, type VARCHAR, hs_id VARCHAR, name VARCHAR, desc VARCHAR, loc VARCHAR, org VARCHAR, email VARCHAR, phone VARCHAR, sn VARCHAR, ip VARCHAR, caption VARCHAR, x VARCHAR, y VARCHAR, zoom VARCHAR, media VARCHAR, url VARCHAR, mediatype VARCHAR, urltarget VARCHAR, transition VARCHAR, interval VARCHAR, duration VARCHAR );',
'CREATE TABLE IF NOT EXISTS cfg (idx varchar,status varchar,dttm varchar,kode varchar,grp varchar,progid varchar,key varchar,val varchar,text varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS cmds ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS cpapi2 ( idx varchar, status varchar, dttm varchar, cpapi2 varchar, a0 varchar, a1 varchar, a2 varchar, a3 varchar, a4 varchar, a5 varchar, a6 varchar, a7 varchar, cp0 varchar, cp1 varchar, cp2 varchar, cp3 varchar, cp4 varchar, cp5 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS dbs ( dbs_id INTEGER PRIMARY KEY DESC, role VARCHAR, dbcode VARCHAR, dbfile VARCHAR, tbl_name VARCHAR, col_name VARCHAR, col_index VARCHAR, col_width VARCHAR, col_sorttype VARCHAR, col_ediTABLE IF NOT EXISTS VARCHAR, col_editrules VARCHAR, col_hidden VARCHAR, col_display VARCHAR, col_misc VARCHAR, notes VARCHAR);',
'CREATE TABLE IF NOT EXISTS funcs ( idx varchar, status varchar, dttm varchar, koko varchar, koco varchar, coko varchar, coco varchar, type varchar, func varchar, args varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS inv ( status text, dttm text, id text, grp text, strain text, room text, hold text, phase text, phasedt text, phaselen text, harvest text, notes text, desc text );',
'CREATE TABLE IF NOT EXISTS kono ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS koye ( idx varchar, status varchar, dttm varchar, ip varchar, koko varchar, koco varchar, coko varchar, coco varchar, name varchar, phn varchar, email varchar, title varchar, note varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS kup ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS kup_tn ( dttm varchar, status varchar, f_name varchar, f_type varchar, f_size varchar, f_error varchar, f_tmp varchar, t_name varchar, referer varchar, query_string varchar, user_agent varchar, remote_addr varchar, remote_port varchar, server_addr varchar, server_port varchar, desc varchar );',
'CREATE TABLE IF NOT EXISTS lab ( status text, dttm text, llno text, lab text, package text, item text, cat text, test text, testdt text, overall text, testname text, passed text, result text, resultdt text, notes text, desc text);',
'CREATE TABLE IF NOT EXISTS law ( idx varchar, koco varchar, status varchar, dttm varchar, ln varchar, fn varchar, cn varchar, street varchar, city varchar, state varchar, zip varchar, phn varchar, cat varchar, email varchar, url varchar, calldt varchar, emaildt varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS links ( idx varchar, status varchar, dttm varchar, grp varchar, cat varchar, code varchar, url varchar, img varchar, tn varchar, img1 varchar, img2 varchar, title varchar, desc varchar);',
'CREATE TABLE IF NOT EXISTS log (idx varchar,status varchar,dttm varchar,kode varchar,progid varchar,logtext varchar,local_addr varchar,local_port varchar,remote_addr varchar,remote_port varchar,http_host varchar,php_self varchar,user_agent varchar,query_string varchar,args varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS nodes ( node_id INTEGER PRIMARY KEY, node_status VARCHAR, node_code VARCHAR, node_name VARCHAR, node_dttm VARCHAR, node_color VARCHAR, node_speed VARCHAR, node_city VARCHAR, node_bldg VARCHAR, node_loc_code VARCHAR, node_floor VARCHAR, node_group VARCHAR, node_orgs VARCHAR, node_title VARCHAR, node_published VARCHAR, node_width VARCHAR, node_height VARCHAR, node_comment VARCHAR, node_filename VARCHAR, node_user VARCHAR, node_user_ip VARCHAR, node_referer VARCHAR, node_remote_port VARCHAR, node_viewrole VARCHAR, node_user_agent VARCHAR, node_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS leds ( led_id INTEGER PRIMARY KEY, led_status VARCHAR, led_code VARCHAR, led_name VARCHAR, led_dttm VARCHAR, led_color VARCHAR, led_speed VARCHAR, led_err VARCHAR, led_fix VARCHAR, led_os varchar, led_type varchar, led_date varchar, led_cmd VARCHAR, led_cmdout VARCHAR, led_desc VARCHAR, led_misc VARCHAR, led_city VARCHAR, led_bldg VARCHAR, led_loc_code VARCHAR, led_floor VARCHAR, led_group VARCHAR, led_orgs VARCHAR, led_title VARCHAR, led_published VARCHAR, led_width VARCHAR, led_height VARCHAR, led_comment VARCHAR, led_filename VARCHAR, led_user VARCHAR, led_user_ip VARCHAR, led_referer VARCHAR, led_remote_port VARCHAR, led_viewrole VARCHAR, led_user_agent VARCHAR, led_unique_id VARCHAR );',
'CREATE TABLE IF NOT EXISTS pot ( licence text, dttm text, status text, name text, test1_dt text, test1_val text, test2_dt text, test2_val text, test3_dt text, test3_val text, test4_dt text, test4_val text, test5_dt text, test5_val text, notes text, desc text); ',
'CREATE TABLE IF NOT EXISTS roles (role_id INTEGER PRIMARY KEY, role_code VARCHAR, role_status VARCHAR, role_comment VARCHAR );',
'CREATE TABLE IF NOT EXISTS tl (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tla (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tlc (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar);',
'CREATE TABLE IF NOT EXISTS tld (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS tle (id varchar,status varchar,dttm varchar,code varchar,grp varchar,idx varchar,tlid varchar,title varchar,begdt varchar,enddt varchar,head varchar,text varchar,assets varchar,media varchar,tn varchar,credit varchar,caption varchar,eras varchar,e_begdt varchar,e_enddt varchar,e_head varchar,e_tag varchar,charts varchar,c_begdt varchar,c_enddt varchar,c_head varchar,c_val varchar,filedt varchar,exifdt varchar,tempdt varchar,desc varchar,b64 varchar); ',
'CREATE TABLE IF NOT EXISTS us ( us_id, status varchar, dttm varchar, code varchar, grp varchar, my_id varchar, x varchar, y varchar, name varchar, phone varchar, email varchar, twitter varchar, fb varchar, yt varchar, url_http varchar, url_here varchar, url_imgvarchar, url_img1 varchar, url_img2 varchar, url_tn varchar, title varchar, comment varchar, desc varcher); ',
'CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, user_code VARCHAR, user_status VARCHAR, user_pass VARCHAR, user_role VARCHAR, user_group VARCHAR, user_name VARCHAR, user_phone VARCHAR, user_email VARCHAR, user_dttm VARCHAR, user_comment VARCHAR, user_pagelines VARCHAR user_unique_id VARCHAR );',
''
)
return(tables)
return()
def kocurses(args):
import curses
screen = curses.initscr()
#curses.noecho()
curses.curs_set(0)
screen.keypad(1)
curses.mousemask(1)
screen.addstr("This is a Sample Curses Script\n\n")
while True:
event = screen.getch()
if event == ord("q"): break
if event == curses.KEY_MOUSE:
_, mx, my, _, _ = curses.getmouse()
y, x = screen.getyx()
screen.addstr(y, x, screen.instr(my, mx, 5))
curses.endwin()
def koterm(args):
import ko_cfg
import curses
progid=ko_cfg.progid
dttm=ko_dttm("")
j=0
k=0
cmd=""
screen = curses.initscr()
# curses.noecho()
curses.curs_set(0)
screen.keypad(1)
curses.mousemask(1)
screen.addstr("-= {}_{} terminal =- {} {}-{}\n\n".format( progid,dttm, cmd, j,k ) )
while True:
event = screen.getch()
if event == ord("q"): break
if event == curses.KEY_MOUSE:
_, mx, my, _, _ = curses.getmouse()
y, x = screen.getyx()
screen.addstr(y, x, screen.instr(my, mx, 5))
curses.endwin()
def go(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
ifile="kotables.txt"
ifile="kofiles.txt"
ifile="find_mov.txt"
fildb3="ko.db3"
# otext=sql3_drops(args)
# otext=sql3_creates(args)
otext=sql3_finds(args)
# otext=sql3_mov2mp4(args)
return()
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
sql_cr=table
sqltbl="ko"
sql_drop="DROP TABLE ko"
sql_drop0="DROP TABLE ko0"
sql_drop1="DROP TABLE ko1"
sql_cr = "CREATE TABLE IF NOT EXISTS ko ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr0 ="CREATE TABLE IF NOT EXISTS ko0 ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr1 ="CREATE TABLE IF NOT EXISTS ko1 ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr_kofiles = 'CREATE IF NOT EXISTS TABLE kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, mm varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
sql_cr_kotables = 'CREATE IF NOT EXISTS TABLE kotables ( koid varchar, kodt varchar, kostat varchar, kotext varchar, id varchar, dt varchar, stat varchar, nm varchar, name varchar, fldlen varchar, flds varchar, sqlcr varchar, sqldrop varchar, sqlsel varchar, sqlins varchar, sqlupd varchar, sqlimp varchar, sqlexp varchar, sqlcmd varchar, filsql varchar, j varchar, k varchar, desc varchar, b64 varchar )'
sql_cr_files_0='CREATE TABLE IF NOT EXISTS files0 ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar )'
sql_cr_list='CREATE TABLE IF NOT EXISTS list ( line varchar)'
sql_ins="insert into files ( koid,dttm,status,pathfile ) values ('koid_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
sql_ins0="insert into files ( koid,dttm,status,pathfile ) values ('koid0_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko0.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
sql_ins1="insert into files ( koid,dttm,status,pathfile ) values ('koid1_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko1.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
print "{}_{} MSG_592_ pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins0,fildb3, j,k)
print "{}_{} MSG_5921 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins1,fildb3, j,k)
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
# db.execute(sql_drop)
# db.execute(sql_drop1)
# db.execute(sql_drop2)
# db.execute(sql_cr)
# db.execute(sql_cr0)
# db.execute(sql_cr1)
db.execute(sql_cr_kofiles)
db.execute(sql_cr_kotables)
db.execute(sql_cr_files_0)
db.execute(sql_cr_list)
db.execute(sql_ins)
db.execute(sql_ins0)
db.execute(sql_ins1)
db.close()
return()
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
sql_cr=table
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, table,fildb3, j,k)
db.execute(sql_cr)
db.close()
return()
def sql3_findfiles(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
args=[]
(alen,a0,a1,a2,a3,a4,a5,a6,a7,a8)=args2a(args)
ifile="kotables.txt"
ifile="kofiles.txt"
ifile="find_mov.txt"
fildb3="ko.db3"
ifile="fine_mov.txt"
return()
sqlcmd_schema=".schema"
sql3_cr_ko(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
sql3_cr_kofiles(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
sql3_ko_out=sql3_cr_ko()
sql3_kofiles_out=sql3_cr_kofiles()
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
sql_cr=table
sqltbl="ko"
sql_drop="DROP TABLE ko"
sql_drop0="DROP TABLE ko0"
sql_drop1="DROP TABLE ko1"
sql_cr = "CREATE TABLE IF NOT EXISTS ko ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr0 ="CREATE TABLE IF NOT EXISTS ko0 ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr1 ="CREATE TABLE IF NOT EXISTS ko1 ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr_kofiles = 'CREATE IF NOT EXISTS TABLE kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, mm varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
sql_cr_kotables = 'CREATE IF NOT EXISTS TABLE kotables ( koid varchar, kodt varchar, kostat varchar, kotext varchar, id varchar, dt varchar, stat varchar, nm varchar, name varchar, fldlen varchar, flds varchar, sqlcr varchar, sqldrop varchar, sqlsel varchar, sqlins varchar, sqlupd varchar, sqlimp varchar, sqlexp varchar, sqlcmd varchar, filsql varchar, j varchar, k varchar, desc varchar, b64 varchar )'
sql_cr_files_0='CREATE TABLE IF NOT EXISTS files0 ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar )'
sql_cr_list='CREATE TABLE IF NOT EXISTS list ( line varchar)'
sql_ins="insert into files ( koid,dttm,status,pathfile ) values ('koid_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
sql_ins0="insert into files ( koid,dttm,status,pathfile ) values ('koid0_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko0.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
sql_ins1="insert into files ( koid,dttm,status,pathfile ) values ('koid1_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko1.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
print "{}_{} MSG_592_ pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins0,fildb3, j,k)
print "{}_{} MSG_5921 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins1,fildb3, j,k)
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
# db.execute(sql_drop)
# db.execute(sql_drop1)
# db.execute(sql_drop2)
# db.execute(sql_cr)
# db.execute(sql_cr0)
# db.execute(sql_cr1)
db.execute(sql_cr_kofiles)
db.execute(sql_cr_kotables)
db.execute(sql_cr_files_0)
db.execute(sql_cr_list)
db.execute(sql_ins)
db.execute(sql_ins0)
db.execute(sql_ins1)
db.close()
return()
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
sql_cr=table
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, table,fildb3, j,k)
db.execute(sql_cr)
db.close()
return()
def sql3_mov2mp4(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
args=[]
(alen,a0,a1,a2,a3,a4,a5,a6,a7,a8)=args2a(args)
ifile="kotables.txt"
ifile="kofiles.txt"
ifile="find_mov.txt"
fildb3="ko.db3"
ifile="fine_mov.txt"
return()
sqlcmd_schema=".schema"
sql3_cr_ko(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
sql3_cr_kofiles(sql3, fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval,ifile)
sql3_ko_out=sql3_cr_ko()
sql3_kofiles_out=sql3_cr_kofiles()
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
sql_cr=table
sqltbl="ko"
sql_drop="DROP TABLE ko"
sql_drop0="DROP TABLE ko0"
sql_drop1="DROP TABLE ko1"
sql_cr = "CREATE TABLE IF NOT EXISTS ko ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr0 ="CREATE TABLE IF NOT EXISTS ko0 ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr1 ="CREATE TABLE IF NOT EXISTS ko1 ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, url varchar, img varchar, tn varchar, title varchar, name varchar, begdt varchar, enddt varchar, j varchar, k varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar, b64 varchar )"
sql_cr_kofiles = 'CREATE IF NOT EXISTS TABLE kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, mm varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
sql_cr_kotables = 'CREATE IF NOT EXISTS TABLE kotables ( koid varchar, kodt varchar, kostat varchar, kotext varchar, id varchar, dt varchar, stat varchar, nm varchar, name varchar, fldlen varchar, flds varchar, sqlcr varchar, sqldrop varchar, sqlsel varchar, sqlins varchar, sqlupd varchar, sqlimp varchar, sqlexp varchar, sqlcmd varchar, filsql varchar, j varchar, k varchar, desc varchar, b64 varchar )'
sql_cr_files_0='CREATE TABLE IF NOT EXISTS files0 ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, mm varchar, dd varchar, hhmm varchar, ctime varchar, mtime varchar, name varchar, lname varchar, fname varchar, phns varchar, emails varchar, urls varchar, title varchar, tododt varchar, donedt varchar, faildt varchar, notes varchar, street1 varchar, street2 varchar, city varchar, state varchar, zip varchar, country varchar, note varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar, h varchar, w varchar, x varchar, y varchar, z varchar, color varchar, speed varchar,j,k, b64 varchar )'
sql_cr_list='CREATE TABLE IF NOT EXISTS list ( line varchar)'
sql_ins="insert into files ( koid,dttm,status,pathfile ) values ('koid_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
sql_ins0="insert into files ( koid,dttm,status,pathfile ) values ('koid0_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko0.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
sql_ins1="insert into files ( koid,dttm,status,pathfile ) values ('koid1_1', 'kodt_1', 'todo', '/Volumes/ka1tbr1/ht/ko1.mov' )"
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
print "{}_{} MSG_592_ pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins0,fildb3, j,k)
print "{}_{} MSG_5921 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_ins1,fildb3, j,k)
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
# db.execute(sql_drop)
# db.execute(sql_drop1)
# db.execute(sql_drop2)
# db.execute(sql_cr)
# db.execute(sql_cr0)
# db.execute(sql_cr1)
db.execute(sql_cr_kofiles)
db.execute(sql_cr_kotables)
db.execute(sql_cr_files_0)
db.execute(sql_cr_list)
db.execute(sql_ins)
db.execute(sql_ins0)
db.execute(sql_ins1)
db.close()
return()
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
sql_cr=table
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, table,fildb3, j,k)
db.execute(sql_cr)
db.close()
return()
def sql3_drops(args):
import ko_cfg
dttm=ko_dttm("")
( progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8)=kocfg(args)
progid=sys.argv[0].split(".")[0]
fildb3="{}.db3".format(progid)
sqltbl="{}".format(progid)
dttm=sys.argv[0]
ifile="kotables.txt"
ifile="kofiles.txt"
ifile="find_mov.txt"
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "{}_{} SQL_DROPS MSG_5826 NOTFOUND fildb3={} {}-{}".format(progid, dttm, fildb3, j,k )
# return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
sqltbl = table.split("(")[0]
splitlen=len(sqltbl.split(" "))
sqltbl = sqltbl.split(" ")[splitlen-1]
sqltbl="ko"
sql_drop="DROP TABLE ko".format(sqltbl)
sql_drop="DROP TABLE ko".format(sqltbl).format(sqltbl)
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, sql_drop,fildb3, j,k)
promptcode="drop"
prompt="{}_{} {}: ".format(progid,dttm, promptcode )
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
db.execute(sql_drop)
db.close()
return()
def sql3_creates(args):
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
progid=sys.argv[0].split(".")[0]
fildb3="{}.db3".format(progid)
sqltbl="{}".format(progid)
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
# return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
pq=""
promptcode="create"
for table in tables:
dttm=ko_dttm("")
sql_cr=table
print "{}_{}8 -= SQL3_CREATES msg_7250 {} =- {}|{} {}-{}".format(progid,dttm, sql_cr,fildb3,sqltbl, j,k)
prompt="{}_{} {}: ".format(progid,dttm,promptcode)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
sql_cr=table
print "{}_{} SQL_CREATES msg_5920 table={} fildb3={}|{} {}-{}".format(progid,dttm, table,fildb3,sqltbl, j,k)
db.execute(sql_cr)
db.close()
return()
# inserts
def sql3_inserts(args):
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
# ifile="kotables.txt"
# ifile="kofiles.txt"
progid=sys.argv[0].split(".")[0]
fildb3="{}.db3".format(progid)
filtxt="{}.txt".format(progid)
sqltbl="{}".format(progid)
ifile="find_mov.txt"
sql3_ins="insert or replace into files values( 'koid', 'kodt', 'kostat', 'pathfile' )"
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "{}_{} -= SQL_INSERTS msv_7300 NOTFOUND fildb3={}|{} {}-{}".format(progid,dttm, fildb3, j, k)
# return(fildb3)
if( not os.path.exists(ifile)):
print "{}_{} -= SQL_INSERTS msv_7300 NOTFOUND ifile={}|{} {}-{}".format(progid,dttm, ifile, j, k)
return(ifile)
lines=""
# tables = kotables_text(args)
i = open(ifile,"r")
j=0
for line in i.readline():
cols=line.split(" ")
# if(len(cols<10)): continue
j=j+1
koid="{}".format(j)
dttm=ko_dttm("")
kodt="{}".format(dttm)
kostat ="{}".format("todo")
size ="{}".format("size")
mth ="{}".format("mth")
dd ="{}".format("dt")
yyyy ="{}".format("yyyy")
pathfile = line
sql_ins = "insert or replace into {} values('{}','{}','{}','{}')".format( sqltbl, koid,kodt,kostat,pathfile)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
dttm=ko_dttm("")
sqltbl="ko"
sql_ins="insert into files ( koid,kodt,kostat,pathfile ) values ('{}', '{}', '{}', '{}' )".format(koid,kodt,kostat,pathfile)
print "{}_{} -= SQL3_INSERTS msg_7300 {} =- fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
promptcode="inserts"
prompt="{}_{} {} q|e|s|g: ".format(progid,dttm, promptcode)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
db.execute(sql_drop)
# db.execute(sql_drop2)
db.execute(sql_ins0)
db.execute(sql_ins1)
db.close()
return()
# updates
def sql3_updates(args):
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
# ifile="kotables.txt"
# ifile="kofiles.txt"
progid=sys.argv[0].split(".")[0]
fildb3="{}.db3".format(progid)
filtxt="{}.txt".format(progid)
sqltbl="{}".format(progid)
ifile="find_mov.txt"
sql3_ins="insert or replace into files values( 'koid', 'kodt', 'kostat', 'pathfile' )"
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "{}_{} -= SQL_UPDATES msv_7300 NOTFOUND fildb3={}|{} {}-{}".format(progid,dttm, fildb3, j, k)
# return(fildb3)
if( not os.path.exists(ifile)):
print "{}_{} -= SQL_UPDATES msv_7300 NOTFOUND ifile={}|{} {}-{}".format(progid,dttm, ifile, j, k)
return(ifile)
lines=""
# tables = kotables_text(args)
i = open(ifile,"r")
j=0
for line in i.readline():
cols=line.split(" ")
# if(len(cols<10)): continue
j=j+1
koid="{}".format(j)
dttm=ko_dttm("")
kodt="{}".format(dttm)
kostat ="{}".format("todo")
size ="{}".format("size")
mth ="{}".format("mth")
dd ="{}".format("dt")
yyyy ="{}".format("yyyy")
pathfile = line
sql_ins = "insert or replace into {} values('{}','{}','{}','{}')".format( sqltbl, koid,kodt,kostat,pathfile)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
dttm=ko_dttm("")
sqltbl="ko"
sql_ins="insert into files ( koid,kodt,kostat,pathfile ) values ('{}', '{}', '{}', '{}' )".format(koid,kodt,kostat,pathfile)
print "{}_{} -= SQL3_UPDATES msg_7300 {} =- fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
promptcode="updates"
prompt="{}_{} {} q|e|s|g: ".format(progid,dttm, promptcode)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
db.execute(sql_drop)
# db.execute(sql_drop2)
db.execute(sql_ins0)
db.execute(sql_ins1)
db.close()
return()
# inserts
def sql3_select(args):
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
# ifile="kotables.txt"
# ifile="kofiles.txt"
progid=sys.argv[0].split(".")[0]
fildb3="{}.db3".format(progid)
filtxt="{}.txt".format(progid)
sqltbl="{}".format(progid)
ifile="find_mov.txt"
sql3_ins="insert or replace into files values( 'koid', 'kodt', 'kostat', 'pathfile' )"
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "{}_{} -= SQL_SELECT msv_7300 NOTFOUND fildb3={}|{} {}-{}".format(progid,dttm, fildb3, j, k)
# return(fildb3)
if( not os.path.exists(ifile)):
print "{}_{} -= SQL_SELECT msv_7300 NOTFOUND ifile={}|{} {}-{}".format(progid,dttm, ifile, j, k)
return(ifile)
lines=""
# tables = kotables_text(args)
i = open(ifile,"r")
j=0
for line in i.readline():
cols=line.split(" ")
# if(len(cols<10)): continue
j=j+1
koid="{}".format(j)
dttm=ko_dttm("")
kodt="{}".format(dttm)
kostat ="{}".format("todo")
size ="{}".format("size")
mth ="{}".format("mth")
dd ="{}".format("dt")
yyyy ="{}".format("yyyy")
pathfile = line
sql_ins = "insert or replace into {} values('{}','{}','{}','{}')".format( sqltbl, koid,kodt,kostat,pathfile)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
dttm=ko_dttm("")
sqltbl="ko"
sql_ins="insert into files ( koid,kodt,kostat,pathfile ) values ('{}', '{}', '{}', '{}' )".format(koid,kodt,kostat,pathfile)
print "{}_{} -= SQL3_SELECT msg_7300 {} =- fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
promptcode="select"
prompt="{}_{} {} q|e|s|g: ".format(progid,dttm, promptcode)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
db.execute(sql_drop)
# db.execute(sql_drop2)
db.execute(sql_ins0)
db.execute(sql_ins1)
db.close()
return()
# pyautogu
def gui0(args):
import pyautogui
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
# ifile="kotables.txt"
# ifile="kofiles.txt"
progid=sys.argv[0].split(".")[0]
fildb3="{}.db3".format(progid)
filtxt="{}.txt".format(progid)
sqltbl="{}".format(progid)
ifile="find_mov.txt"
sql3_ins="insert or replace into files values( 'koid', 'kodt', 'kostat', 'pathfile' )"
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "{}_{} -= SQL_FILES msv_7300 NOTFOUND fildb3={}|{} {}-{}".format(progid,dttm, fildb3, j, k)
# return(fildb3)
if( not os.path.exists(ifile)):
print "{}_{} -= SQL_FILES msv_7300 NOTFOUND ifile={}|{} {}-{}".format(progid,dttm, ifile, j, k)
return(ifile)
lines=""
# tables = kotables_text(args)
i = open(ifile,"r")
j=0
for line in i.readline():
cols=line.split(" ")
# if(len(cols<10)): continue
j=j+1
koid="{}".format(j)
dttm=ko_dttm("")
kodt="{}".format(dttm)
kostat ="{}".format("todo")
size ="{}".format("size")
mth ="{}".format("mth")
dd ="{}".format("dt")
yyyy ="{}".format("yyyy")
pathfile = line
sql_ins = "insert or replace into {} values('{}','{}','{}','{}')".format( sqltbl, koid,kodt,kostat,pathfile)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
dttm=ko_dttm("")
sqltbl="ko"
sql_ins="insert into files ( koid,kodt,kostat,pathfile ) values ('{}', '{}', '{}', '{}' )".format(koid,kodt,kostat,pathfile)
print "{}_{} -= SQL3_INSERTS msg_7300 {} =- fildb3={} {}-{}".format(progid,dttm, sql_ins,fildb3, j,k)
promptcode="files"
prompt="{}_{} {} q|e|s|g: ".format(progid,dttm, promptcode)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
db.execute(sql_drop)
# db.execute(sql_drop2)
db.execute(sql_ins0)
db.execute(sql_ins1)
db.close()
return()
def sql3_cr_all(args):
import ko_cfg
(progid, fildb3,sqltbl, j, k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = ko(cfg)
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
# return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
promptcode-"create"
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
sql_cr=table
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, table,fildb3, j,k)
db.execute(sql_cr)
db.close()
return()
def sql3_createall2(args):
if( not os.path.exists(fildb3)):
print "ERR_7230 NOTFOUND {}".format(fildb3)
return()
sqlcmd=sqlcmd_schema
syscmd_db3='sqlite3 {} "{}"'.format( fildb3, sqlcmd )
syscmd=syscmd_db3
# syscmd="ls -lat *.db3"
# syscmd="cat kotables.txt"
# (sysout, syserr)= kosys(syscmd,"brief")
# syscmd="sqlite3 ko.db3 .schema"
# (tables, syserr)= kosys(syscmd,"")
sql3 = sql3_db(fildb3)
db = sql3.cursor()
sql_drop_proj="drop table proj"
sql_drop_file="drop table file"
sql_drop_file0="drop table file0"
sql_drop_file1="drop table file1"
sql_drop_file2="drop table file2"
sql_prog = 'create table if not exists proj ( koid varchar, begdt varchar, enddt varchar )'
sql_file = 'create table if not exists file ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, oldfile varchar, newfil varchar, desc varchar );'
sql_cr_file0 = 'create table if not exists file0 ( koid varchar, kodt varchar, kostat varchar );'
sql_cr_file1 = 'create table if not exists file1 ( koid varchar, kodt varchar, kostat varchar );'
sql_cr_file2 = 'create table if not exists file2 ( koid varchar, kodt varchar, kostat varchar, pathfile varchar, oldfil varchar, newfil varchat, size varchar, begdt varchar, path varchar, file varchar, ext varchar, desc varchar );'
sql_ins_proj="insert into proj values('{}','{}', '{}' )".format( kodt,kostat, pathfile )
sql_ins_file="insert into file values('{}','{}', '{}','{} )".format(koid,kodt,kostat,pathfile)
sql_ins_file0="insert into file values('{}','{}', '{}','{} )".format(koid,kodt,kostat,pathfile)
sql_ins_file1="insert into file values('{}','{}', '{}','{} )".format(koid,kodt,kostat,pathfile)
sql_ins_file2="insert into file values('{}','{}', '{}','{} )".format(koid,kodt,kostat,pathfile)
db.execute(sql_drop_proj)
db.execute(sql_drop_file)
db.execute(sql_drop_file0)
db.execute(sql_drop_file1)
db.execute(sql_drop_file2)
db.execute(sql_cr_proj)
db.execute(sql_cr_file)
db.execute(sql_cr_file0)
db.execute(sql_cr_file1)
db.execute(sql_cr_file2)
db.execute(sql_ins_proj)
db.execute(sql_ins_file)
db.execute(sql_ins_file0)
db.execute(sql_ins_file1)
db.execute(sql_ins_file2)
for k in range(1,10):
koid="koid_{}".format(k)
projid="projid_{}".format(k)
dttm=ko_dttm()
pathfile="/Volumes/ka1tbr2/mov/file_{}.mp4".format(j)
sql_ins_file="insert into file values('{}','{}', '{}','{} )".format(koid,kodt,kostat,pathfile)
sql_ins_proj="insert into proj values('{}', '{}','{} )".format(kodt,kostat,pathfile)
db.execute(sql_ins_proj)
db.execute(sql_ins_file)
db.close()
i.close()
return()
# ofile="ko.sql"
# sql3=sql3_db(fildb3)
# db = sql3.cursor()
# o = open(ofile,"a")
# j=0
# rawin=""
# for table in tables.split("\n"):
# sql=table
# if( len(table) < 20):continue
# j=j+1
# sql = "create table ko0 ( koid varchar, dttm varchar, name varchar, begdt varchar, enddt varchar, desc varchar )"
# sql_cr_kofiles = 'CREATE TABLE IF NOT EXISTS kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, mm varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
# sql_cr_kotabls = 'CREATE IF NOT EXISTS TABLE kotables ( koid varchar, kodt varchar, kostat varchar, kotext varchar, id varchar, dt varchar, stat varchar, nm varchar, name varchar, fldlen varchar, flds varchar, sqlcr varchar, sqldrop varchar, sqlsel varchar, sqlins varchar, sqlupd varchar, sqlimp varchar, sqlexp varchar, sqlcmd varchar, filsql varchar, j varchar, k varchar, desc varchar, b64 varchar )'
# sql=sql_cr_kotabls
#
# for sqltbl in "proj files".split(" "):
# sql = "create table if not exists {} ( name varchar, begdt varchar, enddt varchar );".format(sqltbl)
# db.execute(sql)
# sql='insert into {} values ( "name_0", "begdt_0","enddt_0" )'.format(sqltbl)
# db.execute(sql)
# sql='insert into proj values ( "pname_0", "pbegdt_0","enddt_0" )'
# db.execute(sql)
# sql='insert into files values ( "fname_0", "fbegdt_0","enddt_0" )'
# db.execute(sql)
# sql='insert into files values ( "{}", "{}","{}" )'.format(j,dttm,table)
# db.execute(sql)
# sql='insert into files values ( "{}", "{}","{}" )'.format(j,dttm,table)
# db.execute(sql)
# prompt="{}. {}".format(j,sql)
#
# if( rawin == "" ):
# if( rawin != "g" ):
## rawin=raw_input("ko {}. {} ==================: ").format(j, table )
# rawin=raw_input(prompt)
# if( rawin == "q" ): exit()
# if( rawin == "s" ):
# rawin = ""
# continu##e
# db.execute(sql)
# sqlcmd_create=table
# db.execute(sqlcmd_create)
# print "{}. sqlcmd_create{}".format( j, sqlcmd_create)
# o.write( sqlcmd_creat )
#
# o.close()
# db.close()
#
#
#
# print "MSG_5827 bdbdbd ___FOUND bdbdbd syscmd={} fildb3={}".format(syscmd,fildb3)
# else:
# print "MSG_5827 bdbdbd NOTFOUND bdbdbd fildb3={}".format(fildb3)
#
# print "EXIT_5827 bdbdbd _______ bdbdbd fildb3={}".format(fildb3)
#
## sql_cr_kofiles = 'CREATE TABLE IF NOT EXISTS kofiles ( koid varchar, dttm varchar, status varchar, perms varchar, k1 varchar, k2 varchar, permu varchar, permg varchar, kludge varchar, size varchar, mth varchar, dd varchar, hhmm varchar, pathfile varchar, path varchar, file varchar, ext varchar, oldfil varchar, newfil varchar, exif varchar, exifdt varchar, yyyy varchar, mm varchar, begdt varchar, enddt varchar, url varchar, img varchar, tn varchar, grp varchar, id varchar, desc varchar);'
## sql = "create table ko0 ( koid varchar, dttm varchar, name varchar, begdt varchar, enddt varchar, desc varchar )"
## db.execute(sql)
##
# sql="insert into ko values('koid', 'dttm','proj_sk_100','begdt_sk_100', 'begdt_sk_100','desc' )"
# db.execute(sql)
# sql="insert into {} values('koid_{}', '{}', 'proj_sk_200','begdt_sk_200', 'begdt_sk_200', 'desc' )".format( sqltbl, progid, dttm)
# db.execute(sql)
#####
# sql="insert into ko values('koid_proj_sk_300', 'dttm_proj_sk_300', 'ko_proj_sk_300','ko_begdt_sk_300', 'ko_begdt_sk_300','ko_desc_sk_300' )"
# db.execute(sql)
exit()
if( os.path.exists(ifile)):
print "MSG_5826 pqpqpq ---FOUND pqpqpq ifile={}".format(ifile)
i = open(ifile,"r")
j=0
lines =""
for line in i.read():
lines += line
i.close()
print "MSG_5827 bdbdbd ___FOUND bdbdbd ifile={}".format(ifile)
else:
k=0
for line in lines:
k=k+1
print "{}.. {}".format(k,line)
print "ERR_5827 NOTFOUND ifile={}".format(ifile)
exit()
return()
def db_create():
fildb3="ko.db3"
sqlcmd_schema=".schema"
j=0
k=0
pq=""
bd=""
if( not os.path.exists(fildb3)):
print "MSG_5826 pqpqpq NOTFOUND pqpqpq fildb3={}".format(fildb3)
return(fildb3)
else:
tables = kotables_text(args)
j=0
sql3=sql3_db(fildb3)
db=sql3.cursor()
for table in tables:
dttm=ko_dttm("")
prompt="{}_{}: ".format(progid,dttm)
if( pq == "" ):
pq = raw_input(prompt)
if ( pq == "q" ): return()
if ( pq == "e" ): exit()
if ( pq == "s" ):
pq=""
continue
if ( pq == "g" ):
pass
j=j+1
sql_cr=table
print "{}_{} MSG_5920 pqpqpq {} pqpqpq fildb3={} {}-{}".format(progid,dttm, table,fildb3, j,k)
db.execute(sql_cr)
db.close()
return()
def go_db_20190221(args):
return()
def go_db(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
fildb3=ko_cfg.fildb3
# sqltbl=ko_cfg.sqltbl
# sqlopt=ko_cfg.sqlopt
# sqlcmd=ko_cfg.sqlcmd
# sqlfld=ko_cfg.sqlfld
# sqlval=ko_cfg.sqlval
j=ko_cfg.j
k=ko_cfg.k
arglen=len(args)
a1=""
a2=""
a3=""
a4=""
sqltbl=""
sqlcmd=""
sqlopt=""
sqlfld=""
sqlval=""
if( arglen > 1 ): a1=args[1]
if( arglen > 2 ): a2=args[2]
if( arglen > 3 ): a3=args[3]
if( arglen > 4 ): a4=args[4]
otext = "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq\n"
otext += "{}_{} -= go MSG_5850 {}|{} =- {}-{} {}:{} {}={}\n".format(progid,dttm, sqlopt,sqlcmd, j,k, fildb3,sqltbl, sqlfld, sqlval)
otext += "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd\n"
print "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ"
exit()
sqltbls = sql_schemas(sqltbl,"create",sqlfld,sqlcmd)
print sqltbls
j=0
ifile="kotables.txt"
lines=koread(ifile,"")
print "lines={}".format(lines)
for sqltbl in sqltbls:
j=j+1
otext += "{}_{} -= go sqltbls MSG_5851 {}|{} =- {}-{} {}:{} {}={}\n".format(progid,dttm, sqlopt,sqlcmd, j,k, fildb3,sqltbl, sqlfld, sqlval)
print "{}".format(otext)
return(otext )
def kofindt_vols(fildb3,sqltbl,sqlopt,sqlcmd,sqlfld, sqlfal, filtxt ):
exts = "mov mp4 jpg html db3 js pdf mp3 txt b64"
volids_ka11 = "ka11|/Volumes/ka1tbr1"
volids_ka12 = "ka12|/Volumes/ka1tbr2"
volids_ka1 = "{} {}".format( volids_ka12, volids_ka11 )
volids=volids_ka1
# for paths in i.readline():
ifile="topdirs_todo.txt"
pathdirs=""
i=open( ifile, "r" )
j=0
for pathdir in i.readlines():
# pathdir=pathdir.replace("\n", "")
j=j+1
pathdirs +=pathdir
i.close()
for pathdir in pathdirs.split():
pathfile=pathdir
pathdir=pathdir.replace("\n","")
path=os.path.basename(pathdir)
base=os.path.basename(pathdir)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace( ".", "" )
# print "BUGS_5790 {}.{}".format( j, pathdir)
k=0
for ext in exts.split():
k=k+1
ofile = "find_{}_{}.txt".format( base,ext)
namematch="*.{}".format(ext)
sysexe = "ls -lat"
opts=""
syscmd_find = 'find {} -name "{}" -exec {} \; >> {}'.format( pathdir, namematch, sysexe, ofile)
print "MSGB_5800 j={} findcmd={}".format( j, syscmd_find )
# print "BUGS_5792 j={} pathdir={} ext={}".format(j, pathdir, ext )
sysout=""
syserr=""
(sysout, syserr ) = kosys( syscmd_find,opts )
olen=len(sysout)
elen=len(syserr)
print "TODO_5841: {}.pathfile={} path={} base={} file={} ext={}".format(j,pathfile,path,base,file,ext)
print "BUGS_5842 END syscmd_find={} opts={} olen={} elen={} ofile={}".format(syscmd_find, opts, olen, elen, ofile)
# if( j > 1 ): exit()
exit()
j=0
for num_pathdir in pathdirs.split():
pathdir=num_pathdir.split("|")[0]
j=j+1
print "BUGS_5791 j={} pathdir={} ".format(j, pathdir )
k=0
for ext in exts.split():
k=k+1
# print "BUGS_5792 j={} pathdir={} ext={}".format(j, pathdir, ext )
opts=""
sysout=""
syserr=""
sysout=""
syserr=""
(sysout, syserr ) = kosys( syscmd_find,opts )
olen=len(sysout)
elen=len(syserr)
print "TODO_5841: {}.pathfile={} path={} base={} file={} ext={}".format(j,pathfile,path,base,file,ext)
print "BUGS_5842 END syscmd_find={} opts={} olen={} elen={} ofile={}".format(syscmd_find, opts, olen, elen, ofile)
if( j > 1 ): exit()
continue
exit()
def kofindt_mess(args):
for volid in volids.split(" "):
# if( volid == "/Volumes/ka1tbr1/" ): continue
# if( volid == "/Volumes/ka1tbr2/" ): continue
if( volid == "/Volumes/ka1tbr1" ): continue
if( volid == "/Volumes/ka1tbr2" ): continue
volcode=volid.split("|")[0]
volpath=volid.split("|")[1]
matchname="{}".format("*")
brackets="{}"
ofile="find_topdir_{}.txt".format( volcode )
opts=""
syscmd_find_topdirs2file='find {} -type d -maxdepth 1 -name "{}" -print >> {}'.format(volpath,matchname,ofile)
syscmd_find_topdirs='find {} -type d -maxdepth 1 -name "{}" -print '.format(volpath,matchname)
syscmd_find=syscmd_find_topdirs
# print "BUGS_5780 BEG syscmd_find_topdirs={} opts={}".format(syscmd_find_topdirs, opts)
(sysout, syse6yyrr ) = kosys( syscmd_find,"brief" )
olen=len(sysout)
elen=len(syserr)
if(olen==0):
print "msg_5795 NOTFOUND sysout={} olen={} elen={}".format(sysout, olen, elen)
return(sysout,syserr)
print "BUGS_5800 syscmd_find={} olen={} elen={}".format(syscmd_find, olen, elen)
kowrite( "topdirs.txt", sysout,"append" )
pathfiles=sysout
j=0
o = open( "topdirs.txt", "a" )
for pathfile in pathfiles.split("\n"):
j=j+1
o.write( "{}|{}\n".format( j, pathfile ))
print "BUGS_5811: {}. {}".format(j, pathfile)
o.close()
print "go msg_5810 pathfiles={} syscmd_find={} olen={} elen={}".format(pathfiles, syscmd_find, olen, elen)
exit()
# print "BUGS_5812: topdirs={} ".format(topdirs)
topdir_skippaths_ka11="/Volumes/ka1tbr1 /Volumes/ka1tbr1/sk /Volumes/ka1tbr1/logs /Volumes/ka1tbr1/mackback /Volumes/ka1tbr1/tracex /Volumes/ka1tbr1/User /Volumes/ka1tbr1/saic_safer /Volumes/ka1tbr1/.DocumentRevisions-V100 /Volumes/ka1tbr1/.fseventsd /Volumes/ka1tbr1/.Spotlight-V100 /Volumes/ka1tbr1/.TemporaryItems /Volumes/ka1tbr1/.Trashes /Volumes/ka1tbr1/appsback /Volumes/ka1tbr1/Backups.backupdb /Volumes/ka1tbr1/logs /Volumes/ka1tbr1/mackback /Volumes/ka1tbr1/tracex /Volumes/ka1tbr1/Users"
topdir_skippaths_ka12="/Volumes/ka1tbr2 /Volumes/ka1tbr2/sk /Volumes/ka1tbr2/logs /Volumes/ka1tbr2/mackback /Volumes/ka1tbr2/tracex /Volumes/ka1tbr2/User /Volumes/ka1tbr2/saic_safer /Volumes/ka1tbr2/.DocumentRevisions-V100 /Volumes/ka1tbr2/.fseventsd /Volumes/ka1tbr2/.Spotlight-V100 /Volumes/ka1tbr2/.TemporaryItems /Volumes/ka1tbr2/.Trashes /Volumes/ka1tbr2/appsback /Volumes/ka1tbr2/Backups.backupdb /Volumes/ka1tbr2/logs /Volumes/ka1tbr2/mackback /Volumes/ka1tbr2/tracex /Volumes/ka1tbr2/Users"
topdir_skippaths_ka1 = "{} {}".format( topdir_skippaths_ka11, topdir_skippaths_ka12)
j=0
k=0
topdir_skippaths="{}".format( topdir_skippaths_ka1 )
skippaths=topdir_skippaths
# print "SKIPCHECK_5815: {}. pathfiles={} path={} base={} file={} ext={}".format(j, pathfiles,path,base,file,ext)
# print "SKIPCHECK_5815: {}. pathfiles=[{}]=".format(j, pathfiles)
j=0
for pathfile in pathfiles.split():
j=j+1
print "MSG_5821 PATHFILES: {}. pathfile={} pathfiles=[{}]=".format(j,pathfile, pathfile)
path=os.path.basename(pathfile)
base=os.path.basename(pathfile)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace( ".", "" )
print "MSG_5822 PATHFILES: {}. pathfile={} path={} file={} ext={}".format(j,pathfile, path, file, ext)
print "MSG_5823 PATHFILES: {}. pathfile={} pathfiles=[{}]=".format(j,pathfile, pathfile)
for ext in exts.split(" "):
print "BUGS_5839 END pathfile={} olen={} elen={}".format( pathfile, olen, elen)
ofile="{}_{}_{}.txt".format(progid,pathfile,ext)
matchname="*.{}".format(ext)
sysexe="ls -lat"
findpath="{}".format( pathfile )
syscmd_find='find {} -type f -name {} -exec {} "{}"'.format(pathfile,matchname,sysexe,brackets)
print "BUGS_5850 j={} k={} syscmd_find={} pathfile={}".format( j,k, pathfile, syscmd_find )
i=0
opts=""
sysout=""
syserr=""
sysout=""
syserr=""
# (sysout, syserr ) = kosys( syscmd_find,opts )
olen=len(sysout)
elen=len(syserr)
print "TODO_5841: {}.pathfile={} path={} base={} file={} ext={}".format(j,pathfile,path,base,file,ext)
print "BUGS_5842 END syscmd_find={} opts={} olen={} elen={} ofile={}".format(syscmd_find, opts, olen, elen, ofile)
exit()
j=0
for pathfile in pathfiles.split():
j=j+1
kludge=pathfile
print "MSG_5832 PATHFILES: {}. pathfile={} kludge={}".format(j,pathfile,kludge)
# path=os.path.basename(filename)
# base=os.path.basename(filename)
# file=os.path.splitext(base)[0]
# ext=os.path.splitext(base)[1].replace( ".", "" )
# print "SKIPCKECK_5832 PATHFILES: {}. pathfile={} path={} file={} ext={}".format(j,pathfile, path, file, ext)
print "SKIPCHECK_5845 PATHFILES: {}. pathfile={} kludge={}=".format(j,pathfile, kludge)
for skippath in skippaths.split(" "):
k=k+1
# print "SKIPCHECK_5825: {}. skippath={} pathfile={}".format(j,skippath, pathfile,path,base,file,ext)
if( pathfile == skippath ):
otext = "SKIP5850: {}. pathfile={} skippath={}".format(j,pathfile,skippath)
print "SKIP {} {}-{}".format(otext, j,k )
o = open( "topdirs_skip.txt", "a")
o.write( otext )
o.close()
continue
j=j+1
otext = "TOTO: {}. pathfile={}".format(j,pathfile)
print "TODO: {}. pathfile={}".format(j, pathfile)
o = open( "topdirs_todo.txt", "a")
o.write( otext )
o.close()
# print "BUGS_5829 END pathfile={} olen={} elen={}".format( pathfile, olen, elen)
# print "TODO_5840: {}.topdir={} path={} base={} file={} ext={}".format(j,topdir,path,base,file,ext)
# print "BUGS_5800: {}.topdir={} path={} base={} file={} ext={}".format(j,topdir,path,base,file,ext)
# print "BUGS_5801: file={} topdir={}".format(j,file,topdir)
# print "BUGS_5802: file={} ".format(j,file)
# print "BUGS_5900: topdirs={}".format(topdirs)
# syscmd_find='find {} -type d -maxdepth 1 -name "{}"'.format(volpath,matchname)
print "BUGS_5838 END pathfile={} olen={} elen={}".format( pathfile, olen, elen)
for ext in exts.split(" "):
# print "BUGS_5839 END pathfile={} olen={} elen={}".format( pathfile, olen, elen)
ofile="{}_{}_{}.txt".format(progid,pathfile,ext)
matchname="*.{}".format(ext)
sysexe="ls -lat"
findpath="{}".format( pathfile )
syscmd_find='find {} -type f -name {} -exec {} "{}"'.format(pathfile,matchname,sysexe,brackets)
print "BUGS_5850 j={} k={} syscmd_find={} pathfile={}".format( j,k, pathfile, syscmd_find )
continue
i=0
opts=""
sysout=""
syserr=""
sysout=""
syserr=""
syscmd_find
# (sysout, syserr ) = kosys( syscmd_find,opts )
olen=len(sysout)
elen=len(syserr)
print "TODO_5841: {}.pathfile={} path={} base={} file={} ext={}".format(j,pathfile,path,base,file,ext)
print "BUGS_5842 END syscmd_find={} opts={} olen={} elen={} ofile={}".format(syscmd_find, opts, olen, elen, ofile)
exit()
print "BUGS_5850 END olen={} elen={}".format( olen, elen)
return()
topdirs_list=topdirs()
j=0
k=0
for topdir in topdirs_list.split(" "):
j=j+1
for volid in volids.split(" "):
volcode=volid.split("|")[0]
volpath=volid.split("|")[1]
vol_topdir="{}/{}".format( volpath,topdir)
if( not os.exists.path(vol_topdir)):
continue
for ext in exts.split(" "):
k=k+1
matchname="*.{}".format(ext)
ofile="{}_{}_{}.txt".format(volid,topdir,ext)
syscmd_find = 'find " {} -name "{}" -exec ls -lat \{\} \; > {}'.format( vol_topdir, matchname, ofile )
print "ok.py go {}-{} syscmd_find={}".format( j,k, syscmd_find )
exit()
j=0
ifile=a2
if( ifile == "" ):
print "MSG_5701: ifile={}".format(ifile)
return()
if( not os.path.exists( ifile )):
print "ERR_5702 NOTFOUND ifile={}".format(ifile)
return()
i=open(ifile)
print "MST_5711 BEG ifile={}".format(ifile)
lines=""
for line in i.readlines():
j=j+1
lines += "{}".format(line)
print "j={} line={}".format( j, line )
# print "{}".format( line )
print "MST_5712 BEG ifile={}".format(ifile)
return( lines)
def koread(ifile,opt):
if( not os.path.exists(ifile)):
print "koread NOTFOUND ifile={} opt={}".format(ifile,opt)
return
lines=""
i = open( ifile,"r" )
for line in i.readline():
lines += line
return(lines)
def kowrite(ofile,lines,opts):
dttm=ko_dttm("")
dt=ko_dttm("dt")
path=os.path.dirname(ofile)
base=os.path.basename(ofile)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace(".", "" )
oldfil="{}/{}_{}.{}".format(path,file,dt,ext)
newfil=ofile
if( not os.path.exists(ofile)):
print "koread NOTFOUND ifile={} opt={}".format(ifile,opt)
return
if( os.path.exists(ofile)):
print "koread EXISTS ofile={} oldfil={} opts={}|backup|append".format(ofile,oldfil,opts)
if( opts == "backup" ):
syscmd_cp = "cp {} {}".format( ofile, oldfil )
print "koread BACKUP syscmd_cp={}".format(syscmd_cp)
opts=""
(sysout, syserr) = kocmd(syscmd_cp,opts)
if( opts == "append" ):
print "koread APPEND ofile={}".format(ofile)
o = open(ofile, "a")
o.write( "{}".format( lines ))
o.close()
o = open( ofile, "w")
o.write( "{}".format( lines ))
o.close()
return
def kofind(topdir,filematch,opts,cmd):
import ko_cfg
progid=ko_cfg.progid
dttm=dttm("")
j=ko_cfg.j
k=ko_cfg.k
syscmd_find='find {} {} -name "{}" -exec cmd {} \;'.format(topdir,filematch,opts,cmd )
print "kofind msg_5880 {} {} -= syscmd_find={} =- {}={}".format( progid, dttm, syscmd_find, j,k )
(out, err ) =kocmd( syscmd_find )
return( out,err)
def kofindt_stub(ifile,findmatch,tailmatch,ofile):
print "kofindt msg_5900 ifile={} findmatch={} tailmatch={} ofile={}".format(ifile,findmatch,tailmatch,ofile)
return(findlines)
def kosys(cmd,opts):
import ko_cfg
progid=ko_cfg.progid
j=ko_cfg.j
k=ko_cfg.k
dttm=ko_dttm("")
kosys = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = kosys.communicate()
if ( opts == "br") or (opts == "brief"):
return( out, err )
j=0
for sysout in out.split("\n"):
j=j+1
print "{}_{} -= kocmd =- {}-{} sysout={}".format(progid,dttm, j,k, sysout)
k=0
for syserr in err.split("\n"):
k=k+1
print "{}_{} -= kocmd =- {}-{} syserr={}".format(progid,dttm, j,k, syserr)
return( out, err )
def go_topdirs():
topdirs = "i ht kb o1 i1 vixia3_ko1 epson photos webcam2_jtfdc_ko1 eyetv iphoto saic scan ko1tbr1_graid webcam2_jtfd c_20160609_0945 sk_ko0us mts vixia2_ko1 eulura Pictures video2_20150811 video o i imgs kb mp4"
return( topdirs )
def go_201901(args):
j=0
for line in read( a2 ):
j=j+1
print "j={} line={}".format( j, line )
# print "{}".format( line )
exit()
# htm ===========================
def ht_ko_css(a1,a2,a3,a4):
htm_ko_css = (
' <style id="style_yokkmokk">\n',
' @font-face {\n',
' font-family: yokkmokkOT;\n',
' src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");\n',
' }\n',
' @font-face {\n',
' font-family: "yokkmokkOT_file";\n',
' src: url("./fonts/yokkmokkOT.otf"); /* IE 5-8 */ \n',
' src: local("?"), /* sneakily trick IE */\n',
' url("./fonts/yokkmokk.ttf") format("truetype"), /* Opera, Safari */\n',
' url("./fonts/yokkmokkOT.woff") format("woff"), /* FF 3.6, Chrome 5, IE9 */\n',
' url("./fonts/yokkmokkOT.svg#font") format("svg"); /* iOS */\n',
' }\n',
'\n',
' body { \n',
'// font-family: yokkmokkOT;\n',
'// document.getElementById("body").style.font = "italic bold 20px arial,serif"; \n',
'// background: url("data:font/ttf;base64,AAEAAAAPADAAAwDAT1MvMlFdfQAAANO0AAAAVlBDTFRK3sYZAADUDAAAADZjbWFwIOwyJQAAwOwAAAhAY3Z0IFvZXQMAAAP8AAAAFGZwZ22DM8JPAAAD6AAAABRnbHlm/L/+SwAABDgAALYiaGRteC+LmY4AAMksAAAKiGhlYWTSA25fAADURAAAADZoaGVhBkUDJgAA1HwAAAAkaG10eAE0DCEAALzwAAACkGxvY2EAN7WQAAC6XAAAApRtYXhwASIBmQAA1KAAAAAgbmFtZT4kOPEAAAD8AAAC63Bvc3Qg7x7eAAC/gAAAAWpwcmVwCo0UlQAABBAAAAAoAAAAGAEmAAAAAAAAAAAAXAAuAAAAAAAAAAEAEACSAAAAAAAAAAIADgCpAAAAAAAAAAMASADzAAAAAAAAAAQAEAC/AAAAAAAAAAUATAFhAAAAAAAAAAYAEAG1AAAAAAAAAAcAAAHFAAEAAAAAAAAALgAAAAEAAAAAAAEACACKAAEAAAAAAAIABwCiAAEAAAAAAAMAJADPAAEAAAAAAAQACAC3AAEAAAAAAAUAJgE7AAEAAAAAAAYACAGtAAEAAAAAAAcAAAHFAAMAAQQJAAAAXAAuAAMAAQQJAAEAEACSAAMAAQQJAAIADgCpAAMAAQQJAAMASADzAAMAAQQJAAQAEAC/AAMAAQQJAAUATAFhAAMAAQQJAAYAEAG1AAMAAQQJAAcAAAHFQ29wci4xOTkzIEVsa2UgU3dpbGx1cywgRm9udFNob3AgSW50ZXJuYXRpb25hbABDAG8AcAByAC4AMQA5ADkAMwAgAEUAbABrAGUAIABTAHcAaQBsAGwAdQBzACwAIABGAG8AbgB0AFMAaABvAHAAIABJAG4AdABlAHIAbgBhAHQAaQBvAG4AYQBsWW9ra21va2sAWQBvAGsAawBtAG8AawBrUmVndWxhcgBSAGUAZwB1AGwAYQByWW9ra21va2sAWQBvAGsAawBtAG8AawBrTWFjcm9tZWRpYSBGb250b2dyYXBoZXIgNC4xIFlva2ttb2trAE0AYQBjAHIAbwBtAGUAZABpAGEAIABGAG8AbgB0AG8AZwByAGEAcABoAGUAcgAgADQALgAxACAAWQBvAGsAawBtAG8AawBrTWFjcm9tZWRpYSBGb250b2dyYXBoZXIgNC4xIDIwMDEtMTAtMDgATQBhAGMAcgBvAG0AZQBkAGkAYQAgAEYAbwBuAHQAbwBnAHIAYQBwAGgAZQByACAANAAuADEAIAAyADAAMAAxAC0AMQAwAC0AMAA4WW9ra21va2sAWQBvAGsAawBtAG8AawBrAEABACx2RSCwAyVFI2FoGCNoYEQt//wA7gFRAYcAKAAoWmJaYgACAARACQMDAgIBAQAAAY24Af+FRWhERWhERWhERWhEsQQERWhEsQUFRWhEAAIAPwAAAbYDIQADAAcAVkAgAQgIQAkCBwQEAQAGBQQDAgUEBQAHBgUBAgEDAAABAEZ2LzcYAD88LzwQ/TwQ/TwBLzz9PC88/TwAMTABSWi5AAAACEloYbBAUlg4ETe5AAj/wDhZMxEhESUzESM/AXf+x/r6AyH83z8CpAAHABj/9AEsAh0ACQATAB0AKQA1AEEASgB8QDUBS0tATB4WDAJGPAkFBAAPDgQTCkIENioEHh0UBBkYMAQkJwUtSAU5PwVEMwUhGxEHIQEkRnYvNxgALy88PBD9L/0v/S/9AS/9Lzz9PC/9L/0vPP08Li4uLi4uAC4uLjEwAUlouQAkAEtJaGGwQFJYOBE3uQBL/8A4WRMUIyI9ATQzMhUHFCMiPQE0MzIVBxQjIj0BNDMyFRMUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0IyIVFDMyNvsUFBQURRMUFBNHFBQUFL1QOjpQUDo6UCg5KSk5OSkpORwpHR0oKB0dKSgeHR0MEgF/ExOKFBTaExPaFBSKExOKFBT+dTpQUDo6UFA6KTo6KSk5OSkdKCgdHSgoHR0dHhIAAwAXATwAyQGzAAkAEwAdAFRAHgEeHkAfAAUEBAkAEwoEDw4dFAQZGBsRBxYMAgEYRnYvNxgALzw8Lzw8AS88/TwvPP08Lzz9PAAxMAFJaLkAGAAeSWhhsEBSWDgRN7kAHv/AOFkTFCMiPQE0MzIVBxQjIj0BNDMyFQcUIyI9ATQzMhXJExQUE0UUFBQURRQUFBQBTxMTUBQUUBMTUBQUUBMTTxQUAAgADP/iAW8BqAALABUAHwAxAEMATQBXAGMAkkBAAWRkQGUAVUsyLyMYDgNeU1JNSUhEQjotJRUMACAEBhEQBCkGGxoEHxY1BD5XTgRYPmEFW1BGOAMdEwMJAwFeRnYvNxgAPz88Py88L/0BLzz9PBD9Lzz9PC88/TwQ/S4uLi4uLi4uLi4uLi4uAC4uLi4uLi4uMTABSWi5AF4AZEloYbBAUlg4ETe5AGT/wDhZARQGIyImNTQ2MzIWBxQjIj0BNDMyFQcUIyI9ATQzMhUTFAYjIjU0MjY1NCYiNTQzMhYnIiY1NDYzMhUUIgYVFBYyFRQXFCMiPQE0MzIVBxQjIj0BNDMyFQcUBiMiJjU0NjMyFgFvFxARFxgQEBdPFBQUFEUUFBQUbTQlEycdHScTJTS8JTQ0JRQoHR0oKBQUFBRFFBQUFCgYDxEXFxEQFwFZERcXEREXGEsTE3YUFHYTE3YUFP7iJTQUEx4UFB0UFDQgNCUlNBQUHRQUHRQUxRQUdhQUdhQUdhQUOxAXFhEQFxcAAAoACv/fAdcBrAANABkAJwAzAEEATwBbAGcAbwB3AJJAQwF4eEB5KEw3HQNOQDkmHwVWBEcUXAQMKHQEcA4EUGgEbC4EYmUFK1MFF2oFbjEFX3YFchEFWQoXRStuAz4BJAIBFEZ2LzcYAD8/Py88Lzwv/S/9L/0Q/RD9EP0BL/0v/S/9L/0vPP0vPP0uLi4uLi4ALi4uLjEwAUlouQAUAHhJaGGwQFJYOBE3uQB4/8A4WQEHBiMiNTQ/ATYzMhUUBRQGIyImNTQ2MzIWFwcGIyI1ND8BNjMyFRQXFAYjIiY1NDYzMhYnBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUJzQmIyIGFRQWMzI2ATQmIyIGFRQWMzI2ARQjIjU0MzIBFCMiNTQzMgHQfgYIFAZ+BggU/uY0JSU0NCUlNFqDBggUBoIHCBS7NCYlNDQlJTVyfgYIFQZ/BggVwn0GCBQGfQYIFBwdFBQeHhQUHQEbHhQUHR0UFB7+yBQUFBQBGhQUFBQBiX4GFAgGfgYUCD0lNDQlJjQ1VYMGFQgGggcVCPAlNDQlJTQ0bX4GFAgGfwYUCG59BhQIBn0GFAjpFB4eFBQdHf76FB0dFBQeHgEvFBQU/tEUFBQAAAEAFAAAAhYBRgBJAKFAUQFKSkBLODs6NjUvLiopD0Y/OCwlHg0wLykoIiEbBxoESUM8OzU0AAdCFgQGGhkFAhMFCURDIQMgBUlIHAMbQkEjAyIFPTwoAycyAgMCAAEGRnYvNxgAPzw/Lxc8/Rc8Lxc8/Rc8L/0Q/TwBL/0vFzz9FzwuLi4uLi4uAC4uLi4uLi4uLjEwAUlouQAGAEpJaGGwQFJYOBE3uQBK/8A4WSUUIyEiJjU0NjMyFxYVFCMiJyYjIgYVFBY7ATUhIjU0MyE1ISI1NDMhNSMiNTQ7ATU0MzIdATMyFRQrARUzMhUUKwEVMzIVFCsBAccU/vc+WFg+OCoIFAcGIictQUEt9f7VExMBK/7VExMBKzwTEzwUFDsUFDs7FBQ8PBQUOxQUVj4+WSUHCRMFG0EuLUI0FBQdFBQdFBQnFBQnFBQdFBQdFBQAAwAJACUBIQFmABQAJgA7AF9AJAE8PEA9LDUqEAUCATozMCwlIB0aDgsHCQQTAgADASIYAwEARnYvNxgAPy8BLxc8/S4uLi4uLi4uLi4uAC4uLi4uLjEwAUlouQAAADxJaGGwQFJYOBE3uQA8/8A4WTc1Mzc2MzIVFAcGBxcWFRQjIi8BJj8BNjMyFRQPARcWFRQjIi8BJj8BNjMyFRQHBgcXFhUUIyIvASY1NBIBPAcJFAQZGzQFFgkGPQlhawYJFARjYwQUCQZtCmM8BgkVBBkbNAQVCQY6Bs8CTgkUBgYhIkIGBhQITgsQiggUBgaBgQYGEwiNDglOCBQGBSEiQgUHFAhLBwgGAAADABEAJQEpAWYAEgAkADcAVkAeATg4QDklMyggFjYxLSolIx4bGBMNCgcCBQ8DARhGdi83GAA/LwEuLi4uLi4uLi4uLi4uLgAuLi4uMTABSWi5ABgAOEloYbBAUlg4ETe5ADj/wDhZNxYPAQYjIjU0PwEnJjU0MzIXFg8BBiMiNTQ/AScmNTQzMh8BFhcHBiMiNTQ/ASYnJjU0MzIfARbJCwptBgoUBGRkBBUJBm1aOwYJFQQzMwQUCgY7C6Q8BgkVBDMNJgQVCQY8CtELDI0IEwcFgYEFBhUIjBlOCBUGBUJDBQcTCE0LD00IFAYGQhIwBQcUCE4NAAUAFAABAdoBjAAJABcAIQAvADkAgkA8ATo6QDsWNycWOTAvAyIENTQrAyoREAUDBAQMCwkDAB0cBCEYAgUTJSQUAxMFCwoyGg4qKQEtHwcDASdGdi83GAA/PDw/PC88PC88/Rc8EP0BLzz9PC8XPP0XPC8XPP0XPC4uAC4xMAFJaLkAJwA6SWhhsEBSWDgRN7kAOv/AOFkBFCMiPQE0MzIVFyMVFCMiPQE0OwEyFRQHFCMiNRE0MzIVBxQrASI1NDsBNTQzMhURFCMiPQE0MzIVAVAUFBQUdnYUFBSKFM8UFBQURhOLExN3FBMTFBQTAQETE3cUFNqJFBSdFBQUihMTAWQUFJ4UFBSKFBT+nBMTdxQUAAIACv85ALwAKAAJABMAR0AXARQUQBUIEQgDDw4EEwoGBQwBAAABA0Z2LzcYAD88Ly88AS88/TwuLgAuMTABSWi5AAMAFEloYbBAUlg4ETe5ABT/wDhZMyMiNTQ7ATIVFAcUIyI9ATQzMhWoixMTixRFFBQUFBQUFBSzFBSKFBQAAwARAGgBdQEZAAkAEwAdAFhAIAEeHkAfCBwXEg0IAxoZBRQBAAUFEA8FCwoGBRUUAQ1Gdi83GAAvPC88Lzz9PBD9PBD9PAEuLi4uLi4AMTABSWi5AA0AHkloYbBAUlg4ETe5AB7/wDhZJSMiNTQ7ATIVFAchIjU0MyEyFRQHIyI1NDsBMhUUAWHFExPFFBT+xBQUATwUi8UUFMUU8RQUFBREFBQUFEUUExMUAAMAFv/zAMkApgALABcAHwBPQB0BICBAIQAYBBwMBAASBAYeBRoPBQkVBQMJAwEGRnYvNxgALy8Q/RD9L/0BL/0v/S/9ADEwAUlouQAGACBJaGGwQFJYOBE3uQAg/8A4WTcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyyTUlJTQ0JSY0KB0VFB0dFBUdHhQTExRMJTQ0JSU1NCYVHR0VFB0dFBMTFAAEABX/4AHhAasADQAbACkANwBPQBsBODhAOQw0HxEDNi8oIRoTDAUKLSYBGAIBL0Z2LzcYAD8/Ly8BLi4uLi4uLi4ALi4uLjEwAUlouQAvADhJaGGwQFJYOBE3uQA4/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUAdt+BggVBn4GCBXBggYIFQaDBwcUSn8GCBUHfgYIFcF9BggVBn0GCBUBiX4GFAgGfgYUCG2DBhUIBoIHFQhefgYTCAd/BhUIbX0GFAgGfQYUCAAABQAd//MBvwGXAAsAFwAjAC8ANwBqQC4BODhAOQAMBAASBAYkBBgqBB4wBDQPBQknBSEVBQMtBRsyBTYDNgEhAgkDAQZGdi83GAA/Pz8vEP0v/RD9EP0Q/QEv/S/9L/0v/S/9ADEwAUlouQAGADhJaGGwQFJYOBE3uQA4/8A4WSUUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyAb96V1d6eldXeidkRkZkZEZGZC5INDRJSTQ0SCgxIyMyMiMjMTYeHh4exVd7e1dXe3tXRmRjR0ZkZEY0SUk0NElJNCMyMiMjMjIjHR0dAAMAGwABAM0BjAAJABMAHQBXQCABHh5AHwAMAhMKBA8OGAUEBAkAHRQEGRgWGxEHAwEORnYvNxgAPzw8LwEvPP083Tz9PBDdPP08AC4uMTABSWi5AA4AHkloYbBAUlg4ETe5AB7/wDhZNxQjIj0BNDMyFQcUIyI9ATQzMhUTFCMiNRE0MzIVzRQUFBSKFBQUFEUUFBQU7RMTixQUixMTixQU/pwTEwFkFBQAAwARAAABcwG0ABcAKQA3AGhAKQE4OEA5KDQgDgI2LyglIhsFBAQXAAwLBBEQCAUUJiUFGBQtGRgAAS9Gdi83GAA/PDwvEP08EP0BLzz9PC88/TwuLi4uLi4ALi4uLjEwAUlouQAvADhJaGGwQFJYOBE3uQA4/8A4WQEUIyI9ATQmIyIGHQEUIyI9ATQ2MzIWFRMjIjU0PwE2MzIVFA8BMzIVFAsBBiMiNTQ3EzYzMhUUAUcUFDkpKDoUFFE5OVEY2RcGWQYKFgREsxR+vgYKFgS/BgoVAR8UFAopOjopChQUCjlSUjn+1xAHCIEJFAYFYhQUAR7+6wkUBgUBFQkUBgAAAwAZ//QBMAGLABEAHwA5AGJAJgE6OkA7EDYoHBUJAzQXEAsIBQ0JBCYwBCAeLQUjIw4NAwgCASZGdi83GAA/PzwvEP0BLzz9L/08Li4uLi4uAC4uLi4uLjEwAUlouQAmADpJaGGwQFJYOBE3uQA6/8A4WQEHBiMiNTQ/ASMiNTQ7ATIVFA8BBiMiNTQ/ATYzMhUUFRQGIyImNTQzMhUUFjMyNjU0JyY1NDMyFxYBJI4GBRQJWZkTE9kXDK0GBRQJrQUGFFA6OlAUEzopKTkPBBUKBhYBZmEEFgoGPBQUEgthdQQVCwZ1BBYKlTpQUDoUFCk5OigfFgYGFAojAAAFACUAAQFEAdsADQAXACEAKwA1AHtAMwE2NkA3DDMpHyEYDAkIBAMdHAQKADUsBDEwJyYEKyIXDgQTEgoJBRABABUuJBoGAgESRnYvNxgAPy88PC8vPDz9PAEvPP08Lzz9PC88/TwvPP08Li4uLi4uLgAuLi4xMAFJaLkAEgA2SWhhsEBSWDgRN7kANv/AOFklIyI9ATQzMh0BMzIVFCcUIyI1ETQzMhUTFCMiPQE0MzIVBxQjIj0BNDMyFQcUIyI9ATQzMhUBMLEUFBOeFPcUFBQU4xQUFBRFFBQUFEUUFBQUnhSKFBR2FBQUExMBFRQU/k0TE2MUFGMTE2MUFGMTE2MUFAAAAwAn//QBPQGLAA0AFwAyAGdAKQEzM0A0DC4gFRAELCgEGAwXDgQTEgIBBB4HBgEABQklBRsbCgkDAQZGdi83GAA/PC8Q/RD9PAEvPDz9PC88/TwvPP0uAC4uLi4uMTABSWi5AAYAM0loYbBAUlg4ETe5ADP/wDhZASMVFCMiPQE0OwEyFRQHFCMiPQE0MzIVFxQGIyImJyYzMhceATMyNjU0JyY1NDMyFx4BASnVFBQU6RSoFBQUFKhROjBKCwYZDwQJNCIpOkIOFAQEKTMBY3gTE4wUFBTRFBSUFBSoOlA7LRkPICo6KEYXBQ0WAhBHAAAFABf/9AG4AdsADQAbACkANQBBAFtAIgFCQkBDDB8RAyghGhMMBTYEKjwEMDkFMz8FLSYYCi0BMEZ2LzcYAC8vPDwQ/S/9AS/9L/0uLi4uLi4ALi4uMTABSWi5ADAAQkloYbBAUlg4ETe5AEL/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUExQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2AbN9BgkWBX0GCRZpfQYJFQR9BgkVaXwGChUFfAYJFT5ROTpRUTo5USg5KSk6OikpOQG5nggVBwaeCBUHBJ8IFAYGnwgUBgafCBQGBp8IFAb+vTpQUDo6UFA6KTo6KSk5OgADABAAAQEuAYwACQATACEAYEAmASIiQCMAFgIcDw4EEwoFBAQJACEUBBkYGhkFBwwfHhEDBwMBHEZ2LzcYAD8XPC8Q/TwBLzz9PC88/TwvPP08LgAuLjEwAUlouQAcACJJaGGwQFJYOBE3uQAi/8A4WSUUIyI9ATQzMhUDFCMiNRE0MzIVBxQjIj0BIyI1NDsBMhUBLhQUFBRGExQUE0UUFFgTE2wU7RMTixQU/pwTEwFkFBSLExN3FBQUAAQAIv/zAMkBlgALABYAIQA9AGxALAE+PkA/JDQwJiIZFQAEPCgkHw8GBDYyLhwFOQ0MBSEXEgUDCQUrKzkDAS5Gdi83GAA/LxD9L/0vPP08EP0BLzw8/Tw8Lzw8/Tw8Li4uLgAxMAFJaLkALgA+SWhhsEBSWDgRN7kAPv/AOFk3NCYjIgYVFBYzMjYnIwYVFBYzMjY1NCc2NTQmIyIGFRQfARYVFAcWFRQGIyImNTQ3JjU0NyY1NDYzMhYVFKEaERIaGhIRGiUNJRoSERolJRoREholPB4dHTEiIjIdHR4eMSMiMUcSGRkSEhoauwckEhkZEiQvBSYRGhoRJgUUGyQlGholIjIyIicYGCcmGRgnIjExIiYABQALAAABqwHnAAsAGQAnADUAQQBkQCgBQkJAQwAyJBY0LSYfGBE8BAY2BAAfBQ85BQkDBT8JPwErHQ8AAS1Gdi83GAA/PDw/LxD9EP0Q/QEv/S/9Li4uLi4uAC4uLjEwAUlouQAtAEJJaGGwQFJYOBE3uQBC/8A4WQEUBiMiJjU0NjMyFg8BBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFDc0JiMiBhUUFjMyNgGrUTo5UVE5OlE2fQYKFAV8BgkWa3wGCRYFfQYKFGh8BwkVBXwHCRXSOikpOjsoKToBXTpRUTo5UVHwnggTBwaeCBQGBp4IFAYGnggTBwadCBMHBp0IEwexKDo6KCg7OwAGACH/9ADUAWsACwAXACMALwA3AD8AbkAvAUBAQEEAJBgEDAA4MAQ0PB4qBAYSMgU2AwUhPgU6GwUJFQUnLQUPDyEBCQMBEkZ2LzcYAD8/LxD9L/0Q/S/9EP0v/QEvPP08Lzz9PC88/TwAMTABSWi5ABIAQEloYbBAUlg4ETe5AED/wDhZExQGIyImNTQ2MzIWFRQGIyImNTQ2MzIWJzQmIyIGFRQWMzI2FTQmIyIGFRQWMzI2JxQjIjU0MzIVFCMiNTQzMtQ0JSU0NCUlNDQlJTU1JSU0KB0UFB0dFBQdHRQUHh4UFB0dFBMTFBQUFBQBEiUzMyUlNDTrJDQ0JCY0NaEUHR0UFB0dshUdHRUTHRzaExMU2hMTFAAFABf/OQDJAO4ACwAVAB8AKwAzAGpALAE0NEA1AB0gBBQALB8WBDAbGiYEDwYjBQkuBTIDBSkSEQUMGA0MAAkBAQZGdi83GAA/PzwvEP08L/0v/RD9AS88/S88PP08PC88/QAuMTABSWi5AAYANEloYbBAUlg4ETe5ADT/wDhZNxQGIyImNTQ2MzIWByMiNTQ7ATIVFAcUIyI9ATQzMhU3NCYjIgYVFBYzMjYnFCMiNTQzMsk0JSU0NCUlNBSLExOLFEUUFBQUHh4UFB0dFBQeHhQUFBSVJTQ0JSU0NLoUFBQUsxQUjBMTvBQdHRQUHR0UFBQUAAADAAkAJQEhAWYAFAAmADsAX0AkATw8QD0sNSoQBQIBOjMwLCUgHRoOCwcJBBMCAAMBIhgDAQBGdi83GAA/LwEvFzz9Li4uLi4uLi4uLi4ALi4uLi4uMTABSWi5AAAAPEloYbBAUlg4ETe5ADz/wDhZNzUzNzYzMhUUBwYHFxYVFCMiLwEmPwE2MzIVFA8BFxYVFCMiLwEmPwE2MzIVFAcGBxcWFRQjIi8BJjU0EgE8BwkUBBkbNAUWCQY9CWFrBgkUBGNjBBQJBm0KYzwGCRUEGRs0BBUJBjoGzwJOCRQGBiEiQgYGFAhOCxCKCBQGBoGBBgYTCI0OCU4IFAYFISJCBQcUCEsHCAYAAAMAEQBoAXUBGQAJABMAHQBYQCABHh5AHwgcFxINCAMaGQUUAQAFBRAPBQsKBgUVFAENRnYvNxgALzwvPC88/TwQ/TwQ/TwBLi4uLi4uADEwAUlouQANAB5JaGGwQFJYOBE3uQAe/8A4WSUjIjU0OwEyFRQHISI1NDMhMhUUByMiNTQ7ATIVFAFhxRMTxRQU/sQUFAE8FIvFFBTFFPEUFBQURBQUFBRFFBMTFAADABEAJQEpAWYAEgAkADcAVkAeATg4QDklMyggFjYxLSolIx4bGBMNCgcCBQ8DARhGdi83GAA/LwEuLi4uLi4uLi4uLi4uLgAuLi4uMTABSWi5ABgAOEloYbBAUlg4ETe5ADj/wDhZNxYPAQYjIjU0PwEnJjU0MzIXFg8BBiMiNTQ/AScmNTQzMh8BFhcHBiMiNTQ/ASYnJjU0MzIfARbJCwptBgoUBGRkBBUJBm1aOwYJFQQzMwQUCgY7C6Q8BgkVBDMNJgQVCQY8CtELDI0IEwcFgYEFBhUIjBlOCBUGBUJDBQcTCE0LD00IFAYGQhIwBQcUCE4NAAMAKv85ANwCRAALABcAYACEQDkBYWFAYgxOKltaUERDLEc6AARXGwxeIwYEQDMSSgVUW1oFREM9BRg3NgUgJgUwFQUDCQUPVA8BEkZ2LzcYAC8vEP0v/S/9L/08L/0vPP08EP0BLzw8/Tw8Lzw8/Tw8Li4uLi4uAC4uMTABSWi5ABIAYUloYbBAUlg4ETe5AGH/wDhZFzQmIyIGFRQWMzI2NxQGIyImNTQ2MzIWAzIWFRQGBwYjIgYVFBYzMjc2MzIVFAcGIyImNTQ2NzMyNjU0JiMiJjU0NjMxMjY1NCYjIgcGIyI1NDc2MzIWFRQGIzEiBhUUFrQdFBQdHRQUHSg0JSU0NCUlNFklNC8jAwQUHR0UHg4GDBUCGTglNC8iCBQdHRQlNDQlFB0dFBkOBwoVBBkwJTQ0JRQdHW4UHR0UFB0dFCU0NCUlNDQBeTQlIzIDAR0UFB0cDBQFBTI0JSI0Ax0UFB00JiU0HRQUHRQKFAYGJTMlJTQdFBUdAAACABEAAAKyAZsAKwA1AFlAIQE2NkA3AhMQDQoHNC8YAjIxBS0sJiABKSMdAxYEAAEYRnYvNxgAPzw/PDw/PC88/TwBLi4uLgAuLi4uLjEwAUlouQAYADZJaGGwQFJYOBE3uQA2/8A4WSUWFRQjIicDBwYjIi8BBwYjIi8BAwYjIjU0NxM2MzIfATc2MzIfATc2MzIXAyEiNTQzITIVFAKxARUNBWdNBwsLB1FRBwwLB0xnBQ4VAXgGDAwHUFEHDAsHUFAHDA0FE/52ExMBihQaAwQTDgE/ow8PqqoPD6P+wQ4TBAMBcBEPqqoPD6qqDxH+2hQTExQAAAIAJP/FAQMBjAAWADkAbkArATo6QDsDOSonJh0cExIANzUzLSwoJyMfGRcVCQ8EAwwLBQYHBjAvAwEJRnYvNxgAPzwvPBD9PAEv/S4uLi4uLi4uLi4uLi4ALi4uLi4uLi4uMTABSWi5AAkAOkloYbBAUlg4ETe5ADr/wDhZNxcWFRQGKwEiNTQ7ATI2NTQmKwEiNTQzMjU0JisBIjU0MzI1NCYrAREUIyI1ETQ7ATIWFRQHFhUUB3NWOjsqZhQUZhkkIxorExNRHRUfFBQ5Fg87FBQUTyAtGDAjjwkbQik7FBQjGRokFBQxFB0UFCUQFv6wExMBZBQuIBoVGTYgGgADAB//9ANoAZgADQA9AE4AdkAxAU9PQFAUMCwkFkI+JhQKAAUENQxABB1KBAxEGgIFEE0gCAUqMi4qPDgQAzoOAwE1RnYvNxgAPzw/PDwvPDwQ/Tw8EP08PAEv/d39EN39Li4uLi4uAC4uLi4xMAFJaLkANQBPSWhhsEBSWDgRN7kAT//AOFkBJiMiBhUUFjMyNyY1NCU2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUBwYjIicGIyInBiMiJjU0NjMyFzYzMhMmNTQ3JiMiBwYjBhUUFjMyAUcoL0ZjY0YvKDsBSDRCXDwGFAgGM0lGY2NGSzEGCBQGQFhBNTg+QDc1QlZ7e1ZCNDdBPxc7OyguOy8BAT5kRi4BWBhkR0ZjGD1UVVgmQgYIFAY2ZEdGYzQHFAgGQSUlJSV7Vlh7Jib+nDtWWDsYJQE0UUZjAAYAHP//AjQBjAATACcAOwBFAE8AWQCEQDwBWlpAWwBXUkM+IhoOBgoEAB4EFDIEKEU8BEE3LQNAT0YES0pZUARVVEpGBQRNOSQDEANIKxgDBAABVEZ2LzcYAD8XPD8XPBD9PAEvPP08Lzz9PC8XPP08L/0v/S/9Li4uLgAuLi4uMTABSWi5AFQAWkloYbBAUlg4ETe5AFr/wDhZJRQHBiMiNTQ3NjU0JyY1NDMyFxYHFAcGIyI1NDc2NTQnJjU0MzIXFgcUBiMiNTQzMjY1NCYjIjU0MzIWBxQjIj0BNDMyFQMUIyI1ETQzMhUDFCMiPQE0MzIVAjQ2BgoUAy8wAxQLBjZQSwYIFAY/QwcVCAZPT3RSExNCXFxCExNTc7MUFBQUTxQUFBRPFBQUFMVkVwoTBgVOWVlPBQYUClNrbVEHFAgGRV5iQwcIFAZRcFJzFBRcQUJcFBRzoRMTnRQU/wATEwFkFBT+/xMTnRQUAAcAIwAAAa4BjAAJABMAHQAnADEAOwBFAJFAQAFGRkBHCEQ/OjUwKyYhHBcSDQgDCwoFDx8eBSMBAAUGBS4tBSkoGhkFFRQ4NwUzMkJBBTw9PAAkIwIQDwMBIUZ2LzcYAD88Pzw/PBD9PC88/TwvPP08Lzz9PC88/TwQ/TwQ/TwBLi4uLi4uLi4uLi4uLi4AMTABSWi5ACEARkloYbBAUlg4ETe5AEb/wDhZJSMiNTQ7ATIVFCcjIjU0OwEyFRQXIyI1NDsBMhUUJyMiNTQ7ATIVFAcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFAGadxMTdxSL7BMT7BRjdxMTdxSL7RMT7RQU7BMT7BQU7RMT7RQU7BMT7BTrFBQUFHkUFBQU6xQUFBSrFBQUFHIUFBQUchQUFBRAFBQUFAAABQAjAAEBrgGMAAkAEwAdACcAMQBzQDEBMjJAMwgvJhwSCAMxKAQtLCENBBcLCgUPFRQFGQEABQYFJCMFHx4qGhkCEA8DARdGdi83GAA/PD88Ly88/TwvPP08EP08EP08AS8XPP08Li4uLi4ALjEwAUlouQAXADJJaGGwQFJYOBE3uQAy/8A4WSUjIjU0OwEyFRQnIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQHFCMiPQE0MzIVAZp3ExN3FIvsExPsFBTtExPtFBTsExPsFOwUFBQU6xQUFBR5FBQUFEAUFBQUchQUFBSeExN5FBQAAAEAF//0AaIBlwA0AHhANAE1NUA2DyIxLiAKAzQHBgMABBAPKQQZCAcFDCYFHAYFBQEANDMFLy4sBRYWHAMNDAEBGUZ2LzcYAD88Py8Q/S88/TwvPP08EP0Q/TwBL/0vPP0XPC4uLi4uAC4xMAFJaLkAGQA1SWhhsEBSWDgRN7kANf/AOFklIyI1NDsBNSMiNTQ7ATIdARQGFQ4BIyImNTQ2MzIXFhUUIyInJiMiBhUUFjMyNyMiNTQ7AQF6sRQUsbEUFMUUAhtjOld6eldIPAcUBwYtPUZjY0ZBMJAUFLGOFBQfFBMUfwIFAjE7eldXey8GCBUFJWRGRmMrFBQABAAg/7MBhAG0ABEAGwAlADcAiEA7ATg4QDkmLSwrKiQaBDcmDQwEEQALCgQGBR8VBDIxAwIFCxMSBRgXIiEFHRw1NAUsKw8ILygMCwIBMUZ2LzcYAD88LzwvPC88/TwvPP08Lzz9PBD9PAEvPP08Lzz9PC88/TwvPP08Li4uLgAxMAFJaLkAMQA4SWhhsEBSWDgRN7kAOP/AOFkBFCsBIj0BNDMyHQEzNTQzMhUXIyI1NDsBMhUUByMiNTQ7ATIVFBcUIyI9ASEVFCMiPQE0MyEyFQE0FJ0UFBR1FBQU7BQU7BQU7BQU7BQoFBT+7BQUFAE8FAE2FBRqFBRWVhQUxRQUFBRIFBQUFMwUFIWFFBSZFBQABQATAAEAsgIWAAsAFwAhAC0AOQBrQC0BOjpAOwAfLiIEDAAhGAQdHDQoBBIGJQUJAwUrMQUVDwU3CRo3ASsDFQIBBkZ2LzcYAD8/Py8vEP0Q/RD9EP0BLzz9PC88/TwvPP08AC4xMAFJaLkABgA6SWhhsEBSWDgRN7kAOv/AOFkTFAYjIiY1NDYzMhYVFAYjIiY1NDYzMhYDFCMiPQE0MzIVEzQmIyIGFRQWMzI2FTQmIyIGFRQWMzI2si4hIS8vISEuLiEhLy8hIS47FBQUFBMXEBEXFxEQFxcQEBgYEBAXAcchLi4hIS4u2iEvLyEhLi7+5RMTexQUATgQFxcQEBcXqRAXFxAQGBgAAAYACf/1AYUCFgALABcALQBBAE0AWQB6QDUBWlpAWwBANioiNCwgTkIELgwAEgYEVEhFBQkDBUtRBRUPBVcmBRs7BTEJMVcBSwMVAgE0RnYvNxgAPz8/Ly8Q/S/9EP0Q/RD9EP0BLzz9PC88PP08Li4uAC4uLi4xMAFJaLkANABaSWhhsEBSWDgRN7kAWv/AOFkBFAYjIiY1NDYzMhYVFAYjIiY1NDYzMhYHDgEjIiYnJjU0MzIXFjMyNzYzMhUUNw4BIyImJyYzMhceATMyNjc2MzIDNCYjIgYVFBYzMjYVNCYjIgYVFBYzMjYBgS4hIS4uISEuLiEhLi4hIS5MDTwmJTwNAhUNBRQ1NRUFDRVJDWlERGcNBRgQAwtSNTZTCwMQGCsYEBAXFxAQGBgQEBcXEBAYAcchLi4hIC8v2iEuLiEhLy+nISoqIQQEEwwyMgwTBAFBVlVBFxAzQkM0EAEjEBcXEBAXF6oQGBcREBcXAAAEACMAAAGtAYwADQAfAC0AOwBgQCUBPDxAPQI5GRELNzApIh4JAhkYBBQTAgUyJAQyACsBHBYDARNGdi83GAA/PD8/PDwQ/QEvPP08Li4uLi4uLgAuLi4uMTABSWi5ABMAPEloYbBAUlg4ETe5ADz/wDhZJRYVFCMiLwEmNTQzMhc3BwYjIj0BNDMyHQE3NjMyFRQTFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIXAakEFQkGsAQVCAYHuwkIEBQUmgYHFUYEFQkGjwQVCAYzBBQJBm8EFQkGHwUGEwj7BQYUCEyUBxeUFBRrewUWCf6yBQYTCMwFBhQIzgUGEwieBQYUCAAAAwAhAAABIgHHAAkAFwAhAGBAJQEiIkAjFh8aEAIWBQQECQAhGAQdHBMSBA4NFBMFCgcLCgABDUZ2LzcYAD88LxD9PAEvPP08Lzz9PC88/TwuAC4uLi4xMAFJaLkADQAiSWhhsEBSWDgRN7kAIv/AOFk3FCMiNRE0MzIVEyMiPQE0MzIdATMyFRQnFCMiPQE0MzIV0xQUFBQ72RQUFMUUkxQUFBRZExMBWhQU/k0U2RQUxRQUWRMTTxQUAAABACUAAQJ3Ac0AJwBXQB8BKChAKQAiHBEOCwgFBQQEJwASEQQXFiUfGRQCARZGdi83GAAvPC88PAEvPP08Lzz9PAAuLi4uLi4uMTABSWi5ABYAKEloYbBAUlg4ETe5ACj/wDhZJRQjIjURBwYjIi8BBwYjIi8BERQjIjURNDMyHwE3NjMyHwE3NjMyFQJ3FBRlBwoLB3l5BwsKB2UUFBMMB3l5BwsKB3h5BwwTFBMTAU7MDg7z8w4OzP6yExMBohcO9fUODvT0DhcAAQAkAAECJgHOACMATEAZASQkQCUiIB0XDAkGAyINDAQSERQaDwERRnYvNxgALy88AS88/TwuAC4uLi4uLi4xMAFJaLkAEQAkSWhhsEBSWDgRN7kAJP/AOFkBAwYjIi8BBwYjIi8BERQjIjURNDMyHwE3NjMyHwE3NjMyFRQCJHcGDAwGZGQGDQwGUBQUEw0GZGUHCwsHZGQFDRUBrv7oDw/t7Q8Pvv7AExMBohYO7e0QEO3tDBMFAAUAHf/zAb8BlwALABcAIwAvADcAakAuATg4QDkADAQAEgQGJAQYKgQeMAQ0DwUJJwUhFQUDLQUbMgU2AzYBIQIJAwEGRnYvNxgAPz8/LxD9L/0Q/RD9EP0BL/0v/S/9L/0v/QAxMAFJaLkABgA4SWhhsEBSWDgRN7kAOP/AOFklFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgG/eldXenpXV3onZEZGZGRGRmQuSDQ0SUk0NEgoMSMjMjIjIzE2Hh4eHsVXe3tXV3t7V0ZkY0dGZGRGNElJNDRJSTQjMjIjIzIyIx0dHQADACIAAQF9AYwAEwAvADkAbkAuATo6QDsAJw4GIAQUCgQAJSQEKhopOTAENTQkIwUQHRwFGAQXMjctLAMQAwE0RnYvNxgAPxc8Ly88PP08EP08AS88/TwvPDz9PC/9L/0uLgAuMTABSWi5ADQAOkloYbBAUlg4ETe5ADr/wDhZARQHBiMiNTQ3NjU0JyY1NDMyFxYHFAYrASI1NDsBMjY1NCYrARUUIyI9ATQ7ATIWAxQjIjURNDMyFQF9IgYKFAMbGwMUCgYiVkgyKBMTKCIxMSIUFBQUKDJI3RQUFBQBET00CRQFBiswMSsGBRQJND4zSBQUMSIiMVMTE2cUSP7QExMBZBQUAAACAB3/dQI+AZcAIABBAHxANwFCQkBDJDEuHxwVEg8sKSQaFwYDADQzFQMUBDk4EAMPDAQ8JyYBAwAFIiEGAwUJBT82PwMBPEZ2LzcYAD8vEP0vFzz9FzwBL/0vFzz9FzwuLi4uLi4uLgAuLi4uLi4uMTABSWi5ADwAQkloYbBAUlg4ETe5AEL/wDhZJSMiNTQ7AS4BIyIGFRQWFzU0MzIdATY3JyY1NDMyHwE2NzMyFRQrAQYHFxYVFCMiLwEGBxUUIyI9AS4BNTQ2MzIWAZhBExNBCGBBRmRXPxQULyYtBxUIBi0eLWsUFGsGKUwGFQgGSzFAFBRQbntXUXeyFBNAVmNHQWAIQBQUQAYeLQcIFAYuJlcTFD8zTAYIFQZMKQZrFBRrCHdSV3tuAAACACYAAAGUAYwACQA/AHpANQFAQEBBDTUSKCEeGBUNCi4EPjMyBDg3CQAEBQQyMQUHKyoFHh0VAxQjGgIDDwA7OgcDAQRGdi83GAA/PDw/FzwvFzz9PBD9PAEvPP08Lzz9PC/9Li4uLi4uLgAuLjEwAUlouQAEAEBJaGGwQFJYOBE3uQBA/8A4WTcUIyI1ETQzMhUfARYVFCMiLwEGKwEXFhUUIyIvASMXFhUUIyIvASY1NDsBMjY1NCYrARUUIyI9ATQ7ATIWFRROFBQUFONfBBUKBmUKDApYBBULBmYfWAQVCgdtBhd/IC4uIGsUFBR/MUUUExMBZBQUyZAGBRQJmAN/BgUUCZV/BQYUCZ4IBxAuISAvbxMTgxRGMUMAAQAd/zkA0AKiAFsAdkAyAVxcQF0fQBI+EDElGQRZTQlTRwMENysfFgUMIgUABgUcRAU6NAVKUAUuVgUoDDoBCUZ2LzcYAC8vL/0v/S/9EP0v/S/9EP0BLzw8/Tw8Lzw8/Tw8Li4ALi4xMAFJaLkACQBcSWhhsEBSWDgRN7kAXP/AOFkTMjY1NCYjIiY1NDYzMhcWFRQjIicmIyIGFRQWMzIWFRQGIyIGFRQWMzIWFRQGIyIGFRQWMzIWFRQGIyInJjU0MzIXFjMyNjU0JiMiJjU0NjMyNjU0JiMiJjU0NnYUHh0UJjQ0Ji8aBBULBg4ZFB8fFCU0NSQUHx4VJTQ2JRQdHxQlNDQlOhgCFAwGDiAUHR0UJjQ0JhQdHRQmNDQBjB4VFBw0JSY0JgYFFAkVHhUUHTMlJjQeFBQcNSUlNh0UFB01JSU0MwUFEwwcHRQUHjQlJjQeFBQdMyYmMwADAA0AAQFwAaAACQAhACsAeEA0ASwsQC0ZHw4HKiUZFAwLBBEQBCEKBB0cCQAEBQQcGxIRCwUKBRYjIgUnAignAxcWAgEURnYvNxgAPzw/PC8Q/TwQ/Rc8AS88/TzdPP08EN08/TwuLi4uAC4uLjEwAUlouQAUACxJaGGwQFJYOBE3uQAs/8A4WTcUIyI9ATQzMhU3IxUUIyI9ASMiNTQzITIVFCsBFRQjIjU3ISI1NDMhMhUU0hQUFBQdYhQURRMTATwUFEUUFG3+xBMTATwUFBMT7RQUMncTE3cUExMUdxMTvBQUFBQAAwAm//IBWQGEABcAKwA/AGVAKAFAQEBBKjw0KCA+Kh4TEgQXAAwLBDIHBg8FAyQFGjgFLi4VCQMBBkZ2LzcYAD88LxD9L/0v/QEvPDz9PC88/TwuLi4ALi4uLjEwAUlouQAGAEBJaGGwQFJYOBE3uQBA/8A4WQEUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQBVlk/P1kUFEEvL0IUEwQ7VlQ9BxMHBjRERDMGBxQLQ0pLQwsUBQU7QD4+BQQTAStAWVlARRQURS9CQi9FFBT7MzQGCRQFKikFFAlmIyMGCxYDHx4CFAsAAgAI/+8BjAGMABMAJwBHQBgBKChAKSYhAyYcEggXDQEkHhADCgMBHEZ2LzcYAD8XPD8vAS4uLi4ALi4xMAFJaLkAHAAoSWhhsEBSWDgRN7kAKP/AOFkBBwYjIi8BJjU0MzIfATc2MzIVFBcDBiMiJwMmNTQzMhcbATYzMhUUATVYBwsMB1gCFQsGRkYGDBVTrgcMCwetAhULBpucBgwVAW66Dw+6BQUUDJSUDBQFBf6QDw8BcAUFFAz+twFJDBQFAAABAA7/8AKvAYoAKwBLQBkBLCxALSolHxkMBioUDwkDIhwBKBYDARRGdi83GAA/PD88Lzw8AS4uAC4uLi4uMTABSWi5ABQALEloYbBAUlg4ETe5ACz/wDhZAQMGIyIvAQcGIyIvAQcGIyInAyY1NDMyFxM3NjMyHwE3NjMyHwETNjMyFRQCrncGDQwHT1EHCwsHUVAHCw0GeAEVDgRoTAcLDAdRUQcLCwdNZwQOFQFw/pERDqqqDg6qqg4RAW8DBBMN/sGjDw+rqw4OowE/DRMEAAACABL/8wIJAZcAKwBXAGhAKAFYWEBZKlVST0xJPzkzJR8ZDwwJBgNELioUPDZCMAAiHAMoFgMBFEZ2LzcYAD88Pzw/PC88AS4uLi4ALi4uLi4uLi4uLi4uLi4uLjEwAUlouQAUAFhJaGGwQFJYOBE3uQBY/8A4WQEHBiMiLwEHBiMiLwEHBiMiLwEmNTQzMh8BNzYzMh8BNzYzMh8BNzYzMhUUAxYVFCMiLwEHBiMiLwEHBiMiLwEHBiMiNTQ/ATYzMh8BNzYzMh8BNzYzMhcCB0oHCgsHPj0HCwoHPT4HCwoHSgIUDAU4PwcLCgc9PAcKCwc/OAUMFAICFQsFOD8HCwoHPD0HCgsHPzgFCxUCSgcKCwc+PQcKCwc9PgcLCgcBbpQODnt7Dg57ew4OlAUEFAtxeg4OenoODnpxCxQE/qkFBBQLcnsODnt7Dg57cgsUBAWVDg58fA4OfHwODgAAAQAFAAEBngGzACsAX0AlASwsQC0NJh4bCwgAIR4ZDQgFKxEQAwAEJyYWAxUpEyMDAwEZRnYvNxgAPzwvLwEvFzz9FzwuLi4uLi4ALi4uLi4uMTABSWi5ABkALEloYbBAUlg4ETe5ACz/wDhZEzc2MzIVFA8BNzYzMhUUDwEVFCMiPQEnJjU0MzIfAScmNTQzMh8BNTQzMhXlTgYJFARNfgQEEw2sFBSrDRMEBH1NBBUJBk0UFAEYbggTBQZuMAIVDQVAuRMTuUAFDRUCL20FBhMIbocUFAAAAQAP/9gBBAHaAC0Ab0AsAS4uQC8gAiwpJiMgGxgVEg8MCQQBGRgFHRMSBSQjKikFDQweHQcGAQABCUZ2LzcYAD8vPC88Lzz9PC88/TwQ/TwBLi4uLi4uLi4uLi4uLi4ALjEwAUlouQAJAC5JaGGwQFJYOBE3uQAu/8A4WTcHMzIVFCsBIjU0PwEjIjU0PwEjIjU0PwEjIjU0OwEyFRQPATMyFRQPATMyFRT5mY0UFMcXCpmMFwqajRcKmYwTE8YYC5mMGAuZjBh6ehQUEgoIehIKCHoSCgh6FBQSCgh6EgoIehIKAAACAAcBvgDdAp8AFAAmAEdAFgEnJ0AoGCAdGgoAIhgQBSUVDgcBEEZ2LzcYAC88LzwBLi4uLgAuLi4uLjEwAUlouQAQACdJaGGwQFJYOBE3uQAn/8A4WRMyHwEWFRQjIi8BBgcGIyI1ND8BNjcXFhUUIyIvAQcGIyI1ND8BNnEJBlYGFAgGSBQ1BggUBlYGFlcHFQgGSUgGCBQGVg4CPQZWBggVBkgTNQYVCAZWBlRXBwgUBklIBhUIBlYOAAEAAf+xAO//2QAJADlADwEKCkALCAgDBgUBAAEDRnYvNxgALzwvPAEuLgAxMAFJaLkAAwAKSWhhsEBSWDgRN7kACv/AOFkXIyI1NDsBMhUU28YUFMYUTxQUFBQAAwABAb4A+gK3AA0AGwApAEVAFQEqKkArAicSCwQlHhcQCQIZIAEXRnYvNxgALy8BLi4uLi4uAC4uLi4xMAFJaLkAFwAqSWhhsEBSWDgRN7kAKv/AOFkTFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhf0BhUIBkcGFQgGMwYVCAZWBhQIB5cGFQgGRwYUCAYCGwYIFQZHBggVBgYGCBUGVgYIFAbQBggVBkgGCBUGAAQAFP/zAb8BIAAJABMAHwArAGBAJgEsLEAtABEHBQQECQAPDgQTCiAEFCYEGiMFHSkFFx0XDAIAARpGdi83GAA/PC8vEP0Q/QEv/S/9Lzz9PC88/TwALi4xMAFJaLkAGgAsSWhhsEBSWDgRN7kALP/AOFklFCMiPQE0MzIVBxQjIj0BNDMyFQcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgG/ExQUE0UUFBQUOVk+PlhYPj5ZKEEuLUFBLS5BExQU7RQU7RQU7RQUdj5ZWT4+WFg+LUFBLS5BQQAAAQAiAAABBgIVADcAc0AwATg4QDkCISA2NCwjHhgAEgQCJwQyDg0ECQgaBRYVKikFLg8OBQULLy4DBgUAAQhGdi83GAA/PD88LxD9PBD9PC88/QEvPP08L/0v/S4uLi4uLi4ALi4xMAFJaLkACAA4SWhhsEBSWDgRN7kAOP/AOFk3FhUUBisBIjURNDMyFREzMjY1NCYrAQY1NDMyNzY1NCsBIjU0MzI1NCsBIjU0OwEyFhUUBxYVFNE1OipsFBQUWBgkJBgnExMaFhwxGhMTMyUOExMOISwTK6gaNSU0FAHtFBT+JxwVFR0EFhUJCxMoFBQdHRQUKRwWExctHgADABX/8wK3AUgADQA9AEwAc0AvAU1NQE4UOjAsJBYOREAmFAoASQQMQgQdBQQ1RhoCBRA+CCAFKjIuKjw4EAIBNUZ2LzcYAD88PC88PBD9PDwQ/Tw8AS/9L/0v/S4uLi4uLgAuLi4uLi4xMAFJaLkANQBNSWhhsEBSWDgRN7kATf/AOFkTJiMiBhUUFjMyNyY1NCU2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUBwYjIicGIyInBiMiJjU0NjMyFzYzMgMyNyY1NDcmIyIGFRQXFvwbIjZMTDYiGysBBik2RzQGFAgGJzg2TEw2OCcGCBQGNUYyLSg1NSgqNEZkZEY0KCs0NTUjGywsGiQ1TTYnARAQTTU2TA8wQ0JLHTUGCBMGKE01Nk0pBhQHBjYdHBwcZEZHYx0d/tQPL0RDLxBNNUIlGwAEABj/9AHDAdsACQATAB8AKwBdQCQBLCxALQAMAgUEBAkADw4EEwogBBQmBBojBR0pBRcRBxcBGkZ2LzcYAC8vPBD9L/0BL/0v/S88/TwvPP08AC4uMTABSWi5ABoALEloYbBAUlg4ETe5ACz/wDhZJRQjIjURNDMyFQMUIyI1ETQzMhUDFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYBwxMUFBNFFBQUFDlZPj5YWT0+WShBLi1BQS0uQRQTEwGzFBT+TRMTAbMUFP7EPllZPj5YWD4tQUEtLkFBAAMAFf/zAa0BIAAJABMAMwBiQCYBNDRANQgwIjIgEg0IAykEGQEABQYFJgUcEA8FCwosBRYcFgEZRnYvNxgALy8Q/S88/TwQ/S88/TwBL/0uLi4uLi4ALi4xMAFJaLkAGQA0SWhhsEBSWDgRN7kANP/AOFklISI1NDMhMhUUByEiNTQzITIVFAcGIyImNTQ2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUAZn+2BMTASgUFP7YExMBKBSTLEI+WVk+OigHFAcGIScuQUEuLyIGCBSeFBMTFEYUFBQUNDFZPj5YJAYJFQUbQS0uQSQGFAcAAAEADf9+AOoB4wA+AJJASgE/P0BADhA7NCghGg4DLCslJB4dFwcWBD44NzEwBwYHABMFCh0cAQMABRgXBgMFPj0fAx4FOTgkAyM3NiYDJQUyMSsDKgouAQNGdi83GAAvLy8XPP0XPC8XPP0XPC8XPP0XPBD9AS8XPP0XPC4uLi4uLi4ALjEwAUlouQADAD9JaGGwQFJYOBE3uQA//8A4WTcjIjU0OwE1NDYzMhcWFRQjIiYjIgYdATMyFRQrARUzMhUUKwEVMzIVFCsBFRQjIj0BIyI1NDsBNSMiNTQ7AVw7FBQ7LiEgGAcUBhcOEBc7FBQ7OxQUOzsUFDsUFDsUFDs7FBQ74hQUiiAvFwYJExEXEIoUFB0UFB0UFMYUFMYUFB0UFAAEAAn/OQGtASAACwAkAEIATgBfQCUBT09AUEE/MSEULyMSQwRBAEkEBkYFCUwFAxsFDjgFKAkoAS9Gdi83GAAvLxD9L/0v/RD9AS/9Lzz9Li4uAC4uLi4xMAFJaLkALwBPSWhhsEBSWDgRN7kAT//AOFklFAYjIiY1NDYzMhYDBiMiJyY1NDMyFx4BFxYzMjc2NzYzMhUUFw4BIyImJyYnJjU0MzIXFhceATMyNjc2NzYzMhUUJzQmIyIGFRQWMzI2AaxYPj5YWD4+WFYvS0wwDBILBwIFASM5OiIGAQgKE0MbbkJCbhwBBAIUDQYBBBZaNzZaFwIDBg0SKEEuLkBALi5Bij5ZWT4+WFj+7js9DwoSCQIHAS0uBgMLFQkMO0dIOwQIBQQUDgMJMDo7MAUFDhQLxS1BQS0uQUEAAgAi/zkCJQHbAAkAOABeQCMBOTlAOhg4NTArJiEVExEPDQIeHRkYOAoJAwAEBQQHGwEERnYvNxgALy8BLzz9FzwuLi4uAC4uLi4uLi4uLi4uLjEwAUlouQAEADlJaGGwQFJYOBE3uQA5/8A4WTcUIyI1ETQzMh0BNDYzMhc2MzIXNjMyFhURFCMiNRE0JiMiBhUUIyI1NCYjIgYVFCMiNTQmIyIGFUoUFBQUIxgwIBwyMh0gLyk7FBQjGRgjFBQiGRgjExQjGRgjFBMTAbMUFMEMFygoKCg6Kf6HFBQBeRgjIxgTExgjIxgTExgjIxgABQAV/8gAswHyAAsAFwAhAC0AOQBnQCoBOjpAOwAfNCgEEgYcLiIEDAAhGAQdHCUFCQMFKzEFFTcFDwkaKwMBBkZ2LzcYAD8vLy/9L/0Q/RD9AS88/TzdPP08EN08/TwALjEwAUlouQAGADpJaGGwQFJYOBE3uQA6/8A4WRMUBiMiJjU0NjMyFhUUBiMiJjU0NjMyFgMUIyI9ATQzMhUTNCYjIgYVFBYzMjYVNCYjIgYVFBYzMjazLiEgLy8gIS4uISEuLiEhLjsUFBQUExcQEBcXEBAXFhEQFxcQEBcBoyEvLyEhLi7fIC8vICEuLv7WFBSMFBQBOxAXFxAQGBetERYWERAXFwAABgAK/8MBfQHkAAsAFwArAEEATQBZAHRAMQFaWkBbAD81KCAyLCoeTkIEDAAGEgRIVAMFS0UFCVEFFVcFDyQFGjoFLwkvSwMBMkZ2LzcYAD8vLxD9L/0v/S/9EP0Q/QEvPP08Lzz9PC4uLi4ALi4uLjEwAUlouQAyAFpJaGGwQFJYOBE3uQBa/8A4WQEUBiMiJjU0NjMyFhUUBiMiJjU0NjMyFgcGIyInJjU0MzIXFjMyNzYzMhUUFw4BIyImJyY2MzIXHgEzMjY3NjMyFgM0JiMiBhUUFjMyNhU0JiMiBhUUFjMyNgF9LiAhLi4hIC4uICEvLyEgLk4gTU4fAhUNBRUzMxYFDRRID2ZCQmYOAg0JDgQMUTM0Tw0EDgoNJRcQEBcXEBAXFxAQGBcREBcBlCAuLiAhLy/eIS4uISEvL6lHRwQFEwwvLwwTBAI+UVE+Cw0OMUBAMQ4NATcQGBcREBcXrRAYGBAQFxcAAAQAJ///AYQBoAANAB8ALQA7AFpAIQE8PEA9AjkrHBkRCzcwKSIeCQIZGAQUExYDMiQEAAETRnYvNxgAPzw8PwEvPP08Li4uLi4uLgAuLi4uLi4xMAFJaLkAEwA8SWhhsEBSWDgRN7kAPP/AOFklFhUUIyIvASY1NDMyFycHBiMiPQE0MzIdATc2MzIVFBcWFRQjIi8BJjU0FzIXBxYVFCMiLwEmNTQzMhcBgAQVCQZ8BBUJBjOKCQgPFBRrBgYURAQVCQZbBBUJBgcEFQkGOQQUCgYgBgYUCK0GBhQIJGIGFe4UFMdMBBUJ1wYGFQl/BgYVAQh/BgYVCVAGBhUJAAACACQAAQCaAaAACQATAEhAGAEUFEAVChEPDgQTCgkABAUEDAIHAwEERnYvNxgAPy88AS88/TwvPP08AC4xMAFJaLkABAAUSWhhsEBSWDgRN7kAFP/AOFk3FCMiNRE0MzIVExQjIj0BNDMyFUwUFBQUThQUFBQUExMBeBQU/ogTE9kUFAAFACUAAQJjAVAACQATAB0AJwBdAJlARAFeXkBfLVJHPDAlFhEHRUQPDgQTCh0UBBkYMzIELi0FBAQJACceBCMiUE8EVVQ+BDo5TEE2BVxYKiAMAlooARsCARhGdi83GAA/PzwvPDwvPDz9PDwBLzz9Lzz9PC88/TwvPP08Lzz9PC88/TwvPP08Li4ALi4uLi4uLi4xMAFJaLkAGABeSWhhsEBSWDgRN7kAXv/AOFklFCMiPQE0MzIVBxQjIj0BNDMyFQUUIyI9ATQzMhUTFCMiPQE0MzIVNzYzMhYdARQjIj0BNCYjIgYdARQjIjU0JiMiBh0BFCMiNTQmIyIGHQEUIyI9ATQ2MzIXNjMyAhQUFBQUnxMUFBP+1xMUFBOLFBQUFNcdNCk7FBQjGRgjFBQjFxkiFBQkGBgjFBQ7KC4fHzMtFBMTnhQUnhMTnhQUFBMTnhQU/tgTE54UFEwrOikKExMKGCMjGAsTExktIxgLExMZLSMYChMTCik6KysABAAdAAEBwQFTAAkAEwAdAEMAekAzAUREQEU6PDUtIRYRBzoFBAQJACQjBB8eEwoEDw4rKgQwLx0UBBkYQScFNzMMAhsCARhGdi83GAA/LzwvPP08AS88/TwvPP08Lzz9PC88/TwvPP08LgAuLi4uLi4uMTABSWi5ABgAREloYbBAUlg4ETe5AET/wDhZJRQjIj0BNDMyFQcUIyI9ATQzMhUHFCMiPQE0MzIVFxUUIyI9ATQmIyIGHQEUIyI9ATQ2MzIXNjMyFhUUIyI1NCYjIgYBchQUFBSgFBQUFI0UFBQU2xMVJBYZIxQUOykuIBs3KDsUFCQXGSUUExOfFBSfExOfFBQTExOfFBR2DBMTChcmJBgLExMLKToqKkQqExMaLSMAAAQAGf/zAUUBIAALABcAIwAvAFxAJQEwMEAxACoEHhIEBgwEACQEGA8FCScFIS0FGxUFAwkDIQEBBkZ2LzcYAD8vLxD9L/0Q/RD9AS/9L/0v/S/9ADEwAUlouQAGADBJaGGwQFJYOBE3uQAw/8A4WSUUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgFFWD89WFc+P1goQS4tQUEtLkEbMSMiMDAiIzEoGhISGRkSEhqKPllZPj5YWD4tQUEtLkFBLiMwMCMjMDAjEhkZEhIZGQAABAAm/zoB0QEgAAsAFQAfACsAXUAkASwsQC0AHRMVDAQRECYEBiAEAB8WBBsaIwUJKQUDCRgOARpGdi83GAAvPC8v/RD9AS88/Twv/S/9Lzz9PAAuLjEwAUlouQAaACxJaGGwQFJYOBE3uQAs/8A4WSUUBiMiJjU0NjMyFgEUIyI1ETQzMhUDFCMiNRE0MzIVBTQmIyIGFRQWMzI2AdFYPz5YWD4/WP7BExQUE0QUFBQUAVtBLi1BQS0uQYo+WFg+PlhY/oYUFAGyFBT+ThQUAbIUFHYuQEAuLkBAAAQAGf86AcQBIAAJABMAHwArAF1AJAEsLEAtABEHBQQECQAPDgQTCiAEFCYEGiMFHSkFFx0MAgEaRnYvNxgALzwvL/0Q/QEv/S/9Lzz9PC88/TwALi4xMAFJaLkAGgAsSWhhsEBSWDgRN7kALP/AOFkFFCMiNRE0MzIVAxQjIjURNDMyFQcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgHEFBQUFEUUFBQUOVg/PlhYPj9YKEEuLUFBLS5BshQUAbIUFP5OFBQBshQUdj5YWD4+WFg+LkBALi5AQAAAAgAhAAEBwAFQAAkALwBcQCIBMDBAMSQsJyEdFxEMLyUkGhkVFAoJAAQFBAIfAQcCAQRGdi83GAA/Py8BLzz9PC4uLi4uLi4uAC4uLi4uLi4xMAFJaLkABAAwSWhhsEBSWDgRN7kAMP/AOFk3FCMiNRE0MzIVFxQjIjU0JiMiBh0BFCMiPQE0NjMyFzYzMhYdARQjIjU0JiMiBhdIExQUE9sUFCQYGCMUFDsoLh8fMyg6FBQjFxkjARQTEwEoFBSBExMZLSMYChMTCik6KytDKgETExktIxgAAQAa/3UAzQHGAEcAZEAoAUhIQEkDMAwuCiETBD0DRTcEJxkQBQYkBTo0BSoABRYeBUIqBgEZRnYvNxgALy8v/S/9EP0v/RD9AS88/TwvPP08Li4ALi4xMAFJaLkAGQBISWhhsEBSWDgRN7kASP/AOFk3MhYVFAYjIicmNTQzMhcWMzI2NTQmIyImNTQ2NzYzMjY1NCYjIiY1NDYzMhcWFRQjIicmIyIGFRQWMzIWFRQGBwYjIgYVFBZzJTU0JjgZAhUNBQ0fFR0dFSU0LyMDBBUdHRUlNDQlLRwEFAkHEBkUHR0UJTUvIwMFFB0dJzQlJTQzBQQUDB0eFBQdNCUjMwMBHBQUHTUlJTQmBgYUCRUdFBQeNCUjMgMBHRQUHQAAAQARAAEA1wFPADMAikBGATQ0QDUPMCkdFg8DISAaGRMSDAcLBDMtLCYlBwYHABIRAQMABQ0MBgMFLi0ZAxgFMzIUAxMsKxsDGgUnJiADHyMJAgEDRnYvNxgAPy8vFzz9FzwvFzz9FzwvFzz9FzwBLxc8/Rc8Li4uLi4uADEwAUlouQADADRJaGGwQFJYOBE3uQA0/8A4WTcjIjU0OwE1NDMyHQEzMhUUKwEVMzIVFCsBFTMyFRQrARUUIyI9ASMiNTQ7ATUjIjU0OwFgOxQUOxQUOxQUOzsUFDs7FBQ7FBQ7FBQ7OxQUO+wUFCcUFCcUFB0UFBwUFE8TE08UFBwUFAAAAgAg//QBDgESABcAKwBXQCABLCxALSooIBMSBCoXAAwLBB4HBg8FAyQFGhUJGgEGRnYvNxgALy88EP0v/QEvPDz9PC88PP08AC4uMTABSWi5AAYALEloYbBAUlg4ETe5ACz/wDhZJRQGIyImPQE0MzIdARQWMzI2PQE0MzIVBwYjIicmNTQzMhcWMzI3NjMyFRQBDUUyMUUUFC4gIS4UFAgzPDwxCRMGBiYxMicFBhS6MkVFMkQUFEQhLi4hRBQU6SEhBgoVBBobBBYKAAACAAn/8QEyARUAEwAnAEVAFgEoKEApJiENAyYcEggkHhADChcBHEZ2LzcYAC8vFzwBLi4uLgAuLi4xMAFJaLkAHAAoSWhhsEBSWDgRN7kAKP/AOFk3BwYjIi8BJjU0MzIfATc2MzIVFBcHBiMiLwEmNTQzMh8BNzYzMhUU4jIHCwoHMwMVCwYhIQYLFEyABwsKB4EDFQsGb28GCxT4Yg4NYgUFFAtBQAsTBAX5Dg35BQUUC9fWCxMEAAABAAj/8QJZARwAKwBJQBcBLCxALSolIh8cGQwGKhQoFg8JAwEURnYvNxgALzw8LzwBLi4ALi4uLi4uLjEwAUlouQAUACxJaGGwQFJYOBE3uQAs/8A4WQEDBiMiLwEHBiMiLwEHBiMiJwMmNTQzMh8BNzYzMh8BNzYzMh8BNzYzMhUUAlhjBgwLB0dIBwsKB0ZIBwsMBmMCFA0FVUQICQoIR0gICgkIQ1QFDRQBAf8AEA1/fw0Nf38NEAEABAQTDdl5DQ1+fg4OedkNEwQAAAIACv/xAf4BPwArAFcAaEAoAVhYQFkqVVJPTEk/OTMoFg8MCQYDRC4qFDw2QjAAIhwCJR8ZAQEURnYvNxgAPzw8Pzw/PC88AS4uLi4ALi4uLi4uLi4uLi4uLi4uMTABSWi5ABQAWEloYbBAUlg4ETe5AFj/wDhZAQcGIyIvAQcGIyIvAQcGIyIvASY1NDMyHwE3NjMyHwE3NjMyHwE3NjMyFRQHFhUUIyIvAQcGIyIvAQcGIyIvAQcGIyI1ND8BNjMyHwE3NjMyHwE3NjMyFwH6SAgICAhAPwcJCAc/QAgICAhHBBQJBjhACAgICD8+CAgICEA4BgkVBQQUCgY4PwgICAg+QAgICAg/OAYKEwRHCAgICD9ACAgHCD8/CAgICAETZAoKV1cKCldXCwtkBgYUCE5XCwtXVwsLV04IFAb8BgYUCUxWCwtXVwoKVkwJFAYGYwsLV1cKCldXCwsAAQAJ/4kBowE8ACwAXkAkAS0tQC4OJyQfHAwJAwAiHxoOCQUsEhEDAAQoJxcDFioUARpGdi83GAAvLwEvFzz9FzwuLi4uLi4ALi4uLi4uLi4xMAFJaLkAGgAtSWhhsEBSWDgRN7kALf/AOFk/ATYzMhUUBwYHNzYzMhUUDwEVFCMiPQEnJjU0MzIfAScmNTQzMh8BNTQzMhXqTQYJFQQmKH8EBBMNrBQUrA0UBAR9TQQVCQZNFBSibggTBgU3ODABFA0FQLkUFLlABQ0VAjBvBQYTCG6GFBQAAQAR//8BBAGLACEAYEAlASIiQCMaEyAdGhUSDwwJBAECAQUGHh0FDQwYFwMSAgcGAAEJRnYvNxgAPzw/PzwvPP08EP08AS4uLi4uLi4uLi4ALjEwAUlouQAJACJJaGGwQFJYOBE3uQAi/8A4WTcHMzIVFCsBIjU0PwEjIjU0PwEjIjU0OwEyFRQPATMyFRT7n5EUFMUXCZ+RFwmfkRMTxRcJn5EXto8UFBEKCJARCgiOFBQRCgiPEQoABwAY//8BLAIpAAsAFQAfACkANQBBAEkAjkBCAUpKQEsAJxNGPBUREAwbGgQfFkIENioEACkgBCUkMAQGJCAaFhAFDAUOOQVIRAU/LQUJAwUzCUgDHQEiGA4AAQZGdi83GAA/PDw/Py8v/RD9L/0Q/RD9FzwBL/0vPP08L/0v/S88/TwuLi4uLi4ALi4xMAFJaLkABgBKSWhhsEBSWDgRN7kASv/AOFkBFAYjIiY1NDYzMhYDFCMiPQE0MzIVBxQjIj0BNDMyFQcUIyI9ATQzMhUTNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCMiFRQzMgEsUDo6UFA6OlAxFBQUFEUTFBQTRxQUFBSVOSkpOTkpKTkcKR0dKCgdHSkoHh0dHgGfOlFROjlRUf47FBSLFBSLFBTZFBTZFBSLFBQBASk5OSkpOjopHSgoHR0oKB0dHR4AAAUABP//AUYBlwATAB0AJwAxADsAd0AyATw8QD06LyoMAjo1JiEcFw4AMSgELSwHBREVFAUZJCMFHx44NwUyMzIAGhkBEQMBDkZ2LzcYAD8/PD88EP08Lzz9PBD9PBD9AS88/TwuLi4uLi4uLgAuLi4uMTABSWi5AA4APEloYbBAUlg4ETe5ADz/wDhZARYjIicuASMiBgcGIyI3PgEzMhYHIyI1NDsBMhUUByMiNTQ7ATIVFAcUIyI9ATQzMhUTISI1NDMhMhUUARYGGQ8ECDYiIjQJBA8aBgtLMDBKOygTEygUFCgTEygUYxQUFBSy/usTEwEVFAEvGQ8gKiogDxktOzuXFBQUFEMUFBQUMxMTxRQU/usUFBQUAAkAAQGoAjwCWgALABcAIwAvADsARwBPAFcAXwCFQDsBYGBAYQAkBABYBFwYBDxMBEhQBFQ2BBIGBCowBAxCBB5FOS0FA15WTgVaUko/MycFCSEVCRsPAwEeRnYvNxgALzw8Lzw8EP08PC88PP08PBD9PDwBL/0v/S/9L/0v/S/9L/0v/S/9ADEwAUlouQAeAGBJaGGwQFJYOBE3uQBg/8A4WQEUBiMiJjU0NjMyFgcUBiMiJjU0NjMyFgcUBiMiJjU0NjMyFgU0JiMiBhUUFjMyNic0JiMiBhUUFjMyNic0JiMiBhUUFjMyNiUUIyI1NDMyBxQjIjU0MzIHFCMiNTQzMgI8MyYlNDQlJTTENCUmNDUlJTTGMyYlMzMlJTQBYx4UFB0dFBQexR0UFB4eFBQdxR4UFBwcFBQeAWwUFBQUxBQUFBTGFBMTFAIBJTQ0JSU0NCUlNDQlJTQ0JSU0NCUlNDQlFB0dFBQdHRQUHR0UFB0dFBQdHRQUHR0UExMUFBMTFBQTExQAA///Ab4A+AK3AA0AGwApAEVAFQEqKkArDCYYEQMoIRoTDAUKHwETRnYvNxgALy8BLi4uLi4uAC4uLi4xMAFJaLkAEwAqSWhhsEBSWDgRN7kAKv/AOFkTBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUFwcGIyI1ND8BNjMyFRTyVwYIFQdWBggVkEYHCBQHRgYIFDRHBgcWBkcGCBUClFYGFAgHVgYVCFZGBxQIB0YGFAhARgYWBwZGBhUIAAIAEP9qAMIAHAAXAB8AS0AaASAgQCEABg8EABgEExwMBQMIHgUaFQMBBkZ2LzcYAC8vL/08EP0BLzz9L/0uADEwAUlouQAGACBJaGGwQFJYOBE3uQAg/8A4WRcUBiMiJjU0MzIUFjMyNjU0JiI1NDMyFgcUIyI1NDMywjQlJTQUFB0UFB0dJxMlNEUUFBQUPSU0NCUTJx4eFBQdFBQ0JRQUFAAAAwAt/zkA3gJEAAsAFwBcAHtANQFdXUBeAEckRSJaThIEPjIGOCsMBFQbAA8FCQMFFUsFQTsFUTUFVxgFLy4oBR4JHkEDAQZGdi83GAA/Ly8Q/S88/S/9L/0Q/S/9EP0BLzw8/Tw8Lzw8/Tw8Li4ALi4xMAFJaLkABgBdSWhhsEBSWDgRN7kAXf/AOFkTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYDMhYVFAYjIicmNTQzMhcWMzI2NTQmKwEiJjU0NjMyNjU0JiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMhYVFAYjIgYVFBbeMyUlNDQlJTMoHBQUHh4UFBwxJTQ0JC8aBBQLBg4aFBwcFAElMzMkFB4dFCUzMyU5GAIUDAYNIBQdHRQlNDQkFB4dAewlNDQlJTMzJRQdHRQUHR3+EzQlJTQmBgYUChQdFBQdNCUlNB0UFB40JSU0MwUFEwwcHRQUHTUlJTQdFBQdAAUAEQAAArICuAANABsAKQBVAF8AcUAtAWBgQGEsPTo3NDEnIBILBF5ZQiwlHhcQCQJcWwVXVhlQSgFTTUcDQC4AAUJGdi83GAA/PD88PD88Ly88/TwBLi4uLi4uLi4uLgAuLi4uLi4uLi4uMTABSWi5AEIAYEloYbBAUlg4ETe5AGD/wDhZARYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIXARYVFCMiJwMHBiMiLwEHBiMiLwEDBiMiNTQ3EzYzMh8BNzYzMh8BNzYzMhcDISI1NDMhMhUUAacGFQgGRwYVCAYzBhUIBlYGFQgGlwYUCAZIBhQIBwGKARUOBWdMBwsMB1BSBwsLB01nBQ0VAXcFDQwHUFEHDAsHUFAHDAwGE/52ExMBihQCHAYIFQZHBggVBgcGCBQGVgYIFAbQBggVBkgGCBUH/fEDBBMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEf7aFBMTFAAFABAAAAKxArcADQAbACkAVQBfAHFALQFgYEBhLD06NzQxJh8YEQNeWUIsKCEaEwwFXFsFV1YKUEoBU01HA0AuAAFCRnYvNxgAPzw/PDw/PC8vPP08AS4uLi4uLi4uLi4ALi4uLi4uLi4uLjEwAUlouQBCAGBJaGGwQFJYOBE3uQBg/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFBMWFRQjIicDBwYjIi8BBwYjIi8BAwYjIjU0NxM2MzIfATc2MzIfATc2MzIXAyEiNTQzITIVFAIGVgYIFgdXBwgTj0YGCBUGRgYIFTNHBggVBkcGBxb0ARUNBWhMBwsMB1BSBwsLB01nBQ0VAXcGDQwHT1EHDAsHUFAHDAwGE/52ExMBihQClVYGFQgGVQYUCFdGBhUIBkYGFQg/RgYVCAZGBhYH/gkEAxMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEf7aFBMTFAAABAARAAACsgKhAAkANQBJAFwAdUAvAV1dQF4MWFVSQ0A9Nh0aFxQRWlBNRTsiDAgDBgUFAQBNSjAqATMtJwMgDgABIkZ2LzcYAD88Pzw8PzwvPC88/TwBLi4uLi4uLi4uAC4uLi4uLi4uLi4uLjEwAUlouQAiAF1JaGGwQFJYOBE3uQBd/8A4WSUhIjU0MyEyFRQXFhUUIyInAwcGIyIvAQcGIyIvAQMGIyI1NDcTNjMyHwE3NjMyHwE3NjMyFycyHwEWFRQjIi8BBwYjIjU0PwE2JzYXMRcWFRQjIi8BBwYjIjU0NwIm/nYTEwGKFHcBFQ4FZ0wHCwwHUFIHCwsHTWcFDRUBdwUNDAdQUQcMCwdQUAcMDAbYCAdWBhUIBkdJBggVBlYICA8OVwYVCAZISAYIFQZkFBMTFEoDBBMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEbQGVgYIFQZISAYVCAZWBlQPD1cGCBUGSUgGFQgGAAQAEQAAArICLQARACMATwBZAHVAMAFaWkBbJjc0MS4rWFM8Jh4SBgAcFAMFDFZVBVFQGAUhEAghSkQBTUdBAzooAAE8RnYvNxgAPzw/PDw/PC88PBD9Lzz9PC/9PDwBLi4uLi4uLi4ALi4uLi4xMAFJaLkAPABaSWhhsEBSWDgRN7kAWv/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYBFhUUIyInAwcGIyIvAQcGIyIvAQMGIyI1NDcTNjMyHwE3NjMyHwE3NjMyFwMhIjU0MyEyFRQCJDQlJTQUFB0UFB0UFM8UFB0UFB4UFDUlJTQBXAEVDQVnTQcLCwdRUQcMCwdMZwUOFQF4BgwMB1BRBwwLB1BQBwwNBRP+dhMTAYoUAhglNDQlFCgeHihZEyceHicTJjQ1/iIDBBMOAT+jDw+qqg8Po/7BDhMEAwFwEQ+qqg8PqqoPEf7aFBMTFAALABEAAAKyAlsACwAXACMATwBZAGUAcQB9AIUAjQCVAK9AUgGWlkCXJjc0MS4rPCaKBIZmBAyOBJJTBgRgWgQAggR+WBgEcmwEEngEHpCIgAWUjIRWVQVRUHVpXQUJGw8DBXtvYyEVCUpEAU1HQQM6KAABPEZ2LzcYAD88Pzw8PzwvPDwvPDz9PDwQ/Tw8Lzz9PC88PP08PAEv/S/9L/0vPP0v/S/9Lzz9L/0v/S4uAC4uLi4uMTABSWi5ADwAlkloYbBAUlg4ETe5AJb/wDhZARQGIyImNTQ2MzIWBxQGIyImNTQ2MzIWBxQGIyImNTQ2MzIWARYVFCMiJwMHBiMiLwEHBiMiLwEDBiMiNTQ3EzYzMh8BNzYzMh8BNzYzMhcDISI1NDMhMhUUEzQmIyIGFRQWMzI2JzQmIyIGFRQWMzI2JzQmIyIGFRQWMzI2JRQjIjU0MzIHFCMiNTQzMgcUIyI1NDMyAoA0JSU0NCUlNMUzJiU0NCUlNMU0JSU0NCUlNAG7ARUNBWdNBwsLB1FRBwwLB0xnBQ4VAXgGDAwHUFEHDAsHUFAHDA0FE/52ExMBihQdHRQUHR0UFB3EHhQUHR0UFR3GHRQUHR0UFB0BbRQUFBTFFBMTFMUUExMUAgIlNDQlJTQ0JSU0NCUlNDQlJTQ0JSU0NP3zAwQTDgE/ow8PqqoPD6P+wQ4TBAMBcBEPqqoPD6qqDxH+2hQTExQBnhQdHRQVHBwVFB0dFBUcHBUUHR0UFRwcFRQUExMUFBMTFBQTAAAFABAAAAKxAloACwA3AEEATQBVAHlANAFWVkBXDh8cGRYTQDskDkgEBkIEAE4EUj49BTk4RQUJAwVLUAVUCTIsATUvKQMiEAABJEZ2LzcYAD88Pzw8PzwvL/0v/RD9Lzz9PAEv/S/9L/0uLi4uAC4uLi4uMTABSWi5ACQAVkloYbBAUlg4ETe5AFb/wDhZARQGIyImNTQ2MzIWExYVFCMiJwMHBiMiLwEHBiMiLwEDBiMiNTQ3EzYzMh8BNzYzMh8BNzYzMhcDISI1NDMhMhUUAzQmIyIGFRQWMzI2JxQjIjU0MzIBujQlJTQ0JSU09gEVDQVoTAcLDAdQUgcLCwdNZwUNFQF3Bg0MB09RBwwLB1BQBwwMBhP+dhMTAYoUpx0UFB4eFBQdHRQUFBQCASU0NCUlNDT99AQDEw4BP6MPD6qqDw+j/sEOEwQDAXARD6qqDw+qqg8R/toUExMUAZ0UHR0UFB0dFRUVEwAACgAJAAADVQGcAAkAEwAdACcAMQA7AEUATwBpAHMAvEBZAXR0QHUIcG9ralZTcm1oW0Q/OjUwKyYhHBcSDQgDT0YES0oLCgUPAQAFBgUuLQUpKBoZBRUUHx4FIzg3BTMyQkEFPGMBYANZSD0DPAAkIwJmTRADDwMBW0Z2LzcYAD8XPD88Pxc8Pz8Q/TwvPP08EP08Lzz9PC88/TwvPP08EP08AS88/TwuLi4uLi4uLi4uLi4uLi4uLi4ALi4uLi4uMTABSWi5AFsAdEloYbBAUlg4ETe5AHT/wDhZJSMiNTQ7ATIVFCcjIjU0OwEyFRQXIyI1NDsBMhUUJyMiNTQ7ATIVFAcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFCUUIyI1ETQzMhUPAQYjIi8BAwYjIjU0NxM2MzIfATc2MzIVFAMjIjU0OwEyFRQDQXcTE3cUi+wUFOwUY3YTE3YUi+0TE+0UFOwUFOwUFO0TE+0UFOwUFOwU/s4TFBQTR10HCwsHTmYFDRUBdgYNDAdQSwYLFRTAExPAFOsUFBQUeRQUFBTrFBQUFKsUFBQUchQUFBRyFBQUFEAUFBQUFBMTAWQUFAnFDw+j/sEOEwQDAXASEKqfDBQF/vAUExMUAAAEACH/agNrAZcABwAVACMAaACLQD0BaWlAajpUTDwmXlZOQzoiGBYMCAQEAGcEWB0EChEEK2QFW0AaDgUuYAYFAkggFAVSKFs0MAM2Mi4DAStGdi83GAA/PDw/PC8vPP08PC/9PBD9PDwQ/QEv/S/9L/0v/S4uLi4uLi4uLi4ALi4uLjEwAUlouQArAGlJaGGwQFJYOBE3uQBp/8A4WQUUIyI1NDMyJyY1NDcmIyIGFRQWMzI3NDcmIyIGFRQWMzI3JgciJwYjIiY1NDYzMhc2MzIXNjMyFxYVFCMiJyYjIgYVFB8BFjMyNzYzMhUUBwYjIicGBxYVFAYjIiY1NDMyFBYzMjY1NAH2FBMTFKw7OygvRmRkRi/ZPCssRmNjRiwrPBs/ODVBV3t7Vz83N0BBNjVBXDwGFQgGMklGZD4CLT1KMQYIFQY/WUE1FR4YNCYlMxQUHBQVHT0UFBRdO1ZXOxhkRkZjqVU+F2NHRmMXOnklJXtWV3slJSUlQQYHFQY1Y0dPNAIkNAcVBwZBJQ4MGiIlNDQlEyceHhQxAAAKAAD//wGvAqwADQAbACkAMwA9AEcAUQBbAGUAbwCpQEwBcHBAcTInIBILBG5pZF9aVVBLRkE8NzItJR4XEAkCWFcFU1JJSAVNMC8FKyo1NAU5REMFPz5iYQVdXGxrBWYZZ2YATk0COjkDARdGdi83GAA/PD88PzwvEP08Lzz9PC88/TwQ/TwvPP08EP08Lzz9PAEuLi4uLi4uLi4uLi4uLi4uLi4uLgAuLi4uLjEwAUlouQAXAHBJaGGwQFJYOBE3uQBw/8A4WRMWFRQjIi8BJjU0MzIXBxYVFCMiLwEmNTQzMh8BFhUUIyIvASY1NDMyFwEjIjU0OwEyFRQnIyI1NDsBMhUUFyMiNTQ7ATIVFCcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRTzBhUIBkYGFQgGMwYVCAZXBhUIBpgGFQgGRwYUCAYBKHcTE3cUi+wUFOwUY3cTE3cUi+0TE+0UFOwUFOwUFO0TE+0UFOwUFOwUAg4GBxUGRgYIFQYGBggVBlcGCBUG0QYIFQZHBggVBv7OFBQUFHkUFBQU6xQUFBSrFBQUFHEUExMUcxQUFBRAFBQUFAAACgAjAAABrgKrAA0AGwApADMAPQBHAFEAWwBlAG8AqUBMAXBwQHEyJh8YEQNuaWRfWlVQS0ZBPDcyLSghGhMMBTU0BTlJSAVNMC8FKypYVwVTUkRDBT8+YmEFXVxsawVmCmdmAE5NAjo5AwFLRnYvNxgAPzw/PD88LxD9PC88/TwvPP08Lzz9PC88/TwQ/TwQ/TwBLi4uLi4uLi4uLi4uLi4uLi4uLi4ALi4uLi4xMAFJaLkASwBwSWhhsEBSWDgRN7kAcP/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUFwcGIyI1ND8BNjMyFRQTIyI1NDsBMhUUJyMiNTQ7ATIVFBcjIjU0OwEyFRQnIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQHIyI1NDsBMhUUAVFXBggVBlcGCBWQRgYIFQZGBggVM0YGCBUGRwYIFJR3ExN3FIvsExPsFGN3ExN3FIvtExPtFBTsExPsFBTtExPtFBTsExPsFAKIVgYVCAZWBhUIVkYGFQcGRwYVCEBGBhUIBkYGFQj+5xQUFBR5FBQUFOsUFBQUqxQUFBRyFBQUFHIUFBQUQBQUFBQAAAkAIwAAAa4CiwAJABMAHQAnADEAOwBFAFgAbQCpQEwBbm5AbwhnY2BXUk5LaV5USUQ/OjUwKyYhHBcSDQgDCwoFDx8eBSMGBQUBAC4tBSkoGhkFFRQ4NwUzMkJBBTxZPTwAJCMCEA8DASFGdi83GAA/PD88PzwvEP08Lzz9PC88/TwvPP08Lzz9PBD9PBD9PAEuLi4uLi4uLi4uLi4uLi4uLi4ALi4uLi4uLjEwAUlouQAhAG5JaGGwQFJYOBE3uQBu/8A4WSUjIjU0OwEyFRQnIyI1NDsBMhUUFyMiNTQ7ATIVFCcjIjU0OwEyFRQHIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQDFxYVFCMiLwEGBwYjIjU0PwE2JzIfARYVFCMiLwEGBwYjIjU0PwE2AZp3ExN3FIvsExPsFGN3ExN3FIvtExPtFBTsExPsFBTtExPtFBTsExPsFHpTBhQIBkgTNQYIFQZXEAMKBVYGFAgGSBM1BggVBlYG6xQUFBR5FBQUFOsUFBQUqxQUFBRyFBQUFHIUFBQUQBQUFBQCKVQGCBUGSBM1BhUIBlcQTwZWBggVBkgTNQYVCAZWBgAABv+4//8AswKMAA0AGwApADUAPwBLAHZAMgFMTEBNKj0nIBILBCUXEAlGBDA6QAQCKj8eNgQ7Ojo2BThDBTMtBUkZSQE4ADMDARdGdi83GAA/Pz8vEP0Q/RD9PAEvPP08PN08/RDd/S4uLi4ALi4uLi4uMTABSWi5ABcATEloYbBAUlg4ETe5AEz/wDhZExYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIfARQGIyImNTQ2MzIWAxQjIj0BNDMyFTc0JiMiBhUUFjMyNqsGFAgGRwYUCAYzBhQIBlcGFQgGmAYVCAZIBhUIBoguISEuLiEhLjsUFBQUExYREBcXEBAXAe4GCBQGRwYIFAYGBggVBlcGCBUG0QYIFQZHBggVBuAhLi4hIS4u/tYUFIsUFH4RFhYREBcXAAAGABP//wEOAosADQAbACkANQA/AEsAdEAxAUxMQE0MPSYfGBEDKBoMBUAEKj82BDshOkYEEzA6NgU4QwUzLQVJCkkBOAAzAwEwRnYvNxgAPz8/LxD9EP0Q/TwBLzz9Lzw8/Twv/S4uLi4ALi4uLi4uMTABSWi5ADAATEloYbBAUlg4ETe5AEz/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUBxQGIyImNTQ2MzIWAxQjIj0BNDMyFTc0JiMiBhUUFjMyNgEIVgYIFQZWBggVkEYGCBUGRgYIFTNGBggVBkYHCBQLLiIhLi4hIi47FBQUFBMXERAXFxAQGAJoVwYVCAZXBhUIVkcGFQgGRgYUCEBGBhUIBkUGFAjIIS4uISEuLv7WFBSLFBR+EBcWERAXFwAF//j//wDOAmsACwAXACEANgBIAHlANAFJSUBKJ0RBPjk3MCkfRjwyJwAEDB0cBCEYBgQSHBgFGgMFFQ8FCS0FIiIaABUDCQEBMkZ2LzcYAD8/Py8Q/RD9EP0Q/TwBL/0vPP08L/0uLi4uAC4uLi4uLi4uMTABSWi5ADIASUloYbBAUlg4ETe5AEn/wDhZEzQmIyIGFRQWMzI2NxQGIyImNTQ2MzIWAxQjIj0BNDMyFQMyHwEWFRQjIicmJwcGIyI1ND8BNgc2HwEWFRQjIi8BBwYjIjU0N4sXEBEXFxEQFycuICIuLiIgLjsTFBQTFAkGVgYVCAYjJUgGCBUGVgYFDw5WBhUIBkdJBggVBgEcEBcWERAXFxAhLi4hIS4u/tYUFIsUFAHNBlcGCBQGJCRIBhUIBlYGYA4OVwYIFAZISAYVCAYAAAMAIwABAiUCXwARACMARwBoQCgBSEhASUZEQT47ODAtKidGHhIGADEwBDY1GAUIHBQDBQwhEAgzATVGdi83GAAvLzw8L/08PBD9AS88/TwuLi4uLgAuLi4uLi4uLi4xMAFJaLkANQBISWhhsEBSWDgRN7kASP/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYFAwYjIi8BBwYjIi8BERQjIjURNDMyHwE3NjMyHwE3NjMyFRQB4zQlJTQUFB0UFB0UFM8UFB0UFB0UFDQlJTQBD3cGDAwGZGQGDQwGUBQUEw0GZWQHDAsHY2QFDRUCSyU0NCUUKB4eKFkTJx4eJxMlNDR9/ugPD+3tDw++/sATEwGiFg7t7RAQ7e0NFAUAAAgAHf/zAb8CuAANABsAKQA1AEEATQBZAGEAgkA6AWJiQGMqJyASCwQlHhcQCQI2BCo8BDBOBEJUBEhaBF45BTNRBUs/BS1XBUVcBWAZLWABSwIzAwEwRnYvNxgAPz8/Ly8Q/S/9EP0Q/RD9AS/9L/0v/S/9L/0uLi4uLi4ALi4uLi4xMAFJaLkAMABiSWhhsEBSWDgRN7kAYv/AOFkBFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhcBFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgE1BhQIB0cGFQgGMwYVCAZWBhMIB5gGFAgGSAYVCAYBCnpXV3p6V1d6J2RGRmRkRkZkLkg0NElJNDRIKDEjIzIyIyMxNh4eHh4CGgYIFAZGBggVBgYGCBUGVwYIFQfRBggVBkgGCBUG/p1Xe3tXV3t7V0ZkY0dGZGRGNElJNDRJSTQjMjIjIzIyIx0dHQAACAAd//MBvwK3AA0AGwApADUAQQBNAFkAYQCCQDoBYmJAYyomHxgRAyghGhMMBTYEKjwEME4EQlQESFoEXjkFM1EFSz8FLVcFRVwFYAotYAFLAjMDATBGdi83GAA/Pz8vLxD9L/0Q/RD9EP0BL/0v/S/9L/0v/S4uLi4uLgAuLi4uLjEwAUlouQAwAGJJaGGwQFJYOBE3uQBi/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFBMUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyAZRXBggVBlcGCBWQRgcIFAZGBggVM0cGBxUGRwYIFHZ6V1d6eldXeidkRkZkZEZGZC5INDRJSTQ0SCgxIyMyMiMjMTYeHh4eApRWBhUIBlYGFQhWRgcVCAZGBhQIQEYGFQgGRgYVCP61V3t7V1d7e1dGZGNHRmRkRjRJSTQ0SUk0IzIyIyMyMiMdHR0ABwAc//MBvwKWAAsAFwAjAC8ANwBMAGAAhUA8AWFhQGIAWlRLREA9XFJGOyQEGAwEABIEBioEHjAENA8FCScFIS0FGxUFA1cFTTIFNk0DNgEhAgkDAQZGdi83GAA/Pz8vLxD9EP0Q/S/9EP0Q/QEv/S/9L/0v/S/9Li4uLgAuLi4uLi4xMAFJaLkABgBhSWhhsEBSWDgRN7kAYf/AOFklFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgMXFhUUIyIvAQYHBiMiNTQ/ATYXFicyHwEWFRQjIi8BBwYjIjU0PwE2Ab97V1d6eldXeyhkRkZjY0ZGZC5INDRJSTQ0SCcyIyMyMiMjMjceHh4eDVQGFQgGSBM1BggVBlcHCgkNCgZWBhQIB0lHBggVBlYGxVd7e1dXe3tXRmRjR0ZkZEY0SUk0NElJNCMyMiMjMjIjHR0dAVJUBggVBkgTNQYVCAZXBwECWwZXBggVB0hIBhUIBlYGAAcAHP/zAb8CUwARACMALwA7AEcAUwBbAIRAOwFcXEBdJFhUMCQeEgYASAQ8TgRCNgQqGAUhHBQDBQwzBS1LBUVRBT85BSdWBVoQCCEnWgFFAi0DASpGdi83GAA/Pz8vLzw8EP0Q/S/9EP0Q/S/9PDwQ/QEv/S/9L/0uLi4uLi4uLgAxMAFJaLkAKgBcSWhhsEBSWDgRN7kAXP/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMgGtNCUlNBQUHRQUHRQU0BMUHRQUHRQUNCUlM+J7V1d6eldXeyhkRkZjY0ZGZC5INDRJSTQ0SCcyIyMyMiMjMjceHh4eAj4lNDQlFCgdHShYFCgdHSgUJTQ0/qZXe3tXV3t7V0ZkY0dGZGRGNElJNDRJSTQjMjIjIzIyIx0dHQALAB3/8wHAAyEACwAXACMALwA7AEcATwBXAGMAbwB3AKJATQF4eEB5GHRwNjAqJBIMBgA8BBhqBF5kBFhCBB5QSARUTFIFVkoFTicFCTMFFQMFLQ8FOT8FIWcFYUUFG20FW3IFdgkbdgFhAiEDAR5Gdi83GAA/Pz8vLxD9L/0Q/RD9EP0v/S/9L/0Q/S/9L/0BLzz9PC/9L/0v/S/9Li4uLi4uLi4uLgAxMAFJaLkAHgB4SWhhsEBSWDgRN7kAeP/AOFkBFAYjIiY1NDYzMhYHFAYjIiY1NDYzMhYTFAYjIiY1NDYzMhYDNCYjIgYVFBYzMjYHNCYjIgYVFBYzMjYTNCYjIgYVFBYzMjYDFCMiNTQzMgcUIyI1NDMyExQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQjIjU0MzIBSDQlJTQ0JSU0ATQkJTQ0JSQ0eXtWV3t7V1Z7oB0UFB4eFBQdAR0TFB4eFBQceWNGRmRkRkZjlRQUFBQBExQUE2lJMzRJSTQzSSgxIyMyMiMjMTcdHh4dAsklNTQmJTMz6yU0NCUlNDT+nVd7e1dXe3sBrRQcHBQUHh6yFB0dFBQdHf7WRmRjR0ZkZAJKFBQT2RQUE/6vNElJNDRJSTQjMjIjIzIyIx0dHQAGAA3/4AHZAasADQAnADUATwBdAGsAdkAxAWxsQG0MaFNMPysfEgNqY1xVSj00LR0QDAVGBDYZBCMWBSZDBTkKYVoBMgImAwFjRnYvNxgAPz8/Ly8v/RD9AS/9L/0uLi4uLi4uLi4uLi4ALi4uLi4uLi4xMAFJaLkAYwBsSWhhsEBSWDgRN7kAbP/AOFkBBwYjIjU0PwE2MzIVFAcWFRQjIicmIyIGFRQXFhUUIyInJjU0NjMyDwEGIyI1ND8BNjMyFRQXFAYjIicmNTQzMhcWMzI2NTQnJjU0MzIXFg8BBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQB034GCBUGfgYIFYgLFAQFJiZGZBICFAsGF3tXMQyCBggVBoMHBxSme1YxLgsTBQUlKEZjEgMVCwYXXH8GCBQGfgYIFcF9BggVBn0GCBUBiX4GFAgGfgYUCA8GCxQCEmNHJyYFBBMLKzNXe3WDBhUIBoIHFQhjV3sXBgsUAhJkRishBQUUCysvfgYUCAZ/BhUIbX0GFAgGfQYUCAAABgAP//MBVgKlAA0AGwApAEEAVQBpAH1ANAFqakBrVGZeUkonIBILBGhUSCUeFxAJAj08BEEqNjUEXDEwOQUtTgVEYgVYGVg/MwMBF0Z2LzcYAD88Ly8Q/S/9L/0BLzw8/TwvPP08Li4uLi4uLi4uAC4uLi4uLi4uLjEwAUlouQAXAGpJaGGwQFJYOBE3uQBq/8A4WQEWFRQjIi8BJjU0MzIXBxYVFCMiLwEmNTQzMh8BFhUUIyIvASY1NDMyHwEUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQBAQYUCAZHBhUHBjMGFAcHVgYUCAaYBxYIBkgGFAgH0lk/P1kUFEIuLkIUFAU8VFI/BxMHBjVDRDMGBxQLQ0pLQwsUBQU5Qj4+BQQTAgkGCBUGRgYIFQYGBggVB1YGCBQG0AYIFQZHBggUBuo/Wlo/RhQURi9CQy5GFBT7MzQGCRQFKikFFAlnIiMGCxUDHh4CFQsABgAl//MBaAKkAA0AGwApAEEAVQBpAH1ANQFqakBrDGZeUkomHxgRA2goIRoTDAU2NQRcSDEDMD08BFRBKjkFLU4FRGIFWApYPzMDATBGdi83GAA/PC8vEP0v/S/9AS88PP08Lxc8/TwuLi4uLi4uAC4uLi4uLi4uLjEwAUlouQAwAGpJaGGwQFJYOBE3uQBq/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQXBwYjIjU0PwE2MzIVFBcUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQBYlcGCBUGVwYIFZBGBggVBkYGBxYzRwYIFAZGBggVPlo+P1kUE0MuLkIUFAU8VFM/BxQHBjRERDMGBxMKQ0pMQwsUBQU4RD49BQQUAoJXBhUIBlYGFAhXRwYVCAZHBhYHP0YGFQgGRgYVCNM/Wlo/RhQURi5DQy5GFBT7MzQGCBUFKikFFAlnIiMGCxUDHh4CFQsABQAk//MBVwKFABMAJwA/AFMAZwB9QDUBaGhAaRJlXltYS0hFJBwQCGBWTUMSOzoEPyYoNDMELxoGAy43BSsgBRYMBQJSAj0xAwEuRnYvNxgAPzwvLxD9L/0v/QEvFzz9PC88PP08Li4uLi4ALi4uLi4uLi4uLi4xMAFJaLkALgBoSWhhsEBSWDgRN7kAaP/AOFklBiMiJyY1NDMyFxYzMjc2MzIVFCcGIyInJjU0MzIXFjMyNzYzMhUUJxQGIyImPQE0MzIdARQWMzI2PQE0MzIVAxcWFRQjIi8BBwYjIjU0PwE2MzIXFhUUIyIvAQcGIyI1ND8BNjMyFwFMQ0pLQwsUBQU4Qz49BQQUCDxUUz8HFAcGNUNEMwYHEwJaPj9ZFBRCLi5CFBSIUwcVCAZISAYIFQZXBggKWwcVCAZJSAYIFQZXCAcIBxUiIwYLFQMeHgIVC1szNAYIFQUqKQUUCa8/Wlo/RhQURi9CQy5GFBQBC1MHCBQGSEgGFQgGVga2BwgUBkhIBhUIBlYHCQAJACX/9AFZAtUACwAXAC8AQwBXAGMAbwB3AH8AokBLAYCAQIFCVExAOFZCNnhwBHx0ZFgEDAArKgQvGGpeBBIGJCMESh8eWwUJcgV2AwVhZwUVegV+DwUhJwUbPAUyUAVGCUZtLSEDAR5Gdi83GAA/PDwvLxD9L/0v/RD9L/0v/S/9L/0Q/QEvPDz9PC88/TwvPP08Lzz9PC88/TwuLi4ALi4uLjEwAUlouQAeAIBJaGGwQFJYOBE3uQCA/8A4WQEUBiMiJjU0NjMyFhUUBiMiJjU0NjMyFhcUBiMiJj0BNDMyHQEUFjMyNj0BNDMyFQcGIyInJjU0MzIXFjMyNzYzMhUUBwYjIicmNTQzMhcWMzI3NjMyFRQDNCYjIgYVFBYzMjYVNCYjIgYVFBYzMjYnFCMiNTQzMhUUIyI1NDMyARc1JSU0NCUmNDUlJTQ0JSU1P1o/P1kUFEIuL0IUFAVAUFM/BxMHBjRFQTUGBxULQUxOQQsUBQU3RUQ2BQUUah0VFB0dFBUdHRUUHR0UFR0eFBMTFBQTExQCeyU0NCUlNTTrJTQ0JSU0NLA/WVk/RhQURi5CQi5GFBT8MjQGCRQFKioFFgllIiIGCxUDHR0DFQsCXxQeHhQUHR2xFB0dFBQdHdkUFBTZFBQUAAABACX/dQEIAYsANwBzQDABODhAOSQ0MzYqIiAeCAIREAQWFTAEJAwEHBAPBRgGBQUKLSwFJxMoJwAZGAMBFUZ2LzcYAD88PzwvEP08L/08EP08AS/9L/0vPP08Li4uLi4uLgAuLjEwAUlouQAVADhJaGGwQFJYOBE3uQA4/8A4WTcyNTQmKwEiNTQzMjU0JisBERQjIjURNDsBMhYVFAcWFRQHFhUUBisBIjU0OwEyNjU0JisBIjU0fUwdFRkTEzMXDz8TFBRSIS0UKx42OislExMlGSQkGSYTsicSFhQUHQwR/iYUFAHuFCkcFRQWLhsWGTYlNBQUHBUVHRQTAAcAEP/0AbsCQQANABsAKQAzAD0ASQBVAHVAMAFWVkBXKjs2MSwnIBILBCUeFxAJAi8uBDMqOTgEPTRKBD5QBERHBU1TBUEZQQFERnYvNxgALy8Q/S/9AS/9L/0vPP08Lzz9PC4uLi4uLgAuLi4uLi4uLi4xMAFJaLkARABWSWhhsEBSWDgRN7kAVv/AOFkBFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhcBFCMiPQE0MzIVBxQjIj0BNDMyFQcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgEnBhQIBkYGFAgGMwYVCAZWBhUIBpcGFAgHRwYVCAYBExMUFBNFFBQUFDlZPj5YWT0+WShBLi1BQS0uQQGkBggVBkcGCBQGBgYIFQZXBggVBtEGCBQGRgYIFQb+YxMT7RQU7RMT7RQUdj5ZWT4+WFg+LUFBLS5BQQAABwAU//QBvwJBAA0AGwApADMAPQBJAFUAdUAwAVZWQFcqOzYxLCYfGBEDKCEaEwwFLy4EMyo5OAQ9NEoEPlAEREcFTVMFQQpBAURGdi83GAAvLxD9L/0BL/0v/S88/TwvPP08Li4uLi4uAC4uLi4uLi4uLjEwAUlouQBEAFZJaGGwQFJYOBE3uQBW/8A4WQEHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQnBwYjIjU0PwE2MzIVFBMUIyI9ATQzMhUHFCMiPQE0MzIVBxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2AU9WBggUBlYGCBRVRwYHFgZHBggVQUYGCBQGRgYIFPQTFBQTRRQUFBQ5WT4+WFk9PlkoQS4tQUEtLkECHlcGFAgHVwYVCJBGBhYHBkYGFQg0RwYVCAZGBhQI/kATE+0UFO0TE+0UFHY+WVk+PlhYPi1BQS0uQUEABgAS//QBvgIpAAsAFwAhACsAQABUAH9ANQFVVUBWIlBNSkNBPDk2KSQfGlJIREM+NDAnJgQrIh0cBCEYAAQMBgQSAwUVCQUPMCwPARJGdi83GAAvLzwQ/S/9AS/9L/0vPP08Lzz9PC4uLi4uLi4ALi4uLi4uLi4uLi4uMTABSWi5ABIAVUloYbBAUlg4ETe5AFX/wDhZJTQmIyIGFRQWMzI2NxQGIyImNTQ2MzIWFxQjIj0BNDMyFRcUIyI9ATQzMhUBNhcmFRYXFhUUIyIvAQcGIyI1NDcXNhcVFhcWFRQjIi8BBwYjIjU0NwEXQS0uQUEuLUEoWD4+WVk+Plg6FBQUFEUUFBQU/twPDgEDVAYUCAdHSQcIEwZWDw4DVAYUCAdISQcIEwaLLUFBLS5BQS4+WVk+PlhYtRMT7RQU7RMT7RQUARkPDwEBAVYGCBUHSEcGFAgGBA8PAQFUBggUBkdHBhQIBgAABgAR//QBuwG1ABEAGwAtADcAQwBPAHxANQFQUEBRADUwGRQoHAYXFgQbEgBEBDgzMgQ3Lj4ESiIFCCYeAwUMRwVBTQU7KxAIOwwDAT5Gdi83GAA/Ly88PBD9L/0Q/Tw8EP0BL/0vPP08L/0vPDz9PC4uLgAuLi4uMTABSWi5AD4AUEloYbBAUlg4ETe5AFD/wDhZARQGIyImNTQzMhQWMzI2NDMyERQjIj0BNDMyFScUIyI0JiMiBhQjIjU0NjMyFhMUIyI9ATQzMhUHFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYBuzQlJTQUFB0UFB4UExMUFBPPExQeFBQdFBQ0JSU0ihQUFBQ5WD4+WFg+PlgoQC4uQEAuLkABoSU0NCUUKB0dKP5fExPtFBRbEycdHScTJTQ0/pMTE+0UFHY+WVk+PlhYPi1BQS0uQUEAAAgAEf/0AbwClAALABUAIQArADcAQwBPAFsAhUA7AVxcQF0MKSQTDhEQBBUMJyYEKyJQBCwWAAREOEo+BBwGVgQyAwVBOwUJRwUfGQVNNQVTWQUvCS8BMkZ2LzcYAC8vEP0v/S/9L/0Q/S/9AS/9Lzz9PC88/Twv/S88/TwvPP08AC4uLi4xMAFJaLkAMgBcSWhhsEBSWDgRN7kAXP/AOFkTFAYjIiY1NDYzMhYTFCMiPQE0MzIVJxQGIyImNTQ2MzIWExQjIj0BNDMyFQcUBiMiJjU0NjMyFgM0JiMiBhUUFjMyNhU0JiMiBhUUFjMyNhc0JiMiBhUUFjMyNvcvISEuLiEhL8UUFBQUxS4iIS4uISIugBQUFBQ5WT4+WFg+PllvFxEQFxcQEBgYEBAXFxARF0dBLi1BQS0uQQJEIC4uICEvL/2vExPtFBSLIi4uIiAvLv5nExPtFBR2PllZPj5YWAF7ERcYEBAXF6gQFxcQERcX8C1BQS0uQUEABgAS//QBvQHbAAkAFQAfACsANwBDAHNAMQFEREBFAB0YBwI4BCA+BCYFBAQJABsaBB8WCgQsMgQQLwUTDQU1OwUpQQUjEyMBJkZ2LzcYAC8vEP0v/S/9EP0BL/0v/S88/TwvPP08L/0v/QAuLi4uMTABSWi5ACYAREloYbBAUlg4ETe5AET/wDhZJRQjIj0BNDMyFScUBiMiJjU0NjMyFhMUIyI9ATQzMhUHFAYjIiY1NDYzMhYnNCYjIgYVFBYzMjYXNCYjIgYVFBYzMjYBvRQUFBTFLiIhLi4hIi6AFBQUFDpYPj5YWD4+WG4YEBAXFhERF0dBLi5BQS4uQRQTE+0UFIsiLi4iIC8u/mcTE+0UFHY+WVk+PlhYwxAXFxARFxfwLUFBLS5BQQAABQAV//MDDQEgAAkAEwAzAD0AXQCEQDgBXl5AXwhaTDs2MCJcSjIgEg0IAykEGT00BDk4UwRDAQAFBgVQJgUcEA8FCwosVgVARhwWQAFDRnYvNxgALzwvPBD9PC88/TwQ/TwvPP08AS/9Lzz9PC/9Li4uLi4uLi4ALi4uLi4uMTABSWi5AEMAXkloYbBAUlg4ETe5AF7/wDhZJSEiNTQzITIVFAchIjU0MyEyFRQHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAUUIyI9ATQzMhUHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAL5/tcTEwEpFBT+1xMTASkUkytDP1hYPzgpBxQGBh8pLkFBLjAhBggU/tkUFBQUSyo4PlhYPjooBxUHBh0qLkBALiodBggUnhQTExRFFBQUFDUwWD4+WCQGCRQFGkAuLkAjBhQHFhMT7BQU6CVZPj5YJAcIFgYbQS0uQRsGFQkAAAQAFf9qArgBSAAHAE0AWwBpAIpAPAFqakBrHDQsHhYSCGZcWlBOPjYuJRxHBDgEBABVBGhhBA1ABgUCRAU7XlIiBRBkWCgFCjI7GBQQAgENRnYvNxgAPzw8Ly88/Tw8EP08PBD9L/08AS/9L/0v/S/9Li4uLi4uLi4uLgAuLi4uLi4xMAFJaLkADQBqSWhhsEBSWDgRN7kAav/AOFkFFCMiNTQzMicGIyImNTQ2MzIXNjMyFzYzMhcWFRQjIicmIyIGFRQWMzI3NjMyFRQHBiMiJwYHFhUUBiMiJjU0MzIUFjMyNjU0JiMiJyY3NDcmIyIGFRQWMzI3JicmIyIGFRQWMzI3JjU0AZAUFBQUcio0R2RkRzQoKTY1KCk2RjUGFAgGJzg2TU02OCcGCBQGNkUzLA8OGjQlJTQUEx4UFB0dFAUCMEctGiQ2TEw2IxstjxsiNk1NNiIbLD0UFBM6HGRGRmQdHR0dNQYIEwYoTTU2TSkGFAcGNh0KBRokJTQzJhMnHh4UFBwBAqhCMBBNNTZMDzC1EE01NkwPMUJBAAYAFv/zAa4CQQANABsAKQAzAD0AXQB4QDEBXl5AXzJaTCcgEgsEXEo8NzItJR4XEAkCUwRDMC8FKypGBVA6OQU1NFYFQBlAAUNGdi83GAAvLxD9Lzz9PC/9Lzz9PAEv/S4uLi4uLi4uLi4uLgAuLi4uLi4uMTABSWi5AEMAXkloYbBAUlg4ETe5AF7/wDhZARYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIXEyEiNTQzITIVFAchIjU0MyEyFRQHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAEsBhQIB0YGFAgHMwYVCAZWBhQIBpgHFAgHSAcWCAbt/tgTEwEoFBT+2BMTASgUkyxCPllZPjkpBxQHBiImLkFBLjAhBggUAaQGCBUHRgYIFQcFBggVBlYGCBUG0QcIEwZGBggVBv7tFBMTFEYUFBQUNDFZPj5YJAYJFQUbQS0uQSQGFAcAAAYAFf/zAa0CPwANABsAKQAzAD0AXQB4QDEBXl5AXzJaTCYfGBEDXEo8NzItKCEaEwwFUwRDMC8FKypGBVA6OQU1NFYFQApAAUNGdi83GAAvLxD9Lzz9PC/9Lzz9PAEv/S4uLi4uLi4uLi4uLgAuLi4uLi4uMTABSWi5AEMAXkloYbBAUlg4ETe5AF7/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUFyEiNTQzITIVFAchIjU0MyEyFRQHBiMiJjU0NjMyFxYVFCMiJyYjIgYVFBYzMjc2MzIVFAFSVwYIFQZXBggVkEYGCBUGRgYHFjNHBggUBkcGBxWS/tgTEwEoFBT+2BMTASgUkyxCPllZPjooBxQHBiEnLkFBLi8iBggUAh1XBhQIBlcGFAhXRwYVCAZHBhYHP0YGFAgGRwYVCPsUExMURhQUFBQ0MVk+PlgkBgkVBRtBLS5BJAYUBwAFABX/8wGtAh8AHwApADMARwBZAHpAMgFaWkBbKFlXUk9MPzw5HA5USkE3Mi0oIx4MFQQFMC8FKyoSBQgmJQUhIBgFAkYCAQVGdi83GAAvLxD9Lzz9PC/9Lzz9PAEv/S4uLi4uLi4uLi4ALi4uLi4uLi4uLjEwAUlouQAFAFpJaGGwQFJYOBE3uQBa/8A4WSUGIyImNTQ2MzIXFhUUIyInJiMiBhUUFjMyNzYzMhUUNyEiNTQzITIVFCchIjU0MyEyFRQDFxYVFCMiLwEHBiMiNTQ/ATYzMhcWFRQjIi8BBwYjIjU0PwE2FwEaLEI+WVk+OigHFAcGIScuQUEuLyIGCBR6/tgTEwEoFBT+2BMTASgU8FMGFAgGSEgGCBUGVwYIClsGFQgGSEgGCBUGVxEMJDFZPj5YJAYJFQUbQS0uQSQGFAcuFBQUFEYUExMUAXhTBggVBkhIBhUIBlYGtgYIFQZISAYVCAZWEBAABv+2/7oAsgJGAA0AGwApADUAPwBLAGZAKAFMTEBNKj0nIBILBCUXEAlABAIqOzoEPzYeRgQwQwUzSQUtGTgBF0Z2LzcYAC8vL/0v/QEv/S88PP08Lzz9Li4uLgAuLi4uLi4xMAFJaLkAFwBMSWhhsEBSWDgRN7kATP/AOFkTFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMh8BFAYjIiY1NDYzMhYDFCMiPQE0MzIVNzQmIyIGFRQWMzI2qgYVCAZHBhUIBjMGFQgGVwYUCAeYBhUIBkcGFAgGiS4hIi4uIiEuOxQUFBQTFxARFxcREBcBqQYIFQZHBggVBgYGCBUGVwYIFAbQBggVBkcGCBUG4CEuLiEhLi7+1hQUixQUfhAXFxARFhcAAAYAFP+6AQ4CRQANABsAKQA1AD8ASwBmQCgBTExATQw9Jh8YEQMoGgwFQAQqPzYEOyE6RgQTMEMFM0kFLQo4ATBGdi83GAAvLy/9L/0BLzz9Lzw8/Twv/S4uLi4ALi4uLi4uMTABSWi5ADAATEloYbBAUlg4ETe5AEz/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUBxQGIyImNTQ2MzIWAxQjIj0BNDMyFTc0JiMiBhUUFjMyNgEIVgYIFAZWBggUj0YGCBUGRgYIFTNGBggVBkYGCBUMLiAiLi4iIC47ExQUExQXEBEXFxEQFwIiVgYVCAZWBhUIVUcGFAgGRwYVB0FFBhUIBkUGFQjHIS4uISEuLv7WFBSLFBR+EBcXEBEWFwAF//j/ugDNAiYACwAXACEANgBJAGtAKwFKSkBLJ0hGQT47MCkfQzkyJwAEDCEYBB0cBgQSAwUVCQUPLQUiIhoBMkZ2LzcYAC8vEP0v/S/9AS/9Lzz9PC/9Li4uLgAuLi4uLi4uLjEwAUlouQAyAEpJaGGwQFJYOBE3uQBK/8A4WTc0JiMiBhUUFjMyNjcUBiMiJjU0NjMyFgMUIyI9ATQzMhUDMh8BFhUUIyInJicHBiMiNTQ/ATYXFhUUIyIvAQcGIyI1ND8BNhcWihcQERcXERAXKC4hIi4uIiEuOxQUFBQVCQZWBhUIBiMlSAYIFAZWBW4GFQgGR0kGCBQGVg0OEtcQFxcQERYXECEuLiEhLi7+1hQUixQUAc0GVwYIFQYlJEgGFQgGVga3BggVBklIBhUIBlYNDREAAAYAHQABAcEBwgARABsAJQAvAEEAZwCcQEYBaGhAaV5gWVFFKCMZNjAMAGIEXhcWBBsSSEcEQ0IlHAQhIE9OBFRTLyYEKyplSwVbVwYFDwoCMwU8QDgPHhQ8Ay0CASpGdi83GAA/Py88Lzw8EP08PBD9Lzz9PAEvPP08Lzz9PC88/TwvPP08Lzz9PC/9Li4uLgAuLi4uLi4uMTABSWi5ACoAaEloYbBAUlg4ETe5AGj/wDhZExQjIjQmIyIGFCMiNTQ2MzIWExQjIj0BNDMyFQcUIyI9ATQzMhUHFCMiPQE0MzIVJRQGIyImNTQzMhQWMzI2NDMyBxUUIyI9ATQmIyIGHQEUIyI9ATQ2MzIXNjMyFhUUIyI1NCYjIgbmFBQeFBUdFBQ1JSU1jBQUFBSgFBQUFI0UFBQUAXI0JSU1FBQdFRQeFBOXExUkFhkjFBQ7KS4gGzcoOxQUJBcZJQFoEygdHSgTJjQ1/ocTE58UFJ8TE58UFBMTE58UFG8mNDUlFCkdHSn5DBMTChcmJBgLExMLKToqKkQqExMaLSMAAAcAAv/zAUQCVQANABsAKQA1AEEATQBZAHJAMAFaWkBbKicgEgsEJR4XCQI2BCpOBEIQVARIPAQwMwU5UQVLVwVFPwUtGS1LAQEXRnYvNxgAPy8vEP0v/RD9L/0BL/0v/Twv/S/9Li4uLi4ALi4uLi4xMAFJaLkAFwBaSWhhsEBSWDgRN7kAWv/AOFkTFhUUIyIvASY1NDMyFwcWFRQjIi8BJjU0MzIfARYVFCMiLwEmNTQzMhcTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjb1BhQIBkcGFAgGMwYUCAZXBhUIBpgGFAgHSAYVCAbPWD4+WFg+PlgoQC4uQEAuLkAbMCMjMDAjIzAoGhESGRkSERoBtwYIFAZHBggUBgYHCBQGVwYIFQbRBggUBkYGCBUG/sU+WVk+PlhYPi1BQS0uQUEuIjEwIyMwMCMSGRkSEhkZAAcAGf/zAVsCVAANABsAKQA1AEEATQBZAHJAMAFaWkBbDCYfGBEDKCEaEwxUBEg8BDA2BCoFTgRCMwU5UQVLVwVFPwUtCi1LAQEwRnYvNxgAPy8vEP0v/RD9L/0BL/08L/0v/S/9Li4uLi4ALi4uLi4xMAFJaLkAMABaSWhhsEBSWDgRN7kAWv/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUFwcGIyI1ND8BNjMyFRQTFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYBVVcHCBQGVwYIFZBGBgcWBkYGCBUzRwYIFAZHBggUO1g/PVhXPj9YKEEuLUFBLS5BGzEjIjAwIiMxKBoSEhkZEhIaAjFWBhQIBlcGFQhWRwYWBwZHBhUIP0YGFAgGRgYUCP7cPllZPj5YWD4tQUEtLkFBLiMwMCMjMDAjEhkZEhIZGQAABgAX//MBQwI0AAsAFwAjAC8ARABZAHJAMAFaWkBbAFFNSkM8ODVTSD4zJAQYDAQAKgQeEgQGCQUPJwUhLQUbFQUDWAMhAQEGRnYvNxgAPy8vEP0v/RD9L/0BL/0v/S/9L/0uLi4uAC4uLi4uLi4xMAFJaLkABgBaSWhhsEBSWDgRN7kAWv/AOFklFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYDFxYVFCMiLwEGBwYjIjU0PwE2MzI3FxYVFCMiLwEGBwYjIjU0PwE2MzIBQ1g+PlhYPj5YKEAuLkBALi5AGzAjIjExIiMwJxoSEhkZEhIaG1QGFQgGRxQ1BggVBlcHCAoGVAYVCAZHFDUGCBUGVwYIC4o+WVk+PlhYPi1BQS0uQUEuIjExIiMwMCMSGRkSEhkZAVlUBggUBkcTNAYUCAZXB1BUBggUBkcTNAYUCAZXBgAG/+7/8wFwAbQAEQAjAC8AOwBHAFMAeEA0AVRUQFUASDweEgYAMAQkTgRCNgQqGAUIHBQDBQwzBS1LBUVRBT85BSchEAgnRQEMAwEeRnYvNxgAPz8vLzw8EP0v/RD9L/0Q/Tw8EP0BL/0v/S/9Li4uLi4uADEwAUlouQAeAFRJaGGwQFJYOBE3uQBU/8A4WQEUBiMiJjU0MzIUFjMyNjQzMgcUIyI0JiMiBhQjIjU0NjMyFhcUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNgFwNCUlNRQUHhQUHRQUzxQUHRQUHhQUNSUlNKNYPj9YWD8+WChBLS5BQS4tQRwwIiMxMSMiMCcaERIaGhIRGgGgJTQ0JRQoHR0oWRMnHR0nEyU0NPY+WVk+PlhYPi1BQS0uQUEuIzAwIyMwMCMSGRkSEhkZAAgAGf/zAUYCjwALABcAIwAvADsARwBTAF8Ag0A7AWBgQGEYVEg2KhIGPAQYMCQEDABaBE5CBB4nBQkDBS0zBRUPBTkhBT9XBVFdBUtFBRsJG1EBOQIBHkZ2LzcYAD8/Ly8Q/S/9EP0v/RD9L/0v/RD9AS/9L/0vPP08L/0uLi4uLi4AMTABSWi5AB4AYEloYbBAUlg4ETe5AGD/wDhZExQGIyImNTQ2MzIWFRQGIyImNTQ2MzIWExQGIyImNTQ2MzIWAzQmIyIGFRQWMzI2FTQmIyIGFRQWMzI2FzQmIyIGFRQWMzI2JxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2/y4hIi4uIiEuLiEhLy8hIS5HWD8+WFg+P1hvFxARFxcREBcXEBAYGBAQF0dBLi1BQS0uQRsxIyIxMSIjMSgaEhIZGRISGgJAIS4uISEuLtohLy8hIS4u/uI+WVk+PlhYAXgQFxcQEBcXqRAXFxAQGBjtLUFBLS5BQS4iMTEiIzAxIhIZGRISGRkABgAN/+YBVgEvAA0AGwAzAEEAWQBnAHJALgFoaEBpDGRWSz43KyARA2ZfVElAOSkeGhMMBVEEQiYELyMFMk4FRQpdGAEBX0Z2LzcYAD8vLy/9L/0BL/0v/S4uLi4uLi4uLi4uLgAuLi4uLi4uLi4xMAFJaLkAXwBoSWhhsEBSWDgRN7kAaP/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUNxYVFCMiJiMiBhUUFhUUIyInJjU0NjMyFwcGIyI1ND8BNjMyFRQ3FAYjIicmNTQzMhYzMjY1NCY1NDMyFxYPAQYjIjU0PwE2MzIVFAFQVwcIFAdWBggVkEYGCBQGRgYIFBQNEwYaCC5BBhQOBQdZPh4wRgcIFAZGBwgUQlg+GhQPEwccBy1BBhQOBQfBVwYIFQZXBggVAQxWBxQIB1cGFQhWRgYTCAdHBhUIWAUOFAVALQccBxMPFBo9WJ5FBxUIBkUGFAgDP1gHBQ4UBkEuBxsHEw8UYlYGFQgGVgYVCAAABf/p//QBDgIzAA0AGwApAEEAVQBvQCwBVlZAV1RSSj8zJyASCwQlHhcQCQI9PARUQSo2NQRIMTA5BS1OBUQZRAEXRnYvNxgALy8Q/S/9AS88PP08Lzw8/TwuLi4uLi4ALi4uLi4uLi4uMTABSWi5ABcAVkloYbBAUlg4ETe5AFb/wDhZExYVFCMiLwEmNTQzMhcHFhUUIyIvASY1NDMyHwEWFRQjIi8BJjU0MzIfARQGIyImPQE0MzIdARQWMzI2PQE0MzIVBwYjIicmNTQzMhcWMzI3NjMyFRTcBhYHBkYGFQgGNAYVCAZWBhUIBpcGFAgGSAYVCAawRDIyRRQULyAgLxQTCDM7PTEJFAYFJTMyJgUGFQGWBgcWBkcGCBUGBgYIFQZWBggVBtEGCBUGRwYIFQbpMkVFMkQUFEQhLi4hRBQU6SEhBgoVBBobBBYKAAAFACD/9AFAAjMADQAbACkAQQBVAG9ALAFWVkBXDFJKPzMmHxgRAzY1KBoTDAU9PARUQSohBEgxMDkFLU4FRApEATBGdi83GAAvLxD9L/0BLzw8/S88PP08Li4uLi4uLgAuLi4uLi4uLi4xMAFJaLkAMABWSWhhsEBSWDgRN7kAVv/AOFkBBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUJwcGIyI1ND8BNjMyFRQTFAYjIiY9ATQzMh0BFBYzMjY9ATQzMhUHBiMiJyY1NDMyFxYzMjc2MzIVFAE6VQYIFQZWBggUVkYGCBUGRgYIFT9GBggVBkYGCBVWRTIxRRQULiAhLhQUCDM8PDEJEwYGJjEyJwUGFAIQVwcWCAZXBhQIkUYGFQgGRgYVCDNGBhQIBkcGFQj+9TJFRTJEFBREIS4uIUQUFOkhIQYKFQQaGwQWCgAABAAe//QBDQIaABcAKwA9AFEAd0AwAVJSQFMqTUpHPTs2MzAoIBUJT0VBQDguExIEKhcADAsEHgcGDwUDJAUaQD4aAQZGdi83GAAvLzwQ/S/9AS88PP08Lzw8/TwuLi4uLi4ALi4uLi4uLi4uLi4uMTABSWi5AAYAUkloYbBAUlg4ETe5AFL/wDhZJRQGIyImPQE0MzIdARQWMzI2PQE0MzIVBwYjIicmNTQzMhcWMzI3NjMyFRQDFhUUIyIvAQcGIyI1ND8BNhcnNhcVFhcWFRQjIi8BBwYjIjU0NwEMRTIxRhQULyAhLhQUCDM8PTEJFAYFJTMxJwYGFBQGFAgGSUgGCBQGVg4OHA4OBlEGFAgGSUgGCBUGujJFRTJEFBREIS4uIUQUFOkhIQYKFQQaGwQWCgFABggVBklIBhUIBlYODloODgEFUQYIFQZJSAYVCAYAAAYAH//0AQ4CXgALABcALwBDAE8AWwCGQDsBXFxAXUJAOC0hKyokI0IvGAQAUEQEDABWSgQGEgYENh8eUwUVRwUJAwVNWQUPJwUbPAUyCTIVAwEeRnYvNxgAPy8vEP0v/S/9L/0Q/RD9AS88PP08EP08Lzz9PBD9PDwuLi4uAC4uLi4xMAFJaLkAHgBcSWhhsEBSWDgRN7kAXP/AOFkTFAYjIiY1NDYzMhYVFAYjIiY1NDYzMhYXFAYjIiY9ATQzMh0BFBYzMjY9ATQzMhUHBiMiJyY1NDMyFxYzMjc2MzIVFAM0JiMiBhUUFjMyNhU0JiMiBhUUFjMyNuUvICEuLiEhLi8gIS4uISAvJ0QyMkUUFC8gIC8UEwgzOz0xCRQGBSUzMiYFBhVRFxARFhcQEBcXEBAXFxAQFwIOIS4uISIuLtohLy8hIC4uvDJFRTJEFBREIS4uIUQUFOkhIQYKFQQaGwQWCgHzERcXERAXF6gQFxcQERcYAAAMABn/2gNLAX0ACQATAB0AJwAxADsARQBRAF0AaQB1AH0AvkBZAX5+QH8IfHhVQkE9PDg3MzIkIx8eRD86NTArJiEcFxINCANGBFJYBExeBGpwBGR2BHoBAAUFbQVnCwoFDxoZBRUUcwVhWwVJLi0FKShJTwMQDwMGBQEBTEZ2LzcYAD88Pzw/Ly88/TwQ/S/9Lzz9PBD9PC/9EP08AS/9L/0v/S/9L/0uLi4uLi4uLi4uLi4uLgAuLi4uLi4uLi4uLi4uLi4xMAFJaLkATAB+SWhhsEBSWDgRN7kAfv/AOFklIyI1NDsBMhUUJyEiNTQzITIVFBcjIjU0OwEyFRQnIyI1NDsBMhUUByMiNTQ7ATIVFAcjIjU0OwEyFRQHISI1NDMhMhUUJRQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQjIjU0MzIDN3YUFHYUiv7yFBQBDhRidhMTdhSK5BMT5BQUyxMTyxQU5BMT5BQU/vMTEwENFP7meldXenpXV3onZEZGZGRGRmQuSDQ0SUk0NEgoMSMjMjIjIzE2Hh4eHtEUExMUeBQUFBTrFBQUFKwUFBQUcxQUFBRyFBQUFD8UFBQUxVZ7e1ZXe3tXRmRjR0ZjY0YzSUkzNElJNCMyMiMjMTIjHR0dAAYAEv/zAq4BIAALABcAIwAtADcAXwB+QDQBYGBAYSxYVE5KQjg0My8uGwkDWlFIPTYxLCcGAAwEGB4EEiUkBSopIQUPREBeOhUBAT1Gdi83GAA/LzwvPC/9Lzz9PAEv/S/9Li4uLi4uLi4uLgAuLi4uLi4uLi4uLi4uMTABSWi5AD0AYEloYbBAUlg4ETe5AGD/wDhZJTQmIyIGFRQWMzI2JxQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JSEiNTQzITIVFAchIjU0MyEyFRQFBiMiJjU0NjMyFzYzMhcWFRQjIicmIyIGFRQWMzI3NjMyFRQHBiMiARdBLi5BQS4uQRwwIyMxMSMjMCgZEhIaGhISGQHH/tcTEwEpFBT+1xMTASkU/n0uVT9XVz9WLSpYOicHFAYGIScuQUEuMCAGCRUGLEJYii1BQS0uQUEuIjExIiIxMCMSGRkSEhkZJRQUFBRFFBQUFBlMWD8+WExLIwcIFQUbQS0uQSMHFQcGMAADAAr/2AD+AtoALQA/AFEAhUA3AVJSQFMgUUc9ODEuAkxCOzMsKSYjIBsYFRIPDAkEARkYBR4dJCMFExIqKQUNDERKBwYBAAEJRnYvNxgAPy88LzwvPP08Lzz9PC88/TwBLi4uLi4uLi4uLi4uLi4uLi4uAC4uLi4uLi4xMAFJaLkACQBSSWhhsEBSWDgRN7kAUv/AOFk3BzMyFRQrASI1ND8BIyI1ND8BIyI1ND8BIyI1NDsBMhUUDwEzMhUUDwEzMhUUAzc2MzIVFA8BBi8BJjU0MzIXJyY1NDMyHwE3NjMyFRQPAQYn9JmNFBTHFwqZjBcKmo0XCpmMFBTGFwqZjBcKmo0XekkGCBQGVg8OVgYVCAYdBhUIBkhIBggUBlUPDnp6FBQSCgh6EgoIehIKCHoUFBIKCHoSCgh6EgoBsEgGFQgGVg8OVwYIFQY8BggVBkhJBhUIBlYPDgADAAr//wD+AosAIQA1AEoAeUAyAUtLQEwaMywlIhNGPDEnIB0aFRIPDAkEAR4dBQ0MAgEFBkEFNjpIGBcDEgIHBgABCUZ2LzcYAD88Pz88Lzwv/RD9PC88/TwBLi4uLi4uLi4uLi4uLi4ALi4uLi4xMAFJaLkACQBLSWhhsEBSWDgRN7kAS//AOFk3BzMyFRQrASI1ND8BIyI1ND8BIyI1NDsBMhUUDwEzMhUUAzc2MzIVFA8BBiMiLwEmNTQzMhc3Njc2MzIVFA8BBiMiLwEmNTQzMhf0npEUFMYXCp6RFwqekRMTxhcKnpEXekkGCBUHVgYIBwhWBhUIBkcUNQYIFQdVBwcJBlcGFQgGto8UFBEJCZARCQmOFBQRCQmPEQkBI0gGFAgHVgYGVgYIFgcSFDQGFAgHVQgHVgYIFgcAAAIABwG/ANwCoAATACYASUAXAScnQCgFIh8cCgAkGhcPBRcUDQcBD0Z2LzcYAC88LzwBLi4uLi4ALi4uLi4xMAFJaLkADwAnSWhhsEBSWDgRN7kAJ//AOFkTMh8BFhUUIyIvAQcGIyI1ND8BNic2FzEXFhUUIyIvAQcGIyI1NDdxCAdWBhQIBkhJBggUBlYICA4OVwYUCAZJSAYIFAYCPgZWBggVBkhIBhUIBlYGVA4OVwYIFQZJSAYVCAYAAgADAfkA2QLbABEAIwBFQBUBJCRAJQUcFA8DACEXDQUZHwoBF0Z2LzcYAC8vPAEuLi4uAC4uLi4uMTABSWi5ABcAJEloYbBAUlg4ETe5ACT/wDhZEzc2MzIVFA8BBi8BJjU0MzIfAQYvASY1NDMyHwE3NjMyFRQHbkgGCBUGVg8OVgYUCAZXDw5WBxUIBklHBggVBgIzSAYVCAZWDw5XBwgUBhkPDlYHCBQGSEkGFQgGAAEABQG/APIB5gAJADlADwEKCkALCAgDBgUBAAEDRnYvNxgALzwvPAEuLgAxMAFJaLkAAwAKSWhhsEBSWDgRN7kACv/AOFkTIyI1NDsBMhUU3sYTE8YUAb8UExMUAAABAAUBqAC3AhUAEQA8QBEBEhJAEwAGAAwFAxAIAwEGRnYvNxgALy88EP0BLi4AMTABSWi5AAYAEkloYbBAUlg4ETe5ABL/wDhZExQGIyImNTQzMhQWMzI2NDMytzQlJTQUFB0UFB0UFAIBJTQ0JRQoHR0oAAEADQHaAFwCKQALADZADgEMDEANAAAEBgkDAQZGdi83GAAvLwEv/QAxMAFJaLkABgAMSWhhsEBSWDgRN7kADP/AOFkTFAYjIiY1NDYzMhZcFxARFxcREBcCARAXFxARFxcAAwAPAagAwQJaAAsAFwAfAE9AHQEgIEAhAAwEABgEHBIEBhUFAx4FGg8FCQkDAQZGdi83GAAvLxD9L/0Q/QEv/S/9L/0AMTABSWi5AAYAIEloYbBAUlg4ETe5ACD/wDhZExQGIyImNTQ2MzIWBzQmIyIGFRQWMzI2JxQjIjU0MzLBNCUlNDQlJTQnHhQUHR0UFB4eFBQUFAIBJTQ0JSU0NCUUHR0UFB0dFRUVEwAAAgAV/2oAxwAcAAcAHwBLQBoBICBAIQgIFwQOEwAEBBoFCx4GBQIRCwEORnYvNxgALy8v/TwQ/QEv/Twv/S4AMTABSWi5AA4AIEloYbBAUlg4ETe5ACD/wDhZFxQjIjU0MzIXFAYjIiY1NDYzMhUUIgYVFBYzMjY0MzKCFBQUFEU0JSU0NCUUKB0dFBQdFBQ9FBQUFCU0NCUlNBQUHRQUHh4nAAACAAYBvwGIAi0AEQAjAEtAGQEkJEAlAB4SBgAMBQMYBSEQCCEcFAMBHkZ2LzcYAC88PC88PBD9EP0BLi4uLgAxMAFJaLkAHgAkSWhhsEBSWDgRN7kAJP/AOFkBFAYjIiY1NDMyFBYzMjY0MzIHFCMiNCYjIgYUIyI1NDYzMhYBiDQlJTQUFB0UFB0UFM8UFB0UFR0UFDUlJTQCGCU0NCUUKB4eKFkTJx4eJxMmNDUAAAMAFwAFAMkAfAAJABMAHQBUQB4BHh5AHwAFBAQJABMKBA8OHRQEGRgbEQcWDAIBGEZ2LzcYAC88PC88PAEvPP08Lzz9PC88/TwAMTABSWi5ABgAHkloYbBAUlg4ETe5AB7/wDhZNxQjIj0BNDMyFQcUIyI9ATQzMhUHFCMiPQE0MzIVyRMUFBNFFBQUFEUUFBQUGRQUTxQUTxQUTxQUUBMTUBQUAAADABYBPADJAbMACQATAB0AVEAeAR4eQB8AEwoEDw4FBAQJAB0UBBkYGxEHFgwCARhGdi83GAAvPDwvPDwBLzz9PC88/TwvPP08ADEwAUlouQAYAB5JaGGwQFJYOBE3uQAe/8A4WRMUIyI9ATQzMhUHFCMiPQE0MzIVBxQjIj0BNDMyFckUFBQURhMUFBNFFBQUFAFPExNQFBRQExNQFBRQExNPFBQAAwAWAHYAyAEoAAsAFwAfAFRAIAEgIEAhABIEBhwMBAAYBBwVBQMaBR4PBQkJAx4BAQZGdi83GAA/Ly8Q/RD9EP0BL/3d/RDd/QAxMAFJaLkABgAgSWhhsEBSWDgRN7kAIP/AOFk3FAYjIiY1NDYzMhYHNCYjIgYVFBYzMjYnFCMiNTQzMsg0JSU0NCUlNCgcFRQdHRQVHB0UExMUzyU0NCUlNDQlFB0dFBQdHRQUFBQAAA0ABv/fAqMBrAANABkAJwAzAEEATwBbAGcAbwB3AIMAjwCXAK1AUgGYmECZeEw3HQNOQDkmHwVWBEcUlASQfgSKXAQMKIQEeGIELg4EUGgEbHQEcI1lBStTBRdqBW6BMQWHX5Z2BZJyEQVZChd7RStuAz4BJAIBFEZ2LzcYAD8/Py88PC88L/0vPP08Lzz9PBD9EP0Q/TwBL/0v/S/9L/0v/S88/S/9L/0vPP0uLi4uLi4ALi4uLjEwAUlouQAUAJhJaGGwQFJYOBE3uQCY/8A4WQEHBiMiNTQ/ATYzMhUUBRQGIyImNTQ2MzIWFwcGIyI1ND8BNjMyFRQXFAYjIiY1NDYzMhYnBwYjIjU0PwE2MzIVFA8BBiMiNTQ/ATYzMhUUJzQmIyIGFRQWMzI2ATQmIyIGFRQWMzI2ARQjIjU0MzIBFCMiNTQzMgUUBiMiJjU0NjMyFgc0JiMiBhUUFjMyNicUIyI1NDMyAcx+BggUBn4GCBT+5jQlJTQ0JSU0WoMGCBQGggcIFLs0JiU0NCUlNXF/BggVBn8GCBXCfQYIFAZ9BggVHR0UFB4eFBQdARseFBQdHRQUHv7IFBQUFAEaFBQUFAEWNCUlNDQlJTQoHRQUHR0UFB0dFBQUFAGJfgYUCAZ+BhQIPSU0NCUmNDVVgwYVCAaCBxUI8CU0NCUlNDRtfgYUCAZ/BhUIbX0GFAgGfQYUB+gUHh4UFB0d/voUHR0UFB4eAS8UFBT+0RQUFBQlNDQlJTQ0JRQdHRQUHh4UFBQUAAQAFf/gAeEBqwANABsAKQA3AE9AGwE4OEA5DDQfEQM2LyghGhMMBQotJgEYAgEvRnYvNxgAPz8vLwEuLi4uLi4uLgAuLi4uMTABSWi5AC8AOEloYbBAUlg4ETe5ADj/wDhZAQcGIyI1ND8BNjMyFRQPAQYjIjU0PwE2MzIVFBcHBiMiNTQ/ATYzMhUUDwEGIyI1ND8BNjMyFRQB234GCBUGfgYIFcGCBggVBoMHBxRKfwYIFQd+BggVwX0GCBUGfQYIFQGJfgYUCAZ+BhQIbYMGFQgGggcVCF5+BhMIB38GFQhtfQYUCAZ9BhQIAAACAAwAoABvAQIACwATAEJAFQEUFEAVAAYADAQQDgUSAwkSAQEGRnYvNxgAPy8vEP0BL/0uLgAxMAFJaLkABgAUSWhhsEBSWDgRN7kAFP/AOFk3NCYjIgYVFBYzMjYnFCMiNTQzMm8eFBQdHRQUHh4UFBQU0RQdHRQUHR0UFBQUAAAAAAAAAAAAfAAAAHwAAAB8AAAAfAAAAb4AAAJkAAAD9gAABdAAAAciAAAILAAACSQAAAo4AAAKuAAAC2QAAAwQAAAM/gAADgQAAA6uAAAPsAAAEK4AABG0AAASpgAAE7oAABR2AAAVjAAAFqgAABfCAAAYuAAAGcIAABpuAAAbZgAAHOQAAB3cAAAe3AAAICgAACGWAAAi1gAAI8oAACTIAAAl3AAAJugAAChaAAApYAAAKhwAACrmAAArngAALKQAAC2sAAAu2AAAL/YAADFUAAAyPAAAM0oAADQMAAA03gAANj4AADcWAAA3/AAAOLgAADkUAAA50gAAOqwAADuqAAA87gAAPcgAAD64AAA/3AAAQRgAAEIIAABDEAAARHwAAEV8AABGAAAAR34AAEiiAABJiAAASmQAAEs+AABMFgAATTYAAE44AABPBgAAT8AAAFCOAABR7AAAUsQAAFN+AABU0gAAVewAAFd0AABYMgAAWNYAAFpCAABbwAAAXT4AAF62AABgIgAAYmgAAGPUAABltgAAZ1QAAGkaAABq4AAAbKQAAG3qAABvLgAAcHQAAHGgAABzLgAAdLoAAHZKAAB3wgAAeagAAHs+AAB80AAAfmIAAH/wAACB3AAAgtoAAIQ4AACFlAAAhvwAAIhKAACJxgAAivIAAIxqAACOCAAAj3wAAJDuAACSWgAAk5AAAJTGAACWAAAAl54AAJkGAACacAAAm9oAAJ0yAACeugAAoEAAAKGSAACi5gAApDoAAKWyAACnsgAAqTAAAKqMAACrzAAArIgAAK06AACtmAAArgwAAK5uAACvHAAAr8AAALBwAACxFgAAsbwAALJuAAC0tAAAtaIAALYiAAC2IgAAtiIB9AA/AAAAAACLAAAAiwAAAUUAGADdABcBdQAMAeUACgIqABQBMgAJATIAEQHuABQAxQAKAYcAEQDfABYB9AAVAdwAHQDnABsBgAARAUYAGQFcACUBYgAnAcoAFwFSABAA6gAiAbUACwD0ACEA3wAXATIACQGHABEBMgARAQ0AKgLAABEBIwAkA3kAHwJFABwBtAAjAbQAIwHDABcBowAgAMYAEwGWAAkBuwAjAS0AIQKaACUCNQAkAdwAHQGQACICSAAdAaAAJgDrAB0BfAANAXkAJgGUAAgCuwAOAhkAEgGkAAUBFwAPAOIABwD2AAEA+wABAd8AFAEcACICxgAVAeoAGAG0ABUA7AANAcYACQJHACIAxgAVAZcACgGNACcAugAkAnUAJQHRAB0BXQAZAekAJgHpABkB0QAhAOoAGgDoABEBLQAgAT4ACQJoAAgCBgAKAawACQEXABEBRQAYAU0ABAI8AAEA+v//ANIAEAENAC0CwAARAsAAEALAABECwAARAsAAEQLAABADWgAJA5AAIQG0AAABvQAjAbQAIwDG/7gAxgATAMb/+AI1ACMB3AAdAdwAHQHcABwB3AAcAdwAHQHlAA0BeQAPAXkAJQF5ACQBeQAlARwAJQHfABAB3wAUAd8AEgHfABEB3wARAd8AEgMTABUCxgAVAbQAFgG0ABUBtAAVAMb/tgDGABQAxv/4AdEAHQFdAAIBXQAZAV0AFwFd/+4BXQAZAWIADQEt/+kBLQAgAS0AHgEtAB8DUAAZArIAEgEJAAoBCQAKAOIABwDiAAMA9gAFALsABQBoAA0A0QAPANIAFQGOAAYA4QAXAOEAFgDfABYCowAGAfQAFQB6AAwB9AAAAfQAAAACAAAAAAAA/5YAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAAAABAAIAAwAEAAUABwAIAAkACwAMAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQBBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AowCFAI4AjQDeAKIArQDJAMcArgBiAGMAkABkAMsAZQDIAM8AzADNAGYA0wDQANEArwBnAJEA1gDUANUAaACJAGoAaQBrAG0AbABuAKAAbwBxAHAAcgB1AHQAdgB4AHoAeQB7AH0AfAChAH8AfgCAAIEAsACxAOYA5wDYAOEA2gDbANwA3QDgANkAtAC1AIcAxgC8AMMAAACsAAAAAAADAAAAAAAABegAAQAAAAAAHAADAAEAAAXoAAYFzAAAAAAC4QABAAAAAAAAAAAAAAAAAAAAAQADAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAwAEAAUAAAAGAAcACAAAAAkACgAAAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfAAAAIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5AAAAAAAAADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAAAAAAAAAABZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaAAAAAAAAAFsAAAAAAAAAAAAAAAAAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAAABoAGkAagAAAAAAawBsAG0AbgBvAHAAAABxAHIAcwB0AHUAAAAAAHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAAAAggCDAIQAAAAAAIUAhgCHAIgAiQCKAAAAiwCMAI0AjgCPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSAJMAAAAAAAAAAAAAAAAAAAAAAAAAlACVAJYAlwCYAJkAmgCbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnACdAAAAAAAAAAAAngAAAJ8AAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAKIABAJYAAAAQABAAAUAAAAiACYAKQA/AFoAegChAKMAqACvALQAuADKAM4A1gDcAOoA7gD2APwBUwF+AscCyQLcIBAgHSAiIDAgRCIZ//8AAAAgACQAKAArAEEAXgCgAKMAqACvALQAtwC/AMwA0QDYAN8A7ADxAPgBUgF9AsYCyQLYIBAgHCAiIDAgRCIZ//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEAARABIAEoAcgCkANwA3gDeAN4A3gDeAOAA9gD6AQQBDAEiASYBMAE4AToBPAE+AT4BRgFGAUgBSAFIAUj//wADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");\n',
'// color: black;\n',
'// background-color: lightblue;\n',
'\n',
' url_bgimg: "/imgs/bg/bg_frax_ribbon.jpg";\n',
' background: url(url_bgimg) darkslategrey;\n',
' color: ivory;\n',
'// color: white;\n',
' font-size:62.5%; \n',
' font-family: yokkmokkOT;\n',
' font-size: 32pt;\n',
' }\n',
'\n',
'// h1 { font-size: 2.4em; } /* =24px */\n',
'// h1 { font-size: 64pt; color: ivory; font-family: yokkmokkOT; } /* =24px */\n',
' h1 { font-size: 32pt; color: ivory; font-family: yokkmokkOT; } /* =24px */\n',
' h2 { font-size: 28pt; color: ivory; font-family: yokkmokkOT } /* =24px */\n',
' h3 { font-size: 18pt; color: grey; font-family: "times new roman"; } /* =24px */\n',
' h4 { font-size: 14pt; color: grey; font-family: "times new roman"; } /* =24px */\n',
' p { font-size: 10pt; } /* =14px */\n',
' dl { font-size: 20pt; color: ivory; font-family: arial; } /* =14px? */\n',
' dd { font-size: 18pt; color: ivory; font-family: arial; } /* =14px? */\n',
'\n',
' ol { font-size: 20pt; color: ivory; font-family: "times new roman"; } /* =14px? */\n',
' li { font-size: 18pt; color: ivory; font-family: "times new roman"; } /* =14px? */\n',
'\n',
'\n',
' .detail { \n',
' background: darkslategrey;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: yokkmokkOT;\n',
' color: ivory;\n',
' }\n',
' .detail_new { \n',
' url_bgimg: " /imgs/bg/bg_frax_thorn.jpg";\n',
'\n',
' background: url(url_bgimg) linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
'\n',
' .detail_food { \n',
' url_bgimg: "/imgs/bg/bg_newton05b.jpg";\n',
' background: url(url_bgimg) linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
'\n',
' .detail_where { \n',
' background: linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
'\n',
' .detail_courtreport { \n',
' background: linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
'\n',
' .detail_preserve { \n',
' background: linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
' .detail_protect { \n',
' background: linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
' .detail_dogs { \n',
' background: linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
'\n',
'\n',
'\n',
'\n',
'\n',
'\n',
'\n',
' .detail_focus { \n',
' background: linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
' .detail_work { \n',
' background: linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: ariel;\n',
' }\n',
' .detail_memes { \n',
' background: goldenrod;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: ariel;\n',
' }\n',
' \n',
' .detail_jtfdc { \n',
' background: goldenrod;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: ariel;\n',
' }\n',
' .detail_jtfinc { \n',
' background: goldenrod;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: ariel;\n',
' }\n',
' .detail_byrdpucker { \n',
' background: lightyellow;\n',
' width: 40%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: garamond;\n',
' }\n',
' .detail_jkwii { \n',
' background: palegoldenrod;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid gold;\n',
'// font-family: times new roman;\n',
' font-family: yokkmokkOT;\n',
' }\n',
' .detail_kou { \n',
' background: lightbrown;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
' .detail_kassil { \n',
' background: ivory;\n',
'// width: 35%;\n',
' width: 50%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: garamond;\n',
' }\n',
' .detail_konet { \n',
' background: blue;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: comic sans ms;\n',
' }\n',
' .detail_iperms { \n',
' background: green;\n',
' width: 50%;\n',
' padding: 20px;\n',
' border: 1px solid olivegreen;\n',
' font-family: ariel;\n',
' }\n',
' \n',
' .detail_konabus { \n',
' background: lightgreen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: ariel;\n',
' }\n',
' .detail_kt { \n',
' background: lightgreen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: ariel;\n',
' }\n',
' .detail_go { \n',
' background: ivory;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid darkslategrey;\n',
' font-family: ariel;\n',
' }\n',
' .detail_old { \n',
' background: lightgreen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: ariel;\n',
' }\n',
' \n',
' </style> \n'
)
return( htm_ko_css )
def ht_ko_yokk_css(args):
ht_ko_yokk_css = (
' <style id="style_yokkmokk">\n',
' @font-face {\n',
' font-family: yokkmokkOT;\n',
' src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");\n',
' }\n',
' @font-face {\n',
' font-family: "yokkmokkOT_file";\n',
' src: url("./fonts/yokkmokkOT.otf"); /* IE 5-8 */ \n',
' src: local("?"), /* sneakily trick IE */\n',
' url("./fonts/yokkmokk.ttf") format("truetype"), /* Opera, Safari */\n',
' url("./fonts/yokkmokkOT.woff") format("woff"), /* FF 3.6, Chrome 5, IE9 */\n',
' url("./fonts/yokkmokkOT.svg#font") format("svg"); /* iOS */\n',
' }\n',
'\n',
' body { \n',
'// font-family: yokkmokkOT;\n',
'// document.getElementById("body").style.font = "italic bold 20px arial,serif"; \n',
'// background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");\n',
'// color: black;\n',
'// background-color: lightblue;\n',
'\n',
' url_bgimg: "/imgs/bg/bg_frax_ribbon.jpg";\n',
' background: url(url_bgimg) darkslategrey;\n',
' color: ivory;\n',
'// color: white;\n',
' font-size:62.5%; \n',
' font-family: yokkmokkOT;\n',
' font-size: 32pt;\n',
' }\n',
" "
)
return( ht_ko_yokk_css )
def ht_ko_h1_css(args):
ht_ko_h1 = (
'// h1 { font-size: 2.4em; } /* =24px */\n',
'// h1 { font-size: 64pt; color: ivory; font-family: yokkmokkOT; } /* =24px */\n',
' h1 { font-size: 32pt; color: ivory; font-family: yokkmokkOT; } /* =24px */\n',
' h2 { font-size: 28pt; color: ivory; font-family: yokkmokkOT } /* =24px */\n',
' h3 { font-size: 18pt; color: grey; font-family: "times new roman"; } /* =24px */\n',
' h4 { font-size: 14pt; color: grey; font-family: "times new roman"; } /* =24px */\n',
' p { font-size: 10pt; } /* =14px */\n',
' dl { font-size: 20pt; color: ivory; font-family: arial; } /* =14px? */\n',
' dd { font-size: 18pt; color: ivory; font-family: arial; } /* =14px? */\n',
'\n',
' ol { font-size: 20pt; color: ivory; font-family: "times new roman"; } /* =14px? */\n',
' li { font-size: 18pt; color: ivory; font-family: "times new roman"; } /* =14px? */\n',
'\n',
'\n',
' .detail { \n',
' background: darkslategrey;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: yokkmokkOT;\n',
' color: ivory;\n',
' }\n',
' .detail_new { \n',
' url_bgimg: " /imgs/bg/bg_frax_thorn.jpg";\n',
'\n',
' background: url(url_bgimg) linen;\n',
' width: 35%;\n',
' padding: 20px;\n',
' border: 1px solid black;\n',
' font-family: courier new;\n',
' }\n',
' '
)
return( ht_ko_h1_css )
def ht_ko_input_css(args):
ht_ko_inout_css = (
' <style id="style_input">\n',
' .fileContainer {\n',
' overflow: hidden;\n',
' position: relative;\n',
' }\n',
' \n',
' .fileContainer [type=file] {\n',
' cursor: inherit;\n',
' display: block;\n',
' font-size: 999px;\n',
' filter: alpha(opacity=0);\n',
' min-height: 100%;\n',
' min-width: 100%;\n',
' opacity: 0;\n',
' position: absolute;\n',
' right: 0;\n',
' text-align: right;`\n',
' top: 0;\n',
' }\n',
' </style>\n',
' '
)
return( ht_ko_input_css )
def ht_ko_popover_css(args):
ht_ko_popover_css = (
' <style id="style_popover" >\n',
' .popover {\n',
' position: relative;\n',
' float: left;\n',
' padding: 5px;\n',
'// /*z-ka1: 0;*/\n',
'// width: 200px;"\n',
'// height: 300px;\n',
' }\n',
' .popover:hover {\n',
' background-color: darkSlategrey;\n',
'// bigboxbug background-color: yellow;\n',
'// background-color: #e9e9e2;\n',
'// width: 200px;\n',
'// height: 300px;\n',
' /*z-ka1: 50;*/\n',
'// color: white;\n',
' color: ivory;\n',
'// color: #335500;\n',
' text-decoration: none;\n',
' }\n',
'/*CSS for enlarged image*/\n',
' .popover span { \n',
' position: absolute; // important\n',
'// width: 200px;\n',
'// height: 300px;\n',
'// background-color: #e5e5e5;\n',
'// left: -1000px;\n',
'// border: 1px solid #666;\n',
'\n',
'// position: relative; \n',
' background-color: darkSlategrey;\n',
' padding: 5px;\n',
' border: 0px solid #666;\n',
' visibility: hidden;\n',
' color: ivory;\n',
' text-decoration: none;\n',
' }\n',
'/*CSS for enlarged image*/\n',
' .popover span img { \n',
'// border-width: 0px; \n',
' border-width: 0px; \n',
' /*padding: 2px;*/\n',
' }\n',
' \n',
'/*CSS for enlarged image on hover*/\n',
' .popover:hover span { \n',
' visibility: visible; \n',
'// width: 200px;\n',
' top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */\n',
' left: 0px;/*position where enlarged image should offset horizontally */\n',
' }\n',
' </style>\n',
' '
)
return( ht_ko_popover_css )
def ht_ko_thumbnail_css(args ):
ht_ko_thumbnail_css = (
' <style id="style_thumbnail" >\n',
' .thumbnail {\n',
' position: relative;\n',
' float: left;\n',
' padding: 5px;\n',
' /*z-ka1: 0;*/\n',
' }\n',
' .thumbnail:hover {\n',
'// background-color: #e9e9e2;\n',
'// color: #335500;\n',
'// z-ka1: 50;\n',
' background-color: darkslategrey;\n',
' color: ivory;\n',
' text-decoration: none;\n',
' }\n',
'/*CSS for enlarged image*/\n',
' '
)
return( ht_ko_thumbnail_css )
def ht_ko_buttons_css(args):
ht_ko_buttons_css = (
' <style id="style_buttons" >\n',
'// body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }\n',
' button {\n',
'// visibility: hidden;\n',
'// background: rgba(7, 99, 53, .1);\n',
' background: transparent;\n',
'// border: 3px solid rgba(7, 99, 53, 1);\n',
' border: 3px solid darkSlategrey;\n',
' border-radius: 5px;\n',
'// color: rgba(7, 99, 53, 1);\n',
'// color: ivory;\n',
' color: darkSlategrey;\n',
' cursor: pointer;\n',
' line-height: 40px;\n',
' font-size: 20px;\n',
' outline: none;\n',
' padding: 0 20px;\n',
' transition: all .3s;\n',
' }\n',
' button:hover {\n',
' background: darkSlategrey;\n',
' color: ivory;\n',
' }\n',
' p {font-size: 20px; font-weight: bold;\n',
' </style>\n',
' '
)
return( ht_ko_buttons_css )
def ht_ko_input1_css(args):
ht_ko_input1_css = (
' <style id="style_input" >\n',
'// body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }\n',
' input {\n',
'// visibility: hidden;\n',
'// background: rgba(7, 99, 53, .1);\n',
' background: transparent;\n',
'// border: 3px solid rgba(7, 99, 53, 1);\n',
' border: 3px solid darkSlategrey;\n',
' border-radius: 5px;\n',
'// color: rgba(7, 99, 53, 1);\n',
'// color: ivory;\n',
' color: darkSlategrey;\n',
' cursor: pointer;\n',
' line-height: 40px;\n',
' font-size: 10px;\n',
' outline: none;\n',
' padding: 0 20px;\n',
' transition: all .3s;\n',
' }\n',
' button:hover {\n',
'// background: rgba(7, 99, 53, 1);\n',
' background: darkgreyslate;\n',
'// background: yellow;\n',
'// background: white;\n',
'// color: rgba(255,255,255,1);\n',
'// color: white;\n',
' color: ivory;\n',
' }\n',
' p {font-size: 10px; font-weight: bold;\n',
' </style>\n',
' '
)
return( ht_ko_input1_css)
def ht_ko_drop_css(args):
ht_ko_drop_css = (
' <style type="text/css">\n',
' #drop {\n',
' width:800px;\n',
' height:250px;\n',
' margin:3px auto;\n',
'// background:#eddaa8;\n',
' background:ivory;\n',
' font-size:16px;\n',
' }\n',
' #drop #sw { text-decoration:underline; cursor:pointer; }\n',
' #drag {\n',
'// width:450px;\n',
'// height:180px;\n',
' width:800;\n',
' height:480px;\n',
' margin:12px auto;\n',
' border:1px solid silver;\n',
' font-size:16px;\n',
' }\n',
' #drag .drg { margin:10px 12px; }\n',
' #drag div.drg {\n',
' width:150px;\n',
' height:50px;\n',
' background:#07da08;\n',
' border:2px solid blue;\n',
' }\n',
' </style>\n',
' '
)
return( ht_ko_drop_css )
def ht_ko_csv_css(args):
ht_ko_csv_css = (
' <style id="style_div_csv type="text/css">\n',
' body {\n',
'// font-family: Arial;\n',
' font-family: yokkmokkOT;\n',
' font-family: arial;\n',
' font-size: 8pt;\n',
' }\n',
' table {\n',
' border: 1px solid #ccc;\n',
' }\n',
' table th {\n',
'// background-color: #F7F7F7;\n',
' background-color: darkSlategrey;\n',
'// color: #333;\n',
' color: ivory;\n',
' font-weight: bold;\n',
' }\n',
' table th, table td {\n',
' padding: 5px;\n',
' border-color: #ccc;\n',
' }\n',
' </style>\n',
' \n',
' <style id="style_thumb_3800">\n',
' .thumb {\n',
' height: 75px;\n',
' border: 1px solid #000;\n',
' margin: 10px 5px 0 0;\n',
' }\n',
' </style>\n',
'\n',
' <style id="style_byte_content" >\n',
' #byte_content {\n',
' margin: 5px 0;\n',
' max-height: 100px;\n',
' overflow-y: auto;\n',
' overflow-x: hidden;\n',
' }\n',
' #byte_range { margin-top: 5px; }\n',
' </style>\n',
)
return( ht_ko_csv_css )
def ht_ko_js(a0,a1,a2,a3):
htm_ko_js = (
' <script>\n',
' function allowDrop(ev) {ev.preventDefault();}\n',
' function drag(ev) {ev.dataTransfer.setData("text", ev.target.id);}\n',
' function drop(ev) {\n',
' ev.preventDefault();\n',
' var data = ev.dataTransfer.getData("text");\n',
' ev.target.appendChild(document.getElementById(data));\n',
' }\n',
' </script>\n',
'\n',
' <script id= "script_sl_jquery_js" type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNC40CiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTAsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBUaHUgTm92IDExIDE5OjA0OjUzIDIwMTAgLTA1MDAKICovCihmdW5jdGlvbihFLEIpe2Z1bmN0aW9uIGthKGEsYixkKXtpZihkPT09QiYmYS5ub2RlVHlwZT09PTEpe2Q9YS5nZXRBdHRyaWJ1dGUoImRhdGEtIitiKTtpZih0eXBlb2YgZD09PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiP3RydWU6ZD09PSJmYWxzZSI/ZmFsc2U6ZD09PSJudWxsIj9udWxsOiFjLmlzTmFOKGQpP3BhcnNlRmxvYXQoZCk6SmEudGVzdChkKT9jLnBhcnNlSlNPTihkKTpkfWNhdGNoKGUpe31jLmRhdGEoYSxiLGQpfWVsc2UgZD1CfXJldHVybiBkfWZ1bmN0aW9uIFUoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gY2EoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBsYShhLGIsZCl7ZFswXS50eXBlPWE7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KGIsZCl9ZnVuY3Rpb24gS2EoYSl7dmFyIGIsZCxlLGYsaCxsLGssbyx4LHIsQSxDPVtdO2Y9W107aD1jLmRhdGEodGhpcyx0aGlzLm5vZGVUeXBlPyJldmVudHMiOiJfX2V2ZW50c19fIik7aWYodHlwZW9mIGg9PT0iZnVuY3Rpb24iKWg9CmguZXZlbnRzO2lmKCEoYS5saXZlRmlyZWQ9PT10aGlzfHwhaHx8IWgubGl2ZXx8YS5idXR0b24mJmEudHlwZT09PSJjbGljayIpKXtpZihhLm5hbWVzcGFjZSlBPVJlZ0V4cCgiKF58XFwuKSIrYS5uYW1lc3BhY2Uuc3BsaXQoIi4iKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTthLmxpdmVGaXJlZD10aGlzO3ZhciBKPWgubGl2ZS5zbGljZSgwKTtmb3Ioaz0wO2s8Si5sZW5ndGg7aysrKXtoPUpba107aC5vcmlnVHlwZS5yZXBsYWNlKFgsIiIpPT09YS50eXBlP2YucHVzaChoLnNlbGVjdG9yKTpKLnNwbGljZShrLS0sMSl9Zj1jKGEudGFyZ2V0KS5jbG9zZXN0KGYsYS5jdXJyZW50VGFyZ2V0KTtvPTA7Zm9yKHg9Zi5sZW5ndGg7bzx4O28rKyl7cj1mW29dO2ZvcihrPTA7azxKLmxlbmd0aDtrKyspe2g9SltrXTtpZihyLnNlbGVjdG9yPT09aC5zZWxlY3RvciYmKCFBfHxBLnRlc3QoaC5uYW1lc3BhY2UpKSl7bD1yLmVsZW07ZT1udWxsO2lmKGgucHJlVHlwZT09PSJtb3VzZWVudGVyInx8CmgucHJlVHlwZT09PSJtb3VzZWxlYXZlIil7YS50eXBlPWgucHJlVHlwZTtlPWMoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGguc2VsZWN0b3IpWzBdfWlmKCFlfHxlIT09bClDLnB1c2goe2VsZW06bCxoYW5kbGVPYmo6aCxsZXZlbDpyLmxldmVsfSl9fX1vPTA7Zm9yKHg9Qy5sZW5ndGg7bzx4O28rKyl7Zj1DW29dO2lmKGQmJmYubGV2ZWw+ZClicmVhazthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtO2EuZGF0YT1mLmhhbmRsZU9iai5kYXRhO2EuaGFuZGxlT2JqPWYuaGFuZGxlT2JqO0E9Zi5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoZi5lbGVtLGFyZ3VtZW50cyk7aWYoQT09PWZhbHNlfHxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2Q9Zi5sZXZlbDtpZihBPT09ZmFsc2UpYj1mYWxzZTtpZihhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9fXJldHVybiBifX1mdW5jdGlvbiBZKGEsYil7cmV0dXJuKGEmJmEhPT0iKiI/YSsiLiI6IiIpK2IucmVwbGFjZShMYSwKImAiKS5yZXBsYWNlKE1hLCImIil9ZnVuY3Rpb24gbWEoYSxiLGQpe2lmKGMuaXNGdW5jdGlvbihiKSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZixoKXtyZXR1cm4hIWIuY2FsbChmLGgsZik9PT1kfSk7ZWxzZSBpZihiLm5vZGVUeXBlKXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZj09PWI9PT1kfSk7ZWxzZSBpZih0eXBlb2YgYj09PSJzdHJpbmciKXt2YXIgZT1jLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gZi5ub2RlVHlwZT09PTF9KTtpZihOYS50ZXN0KGIpKXJldHVybiBjLmZpbHRlcihiLGUsIWQpO2Vsc2UgYj1jLmZpbHRlcihiLGUpfXJldHVybiBjLmdyZXAoYSxmdW5jdGlvbihmKXtyZXR1cm4gYy5pbkFycmF5KGYsYik+PTA9PT1kfSl9ZnVuY3Rpb24gbmEoYSxiKXt2YXIgZD0wO2IuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZU5hbWU9PT0oYVtkXSYmYVtkXS5ub2RlTmFtZSkpe3ZhciBlPWMuZGF0YShhW2QrK10pLGY9Yy5kYXRhKHRoaXMsCmUpO2lmKGU9ZSYmZS5ldmVudHMpe2RlbGV0ZSBmLmhhbmRsZTtmLmV2ZW50cz17fTtmb3IodmFyIGggaW4gZSlmb3IodmFyIGwgaW4gZVtoXSljLmV2ZW50LmFkZCh0aGlzLGgsZVtoXVtsXSxlW2hdW2xdLmRhdGEpfX19KX1mdW5jdGlvbiBPYShhLGIpe2Iuc3JjP2MuYWpheCh7dXJsOmIuc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSk6Yy5nbG9iYWxFdmFsKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBvYShhLGIsZCl7dmFyIGU9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodDtpZihkPT09ImJvcmRlciIpcmV0dXJuIGU7Yy5lYWNoKGI9PT0id2lkdGgiP1BhOlFhLGZ1bmN0aW9uKCl7ZHx8KGUtPXBhcnNlRmxvYXQoYy5jc3MoYSwicGFkZGluZyIrdGhpcykpfHwwKTtpZihkPT09Im1hcmdpbiIpZSs9cGFyc2VGbG9hdChjLmNzcyhhLAoibWFyZ2luIit0aGlzKSl8fDA7ZWxzZSBlLT1wYXJzZUZsb2F0KGMuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDB9KTtyZXR1cm4gZX1mdW5jdGlvbiBkYShhLGIsZCxlKXtpZihjLmlzQXJyYXkoYikmJmIubGVuZ3RoKWMuZWFjaChiLGZ1bmN0aW9uKGYsaCl7ZHx8UmEudGVzdChhKT9lKGEsaCk6ZGEoYSsiWyIrKHR5cGVvZiBoPT09Im9iamVjdCJ8fGMuaXNBcnJheShoKT9mOiIiKSsiXSIsaCxkLGUpfSk7ZWxzZSBpZighZCYmYiE9bnVsbCYmdHlwZW9mIGI9PT0ib2JqZWN0IiljLmlzRW1wdHlPYmplY3QoYik/ZShhLCIiKTpjLmVhY2goYixmdW5jdGlvbihmLGgpe2RhKGErIlsiK2YrIl0iLGgsZCxlKX0pO2Vsc2UgZShhLGIpfWZ1bmN0aW9uIFMoYSxiKXt2YXIgZD17fTtjLmVhY2gocGEuY29uY2F0LmFwcGx5KFtdLHBhLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7ZFt0aGlzXT1hfSk7cmV0dXJuIGR9ZnVuY3Rpb24gcWEoYSl7aWYoIWVhW2FdKXt2YXIgYj1jKCI8IisKYSsiPiIpLmFwcGVuZFRvKCJib2R5IiksZD1iLmNzcygiZGlzcGxheSIpO2IucmVtb3ZlKCk7aWYoZD09PSJub25lInx8ZD09PSIiKWQ9ImJsb2NrIjtlYVthXT1kfXJldHVybiBlYVthXX1mdW5jdGlvbiBmYShhKXtyZXR1cm4gYy5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OmZhbHNlfXZhciB0PUUuZG9jdW1lbnQsYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtpZighYi5pc1JlYWR5KXt0cnl7dC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChqKXtzZXRUaW1lb3V0KGEsMSk7cmV0dXJufWIucmVhZHkoKX19dmFyIGI9ZnVuY3Rpb24oaixzKXtyZXR1cm4gbmV3IGIuZm4uaW5pdChqLHMpfSxkPUUualF1ZXJ5LGU9RS4kLGYsaD0vXig/OltePF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0rKSQpLyxsPS9cUy8saz0vXlxzKy8sbz0vXHMrJC8seD0vXFcvLHI9L1xkLyxBPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sCkM9L15bXF0sOnt9XHNdKiQvLEo9L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyx3PS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxJPS8oPzpefDp8LCkoPzpccypcWykrL2csTD0vKHdlYmtpdClbIFwvXShbXHcuXSspLyxnPS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyxpPS8obXNpZSkgKFtcdy5dKykvLG49Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/LyxtPW5hdmlnYXRvci51c2VyQWdlbnQscD1mYWxzZSxxPVtdLHUseT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxNPUFycmF5LnByb3RvdHlwZS5wdXNoLE49QXJyYXkucHJvdG90eXBlLnNsaWNlLE89U3RyaW5nLnByb3RvdHlwZS50cmltLEQ9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsUj17fTtiLmZuPWIucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKGosCnMpe3ZhciB2LHosSDtpZighailyZXR1cm4gdGhpcztpZihqLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1qO3RoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYoaj09PSJib2R5IiYmIXMmJnQuYm9keSl7dGhpcy5jb250ZXh0PXQ7dGhpc1swXT10LmJvZHk7dGhpcy5zZWxlY3Rvcj0iYm9keSI7dGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2Ygaj09PSJzdHJpbmciKWlmKCh2PWguZXhlYyhqKSkmJih2WzFdfHwhcykpaWYodlsxXSl7SD1zP3Mub3duZXJEb2N1bWVudHx8czp0O2lmKHo9QS5leGVjKGopKWlmKGIuaXNQbGFpbk9iamVjdChzKSl7aj1bdC5jcmVhdGVFbGVtZW50KHpbMV0pXTtiLmZuLmF0dHIuY2FsbChqLHMsdHJ1ZSl9ZWxzZSBqPVtILmNyZWF0ZUVsZW1lbnQoelsxXSldO2Vsc2V7ej1iLmJ1aWxkRnJhZ21lbnQoW3ZbMV1dLFtIXSk7aj0oei5jYWNoZWFibGU/ei5mcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSk6ei5mcmFnbWVudCkuY2hpbGROb2Rlc31yZXR1cm4gYi5tZXJnZSh0aGlzLApqKX1lbHNle2lmKCh6PXQuZ2V0RWxlbWVudEJ5SWQodlsyXSkpJiZ6LnBhcmVudE5vZGUpe2lmKHouaWQhPT12WzJdKXJldHVybiBmLmZpbmQoaik7dGhpcy5sZW5ndGg9MTt0aGlzWzBdPXp9dGhpcy5jb250ZXh0PXQ7dGhpcy5zZWxlY3Rvcj1qO3JldHVybiB0aGlzfWVsc2UgaWYoIXMmJiF4LnRlc3Qoaikpe3RoaXMuc2VsZWN0b3I9ajt0aGlzLmNvbnRleHQ9dDtqPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaik7cmV0dXJuIGIubWVyZ2UodGhpcyxqKX1lbHNlIHJldHVybiFzfHxzLmpxdWVyeT8oc3x8ZikuZmluZChqKTpiKHMpLmZpbmQoaik7ZWxzZSBpZihiLmlzRnVuY3Rpb24oaikpcmV0dXJuIGYucmVhZHkoaik7aWYoai5zZWxlY3RvciE9PUIpe3RoaXMuc2VsZWN0b3I9ai5zZWxlY3Rvcjt0aGlzLmNvbnRleHQ9ai5jb250ZXh0fXJldHVybiBiLm1ha2VBcnJheShqLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNC40IixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSwKdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBOLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsP3RoaXMudG9BcnJheSgpOmo8MD90aGlzLnNsaWNlKGopWzBdOnRoaXNbal19LHB1c2hTdGFjazpmdW5jdGlvbihqLHMsdil7dmFyIHo9YigpO2IuaXNBcnJheShqKT9NLmFwcGx5KHosaik6Yi5tZXJnZSh6LGopO3oucHJldk9iamVjdD10aGlzO3ouY29udGV4dD10aGlzLmNvbnRleHQ7aWYocz09PSJmaW5kIil6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKSt2O2Vsc2UgaWYocyl6LnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK3MrIigiK3YrIikiO3JldHVybiB6fSxlYWNoOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGIuZWFjaCh0aGlzLGoscyl9LHJlYWR5OmZ1bmN0aW9uKGope2IuYmluZFJlYWR5KCk7aWYoYi5pc1JlYWR5KWouY2FsbCh0LGIpO2Vsc2UgcSYmcS5wdXNoKGopO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihqKXtyZXR1cm4gaj09PQotMT90aGlzLnNsaWNlKGopOnRoaXMuc2xpY2UoaiwraisxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soTi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixOLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oail7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGIubWFwKHRoaXMsZnVuY3Rpb24ocyx2KXtyZXR1cm4gai5jYWxsKHMsdixzKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8YihudWxsKX0scHVzaDpNLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfTtiLmZuLmluaXQucHJvdG90eXBlPWIuZm47Yi5leHRlbmQ9Yi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgaixzLHYseixILEc9YXJndW1lbnRzWzBdfHx7fSxLPTEsUT1hcmd1bWVudHMubGVuZ3RoLGdhPWZhbHNlOwppZih0eXBlb2YgRz09PSJib29sZWFuIil7Z2E9RztHPWFyZ3VtZW50c1sxXXx8e307Sz0yfWlmKHR5cGVvZiBHIT09Im9iamVjdCImJiFiLmlzRnVuY3Rpb24oRykpRz17fTtpZihRPT09Syl7Rz10aGlzOy0tS31mb3IoO0s8UTtLKyspaWYoKGo9YXJndW1lbnRzW0tdKSE9bnVsbClmb3IocyBpbiBqKXt2PUdbc107ej1qW3NdO2lmKEchPT16KWlmKGdhJiZ6JiYoYi5pc1BsYWluT2JqZWN0KHopfHwoSD1iLmlzQXJyYXkoeikpKSl7aWYoSCl7SD1mYWxzZTt2PXYmJmIuaXNBcnJheSh2KT92OltdfWVsc2Ugdj12JiZiLmlzUGxhaW5PYmplY3Qodik/djp7fTtHW3NdPWIuZXh0ZW5kKGdhLHYseil9ZWxzZSBpZih6IT09QilHW3NdPXp9cmV0dXJuIEd9O2IuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGope0UuJD1lO2lmKGopRS5qUXVlcnk9ZDtyZXR1cm4gYn0saXNSZWFkeTpmYWxzZSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihqKXtqPT09dHJ1ZSYmYi5yZWFkeVdhaXQtLTsKaWYoIWIucmVhZHlXYWl0fHxqIT09dHJ1ZSYmIWIuaXNSZWFkeSl7aWYoIXQuYm9keSlyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2IuaXNSZWFkeT10cnVlO2lmKCEoaiE9PXRydWUmJi0tYi5yZWFkeVdhaXQ+MCkpaWYocSl7dmFyIHM9MCx2PXE7Zm9yKHE9bnVsbDtqPXZbcysrXTspai5jYWxsKHQsYik7Yi5mbi50cmlnZ2VyJiZiKHQpLnRyaWdnZXIoInJlYWR5IikudW5iaW5kKCJyZWFkeSIpfX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFwKXtwPXRydWU7aWYodC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIilyZXR1cm4gc2V0VGltZW91dChiLnJlYWR5LDEpO2lmKHQuYWRkRXZlbnRMaXN0ZW5lcil7dC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix1LGZhbHNlKTtFLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGIucmVhZHksZmFsc2UpfWVsc2UgaWYodC5hdHRhY2hFdmVudCl7dC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIix1KTtFLmF0dGFjaEV2ZW50KCJvbmxvYWQiLApiLnJlYWR5KTt2YXIgaj1mYWxzZTt0cnl7aj1FLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChzKXt9dC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmomJmEoKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGope3JldHVybiBiLnR5cGUoaik9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGope3JldHVybiBiLnR5cGUoaik9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihqKXtyZXR1cm4gaiYmdHlwZW9mIGo9PT0ib2JqZWN0IiYmInNldEludGVydmFsImluIGp9LGlzTmFOOmZ1bmN0aW9uKGope3JldHVybiBqPT1udWxsfHwhci50ZXN0KGopfHxpc05hTihqKX0sdHlwZTpmdW5jdGlvbihqKXtyZXR1cm4gaj09bnVsbD9TdHJpbmcoaik6Ult5LmNhbGwoaildfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihqKXtpZighanx8Yi50eXBlKGopIT09Im9iamVjdCJ8fGoubm9kZVR5cGV8fGIuaXNXaW5kb3coaikpcmV0dXJuIGZhbHNlO2lmKGouY29uc3RydWN0b3ImJgohRi5jYWxsKGosImNvbnN0cnVjdG9yIikmJiFGLmNhbGwoai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4gZmFsc2U7Zm9yKHZhciBzIGluIGopO3JldHVybiBzPT09Qnx8Ri5jYWxsKGoscyl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oail7Zm9yKHZhciBzIGluIGopcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxlcnJvcjpmdW5jdGlvbihqKXt0aHJvdyBqO30scGFyc2VKU09OOmZ1bmN0aW9uKGope2lmKHR5cGVvZiBqIT09InN0cmluZyJ8fCFqKXJldHVybiBudWxsO2o9Yi50cmltKGopO2lmKEMudGVzdChqLnJlcGxhY2UoSiwiQCIpLnJlcGxhY2UodywiXSIpLnJlcGxhY2UoSSwiIikpKXJldHVybiBFLkpTT04mJkUuSlNPTi5wYXJzZT9FLkpTT04ucGFyc2Uoaik6KG5ldyBGdW5jdGlvbigicmV0dXJuICIraikpKCk7ZWxzZSBiLmVycm9yKCJJbnZhbGlkIEpTT046ICIrail9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oail7aWYoaiYmCmwudGVzdChqKSl7dmFyIHM9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCx2PXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7di50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2lmKGIuc3VwcG9ydC5zY3JpcHRFdmFsKXYuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShqKSk7ZWxzZSB2LnRleHQ9ajtzLmluc2VydEJlZm9yZSh2LHMuZmlyc3RDaGlsZCk7cy5yZW1vdmVDaGlsZCh2KX19LG5vZGVOYW1lOmZ1bmN0aW9uKGoscyl7cmV0dXJuIGoubm9kZU5hbWUmJmoubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PXMudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihqLHMsdil7dmFyIHosSD0wLEc9ai5sZW5ndGgsSz1HPT09Qnx8Yi5pc0Z1bmN0aW9uKGopO2lmKHYpaWYoSylmb3IoeiBpbiBqKXtpZihzLmFwcGx5KGpbel0sdik9PT1mYWxzZSlicmVha31lbHNlIGZvcig7SDxHOyl7aWYocy5hcHBseShqW0grK10sdik9PT1mYWxzZSlicmVha31lbHNlIGlmKEspZm9yKHogaW4gail7aWYocy5jYWxsKGpbel0sCnosalt6XSk9PT1mYWxzZSlicmVha31lbHNlIGZvcih2PWpbMF07SDxHJiZzLmNhbGwodixILHYpIT09ZmFsc2U7dj1qWysrSF0pO3JldHVybiBqfSx0cmltOk8/ZnVuY3Rpb24oail7cmV0dXJuIGo9PW51bGw/IiI6Ty5jYWxsKGopfTpmdW5jdGlvbihqKXtyZXR1cm4gaj09bnVsbD8iIjpqLnRvU3RyaW5nKCkucmVwbGFjZShrLCIiKS5yZXBsYWNlKG8sIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oaixzKXt2YXIgdj1zfHxbXTtpZihqIT1udWxsKXt2YXIgej1iLnR5cGUoaik7ai5sZW5ndGg9PW51bGx8fHo9PT0ic3RyaW5nInx8ej09PSJmdW5jdGlvbiJ8fHo9PT0icmVnZXhwInx8Yi5pc1dpbmRvdyhqKT9NLmNhbGwodixqKTpiLm1lcmdlKHYsail9cmV0dXJuIHZ9LGluQXJyYXk6ZnVuY3Rpb24oaixzKXtpZihzLmluZGV4T2YpcmV0dXJuIHMuaW5kZXhPZihqKTtmb3IodmFyIHY9MCx6PXMubGVuZ3RoO3Y8ejt2KyspaWYoc1t2XT09PWopcmV0dXJuIHY7cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGosCnMpe3ZhciB2PWoubGVuZ3RoLHo9MDtpZih0eXBlb2Ygcy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIEg9cy5sZW5ndGg7ejxIO3orKylqW3YrK109c1t6XTtlbHNlIGZvcig7c1t6XSE9PUI7KWpbdisrXT1zW3orK107ai5sZW5ndGg9djtyZXR1cm4gan0sZ3JlcDpmdW5jdGlvbihqLHMsdil7dmFyIHo9W10sSDt2PSEhdjtmb3IodmFyIEc9MCxLPWoubGVuZ3RoO0c8SztHKyspe0g9ISFzKGpbR10sRyk7diE9PUgmJnoucHVzaChqW0ddKX1yZXR1cm4gen0sbWFwOmZ1bmN0aW9uKGoscyx2KXtmb3IodmFyIHo9W10sSCxHPTAsSz1qLmxlbmd0aDtHPEs7RysrKXtIPXMoaltHXSxHLHYpO2lmKEghPW51bGwpelt6Lmxlbmd0aF09SH1yZXR1cm4gei5jb25jYXQuYXBwbHkoW10seil9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihqLHMsdil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpaWYodHlwZW9mIHM9PT0ic3RyaW5nIil7dj1qO2o9dltzXTtzPUJ9ZWxzZSBpZihzJiYhYi5pc0Z1bmN0aW9uKHMpKXt2PQpzO3M9Qn1pZighcyYmailzPWZ1bmN0aW9uKCl7cmV0dXJuIGouYXBwbHkodnx8dGhpcyxhcmd1bWVudHMpfTtpZihqKXMuZ3VpZD1qLmd1aWQ9ai5ndWlkfHxzLmd1aWR8fGIuZ3VpZCsrO3JldHVybiBzfSxhY2Nlc3M6ZnVuY3Rpb24oaixzLHYseixILEcpe3ZhciBLPWoubGVuZ3RoO2lmKHR5cGVvZiBzPT09Im9iamVjdCIpe2Zvcih2YXIgUSBpbiBzKWIuYWNjZXNzKGosUSxzW1FdLHosSCx2KTtyZXR1cm4gan1pZih2IT09Qil7ej0hRyYmeiYmYi5pc0Z1bmN0aW9uKHYpO2ZvcihRPTA7UTxLO1ErKylIKGpbUV0scyx6P3YuY2FsbChqW1FdLFEsSChqW1FdLHMpKTp2LEcpO3JldHVybiBqfXJldHVybiBLP0goalswXSxzKTpCfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihqKXtqPWoudG9Mb3dlckNhc2UoKTtqPUwuZXhlYyhqKXx8Zy5leGVjKGopfHxpLmV4ZWMoail8fGouaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJm4uZXhlYyhqKXx8CltdO3JldHVybnticm93c2VyOmpbMV18fCIiLHZlcnNpb246alsyXXx8IjAifX0sYnJvd3Nlcjp7fX0pO2IuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihqLHMpe1JbIltvYmplY3QgIitzKyJdIl09cy50b0xvd2VyQ2FzZSgpfSk7bT1iLnVhTWF0Y2gobSk7aWYobS5icm93c2VyKXtiLmJyb3dzZXJbbS5icm93c2VyXT10cnVlO2IuYnJvd3Nlci52ZXJzaW9uPW0udmVyc2lvbn1pZihiLmJyb3dzZXIud2Via2l0KWIuYnJvd3Nlci5zYWZhcmk9dHJ1ZTtpZihEKWIuaW5BcnJheT1mdW5jdGlvbihqLHMpe3JldHVybiBELmNhbGwocyxqKX07aWYoIS9ccy8udGVzdCgiXHUwMGEwIikpe2s9L15bXHNceEEwXSsvO289L1tcc1x4QTBdKyQvfWY9Yih0KTtpZih0LmFkZEV2ZW50TGlzdGVuZXIpdT1mdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdSwKZmFsc2UpO2IucmVhZHkoKX07ZWxzZSBpZih0LmF0dGFjaEV2ZW50KXU9ZnVuY3Rpb24oKXtpZih0LnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXt0LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLHUpO2IucmVhZHkoKX19O3JldHVybiBFLmpRdWVyeT1FLiQ9Yn0oKTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9e307dmFyIGE9dC5kb2N1bWVudEVsZW1lbnQsYj10LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQ9dC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPSJzY3JpcHQiK2Mubm93KCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7dmFyIGY9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGg9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGw9dC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSwKaz1sLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2lmKCEoIWZ8fCFmLmxlbmd0aHx8IWgpKXtjLnN1cHBvcnQ9e2xlYWRpbmdXaGl0ZXNwYWNlOmQuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi9yZWQvLnRlc3QoaC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmguZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1JC8udGVzdChoLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhaC5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0udmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmsuc2VsZWN0ZWQsZGVsZXRlRXhwYW5kbzp0cnVlLG9wdERpc2FibGVkOmZhbHNlLGNoZWNrQ2xvbmU6ZmFsc2UsCnNjcmlwdEV2YWw6ZmFsc2Usbm9DbG9uZUV2ZW50OnRydWUsYm94TW9kZWw6bnVsbCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OmZhbHNlLHNocmlua1dyYXBCbG9ja3M6ZmFsc2UscmVsaWFibGVIaWRkZW5PZmZzZXRzOnRydWV9O2wuZGlzYWJsZWQ9dHJ1ZTtjLnN1cHBvcnQub3B0RGlzYWJsZWQ9IWsuZGlzYWJsZWQ7Yi50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO3RyeXtiLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUoIndpbmRvdy4iK2UrIj0xOyIpKX1jYXRjaChvKXt9YS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2lmKEVbZV0pe2Muc3VwcG9ydC5zY3JpcHRFdmFsPXRydWU7ZGVsZXRlIEVbZV19dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goeCl7Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG89ZmFsc2V9YS5yZW1vdmVDaGlsZChiKTtpZihkLmF0dGFjaEV2ZW50JiZkLmZpcmVFdmVudCl7ZC5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24gcigpe2Muc3VwcG9ydC5ub0Nsb25lRXZlbnQ9CmZhbHNlO2QuZGV0YWNoRXZlbnQoIm9uY2xpY2siLHIpfSk7ZC5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJvbmNsaWNrIil9ZD10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaW5uZXJIVE1MPSI8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3JhZGlvdGVzdCcgY2hlY2tlZD0nY2hlY2tlZCcvPiI7YT10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTthLmFwcGVuZENoaWxkKGQuZmlyc3RDaGlsZCk7Yy5zdXBwb3J0LmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUodHJ1ZSkuY2xvbmVOb2RlKHRydWUpLmxhc3RDaGlsZC5jaGVja2VkO2MoZnVuY3Rpb24oKXt2YXIgcj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Iuc3R5bGUud2lkdGg9ci5zdHlsZS5wYWRkaW5nTGVmdD0iMXB4Ijt0LmJvZHkuYXBwZW5kQ2hpbGQocik7Yy5ib3hNb2RlbD1jLnN1cHBvcnQuYm94TW9kZWw9ci5vZmZzZXRXaWR0aD09PTI7aWYoInpvb20iaW4gci5zdHlsZSl7ci5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiO3Iuc3R5bGUuem9vbT0KMTtjLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dD1yLm9mZnNldFdpZHRoPT09MjtyLnN0eWxlLmRpc3BsYXk9IiI7ci5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7Yy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3M9ci5vZmZzZXRXaWR0aCE9PTJ9ci5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+Ijt2YXIgQT1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9QVswXS5vZmZzZXRIZWlnaHQ9PT0wO0FbMF0uc3R5bGUuZGlzcGxheT0iIjtBWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9Yy5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmQVswXS5vZmZzZXRIZWlnaHQ9PT0wO3IuaW5uZXJIVE1MPSIiO3QuYm9keS5yZW1vdmVDaGlsZChyKS5zdHlsZS5kaXNwbGF5PQoibm9uZSJ9KTthPWZ1bmN0aW9uKHIpe3ZhciBBPXQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cj0ib24iK3I7dmFyIEM9ciBpbiBBO2lmKCFDKXtBLnNldEF0dHJpYnV0ZShyLCJyZXR1cm47Iik7Qz10eXBlb2YgQVtyXT09PSJmdW5jdGlvbiJ9cmV0dXJuIEN9O2Muc3VwcG9ydC5zdWJtaXRCdWJibGVzPWEoInN1Ym1pdCIpO2Muc3VwcG9ydC5jaGFuZ2VCdWJibGVzPWEoImNoYW5nZSIpO2E9Yj1kPWY9aD1udWxsfX0pKCk7dmFyIHJhPXt9LEphPS9eKD86XHsuKlx9fFxbLipcXSkkLztjLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrYy5ub3coKSxub0RhdGE6e2VtYmVkOnRydWUsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDp0cnVlfSxkYXRhOmZ1bmN0aW9uKGEsYixkKXtpZihjLmFjY2VwdERhdGEoYSkpe2E9YT09RT9yYTphO3ZhciBlPWEubm9kZVR5cGUsZj1lP2FbYy5leHBhbmRvXTpudWxsLGg9CmMuY2FjaGU7aWYoIShlJiYhZiYmdHlwZW9mIGI9PT0ic3RyaW5nIiYmZD09PUIpKXtpZihlKWZ8fChhW2MuZXhwYW5kb109Zj0rK2MudXVpZCk7ZWxzZSBoPWE7aWYodHlwZW9mIGI9PT0ib2JqZWN0IilpZihlKWhbZl09Yy5leHRlbmQoaFtmXSxiKTtlbHNlIGMuZXh0ZW5kKGgsYik7ZWxzZSBpZihlJiYhaFtmXSloW2ZdPXt9O2E9ZT9oW2ZdOmg7aWYoZCE9PUIpYVtiXT1kO3JldHVybiB0eXBlb2YgYj09PSJzdHJpbmciP2FbYl06YX19fSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7aWYoYy5hY2NlcHREYXRhKGEpKXthPWE9PUU/cmE6YTt2YXIgZD1hLm5vZGVUeXBlLGU9ZD9hW2MuZXhwYW5kb106YSxmPWMuY2FjaGUsaD1kP2ZbZV06ZTtpZihiKXtpZihoKXtkZWxldGUgaFtiXTtkJiZjLmlzRW1wdHlPYmplY3QoaCkmJmMucmVtb3ZlRGF0YShhKX19ZWxzZSBpZihkJiZjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbylkZWxldGUgYVtjLmV4cGFuZG9dO2Vsc2UgaWYoYS5yZW1vdmVBdHRyaWJ1dGUpYS5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTsKZWxzZSBpZihkKWRlbGV0ZSBmW2VdO2Vsc2UgZm9yKHZhciBsIGluIGEpZGVsZXRlIGFbbF19fSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4hKGI9PT10cnVlfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpIT09Yil9cmV0dXJuIHRydWV9fSk7Yy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1udWxsO2lmKHR5cGVvZiBhPT09InVuZGVmaW5lZCIpe2lmKHRoaXMubGVuZ3RoKXt2YXIgZT10aGlzWzBdLmF0dHJpYnV0ZXMsZjtkPWMuZGF0YSh0aGlzWzBdKTtmb3IodmFyIGg9MCxsPWUubGVuZ3RoO2g8bDtoKyspe2Y9ZVtoXS5uYW1lO2lmKGYuaW5kZXhPZigiZGF0YS0iKT09PTApe2Y9Zi5zdWJzdHIoNSk7a2EodGhpc1swXSxmLGRbZl0pfX19cmV0dXJuIGR9ZWxzZSBpZih0eXBlb2YgYT09PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRhdGEodGhpcywKYSl9KTt2YXIgaz1hLnNwbGl0KCIuIik7a1sxXT1rWzFdPyIuIitrWzFdOiIiO2lmKGI9PT1CKXtkPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2tbMV0rIiEiLFtrWzBdXSk7aWYoZD09PUImJnRoaXMubGVuZ3RoKXtkPWMuZGF0YSh0aGlzWzBdLGEpO2Q9a2EodGhpc1swXSxhLGQpfXJldHVybiBkPT09QiYma1sxXT90aGlzLmRhdGEoa1swXSk6ZH1lbHNlIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbz1jKHRoaXMpLHg9W2tbMF0sYl07by50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIra1sxXSsiISIseCk7Yy5kYXRhKHRoaXMsYSxiKTtvLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitrWzFdKyIhIix4KX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pO2MuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsZCl7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIjt2YXIgZT0KYy5kYXRhKGEsYik7aWYoIWQpcmV0dXJuIGV8fFtdO2lmKCFlfHxjLmlzQXJyYXkoZCkpZT1jLmRhdGEoYSxiLGMubWFrZUFycmF5KGQpKTtlbHNlIGUucHVzaChkKTtyZXR1cm4gZX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGQ9Yy5xdWV1ZShhLGIpLGU9ZC5zaGlmdCgpO2lmKGU9PT0iaW5wcm9ncmVzcyIpZT1kLnNoaWZ0KCk7aWYoZSl7Yj09PSJmeCImJmQudW5zaGlmdCgiaW5wcm9ncmVzcyIpO2UuY2FsbChhLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKGEsYil9KX19fSk7Yy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPT0ic3RyaW5nIil7Yj1hO2E9ImZ4In1pZihiPT09QilyZXR1cm4gYy5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1jLnF1ZXVlKHRoaXMsYSxiKTthPT09ImZ4IiYmZFswXSE9PSJpbnByb2dyZXNzIiYmYy5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKHRoaXMsCmEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1jLmZ4P2MuZnguc3BlZWRzW2FdfHxhOmE7Yj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmRlcXVldWUoZCxiKX0sYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX19KTt2YXIgc2E9L1tcblx0XS9nLGhhPS9ccysvLFNhPS9cci9nLFRhPS9eKD86aHJlZnxzcmN8c3R5bGUpJC8sVWE9L14oPzpidXR0b258aW5wdXQpJC9pLFZhPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLFdhPS9eYSg/OnJlYSk/JC9pLHRhPS9eKD86cmFkaW98Y2hlY2tib3gpJC9pO2MucHJvcHM9eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsCmNvbHNwYW46ImNvbFNwYW4iLHRhYmluZGV4OiJ0YWJJbmRleCIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciJ9O2MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuYWNjZXNzKHRoaXMsYSxiLHRydWUsYy5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5hdHRyKHRoaXMsYSwiIik7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGEpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHgpe3ZhciByPWModGhpcyk7ci5hZGRDbGFzcyhhLmNhbGwodGhpcyx4LHIuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nIilmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChoYSksZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7dmFyIGY9dGhpc1tkXTtpZihmLm5vZGVUeXBlPT09CjEpaWYoZi5jbGFzc05hbWUpe2Zvcih2YXIgaD0iICIrZi5jbGFzc05hbWUrIiAiLGw9Zi5jbGFzc05hbWUsaz0wLG89Yi5sZW5ndGg7azxvO2srKylpZihoLmluZGV4T2YoIiAiK2Jba10rIiAiKTwwKWwrPSIgIitiW2tdO2YuY2xhc3NOYW1lPWMudHJpbShsKX1lbHNlIGYuY2xhc3NOYW1lPWF9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG8pe3ZhciB4PWModGhpcyk7eC5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxvLHguYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nInx8YT09PUIpZm9yKHZhciBiPShhfHwiIikuc3BsaXQoaGEpLGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe3ZhciBmPXRoaXNbZF07aWYoZi5ub2RlVHlwZT09PTEmJmYuY2xhc3NOYW1lKWlmKGEpe2Zvcih2YXIgaD0oIiAiK2YuY2xhc3NOYW1lKyIgIikucmVwbGFjZShzYSwiICIpLApsPTAsaz1iLmxlbmd0aDtsPGs7bCsrKWg9aC5yZXBsYWNlKCIgIitiW2xdKyIgIiwiICIpO2YuY2xhc3NOYW1lPWMudHJpbShoKX1lbHNlIGYuY2xhc3NOYW1lPSIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhLGU9dHlwZW9mIGI9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZil7dmFyIGg9Yyh0aGlzKTtoLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGYsaC5hdHRyKCJjbGFzcyIpLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGQ9PT0ic3RyaW5nIilmb3IodmFyIGYsaD0wLGw9Yyh0aGlzKSxrPWIsbz1hLnNwbGl0KGhhKTtmPW9baCsrXTspe2s9ZT9rOiFsLmhhc0NsYXNzKGYpO2xbaz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGYpfWVsc2UgaWYoZD09PSJ1bmRlZmluZWQifHxkPT09ImJvb2xlYW4iKXt0aGlzLmNsYXNzTmFtZSYmYy5kYXRhKHRoaXMsCiJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSk7dGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT1mYWxzZT8iIjpjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn19KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsZD10aGlzLmxlbmd0aDtiPGQ7YisrKWlmKCgiICIrdGhpc1tiXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHNhLCIgIikuaW5kZXhPZihhKT4tMSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9LHZhbDpmdW5jdGlvbihhKXtpZighYXJndW1lbnRzLmxlbmd0aCl7dmFyIGI9dGhpc1swXTtpZihiKXtpZihjLm5vZGVOYW1lKGIsIm9wdGlvbiIpKXt2YXIgZD1iLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWR8fGQuc3BlY2lmaWVkP2IudmFsdWU6Yi50ZXh0fWlmKGMubm9kZU5hbWUoYiwic2VsZWN0Iikpe3ZhciBlPWIuc2VsZWN0ZWRJbmRleDtkPVtdO3ZhciBmPWIub3B0aW9ucztiPWIudHlwZT09PSJzZWxlY3Qtb25lIjsKaWYoZTwwKXJldHVybiBudWxsO3ZhciBoPWI/ZTowO2ZvcihlPWI/ZSsxOmYubGVuZ3RoO2g8ZTtoKyspe3ZhciBsPWZbaF07aWYobC5zZWxlY3RlZCYmKGMuc3VwcG9ydC5vcHREaXNhYmxlZD8hbC5kaXNhYmxlZDpsLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWwucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWMubm9kZU5hbWUobC5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7YT1jKGwpLnZhbCgpO2lmKGIpcmV0dXJuIGE7ZC5wdXNoKGEpfX1yZXR1cm4gZH1pZih0YS50ZXN0KGIudHlwZSkmJiFjLnN1cHBvcnQuY2hlY2tPbilyZXR1cm4gYi5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6Yi52YWx1ZTtyZXR1cm4oYi52YWx1ZXx8IiIpLnJlcGxhY2UoU2EsIiIpfXJldHVybiBCfXZhciBrPWMuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG8pe3ZhciB4PWModGhpcykscj1hO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtpZihrKXI9CmEuY2FsbCh0aGlzLG8seC52YWwoKSk7aWYocj09bnVsbClyPSIiO2Vsc2UgaWYodHlwZW9mIHI9PT0ibnVtYmVyIilyKz0iIjtlbHNlIGlmKGMuaXNBcnJheShyKSlyPWMubWFwKHIsZnVuY3Rpb24oQyl7cmV0dXJuIEM9PW51bGw/IiI6QysiIn0pO2lmKGMuaXNBcnJheShyKSYmdGEudGVzdCh0aGlzLnR5cGUpKXRoaXMuY2hlY2tlZD1jLmluQXJyYXkoeC52YWwoKSxyKT49MDtlbHNlIGlmKGMubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciBBPWMubWFrZUFycmF5KHIpO2MoIm9wdGlvbiIsdGhpcykuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Yy5pbkFycmF5KGModGhpcykudmFsKCksQSk+PTB9KTtpZighQS5sZW5ndGgpdGhpcy5zZWxlY3RlZEluZGV4PS0xfWVsc2UgdGhpcy52YWx1ZT1yfX0pfX0pO2MuZXh0ZW5kKHthdHRyRm46e3ZhbDp0cnVlLGNzczp0cnVlLGh0bWw6dHJ1ZSx0ZXh0OnRydWUsZGF0YTp0cnVlLHdpZHRoOnRydWUsaGVpZ2h0OnRydWUsb2Zmc2V0OnRydWV9LAphdHRyOmZ1bmN0aW9uKGEsYixkLGUpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIEI7aWYoZSYmYiBpbiBjLmF0dHJGbilyZXR1cm4gYyhhKVtiXShkKTtlPWEubm9kZVR5cGUhPT0xfHwhYy5pc1hNTERvYyhhKTt2YXIgZj1kIT09QjtiPWUmJmMucHJvcHNbYl18fGI7dmFyIGg9VGEudGVzdChiKTtpZigoYiBpbiBhfHxhW2JdIT09QikmJmUmJiFoKXtpZihmKXtiPT09InR5cGUiJiZVYS50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUmJmMuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2lmKGQ9PT1udWxsKWEubm9kZVR5cGU9PT0xJiZhLnJlbW92ZUF0dHJpYnV0ZShiKTtlbHNlIGFbYl09ZH1pZihjLm5vZGVOYW1lKGEsImZvcm0iKSYmYS5nZXRBdHRyaWJ1dGVOb2RlKGIpKXJldHVybiBhLmdldEF0dHJpYnV0ZU5vZGUoYikubm9kZVZhbHVlO2lmKGI9PT0idGFiSW5kZXgiKXJldHVybihiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKSkmJgpiLnNwZWNpZmllZD9iLnZhbHVlOlZhLnRlc3QoYS5ub2RlTmFtZSl8fFdhLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOkI7cmV0dXJuIGFbYl19aWYoIWMuc3VwcG9ydC5zdHlsZSYmZSYmYj09PSJzdHlsZSIpe2lmKGYpYS5zdHlsZS5jc3NUZXh0PSIiK2Q7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dH1mJiZhLnNldEF0dHJpYnV0ZShiLCIiK2QpO2lmKCFhLmF0dHJpYnV0ZXNbYl0mJmEuaGFzQXR0cmlidXRlJiYhYS5oYXNBdHRyaWJ1dGUoYikpcmV0dXJuIEI7YT0hYy5zdXBwb3J0LmhyZWZOb3JtYWxpemVkJiZlJiZoP2EuZ2V0QXR0cmlidXRlKGIsMik6YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIGE9PT1udWxsP0I6YX19KTt2YXIgWD0vXC4oLiopJC8saWE9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLExhPS9cLi9nLE1hPS8gL2csWGE9L1teXHdccy58YF0vZyxZYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKFhhLCJcXCQmIil9LHVhPXtmb2N1c2luOjAsZm9jdXNvdXQ6MH07CmMuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGIsZCxlKXtpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OCkpe2lmKGMuaXNXaW5kb3coYSkmJmEhPT1FJiYhYS5mcmFtZUVsZW1lbnQpYT1FO2lmKGQ9PT1mYWxzZSlkPVU7ZWxzZSBpZighZClyZXR1cm47dmFyIGYsaDtpZihkLmhhbmRsZXIpe2Y9ZDtkPWYuaGFuZGxlcn1pZighZC5ndWlkKWQuZ3VpZD1jLmd1aWQrKztpZihoPWMuZGF0YShhKSl7dmFyIGw9YS5ub2RlVHlwZT8iZXZlbnRzIjoiX19ldmVudHNfXyIsaz1oW2xdLG89aC5oYW5kbGU7aWYodHlwZW9mIGs9PT0iZnVuY3Rpb24iKXtvPWsuaGFuZGxlO2s9ay5ldmVudHN9ZWxzZSBpZighayl7YS5ub2RlVHlwZXx8KGhbbF09aD1mdW5jdGlvbigpe30pO2guZXZlbnRzPWs9e319aWYoIW8paC5oYW5kbGU9bz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgYyE9PSJ1bmRlZmluZWQiJiYhYy5ldmVudC50cmlnZ2VyZWQ/Yy5ldmVudC5oYW5kbGUuYXBwbHkoby5lbGVtLAphcmd1bWVudHMpOkJ9O28uZWxlbT1hO2I9Yi5zcGxpdCgiICIpO2Zvcih2YXIgeD0wLHI7bD1iW3grK107KXtoPWY/Yy5leHRlbmQoe30sZik6e2hhbmRsZXI6ZCxkYXRhOmV9O2lmKGwuaW5kZXhPZigiLiIpPi0xKXtyPWwuc3BsaXQoIi4iKTtsPXIuc2hpZnQoKTtoLm5hbWVzcGFjZT1yLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIil9ZWxzZXtyPVtdO2gubmFtZXNwYWNlPSIifWgudHlwZT1sO2lmKCFoLmd1aWQpaC5ndWlkPWQuZ3VpZDt2YXIgQT1rW2xdLEM9Yy5ldmVudC5zcGVjaWFsW2xdfHx7fTtpZighQSl7QT1rW2xdPVtdO2lmKCFDLnNldHVwfHxDLnNldHVwLmNhbGwoYSxlLHIsbyk9PT1mYWxzZSlpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKGwsbyxmYWxzZSk7ZWxzZSBhLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxvKX1pZihDLmFkZCl7Qy5hZGQuY2FsbChhLGgpO2lmKCFoLmhhbmRsZXIuZ3VpZCloLmhhbmRsZXIuZ3VpZD0KZC5ndWlkfUEucHVzaChoKTtjLmV2ZW50Lmdsb2JhbFtsXT10cnVlfWE9bnVsbH19fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixkLGUpe2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KSl7aWYoZD09PWZhbHNlKWQ9VTt2YXIgZixoLGw9MCxrLG8seCxyLEEsQyxKPWEubm9kZVR5cGU/ImV2ZW50cyI6Il9fZXZlbnRzX18iLHc9Yy5kYXRhKGEpLEk9dyYmd1tKXTtpZih3JiZJKXtpZih0eXBlb2YgST09PSJmdW5jdGlvbiIpe3c9STtJPUkuZXZlbnRzfWlmKGImJmIudHlwZSl7ZD1iLmhhbmRsZXI7Yj1iLnR5cGV9aWYoIWJ8fHR5cGVvZiBiPT09InN0cmluZyImJmIuY2hhckF0KDApPT09Ii4iKXtiPWJ8fCIiO2ZvcihmIGluIEkpYy5ldmVudC5yZW1vdmUoYSxmK2IpfWVsc2V7Zm9yKGI9Yi5zcGxpdCgiICIpO2Y9YltsKytdOyl7cj1mO2s9Zi5pbmRleE9mKCIuIik8MDtvPVtdO2lmKCFrKXtvPWYuc3BsaXQoIi4iKTtmPW8uc2hpZnQoKTt4PVJlZ0V4cCgiKF58XFwuKSIrCmMubWFwKG8uc2xpY2UoMCkuc29ydCgpLFlhKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKX1pZihBPUlbZl0paWYoZCl7cj1jLmV2ZW50LnNwZWNpYWxbZl18fHt9O2ZvcihoPWV8fDA7aDxBLmxlbmd0aDtoKyspe0M9QVtoXTtpZihkLmd1aWQ9PT1DLmd1aWQpe2lmKGt8fHgudGVzdChDLm5hbWVzcGFjZSkpe2U9PW51bGwmJkEuc3BsaWNlKGgtLSwxKTtyLnJlbW92ZSYmci5yZW1vdmUuY2FsbChhLEMpfWlmKGUhPW51bGwpYnJlYWt9fWlmKEEubGVuZ3RoPT09MHx8ZSE9bnVsbCYmQS5sZW5ndGg9PT0xKXtpZighci50ZWFyZG93bnx8ci50ZWFyZG93bi5jYWxsKGEsbyk9PT1mYWxzZSljLnJlbW92ZUV2ZW50KGEsZix3LmhhbmRsZSk7ZGVsZXRlIElbZl19fWVsc2UgZm9yKGg9MDtoPEEubGVuZ3RoO2grKyl7Qz1BW2hdO2lmKGt8fHgudGVzdChDLm5hbWVzcGFjZSkpe2MuZXZlbnQucmVtb3ZlKGEscixDLmhhbmRsZXIsaCk7QS5zcGxpY2UoaC0tLDEpfX19aWYoYy5pc0VtcHR5T2JqZWN0KEkpKXtpZihiPQp3LmhhbmRsZSliLmVsZW09bnVsbDtkZWxldGUgdy5ldmVudHM7ZGVsZXRlIHcuaGFuZGxlO2lmKHR5cGVvZiB3PT09ImZ1bmN0aW9uIiljLnJlbW92ZURhdGEoYSxKKTtlbHNlIGMuaXNFbXB0eU9iamVjdCh3KSYmYy5yZW1vdmVEYXRhKGEpfX19fX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1hLnR5cGV8fGE7aWYoIWUpe2E9dHlwZW9mIGE9PT0ib2JqZWN0Ij9hW2MuZXhwYW5kb10/YTpjLmV4dGVuZChjLkV2ZW50KGYpLGEpOmMuRXZlbnQoZik7aWYoZi5pbmRleE9mKCIhIik+PTApe2EudHlwZT1mPWYuc2xpY2UoMCwtMSk7YS5leGNsdXNpdmU9dHJ1ZX1pZighZCl7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50Lmdsb2JhbFtmXSYmYy5lYWNoKGMuY2FjaGUsZnVuY3Rpb24oKXt0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbZl0mJmMuZXZlbnQudHJpZ2dlcihhLGIsdGhpcy5oYW5kbGUuZWxlbSl9KX1pZighZHx8ZC5ub2RlVHlwZT09PTN8fGQubm9kZVR5cGU9PT0KOClyZXR1cm4gQjthLnJlc3VsdD1CO2EudGFyZ2V0PWQ7Yj1jLm1ha2VBcnJheShiKTtiLnVuc2hpZnQoYSl9YS5jdXJyZW50VGFyZ2V0PWQ7KGU9ZC5ub2RlVHlwZT9jLmRhdGEoZCwiaGFuZGxlIik6KGMuZGF0YShkLCJfX2V2ZW50c19fIil8fHt9KS5oYW5kbGUpJiZlLmFwcGx5KGQsYik7ZT1kLnBhcmVudE5vZGV8fGQub3duZXJEb2N1bWVudDt0cnl7aWYoIShkJiZkLm5vZGVOYW1lJiZjLm5vRGF0YVtkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSlpZihkWyJvbiIrZl0mJmRbIm9uIitmXS5hcHBseShkLGIpPT09ZmFsc2Upe2EucmVzdWx0PWZhbHNlO2EucHJldmVudERlZmF1bHQoKX19Y2F0Y2goaCl7fWlmKCFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmUpYy5ldmVudC50cmlnZ2VyKGEsYixlLHRydWUpO2Vsc2UgaWYoIWEuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBsO2U9YS50YXJnZXQ7dmFyIGs9Zi5yZXBsYWNlKFgsIiIpLG89Yy5ub2RlTmFtZShlLCJhIikmJms9PT0KImNsaWNrIix4PWMuZXZlbnQuc3BlY2lhbFtrXXx8e307aWYoKCF4Ll9kZWZhdWx0fHx4Ll9kZWZhdWx0LmNhbGwoZCxhKT09PWZhbHNlKSYmIW8mJiEoZSYmZS5ub2RlTmFtZSYmYy5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpe3RyeXtpZihlW2tdKXtpZihsPWVbIm9uIitrXSllWyJvbiIra109bnVsbDtjLmV2ZW50LnRyaWdnZXJlZD10cnVlO2Vba10oKX19Y2F0Y2gocil7fWlmKGwpZVsib24iK2tdPWw7Yy5ldmVudC50cmlnZ2VyZWQ9ZmFsc2V9fX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmO2Q9W107dmFyIGg9Yy5tYWtlQXJyYXkoYXJndW1lbnRzKTthPWhbMF09Yy5ldmVudC5maXgoYXx8RS5ldmVudCk7YS5jdXJyZW50VGFyZ2V0PXRoaXM7Yj1hLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFhLmV4Y2x1c2l2ZTtpZighYil7ZT1hLnR5cGUuc3BsaXQoIi4iKTthLnR5cGU9ZS5zaGlmdCgpO2Q9ZS5zbGljZSgwKS5zb3J0KCk7ZT1SZWdFeHAoIihefFxcLikiKwpkLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWEubmFtZXNwYWNlPWEubmFtZXNwYWNlfHxkLmpvaW4oIi4iKTtmPWMuZGF0YSh0aGlzLHRoaXMubm9kZVR5cGU/ImV2ZW50cyI6Il9fZXZlbnRzX18iKTtpZih0eXBlb2YgZj09PSJmdW5jdGlvbiIpZj1mLmV2ZW50cztkPShmfHx7fSlbYS50eXBlXTtpZihmJiZkKXtkPWQuc2xpY2UoMCk7Zj0wO2Zvcih2YXIgbD1kLmxlbmd0aDtmPGw7ZisrKXt2YXIgaz1kW2ZdO2lmKGJ8fGUudGVzdChrLm5hbWVzcGFjZSkpe2EuaGFuZGxlcj1rLmhhbmRsZXI7YS5kYXRhPWsuZGF0YTthLmhhbmRsZU9iaj1rO2s9ay5oYW5kbGVyLmFwcGx5KHRoaXMsaCk7aWYoayE9PUIpe2EucmVzdWx0PWs7aWYoaz09PWZhbHNlKXthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKX19aWYoYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX19cmV0dXJuIGEucmVzdWx0fSxwcm9wczoiYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIGxheWVyWCBsYXllclkgbWV0YUtleSBuZXdWYWx1ZSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRvRWxlbWVudCB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIiksCmZpeDpmdW5jdGlvbihhKXtpZihhW2MuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGI9YTthPWMuRXZlbnQoYik7Zm9yKHZhciBkPXRoaXMucHJvcHMubGVuZ3RoLGU7ZDspe2U9dGhpcy5wcm9wc1stLWRdO2FbZV09YltlXX1pZighYS50YXJnZXQpYS50YXJnZXQ9YS5zcmNFbGVtZW50fHx0O2lmKGEudGFyZ2V0Lm5vZGVUeXBlPT09MylhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlO2lmKCFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQpYS5yZWxhdGVkVGFyZ2V0PWEuZnJvbUVsZW1lbnQ9PT1hLnRhcmdldD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50O2lmKGEucGFnZVg9PW51bGwmJmEuY2xpZW50WCE9bnVsbCl7Yj10LmRvY3VtZW50RWxlbWVudDtkPXQuYm9keTthLnBhZ2VYPWEuY2xpZW50WCsoYiYmYi5zY3JvbGxMZWZ0fHxkJiZkLnNjcm9sbExlZnR8fDApLShiJiZiLmNsaWVudExlZnR8fGQmJmQuY2xpZW50TGVmdHx8MCk7YS5wYWdlWT1hLmNsaWVudFkrKGImJmIuc2Nyb2xsVG9wfHwKZCYmZC5zY3JvbGxUb3B8fDApLShiJiZiLmNsaWVudFRvcHx8ZCYmZC5jbGllbnRUb3B8fDApfWlmKGEud2hpY2g9PW51bGwmJihhLmNoYXJDb2RlIT1udWxsfHxhLmtleUNvZGUhPW51bGwpKWEud2hpY2g9YS5jaGFyQ29kZSE9bnVsbD9hLmNoYXJDb2RlOmEua2V5Q29kZTtpZighYS5tZXRhS2V5JiZhLmN0cmxLZXkpYS5tZXRhS2V5PWEuY3RybEtleTtpZighYS53aGljaCYmYS5idXR0b24hPT1CKWEud2hpY2g9YS5idXR0b24mMT8xOmEuYnV0dG9uJjI/MzphLmJ1dHRvbiY0PzI6MDtyZXR1cm4gYX0sZ3VpZDoxRTgscHJveHk6Yy5wcm94eSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Yy5iaW5kUmVhZHksdGVhcmRvd246Yy5ub29wfSxsaXZlOnthZGQ6ZnVuY3Rpb24oYSl7Yy5ldmVudC5hZGQodGhpcyxZKGEub3JpZ1R5cGUsYS5zZWxlY3RvciksYy5leHRlbmQoe30sYSx7aGFuZGxlcjpLYSxndWlkOmEuaGFuZGxlci5ndWlkfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7Yy5ldmVudC5yZW1vdmUodGhpcywKWShhLm9yaWdUeXBlLGEuc2VsZWN0b3IpLGEpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsZCl7aWYoYy5pc1dpbmRvdyh0aGlzKSl0aGlzLm9uYmVmb3JldW5sb2FkPWR9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vbmJlZm9yZXVubG9hZD09PWIpdGhpcy5vbmJlZm9yZXVubG9hZD1udWxsfX19fTtjLnJlbW92ZUV2ZW50PXQucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixkLGZhbHNlKX06ZnVuY3Rpb24oYSxiLGQpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGQpfTtjLkV2ZW50PWZ1bmN0aW9uKGEpe2lmKCF0aGlzLnByZXZlbnREZWZhdWx0KXJldHVybiBuZXcgYy5FdmVudChhKTtpZihhJiZhLnR5cGUpe3RoaXMub3JpZ2luYWxFdmVudD1hO3RoaXMudHlwZT1hLnR5cGV9ZWxzZSB0aGlzLnR5cGU9YTt0aGlzLnRpbWVTdGFtcD0KYy5ub3coKTt0aGlzW2MuZXhwYW5kb109dHJ1ZX07Yy5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Y2E7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpaWYoYS5wcmV2ZW50RGVmYXVsdClhLnByZXZlbnREZWZhdWx0KCk7ZWxzZSBhLnJldHVyblZhbHVlPWZhbHNlfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWNhO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDtpZihhKXthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKTthLmNhbmNlbEJ1YmJsZT10cnVlfX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1jYTt0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6VSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpVLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOlV9Owp2YXIgdmE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZWxhdGVkVGFyZ2V0O3RyeXtmb3IoO2ImJmIhPT10aGlzOyliPWIucGFyZW50Tm9kZTtpZihiIT09dGhpcyl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWNhdGNoKGQpe319LHdhPWZ1bmN0aW9uKGEpe2EudHlwZT1hLmRhdGE7Yy5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2MuZXZlbnQuc3BlY2lhbFthXT17c2V0dXA6ZnVuY3Rpb24oZCl7Yy5ldmVudC5hZGQodGhpcyxiLGQmJmQuc2VsZWN0b3I/d2E6dmEsYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGQpe2MuZXZlbnQucmVtb3ZlKHRoaXMsYixkJiZkLnNlbGVjdG9yP3dhOnZhKX19fSk7aWYoIWMuc3VwcG9ydC5zdWJtaXRCdWJibGVzKWMuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09CiJmb3JtIil7Yy5ldmVudC5hZGQodGhpcywiY2xpY2suc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0ic3VibWl0Inx8ZD09PSJpbWFnZSIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgpe2EubGl2ZUZpcmVkPUI7cmV0dXJuIGxhKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX19KTtjLmV2ZW50LmFkZCh0aGlzLCJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZigoZD09PSJ0ZXh0Inx8ZD09PSJwYXNzd29yZCIpJiZjKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJmEua2V5Q29kZT09PTEzKXthLmxpdmVGaXJlZD1CO3JldHVybiBsYSgic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9fSl9ZWxzZSByZXR1cm4gZmFsc2V9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxTdWJtaXQiKX19O2lmKCFjLnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIFYsCnhhPWZ1bmN0aW9uKGEpe3ZhciBiPWEudHlwZSxkPWEudmFsdWU7aWYoYj09PSJyYWRpbyJ8fGI9PT0iY2hlY2tib3giKWQ9YS5jaGVja2VkO2Vsc2UgaWYoYj09PSJzZWxlY3QtbXVsdGlwbGUiKWQ9YS5zZWxlY3RlZEluZGV4Pi0xP2MubWFwKGEub3B0aW9ucyxmdW5jdGlvbihlKXtyZXR1cm4gZS5zZWxlY3RlZH0pLmpvaW4oIi0iKToiIjtlbHNlIGlmKGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKWQ9YS5zZWxlY3RlZEluZGV4O3JldHVybiBkfSxaPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YS50YXJnZXQsZSxmO2lmKCEoIWlhLnRlc3QoZC5ub2RlTmFtZSl8fGQucmVhZE9ubHkpKXtlPWMuZGF0YShkLCJfY2hhbmdlX2RhdGEiKTtmPXhhKGQpO2lmKGEudHlwZSE9PSJmb2N1c291dCJ8fGQudHlwZSE9PSJyYWRpbyIpYy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsZik7aWYoIShlPT09Qnx8Zj09PWUpKWlmKGUhPW51bGx8fGYpe2EudHlwZT0iY2hhbmdlIjthLmxpdmVGaXJlZD0KQjtyZXR1cm4gYy5ldmVudC50cmlnZ2VyKGEsYixkKX19fTtjLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDpaLGJlZm9yZWRlYWN0aXZhdGU6WixjbGljazpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZihkPT09InJhZGlvInx8ZD09PSJjaGVja2JveCJ8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxlY3QiKXJldHVybiBaLmNhbGwodGhpcyxhKX0sa2V5ZG93bjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZihhLmtleUNvZGU9PT0xMyYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09InRleHRhcmVhInx8YS5rZXlDb2RlPT09MzImJihkPT09ImNoZWNrYm94Inx8ZD09PSJyYWRpbyIpfHxkPT09InNlbGVjdC1tdWx0aXBsZSIpcmV0dXJuIFouY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuZGF0YShhLCJfY2hhbmdlX2RhdGEiLHhhKGEpKX19LHNldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy50eXBlPT09CiJmaWxlIilyZXR1cm4gZmFsc2U7Zm9yKHZhciBhIGluIFYpYy5ldmVudC5hZGQodGhpcyxhKyIuc3BlY2lhbENoYW5nZSIsVlthXSk7cmV0dXJuIGlhLnRlc3QodGhpcy5ub2RlTmFtZSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxDaGFuZ2UiKTtyZXR1cm4gaWEudGVzdCh0aGlzLm5vZGVOYW1lKX19O1Y9Yy5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzO1YuZm9jdXM9Vi5iZWZvcmVhY3RpdmF0ZX10LmFkZEV2ZW50TGlzdGVuZXImJmMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGUpe2U9Yy5ldmVudC5maXgoZSk7ZS50eXBlPWI7cmV0dXJuIGMuZXZlbnQudHJpZ2dlcihlLG51bGwsZS50YXJnZXQpfWMuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt1YVtiXSsrPT09MCYmdC5hZGRFdmVudExpc3RlbmVyKGEsZCx0cnVlKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLXVhW2JdPT09CjAmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGQsdHJ1ZSl9fX0pO2MuZWFjaChbImJpbmQiLCJvbmUiXSxmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCxlLGYpe2lmKHR5cGVvZiBkPT09Im9iamVjdCIpe2Zvcih2YXIgaCBpbiBkKXRoaXNbYl0oaCxlLGRbaF0sZik7cmV0dXJuIHRoaXN9aWYoYy5pc0Z1bmN0aW9uKGUpfHxlPT09ZmFsc2Upe2Y9ZTtlPUJ9dmFyIGw9Yj09PSJvbmUiP2MucHJveHkoZixmdW5jdGlvbihvKXtjKHRoaXMpLnVuYmluZChvLGwpO3JldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pOmY7aWYoZD09PSJ1bmxvYWQiJiZiIT09Im9uZSIpdGhpcy5vbmUoZCxlLGYpO2Vsc2V7aD0wO2Zvcih2YXIgaz10aGlzLmxlbmd0aDtoPGs7aCsrKWMuZXZlbnQuYWRkKHRoaXNbaF0sZCxsLGUpfXJldHVybiB0aGlzfX0pO2MuZm4uZXh0ZW5kKHt1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09PSJvYmplY3QiJiYhYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLAphW2RdKTtlbHNle2Q9MDtmb3IodmFyIGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyljLmV2ZW50LnJlbW92ZSh0aGlzW2RdLGEsYil9cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiB0aGlzLmxpdmUoYixkLGUsYSl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLnVuYmluZCgibGl2ZSIpOnRoaXMuZGllKGIsbnVsbCxkLGEpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzWzBdKXt2YXIgZD1jLkV2ZW50KGEpO2QucHJldmVudERlZmF1bHQoKTtkLnN0b3BQcm9wYWdhdGlvbigpO2MuZXZlbnQudHJpZ2dlcihkLGIsdGhpc1swXSk7cmV0dXJuIGQucmVzdWx0fX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hcmd1bWVudHMsZD0KMTtkPGIubGVuZ3RoOyljLnByb3h5KGEsYltkKytdKTtyZXR1cm4gdGhpcy5jbGljayhjLnByb3h5KGEsZnVuY3Rpb24oZSl7dmFyIGY9KGMuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQpfHwwKSVkO2MuZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZisxKTtlLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHxmYWxzZX0pKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIHlhPXtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQiLG1vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifTtjLmVhY2goWyJsaXZlIiwiZGllIl0sZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZSxmLGgpe3ZhciBsLGs9MCxvLHgscj1ofHx0aGlzLnNlbGVjdG9yO2g9aD90aGlzOmModGhpcy5jb250ZXh0KTtpZih0eXBlb2YgZD09PQoib2JqZWN0IiYmIWQucHJldmVudERlZmF1bHQpe2ZvcihsIGluIGQpaFtiXShsLGUsZFtsXSxyKTtyZXR1cm4gdGhpc31pZihjLmlzRnVuY3Rpb24oZSkpe2Y9ZTtlPUJ9Zm9yKGQ9KGR8fCIiKS5zcGxpdCgiICIpOyhsPWRbaysrXSkhPW51bGw7KXtvPVguZXhlYyhsKTt4PSIiO2lmKG8pe3g9b1swXTtsPWwucmVwbGFjZShYLCIiKX1pZihsPT09ImhvdmVyIilkLnB1c2goIm1vdXNlZW50ZXIiK3gsIm1vdXNlbGVhdmUiK3gpO2Vsc2V7bz1sO2lmKGw9PT0iZm9jdXMifHxsPT09ImJsdXIiKXtkLnB1c2goeWFbbF0reCk7bCs9eH1lbHNlIGw9KHlhW2xdfHxsKSt4O2lmKGI9PT0ibGl2ZSIpe3g9MDtmb3IodmFyIEE9aC5sZW5ndGg7eDxBO3grKyljLmV2ZW50LmFkZChoW3hdLCJsaXZlLiIrWShsLHIpLHtkYXRhOmUsc2VsZWN0b3I6cixoYW5kbGVyOmYsb3JpZ1R5cGU6bCxvcmlnSGFuZGxlcjpmLHByZVR5cGU6b30pfWVsc2UgaC51bmJpbmQoImxpdmUuIitZKGwsciksZil9fXJldHVybiB0aGlzfX0pOwpjLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZSl7aWYoZT09bnVsbCl7ZT1kO2Q9bnVsbH1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMuYmluZChiLGQsZSk6dGhpcy50cmlnZ2VyKGIpfTtpZihjLmF0dHJGbiljLmF0dHJGbltiXT10cnVlfSk7RS5hdHRhY2hFdmVudCYmIUUuYWRkRXZlbnRMaXN0ZW5lciYmYyhFKS5iaW5kKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGMuY2FjaGUpaWYoYy5jYWNoZVthXS5oYW5kbGUpdHJ5e2MuZXZlbnQucmVtb3ZlKGMuY2FjaGVbYV0uaGFuZGxlLmVsZW0pfWNhdGNoKGIpe319KTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShnLGksbixtLHAscSl7cD0wO2Zvcih2YXIgdT1tLmxlbmd0aDtwPHU7cCsrKXt2YXIgeT1tW3BdO2lmKHkpe3ZhciBGPWZhbHNlO2Zvcih5PXlbZ107eTspe2lmKHkuc2l6Y2FjaGU9PT1uKXtGPW1beS5zaXpzZXRdO2JyZWFrfWlmKHkubm9kZVR5cGU9PT0xJiYhcSl7eS5zaXpjYWNoZT1uO3kuc2l6c2V0PXB9aWYoeS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aSl7Rj15O2JyZWFrfXk9eVtnXX1tW3BdPUZ9fX1mdW5jdGlvbiBiKGcsaSxuLG0scCxxKXtwPTA7Zm9yKHZhciB1PW0ubGVuZ3RoO3A8dTtwKyspe3ZhciB5PW1bcF07aWYoeSl7dmFyIEY9ZmFsc2U7Zm9yKHk9eVtnXTt5Oyl7aWYoeS5zaXpjYWNoZT09PW4pe0Y9bVt5LnNpenNldF07YnJlYWt9aWYoeS5ub2RlVHlwZT09PTEpe2lmKCFxKXt5LnNpemNhY2hlPW47eS5zaXpzZXQ9cH1pZih0eXBlb2YgaSE9PSJzdHJpbmciKXtpZih5PT09aSl7Rj10cnVlO2JyZWFrfX1lbHNlIGlmKGsuZmlsdGVyKGksClt5XSkubGVuZ3RoPjApe0Y9eTticmVha319eT15W2ddfW1bcF09Rn19fXZhciBkPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZT0wLGY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPWZhbHNlLGw9dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7bD1mYWxzZTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGcsaSxuLG0pe249bnx8W107dmFyIHA9aT1pfHx0O2lmKGkubm9kZVR5cGUhPT0xJiZpLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighZ3x8dHlwZW9mIGchPT0ic3RyaW5nIilyZXR1cm4gbjt2YXIgcSx1LHksRixNLE49dHJ1ZSxPPWsuaXNYTUwoaSksRD1bXSxSPWc7ZG97ZC5leGVjKCIiKTtpZihxPWQuZXhlYyhSKSl7Uj1xWzNdO0QucHVzaChxWzFdKTtpZihxWzJdKXtGPXFbM107CmJyZWFrfX19d2hpbGUocSk7aWYoRC5sZW5ndGg+MSYmeC5leGVjKGcpKWlmKEQubGVuZ3RoPT09MiYmby5yZWxhdGl2ZVtEWzBdXSl1PUwoRFswXStEWzFdLGkpO2Vsc2UgZm9yKHU9by5yZWxhdGl2ZVtEWzBdXT9baV06ayhELnNoaWZ0KCksaSk7RC5sZW5ndGg7KXtnPUQuc2hpZnQoKTtpZihvLnJlbGF0aXZlW2ddKWcrPUQuc2hpZnQoKTt1PUwoZyx1KX1lbHNle2lmKCFtJiZELmxlbmd0aD4xJiZpLm5vZGVUeXBlPT09OSYmIU8mJm8ubWF0Y2guSUQudGVzdChEWzBdKSYmIW8ubWF0Y2guSUQudGVzdChEW0QubGVuZ3RoLTFdKSl7cT1rLmZpbmQoRC5zaGlmdCgpLGksTyk7aT1xLmV4cHI/ay5maWx0ZXIocS5leHByLHEuc2V0KVswXTpxLnNldFswXX1pZihpKXtxPW0/e2V4cHI6RC5wb3AoKSxzZXQ6QyhtKX06ay5maW5kKEQucG9wKCksRC5sZW5ndGg9PT0xJiYoRFswXT09PSJ+Inx8RFswXT09PSIrIikmJmkucGFyZW50Tm9kZT9pLnBhcmVudE5vZGU6aSxPKTt1PXEuZXhwcj9rLmZpbHRlcihxLmV4cHIsCnEuc2V0KTpxLnNldDtpZihELmxlbmd0aD4wKXk9Qyh1KTtlbHNlIE49ZmFsc2U7Zm9yKDtELmxlbmd0aDspe3E9TT1ELnBvcCgpO2lmKG8ucmVsYXRpdmVbTV0pcT1ELnBvcCgpO2Vsc2UgTT0iIjtpZihxPT1udWxsKXE9aTtvLnJlbGF0aXZlW01dKHkscSxPKX19ZWxzZSB5PVtdfXl8fCh5PXUpO3l8fGsuZXJyb3IoTXx8Zyk7aWYoZi5jYWxsKHkpPT09IltvYmplY3QgQXJyYXldIilpZihOKWlmKGkmJmkubm9kZVR5cGU9PT0xKWZvcihnPTA7eVtnXSE9bnVsbDtnKyspe2lmKHlbZ10mJih5W2ddPT09dHJ1ZXx8eVtnXS5ub2RlVHlwZT09PTEmJmsuY29udGFpbnMoaSx5W2ddKSkpbi5wdXNoKHVbZ10pfWVsc2UgZm9yKGc9MDt5W2ddIT1udWxsO2crKyl5W2ddJiZ5W2ddLm5vZGVUeXBlPT09MSYmbi5wdXNoKHVbZ10pO2Vsc2Ugbi5wdXNoLmFwcGx5KG4seSk7ZWxzZSBDKHksbik7aWYoRil7ayhGLHAsbixtKTtrLnVuaXF1ZVNvcnQobil9cmV0dXJuIG59O2sudW5pcXVlU29ydD1mdW5jdGlvbihnKXtpZih3KXtoPQpsO2cuc29ydCh3KTtpZihoKWZvcih2YXIgaT0xO2k8Zy5sZW5ndGg7aSsrKWdbaV09PT1nW2ktMV0mJmcuc3BsaWNlKGktLSwxKX1yZXR1cm4gZ307ay5tYXRjaGVzPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoZyxudWxsLG51bGwsaSl9O2subWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGcsaSl7cmV0dXJuIGsoaSxudWxsLG51bGwsW2ddKS5sZW5ndGg+MH07ay5maW5kPWZ1bmN0aW9uKGcsaSxuKXt2YXIgbTtpZighZylyZXR1cm5bXTtmb3IodmFyIHA9MCxxPW8ub3JkZXIubGVuZ3RoO3A8cTtwKyspe3ZhciB1LHk9by5vcmRlcltwXTtpZih1PW8ubGVmdE1hdGNoW3ldLmV4ZWMoZykpe3ZhciBGPXVbMV07dS5zcGxpY2UoMSwxKTtpZihGLnN1YnN0cihGLmxlbmd0aC0xKSE9PSJcXCIpe3VbMV09KHVbMV18fCIiKS5yZXBsYWNlKC9cXC9nLCIiKTttPW8uZmluZFt5XSh1LGksbik7aWYobSE9bnVsbCl7Zz1nLnJlcGxhY2Uoby5tYXRjaFt5XSwiIik7YnJlYWt9fX19bXx8KG09aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTsKcmV0dXJue3NldDptLGV4cHI6Z319O2suZmlsdGVyPWZ1bmN0aW9uKGcsaSxuLG0pe2Zvcih2YXIgcCxxLHU9Zyx5PVtdLEY9aSxNPWkmJmlbMF0mJmsuaXNYTUwoaVswXSk7ZyYmaS5sZW5ndGg7KXtmb3IodmFyIE4gaW4gby5maWx0ZXIpaWYoKHA9by5sZWZ0TWF0Y2hbTl0uZXhlYyhnKSkhPW51bGwmJnBbMl0pe3ZhciBPLEQsUj1vLmZpbHRlcltOXTtEPXBbMV07cT1mYWxzZTtwLnNwbGljZSgxLDEpO2lmKEQuc3Vic3RyKEQubGVuZ3RoLTEpIT09IlxcIil7aWYoRj09PXkpeT1bXTtpZihvLnByZUZpbHRlcltOXSlpZihwPW8ucHJlRmlsdGVyW05dKHAsRixuLHksbSxNKSl7aWYocD09PXRydWUpY29udGludWV9ZWxzZSBxPU89dHJ1ZTtpZihwKWZvcih2YXIgaj0wOyhEPUZbal0pIT1udWxsO2orKylpZihEKXtPPVIoRCxwLGosRik7dmFyIHM9bV4hIU87aWYobiYmTyE9bnVsbClpZihzKXE9dHJ1ZTtlbHNlIEZbal09ZmFsc2U7ZWxzZSBpZihzKXt5LnB1c2goRCk7cT10cnVlfX1pZihPIT09CkIpe258fChGPXkpO2c9Zy5yZXBsYWNlKG8ubWF0Y2hbTl0sIiIpO2lmKCFxKXJldHVybltdO2JyZWFrfX19aWYoZz09PXUpaWYocT09bnVsbClrLmVycm9yKGcpO2Vsc2UgYnJlYWs7dT1nfXJldHVybiBGfTtrLmVycm9yPWZ1bmN0aW9uKGcpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZzt9O3ZhciBvPWsuc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbitcLV0qKVwpKT8vLApQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZ2V0QXR0cmlidXRlKCJocmVmIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGcsaSl7dmFyIG49dHlwZW9mIGk9PT0ic3RyaW5nIixtPW4mJiEvXFcvLnRlc3QoaSk7bj1uJiYhbTtpZihtKWk9aS50b0xvd2VyQ2FzZSgpO209MDtmb3IodmFyIHA9Zy5sZW5ndGgscTttPHA7bSsrKWlmKHE9Z1ttXSl7Zm9yKDsocT1xLnByZXZpb3VzU2libGluZykmJnEubm9kZVR5cGUhPT0xOyk7Z1ttXT1ufHxxJiZxLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0KaT9xfHxmYWxzZTpxPT09aX1uJiZrLmZpbHRlcihpLGcsdHJ1ZSl9LCI+IjpmdW5jdGlvbihnLGkpe3ZhciBuLG09dHlwZW9mIGk9PT0ic3RyaW5nIixwPTAscT1nLmxlbmd0aDtpZihtJiYhL1xXLy50ZXN0KGkpKWZvcihpPWkudG9Mb3dlckNhc2UoKTtwPHE7cCsrKXtpZihuPWdbcF0pe249bi5wYXJlbnROb2RlO2dbcF09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09aT9uOmZhbHNlfX1lbHNle2Zvcig7cDxxO3ArKylpZihuPWdbcF0pZ1twXT1tP24ucGFyZW50Tm9kZTpuLnBhcmVudE5vZGU9PT1pO20mJmsuZmlsdGVyKGksZyx0cnVlKX19LCIiOmZ1bmN0aW9uKGcsaSxuKXt2YXIgbSxwPWUrKyxxPWI7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChpKSl7bT1pPWkudG9Mb3dlckNhc2UoKTtxPWF9cSgicGFyZW50Tm9kZSIsaSxwLGcsbSxuKX0sIn4iOmZ1bmN0aW9uKGcsaSxuKXt2YXIgbSxwPWUrKyxxPWI7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChpKSl7bT0KaT1pLnRvTG93ZXJDYXNlKCk7cT1hfXEoInByZXZpb3VzU2libGluZyIsaSxwLGcsbSxuKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGcsaSxuKXtpZih0eXBlb2YgaS5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhbilyZXR1cm4oZz1pLmdldEVsZW1lbnRCeUlkKGdbMV0pKSYmZy5wYXJlbnROb2RlP1tnXTpbXX0sTkFNRTpmdW5jdGlvbihnLGkpe2lmKHR5cGVvZiBpLmdldEVsZW1lbnRzQnlOYW1lIT09InVuZGVmaW5lZCIpe2Zvcih2YXIgbj1bXSxtPWkuZ2V0RWxlbWVudHNCeU5hbWUoZ1sxXSkscD0wLHE9bS5sZW5ndGg7cDxxO3ArKyltW3BdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09Z1sxXSYmbi5wdXNoKG1bcF0pO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDpufX0sVEFHOmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZ1sxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGcsaSxuLG0scCxxKXtnPSIgIitnWzFdLnJlcGxhY2UoL1xcL2csCiIiKSsiICI7aWYocSlyZXR1cm4gZztxPTA7Zm9yKHZhciB1Oyh1PWlbcV0pIT1udWxsO3ErKylpZih1KWlmKHBeKHUuY2xhc3NOYW1lJiYoIiAiK3UuY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5dL2csIiAiKS5pbmRleE9mKGcpPj0wKSlufHxtLnB1c2godSk7ZWxzZSBpZihuKWlbcV09ZmFsc2U7cmV0dXJuIGZhbHNlfSxJRDpmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS5yZXBsYWNlKC9cXC9nLCIiKX0sVEFHOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGcpe2lmKGdbMV09PT0ibnRoIil7dmFyIGk9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhnWzJdPT09ImV2ZW4iJiYiMm4ifHxnWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChnWzJdKSYmIjBuKyIrZ1syXXx8Z1syXSk7Z1syXT1pWzFdKyhpWzJdfHwxKS0wO2dbM109aVszXS0wfWdbMF09ZSsrO3JldHVybiBnfSxBVFRSOmZ1bmN0aW9uKGcsaSxuLAptLHAscSl7aT1nWzFdLnJlcGxhY2UoL1xcL2csIiIpO2lmKCFxJiZvLmF0dHJNYXBbaV0pZ1sxXT1vLmF0dHJNYXBbaV07aWYoZ1syXT09PSJ+PSIpZ1s0XT0iICIrZ1s0XSsiICI7cmV0dXJuIGd9LFBTRVVETzpmdW5jdGlvbihnLGksbixtLHApe2lmKGdbMV09PT0ibm90IilpZigoZC5leGVjKGdbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QoZ1szXSkpZ1szXT1rKGdbM10sbnVsbCxudWxsLGkpO2Vsc2V7Zz1rLmZpbHRlcihnWzNdLGksbix0cnVlXnApO258fG0ucHVzaC5hcHBseShtLGcpO3JldHVybiBmYWxzZX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoZ1swXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChnWzBdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZ30sUE9TOmZ1bmN0aW9uKGcpe2cudW5zaGlmdCh0cnVlKTtyZXR1cm4gZ319LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT1mYWxzZSYmZy50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmRpc2FibGVkPT09CnRydWV9LGNoZWNrZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuY2hlY2tlZD09PXRydWV9LHNlbGVjdGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLnNlbGVjdGVkPT09dHJ1ZX0scGFyZW50OmZ1bmN0aW9uKGcpe3JldHVybiEhZy5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihnKXtyZXR1cm4hZy5maXJzdENoaWxkfSxoYXM6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiEhayhuWzNdLGcpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGcpe3JldHVybi9oXGQvaS50ZXN0KGcubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGcpe3JldHVybiJ0ZXh0Ij09PWcudHlwZX0scmFkaW86ZnVuY3Rpb24oZyl7cmV0dXJuInJhZGlvIj09PWcudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oZyl7cmV0dXJuImNoZWNrYm94Ij09PWcudHlwZX0sZmlsZTpmdW5jdGlvbihnKXtyZXR1cm4iZmlsZSI9PT1nLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGcpe3JldHVybiJwYXNzd29yZCI9PT1nLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihnKXtyZXR1cm4ic3VibWl0Ij09PQpnLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGcpe3JldHVybiJpbWFnZSI9PT1nLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGcpe3JldHVybiJyZXNldCI9PT1nLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihnKXtyZXR1cm4iYnV0dG9uIj09PWcudHlwZXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGcpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChnLm5vZGVOYW1lKX19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGk9PT0wfSxsYXN0OmZ1bmN0aW9uKGcsaSxuLG0pe3JldHVybiBpPT09bS5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihnLGkpe3JldHVybiBpJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oZyxpKXtyZXR1cm4gaSUyPT09MX0sbHQ6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPG5bM10tMH0sZ3Q6ZnVuY3Rpb24oZyxpLG4pe3JldHVybiBpPm5bM10tMH0sbnRoOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0KMD09PWl9LGVxOmZ1bmN0aW9uKGcsaSxuKXtyZXR1cm4gblszXS0wPT09aX19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGcsaSxuLG0pe3ZhciBwPWlbMV0scT1vLmZpbHRlcnNbcF07aWYocSlyZXR1cm4gcShnLG4saSxtKTtlbHNlIGlmKHA9PT0iY29udGFpbnMiKXJldHVybihnLnRleHRDb250ZW50fHxnLmlubmVyVGV4dHx8ay5nZXRUZXh0KFtnXSl8fCIiKS5pbmRleE9mKGlbM10pPj0wO2Vsc2UgaWYocD09PSJub3QiKXtpPWlbM107bj0wO2ZvcihtPWkubGVuZ3RoO248bTtuKyspaWYoaVtuXT09PWcpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWVsc2Ugay5lcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitwKX0sQ0hJTEQ6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdLG09Zztzd2l0Y2gobil7Y2FzZSAib25seSI6Y2FzZSAiZmlyc3QiOmZvcig7bT1tLnByZXZpb3VzU2libGluZzspaWYobS5ub2RlVHlwZT09PTEpcmV0dXJuIGZhbHNlO2lmKG49PT0KImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSAibGFzdCI6Zm9yKDttPW0ubmV4dFNpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlICJudGgiOm49aVsyXTt2YXIgcD1pWzNdO2lmKG49PT0xJiZwPT09MClyZXR1cm4gdHJ1ZTt2YXIgcT1pWzBdLHU9Zy5wYXJlbnROb2RlO2lmKHUmJih1LnNpemNhY2hlIT09cXx8IWcubm9kZUluZGV4KSl7dmFyIHk9MDtmb3IobT11LmZpcnN0Q2hpbGQ7bTttPW0ubmV4dFNpYmxpbmcpaWYobS5ub2RlVHlwZT09PTEpbS5ub2RlSW5kZXg9Kyt5O3Uuc2l6Y2FjaGU9cX1tPWcubm9kZUluZGV4LXA7cmV0dXJuIG49PT0wP209PT0wOm0lbj09PTAmJm0vbj49MH19LElEOmZ1bmN0aW9uKGcsaSl7cmV0dXJuIGcubm9kZVR5cGU9PT0xJiZnLmdldEF0dHJpYnV0ZSgiaWQiKT09PWl9LFRBRzpmdW5jdGlvbihnLGkpe3JldHVybiBpPT09IioiJiZnLm5vZGVUeXBlPT09MXx8Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Cml9LENMQVNTOmZ1bmN0aW9uKGcsaSl7cmV0dXJuKCIgIisoZy5jbGFzc05hbWV8fGcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoaSk+LTF9LEFUVFI6ZnVuY3Rpb24oZyxpKXt2YXIgbj1pWzFdO249by5hdHRySGFuZGxlW25dP28uYXR0ckhhbmRsZVtuXShnKTpnW25dIT1udWxsP2dbbl06Zy5nZXRBdHRyaWJ1dGUobik7dmFyIG09bisiIixwPWlbMl0scT1pWzRdO3JldHVybiBuPT1udWxsP3A9PT0iIT0iOnA9PT0iPSI/bT09PXE6cD09PSIqPSI/bS5pbmRleE9mKHEpPj0wOnA9PT0ifj0iPygiICIrbSsiICIpLmluZGV4T2YocSk+PTA6IXE/bSYmbiE9PWZhbHNlOnA9PT0iIT0iP20hPT1xOnA9PT0iXj0iP20uaW5kZXhPZihxKT09PTA6cD09PSIkPSI/bS5zdWJzdHIobS5sZW5ndGgtcS5sZW5ndGgpPT09cTpwPT09Inw9Ij9tPT09cXx8bS5zdWJzdHIoMCxxLmxlbmd0aCsxKT09PXErIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24oZyxpLG4sbSl7dmFyIHA9by5zZXRGaWx0ZXJzW2lbMl1dOwppZihwKXJldHVybiBwKGcsbixpLG0pfX19LHg9by5tYXRjaC5QT1Mscj1mdW5jdGlvbihnLGkpe3JldHVybiJcXCIrKGktMCsxKX0sQTtmb3IoQSBpbiBvLm1hdGNoKXtvLm1hdGNoW0FdPVJlZ0V4cChvLm1hdGNoW0FdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpO28ubGVmdE1hdGNoW0FdPVJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbQV0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxyKSl9dmFyIEM9ZnVuY3Rpb24oZyxpKXtnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGcsMCk7aWYoaSl7aS5wdXNoLmFwcGx5KGksZyk7cmV0dXJuIGl9cmV0dXJuIGd9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApfWNhdGNoKEope0M9ZnVuY3Rpb24oZyxpKXt2YXIgbj0wLG09aXx8W107aWYoZi5jYWxsKGcpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShtLApnKTtlbHNlIGlmKHR5cGVvZiBnLmxlbmd0aD09PSJudW1iZXIiKWZvcih2YXIgcD1nLmxlbmd0aDtuPHA7bisrKW0ucHVzaChnW25dKTtlbHNlIGZvcig7Z1tuXTtuKyspbS5wdXNoKGdbbl0pO3JldHVybiBtfX12YXIgdyxJO2lmKHQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXc9ZnVuY3Rpb24oZyxpKXtpZihnPT09aSl7aD10cnVlO3JldHVybiAwfWlmKCFnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhaS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxO3JldHVybiBnLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGkpJjQ/LTE6MX07ZWxzZXt3PWZ1bmN0aW9uKGcsaSl7dmFyIG4sbSxwPVtdLHE9W107bj1nLnBhcmVudE5vZGU7bT1pLnBhcmVudE5vZGU7dmFyIHU9bjtpZihnPT09aSl7aD10cnVlO3JldHVybiAwfWVsc2UgaWYobj09PW0pcmV0dXJuIEkoZyxpKTtlbHNlIGlmKG4pe2lmKCFtKXJldHVybiAxfWVsc2UgcmV0dXJuLTE7CmZvcig7dTspe3AudW5zaGlmdCh1KTt1PXUucGFyZW50Tm9kZX1mb3IodT1tO3U7KXtxLnVuc2hpZnQodSk7dT11LnBhcmVudE5vZGV9bj1wLmxlbmd0aDttPXEubGVuZ3RoO2Zvcih1PTA7dTxuJiZ1PG07dSsrKWlmKHBbdV0hPT1xW3VdKXJldHVybiBJKHBbdV0scVt1XSk7cmV0dXJuIHU9PT1uP0koZyxxW3VdLC0xKTpJKHBbdV0saSwxKX07ST1mdW5jdGlvbihnLGksbil7aWYoZz09PWkpcmV0dXJuIG47Zm9yKGc9Zy5uZXh0U2libGluZztnOyl7aWYoZz09PWkpcmV0dXJuLTE7Zz1nLm5leHRTaWJsaW5nfXJldHVybiAxfX1rLmdldFRleHQ9ZnVuY3Rpb24oZyl7Zm9yKHZhciBpPSIiLG4sbT0wO2dbbV07bSsrKXtuPWdbbV07aWYobi5ub2RlVHlwZT09PTN8fG4ubm9kZVR5cGU9PT00KWkrPW4ubm9kZVZhbHVlO2Vsc2UgaWYobi5ub2RlVHlwZSE9PTgpaSs9ay5nZXRUZXh0KG4uY2hpbGROb2Rlcyl9cmV0dXJuIGl9OyhmdW5jdGlvbigpe3ZhciBnPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksCmk9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksbj10LmRvY3VtZW50RWxlbWVudDtnLmlubmVySFRNTD0iPGEgbmFtZT0nIitpKyInLz4iO24uaW5zZXJ0QmVmb3JlKGcsbi5maXJzdENoaWxkKTtpZih0LmdldEVsZW1lbnRCeUlkKGkpKXtvLmZpbmQuSUQ9ZnVuY3Rpb24obSxwLHEpe2lmKHR5cGVvZiBwLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFxKXJldHVybihwPXAuZ2V0RWxlbWVudEJ5SWQobVsxXSkpP3AuaWQ9PT1tWzFdfHx0eXBlb2YgcC5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJnAuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT1tWzFdP1twXTpCOltdfTtvLmZpbHRlci5JRD1mdW5jdGlvbihtLHApe3ZhciBxPXR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBtLm5vZGVUeXBlPT09MSYmcSYmcS5ub2RlVmFsdWU9PT1wfX1uLnJlbW92ZUNoaWxkKGcpOwpuPWc9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGc9dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmFwcGVuZENoaWxkKHQuY3JlYXRlQ29tbWVudCgiIikpO2lmKGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MClvLmZpbmQuVEFHPWZ1bmN0aW9uKGksbil7dmFyIG09bi5nZXRFbGVtZW50c0J5VGFnTmFtZShpWzFdKTtpZihpWzFdPT09IioiKXtmb3IodmFyIHA9W10scT0wO21bcV07cSsrKW1bcV0ubm9kZVR5cGU9PT0xJiZwLnB1c2gobVtxXSk7bT1wfXJldHVybiBtfTtnLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiI7aWYoZy5maXJzdENoaWxkJiZ0eXBlb2YgZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZnLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpby5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oaSl7cmV0dXJuIGkuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX07Zz1udWxsfSkoKTt0LnF1ZXJ5U2VsZWN0b3JBbGwmJgpmdW5jdGlvbigpe3ZhciBnPWssaT10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIShpLnF1ZXJ5U2VsZWN0b3JBbGwmJmkucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGg9PT0wKSl7az1mdW5jdGlvbihtLHAscSx1KXtwPXB8fHQ7bT1tLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCF1JiYhay5pc1hNTChwKSlpZihwLm5vZGVUeXBlPT09OSl0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKG0pLHEpfWNhdGNoKHkpe31lbHNlIGlmKHAubm9kZVR5cGU9PT0xJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7dmFyIEY9cC5nZXRBdHRyaWJ1dGUoImlkIiksTT1GfHwiX19zaXp6bGVfXyI7Rnx8cC5zZXRBdHRyaWJ1dGUoImlkIixNKTt0cnl7cmV0dXJuIEMocC5xdWVyeVNlbGVjdG9yQWxsKCIjIitNKyIgIittKSxxKX1jYXRjaChOKXt9ZmluYWxseXtGfHwKcC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXJldHVybiBnKG0scCxxLHUpfTtmb3IodmFyIG4gaW4gZylrW25dPWdbbl07aT1udWxsfX0oKTsoZnVuY3Rpb24oKXt2YXIgZz10LmRvY3VtZW50RWxlbWVudCxpPWcubWF0Y2hlc1NlbGVjdG9yfHxnLm1vek1hdGNoZXNTZWxlY3Rvcnx8Zy53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGcubXNNYXRjaGVzU2VsZWN0b3Isbj1mYWxzZTt0cnl7aS5jYWxsKHQuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKG0pe249dHJ1ZX1pZihpKWsubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHAscSl7cT1xLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFrLmlzWE1MKHApKXRyeXtpZihufHwhby5tYXRjaC5QU0VVRE8udGVzdChxKSYmIS8hPS8udGVzdChxKSlyZXR1cm4gaS5jYWxsKHAscSl9Y2F0Y2godSl7fXJldHVybiBrKHEsbnVsbCxudWxsLFtwXSkubGVuZ3RoPjB9fSkoKTsoZnVuY3Rpb24oKXt2YXIgZz0KdC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEoIWcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8Zy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MCkpe2cubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MSl7by5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpO28uZmluZC5DTEFTUz1mdW5jdGlvbihpLG4sbSl7aWYodHlwZW9mIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRlZmluZWQiJiYhbSlyZXR1cm4gbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGlbMV0pfTtnPW51bGx9fX0pKCk7ay5jb250YWlucz10LmRvY3VtZW50RWxlbWVudC5jb250YWlucz9mdW5jdGlvbihnLGkpe3JldHVybiBnIT09aSYmKGcuY29udGFpbnM/Zy5jb250YWlucyhpKTp0cnVlKX06dC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/CmZ1bmN0aW9uKGcsaSl7cmV0dXJuISEoZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpKSYxNil9OmZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfTtrLmlzWE1MPWZ1bmN0aW9uKGcpe3JldHVybihnPShnP2cub3duZXJEb2N1bWVudHx8ZzowKS5kb2N1bWVudEVsZW1lbnQpP2cubm9kZU5hbWUhPT0iSFRNTCI6ZmFsc2V9O3ZhciBMPWZ1bmN0aW9uKGcsaSl7Zm9yKHZhciBuLG09W10scD0iIixxPWkubm9kZVR5cGU/W2ldOmk7bj1vLm1hdGNoLlBTRVVETy5leGVjKGcpOyl7cCs9blswXTtnPWcucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIil9Zz1vLnJlbGF0aXZlW2ddP2crIioiOmc7bj0wO2Zvcih2YXIgdT1xLmxlbmd0aDtuPHU7bisrKWsoZyxxW25dLG0pO3JldHVybiBrLmZpbHRlcihwLG0pfTtjLmZpbmQ9aztjLmV4cHI9ay5zZWxlY3RvcnM7Yy5leHByWyI6Il09Yy5leHByLmZpbHRlcnM7Yy51bmlxdWU9ay51bmlxdWVTb3J0O2MudGV4dD1rLmdldFRleHQ7Yy5pc1hNTERvYz1rLmlzWE1MOwpjLmNvbnRhaW5zPWsuY29udGFpbnN9KSgpO3ZhciBaYT0vVW50aWwkLywkYT0vXig/OnBhcmVudHN8cHJldlVudGlsfHByZXZBbGwpLyxhYj0vLC8sTmE9L14uW146I1xbXC4sXSokLyxiYj1BcnJheS5wcm90b3R5cGUuc2xpY2UsY2I9Yy5leHByLm1hdGNoLlBPUztjLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGQ9MCxlPTAsZj10aGlzLmxlbmd0aDtlPGY7ZSsrKXtkPWIubGVuZ3RoO2MuZmluZChhLHRoaXNbZV0sYik7aWYoZT4wKWZvcih2YXIgaD1kO2g8Yi5sZW5ndGg7aCsrKWZvcih2YXIgbD0wO2w8ZDtsKyspaWYoYltsXT09PWJbaF0pe2Iuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGJ9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1jKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylpZihjLmNvbnRhaW5zKHRoaXMsYltkXSkpcmV0dXJuIHRydWV9KX0sCm5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobWEodGhpcyxhLGZhbHNlKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtYSh0aGlzLGEsdHJ1ZSksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmYy5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MH0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBkPVtdLGUsZixoPXRoaXNbMF07aWYoYy5pc0FycmF5KGEpKXt2YXIgbCxrPXt9LG89MTtpZihoJiZhLmxlbmd0aCl7ZT0wO2ZvcihmPWEubGVuZ3RoO2U8ZjtlKyspe2w9YVtlXTtrW2xdfHwoa1tsXT1jLmV4cHIubWF0Y2guUE9TLnRlc3QobCk/YyhsLGJ8fHRoaXMuY29udGV4dCk6bCl9Zm9yKDtoJiZoLm93bmVyRG9jdW1lbnQmJmghPT1iOyl7Zm9yKGwgaW4gayl7ZT1rW2xdO2lmKGUuanF1ZXJ5P2UuaW5kZXgoaCk+LTE6YyhoKS5pcyhlKSlkLnB1c2goe3NlbGVjdG9yOmwsZWxlbTpoLGxldmVsOm99KX1oPQpoLnBhcmVudE5vZGU7bysrfX1yZXR1cm4gZH1sPWNiLnRlc3QoYSk/YyhhLGJ8fHRoaXMuY29udGV4dCk6bnVsbDtlPTA7Zm9yKGY9dGhpcy5sZW5ndGg7ZTxmO2UrKylmb3IoaD10aGlzW2VdO2g7KWlmKGw/bC5pbmRleChoKT4tMTpjLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGgsYSkpe2QucHVzaChoKTticmVha31lbHNle2g9aC5wYXJlbnROb2RlO2lmKCFofHwhaC5vd25lckRvY3VtZW50fHxoPT09YilicmVha31kPWQubGVuZ3RoPjE/Yy51bmlxdWUoZCk6ZDtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCwiY2xvc2VzdCIsYSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PSJzdHJpbmciKXJldHVybiBjLmluQXJyYXkodGhpc1swXSxhP2MoYSk6dGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpKTtyZXR1cm4gYy5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dHlwZW9mIGE9PT0ic3RyaW5nIj9jKGEsYnx8dGhpcy5jb250ZXh0KToKYy5tYWtlQXJyYXkoYSksZT1jLm1lcmdlKHRoaXMuZ2V0KCksZCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKCFkWzBdfHwhZFswXS5wYXJlbnROb2RlfHxkWzBdLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMXx8IWVbMF18fCFlWzBdLnBhcmVudE5vZGV8fGVbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExP2U6Yy51bmlxdWUoZSkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSk7Yy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5wYXJlbnROb2RlKSYmYS5ub2RlVHlwZSE9PTExP2E6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIixkKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBjLm50aChhLAoyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIixkKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixkKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OmMubWFrZUFycmF5KGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLApiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5tYXAodGhpcyxiLGQpO1phLnRlc3QoYSl8fChlPWQpO2lmKGUmJnR5cGVvZiBlPT09InN0cmluZyIpZj1jLmZpbHRlcihlLGYpO2Y9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShmKTpmO2lmKCh0aGlzLmxlbmd0aD4xfHxhYi50ZXN0KGUpKSYmJGEudGVzdChhKSlmPWYucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhmLGEsYmIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSk7Yy5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsZCl7aWYoZClhPSI6bm90KCIrYSsiKSI7cmV0dXJuIGIubGVuZ3RoPT09MT9jLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmMuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGIsZCl7dmFyIGU9W107Zm9yKGE9YVtiXTthJiZhLm5vZGVUeXBlIT09OSYmKGQ9PT1CfHxhLm5vZGVUeXBlIT09MXx8IWMoYSkuaXMoZCkpOyl7YS5ub2RlVHlwZT09PTEmJgplLnB1c2goYSk7YT1hW2JdfXJldHVybiBlfSxudGg6ZnVuY3Rpb24oYSxiLGQpe2I9Ynx8MTtmb3IodmFyIGU9MDthO2E9YVtkXSlpZihhLm5vZGVUeXBlPT09MSYmKytlPT09YilicmVhaztyZXR1cm4gYX0sc2libGluZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXTthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmQucHVzaChhKTtyZXR1cm4gZH19KTt2YXIgemE9LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywkPS9eXHMrLyxBYT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLEJhPS88KFtcdzpdKykvLGRiPS88dGJvZHkvaSxlYj0vPHwmIz9cdys7LyxDYT0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLERhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGZiPS9cPShbXj0iJz5cc10rXC8pPi9nLFA9e29wdGlvbjpbMSwKIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O1Aub3B0Z3JvdXA9UC5vcHRpb247UC50Ym9keT1QLnRmb290PVAuY29sZ3JvdXA9UC5jYXB0aW9uPVAudGhlYWQ7UC50aD1QLnRkO2lmKCFjLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSlQLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdO2MuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPQpjKHRoaXMpO2QudGV4dChhLmNhbGwodGhpcyxiLGQudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9PSJvYmplY3QiJiZhIT09QilyZXR1cm4gdGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx0KS5jcmVhdGVUZXh0Tm9kZShhKSk7cmV0dXJuIGMudGV4dCh0aGlzKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXtjKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsZCkpfSk7aWYodGhpc1swXSl7dmFyIGI9YyhhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUodHJ1ZSk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKTtiLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZD10aGlzO2QuZmlyc3RDaGlsZCYmZC5maXJzdENoaWxkLm5vZGVUeXBlPT09MTspZD1kLmZpcnN0Q2hpbGQ7cmV0dXJuIGR9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LAp3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Yyh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWModGhpcyksZD1iLmNvbnRlbnRzKCk7ZC5sZW5ndGg/ZC53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Yy5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSwKcHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmluc2VydEJlZm9yZShhLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmYWxzZSxmdW5jdGlvbihiKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsdGhpcyl9KTtlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPWMoYXJndW1lbnRzWzBdKTthLnB1c2guYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGEsImJlZm9yZSIsYXJndW1lbnRzKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmYWxzZSxmdW5jdGlvbihiKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsCnRoaXMubmV4dFNpYmxpbmcpfSk7ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxjKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0wLGU7KGU9dGhpc1tkXSkhPW51bGw7ZCsrKWlmKCFhfHxjLmZpbHRlcihhLFtlXSkubGVuZ3RoKXtpZighYiYmZS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yy5jbGVhbkRhdGEoW2VdKX1lLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1yZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKylmb3IoYi5ub2RlVHlwZT09PTEmJmMuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7CnJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm1hcChmdW5jdGlvbigpe2lmKCFjLnN1cHBvcnQubm9DbG9uZUV2ZW50JiYhYy5pc1hNTERvYyh0aGlzKSl7dmFyIGQ9dGhpcy5vdXRlckhUTUwsZT10aGlzLm93bmVyRG9jdW1lbnQ7aWYoIWQpe2Q9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmFwcGVuZENoaWxkKHRoaXMuY2xvbmVOb2RlKHRydWUpKTtkPWQuaW5uZXJIVE1MfXJldHVybiBjLmNsZWFuKFtkLnJlcGxhY2UoemEsIiIpLnJlcGxhY2UoZmIsJz0iJDEiPicpLnJlcGxhY2UoJCwiIildLGUpWzBdfWVsc2UgcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpfSk7aWYoYT09PXRydWUpe25hKHRoaXMsYik7bmEodGhpcy5maW5kKCIqIiksYi5maW5kKCIqIikpfXJldHVybiBifSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1CKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKHphLCIiKTpudWxsOwplbHNlIGlmKHR5cGVvZiBhPT09InN0cmluZyImJiFDYS50ZXN0KGEpJiYoYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhJC50ZXN0KGEpKSYmIVBbKEJhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShBYSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYj0wLGQ9dGhpcy5sZW5ndGg7YjxkO2IrKylpZih0aGlzW2JdLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEodGhpc1tiXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt0aGlzW2JdLmlubmVySFRNTD1hfX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGMuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oZil7dmFyIGg9Yyh0aGlzKTtoLmh0bWwoYS5jYWxsKHRoaXMsZixoLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgZD0KYyh0aGlzKSxlPWQuaHRtbCgpO2QucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixlKSl9KTtpZih0eXBlb2YgYSE9PSJzdHJpbmciKWE9YyhhKS5kZXRhY2goKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxkPXRoaXMucGFyZW50Tm9kZTtjKHRoaXMpLnJlbW92ZSgpO2I/YyhiKS5iZWZvcmUoYSk6YyhkKS5hcHBlbmQoYSl9KX1lbHNlIHJldHVybiB0aGlzLnB1c2hTdGFjayhjKGMuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLHRydWUpfSxkb21NYW5pcDpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZixoLGw9YVswXSxrPVtdO2lmKCFjLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBsPT09InN0cmluZyImJkRhLnRlc3QobCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2ModGhpcykuZG9tTWFuaXAoYSwKYixkLHRydWUpfSk7aWYoYy5pc0Z1bmN0aW9uKGwpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oeCl7dmFyIHI9Yyh0aGlzKTthWzBdPWwuY2FsbCh0aGlzLHgsYj9yLmh0bWwoKTpCKTtyLmRvbU1hbmlwKGEsYixkKX0pO2lmKHRoaXNbMF0pe2U9bCYmbC5wYXJlbnROb2RlO2U9Yy5zdXBwb3J0LnBhcmVudE5vZGUmJmUmJmUubm9kZVR5cGU9PT0xMSYmZS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP3tmcmFnbWVudDplfTpjLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspO2g9ZS5mcmFnbWVudDtpZihmPWguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2g9aC5maXJzdENoaWxkOmguZmlyc3RDaGlsZCl7Yj1iJiZjLm5vZGVOYW1lKGYsInRyIik7Zj0wO2Zvcih2YXIgbz10aGlzLmxlbmd0aDtmPG87ZisrKWQuY2FsbChiP2Mubm9kZU5hbWUodGhpc1tmXSwidGFibGUiKT90aGlzW2ZdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHx0aGlzW2ZdLmFwcGVuZENoaWxkKHRoaXNbZl0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKToKdGhpc1tmXTp0aGlzW2ZdLGY+MHx8ZS5jYWNoZWFibGV8fHRoaXMubGVuZ3RoPjE/aC5jbG9uZU5vZGUodHJ1ZSk6aCl9ay5sZW5ndGgmJmMuZWFjaChrLE9hKX1yZXR1cm4gdGhpc319KTtjLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGYsaDtiPWImJmJbMF0/YlswXS5vd25lckRvY3VtZW50fHxiWzBdOnQ7aWYoYS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmI9PT10JiYhQ2EudGVzdChhWzBdKSYmKGMuc3VwcG9ydC5jaGVja0Nsb25lfHwhRGEudGVzdChhWzBdKSkpe2Y9dHJ1ZTtpZihoPWMuZnJhZ21lbnRzW2FbMF1dKWlmKGghPT0xKWU9aH1pZighZSl7ZT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjLmNsZWFuKGEsYixlLGQpfWlmKGYpYy5mcmFnbWVudHNbYVswXV09aD9lOjE7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmZ9fTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLApwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQpe3ZhciBlPVtdO2Q9YyhkKTt2YXIgZj10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihmJiZmLm5vZGVUeXBlPT09MTEmJmYuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZkLmxlbmd0aD09PTEpe2RbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9ZWxzZXtmPTA7Zm9yKHZhciBoPWQubGVuZ3RoO2Y8aDtmKyspe3ZhciBsPShmPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjKGRbZl0pW2JdKGwpO2U9ZS5jb25jYXQobCl9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUsYSxkLnNlbGVjdG9yKX19fSk7Yy5leHRlbmQoe2NsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe2I9Ynx8dDtpZih0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT09InVuZGVmaW5lZCIpYj1iLm93bmVyRG9jdW1lbnR8fApiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fHQ7Zm9yKHZhciBmPVtdLGg9MCxsOyhsPWFbaF0pIT1udWxsO2grKyl7aWYodHlwZW9mIGw9PT0ibnVtYmVyIilsKz0iIjtpZihsKXtpZih0eXBlb2YgbD09PSJzdHJpbmciJiYhZWIudGVzdChsKSlsPWIuY3JlYXRlVGV4dE5vZGUobCk7ZWxzZSBpZih0eXBlb2YgbD09PSJzdHJpbmciKXtsPWwucmVwbGFjZShBYSwiPCQxPjwvJDI+Iik7dmFyIGs9KEJhLmV4ZWMobCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbz1QW2tdfHxQLl9kZWZhdWx0LHg9b1swXSxyPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKHIuaW5uZXJIVE1MPW9bMV0rbCtvWzJdO3gtLTspcj1yLmxhc3RDaGlsZDtpZighYy5zdXBwb3J0LnRib2R5KXt4PWRiLnRlc3QobCk7az1rPT09InRhYmxlIiYmIXg/ci5maXJzdENoaWxkJiZyLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpvWzFdPT09Ijx0YWJsZT4iJiYheD9yLmNoaWxkTm9kZXM6W107Zm9yKG89ay5sZW5ndGgtCjE7bz49MDstLW8pYy5ub2RlTmFtZShrW29dLCJ0Ym9keSIpJiYha1tvXS5jaGlsZE5vZGVzLmxlbmd0aCYma1tvXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGtbb10pfSFjLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJiQudGVzdChsKSYmci5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZSgkLmV4ZWMobClbMF0pLHIuZmlyc3RDaGlsZCk7bD1yLmNoaWxkTm9kZXN9aWYobC5ub2RlVHlwZSlmLnB1c2gobCk7ZWxzZSBmPWMubWVyZ2UoZixsKX19aWYoZClmb3IoaD0wO2ZbaF07aCsrKWlmKGUmJmMubm9kZU5hbWUoZltoXSwic2NyaXB0IikmJighZltoXS50eXBlfHxmW2hdLnR5cGUudG9Mb3dlckNhc2UoKT09PSJ0ZXh0L2phdmFzY3JpcHQiKSllLnB1c2goZltoXS5wYXJlbnROb2RlP2ZbaF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmW2hdKTpmW2hdKTtlbHNle2ZbaF0ubm9kZVR5cGU9PT0xJiZmLnNwbGljZS5hcHBseShmLFtoKzEsMF0uY29uY2F0KGMubWFrZUFycmF5KGZbaF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkpOwpkLmFwcGVuZENoaWxkKGZbaF0pfXJldHVybiBmfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGQsZT1jLmNhY2hlLGY9Yy5ldmVudC5zcGVjaWFsLGg9Yy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sbD0wLGs7KGs9YVtsXSkhPW51bGw7bCsrKWlmKCEoay5ub2RlTmFtZSYmYy5ub0RhdGFbay5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpaWYoZD1rW2MuZXhwYW5kb10pe2lmKChiPWVbZF0pJiZiLmV2ZW50cylmb3IodmFyIG8gaW4gYi5ldmVudHMpZltvXT9jLmV2ZW50LnJlbW92ZShrLG8pOmMucmVtb3ZlRXZlbnQoayxvLGIuaGFuZGxlKTtpZihoKWRlbGV0ZSBrW2MuZXhwYW5kb107ZWxzZSBrLnJlbW92ZUF0dHJpYnV0ZSYmay5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZVtkXX19fSk7dmFyIEVhPS9hbHBoYVwoW14pXSpcKS9pLGdiPS9vcGFjaXR5PShbXildKikvLGhiPS8tKFthLXpdKS9pZyxpYj0vKFtBLVpdKS9nLEZhPS9eLT9cZCsoPzpweCk/JC9pLApqYj0vXi0/XGQvLGtiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxQYT1bIkxlZnQiLCJSaWdodCJdLFFhPVsiVG9wIiwiQm90dG9tIl0sVyxHYSxhYSxsYj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O2MuZm4uY3NzPWZ1bmN0aW9uKGEsYil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTImJmI9PT1CKXJldHVybiB0aGlzO3JldHVybiBjLmFjY2Vzcyh0aGlzLGEsYix0cnVlLGZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gZiE9PUI/Yy5zdHlsZShkLGUsZik6Yy5jc3MoZCxlKX0pfTtjLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBkPVcoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gZD09PSIiPyIxIjpkfWVsc2UgcmV0dXJuIGEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e3pJbmRleDp0cnVlLGZvbnRXZWlnaHQ6dHJ1ZSxvcGFjaXR5OnRydWUsCnpvb206dHJ1ZSxsaW5lSGVpZ2h0OnRydWV9LGNzc1Byb3BzOnsiZmxvYXQiOmMuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGQsZSl7aWYoISghYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhYS5zdHlsZSkpe3ZhciBmLGg9Yy5jYW1lbENhc2UoYiksbD1hLnN0eWxlLGs9Yy5jc3NIb29rc1toXTtiPWMuY3NzUHJvcHNbaF18fGg7aWYoZCE9PUIpe2lmKCEodHlwZW9mIGQ9PT0ibnVtYmVyIiYmaXNOYU4oZCl8fGQ9PW51bGwpKXtpZih0eXBlb2YgZD09PSJudW1iZXIiJiYhYy5jc3NOdW1iZXJbaF0pZCs9InB4IjtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PUIpdHJ5e2xbYl09ZH1jYXRjaChvKXt9fX1lbHNle2lmKGsmJiJnZXQiaW4gayYmKGY9ay5nZXQoYSxmYWxzZSxlKSkhPT1CKXJldHVybiBmO3JldHVybiBsW2JdfX19LGNzczpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZj1jLmNhbWVsQ2FzZShiKSwKaD1jLmNzc0hvb2tzW2ZdO2I9Yy5jc3NQcm9wc1tmXXx8ZjtpZihoJiYiZ2V0ImluIGgmJihlPWguZ2V0KGEsdHJ1ZSxkKSkhPT1CKXJldHVybiBlO2Vsc2UgaWYoVylyZXR1cm4gVyhhLGIsZil9LHN3YXA6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXt9LGY7Zm9yKGYgaW4gYil7ZVtmXT1hLnN0eWxlW2ZdO2Euc3R5bGVbZl09YltmXX1kLmNhbGwoYSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWVbZl19LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGhiLGxiKX19KTtjLmN1ckNTUz1jLmNzcztjLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Yy5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGQsZSxmKXt2YXIgaDtpZihlKXtpZihkLm9mZnNldFdpZHRoIT09MCloPW9hKGQsYixmKTtlbHNlIGMuc3dhcChkLGtiLGZ1bmN0aW9uKCl7aD1vYShkLGIsZil9KTtpZihoPD0wKXtoPVcoZCxiLGIpO2lmKGg9PT0iMHB4IiYmYWEpaD1hYShkLGIsYik7CmlmKGghPW51bGwpcmV0dXJuIGg9PT0iInx8aD09PSJhdXRvIj8iMHB4IjpofWlmKGg8MHx8aD09bnVsbCl7aD1kLnN0eWxlW2JdO3JldHVybiBoPT09IiJ8fGg9PT0iYXV0byI/IjBweCI6aH1yZXR1cm4gdHlwZW9mIGg9PT0ic3RyaW5nIj9oOmgrInB4In19LHNldDpmdW5jdGlvbihkLGUpe2lmKEZhLnRlc3QoZSkpe2U9cGFyc2VGbG9hdChlKTtpZihlPj0wKXJldHVybiBlKyJweCJ9ZWxzZSByZXR1cm4gZX19fSk7aWYoIWMuc3VwcG9ydC5vcGFjaXR5KWMuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGdiLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnN0eWxlO2Quem9vbT0xO3ZhciBlPWMuaXNOYU4oYik/IiI6ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSIsZj0KZC5maWx0ZXJ8fCIiO2QuZmlsdGVyPUVhLnRlc3QoZik/Zi5yZXBsYWNlKEVhLGUpOmQuZmlsdGVyKyIgIitlfX07aWYodC5kZWZhdWx0VmlldyYmdC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKUdhPWZ1bmN0aW9uKGEsYixkKXt2YXIgZTtkPWQucmVwbGFjZShpYiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZighKGI9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSlyZXR1cm4gQjtpZihiPWIuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKXtlPWIuZ2V0UHJvcGVydHlWYWx1ZShkKTtpZihlPT09IiImJiFjLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkpZT1jLnN0eWxlKGEsZCl9cmV0dXJuIGV9O2lmKHQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSlhYT1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZj1hLmN1cnJlbnRTdHlsZSYmYS5jdXJyZW50U3R5bGVbYl0saD1hLnN0eWxlO2lmKCFGYS50ZXN0KGYpJiZqYi50ZXN0KGYpKXtkPWgubGVmdDsKZT1hLnJ1bnRpbWVTdHlsZS5sZWZ0O2EucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdDtoLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MDtmPWgucGl4ZWxMZWZ0KyJweCI7aC5sZWZ0PWQ7YS5ydW50aW1lU3R5bGUubGVmdD1lfXJldHVybiBmPT09IiI/ImF1dG8iOmZ9O1c9R2F8fGFhO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpe2MuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldEhlaWdodDtyZXR1cm4gYS5vZmZzZXRXaWR0aD09PTAmJmI9PT0wfHwhYy5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUuZGlzcGxheXx8Yy5jc3MoYSwiZGlzcGxheSIpKT09PSJub25lIn07Yy5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hYy5leHByLmZpbHRlcnMuaGlkZGVuKGEpfX12YXIgbWI9Yy5ub3coKSxuYj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSwKb2I9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2kscGI9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLHFiPS9eKD86R0VUfEhFQUQpJC8sUmE9L1xbXF0kLyxUPS9cPVw/KCZ8JCkvLGphPS9cPy8scmI9LyhbPyZdKV89W14mXSovLHNiPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLyx0Yj0vJTIwL2csdWI9LyMuKiQvLEhhPWMuZm4ubG9hZDtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYodHlwZW9mIGEhPT0ic3RyaW5nIiYmSGEpcmV0dXJuIEhhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZj1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfWU9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PQoib2JqZWN0Iil7Yj1jLnBhcmFtKGIsYy5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2U9IlBPU1QifXZhciBoPXRoaXM7Yy5hamF4KHt1cmw6YSx0eXBlOmUsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yixjb21wbGV0ZTpmdW5jdGlvbihsLGspe2lmKGs9PT0ic3VjY2VzcyJ8fGs9PT0ibm90bW9kaWZpZWQiKWguaHRtbChmP2MoIjxkaXY+IikuYXBwZW5kKGwucmVzcG9uc2VUZXh0LnJlcGxhY2UobmIsIiIpKS5maW5kKGYpOmwucmVzcG9uc2VUZXh0KTtkJiZoLmVhY2goZCxbbC5yZXNwb25zZVRleHQsayxsXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Yy5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJgohdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8b2IudGVzdCh0aGlzLm5vZGVOYW1lKXx8cGIudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBkPWModGhpcykudmFsKCk7cmV0dXJuIGQ9PW51bGw/bnVsbDpjLmlzQXJyYXkoZCk/Yy5tYXAoZCxmdW5jdGlvbihlKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6ZX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6ZH19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5iaW5kKGIsZCl9fSk7Yy5leHRlbmQoe2dldDpmdW5jdGlvbihhLGIsZCxlKXtpZihjLmlzRnVuY3Rpb24oYikpe2U9ZXx8ZDtkPWI7Yj1udWxsfXJldHVybiBjLmFqYXgoe3R5cGU6IkdFVCIsdXJsOmEsZGF0YTpiLHN1Y2Nlc3M6ZCxkYXRhVHlwZTplfSl9LApnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSxudWxsLGIsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5nZXQoYSxiLGQsImpzb24iKX0scG9zdDpmdW5jdGlvbihhLGIsZCxlKXtpZihjLmlzRnVuY3Rpb24oYikpe2U9ZXx8ZDtkPWI7Yj17fX1yZXR1cm4gYy5hamF4KHt0eXBlOiJQT1NUIix1cmw6YSxkYXRhOmIsc3VjY2VzczpkLGRhdGFUeXBlOmV9KX0sYWpheFNldHVwOmZ1bmN0aW9uKGEpe2MuZXh0ZW5kKGMuYWpheFNldHRpbmdzLGEpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLGdsb2JhbDp0cnVlLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6dHJ1ZSxhc3luYzp0cnVlLHhocjpmdW5jdGlvbigpe3JldHVybiBuZXcgRS5YTUxIdHRwUmVxdWVzdH0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLApzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0Iix0ZXh0OiJ0ZXh0L3BsYWluIixfZGVmYXVsdDoiKi8qIn19LGFqYXg6ZnVuY3Rpb24oYSl7dmFyIGI9Yy5leHRlbmQodHJ1ZSx7fSxjLmFqYXhTZXR0aW5ncyxhKSxkLGUsZixoPWIudHlwZS50b1VwcGVyQ2FzZSgpLGw9cWIudGVzdChoKTtiLnVybD1iLnVybC5yZXBsYWNlKHViLCIiKTtiLmNvbnRleHQ9YSYmYS5jb250ZXh0IT1udWxsP2EuY29udGV4dDpiO2lmKGIuZGF0YSYmYi5wcm9jZXNzRGF0YSYmdHlwZW9mIGIuZGF0YSE9PSJzdHJpbmciKWIuZGF0YT1jLnBhcmFtKGIuZGF0YSxiLnRyYWRpdGlvbmFsKTtpZihiLmRhdGFUeXBlPT09Impzb25wIil7aWYoaD09PSJHRVQiKVQudGVzdChiLnVybCl8fChiLnVybCs9KGphLnRlc3QoYi51cmwpPyImIjoiPyIpKyhiLmpzb25wfHwiY2FsbGJhY2siKSsiPT8iKTtlbHNlIGlmKCFiLmRhdGF8fAohVC50ZXN0KGIuZGF0YSkpYi5kYXRhPShiLmRhdGE/Yi5kYXRhKyImIjoiIikrKGIuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7Yi5kYXRhVHlwZT0ianNvbiJ9aWYoYi5kYXRhVHlwZT09PSJqc29uIiYmKGIuZGF0YSYmVC50ZXN0KGIuZGF0YSl8fFQudGVzdChiLnVybCkpKXtkPWIuanNvbnBDYWxsYmFja3x8Impzb25wIittYisrO2lmKGIuZGF0YSliLmRhdGE9KGIuZGF0YSsiIikucmVwbGFjZShULCI9IitkKyIkMSIpO2IudXJsPWIudXJsLnJlcGxhY2UoVCwiPSIrZCsiJDEiKTtiLmRhdGFUeXBlPSJzY3JpcHQiO3ZhciBrPUVbZF07RVtkXT1mdW5jdGlvbihtKXtpZihjLmlzRnVuY3Rpb24oaykpayhtKTtlbHNle0VbZF09Qjt0cnl7ZGVsZXRlIEVbZF19Y2F0Y2gocCl7fX1mPW07Yy5oYW5kbGVTdWNjZXNzKGIsdyxlLGYpO2MuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7ciYmci5yZW1vdmVDaGlsZChBKX19aWYoYi5kYXRhVHlwZT09PSJzY3JpcHQiJiZiLmNhY2hlPT09bnVsbCliLmNhY2hlPQpmYWxzZTtpZihiLmNhY2hlPT09ZmFsc2UmJmwpe3ZhciBvPWMubm93KCkseD1iLnVybC5yZXBsYWNlKHJiLCIkMV89IitvKTtiLnVybD14Kyh4PT09Yi51cmw/KGphLnRlc3QoYi51cmwpPyImIjoiPyIpKyJfPSIrbzoiIil9aWYoYi5kYXRhJiZsKWIudXJsKz0oamEudGVzdChiLnVybCk/IiYiOiI/IikrYi5kYXRhO2IuZ2xvYmFsJiZjLmFjdGl2ZSsrPT09MCYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtvPShvPXNiLmV4ZWMoYi51cmwpKSYmKG9bMV0mJm9bMV0udG9Mb3dlckNhc2UoKSE9PWxvY2F0aW9uLnByb3RvY29sfHxvWzJdLnRvTG93ZXJDYXNlKCkhPT1sb2NhdGlvbi5ob3N0KTtpZihiLmRhdGFUeXBlPT09InNjcmlwdCImJmg9PT0iR0VUIiYmbyl7dmFyIHI9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHx0LmRvY3VtZW50RWxlbWVudCxBPXQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoYi5zY3JpcHRDaGFyc2V0KUEuY2hhcnNldD1iLnNjcmlwdENoYXJzZXQ7CkEuc3JjPWIudXJsO2lmKCFkKXt2YXIgQz1mYWxzZTtBLm9ubG9hZD1BLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKCFDJiYoIXRoaXMucmVhZHlTdGF0ZXx8dGhpcy5yZWFkeVN0YXRlPT09ImxvYWRlZCJ8fHRoaXMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpKXtDPXRydWU7Yy5oYW5kbGVTdWNjZXNzKGIsdyxlLGYpO2MuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7QS5vbmxvYWQ9QS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDtyJiZBLnBhcmVudE5vZGUmJnIucmVtb3ZlQ2hpbGQoQSl9fX1yLmluc2VydEJlZm9yZShBLHIuZmlyc3RDaGlsZCk7cmV0dXJuIEJ9dmFyIEo9ZmFsc2Usdz1iLnhocigpO2lmKHcpe2IudXNlcm5hbWU/dy5vcGVuKGgsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpOncub3BlbihoLGIudXJsLGIuYXN5bmMpO3RyeXtpZihiLmRhdGEhPW51bGwmJiFsfHxhJiZhLmNvbnRlbnRUeXBlKXcuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwKYi5jb250ZW50VHlwZSk7aWYoYi5pZk1vZGlmaWVkKXtjLmxhc3RNb2RpZmllZFtiLnVybF0mJncuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGMubGFzdE1vZGlmaWVkW2IudXJsXSk7Yy5ldGFnW2IudXJsXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixjLmV0YWdbYi51cmxdKX1vfHx3LnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpO3cuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixiLmRhdGFUeXBlJiZiLmFjY2VwdHNbYi5kYXRhVHlwZV0/Yi5hY2NlcHRzW2IuZGF0YVR5cGVdKyIsICovKjsgcT0wLjAxIjpiLmFjY2VwdHMuX2RlZmF1bHQpfWNhdGNoKEkpe31pZihiLmJlZm9yZVNlbmQmJmIuYmVmb3JlU2VuZC5jYWxsKGIuY29udGV4dCx3LGIpPT09ZmFsc2Upe2IuZ2xvYmFsJiZjLmFjdGl2ZS0tPT09MSYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpO3cuYWJvcnQoKTtyZXR1cm4gZmFsc2V9Yi5nbG9iYWwmJgpjLnRyaWdnZXJHbG9iYWwoYiwiYWpheFNlbmQiLFt3LGJdKTt2YXIgTD13Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihtKXtpZighd3x8dy5yZWFkeVN0YXRlPT09MHx8bT09PSJhYm9ydCIpe0p8fGMuaGFuZGxlQ29tcGxldGUoYix3LGUsZik7Sj10cnVlO2lmKHcpdy5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUomJncmJih3LnJlYWR5U3RhdGU9PT00fHxtPT09InRpbWVvdXQiKSl7Sj10cnVlO3cub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtlPW09PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHcpPyJlcnJvciI6Yi5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh3LGIudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihlPT09InN1Y2Nlc3MiKXRyeXtmPWMuaHR0cERhdGEodyxiLmRhdGFUeXBlLGIpfWNhdGNoKHEpe2U9InBhcnNlcmVycm9yIjtwPXF9aWYoZT09PSJzdWNjZXNzInx8ZT09PSJub3Rtb2RpZmllZCIpZHx8CmMuaGFuZGxlU3VjY2VzcyhiLHcsZSxmKTtlbHNlIGMuaGFuZGxlRXJyb3IoYix3LGUscCk7ZHx8Yy5oYW5kbGVDb21wbGV0ZShiLHcsZSxmKTttPT09InRpbWVvdXQiJiZ3LmFib3J0KCk7aWYoYi5hc3luYyl3PW51bGx9fTt0cnl7dmFyIGc9dy5hYm9ydDt3LmFib3J0PWZ1bmN0aW9uKCl7dyYmRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuY2FsbChnLHcpO0woImFib3J0Iil9fWNhdGNoKGkpe31iLmFzeW5jJiZiLnRpbWVvdXQ+MCYmc2V0VGltZW91dChmdW5jdGlvbigpe3cmJiFKJiZMKCJ0aW1lb3V0Iil9LGIudGltZW91dCk7dHJ5e3cuc2VuZChsfHxiLmRhdGE9PW51bGw/bnVsbDpiLmRhdGEpfWNhdGNoKG4pe2MuaGFuZGxlRXJyb3IoYix3LG51bGwsbik7Yy5oYW5kbGVDb21wbGV0ZShiLHcsZSxmKX1iLmFzeW5jfHxMKCk7cmV0dXJuIHd9fSxwYXJhbTpmdW5jdGlvbihhLGIpe3ZhciBkPVtdLGU9ZnVuY3Rpb24oaCxsKXtsPWMuaXNGdW5jdGlvbihsKT9sKCk6bDtkW2QubGVuZ3RoXT0KZW5jb2RlVVJJQ29tcG9uZW50KGgpKyI9IitlbmNvZGVVUklDb21wb25lbnQobCl9O2lmKGI9PT1CKWI9Yy5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7aWYoYy5pc0FycmF5KGEpfHxhLmpxdWVyeSljLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGYgaW4gYSlkYShmLGFbZl0sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSh0YiwiKyIpfX0pO2MuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhLGIsZCxlKXthLmVycm9yJiZhLmVycm9yLmNhbGwoYS5jb250ZXh0LGIsZCxlKTthLmdsb2JhbCYmYy50cmlnZ2VyR2xvYmFsKGEsImFqYXhFcnJvciIsW2IsYSxlXSl9LGhhbmRsZVN1Y2Nlc3M6ZnVuY3Rpb24oYSxiLGQsZSl7YS5zdWNjZXNzJiZhLnN1Y2Nlc3MuY2FsbChhLmNvbnRleHQsZSxkLGIpO2EuZ2xvYmFsJiZjLnRyaWdnZXJHbG9iYWwoYSwiYWpheFN1Y2Nlc3MiLApbYixhXSl9LGhhbmRsZUNvbXBsZXRlOmZ1bmN0aW9uKGEsYixkKXthLmNvbXBsZXRlJiZhLmNvbXBsZXRlLmNhbGwoYS5jb250ZXh0LGIsZCk7YS5nbG9iYWwmJmMudHJpZ2dlckdsb2JhbChhLCJhamF4Q29tcGxldGUiLFtiLGFdKTthLmdsb2JhbCYmYy5hY3RpdmUtLT09PTEmJmMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKX0sdHJpZ2dlckdsb2JhbDpmdW5jdGlvbihhLGIsZCl7KGEuY29udGV4dCYmYS5jb250ZXh0LnVybD09bnVsbD9jKGEuY29udGV4dCk6Yy5ldmVudCkudHJpZ2dlcihiLGQpfSxodHRwU3VjY2VzczpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIWEuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09PSJmaWxlOiJ8fGEuc3RhdHVzPj0yMDAmJmEuc3RhdHVzPDMwMHx8YS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09MTIyM31jYXRjaChiKXt9cmV0dXJuIGZhbHNlfSxodHRwTm90TW9kaWZpZWQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksCmU9YS5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpO2lmKGQpYy5sYXN0TW9kaWZpZWRbYl09ZDtpZihlKWMuZXRhZ1tiXT1lO3JldHVybiBhLnN0YXR1cz09PTMwNH0saHR0cERhdGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpfHwiIixmPWI9PT0ieG1sInx8IWImJmUuaW5kZXhPZigieG1sIik+PTA7YT1mP2EucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQ7ZiYmYS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWU9PT0icGFyc2VyZXJyb3IiJiZjLmVycm9yKCJwYXJzZXJlcnJvciIpO2lmKGQmJmQuZGF0YUZpbHRlcilhPWQuZGF0YUZpbHRlcihhLGIpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoYj09PSJqc29uInx8IWImJmUuaW5kZXhPZigianNvbiIpPj0wKWE9Yy5wYXJzZUpTT04oYSk7ZWxzZSBpZihiPT09InNjcmlwdCJ8fCFiJiZlLmluZGV4T2YoImphdmFzY3JpcHQiKT49MCljLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fSk7CmlmKEUuQWN0aXZlWE9iamVjdCljLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXtpZihFLmxvY2F0aW9uLnByb3RvY29sIT09ImZpbGU6Iil0cnl7cmV0dXJuIG5ldyBFLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe310cnl7cmV0dXJuIG5ldyBFLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX07Yy5zdXBwb3J0LmFqYXg9ISFjLmFqYXhTZXR0aW5ncy54aHIoKTt2YXIgZWE9e30sdmI9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHdiPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoLiopJC8sYmEscGE9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV07Yy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGQpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoUygic2hvdyIsCjMpLGEsYixkKTtlbHNle2Q9MDtmb3IodmFyIGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKCFjLmRhdGEoYSwib2xkZGlzcGxheSIpJiZiPT09Im5vbmUiKWI9YS5zdHlsZS5kaXNwbGF5PSIiO2I9PT0iIiYmYy5jc3MoYSwiZGlzcGxheSIpPT09Im5vbmUiJiZjLmRhdGEoYSwib2xkZGlzcGxheSIscWEoYS5ub2RlTmFtZSkpfWZvcihkPTA7ZDxlO2QrKyl7YT10aGlzW2RdO2I9YS5zdHlsZS5kaXNwbGF5O2lmKGI9PT0iInx8Yj09PSJub25lIilhLnN0eWxlLmRpc3BsYXk9Yy5kYXRhKGEsIm9sZGRpc3BsYXkiKXx8IiJ9cmV0dXJuIHRoaXN9fSxoaWRlOmZ1bmN0aW9uKGEsYixkKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKFMoImhpZGUiLDMpLGEsYixkKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXtkPWMuY3NzKHRoaXNbYV0sImRpc3BsYXkiKTtkIT09Im5vbmUiJiZjLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIsCmQpfWZvcihhPTA7YTxiO2ErKyl0aGlzW2FdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3JldHVybiB0aGlzfX0sX3RvZ2dsZTpjLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXR5cGVvZiBhPT09ImJvb2xlYW4iO2lmKGMuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpKXRoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZWxzZSBhPT1udWxsfHxlP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBmPWU/YTpjKHRoaXMpLmlzKCI6aGlkZGVuIik7Yyh0aGlzKVtmPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoUygidG9nZ2xlIiwzKSxhLGIsZCk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsZCxlKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsZCxlKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1jLnNwZWVkKGIsCmQsZSk7aWYoYy5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZi5jb21wbGV0ZSk7cmV0dXJuIHRoaXNbZi5xdWV1ZT09PWZhbHNlPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe3ZhciBoPWMuZXh0ZW5kKHt9LGYpLGwsaz10aGlzLm5vZGVUeXBlPT09MSxvPWsmJmModGhpcykuaXMoIjpoaWRkZW4iKSx4PXRoaXM7Zm9yKGwgaW4gYSl7dmFyIHI9Yy5jYW1lbENhc2UobCk7aWYobCE9PXIpe2Fbcl09YVtsXTtkZWxldGUgYVtsXTtsPXJ9aWYoYVtsXT09PSJoaWRlIiYmb3x8YVtsXT09PSJzaG93IiYmIW8pcmV0dXJuIGguY29tcGxldGUuY2FsbCh0aGlzKTtpZihrJiYobD09PSJoZWlnaHQifHxsPT09IndpZHRoIikpe2gub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldO2lmKGMuY3NzKHRoaXMsImRpc3BsYXkiKT09PSJpbmxpbmUiJiZjLmNzcyh0aGlzLCJmbG9hdCIpPT09Im5vbmUiKWlmKGMuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0KWlmKHFhKHRoaXMubm9kZU5hbWUpPT09CiJpbmxpbmUiKXRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjtlbHNle3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lIjt0aGlzLnN0eWxlLnpvb209MX1lbHNlIHRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1pZihjLmlzQXJyYXkoYVtsXSkpeyhoLnNwZWNpYWxFYXNpbmc9aC5zcGVjaWFsRWFzaW5nfHx7fSlbbF09YVtsXVsxXTthW2xdPWFbbF1bMF19fWlmKGgub3ZlcmZsb3chPW51bGwpdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtoLmN1ckFuaW09Yy5leHRlbmQoe30sYSk7Yy5lYWNoKGEsZnVuY3Rpb24oQSxDKXt2YXIgSj1uZXcgYy5meCh4LGgsQSk7aWYodmIudGVzdChDKSlKW0M9PT0idG9nZ2xlIj9vPyJzaG93IjoiaGlkZSI6Q10oYSk7ZWxzZXt2YXIgdz13Yi5leGVjKEMpLEk9Si5jdXIoKXx8MDtpZih3KXt2YXIgTD1wYXJzZUZsb2F0KHdbMl0pLGc9d1szXXx8InB4IjtpZihnIT09InB4Iil7Yy5zdHlsZSh4LEEsKEx8fDEpK2cpO0k9KEx8fAoxKS9KLmN1cigpKkk7Yy5zdHlsZSh4LEEsSStnKX1pZih3WzFdKUw9KHdbMV09PT0iLT0iPy0xOjEpKkwrSTtKLmN1c3RvbShJLEwsZyl9ZWxzZSBKLmN1c3RvbShJLEMsIiIpfX0pO3JldHVybiB0cnVlfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLnRpbWVyczthJiZ0aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXtmb3IodmFyIGU9ZC5sZW5ndGgtMTtlPj0wO2UtLSlpZihkW2VdLmVsZW09PT10aGlzKXtiJiZkW2VdKHRydWUpO2Quc3BsaWNlKGUsMSl9fSk7Ynx8dGhpcy5kZXF1ZXVlKCk7cmV0dXJuIHRoaXN9fSk7Yy5lYWNoKHtzbGlkZURvd246Uygic2hvdyIsMSksc2xpZGVVcDpTKCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpTKCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsCmQsZSxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEmJnR5cGVvZiBhPT09Im9iamVjdCI/Yy5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmR8fCFkJiZifHxjLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6ZCYmYnx8YiYmIWMuaXNGdW5jdGlvbihiKSYmYn07ZS5kdXJhdGlvbj1jLmZ4Lm9mZj8wOnR5cGVvZiBlLmR1cmF0aW9uPT09Im51bWJlciI/ZS5kdXJhdGlvbjplLmR1cmF0aW9uIGluIGMuZnguc3BlZWRzP2MuZnguc3BlZWRzW2UuZHVyYXRpb25dOmMuZnguc3BlZWRzLl9kZWZhdWx0O2Uub2xkPWUuY29tcGxldGU7ZS5jb21wbGV0ZT1mdW5jdGlvbigpe2UucXVldWUhPT1mYWxzZSYmYyh0aGlzKS5kZXF1ZXVlKCk7Yy5pc0Z1bmN0aW9uKGUub2xkKSYmZS5vbGQuY2FsbCh0aGlzKX07cmV0dXJuIGV9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiBkK2UqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGQsZSl7cmV0dXJuKC1NYXRoLmNvcyhhKgpNYXRoLlBJKS8yKzAuNSkqZStkfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixkKXt0aGlzLm9wdGlvbnM9Yjt0aGlzLmVsZW09YTt0aGlzLnByb3A9ZDtpZighYi5vcmlnKWIub3JpZz17fX19KTtjLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpOyhjLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Yy5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhPXBhcnNlRmxvYXQoYy5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCkpO3JldHVybiBhJiZhPi0xRTQ/YTowfSxjdXN0b206ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGUobCl7cmV0dXJuIGYuc3RlcChsKX0KdmFyIGY9dGhpcyxoPWMuZng7dGhpcy5zdGFydFRpbWU9Yy5ub3coKTt0aGlzLnN0YXJ0PWE7dGhpcy5lbmQ9Yjt0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwicHgiO3RoaXMubm93PXRoaXMuc3RhcnQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0wO2UuZWxlbT10aGlzLmVsZW07aWYoZSgpJiZjLnRpbWVycy5wdXNoKGUpJiYhYmEpYmE9c2V0SW50ZXJ2YWwoaC50aWNrLGguaW50ZXJ2YWwpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTsKdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYj1jLm5vdygpLGQ9dHJ1ZTtpZihhfHxiPj10aGlzLm9wdGlvbnMuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kO3RoaXMucG9zPXRoaXMuc3RhdGU9MTt0aGlzLnVwZGF0ZSgpO3RoaXMub3B0aW9ucy5jdXJBbmltW3RoaXMucHJvcF09dHJ1ZTtmb3IodmFyIGUgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0paWYodGhpcy5vcHRpb25zLmN1ckFuaW1bZV0hPT10cnVlKWQ9ZmFsc2U7aWYoZCl7aWYodGhpcy5vcHRpb25zLm92ZXJmbG93IT1udWxsJiYhYy5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3Mpe3ZhciBmPXRoaXMuZWxlbSxoPXRoaXMub3B0aW9ucztjLmVhY2goWyIiLCJYIiwiWSJdLGZ1bmN0aW9uKGssbyl7Zi5zdHlsZVsib3ZlcmZsb3ciK29dPWgub3ZlcmZsb3dba119KX10aGlzLm9wdGlvbnMuaGlkZSYmYyh0aGlzLmVsZW0pLmhpZGUoKTtpZih0aGlzLm9wdGlvbnMuaGlkZXx8CnRoaXMub3B0aW9ucy5zaG93KWZvcih2YXIgbCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSljLnN0eWxlKHRoaXMuZWxlbSxsLHRoaXMub3B0aW9ucy5vcmlnW2xdKTt0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0aGlzLmVsZW0pfXJldHVybiBmYWxzZX1lbHNle2E9Yi10aGlzLnN0YXJ0VGltZTt0aGlzLnN0YXRlPWEvdGhpcy5vcHRpb25zLmR1cmF0aW9uO2I9dGhpcy5vcHRpb25zLmVhc2luZ3x8KGMuZWFzaW5nLnN3aW5nPyJzd2luZyI6ImxpbmVhciIpO3RoaXMucG9zPWMuZWFzaW5nW3RoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nJiZ0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZ1t0aGlzLnByb3BdfHxiXSh0aGlzLnN0YXRlLGEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3M7dGhpcy51cGRhdGUoKX1yZXR1cm4gdHJ1ZX19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CmMudGltZXJzLGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdKCl8fGEuc3BsaWNlKGItLSwxKTthLmxlbmd0aHx8Yy5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGJhKTtiYT1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtjLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtpZihhLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsKWEuZWxlbS5zdHlsZVthLnByb3BdPShhLnByb3A9PT0id2lkdGgifHxhLnByb3A9PT0iaGVpZ2h0Ij9NYXRoLm1heCgwLGEubm93KTphLm5vdykrYS51bml0O2Vsc2UgYS5lbGVtW2EucHJvcF09YS5ub3d9fX0pO2lmKGMuZXhwciYmYy5leHByLmZpbHRlcnMpYy5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZ3JlcChjLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PQpiLmVsZW19KS5sZW5ndGh9O3ZhciB4Yj0vXnQoPzphYmxlfGR8aCkkL2ksSWE9L14oPzpib2R5fGh0bWwpJC9pO2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gdC5kb2N1bWVudEVsZW1lbnQ/ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxkO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihsKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGwpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtkPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZSl7fXZhciBmPWIub3duZXJEb2N1bWVudCxoPWYuZG9jdW1lbnRFbGVtZW50O2lmKCFkfHwhYy5jb250YWlucyhoLGIpKXJldHVybiBkfHx7dG9wOjAsbGVmdDowfTtiPWYuYm9keTtmPWZhKGYpO3JldHVybnt0b3A6ZC50b3ArKGYucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmCmguc2Nyb2xsVG9wfHxiLnNjcm9sbFRvcCktKGguY2xpZW50VG9wfHxiLmNsaWVudFRvcHx8MCksbGVmdDpkLmxlZnQrKGYucGFnZVhPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmaC5zY3JvbGxMZWZ0fHxiLnNjcm9sbExlZnQpLShoLmNsaWVudExlZnR8fGIuY2xpZW50TGVmdHx8MCl9fTpmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih4KXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLHgpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO2Mub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZCxlPWIub2Zmc2V0UGFyZW50LGY9Yi5vd25lckRvY3VtZW50LGg9Zi5kb2N1bWVudEVsZW1lbnQsbD1mLmJvZHk7ZD0oZj1mLmRlZmF1bHRWaWV3KT9mLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZTsKZm9yKHZhciBrPWIub2Zmc2V0VG9wLG89Yi5vZmZzZXRMZWZ0OyhiPWIucGFyZW50Tm9kZSkmJmIhPT1sJiZiIT09aDspe2lmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZC5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7ZD1mP2YuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlO2stPWIuc2Nyb2xsVG9wO28tPWIuc2Nyb2xsTGVmdDtpZihiPT09ZSl7ays9Yi5vZmZzZXRUb3A7bys9Yi5vZmZzZXRMZWZ0O2lmKGMub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXImJiEoYy5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMmJnhiLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwO28rPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwfWU9Yi5vZmZzZXRQYXJlbnR9aWYoYy5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZkLm92ZXJmbG93IT09InZpc2libGUiKXtrKz0KcGFyc2VGbG9hdChkLmJvcmRlclRvcFdpZHRoKXx8MDtvKz1wYXJzZUZsb2F0KGQuYm9yZGVyTGVmdFdpZHRoKXx8MH1kPWR9aWYoZC5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGQucG9zaXRpb249PT0ic3RhdGljIil7ays9bC5vZmZzZXRUb3A7bys9bC5vZmZzZXRMZWZ0fWlmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZC5wb3NpdGlvbj09PSJmaXhlZCIpe2srPU1hdGgubWF4KGguc2Nyb2xsVG9wLGwuc2Nyb2xsVG9wKTtvKz1NYXRoLm1heChoLnNjcm9sbExlZnQsbC5zY3JvbGxMZWZ0KX1yZXR1cm57dG9wOmssbGVmdDpvfX07Yy5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10LmJvZHksYj10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQsZSxmLGg9cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7Yy5leHRlbmQoYi5zdHlsZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsCmhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSk7Yi5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7YS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2Q9Yi5maXJzdENoaWxkO2U9ZC5maXJzdENoaWxkO2Y9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5kb2VzTm90QWRkQm9yZGVyPWUub2Zmc2V0VG9wIT09NTt0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPQpmLm9mZnNldFRvcD09PTU7ZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2Uuc3R5bGUudG9wPSIyMHB4Ijt0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1O2Uuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiI7ZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNTt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09aDthLnJlbW92ZUNoaWxkKGIpO2Mub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmNzcyhhLAoibWFyZ2luVG9wIikpfHwwO2QrPXBhcnNlRmxvYXQoYy5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MH1yZXR1cm57dG9wOmIsbGVmdDpkfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1jLmNzcyhhLCJwb3NpdGlvbiIpO2lmKGU9PT0ic3RhdGljIilhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7dmFyIGY9YyhhKSxoPWYub2Zmc2V0KCksbD1jLmNzcyhhLCJ0b3AiKSxrPWMuY3NzKGEsImxlZnQiKSxvPWU9PT0iYWJzb2x1dGUiJiZjLmluQXJyYXkoImF1dG8iLFtsLGtdKT4tMTtlPXt9O3ZhciB4PXt9O2lmKG8peD1mLnBvc2l0aW9uKCk7bD1vP3gudG9wOnBhcnNlSW50KGwsMTApfHwwO2s9bz94LmxlZnQ6cGFyc2VJbnQoaywxMCl8fDA7aWYoYy5pc0Z1bmN0aW9uKGIpKWI9Yi5jYWxsKGEsZCxoKTtpZihiLnRvcCE9bnVsbCllLnRvcD1iLnRvcC1oLnRvcCtsO2lmKGIubGVmdCE9bnVsbCllLmxlZnQ9Yi5sZWZ0LWgubGVmdCtrOyJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLAplKTpmLmNzcyhlKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxlPUlhLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDA7ZC5sZWZ0LT1wYXJzZUZsb2F0KGMuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDA7ZS50b3ArPXBhcnNlRmxvYXQoYy5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDA7ZS5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmQudG9wLWUudG9wLGxlZnQ6ZC5sZWZ0LWUubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8dC5ib2R5O2EmJiFJYS50ZXN0KGEubm9kZU5hbWUpJiYKYy5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSk7Yy5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYil7dmFyIGQ9InNjcm9sbCIrYjtjLmZuW2RdPWZ1bmN0aW9uKGUpe3ZhciBmPXRoaXNbMF0saDtpZighZilyZXR1cm4gbnVsbDtpZihlIT09QilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoaD1mYSh0aGlzKSloLnNjcm9sbFRvKCFhP2U6YyhoKS5zY3JvbGxMZWZ0KCksYT9lOmMoaCkuc2Nyb2xsVG9wKCkpO2Vsc2UgdGhpc1tkXT1lfSk7ZWxzZSByZXR1cm4oaD1mYShmKSk/InBhZ2VYT2Zmc2V0ImluIGg/aFthPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZoLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8aC5kb2N1bWVudC5ib2R5W2RdOmZbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTsKYy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbMF0/cGFyc2VGbG9hdChjLmNzcyh0aGlzWzBdLGQsInBhZGRpbmciKSk6bnVsbH07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzWzBdP3BhcnNlRmxvYXQoYy5jc3ModGhpc1swXSxkLGU/Im1hcmdpbiI6ImJvcmRlciIpKTpudWxsfTtjLmZuW2RdPWZ1bmN0aW9uKGUpe3ZhciBmPXRoaXNbMF07aWYoIWYpcmV0dXJuIGU9PW51bGw/bnVsbDp0aGlzO2lmKGMuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGwpe3ZhciBrPWModGhpcyk7a1tkXShlLmNhbGwodGhpcyxsLGtbZF0oKSkpfSk7aWYoYy5pc1dpbmRvdyhmKSlyZXR1cm4gZi5kb2N1bWVudC5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiJiZmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitiXXx8Zi5kb2N1bWVudC5ib2R5WyJjbGllbnQiK2JdO2Vsc2UgaWYoZi5ub2RlVHlwZT09PTkpcmV0dXJuIE1hdGgubWF4KGYuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiKwpiXSxmLmJvZHlbInNjcm9sbCIrYl0sZi5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIrYl0sZi5ib2R5WyJvZmZzZXQiK2JdLGYuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK2JdKTtlbHNlIGlmKGU9PT1CKXtmPWMuY3NzKGYsZCk7dmFyIGg9cGFyc2VGbG9hdChmKTtyZXR1cm4gYy5pc05hTihoKT9mOmh9ZWxzZSByZXR1cm4gdGhpcy5jc3MoZCx0eXBlb2YgZT09PSJzdHJpbmciP2U6ZSsicHgiKX19KX0pKHdpbmRvdyk7Cg=="></script>\n',
' <script id= "script_sl_jqueryui_js" src="data:/text/plain;base64,LyohIGpRdWVyeSBVSSAtIHYxLjguMjQgLSAyMDEyLTA5LTI4CiogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKKiBJbmNsdWRlczoganF1ZXJ5LnVpLmNvcmUuanMsIGpxdWVyeS51aS53aWRnZXQuanMsIGpxdWVyeS51aS5tb3VzZS5qcywganF1ZXJ5LnVpLmRyYWdnYWJsZS5qcywganF1ZXJ5LnVpLmRyb3BwYWJsZS5qcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5qcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMsIGpxdWVyeS51aS5zb3J0YWJsZS5qcywganF1ZXJ5LmVmZmVjdHMuY29yZS5qcywganF1ZXJ5LmVmZmVjdHMuYmxpbmQuanMsIGpxdWVyeS5lZmZlY3RzLmJvdW5jZS5qcywganF1ZXJ5LmVmZmVjdHMuY2xpcC5qcywganF1ZXJ5LmVmZmVjdHMuZHJvcC5qcywganF1ZXJ5LmVmZmVjdHMuZXhwbG9kZS5qcywganF1ZXJ5LmVmZmVjdHMuZmFkZS5qcywganF1ZXJ5LmVmZmVjdHMuZm9sZC5qcywganF1ZXJ5LmVmZmVjdHMuaGlnaGxpZ2h0LmpzLCBqcXVlcnkuZWZmZWN0cy5wdWxzYXRlLmpzLCBqcXVlcnkuZWZmZWN0cy5zY2FsZS5qcywganF1ZXJ5LmVmZmVjdHMuc2hha2UuanMsIGpxdWVyeS5lZmZlY3RzLnNsaWRlLmpzLCBqcXVlcnkuZWZmZWN0cy50cmFuc2Zlci5qcywganF1ZXJ5LnVpLmFjY29yZGlvbi5qcywganF1ZXJ5LnVpLmF1dG9jb21wbGV0ZS5qcywganF1ZXJ5LnVpLmJ1dHRvbi5qcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMsIGpxdWVyeS51aS5kaWFsb2cuanMsIGpxdWVyeS51aS5wb3NpdGlvbi5qcywganF1ZXJ5LnVpLnByb2dyZXNzYmFyLmpzLCBqcXVlcnkudWkuc2xpZGVyLmpzLCBqcXVlcnkudWkudGFicy5qcwoqIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiLGMpe3ZhciBlPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigiYXJlYSI9PT1lKXt2YXIgZj1iLnBhcmVudE5vZGUsZz1mLm5hbWUsaDtyZXR1cm4hYi5ocmVmfHwhZ3x8Zi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im1hcCI/ITE6KGg9YSgiaW1nW3VzZW1hcD0jIitnKyJdIilbMF0sISFoJiZkKGgpKX1yZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGUpPyFiLmRpc2FibGVkOiJhIj09ZT9iLmhyZWZ8fGM6YykmJmQoYil9ZnVuY3Rpb24gZChiKXtyZXR1cm4hYShiKS5wYXJlbnRzKCkuYW5kU2VsZigpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBhLmN1ckNTUyh0aGlzLCJ2aXNpYmlsaXR5Iik9PT0iaGlkZGVuInx8YS5leHByLmZpbHRlcnMuaGlkZGVuKHRoaXMpfSkubGVuZ3RofWEudWk9YS51aXx8e307aWYoYS51aS52ZXJzaW9uKXJldHVybjthLmV4dGVuZChhLnVpLHt2ZXJzaW9uOiIxLjguMjQiLGtleUNvZGU6e0FMVDoxOCxCQUNLU1BBQ0U6OCxDQVBTX0xPQ0s6MjAsQ09NTUE6MTg4LENPTU1BTkQ6OTEsQ09NTUFORF9MRUZUOjkxLENPTU1BTkRfUklHSFQ6OTMsQ09OVFJPTDoxNyxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsSU5TRVJUOjQ1LExFRlQ6MzcsTUVOVTo5MyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9TVUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTSElGVDoxNixTUEFDRTozMixUQUI6OSxVUDozOCxXSU5ET1dTOjkxfX0pLGEuZm4uZXh0ZW5kKHtwcm9wQXR0cjphLmZuLnByb3B8fGEuZm4uYXR0cixfZm9jdXM6YS5mbi5mb2N1cyxmb2N1czpmdW5jdGlvbihiLGMpe3JldHVybiB0eXBlb2YgYj09Im51bWJlciI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YShkKS5mb2N1cygpLGMmJmMuY2FsbChkKX0sYil9KTp0aGlzLl9mb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHNjcm9sbFBhcmVudDpmdW5jdGlvbigpe3ZhciBiO3JldHVybiBhLmJyb3dzZXIubXNpZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT9iPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsInBvc2l0aW9uIiwxKSkmJi8oYXV0b3xzY3JvbGwpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTpiPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8oYXV0b3xzY3JvbGwpLy50ZXN0KGEuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKSthLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKSwvZml4ZWQvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwhYi5sZW5ndGg/YShkb2N1bWVudCk6Yn0sekluZGV4OmZ1bmN0aW9uKGMpe2lmKGMhPT1iKXJldHVybiB0aGlzLmNzcygiekluZGV4IixjKTtpZih0aGlzLmxlbmd0aCl7dmFyIGQ9YSh0aGlzWzBdKSxlLGY7d2hpbGUoZC5sZW5ndGgmJmRbMF0hPT1kb2N1bWVudCl7ZT1kLmNzcygicG9zaXRpb24iKTtpZihlPT09ImFic29sdXRlInx8ZT09PSJyZWxhdGl2ZSJ8fGU9PT0iZml4ZWQiKXtmPXBhcnNlSW50KGQuY3NzKCJ6SW5kZXgiKSwxMCk7aWYoIWlzTmFOKGYpJiZmIT09MClyZXR1cm4gZn1kPWQucGFyZW50KCl9fXJldHVybiAwfSxkaXNhYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmluZCgoYS5zdXBwb3J0LnNlbGVjdHN0YXJ0PyJzZWxlY3RzdGFydCI6Im1vdXNlZG93biIpKyIudWktZGlzYWJsZVNlbGVjdGlvbiIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSl9LGVuYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuYmluZCgiLnVpLWRpc2FibGVTZWxlY3Rpb24iKX19KSxhKCI8YT4iKS5vdXRlcldpZHRoKDEpLmpxdWVyeXx8YS5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihjLGQpe2Z1bmN0aW9uIGgoYixjLGQsZil7cmV0dXJuIGEuZWFjaChlLGZ1bmN0aW9uKCl7Yy09cGFyc2VGbG9hdChhLmN1ckNTUyhiLCJwYWRkaW5nIit0aGlzLCEwKSl8fDAsZCYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwiYm9yZGVyIit0aGlzKyJXaWR0aCIsITApKXx8MCksZiYmKGMtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwibWFyZ2luIit0aGlzLCEwKSl8fDApfSksY312YXIgZT1kPT09IldpZHRoIj9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90dG9tIl0sZj1kLnRvTG93ZXJDYXNlKCksZz17aW5uZXJXaWR0aDphLmZuLmlubmVyV2lkdGgsaW5uZXJIZWlnaHQ6YS5mbi5pbm5lckhlaWdodCxvdXRlcldpZHRoOmEuZm4ub3V0ZXJXaWR0aCxvdXRlckhlaWdodDphLmZuLm91dGVySGVpZ2h0fTthLmZuWyJpbm5lciIrZF09ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PT1iP2dbImlubmVyIitkXS5jYWxsKHRoaXMpOnRoaXMuZWFjaChmdW5jdGlvbigpe2EodGhpcykuY3NzKGYsaCh0aGlzLGMpKyJweCIpfSl9LGEuZm5bIm91dGVyIitkXT1mdW5jdGlvbihiLGMpe3JldHVybiB0eXBlb2YgYiE9Im51bWJlciI/Z1sib3V0ZXIiK2RdLmNhbGwodGhpcyxiKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhmLGgodGhpcyxiLCEwLGMpKyJweCIpfSl9fSksYS5leHRlbmQoYS5leHByWyI6Il0se2RhdGE6YS5leHByLmNyZWF0ZVBzZXVkbz9hLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4hIWEuZGF0YShjLGIpfX0pOmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4hIWEuZGF0YShiLGRbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oYil7cmV0dXJuIGMoYiwhaXNOYU4oYS5hdHRyKGIsInRhYmluZGV4IikpKX0sdGFiYmFibGU6ZnVuY3Rpb24oYil7dmFyIGQ9YS5hdHRyKGIsInRhYmluZGV4IiksZT1pc05hTihkKTtyZXR1cm4oZXx8ZD49MCkmJmMoYiwhZSl9fSksYShmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmJvZHksYz1iLmFwcGVuZENoaWxkKGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Mub2Zmc2V0SGVpZ2h0LGEuZXh0ZW5kKGMuc3R5bGUse21pbkhlaWdodDoiMTAwcHgiLGhlaWdodDoiYXV0byIscGFkZGluZzowLGJvcmRlcldpZHRoOjB9KSxhLnN1cHBvcnQubWluSGVpZ2h0PWMub2Zmc2V0SGVpZ2h0PT09MTAwLGEuc3VwcG9ydC5zZWxlY3RzdGFydD0ib25zZWxlY3RzdGFydCJpbiBjLGIucmVtb3ZlQ2hpbGQoYykuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSxhLmN1ckNTU3x8KGEuY3VyQ1NTPWEuY3NzKSxhLmV4dGVuZChhLnVpLHtwbHVnaW46e2FkZDpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YS51aVtiXS5wcm90b3R5cGU7Zm9yKHZhciBmIGluIGQpZS5wbHVnaW5zW2ZdPWUucGx1Z2luc1tmXXx8W10sZS5wbHVnaW5zW2ZdLnB1c2goW2MsZFtmXV0pfSxjYWxsOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnBsdWdpbnNbYl07aWYoIWR8fCFhLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSlyZXR1cm47Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspYS5vcHRpb25zW2RbZV1bMF1dJiZkW2VdWzFdLmFwcGx5KGEuZWxlbWVudCxjKX19LGNvbnRhaW5zOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTY6YSE9PWImJmEuY29udGFpbnMoYil9LGhhc1Njcm9sbDpmdW5jdGlvbihiLGMpe2lmKGEoYikuY3NzKCJvdmVyZmxvdyIpPT09ImhpZGRlbiIpcmV0dXJuITE7dmFyIGQ9YyYmYz09PSJsZWZ0Ij8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsZT0hMTtyZXR1cm4gYltkXT4wPyEwOihiW2RdPTEsZT1iW2RdPjAsYltkXT0wLGUpfSxpc092ZXJBeGlzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYT5iJiZhPGIrY30saXNPdmVyOmZ1bmN0aW9uKGIsYyxkLGUsZixnKXtyZXR1cm4gYS51aS5pc092ZXJBeGlzKGIsZCxmKSYmYS51aS5pc092ZXJBeGlzKGMsZSxnKX19KX0pKGpRdWVyeSksZnVuY3Rpb24oYSxiKXtpZihhLmNsZWFuRGF0YSl7dmFyIGM9YS5jbGVhbkRhdGE7YS5jbGVhbkRhdGE9ZnVuY3Rpb24oYil7Zm9yKHZhciBkPTAsZTsoZT1iW2RdKSE9bnVsbDtkKyspdHJ5e2EoZSkudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGYpe31jKGIpfX1lbHNle3ZhciBkPWEuZm4ucmVtb3ZlO2EuZm4ucmVtb3ZlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3JldHVybiBjfHwoIWJ8fGEuZmlsdGVyKGIsW3RoaXNdKS5sZW5ndGgpJiZhKCIqIix0aGlzKS5hZGQoW3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7dHJ5e2EodGhpcykudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGIpe319KSxkLmNhbGwoYSh0aGlzKSxiLGMpfSl9fWEud2lkZ2V0PWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLnNwbGl0KCIuIilbMF0sZjtiPWIuc3BsaXQoIi4iKVsxXSxmPWUrIi0iK2IsZHx8KGQ9YyxjPWEuV2lkZ2V0KSxhLmV4cHJbIjoiXVtmXT1mdW5jdGlvbihjKXtyZXR1cm4hIWEuZGF0YShjLGIpfSxhW2VdPWFbZV18fHt9LGFbZV1bYl09ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX07dmFyIGc9bmV3IGM7Zy5vcHRpb25zPWEuZXh0ZW5kKCEwLHt9LGcub3B0aW9ucyksYVtlXVtiXS5wcm90b3R5cGU9YS5leHRlbmQoITAsZyx7bmFtZXNwYWNlOmUsd2lkZ2V0TmFtZTpiLHdpZGdldEV2ZW50UHJlZml4OmFbZV1bYl0ucHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4fHxiLHdpZGdldEJhc2VDbGFzczpmfSxkKSxhLndpZGdldC5icmlkZ2UoYixhW2VdW2JdKX0sYS53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGMsZCl7YS5mbltjXT1mdW5jdGlvbihlKXt2YXIgZj10eXBlb2YgZT09InN0cmluZyIsZz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaD10aGlzO3JldHVybiBlPSFmJiZnLmxlbmd0aD9hLmV4dGVuZC5hcHBseShudWxsLFshMCxlXS5jb25jYXQoZykpOmUsZiYmZS5jaGFyQXQoMCk9PT0iXyI/aDooZj90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcyxjKSxmPWQmJmEuaXNGdW5jdGlvbihkW2VdKT9kW2VdLmFwcGx5KGQsZyk6ZDtpZihmIT09ZCYmZiE9PWIpcmV0dXJuIGg9ZiwhMX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEuZGF0YSh0aGlzLGMpO2I/Yi5vcHRpb24oZXx8e30pLl9pbml0KCk6YS5kYXRhKHRoaXMsYyxuZXcgZChlLHRoaXMpKX0pLGgpfX0sYS5XaWRnZXQ9ZnVuY3Rpb24oYSxiKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoYSxiKX0sYS5XaWRnZXQucHJvdG90eXBlPXt3aWRnZXROYW1lOiJ3aWRnZXQiLHdpZGdldEV2ZW50UHJlZml4OiIiLG9wdGlvbnM6e2Rpc2FibGVkOiExfSxfY3JlYXRlV2lkZ2V0OmZ1bmN0aW9uKGIsYyl7YS5kYXRhKGMsdGhpcy53aWRnZXROYW1lLHRoaXMpLHRoaXMuZWxlbWVudD1hKGMpLHRoaXMub3B0aW9ucz1hLmV4dGVuZCghMCx7fSx0aGlzLm9wdGlvbnMsdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLGIpO3ZhciBkPXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoInJlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbigpe2QuZGVzdHJveSgpfSksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIiksdGhpcy5faW5pdCgpfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3JldHVybiBhLm1ldGFkYXRhJiZhLm1ldGFkYXRhLmdldCh0aGlzLmVsZW1lbnRbMF0pW3RoaXMud2lkZ2V0TmFtZV19LF9jcmVhdGU6ZnVuY3Rpb24oKXt9LF9pbml0OmZ1bmN0aW9uKCl7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSksdGhpcy53aWRnZXQoKS51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQgIisidWktc3RhdGUtZGlzYWJsZWQiKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudH0sb3B0aW9uOmZ1bmN0aW9uKGMsZCl7dmFyIGU9YztpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4gYS5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZih0eXBlb2YgYz09InN0cmluZyIpe2lmKGQ9PT1iKXJldHVybiB0aGlzLm9wdGlvbnNbY107ZT17fSxlW2NdPWR9cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoZSksdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcztyZXR1cm4gYS5lYWNoKGIsZnVuY3Rpb24oYSxiKXtjLl9zZXRPcHRpb24oYSxiKX0pLHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vcHRpb25zW2FdPWIsYT09PSJkaXNhYmxlZCImJnRoaXMud2lkZ2V0KClbYj8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKHRoaXMud2lkZ2V0QmFzZUNsYXNzKyItZGlzYWJsZWQiKyIgIisidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIixiKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCEwKX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZz10aGlzLm9wdGlvbnNbYl07ZD1kfHx7fSxjPWEuRXZlbnQoYyksYy50eXBlPShiPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9iOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrYikudG9Mb3dlckNhc2UoKSxjLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sZj1jLm9yaWdpbmFsRXZlbnQ7aWYoZilmb3IoZSBpbiBmKWUgaW4gY3x8KGNbZV09ZltlXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKGMsZCksIShhLmlzRnVuY3Rpb24oZykmJmcuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYyxkKT09PSExfHxjLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9ITE7YShkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbihhKXtjPSExfSksYS53aWRnZXQoInVpLm1vdXNlIix7b3B0aW9uczp7Y2FuY2VsOiI6aW5wdXQsb3B0aW9uIixkaXN0YW5jZToxLGRlbGF5OjB9LF9tb3VzZUluaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJtb3VzZWRvd24uIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX21vdXNlRG93bihhKX0pLmJpbmQoImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGMpe2lmKCEwPT09YS5kYXRhKGMudGFyZ2V0LGIud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikpcmV0dXJuIGEucmVtb3ZlRGF0YShjLnRhcmdldCxiLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLGMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksITF9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZhKGRvY3VtZW50KS51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSl9LF9tb3VzZURvd246ZnVuY3Rpb24oYil7aWYoYylyZXR1cm47dGhpcy5fbW91c2VTdGFydGVkJiZ0aGlzLl9tb3VzZVVwKGIpLHRoaXMuX21vdXNlRG93bkV2ZW50PWI7dmFyIGQ9dGhpcyxlPWIud2hpY2g9PTEsZj10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyImJmIudGFyZ2V0Lm5vZGVOYW1lP2EoYi50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO2lmKCFlfHxmfHwhdGhpcy5fbW91c2VDYXB0dXJlKGIpKXJldHVybiEwO3RoaXMubW91c2VEZWxheU1ldD0hdGhpcy5vcHRpb25zLmRlbGF5LHRoaXMubW91c2VEZWxheU1ldHx8KHRoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5tb3VzZURlbGF5TWV0PSEwfSx0aGlzLm9wdGlvbnMuZGVsYXkpKTtpZih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGIpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KGIpKXt0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydChiKSE9PSExO2lmKCF0aGlzLl9tb3VzZVN0YXJ0ZWQpcmV0dXJuIGIucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMD09PWEuZGF0YShiLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpJiZhLnJlbW92ZURhdGEoYi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihhKXtyZXR1cm4gZC5fbW91c2VNb3ZlKGEpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX21vdXNlVXAoYSl9LGEoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLGIucHJldmVudERlZmF1bHQoKSxjPSEwLCEwfSxfbW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3JldHVybiFhLmJyb3dzZXIubXNpZXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPj05fHwhIWIuYnV0dG9uP3RoaXMuX21vdXNlU3RhcnRlZD8odGhpcy5fbW91c2VEcmFnKGIpLGIucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX21vdXNlRGlzdGFuY2VNZXQoYikmJnRoaXMuX21vdXNlRGVsYXlNZXQoYikmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0aGlzLl9tb3VzZURvd25FdmVudCxiKSE9PSExLHRoaXMuX21vdXNlU3RhcnRlZD90aGlzLl9tb3VzZURyYWcoYik6dGhpcy5fbW91c2VVcChiKSksIXRoaXMuX21vdXNlU3RhcnRlZCk6dGhpcy5fbW91c2VVcChiKX0sX21vdXNlVXA6ZnVuY3Rpb24oYil7cmV0dXJuIGEoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEsYi50YXJnZXQ9PXRoaXMuX21vdXNlRG93bkV2ZW50LnRhcmdldCYmYS5kYXRhKGIudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiwhMCksdGhpcy5fbW91c2VTdG9wKGIpKSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWEucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWEucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tb3VzZURlbGF5TWV0fSxfbW91c2VTdGFydDpmdW5jdGlvbihhKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYSl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihhKXtyZXR1cm4hMH19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOiEwLGFwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFRvU29ydGFibGU6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpZnJhbWVGaXg6ITEsb3BhY2l0eTohMSxyZWZyZXNoUG9zaXRpb25zOiExLHJldmVydDohMSxyZXZlcnREdXJhdGlvbjo1MDAsc2NvcGU6ImRlZmF1bHQiLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzbmFwOiExLHNuYXBNb2RlOiJib3RoIixzbmFwVG9sZXJhbmNlOjIwLHN0YWNrOiExLHpJbmRleDohMX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJiEvXig/OnJ8YXxmKS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSYmKHRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSx0aGlzLm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmRhdGEoImRyYWdnYWJsZSIpKXJldHVybjtyZXR1cm4gdGhpcy5lbGVtZW50LnJlbW92ZURhdGEoImRyYWdnYWJsZSIpLnVuYmluZCgiLmRyYWdnYWJsZSIpLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUgdWktZHJhZ2dhYmxlLWRyYWdnaW5nIHVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpLHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcnx8Yy5kaXNhYmxlZHx8YShiLnRhcmdldCkuaXMoIi51aS1yZXNpemFibGUtaGFuZGxlIik/ITE6KHRoaXMuaGFuZGxlPXRoaXMuX2dldEhhbmRsZShiKSx0aGlzLmhhbmRsZT8oYy5pZnJhbWVGaXgmJmEoYy5pZnJhbWVGaXg9PT0hMD8iaWZyYW1lIjpjLmlmcmFtZUZpeCkuZWFjaChmdW5jdGlvbigpe2EoJzxkaXYgY2xhc3M9InVpLWRyYWdnYWJsZS1pZnJhbWVGaXgiIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmOyI+PC9kaXY+JykuY3NzKHt3aWR0aDp0aGlzLm9mZnNldFdpZHRoKyJweCIsaGVpZ2h0OnRoaXMub2Zmc2V0SGVpZ2h0KyJweCIscG9zaXRpb246ImFic29sdXRlIixvcGFjaXR5OiIwLjAwMSIsekluZGV4OjFlM30pLmNzcyhhKHRoaXMpLm9mZnNldCgpKS5hcHBlbmRUbygiYm9keSIpfSksITApOiExKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoYiksdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCksdGhpcy5vZmZzZXQ9dGhpcy5wb3NpdGlvbkFicz10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LGEuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDpiLnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOmIucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oYiksdGhpcy5vcmlnaW5hbFBhZ2VYPWIucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPWIucGFnZVksYy5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihjLmN1cnNvckF0KSxjLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKT09PSExPyh0aGlzLl9jbGVhcigpLCExKToodGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLGEudWkuZGRtYW5hZ2VyJiYhYy5kcm9wQmVoYXZpb3VyJiZhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGIpLHRoaXMuX21vdXNlRHJhZyhiLCEwKSxhLnVpLmRkbWFuYWdlciYmYS51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsYiksITApfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIsYyl7dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGIpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7aWYoIWMpe3ZhciBkPXRoaXMuX3VpSGFzaCgpO2lmKHRoaXMuX3RyaWdnZXIoImRyYWciLGIsZCk9PT0hMSlyZXR1cm4gdGhpcy5fbW91c2VVcCh7fSksITE7dGhpcy5wb3NpdGlvbj1kLnBvc2l0aW9ufWlmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IjtyZXR1cm4gYS51aS5kZG1hbmFnZXImJmEudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyxiKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiKXt2YXIgYz0hMTthLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiYoYz1hLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYikpLHRoaXMuZHJvcHBlZCYmKGM9dGhpcy5kcm9wcGVkLHRoaXMuZHJvcHBlZD0hMSk7dmFyIGQ9dGhpcy5lbGVtZW50WzBdLGU9ITE7d2hpbGUoZCYmKGQ9ZC5wYXJlbnROb2RlKSlkPT1kb2N1bWVudCYmKGU9ITApO2lmKCFlJiZ0aGlzLm9wdGlvbnMuaGVscGVyPT09Im9yaWdpbmFsIilyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMucmV2ZXJ0PT0iaW52YWxpZCImJiFjfHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT0idmFsaWQiJiZjfHx0aGlzLm9wdGlvbnMucmV2ZXJ0PT09ITB8fGEuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMucmV2ZXJ0KSYmdGhpcy5vcHRpb25zLnJldmVydC5jYWxsKHRoaXMuZWxlbWVudCxjKSl7dmFyIGY9dGhpczthKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbixwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0RHVyYXRpb24sMTApLGZ1bmN0aW9uKCl7Zi5fdHJpZ2dlcigic3RvcCIsYikhPT0hMSYmZi5fY2xlYXIoKX0pfWVsc2UgdGhpcy5fdHJpZ2dlcigic3RvcCIsYikhPT0hMSYmdGhpcy5fY2xlYXIoKTtyZXR1cm4hMX0sX21vdXNlVXA6ZnVuY3Rpb24oYil7cmV0dXJuIGEoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLGIpLGEudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyxiKX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKGIpe3ZhciBjPSF0aGlzLm9wdGlvbnMuaGFuZGxlfHwhYSh0aGlzLm9wdGlvbnMuaGFuZGxlLHRoaXMuZWxlbWVudCkubGVuZ3RoPyEwOiExO3JldHVybiBhKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT1iLnRhcmdldCYmKGM9ITApfSksY30sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiBkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGQuYXBwZW5kVG8oYy5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yy5hcHBlbmRUbyksZFswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpJiZkLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApfHwwLHJpZ2h0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApfHwwLGJvdHRvbTpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbExlZnQoKSkrYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpKSsoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkmJmIuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgYz1hKGIuY29udGFpbm1lbnQpLGQ9Y1swXTtpZighZClyZXR1cm47dmFyIGU9Yy5vZmZzZXQoKSxmPWEoZCkuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIjt0aGlzLmNvbnRhaW5tZW50PVsocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCksKHBhcnNlSW50KGEoZCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKSwoZj9NYXRoLm1heChkLnNjcm9sbFdpZHRoLGQub2Zmc2V0V2lkdGgpOmQub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKGY/TWF0aC5tYXgoZC5zY3JvbGxIZWlnaHQsZC5vZmZzZXRIZWlnaHQpOmQub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZV9jb250YWluZXI9Y31lbHNlIGIuY29udGFpbm1lbnQuY29uc3RydWN0b3I9PUFycmF5JiYodGhpcy5jb250YWlubWVudD1iLmNvbnRhaW5tZW50KX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGIsYyl7Y3x8KGM9dGhpcy5wb3NpdGlvbik7dmFyIGQ9Yj09ImFic29sdXRlIj8xOi0xLGU9dGhpcy5vcHRpb25zLGY9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxnPS8oaHRtbHxib2R5KS9pLnRlc3QoZlswXS50YWdOYW1lKTtyZXR1cm57dG9wOmMudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpkK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKSxmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dmFyIGg7aWYodGhpcy5jb250YWlubWVudCl7aWYodGhpcy5yZWxhdGl2ZV9jb250YWluZXIpe3ZhciBpPXRoaXMucmVsYXRpdmVfY29udGFpbmVyLm9mZnNldCgpO2g9W3RoaXMuY29udGFpbm1lbnRbMF0raS5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0raS50b3AsdGhpcy5jb250YWlubWVudFsyXStpLmxlZnQsdGhpcy5jb250YWlubWVudFszXStpLnRvcF19ZWxzZSBoPXRoaXMuY29udGFpbm1lbnQ7Yi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PGhbMF0mJihmPWhbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXSYmKGc9aFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5oWzJdJiYoZj1oWzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPmhbM10mJihnPWhbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKX1pZihjLmdyaWQpe3ZhciBqPWMuZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWTtnPWg/ai10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXXx8ai10aGlzLm9mZnNldC5jbGljay50b3A+aFszXT9qLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxoWzFdP2orYy5ncmlkWzFdOmotYy5ncmlkWzFdOmo6ajt2YXIgaz1jLmdyaWRbMF0/dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGYtdGhpcy5vcmlnaW5hbFBhZ2VYKS9jLmdyaWRbMF0pKmMuZ3JpZFswXTp0aGlzLm9yaWdpbmFsUGFnZVg7Zj1oP2stdGhpcy5vZmZzZXQuY2xpY2subGVmdDxoWzBdfHxrLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aFsyXT9rLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aFswXT9rK2MuZ3JpZFswXTprLWMuZ3JpZFswXTprOmt9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJmEuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmU/MDpkLnNjcm9sbFRvcCgpKSxsZWZ0OmYtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KyhhLmJyb3dzZXIuc2FmYXJpJiZhLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXSE9dGhpcy5lbGVtZW50WzBdJiYhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBkPWR8fHRoaXMuX3VpSGFzaCgpLGEudWkucGx1Z2luLmNhbGwodGhpcyxiLFtjLGRdKSxiPT0iZHJhZyImJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpKSxhLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGIsYyxkKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKGEpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6dGhpcy5wb3NpdGlvbkFic319fSksYS5leHRlbmQoYS51aS5kcmFnZ2FibGUse3ZlcnNpb246IjEuOC4yNCJ9KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9YS5leHRlbmQoe30sYyx7aXRlbTpkLmVsZW1lbnR9KTtkLnNvcnRhYmxlcz1bXSxhKGUuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hLmRhdGEodGhpcywic29ydGFibGUiKTtjJiYhYy5vcHRpb25zLmRpc2FibGVkJiYoZC5zb3J0YWJsZXMucHVzaCh7aW5zdGFuY2U6YyxzaG91bGRSZXZlcnQ6Yy5vcHRpb25zLnJldmVydH0pLGMucmVmcmVzaFBvc2l0aW9ucygpLGMuX3RyaWdnZXIoImFjdGl2YXRlIixiLGYpKX0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWEuZXh0ZW5kKHt9LGMse2l0ZW06ZC5lbGVtZW50fSk7YS5lYWNoKGQuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5pbnN0YW5jZS5pc092ZXI/KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsZC5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLnNob3VsZFJldmVydCYmKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChiKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyLGQub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSkpOih0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYixlKSl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT10aGlzLGY9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGQ9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxlPXRoaXMucG9zaXRpb25BYnMudG9wLGY9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGc9Yi5oZWlnaHQsaD1iLndpZHRoLGk9Yi50b3Asaj1iLmxlZnQ7cmV0dXJuIGEudWkuaXNPdmVyKGUrYyxmK2QsaSxqLGcsaCl9O2EuZWFjaChkLnNvcnRhYmxlcyxmdW5jdGlvbihmKXt0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzPWQucG9zaXRpb25BYnMsdGhpcy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucz1kLmhlbHBlclByb3BvcnRpb25zLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrPWQub2Zmc2V0LmNsaWNrLHRoaXMuaW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVyQ2FjaGUpPyh0aGlzLmluc3RhbmNlLmlzT3Zlcnx8KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTEsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1hKGUpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInNvcnRhYmxlLWl0ZW0iLCEwKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYy5oZWxwZXJbMF19LGIudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF0sdGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKGIsITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQoYiwhMCwhMCksdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPWQub2Zmc2V0LmNsaWNrLnRvcCx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PWQub2Zmc2V0LmNsaWNrLmxlZnQsdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPWQub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0LHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AtPWQub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCxkLl90cmlnZ2VyKCJ0b1NvcnRhYmxlIixiKSxkLmRyb3BwZWQ9dGhpcy5pbnN0YW5jZS5lbGVtZW50LGQuY3VycmVudEl0ZW09ZC5lbGVtZW50LHRoaXMuaW5zdGFuY2UuZnJvbU91dHNpZGU9ZCksdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGIpKTp0aGlzLmluc3RhbmNlLmlzT3ZlciYmKHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigib3V0IixiLHRoaXMuaW5zdGFuY2UuX3VpSGFzaCh0aGlzLmluc3RhbmNlKSksdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGIsITApLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXIsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5yZW1vdmUoKSx0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyJiZ0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGQuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsYiksZC5kcm9wcGVkPSExKX0pfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKCJib2R5IiksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoImN1cnNvciIpJiYoZS5fY3Vyc29yPWQuY3NzKCJjdXJzb3IiKSksZC5jc3MoImN1cnNvciIsZS5jdXJzb3IpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuX2N1cnNvciYmYSgiYm9keSIpLmNzcygiY3Vyc29yIixkLl9jdXJzb3IpfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YShjLmhlbHBlciksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoIm9wYWNpdHkiKSYmKGUuX29wYWNpdHk9ZC5jc3MoIm9wYWNpdHkiKSksZC5jc3MoIm9wYWNpdHkiLGUub3BhY2l0eSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fb3BhY2l0eSYmYShjLmhlbHBlcikuY3NzKCJvcGFjaXR5IixkLl9vcGFjaXR5KX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNjcm9sbCIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKTtkLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIiYmKGQub3ZlcmZsb3dPZmZzZXQ9ZC5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWQub3B0aW9ucyxmPSExO2lmKGQuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZC5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtpZighZS5heGlzfHxlLmF4aXMhPSJ4IilkLm92ZXJmbG93T2Zmc2V0LnRvcCtkLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtYi5wYWdlWTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtlLnNjcm9sbFNwZWVkOmIucGFnZVktZC5vdmVyZmxvd09mZnNldC50b3A8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1lLnNjcm9sbFNwZWVkKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IilkLm92ZXJmbG93T2Zmc2V0LmxlZnQrZC5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtYi5wYWdlWDxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K2Uuc2Nyb2xsU3BlZWQ6Yi5wYWdlWC1kLm92ZXJmbG93T2Zmc2V0LmxlZnQ8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWUuc2Nyb2xsU3BlZWQpfWVsc2V7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieCIpYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLWUuc2Nyb2xsU3BlZWQpOmEod2luZG93KS5oZWlnaHQoKS0oYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGY9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpK2Uuc2Nyb2xsU3BlZWQpKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IiliLnBhZ2VYLWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktZS5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLndpZHRoKCktKGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKTxlLnNjcm9sbFNlbnNpdGl2aXR5JiYoZj1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStlLnNjcm9sbFNwZWVkKSl9ZiE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWUuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoZCxiKX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1kLm9wdGlvbnM7ZC5zbmFwRWxlbWVudHM9W10sYShlLnNuYXAuY29uc3RydWN0b3IhPVN0cmluZz9lLnNuYXAuaXRlbXN8fCI6ZGF0YShkcmFnZ2FibGUpIjplLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9Yi5vZmZzZXQoKTt0aGlzIT1kLmVsZW1lbnRbMF0mJmQuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDpiLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCgpLHRvcDpjLnRvcCxsZWZ0OmMubGVmdH0pfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9ZS5zbmFwVG9sZXJhbmNlLGc9Yy5vZmZzZXQubGVmdCxoPWcrZC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxpPWMub2Zmc2V0LnRvcCxqPWkrZC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKHZhciBrPWQuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2s+PTA7ay0tKXt2YXIgbD1kLnNuYXBFbGVtZW50c1trXS5sZWZ0LG09bCtkLnNuYXBFbGVtZW50c1trXS53aWR0aCxuPWQuc25hcEVsZW1lbnRzW2tdLnRvcCxvPW4rZC5zbmFwRWxlbWVudHNba10uaGVpZ2h0O2lmKCEobC1mPGcmJmc8bStmJiZuLWY8aSYmaTxvK2Z8fGwtZjxnJiZnPG0rZiYmbi1mPGomJmo8bytmfHxsLWY8aCYmaDxtK2YmJm4tZjxpJiZpPG8rZnx8bC1mPGgmJmg8bStmJiZuLWY8aiYmajxvK2YpKXtkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZyYmZC5vcHRpb25zLnNuYXAucmVsZWFzZSYmZC5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKGQuZWxlbWVudCxiLGEuZXh0ZW5kKGQuX3VpSGFzaCgpLHtzbmFwSXRlbTpkLnNuYXBFbGVtZW50c1trXS5pdGVtfSkpLGQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nPSExO2NvbnRpbnVlfWlmKGUuc25hcE1vZGUhPSJpbm5lciIpe3ZhciBwPU1hdGguYWJzKG4taik8PWYscT1NYXRoLmFicyhvLWkpPD1mLHI9TWF0aC5hYnMobC1oKTw9ZixzPU1hdGguYWJzKG0tZyk8PWY7cCYmKGMucG9zaXRpb24udG9wPWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpuLWQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1kLm1hcmdpbnMudG9wKSxxJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm8sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHImJihjLnBvc2l0aW9uLmxlZnQ9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsLWQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bX0pLmxlZnQtZC5tYXJnaW5zLmxlZnQpfXZhciB0PXB8fHF8fHJ8fHM7aWYoZS5zbmFwTW9kZSE9Im91dGVyIil7dmFyIHA9TWF0aC5hYnMobi1pKTw9ZixxPU1hdGguYWJzKG8taik8PWYscj1NYXRoLmFicyhsLWcpPD1mLHM9TWF0aC5hYnMobS1oKTw9ZjtwJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm4sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHEmJihjLnBvc2l0aW9uLnRvcD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6by1kLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtZC5tYXJnaW5zLnRvcCksciYmKGMucG9zaXRpb24ubGVmdD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bS1kLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1kLm1hcmdpbnMubGVmdCl9IWQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nJiYocHx8cXx8cnx8c3x8dCkmJmQub3B0aW9ucy5zbmFwLnNuYXAmJmQub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChkLmVsZW1lbnQsYixhLmV4dGVuZChkLl91aUhhc2goKSx7c25hcEl0ZW06ZC5zbmFwRWxlbWVudHNba10uaXRlbX0pKSxkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZz1wfHxxfHxyfHxzfHx0fX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInN0YWNrIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnMsZT1hLm1ha2VBcnJheShhKGQuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGIsYyl7cmV0dXJuKHBhcnNlSW50KGEoYikuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKCFlLmxlbmd0aClyZXR1cm47dmFyIGY9cGFyc2VJbnQoZVswXS5zdHlsZS56SW5kZXgpfHwwO2EoZSkuZWFjaChmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnpJbmRleD1mK2F9KSx0aGlzWzBdLnN0eWxlLnpJbmRleD1mK2UubGVuZ3RofX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKGMuaGVscGVyKSxlPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztkLmNzcygiekluZGV4IikmJihlLl96SW5kZXg9ZC5jc3MoInpJbmRleCIpKSxkLmNzcygiekluZGV4IixlLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fekluZGV4JiZhKGMuaGVscGVyKS5jc3MoInpJbmRleCIsZC5fekluZGV4KX19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5kcm9wcGFibGUiLHt3aWRnZXRFdmVudFByZWZpeDoiZHJvcCIsb3B0aW9uczp7YWNjZXB0OiIqIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1iLmFjY2VwdDt0aGlzLmlzb3Zlcj0wLHRoaXMuaXNvdXQ9MSx0aGlzLmFjY2VwdD1hLmlzRnVuY3Rpb24oYyk/YzpmdW5jdGlvbihhKXtyZXR1cm4gYS5pcyhjKX0sdGhpcy5wcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSxhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdPWEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5zY29wZV18fFtdLGEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5zY29wZV0ucHVzaCh0aGlzKSxiLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJvcHBhYmxlIil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYj1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV07Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspYltjXT09dGhpcyYmYi5zcGxpY2UoYywxKTtyZXR1cm4gdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIikucmVtb3ZlRGF0YSgiZHJvcHBhYmxlIikudW5iaW5kKCIuZHJvcHBhYmxlIiksdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PSJhY2NlcHQiJiYodGhpcy5hY2NlcHQ9YS5pc0Z1bmN0aW9uKGMpP2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXMoYyl9KSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9hY3RpdmF0ZTpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksYyYmdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLGIsdGhpcy51aShjKSl9LF9kZWFjdGl2YXRlOmZ1bmN0aW9uKGIpe3ZhciBjPWEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxjJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixiLHRoaXMudWkoYykpfSxfb3ZlcjpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O2lmKCFjfHwoYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KVswXT09dGhpcy5lbGVtZW50WzBdKXJldHVybjt0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3ZlciIsYix0aGlzLnVpKGMpKSl9LF9vdXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighY3x8KGMuY3VycmVudEl0ZW18fGMuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm47dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsYix0aGlzLnVpKGMpKSl9LF9kcm9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9Y3x8YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighZHx8KGQuY3VycmVudEl0ZW18fGQuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm4hMTt2YXIgZT0hMTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YS5kYXRhKHRoaXMsImRyb3BwYWJsZSIpO2lmKGIub3B0aW9ucy5ncmVlZHkmJiFiLm9wdGlvbnMuZGlzYWJsZWQmJmIub3B0aW9ucy5zY29wZT09ZC5vcHRpb25zLnNjb3BlJiZiLmFjY2VwdC5jYWxsKGIuZWxlbWVudFswXSxkLmN1cnJlbnRJdGVtfHxkLmVsZW1lbnQpJiZhLnVpLmludGVyc2VjdChkLGEuZXh0ZW5kKGIse29mZnNldDpiLmVsZW1lbnQub2Zmc2V0KCl9KSxiLm9wdGlvbnMudG9sZXJhbmNlKSlyZXR1cm4gZT0hMCwhMX0pLGU/ITE6dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sZC5jdXJyZW50SXRlbXx8ZC5lbGVtZW50KT8odGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJkcm9wIixiLHRoaXMudWkoZCkpLHRoaXMuZWxlbWVudCk6ITF9LHVpOmZ1bmN0aW9uKGEpe3JldHVybntkcmFnZ2FibGU6YS5jdXJyZW50SXRlbXx8YS5lbGVtZW50LGhlbHBlcjphLmhlbHBlcixwb3NpdGlvbjphLnBvc2l0aW9uLG9mZnNldDphLnBvc2l0aW9uQWJzfX19KSxhLmV4dGVuZChhLnVpLmRyb3BwYWJsZSx7dmVyc2lvbjoiMS44LjI0In0pLGEudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKGIsYyxkKXtpZighYy5vZmZzZXQpcmV0dXJuITE7dmFyIGU9KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQsZj1lK2IuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsZz0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wLGg9ZytiLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxpPWMub2Zmc2V0LmxlZnQsaj1pK2MucHJvcG9ydGlvbnMud2lkdGgsaz1jLm9mZnNldC50b3AsbD1rK2MucHJvcG9ydGlvbnMuaGVpZ2h0O3N3aXRjaChkKXtjYXNlImZpdCI6cmV0dXJuIGk8PWUmJmY8PWomJms8PWcmJmg8PWw7Y2FzZSJpbnRlcnNlY3QiOnJldHVybiBpPGUrYi5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZmLWIuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMjxqJiZrPGcrYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMiYmaC1iLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPGw7Y2FzZSJwb2ludGVyIjp2YXIgbT0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCsoYi5jbGlja09mZnNldHx8Yi5vZmZzZXQuY2xpY2spLmxlZnQsbj0oYi5wb3NpdGlvbkFic3x8Yi5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wKyhiLmNsaWNrT2Zmc2V0fHxiLm9mZnNldC5jbGljaykudG9wLG89YS51aS5pc092ZXIobixtLGssaSxjLnByb3BvcnRpb25zLmhlaWdodCxjLnByb3BvcnRpb25zLndpZHRoKTtyZXR1cm4gbztjYXNlInRvdWNoIjpyZXR1cm4oZz49ayYmZzw9bHx8aD49ayYmaDw9bHx8ZzxrJiZoPmwpJiYoZT49aSYmZTw9anx8Zj49aSYmZjw9anx8ZTxpJiZmPmopO2RlZmF1bHQ6cmV0dXJuITF9fSxhLnVpLmRkbWFuYWdlcj17Y3VycmVudDpudWxsLGRyb3BwYWJsZXM6eyJkZWZhdWx0IjpbXX0scHJlcGFyZU9mZnNldHM6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iub3B0aW9ucy5zY29wZV18fFtdLGU9Yz9jLnR5cGU6bnVsbCxmPShiLmN1cnJlbnRJdGVtfHxiLmVsZW1lbnQpLmZpbmQoIjpkYXRhKGRyb3BwYWJsZSkiKS5hbmRTZWxmKCk7Zzpmb3IodmFyIGg9MDtoPGQubGVuZ3RoO2grKyl7aWYoZFtoXS5vcHRpb25zLmRpc2FibGVkfHxiJiYhZFtoXS5hY2NlcHQuY2FsbChkW2hdLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSljb250aW51ZTtmb3IodmFyIGk9MDtpPGYubGVuZ3RoO2krKylpZihmW2ldPT1kW2hdLmVsZW1lbnRbMF0pe2RbaF0ucHJvcG9ydGlvbnMuaGVpZ2h0PTA7Y29udGludWUgZ31kW2hdLnZpc2libGU9ZFtoXS5lbGVtZW50LmNzcygiZGlzcGxheSIpIT0ibm9uZSI7aWYoIWRbaF0udmlzaWJsZSljb250aW51ZTtlPT0ibW91c2Vkb3duIiYmZFtoXS5fYWN0aXZhdGUuY2FsbChkW2hdLGMpLGRbaF0ub2Zmc2V0PWRbaF0uZWxlbWVudC5vZmZzZXQoKSxkW2hdLnByb3BvcnRpb25zPXt3aWR0aDpkW2hdLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OmRbaF0uZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9fX0sZHJvcDpmdW5jdGlvbihiLGMpe3ZhciBkPSExO3JldHVybiBhLmVhY2goYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxmdW5jdGlvbigpe2lmKCF0aGlzLm9wdGlvbnMpcmV0dXJuOyF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmYS51aS5pbnRlcnNlY3QoYix0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpJiYoZD10aGlzLl9kcm9wLmNhbGwodGhpcyxjKXx8ZCksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxiLmN1cnJlbnRJdGVtfHxiLmVsZW1lbnQpJiYodGhpcy5pc291dD0xLHRoaXMuaXNvdmVyPTAsdGhpcy5fZGVhY3RpdmF0ZS5jYWxsKHRoaXMsYykpfSksZH0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKGIsYyl7Yi5lbGVtZW50LnBhcmVudHMoIjpub3QoYm9keSxodG1sKSIpLmJpbmQoInNjcm9sbC5kcm9wcGFibGUiLGZ1bmN0aW9uKCl7Yi5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGIsYyl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe2Iub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhiLGMpLGEuZWFjaChhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLmdyZWVkeUNoaWxkfHwhdGhpcy52aXNpYmxlKXJldHVybjt2YXIgZD1hLnVpLmludGVyc2VjdChiLHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSksZT0hZCYmdGhpcy5pc292ZXI9PTE/Imlzb3V0IjpkJiZ0aGlzLmlzb3Zlcj09MD8iaXNvdmVyIjpudWxsO2lmKCFlKXJldHVybjt2YXIgZjtpZih0aGlzLm9wdGlvbnMuZ3JlZWR5KXt2YXIgZz10aGlzLm9wdGlvbnMuc2NvcGUsaD10aGlzLmVsZW1lbnQucGFyZW50cygiOmRhdGEoZHJvcHBhYmxlKSIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBhLmRhdGEodGhpcywiZHJvcHBhYmxlIikub3B0aW9ucy5zY29wZT09PWd9KTtoLmxlbmd0aCYmKGY9YS5kYXRhKGhbMF0sImRyb3BwYWJsZSIpLGYuZ3JlZWR5Q2hpbGQ9ZT09Imlzb3ZlciI/MTowKX1mJiZlPT0iaXNvdmVyIiYmKGYuaXNvdmVyPTAsZi5pc291dD0xLGYuX291dC5jYWxsKGYsYykpLHRoaXNbZV09MSx0aGlzW2U9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MCx0aGlzW2U9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYyksZiYmZT09Imlzb3V0IiYmKGYuaXNvdXQ9MCxmLmlzb3Zlcj0xLGYuX292ZXIuY2FsbChmLGMpKX0pfSxkcmFnU3RvcDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSxiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8YS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKX19fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnJlc2l6YWJsZSIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InJlc2l6ZSIsb3B0aW9uczp7YWxzb1Jlc2l6ZTohMSxhbmltYXRlOiExLGFuaW1hdGVEdXJhdGlvbjoic2xvdyIsYW5pbWF0ZUVhc2luZzoic3dpbmciLGFzcGVjdFJhdGlvOiExLGF1dG9IaWRlOiExLGNvbnRhaW5tZW50OiExLGdob3N0OiExLGdyaWQ6ITEsaGFuZGxlczoiZSxzLHNlIixoZWxwZXI6ITEsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTAsbWluV2lkdGg6MTAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKSxhLmV4dGVuZCh0aGlzLHtfYXNwZWN0UmF0aW86ISFjLmFzcGVjdFJhdGlvLGFzcGVjdFJhdGlvOmMuYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOmMuaGVscGVyfHxjLmdob3N0fHxjLmFuaW1hdGU/Yy5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9jYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcvaSkmJih0aGlzLmVsZW1lbnQud3JhcChhKCc8ZGl2IGNsYXNzPSJ1aS13cmFwcGVyIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbjsiPjwvZGl2PicpLmNzcyh7cG9zaXRpb246dGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSx3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSx0b3A6dGhpcy5lbGVtZW50LmNzcygidG9wIiksbGVmdDp0aGlzLmVsZW1lbnQuY3NzKCJsZWZ0Iil9KSksdGhpcy5lbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnQoKS5kYXRhKCJyZXNpemFibGUiLHRoaXMuZWxlbWVudC5kYXRhKCJyZXNpemFibGUiKSksdGhpcy5lbGVtZW50SXNXcmFwcGVyPSEwLHRoaXMuZWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksbWFyZ2luVG9wOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksbWFyZ2luUmlnaHQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLG1hcmdpbkJvdHRvbTp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpfSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OjAsbWFyZ2luVG9wOjAsbWFyZ2luUmlnaHQ6MCxtYXJnaW5Cb3R0b206MH0pLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZT10aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwibm9uZSIpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMucHVzaCh0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOiJzdGF0aWMiLHpvb206MSxkaXNwbGF5OiJibG9jayJ9KSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW46dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW4iKX0pLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLHRoaXMuaGFuZGxlcz1jLmhhbmRsZXN8fChhKCIudWktcmVzaXphYmxlLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5sZW5ndGg/e246Ii51aS1yZXNpemFibGUtbiIsZToiLnVpLXJlc2l6YWJsZS1lIixzOiIudWktcmVzaXphYmxlLXMiLHc6Ii51aS1yZXNpemFibGUtdyIsc2U6Ii51aS1yZXNpemFibGUtc2UiLHN3OiIudWktcmVzaXphYmxlLXN3IixuZToiLnVpLXJlc2l6YWJsZS1uZSIsbnc6Ii51aS1yZXNpemFibGUtbncifToiZSxzLHNlIik7aWYodGhpcy5oYW5kbGVzLmNvbnN0cnVjdG9yPT1TdHJpbmcpe3RoaXMuaGFuZGxlcz09ImFsbCImJih0aGlzLmhhbmRsZXM9Im4sZSxzLHcsc2Usc3csbmUsbnciKTt2YXIgZD10aGlzLmhhbmRsZXMuc3BsaXQoIiwiKTt0aGlzLmhhbmRsZXM9e307Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWEudHJpbShkW2VdKSxnPSJ1aS1yZXNpemFibGUtIitmLGg9YSgnPGRpdiBjbGFzcz0idWktcmVzaXphYmxlLWhhbmRsZSAnK2crJyI+PC9kaXY+Jyk7aC5jc3Moe3pJbmRleDpjLnpJbmRleH0pLCJzZSI9PWYmJmguYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UiKSx0aGlzLmhhbmRsZXNbZl09Ii51aS1yZXNpemFibGUtIitmLHRoaXMuZWxlbWVudC5hcHBlbmQoaCl9fXRoaXMuX3JlbmRlckF4aXM9ZnVuY3Rpb24oYil7Yj1ifHx0aGlzLmVsZW1lbnQ7Zm9yKHZhciBjIGluIHRoaXMuaGFuZGxlcyl7dGhpcy5oYW5kbGVzW2NdLmNvbnN0cnVjdG9yPT1TdHJpbmcmJih0aGlzLmhhbmRsZXNbY109YSh0aGlzLmhhbmRsZXNbY10sdGhpcy5lbGVtZW50KS5zaG93KCkpO2lmKHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL3RleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24vaSkpe3ZhciBkPWEodGhpcy5oYW5kbGVzW2NdLHRoaXMuZWxlbWVudCksZT0wO2U9L3N3fG5lfG53fHNlfG58cy8udGVzdChjKT9kLm91dGVySGVpZ2h0KCk6ZC5vdXRlcldpZHRoKCk7dmFyIGY9WyJwYWRkaW5nIiwvbmV8bnd8bi8udGVzdChjKT8iVG9wIjovc2V8c3d8cy8udGVzdChjKT8iQm90dG9tIjovXmUkLy50ZXN0KGMpPyJSaWdodCI6IkxlZnQiXS5qb2luKCIiKTtiLmNzcyhmLGUpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCl9aWYoIWEodGhpcy5oYW5kbGVzW2NdKS5sZW5ndGgpY29udGludWV9fSx0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCksdGhpcy5faGFuZGxlcz1hKCIudWktcmVzaXphYmxlLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtpZighYi5yZXNpemluZyl7aWYodGhpcy5jbGFzc05hbWUpdmFyIGE9dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8bnxlfHN8dykvaSk7Yi5heGlzPWEmJmFbMV0/YVsxXToic2UifX0pLGMuYXV0b0hpZGUmJih0aGlzLl9oYW5kbGVzLmhpZGUoKSxhKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLmhvdmVyKGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIiksYi5faGFuZGxlcy5zaG93KCl9LGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47Yi5yZXNpemluZ3x8KGEodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLGIuX2hhbmRsZXMuaGlkZSgpKX0pKSx0aGlzLl9tb3VzZUluaXQoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX21vdXNlRGVzdHJveSgpO3ZhciBiPWZ1bmN0aW9uKGIpe2EoYikucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikucmVtb3ZlRGF0YSgicmVzaXphYmxlIikudW5iaW5kKCIucmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUoKX07aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyKXtiKHRoaXMuZWxlbWVudCk7dmFyIGM9dGhpcy5lbGVtZW50O2MuYWZ0ZXIodGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjpjLmNzcygicG9zaXRpb24iKSx3aWR0aDpjLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yy5vdXRlckhlaWdodCgpLHRvcDpjLmNzcygidG9wIiksbGVmdDpjLmNzcygibGVmdCIpfSkpLnJlbW92ZSgpfXJldHVybiB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKSxiKHRoaXMub3JpZ2luYWxFbGVtZW50KSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPSExO2Zvcih2YXIgZCBpbiB0aGlzLmhhbmRsZXMpYSh0aGlzLmhhbmRsZXNbZF0pWzBdPT1iLnRhcmdldCYmKGM9ITApO3JldHVybiF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmN9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMuZWxlbWVudC5wb3NpdGlvbigpLGY9dGhpcy5lbGVtZW50O3RoaXMucmVzaXppbmc9ITAsdGhpcy5kb2N1bWVudFNjcm9sbD17dG9wOmEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLGxlZnQ6YShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpfSwoZi5pcygiLnVpLWRyYWdnYWJsZSIpfHwvYWJzb2x1dGUvLnRlc3QoZi5jc3MoInBvc2l0aW9uIikpKSYmZi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOmUudG9wLGxlZnQ6ZS5sZWZ0fSksdGhpcy5fcmVuZGVyUHJveHkoKTt2YXIgZz1jKHRoaXMuaGVscGVyLmNzcygibGVmdCIpKSxoPWModGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSk7ZC5jb250YWlubWVudCYmKGcrPWEoZC5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLGgrPWEoZC5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6Zyx0b3A6aH0sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6Zi5vdXRlcldpZHRoKCksaGVpZ2h0OmYub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmYud2lkdGgoKSxoZWlnaHQ6Zi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFNpemU9dGhpcy5faGVscGVyP3t3aWR0aDpmLm91dGVyV2lkdGgoKSxoZWlnaHQ6Zi5vdXRlckhlaWdodCgpfTp7d2lkdGg6Zi53aWR0aCgpLGhlaWdodDpmLmhlaWdodCgpfSx0aGlzLm9yaWdpbmFsUG9zaXRpb249e2xlZnQ6Zyx0b3A6aH0sdGhpcy5zaXplRGlmZj17d2lkdGg6Zi5vdXRlcldpZHRoKCktZi53aWR0aCgpLGhlaWdodDpmLm91dGVySGVpZ2h0KCktZi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb249e2xlZnQ6Yi5wYWdlWCx0b3A6Yi5wYWdlWX0sdGhpcy5hc3BlY3RSYXRpbz10eXBlb2YgZC5hc3BlY3RSYXRpbz09Im51bWJlciI/ZC5hc3BlY3RSYXRpbzp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aC90aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHR8fDE7dmFyIGk9YSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKTtyZXR1cm4gYSgiYm9keSIpLmNzcygiY3Vyc29yIixpPT0iYXV0byI/dGhpcy5heGlzKyItcmVzaXplIjppKSxmLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0YXJ0IixiKSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmhlbHBlcixkPXRoaXMub3B0aW9ucyxlPXt9LGY9dGhpcyxnPXRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uLGg9dGhpcy5heGlzLGk9Yi5wYWdlWC1nLmxlZnR8fDAsaj1iLnBhZ2VZLWcudG9wfHwwLGs9dGhpcy5fY2hhbmdlW2hdO2lmKCFrKXJldHVybiExO3ZhciBsPWsuYXBwbHkodGhpcyxbYixpLGpdKSxtPWEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3LG49dGhpcy5zaXplRGlmZjt0aGlzLl91cGRhdGVWaXJ0dWFsQm91bmRhcmllcyhiLnNoaWZ0S2V5KTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleSlsPXRoaXMuX3VwZGF0ZVJhdGlvKGwsYik7cmV0dXJuIGw9dGhpcy5fcmVzcGVjdFNpemUobCxiKSx0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsYiksYy5jc3Moe3RvcDp0aGlzLnBvc2l0aW9uLnRvcCsicHgiLGxlZnQ6dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIsd2lkdGg6dGhpcy5zaXplLndpZHRoKyJweCIsaGVpZ2h0OnRoaXMuc2l6ZS5oZWlnaHQrInB4In0pLCF0aGlzLl9oZWxwZXImJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpLHRoaXMuX3VwZGF0ZUNhY2hlKGwpLHRoaXMuX3RyaWdnZXIoInJlc2l6ZSIsYix0aGlzLnVpKCkpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGIpe3RoaXMucmVzaXppbmc9ITE7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcztpZih0aGlzLl9oZWxwZXIpe3ZhciBlPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZj1lLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChlWzBdLm5vZGVOYW1lKSxnPWYmJmEudWkuaGFzU2Nyb2xsKGVbMF0sImxlZnQiKT8wOmQuc2l6ZURpZmYuaGVpZ2h0LGg9Zj8wOmQuc2l6ZURpZmYud2lkdGgsaT17d2lkdGg6ZC5oZWxwZXIud2lkdGgoKS1oLGhlaWdodDpkLmhlbHBlci5oZWlnaHQoKS1nfSxqPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGQucG9zaXRpb24ubGVmdC1kLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsaz1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGQucG9zaXRpb24udG9wLWQub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2MuYW5pbWF0ZXx8dGhpcy5lbGVtZW50LmNzcyhhLmV4dGVuZChpLHt0b3A6ayxsZWZ0Omp9KSksZC5oZWxwZXIuaGVpZ2h0KGQuc2l6ZS5oZWlnaHQpLGQuaGVscGVyLndpZHRoKGQuc2l6ZS53aWR0aCksdGhpcy5faGVscGVyJiYhYy5hbmltYXRlJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfXJldHVybiBhKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIiksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0b3AiLGIpLHRoaXMuX2hlbHBlciYmdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9LF91cGRhdGVWaXJ0dWFsQm91bmRhcmllczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYyxlLGYsZyxoO2g9e21pbldpZHRoOmQoYi5taW5XaWR0aCk/Yi5taW5XaWR0aDowLG1heFdpZHRoOmQoYi5tYXhXaWR0aCk/Yi5tYXhXaWR0aDpJbmZpbml0eSxtaW5IZWlnaHQ6ZChiLm1pbkhlaWdodCk/Yi5taW5IZWlnaHQ6MCxtYXhIZWlnaHQ6ZChiLm1heEhlaWdodCk/Yi5tYXhIZWlnaHQ6SW5maW5pdHl9O2lmKHRoaXMuX2FzcGVjdFJhdGlvfHxhKWM9aC5taW5IZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxmPWgubWluV2lkdGgvdGhpcy5hc3BlY3RSYXRpbyxlPWgubWF4SGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sZz1oLm1heFdpZHRoL3RoaXMuYXNwZWN0UmF0aW8sYz5oLm1pbldpZHRoJiYoaC5taW5XaWR0aD1jKSxmPmgubWluSGVpZ2h0JiYoaC5taW5IZWlnaHQ9ZiksZTxoLm1heFdpZHRoJiYoaC5tYXhXaWR0aD1lKSxnPGgubWF4SGVpZ2h0JiYoaC5tYXhIZWlnaHQ9Zyk7dGhpcy5fdkJvdW5kYXJpZXM9aH0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSxkKGEubGVmdCkmJih0aGlzLnBvc2l0aW9uLmxlZnQ9YS5sZWZ0KSxkKGEudG9wKSYmKHRoaXMucG9zaXRpb24udG9wPWEudG9wKSxkKGEuaGVpZ2h0KSYmKHRoaXMuc2l6ZS5oZWlnaHQ9YS5oZWlnaHQpLGQoYS53aWR0aCkmJih0aGlzLnNpemUud2lkdGg9YS53aWR0aCl9LF91cGRhdGVSYXRpbzpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3B0aW9ucyxlPXRoaXMucG9zaXRpb24sZj10aGlzLnNpemUsZz10aGlzLmF4aXM7cmV0dXJuIGQoYS5oZWlnaHQpP2Eud2lkdGg9YS5oZWlnaHQqdGhpcy5hc3BlY3RSYXRpbzpkKGEud2lkdGgpJiYoYS5oZWlnaHQ9YS53aWR0aC90aGlzLmFzcGVjdFJhdGlvKSxnPT0ic3ciJiYoYS5sZWZ0PWUubGVmdCsoZi53aWR0aC1hLndpZHRoKSxhLnRvcD1udWxsKSxnPT0ibnciJiYoYS50b3A9ZS50b3ArKGYuaGVpZ2h0LWEuaGVpZ2h0KSxhLmxlZnQ9ZS5sZWZ0KyhmLndpZHRoLWEud2lkdGgpKSxhfSxfcmVzcGVjdFNpemU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmhlbHBlcixlPXRoaXMuX3ZCb3VuZGFyaWVzLGY9dGhpcy5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXksZz10aGlzLmF4aXMsaD1kKGEud2lkdGgpJiZlLm1heFdpZHRoJiZlLm1heFdpZHRoPGEud2lkdGgsaT1kKGEuaGVpZ2h0KSYmZS5tYXhIZWlnaHQmJmUubWF4SGVpZ2h0PGEuaGVpZ2h0LGo9ZChhLndpZHRoKSYmZS5taW5XaWR0aCYmZS5taW5XaWR0aD5hLndpZHRoLGs9ZChhLmhlaWdodCkmJmUubWluSGVpZ2h0JiZlLm1pbkhlaWdodD5hLmhlaWdodDtqJiYoYS53aWR0aD1lLm1pbldpZHRoKSxrJiYoYS5oZWlnaHQ9ZS5taW5IZWlnaHQpLGgmJihhLndpZHRoPWUubWF4V2lkdGgpLGkmJihhLmhlaWdodD1lLm1heEhlaWdodCk7dmFyIGw9dGhpcy5vcmlnaW5hbFBvc2l0aW9uLmxlZnQrdGhpcy5vcmlnaW5hbFNpemUud2lkdGgsbT10aGlzLnBvc2l0aW9uLnRvcCt0aGlzLnNpemUuaGVpZ2h0LG49L3N3fG53fHcvLnRlc3QoZyksbz0vbnd8bmV8bi8udGVzdChnKTtqJiZuJiYoYS5sZWZ0PWwtZS5taW5XaWR0aCksaCYmbiYmKGEubGVmdD1sLWUubWF4V2lkdGgpLGsmJm8mJihhLnRvcD1tLWUubWluSGVpZ2h0KSxpJiZvJiYoYS50b3A9bS1lLm1heEhlaWdodCk7dmFyIHA9IWEud2lkdGgmJiFhLmhlaWdodDtyZXR1cm4gcCYmIWEubGVmdCYmYS50b3A/YS50b3A9bnVsbDpwJiYhYS50b3AmJmEubGVmdCYmKGEubGVmdD1udWxsKSxhfSxfcHJvcG9ydGlvbmFsbHlSZXNpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7aWYoIXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKXJldHVybjt2YXIgYz10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O2Zvcih2YXIgZD0wO2Q8dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGg7ZCsrKXt2YXIgZT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzW2RdO2lmKCF0aGlzLmJvcmRlckRpZil7dmFyIGY9W2UuY3NzKCJib3JkZXJUb3BXaWR0aCIpLGUuY3NzKCJib3JkZXJSaWdodFdpZHRoIiksZS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksZS5jc3MoImJvcmRlckxlZnRXaWR0aCIpXSxnPVtlLmNzcygicGFkZGluZ1RvcCIpLGUuY3NzKCJwYWRkaW5nUmlnaHQiKSxlLmNzcygicGFkZGluZ0JvdHRvbSIpLGUuY3NzKCJwYWRkaW5nTGVmdCIpXTt0aGlzLmJvcmRlckRpZj1hLm1hcChmLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGFyc2VJbnQoYSwxMCl8fDAsZD1wYXJzZUludChnW2JdLDEwKXx8MDtyZXR1cm4gYytkfSl9aWYoIWEuYnJvd3Nlci5tc2llfHwhYShjKS5pcygiOmhpZGRlbiIpJiYhYShjKS5wYXJlbnRzKCI6aGlkZGVuIikubGVuZ3RoKWUuY3NzKHtoZWlnaHQ6Yy5oZWlnaHQoKS10aGlzLmJvcmRlckRpZlswXS10aGlzLmJvcmRlckRpZlsyXXx8MCx3aWR0aDpjLndpZHRoKCktdGhpcy5ib3JkZXJEaWZbMV0tdGhpcy5ib3JkZXJEaWZbM118fDB9KTtlbHNlIGNvbnRpbnVlfX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LGM9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD1iLm9mZnNldCgpO2lmKHRoaXMuX2hlbHBlcil7dGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fGEoJzxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjsiPjwvZGl2PicpO3ZhciBkPWEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3LGU9ZD8xOjAsZj1kPzI6LTE7dGhpcy5oZWxwZXIuYWRkQ2xhc3ModGhpcy5faGVscGVyKS5jc3Moe3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkrZixoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkrZixwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6dGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtZSsicHgiLHRvcDp0aGlzLmVsZW1lbnRPZmZzZXQudG9wLWUrInB4Iix6SW5kZXg6KytjLnpJbmRleH0pLHRoaXMuaGVscGVyLmFwcGVuZFRvKCJib2R5IikuZGlzYWJsZVNlbGVjdGlvbigpfWVsc2UgdGhpcy5oZWxwZXI9dGhpcy5lbGVtZW50fSxfY2hhbmdlOntlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrYn19LHc6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3JpZ2luYWxTaXplLGY9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybntsZWZ0OmYubGVmdCtiLHdpZHRoOmUud2lkdGgtYn19LG46ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3JpZ2luYWxTaXplLGY9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybnt0b3A6Zi50b3ArYyxoZWlnaHQ6ZS5oZWlnaHQtY319LHM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybntoZWlnaHQ6dGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0K2N9fSxzZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtiLGMsZF0pKX0sc3c6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbYixjLGRdKSl9LG5lOmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYS5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2IsYyxkXSkpfSxudzpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtiLGMsZF0pKX19LF9wcm9wYWdhdGU6ZnVuY3Rpb24oYixjKXthLnVpLnBsdWdpbi5jYWxsKHRoaXMsYixbYyx0aGlzLnVpKCldKSxiIT0icmVzaXplIiYmdGhpcy5fdHJpZ2dlcihiLGMsdGhpcy51aSgpKX0scGx1Z2luczp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3JpZ2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9ufX19KSxhLmV4dGVuZChhLnVpLnJlc2l6YWJsZSx7dmVyc2lvbjoiMS44LjI0In0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYWxzb1Jlc2l6ZSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWZ1bmN0aW9uKGIpe2EoYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyk7Yi5kYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIse3dpZHRoOnBhcnNlSW50KGIud2lkdGgoKSwxMCksaGVpZ2h0OnBhcnNlSW50KGIuaGVpZ2h0KCksMTApLGxlZnQ6cGFyc2VJbnQoYi5jc3MoImxlZnQiKSwxMCksdG9wOnBhcnNlSW50KGIuY3NzKCJ0b3AiKSwxMCl9KX0pfTt0eXBlb2YgZS5hbHNvUmVzaXplPT0ib2JqZWN0IiYmIWUuYWxzb1Jlc2l6ZS5wYXJlbnROb2RlP2UuYWxzb1Jlc2l6ZS5sZW5ndGg/KGUuYWxzb1Jlc2l6ZT1lLmFsc29SZXNpemVbMF0sZihlLmFsc29SZXNpemUpKTphLmVhY2goZS5hbHNvUmVzaXplLGZ1bmN0aW9uKGEpe2YoYSl9KTpmKGUuYWxzb1Jlc2l6ZSl9LHJlc2l6ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLm9yaWdpbmFsU2l6ZSxnPWQub3JpZ2luYWxQb3NpdGlvbixoPXtoZWlnaHQ6ZC5zaXplLmhlaWdodC1mLmhlaWdodHx8MCx3aWR0aDpkLnNpemUud2lkdGgtZi53aWR0aHx8MCx0b3A6ZC5wb3NpdGlvbi50b3AtZy50b3B8fDAsbGVmdDpkLnBvc2l0aW9uLmxlZnQtZy5sZWZ0fHwwfSxpPWZ1bmN0aW9uKGIsZCl7YShiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxlPWEodGhpcykuZGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKSxmPXt9LGc9ZCYmZC5sZW5ndGg/ZDpiLnBhcmVudHMoYy5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aD9bIndpZHRoIiwiaGVpZ2h0Il06WyJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiXTthLmVhY2goZyxmdW5jdGlvbihhLGIpe3ZhciBjPShlW2JdfHwwKSsoaFtiXXx8MCk7YyYmYz49MCYmKGZbYl09Y3x8bnVsbCl9KSxiLmNzcyhmKX0pfTt0eXBlb2YgZS5hbHNvUmVzaXplPT0ib2JqZWN0IiYmIWUuYWxzb1Jlc2l6ZS5ub2RlVHlwZT9hLmVhY2goZS5hbHNvUmVzaXplLGZ1bmN0aW9uKGEsYil7aShhLGIpfSk6aShlLmFsc29SZXNpemUpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7YSh0aGlzKS5yZW1vdmVEYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxnPWYubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KGZbMF0ubm9kZU5hbWUpLGg9ZyYmYS51aS5oYXNTY3JvbGwoZlswXSwibGVmdCIpPzA6ZC5zaXplRGlmZi5oZWlnaHQsaT1nPzA6ZC5zaXplRGlmZi53aWR0aCxqPXt3aWR0aDpkLnNpemUud2lkdGgtaSxoZWlnaHQ6ZC5zaXplLmhlaWdodC1ofSxrPXBhcnNlSW50KGQuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGQucG9zaXRpb24ubGVmdC1kLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsbD1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGQucG9zaXRpb24udG9wLWQub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2QuZWxlbWVudC5hbmltYXRlKGEuZXh0ZW5kKGosbCYmaz97dG9wOmwsbGVmdDprfTp7fSkse2R1cmF0aW9uOmUuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzplLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBjPXt3aWR0aDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJ3aWR0aCIpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygiaGVpZ2h0IiksMTApLHRvcDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCksbGVmdDpwYXJzZUludChkLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApfTtmJiZmLmxlbmd0aCYmYShmWzBdKS5jc3Moe3dpZHRoOmMud2lkdGgsaGVpZ2h0OmMuaGVpZ2h0fSksZC5fdXBkYXRlQ2FjaGUoYyksZC5fcHJvcGFnYXRlKCJyZXNpemUiLGIpfX0pfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbihiLGQpe3ZhciBlPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZj1lLm9wdGlvbnMsZz1lLmVsZW1lbnQsaD1mLmNvbnRhaW5tZW50LGk9aCBpbnN0YW5jZW9mIGE/aC5nZXQoMCk6L3BhcmVudC8udGVzdChoKT9nLnBhcmVudCgpLmdldCgwKTpoO2lmKCFpKXJldHVybjtlLmNvbnRhaW5lckVsZW1lbnQ9YShpKTtpZigvZG9jdW1lbnQvLnRlc3QoaCl8fGg9PWRvY3VtZW50KWUuY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9LGUuY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH0sZS5wYXJlbnREYXRhPXtlbGVtZW50OmEoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDphKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDphKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH07ZWxzZXt2YXIgaj1hKGkpLGs9W107YShbIlRvcCIsIlJpZ2h0IiwiTGVmdCIsIkJvdHRvbSJdKS5lYWNoKGZ1bmN0aW9uKGEsYil7a1thXT1jKGouY3NzKCJwYWRkaW5nIitiKSl9KSxlLmNvbnRhaW5lck9mZnNldD1qLm9mZnNldCgpLGUuY29udGFpbmVyUG9zaXRpb249ai5wb3NpdGlvbigpLGUuY29udGFpbmVyU2l6ZT17aGVpZ2h0OmouaW5uZXJIZWlnaHQoKS1rWzNdLHdpZHRoOmouaW5uZXJXaWR0aCgpLWtbMV19O3ZhciBsPWUuY29udGFpbmVyT2Zmc2V0LG09ZS5jb250YWluZXJTaXplLmhlaWdodCxuPWUuY29udGFpbmVyU2l6ZS53aWR0aCxvPWEudWkuaGFzU2Nyb2xsKGksImxlZnQiKT9pLnNjcm9sbFdpZHRoOm4scD1hLnVpLmhhc1Njcm9sbChpKT9pLnNjcm9sbEhlaWdodDptO2UucGFyZW50RGF0YT17ZWxlbWVudDppLGxlZnQ6bC5sZWZ0LHRvcDpsLnRvcCx3aWR0aDpvLGhlaWdodDpwfX19LHJlc2l6ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLmNvbnRhaW5lclNpemUsZz1kLmNvbnRhaW5lck9mZnNldCxoPWQuc2l6ZSxpPWQucG9zaXRpb24saj1kLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleSxrPXt0b3A6MCxsZWZ0OjB9LGw9ZC5jb250YWluZXJFbGVtZW50O2xbMF0hPWRvY3VtZW50JiYvc3RhdGljLy50ZXN0KGwuY3NzKCJwb3NpdGlvbiIpKSYmKGs9ZyksaS5sZWZ0PChkLl9oZWxwZXI/Zy5sZWZ0OjApJiYoZC5zaXplLndpZHRoPWQuc2l6ZS53aWR0aCsoZC5faGVscGVyP2QucG9zaXRpb24ubGVmdC1nLmxlZnQ6ZC5wb3NpdGlvbi5sZWZ0LWsubGVmdCksaiYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLndpZHRoL2QuYXNwZWN0UmF0aW8pLGQucG9zaXRpb24ubGVmdD1lLmhlbHBlcj9nLmxlZnQ6MCksaS50b3A8KGQuX2hlbHBlcj9nLnRvcDowKSYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLmhlaWdodCsoZC5faGVscGVyP2QucG9zaXRpb24udG9wLWcudG9wOmQucG9zaXRpb24udG9wKSxqJiYoZC5zaXplLndpZHRoPWQuc2l6ZS5oZWlnaHQqZC5hc3BlY3RSYXRpbyksZC5wb3NpdGlvbi50b3A9ZC5faGVscGVyP2cudG9wOjApLGQub2Zmc2V0LmxlZnQ9ZC5wYXJlbnREYXRhLmxlZnQrZC5wb3NpdGlvbi5sZWZ0LGQub2Zmc2V0LnRvcD1kLnBhcmVudERhdGEudG9wK2QucG9zaXRpb24udG9wO3ZhciBtPU1hdGguYWJzKChkLl9oZWxwZXI/ZC5vZmZzZXQubGVmdC1rLmxlZnQ6ZC5vZmZzZXQubGVmdC1rLmxlZnQpK2Quc2l6ZURpZmYud2lkdGgpLG49TWF0aC5hYnMoKGQuX2hlbHBlcj9kLm9mZnNldC50b3Atay50b3A6ZC5vZmZzZXQudG9wLWcudG9wKStkLnNpemVEaWZmLmhlaWdodCksbz1kLmNvbnRhaW5lckVsZW1lbnQuZ2V0KDApPT1kLmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLHA9L3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KGQuY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpO28mJnAmJihtLT1kLnBhcmVudERhdGEubGVmdCksbStkLnNpemUud2lkdGg+PWQucGFyZW50RGF0YS53aWR0aCYmKGQuc2l6ZS53aWR0aD1kLnBhcmVudERhdGEud2lkdGgtbSxqJiYoZC5zaXplLmhlaWdodD1kLnNpemUud2lkdGgvZC5hc3BlY3RSYXRpbykpLG4rZC5zaXplLmhlaWdodD49ZC5wYXJlbnREYXRhLmhlaWdodCYmKGQuc2l6ZS5oZWlnaHQ9ZC5wYXJlbnREYXRhLmhlaWdodC1uLGomJihkLnNpemUud2lkdGg9ZC5zaXplLmhlaWdodCpkLmFzcGVjdFJhdGlvKSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5wb3NpdGlvbixnPWQuY29udGFpbmVyT2Zmc2V0LGg9ZC5jb250YWluZXJQb3NpdGlvbixpPWQuY29udGFpbmVyRWxlbWVudCxqPWEoZC5oZWxwZXIpLGs9ai5vZmZzZXQoKSxsPWoub3V0ZXJXaWR0aCgpLWQuc2l6ZURpZmYud2lkdGgsbT1qLm91dGVySGVpZ2h0KCktZC5zaXplRGlmZi5oZWlnaHQ7ZC5faGVscGVyJiYhZS5hbmltYXRlJiYvcmVsYXRpdmUvLnRlc3QoaS5jc3MoInBvc2l0aW9uIikpJiZhKHRoaXMpLmNzcyh7bGVmdDprLmxlZnQtaC5sZWZ0LWcubGVmdCx3aWR0aDpsLGhlaWdodDptfSksZC5faGVscGVyJiYhZS5hbmltYXRlJiYvc3RhdGljLy50ZXN0KGkuY3NzKCJwb3NpdGlvbiIpKSYmYSh0aGlzKS5jc3Moe2xlZnQ6ay5sZWZ0LWgubGVmdC1nLmxlZnQsd2lkdGg6bCxoZWlnaHQ6bX0pfX0pLGEudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1kLnNpemU7ZC5naG9zdD1kLm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpLGQuZ2hvc3QuY3NzKHtvcGFjaXR5Oi4yNSxkaXNwbGF5OiJibG9jayIscG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6Zi5oZWlnaHQsd2lkdGg6Zi53aWR0aCxtYXJnaW46MCxsZWZ0OjAsdG9wOjB9KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWdob3N0IikuYWRkQ2xhc3ModHlwZW9mIGUuZ2hvc3Q9PSJzdHJpbmciP2UuZ2hvc3Q6IiIpLGQuZ2hvc3QuYXBwZW5kVG8oZC5oZWxwZXIpfSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zO2QuZ2hvc3QmJmQuZ2hvc3QuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDpkLnNpemUuaGVpZ2h0LHdpZHRoOmQuc2l6ZS53aWR0aH0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucztkLmdob3N0JiZkLmhlbHBlciYmZC5oZWxwZXIuZ2V0KDApLnJlbW92ZUNoaWxkKGQuZ2hvc3QuZ2V0KDApKX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdyaWQiLHtyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5zaXplLGc9ZC5vcmlnaW5hbFNpemUsaD1kLm9yaWdpbmFsUG9zaXRpb24saT1kLmF4aXMsaj1lLl9hc3BlY3RSYXRpb3x8Yi5zaGlmdEtleTtlLmdyaWQ9dHlwZW9mIGUuZ3JpZD09Im51bWJlciI/W2UuZ3JpZCxlLmdyaWRdOmUuZ3JpZDt2YXIgaz1NYXRoLnJvdW5kKChmLndpZHRoLWcud2lkdGgpLyhlLmdyaWRbMF18fDEpKSooZS5ncmlkWzBdfHwxKSxsPU1hdGgucm91bmQoKGYuaGVpZ2h0LWcuaGVpZ2h0KS8oZS5ncmlkWzFdfHwxKSkqKGUuZ3JpZFsxXXx8MSk7L14oc2V8c3xlKSQvLnRlc3QoaSk/KGQuc2l6ZS53aWR0aD1nLndpZHRoK2ssZC5zaXplLmhlaWdodD1nLmhlaWdodCtsKTovXihuZSkkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLnRvcD1oLnRvcC1sKTovXihzdykkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLmxlZnQ9aC5sZWZ0LWspOihkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCxkLnBvc2l0aW9uLnRvcD1oLnRvcC1sLGQucG9zaXRpb24ubGVmdD1oLmxlZnQtayl9fSk7dmFyIGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfHwwfSxkPWZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUludChhLDEwKSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGEudWkubW91c2Use29wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDohMCxkaXN0YW5jZTowLGZpbHRlcjoiKiIsdG9sZXJhbmNlOiJ0b3VjaCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpLHRoaXMuZHJhZ2dlZD0hMTt2YXIgYzt0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtjPWEoYi5vcHRpb25zLmZpbHRlcixiLmVsZW1lbnRbMF0pLGMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksYy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxjPWIub2Zmc2V0KCk7YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDpiLGxlZnQ6Yy5sZWZ0LHRvcDpjLnRvcCxyaWdodDpjLmxlZnQrYi5vdXRlcldpZHRoKCksYm90dG9tOmMudG9wK2Iub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOiExLHNlbGVjdGVkOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGluZyIpLHVuc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5nIil9KX0pfSx0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcz1jLmFkZENsYXNzKCJ1aS1zZWxlY3RlZSIpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuaGVscGVyPWEoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKX0sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIiksdGhpcy5fbW91c2VEZXN0cm95KCksdGhpc30sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLm9wb3M9W2IucGFnZVgsYi5wYWdlWV07aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybjt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9YShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKSxhKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlciksdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIuY2xpZW50WCx0b3A6Yi5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KSxkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC5zdGFydHNlbGVjdGVkPSEwLCFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJihkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGQuc2VsZWN0ZWQ9ITEsZC4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxkLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSl9KSxhKGIudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoZCl7dmFyIGU9IWIubWV0YUtleSYmIWIuY3RybEtleXx8IWQuJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIik7cmV0dXJuIGQuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZT8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKGU/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksZC51bnNlbGVjdGluZz0hZSxkLnNlbGVjdGluZz1lLGQuc2VsZWN0ZWQ9ZSxlP2MuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmQuZWxlbWVudH0pOmMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSwhMX19KX0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3RoaXMuZHJhZ2dlZD0hMDtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3Bvc1swXSxmPXRoaXMub3Bvc1sxXSxnPWIucGFnZVgsaD1iLnBhZ2VZO2lmKGU+Zyl7dmFyIGk9ZztnPWUsZT1pfWlmKGY+aCl7dmFyIGk9aDtoPWYsZj1pfXJldHVybiB0aGlzLmhlbHBlci5jc3Moe2xlZnQ6ZSx0b3A6Zix3aWR0aDpnLWUsaGVpZ2h0OmgtZn0pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoIWl8fGkuZWxlbWVudD09Yy5lbGVtZW50WzBdKXJldHVybjt2YXIgaj0hMTtkLnRvbGVyYW5jZT09InRvdWNoIj9qPSEoaS5sZWZ0Pmd8fGkucmlnaHQ8ZXx8aS50b3A+aHx8aS5ib3R0b208Zik6ZC50b2xlcmFuY2U9PSJmaXQiJiYoaj1pLmxlZnQ+ZSYmaS5yaWdodDxnJiZpLnRvcD5mJiZpLmJvdHRvbTxoKSxqPyhpLnNlbGVjdGVkJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSExKSxpLnVuc2VsZWN0aW5nJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSExKSxpLnNlbGVjdGluZ3x8KGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmkuZWxlbWVudH0pKSk6KGkuc2VsZWN0aW5nJiYoKGIubWV0YUtleXx8Yi5jdHJsS2V5KSYmaS5zdGFydHNlbGVjdGVkPyhpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITApOihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITApLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpLGkuc2VsZWN0ZWQmJiFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJiFpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpfSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLmRyYWdnZWQ9ITE7dmFyIGQ9dGhpcy5vcHRpb25zO3JldHVybiBhKCIudWktdW5zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGQudW5zZWxlY3Rpbmc9ITEsZC5zdGFydHNlbGVjdGVkPSExLGMuX3RyaWdnZXIoInVuc2VsZWN0ZWQiLGIse3Vuc2VsZWN0ZWQ6ZC5lbGVtZW50fSl9KSxhKCIudWktc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIikuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksZC5zZWxlY3Rpbmc9ITEsZC5zZWxlY3RlZD0hMCxkLnN0YXJ0c2VsZWN0ZWQ9ITAsYy5fdHJpZ2dlcigic2VsZWN0ZWQiLGIse3NlbGVjdGVkOmQuZWxlbWVudH0pfSksdGhpcy5fdHJpZ2dlcigic3RvcCIsYiksdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9fSksYS5leHRlbmQoYS51aS5zZWxlY3RhYmxlLHt2ZXJzaW9uOiIxLjguMjQifSl9KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuc29ydGFibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJzb3J0IixyZWFkeTohMSxvcHRpb25zOnthcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RXaXRoOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZHJvcE9uRW1wdHk6ITAsZm9yY2VQbGFjZWhvbGRlclNpemU6ITEsZm9yY2VIZWxwZXJTaXplOiExLGdyaWQ6ITEsaGFuZGxlOiExLGhlbHBlcjoib3JpZ2luYWwiLGl0ZW1zOiI+ICoiLG9wYWNpdHk6ITEscGxhY2Vob2xkZXI6ITEscmV2ZXJ0OiExLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QiLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5mbG9hdGluZz10aGlzLml0ZW1zLmxlbmd0aD9hLmF4aXM9PT0ieCJ8fC9sZWZ0fHJpZ2h0Ly50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoImZsb2F0IikpfHwvaW5saW5lfHRhYmxlLWNlbGwvLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZGlzcGxheSIpKTohMSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5yZWFkeT0hMH0sZGVzdHJveTpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aC0xO2I+PTA7Yi0tKXRoaXMuaXRlbXNbYl0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiPyh0aGlzLm9wdGlvbnNbYl09Yyx0aGlzLndpZGdldCgpW2M/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc29ydGFibGUtZGlzYWJsZWQiKSk6YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcztpZih0aGlzLnJldmVydGluZylyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMub3B0aW9ucy50eXBlPT0ic3RhdGljIilyZXR1cm4hMTt0aGlzLl9yZWZyZXNoSXRlbXMoYik7dmFyIGU9bnVsbCxmPXRoaXMsZz1hKGIudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKGEuZGF0YSh0aGlzLGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZilyZXR1cm4gZT1hKHRoaXMpLCExfSk7YS5kYXRhKGIudGFyZ2V0LGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZiYmKGU9YShiLnRhcmdldCkpO2lmKCFlKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5oYW5kbGUmJiFjKXt2YXIgaD0hMTthKHRoaXMub3B0aW9ucy5oYW5kbGUsZSkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09Yi50YXJnZXQmJihoPSEwKX0pO2lmKCFoKXJldHVybiExfXJldHVybiB0aGlzLmN1cnJlbnRJdGVtPWUsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMub3B0aW9ucyxmPXRoaXM7dGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLm9yaWdpbmFsUGFnZVg9Yi5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9Yi5wYWdlWSxlLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGUuY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLGUuY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksZS5jdXJzb3ImJihhKCJib2R5IikuY3NzKCJjdXJzb3IiKSYmKHRoaXMuX3N0b3JlZEN1cnNvcj1hKCJib2R5IikuY3NzKCJjdXJzb3IiKSksYSgiYm9keSIpLmNzcygiY3Vyc29yIixlLmN1cnNvcikpLGUub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpJiYodGhpcy5fc3RvcmVkT3BhY2l0eT10aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSksdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixlLm9wYWNpdHkpKSxlLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikmJih0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSksdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLGUuekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCImJih0aGlzLm92ZXJmbG93T2Zmc2V0PXRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5fcHJlc2VydmVIZWxwZXJQcm9wb3J0aW9uc3x8dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKCFkKWZvcih2YXIgZz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Zz49MDtnLS0pdGhpcy5jb250YWluZXJzW2ddLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYixmLl91aUhhc2godGhpcykpO3JldHVybiBhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksYS51aS5kZG1hbmFnZXImJiFlLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsYiksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKGIpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyk7aWYodGhpcy5vcHRpb25zLnNjcm9sbCl7dmFyIGM9dGhpcy5vcHRpb25zLGQ9ITE7dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCI/KHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC1iLnBhZ2VZPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Muc2Nyb2xsU3BlZWQ6Yi5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLWMuc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1iLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDpiLnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtYy5zY3JvbGxTcGVlZCkpOihiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLmhlaWdodCgpLShiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxjLnNjcm9sbFNlbnNpdGl2aXR5JiYoZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCkpLGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1jLnNjcm9sbFNwZWVkKTphKHdpbmRvdykud2lkdGgoKS0oYi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkPWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpKSksZCE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKX10aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4Ijtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGY9dGhpcy5pdGVtc1tlXSxnPWYuaXRlbVswXSxoPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihmKTtpZighaCljb250aW51ZTtpZihmLmluc3RhbmNlIT09dGhpcy5jdXJyZW50Q29udGFpbmVyKWNvbnRpbnVlO2lmKGchPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMucGxhY2Vob2xkZXJbaD09MT8ibmV4dCI6InByZXYiXSgpWzBdIT1nJiYhYS51aS5jb250YWlucyh0aGlzLnBsYWNlaG9sZGVyWzBdLGcpJiYodGhpcy5vcHRpb25zLnR5cGU9PSJzZW1pLWR5bmFtaWMiPyFhLnVpLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSxnKTohMCkpe3RoaXMuZGlyZWN0aW9uPWg9PTE/ImRvd24iOiJ1cCI7aWYodGhpcy5vcHRpb25zLnRvbGVyYW5jZT09InBvaW50ZXIifHx0aGlzLl9pbnRlcnNlY3RzV2l0aFNpZGVzKGYpKXRoaXMuX3JlYXJyYW5nZShiLGYpO2Vsc2UgYnJlYWs7dGhpcy5fdHJpZ2dlcigiY2hhbmdlIixiLHRoaXMuX3VpSGFzaCgpKTticmVha319cmV0dXJuIHRoaXMuX2NvbnRhY3RDb250YWluZXJzKGIpLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYiksdGhpcy5fdHJpZ2dlcigic29ydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicywhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiLGMpe2lmKCFiKXJldHVybjthLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiZhLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsYik7aWYodGhpcy5vcHRpb25zLnJldmVydCl7dmFyIGQ9dGhpcyxlPWQucGxhY2Vob2xkZXIub2Zmc2V0KCk7ZC5yZXZlcnRpbmc9ITAsYSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh7bGVmdDplLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQtZC5tYXJnaW5zLmxlZnQrKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsTGVmdCksdG9wOmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AtZC5tYXJnaW5zLnRvcCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApfSxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9uKCl7ZC5fY2xlYXIoYil9KX1lbHNlIHRoaXMuX2NsZWFyKGIsYyk7cmV0dXJuITF9LGNhbmNlbDpmdW5jdGlvbigpe3ZhciBiPXRoaXM7aWYodGhpcy5kcmFnZ2luZyl7dGhpcy5fbW91c2VVcCh7dGFyZ2V0Om51bGx9KSx0aGlzLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiP3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOnRoaXMuY3VycmVudEl0ZW0uc2hvdygpO2Zvcih2YXIgYz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Yz49MDtjLS0pdGhpcy5jb250YWluZXJzW2NdLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixudWxsLGIuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbY10uX3RyaWdnZXIoIm91dCIsbnVsbCxiLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5vdmVyPTApfXJldHVybiB0aGlzLnBsYWNlaG9sZGVyJiYodGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlJiZ0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5vcHRpb25zLmhlbHBlciE9Im9yaWdpbmFsIiYmdGhpcy5oZWxwZXImJnRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUmJnRoaXMuaGVscGVyLnJlbW92ZSgpLGEuZXh0ZW5kKHRoaXMse2hlbHBlcjpudWxsLGRyYWdnaW5nOiExLHJldmVydGluZzohMSxfbm9GaW5hbFNvcnQ6bnVsbH0pLHRoaXMuZG9tUG9zaXRpb24ucHJldj9hKHRoaXMuZG9tUG9zaXRpb24ucHJldikuYWZ0ZXIodGhpcy5jdXJyZW50SXRlbSk6YSh0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCkucHJlcGVuZCh0aGlzLmN1cnJlbnRJdGVtKSksdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkoYiYmYi5jb25uZWN0ZWQpLGQ9W107cmV0dXJuIGI9Ynx8e30sYShjKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9KGEoYi5pdGVtfHx0aGlzKS5hdHRyKGIuYXR0cmlidXRlfHwiaWQiKXx8IiIpLm1hdGNoKGIuZXhwcmVzc2lvbnx8LyguKylbLT1fXSguKykvKTtjJiZkLnB1c2goKGIua2V5fHxjWzFdKyJbXSIpKyI9IisoYi5rZXkmJmIuZXhwcmVzc2lvbj9jWzFdOmNbMl0pKX0pLCFkLmxlbmd0aCYmYi5rZXkmJmQucHVzaChiLmtleSsiPSIpLGQuam9pbigiJiIpfSx0b0FycmF5OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkoYiYmYi5jb25uZWN0ZWQpLGQ9W107cmV0dXJuIGI9Ynx8e30sYy5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKGEoYi5pdGVtfHx0aGlzKS5hdHRyKGIuYXR0cmlidXRlfHwiaWQiKXx8IiIpfSksZH0sX2ludGVyc2VjdHNXaXRoOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucG9zaXRpb25BYnMubGVmdCxjPWIrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxkPXRoaXMucG9zaXRpb25BYnMudG9wLGU9ZCt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxmPWEubGVmdCxnPWYrYS53aWR0aCxoPWEudG9wLGk9aCthLmhlaWdodCxqPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCxrPXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsbD1kK2o+aCYmZCtqPGkmJmIraz5mJiZiK2s8ZztyZXR1cm4gdGhpcy5vcHRpb25zLnRvbGVyYW5jZT09InBvaW50ZXIifHx0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVyc3x8dGhpcy5vcHRpb25zLnRvbGVyYW5jZSE9InBvaW50ZXIiJiZ0aGlzLmhlbHBlclByb3BvcnRpb25zW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0+YVt0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdP2w6ZjxiK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmYy10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8ZyYmaDxkK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJmUtdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxpfSxfaW50ZXJzZWN0c1dpdGhQb2ludGVyOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucy5heGlzPT09IngifHxhLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGIudG9wLGIuaGVpZ2h0KSxkPXRoaXMub3B0aW9ucy5heGlzPT09InkifHxhLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsYi5sZWZ0LGIud2lkdGgpLGU9YyYmZCxmPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLGc9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gZT90aGlzLmZsb2F0aW5nP2cmJmc9PSJyaWdodCJ8fGY9PSJkb3duIj8yOjE6ZiYmKGY9PSJkb3duIj8yOjEpOiExfSxfaW50ZXJzZWN0c1dpdGhTaWRlczpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmlzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGIudG9wK2IuaGVpZ2h0LzIsYi5oZWlnaHQpLGQ9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGIubGVmdCtiLndpZHRoLzIsYi53aWR0aCksZT10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxmPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIHRoaXMuZmxvYXRpbmcmJmY/Zj09InJpZ2h0IiYmZHx8Zj09ImxlZnQiJiYhZDplJiYoZT09ImRvd24iJiZjfHxlPT0idXAiJiYhYyl9LF9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7cmV0dXJuIGEhPTAmJihhPjA/ImRvd24iOiJ1cCIpfSxfZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvc2l0aW9uQWJzLmxlZnQtdGhpcy5sYXN0UG9zaXRpb25BYnMubGVmdDtyZXR1cm4gYSE9MCYmKGE+MD8icmlnaHQiOiJsZWZ0Iil9LHJlZnJlc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3JlZnJlc2hJdGVtcyhhKSx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzfSxfY29ubmVjdFdpdGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIGEuY29ubmVjdFdpdGguY29uc3RydWN0b3I9PVN0cmluZz9bYS5jb25uZWN0V2l0aF06YS5jb25uZWN0V2l0aH0sX2dldEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkPVtdLGU9W10sZj10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGYmJmIpZm9yKHZhciBnPWYubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBoPWEoZltnXSk7Zm9yKHZhciBpPWgubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBqPWEuZGF0YShoW2ldLHRoaXMud2lkZ2V0TmFtZSk7aiYmaiE9dGhpcyYmIWoub3B0aW9ucy5kaXNhYmxlZCYmZS5wdXNoKFthLmlzRnVuY3Rpb24oai5vcHRpb25zLml0ZW1zKT9qLm9wdGlvbnMuaXRlbXMuY2FsbChqLmVsZW1lbnQpOmEoai5vcHRpb25zLml0ZW1zLGouZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSxqXSl9fWUucHVzaChbYS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50LG51bGwse29wdGlvbnM6dGhpcy5vcHRpb25zLGl0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmEodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSx0aGlzXSk7Zm9yKHZhciBnPWUubGVuZ3RoLTE7Zz49MDtnLS0pZVtnXVswXS5lYWNoKGZ1bmN0aW9uKCl7ZC5wdXNoKHRoaXMpfSk7cmV0dXJuIGEoZCl9LF9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudEl0ZW0uZmluZCgiOmRhdGEoIit0aGlzLndpZGdldE5hbWUrIi1pdGVtKSIpO2Zvcih2YXIgYj0wO2I8dGhpcy5pdGVtcy5sZW5ndGg7YisrKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY109PXRoaXMuaXRlbXNbYl0uaXRlbVswXSYmdGhpcy5pdGVtcy5zcGxpY2UoYiwxKX0sX3JlZnJlc2hJdGVtczpmdW5jdGlvbihiKXt0aGlzLml0ZW1zPVtdLHRoaXMuY29udGFpbmVycz1bdGhpc107dmFyIGM9dGhpcy5pdGVtcyxkPXRoaXMsZT1bW2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSxiLHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXSxmPXRoaXMuX2Nvbm5lY3RXaXRoKCk7aWYoZiYmdGhpcy5yZWFkeSlmb3IodmFyIGc9Zi5sZW5ndGgtMTtnPj0wO2ctLSl7dmFyIGg9YShmW2ddKTtmb3IodmFyIGk9aC5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGo9YS5kYXRhKGhbaV0sdGhpcy53aWRnZXROYW1lKTtqJiZqIT10aGlzJiYhai5vcHRpb25zLmRpc2FibGVkJiYoZS5wdXNoKFthLmlzRnVuY3Rpb24oai5vcHRpb25zLml0ZW1zKT9qLm9wdGlvbnMuaXRlbXMuY2FsbChqLmVsZW1lbnRbMF0sYix7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6YShqLm9wdGlvbnMuaXRlbXMsai5lbGVtZW50KSxqXSksdGhpcy5jb250YWluZXJzLnB1c2goaikpfX1mb3IodmFyIGc9ZS5sZW5ndGgtMTtnPj0wO2ctLSl7dmFyIGs9ZVtnXVsxXSxsPWVbZ11bMF07Zm9yKHZhciBpPTAsbT1sLmxlbmd0aDtpPG07aSsrKXt2YXIgbj1hKGxbaV0pO24uZGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIixrKSxjLnB1c2goe2l0ZW06bixpbnN0YW5jZTprLHdpZHRoOjAsaGVpZ2h0OjAsbGVmdDowLHRvcDowfSl9fX0scmVmcmVzaFBvc2l0aW9uczpmdW5jdGlvbihiKXt0aGlzLm9mZnNldFBhcmVudCYmdGhpcy5oZWxwZXImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpO2Zvcih2YXIgYz10aGlzLml0ZW1zLmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZD10aGlzLml0ZW1zW2NdO2lmKGQuaW5zdGFuY2UhPXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZkLml0ZW1bMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0pY29udGludWU7dmFyIGU9dGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQ/YSh0aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudCxkLml0ZW0pOmQuaXRlbTtifHwoZC53aWR0aD1lLm91dGVyV2lkdGgoKSxkLmhlaWdodD1lLm91dGVySGVpZ2h0KCkpO3ZhciBmPWUub2Zmc2V0KCk7ZC5sZWZ0PWYubGVmdCxkLnRvcD1mLnRvcH1pZih0aGlzLm9wdGlvbnMuY3VzdG9tJiZ0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzKXRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMuY2FsbCh0aGlzKTtlbHNlIGZvcih2YXIgYz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Yz49MDtjLS0pe3ZhciBmPXRoaXMuY29udGFpbmVyc1tjXS5lbGVtZW50Lm9mZnNldCgpO3RoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5sZWZ0PWYubGVmdCx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUudG9wPWYudG9wLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS53aWR0aD10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vdXRlcldpZHRoKCksdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLmhlaWdodD10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vdXRlckhlaWdodCgpfXJldHVybiB0aGlzfSxfY3JlYXRlUGxhY2Vob2xkZXI6ZnVuY3Rpb24oYil7dmFyIGM9Ynx8dGhpcyxkPWMub3B0aW9ucztpZighZC5wbGFjZWhvbGRlcnx8ZC5wbGFjZWhvbGRlci5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt2YXIgZT1kLnBsYWNlaG9sZGVyO2QucGxhY2Vob2xkZXI9e2VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj1hKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYy5jdXJyZW50SXRlbVswXS5ub2RlTmFtZSkpLmFkZENsYXNzKGV8fGMuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lKyIgdWktc29ydGFibGUtcGxhY2Vob2xkZXIiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIilbMF07cmV0dXJuIGV8fChiLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGJ9LHVwZGF0ZTpmdW5jdGlvbihhLGIpe2lmKGUmJiFkLmZvcmNlUGxhY2Vob2xkZXJTaXplKXJldHVybjtiLmhlaWdodCgpfHxiLmhlaWdodChjLmN1cnJlbnRJdGVtLmlubmVySGVpZ2h0KCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdUb3AiKXx8MCwxMCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdCb3R0b20iKXx8MCwxMCkpLGIud2lkdGgoKXx8Yi53aWR0aChjLmN1cnJlbnRJdGVtLmlubmVyV2lkdGgoKS1wYXJzZUludChjLmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0xlZnQiKXx8MCwxMCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdSaWdodCIpfHwwLDEwKSl9fX1jLnBsYWNlaG9sZGVyPWEoZC5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwoYy5lbGVtZW50LGMuY3VycmVudEl0ZW0pKSxjLmN1cnJlbnRJdGVtLmFmdGVyKGMucGxhY2Vob2xkZXIpLGQucGxhY2Vob2xkZXIudXBkYXRlKGMsYy5wbGFjZWhvbGRlcil9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbihiKXt2YXIgYz1udWxsLGQ9bnVsbDtmb3IodmFyIGU9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2U+PTA7ZS0tKXtpZihhLnVpLmNvbnRhaW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sdGhpcy5jb250YWluZXJzW2VdLmVsZW1lbnRbMF0pKWNvbnRpbnVlO2lmKHRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNoZSkpe2lmKGMmJmEudWkuY29udGFpbnModGhpcy5jb250YWluZXJzW2VdLmVsZW1lbnRbMF0sYy5lbGVtZW50WzBdKSljb250aW51ZTtjPXRoaXMuY29udGFpbmVyc1tlXSxkPWV9ZWxzZSB0aGlzLmNvbnRhaW5lcnNbZV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1tlXS5fdHJpZ2dlcigib3V0IixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2VdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9aWYoIWMpcmV0dXJuO2lmKHRoaXMuY29udGFpbmVycy5sZW5ndGg9PT0xKXRoaXMuY29udGFpbmVyc1tkXS5fdHJpZ2dlcigib3ZlciIsYix0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tkXS5jb250YWluZXJDYWNoZS5vdmVyPTE7ZWxzZSBpZih0aGlzLmN1cnJlbnRDb250YWluZXIhPXRoaXMuY29udGFpbmVyc1tkXSl7dmFyIGY9MWU0LGc9bnVsbCxoPXRoaXMucG9zaXRpb25BYnNbdGhpcy5jb250YWluZXJzW2RdLmZsb2F0aW5nPyJsZWZ0IjoidG9wIl07Zm9yKHZhciBpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT49MDtpLS0pe2lmKCFhLnVpLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tkXS5lbGVtZW50WzBdLHRoaXMuaXRlbXNbaV0uaXRlbVswXSkpY29udGludWU7dmFyIGo9dGhpcy5jb250YWluZXJzW2RdLmZsb2F0aW5nP3RoaXMuaXRlbXNbaV0uaXRlbS5vZmZzZXQoKS5sZWZ0OnRoaXMuaXRlbXNbaV0uaXRlbS5vZmZzZXQoKS50b3A7TWF0aC5hYnMoai1oKTxmJiYoZj1NYXRoLmFicyhqLWgpLGc9dGhpcy5pdGVtc1tpXSx0aGlzLmRpcmVjdGlvbj1qLWg+MD8iZG93biI6InVwIil9aWYoIWcmJiF0aGlzLm9wdGlvbnMuZHJvcE9uRW1wdHkpcmV0dXJuO3RoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLmNvbnRhaW5lcnNbZF0sZz90aGlzLl9yZWFycmFuZ2UoYixnLG51bGwsITApOnRoaXMuX3JlYXJyYW5nZShiLG51bGwsdGhpcy5jb250YWluZXJzW2RdLmVsZW1lbnQsITApLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYix0aGlzLl91aUhhc2goKSksdGhpcy5jb250YWluZXJzW2RdLl90cmlnZ2VyKCJjaGFuZ2UiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBsYWNlaG9sZGVyKSx0aGlzLmNvbnRhaW5lcnNbZF0uX3RyaWdnZXIoIm92ZXIiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xfX0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiLHRoaXMuY3VycmVudEl0ZW1dKSk6Yy5oZWxwZXI9PSJjbG9uZSI/dGhpcy5jdXJyZW50SXRlbS5jbG9uZSgpOnRoaXMuY3VycmVudEl0ZW07cmV0dXJuIGQucGFyZW50cygiYm9keSIpLmxlbmd0aHx8YShjLmFwcGVuZFRvIT0icGFyZW50Ij9jLmFwcGVuZFRvOnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSlbMF0uYXBwZW5kQ2hpbGQoZFswXSksZFswXT09dGhpcy5jdXJyZW50SXRlbVswXSYmKHRoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0Iil9KSwoZFswXS5zdHlsZS53aWR0aD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpLChkWzBdLnN0eWxlLmhlaWdodD09IiJ8fGMuZm9yY2VIZWxwZXJTaXplKSYmZC5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSksZH0sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24oYil7dHlwZW9mIGI9PSJzdHJpbmciJiYoYj1iLnNwbGl0KCIgIikpLGEuaXNBcnJheShiKSYmKGI9e2xlZnQ6K2JbMF0sdG9wOitiWzFdfHwwfSksImxlZnQiaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9Yi5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC1iLnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwidG9wImluIGImJih0aGlzLm9mZnNldC5jbGljay50b3A9Yi50b3ArdGhpcy5tYXJnaW5zLnRvcCksImJvdHRvbSJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LWIuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIGI9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKGIubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLGIudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSk7aWYodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHl8fHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJnRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09Imh0bWwiJiZhLmJyb3dzZXIubXNpZSliPXt0b3A6MCxsZWZ0OjB9O3JldHVybnt0b3A6Yi50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6Yi5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiKXt2YXIgYT10aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChhKGIuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF07aWYoIS9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdChiLmNvbnRhaW5tZW50KSl7dmFyIGM9YShiLmNvbnRhaW5tZW50KVswXSxkPWEoYi5jb250YWlubWVudCkub2Zmc2V0KCksZT1hKGMpLmNzcygib3ZlcmZsb3ciKSE9ImhpZGRlbiI7dGhpcy5jb250YWlubWVudD1bZC5sZWZ0KyhwYXJzZUludChhKGMpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxkLnRvcCsocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsZC5sZWZ0KyhlP01hdGgubWF4KGMuc2Nyb2xsV2lkdGgsYy5vZmZzZXRXaWR0aCk6Yy5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGQudG9wKyhlP01hdGgubWF4KGMuc2Nyb2xsSGVpZ2h0LGMub2Zmc2V0SGVpZ2h0KTpjLm9mZnNldEhlaWdodCktKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXX19LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbihiLGMpe2N8fChjPXRoaXMucG9zaXRpb24pO3ZhciBkPWI9PSJhYnNvbHV0ZSI/MTotMSxlPXRoaXMub3B0aW9ucyxmPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZz0vKGh0bWx8Ym9keSkvaS50ZXN0KGZbMF0udGFnTmFtZSk7cmV0dXJue3RvcDpjLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AqZCt0aGlzLm9mZnNldC5wYXJlbnQudG9wKmQtKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDoodGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6Zz8wOmYuc2Nyb2xsVG9wKCkpKmQpLGxlZnQ6Yy5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqZCt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpkLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKTt0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiJiYodGhpcy5zY3JvbGxQYXJlbnRbMF09PWRvY3VtZW50fHx0aGlzLnNjcm9sbFBhcmVudFswXT09dGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSk7dmFyIGY9Yi5wYWdlWCxnPWIucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXt0aGlzLmNvbnRhaW5tZW50JiYoYi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihmPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKGc9dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYoZj10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihnPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSk7aWYoYy5ncmlkKXt2YXIgaD10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdO2c9dGhpcy5jb250YWlubWVudD9oLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHxoLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdP2gtdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0/aCtjLmdyaWRbMV06aC1jLmdyaWRbMV06aDpoO3ZhciBpPXRoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChmLXRoaXMub3JpZ2luYWxQYWdlWCkvYy5ncmlkWzBdKSpjLmdyaWRbMF07Zj10aGlzLmNvbnRhaW5tZW50P2ktdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdfHxpLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXT9pLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXT9pK2MuZ3JpZFswXTppLWMuZ3JpZFswXTppOml9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTplPzA6ZC5zY3JvbGxUb3AoKSksbGVmdDpmLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTplPzA6ZC5zY3JvbGxMZWZ0KCkpfX0sX3JlYXJyYW5nZTpmdW5jdGlvbihhLGIsYyxkKXtjP2NbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk6Yi5pdGVtWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMucGxhY2Vob2xkZXJbMF0sdGhpcy5kaXJlY3Rpb249PSJkb3duIj9iLml0ZW1bMF06Yi5pdGVtWzBdLm5leHRTaWJsaW5nKSx0aGlzLmNvdW50ZXI9dGhpcy5jb3VudGVyPysrdGhpcy5jb3VudGVyOjE7dmFyIGU9dGhpcyxmPXRoaXMuY291bnRlcjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Y9PWUuY291bnRlciYmZS5yZWZyZXNoUG9zaXRpb25zKCFkKX0sMCl9LF9jbGVhcjpmdW5jdGlvbihiLGMpe3RoaXMucmV2ZXJ0aW5nPSExO3ZhciBkPVtdLGU9dGhpczshdGhpcy5fbm9GaW5hbFNvcnQmJnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KCkubGVuZ3RoJiZ0aGlzLnBsYWNlaG9sZGVyLmJlZm9yZSh0aGlzLmN1cnJlbnRJdGVtKSx0aGlzLl9ub0ZpbmFsU29ydD1udWxsO2lmKHRoaXMuaGVscGVyWzBdPT10aGlzLmN1cnJlbnRJdGVtWzBdKXtmb3IodmFyIGYgaW4gdGhpcy5fc3RvcmVkQ1NTKWlmKHRoaXMuX3N0b3JlZENTU1tmXT09ImF1dG8ifHx0aGlzLl9zdG9yZWRDU1NbZl09PSJzdGF0aWMiKXRoaXMuX3N0b3JlZENTU1tmXT0iIjt0aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKX1lbHNlIHRoaXMuY3VycmVudEl0ZW0uc2hvdygpO3RoaXMuZnJvbU91dHNpZGUmJiFjJiZkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsYSx0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpfSksKHRoaXMuZnJvbU91dHNpZGV8fHRoaXMuZG9tUG9zaXRpb24ucHJldiE9dGhpcy5jdXJyZW50SXRlbS5wcmV2KCkubm90KCIudWktc29ydGFibGUtaGVscGVyIilbMF18fHRoaXMuZG9tUG9zaXRpb24ucGFyZW50IT10aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdKSYmIWMmJmQucHVzaChmdW5jdGlvbihhKXt0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLGEsdGhpcy5fdWlIYXNoKCkpfSksdGhpcyE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmKGN8fChkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigicmVtb3ZlIixhLHRoaXMuX3VpSGFzaCgpKX0pLGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigicmVjZWl2ZSIsYix0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigidXBkYXRlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSkpKTtmb3IodmFyIGY9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Y+PTA7Zi0tKWN8fGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYix0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY29udGFpbmVyc1tmXSkpLHRoaXMuY29udGFpbmVyc1tmXS5jb250YWluZXJDYWNoZS5vdmVyJiYoZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJvdXQiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSx0aGlzLmNvbnRhaW5lcnNbZl0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTt0aGlzLl9zdG9yZWRDdXJzb3ImJmEoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5fc3RvcmVkQ3Vyc29yKSx0aGlzLl9zdG9yZWRPcGFjaXR5JiZ0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLHRoaXMuX3N0b3JlZE9wYWNpdHkpLHRoaXMuX3N0b3JlZFpJbmRleCYmdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLHRoaXMuX3N0b3JlZFpJbmRleD09ImF1dG8iPyIiOnRoaXMuX3N0b3JlZFpJbmRleCksdGhpcy5kcmFnZ2luZz0hMTtpZih0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpe2lmKCFjKXt0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixiLHRoaXMuX3VpSGFzaCgpKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmNhbGwodGhpcyxiKTt0aGlzLl90cmlnZ2VyKCJzdG9wIixiLHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhMX1jfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixiLHRoaXMuX3VpSGFzaCgpKSx0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5oZWxwZXJbMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGw7aWYoIWMpe2Zvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7ZisrKWRbZl0uY2FsbCh0aGlzLGIpO3RoaXMuX3RyaWdnZXIoInN0b3AiLGIsdGhpcy5fdWlIYXNoKCkpfXJldHVybiB0aGlzLmZyb21PdXRzaWRlPSExLCEwfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT0hMSYmdGhpcy5jYW5jZWwoKX0sX3VpSGFzaDpmdW5jdGlvbihiKXt2YXIgYz1ifHx0aGlzO3JldHVybntoZWxwZXI6Yy5oZWxwZXIscGxhY2Vob2xkZXI6Yy5wbGFjZWhvbGRlcnx8YShbXSkscG9zaXRpb246Yy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOmMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6Yy5wb3NpdGlvbkFicyxpdGVtOmMuY3VycmVudEl0ZW0sc2VuZGVyOmI/Yi5lbGVtZW50Om51bGx9fX0pLGEuZXh0ZW5kKGEudWkuc29ydGFibGUse3ZlcnNpb246IjEuOC4yNCJ9KX0oalF1ZXJ5KSxqUXVlcnkuZWZmZWN0c3x8ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3ZhciBjO3JldHVybiBiJiZiLmNvbnN0cnVjdG9yPT1BcnJheSYmYi5sZW5ndGg9PTM/YjooYz0vcmdiXChccyooWzAtOV17MSwzfSlccyosXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxzKlwpLy5leGVjKGIpKT9bcGFyc2VJbnQoY1sxXSwxMCkscGFyc2VJbnQoY1syXSwxMCkscGFyc2VJbnQoY1szXSwxMCldOihjPS9yZ2JcKFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqXCkvLmV4ZWMoYikpP1twYXJzZUZsb2F0KGNbMV0pKjIuNTUscGFyc2VGbG9hdChjWzJdKSoyLjU1LHBhcnNlRmxvYXQoY1szXSkqMi41NV06KGM9LyMoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkvLmV4ZWMoYikpP1twYXJzZUludChjWzFdLDE2KSxwYXJzZUludChjWzJdLDE2KSxwYXJzZUludChjWzNdLDE2KV06KGM9LyMoW2EtZkEtRjAtOV0pKFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkvLmV4ZWMoYikpP1twYXJzZUludChjWzFdK2NbMV0sMTYpLHBhcnNlSW50KGNbMl0rY1syXSwxNikscGFyc2VJbnQoY1szXStjWzNdLDE2KV06KGM9L3JnYmFcKDAsIDAsIDAsIDBcKS8uZXhlYyhiKSk/ZS50cmFuc3BhcmVudDplW2EudHJpbShiKS50b0xvd2VyQ2FzZSgpXX1mdW5jdGlvbiBkKGIsZCl7dmFyIGU7ZG97ZT0oYS5jdXJDU1N8fGEuY3NzKShiLGQpO2lmKGUhPSIiJiZlIT0idHJhbnNwYXJlbnQifHxhLm5vZGVOYW1lKGIsImJvZHkiKSlicmVhaztkPSJiYWNrZ3JvdW5kQ29sb3IifXdoaWxlKGI9Yi5wYXJlbnROb2RlKTtyZXR1cm4gYyhlKX1mdW5jdGlvbiBoKCl7dmFyIGE9ZG9jdW1lbnQuZGVmYXVsdFZpZXc/ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpOnRoaXMuY3VycmVudFN0eWxlLGI9e30sYyxkO2lmKGEmJmEubGVuZ3RoJiZhWzBdJiZhW2FbMF1dKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0pYz1hW2VdLHR5cGVvZiBhW2NdPT0ic3RyaW5nIiYmKGQ9Yy5yZXBsYWNlKC9cLShcdykvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KSxiW2RdPWFbY10pfWVsc2UgZm9yKGMgaW4gYSl0eXBlb2YgYVtjXT09InN0cmluZyImJihiW2NdPWFbY10pO3JldHVybiBifWZ1bmN0aW9uIGkoYil7dmFyIGMsZDtmb3IoYyBpbiBiKWQ9YltjXSwoZD09bnVsbHx8YS5pc0Z1bmN0aW9uKGQpfHxjIGluIGd8fC9zY3JvbGxiYXIvLnRlc3QoYyl8fCEvY29sb3IvaS50ZXN0KGMpJiZpc05hTihwYXJzZUZsb2F0KGQpKSkmJmRlbGV0ZSBiW2NdO3JldHVybiBifWZ1bmN0aW9uIGooYSxiKXt2YXIgYz17XzowfSxkO2ZvcihkIGluIGIpYVtkXSE9YltkXSYmKGNbZF09YltkXSk7cmV0dXJuIGN9ZnVuY3Rpb24gayhiLGMsZCxlKXt0eXBlb2YgYj09Im9iamVjdCImJihlPWMsZD1udWxsLGM9YixiPWMuZWZmZWN0KSxhLmlzRnVuY3Rpb24oYykmJihlPWMsZD1udWxsLGM9e30pO2lmKHR5cGVvZiBjPT0ibnVtYmVyInx8YS5meC5zcGVlZHNbY10pZT1kLGQ9YyxjPXt9O3JldHVybiBhLmlzRnVuY3Rpb24oZCkmJihlPWQsZD1udWxsKSxjPWN8fHt9LGQ9ZHx8Yy5kdXJhdGlvbixkPWEuZngub2ZmPzA6dHlwZW9mIGQ9PSJudW1iZXIiP2Q6ZCBpbiBhLmZ4LnNwZWVkcz9hLmZ4LnNwZWVkc1tkXTphLmZ4LnNwZWVkcy5fZGVmYXVsdCxlPWV8fGMuY29tcGxldGUsW2IsYyxkLGVdfWZ1bmN0aW9uIGwoYil7cmV0dXJuIWJ8fHR5cGVvZiBiPT0ibnVtYmVyInx8YS5meC5zcGVlZHNbYl0/ITA6dHlwZW9mIGI9PSJzdHJpbmciJiYhYS5lZmZlY3RzW2JdPyEwOiExfWEuZWZmZWN0cz17fSxhLmVhY2goWyJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJCb3R0b21Db2xvciIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJUb3BDb2xvciIsImJvcmRlckNvbG9yIiwiY29sb3IiLCJvdXRsaW5lQ29sb3IiXSxmdW5jdGlvbihiLGUpe2EuZnguc3RlcFtlXT1mdW5jdGlvbihhKXthLmNvbG9ySW5pdHx8KGEuc3RhcnQ9ZChhLmVsZW0sZSksYS5lbmQ9YyhhLmVuZCksYS5jb2xvckluaXQ9ITApLGEuZWxlbS5zdHlsZVtlXT0icmdiKCIrTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoYS5wb3MqKGEuZW5kWzBdLWEuc3RhcnRbMF0pK2Euc3RhcnRbMF0sMTApLDI1NSksMCkrIiwiK01hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGEucG9zKihhLmVuZFsxXS1hLnN0YXJ0WzFdKSthLnN0YXJ0WzFdLDEwKSwyNTUpLDApKyIsIitNYXRoLm1heChNYXRoLm1pbihwYXJzZUludChhLnBvcyooYS5lbmRbMl0tYS5zdGFydFsyXSkrYS5zdGFydFsyXSwxMCksMjU1KSwwKSsiKSJ9fSk7dmFyIGU9e2FxdWE6WzAsMjU1LDI1NV0sYXp1cmU6WzI0MCwyNTUsMjU1XSxiZWlnZTpbMjQ1LDI0NSwyMjBdLGJsYWNrOlswLDAsMF0sYmx1ZTpbMCwwLDI1NV0sYnJvd246WzE2NSw0Miw0Ml0sY3lhbjpbMCwyNTUsMjU1XSxkYXJrYmx1ZTpbMCwwLDEzOV0sZGFya2N5YW46WzAsMTM5LDEzOV0sZGFya2dyZXk6WzE2OSwxNjksMTY5XSxkYXJrZ3JlZW46WzAsMTAwLDBdLGRhcmtraGFraTpbMTg5LDE4MywxMDddLGRhcmttYWdlbnRhOlsxMzksMCwxMzldLGRhcmtvbGl2ZWdyZWVuOls4NSwxMDcsNDddLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMF0sZGFya29yY2hpZDpbMTUzLDUwLDIwNF0sZGFya3JlZDpbMTM5LDAsMF0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjJdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMV0sZnVjaHNpYTpbMjU1LDAsMjU1XSxnb2xkOlsyNTUsMjE1LDBdLGdyZWVuOlswLDEyOCwwXSxpbmRpZ286Wzc1LDAsMTMwXSxraGFraTpbMjQwLDIzMCwxNDBdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzBdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTVdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0XSxsaWdodGdyZXk6WzIxMSwyMTEsMjExXSxsaWdodHBpbms6WzI1NSwxODIsMTkzXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjRdLGxpbWU6WzAsMjU1LDBdLG1hZ2VudGE6WzI1NSwwLDI1NV0sbWFyb29uOlsxMjgsMCwwXSxuYXZ5OlswLDAsMTI4XSxvbGl2ZTpbMTI4LDEyOCwwXSxvcmFuZ2U6WzI1NSwxNjUsMF0scGluazpbMjU1LDE5MiwyMDNdLHB1cnBsZTpbMTI4LDAsMTI4XSx2aW9sZXQ6WzEyOCwwLDEyOF0scmVkOlsyNTUsMCwwXSxzaWx2ZXI6WzE5MiwxOTIsMTkyXSx3aGl0ZTpbMjU1LDI1NSwyNTVdLHllbGxvdzpbMjU1LDI1NSwwXSx0cmFuc3BhcmVudDpbMjU1LDI1NSwyNTVdfSxmPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0sZz17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07YS5lZmZlY3RzLmFuaW1hdGVDbGFzcz1mdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYS5pc0Z1bmN0aW9uKGQpJiYoZT1kLGQ9bnVsbCksdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBnPWEodGhpcyksaz1nLmF0dHIoInN0eWxlIil8fCIgIixsPWkoaC5jYWxsKHRoaXMpKSxtLG49Zy5hdHRyKCJjbGFzcyIpfHwiIjthLmVhY2goZixmdW5jdGlvbihhLGMpe2JbY10mJmdbYysiQ2xhc3MiXShiW2NdKX0pLG09aShoLmNhbGwodGhpcykpLGcuYXR0cigiY2xhc3MiLG4pLGcuYW5pbWF0ZShqKGwsbSkse3F1ZXVlOiExLGR1cmF0aW9uOmMsZWFzaW5nOmQsY29tcGxldGU6ZnVuY3Rpb24oKXthLmVhY2goZixmdW5jdGlvbihhLGMpe2JbY10mJmdbYysiQ2xhc3MiXShiW2NdKX0pLHR5cGVvZiBnLmF0dHIoInN0eWxlIik9PSJvYmplY3QiPyhnLmF0dHIoInN0eWxlIikuY3NzVGV4dD0iIixnLmF0dHIoInN0eWxlIikuY3NzVGV4dD1rKTpnLmF0dHIoInN0eWxlIixrKSxlJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLmRlcXVldWUodGhpcyl9fSl9KX0sYS5mbi5leHRlbmQoe19hZGRDbGFzczphLmZuLmFkZENsYXNzLGFkZENsYXNzOmZ1bmN0aW9uKGIsYyxkLGUpe3JldHVybiBjP2EuZWZmZWN0cy5hbmltYXRlQ2xhc3MuYXBwbHkodGhpcyxbe2FkZDpifSxjLGQsZV0pOnRoaXMuX2FkZENsYXNzKGIpfSxfcmVtb3ZlQ2xhc3M6YS5mbi5yZW1vdmVDbGFzcyxyZW1vdmVDbGFzczpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYz9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3tyZW1vdmU6Yn0sYyxkLGVdKTp0aGlzLl9yZW1vdmVDbGFzcyhiKX0sX3RvZ2dsZUNsYXNzOmEuZm4udG9nZ2xlQ2xhc3MsdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYyxkLGUsZixnKXtyZXR1cm4gdHlwZW9mIGQ9PSJib29sZWFuInx8ZD09PWI/ZT9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW2Q/e2FkZDpjfTp7cmVtb3ZlOmN9LGUsZixnXSk6dGhpcy5fdG9nZ2xlQ2xhc3MoYyxkKTphLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3t0b2dnbGU6Y30sZCxlLGZdKX0sc3dpdGNoQ2xhc3M6ZnVuY3Rpb24oYixjLGQsZSxmKXtyZXR1cm4gYS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7YWRkOmMscmVtb3ZlOmJ9LGQsZSxmXSl9fSksYS5leHRlbmQoYS5lZmZlY3RzLHt2ZXJzaW9uOiIxLjguMjQiLHNhdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdIT09bnVsbCYmYS5kYXRhKCJlYy5zdG9yYWdlLiIrYltjXSxhWzBdLnN0eWxlW2JbY11dKX0scmVzdG9yZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10hPT1udWxsJiZhLmNzcyhiW2NdLGEuZGF0YSgiZWMuc3RvcmFnZS4iK2JbY10pKX0sc2V0TW9kZTpmdW5jdGlvbihhLGIpe3JldHVybiBiPT0idG9nZ2xlIiYmKGI9YS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLGJ9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGEsYil7dmFyIGMsZDtzd2l0Y2goYVswXSl7Y2FzZSJ0b3AiOmM9MDticmVhaztjYXNlIm1pZGRsZSI6Yz0uNTticmVhaztjYXNlImJvdHRvbSI6Yz0xO2JyZWFrO2RlZmF1bHQ6Yz1hWzBdL2IuaGVpZ2h0fXN3aXRjaChhWzFdKXtjYXNlImxlZnQiOmQ9MDticmVhaztjYXNlImNlbnRlciI6ZD0uNTticmVhaztjYXNlInJpZ2h0IjpkPTE7YnJlYWs7ZGVmYXVsdDpkPWFbMV0vYi53aWR0aH1yZXR1cm57eDpkLHk6Y319LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oYil7aWYoYi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiBiLnBhcmVudCgpO3ZhciBjPXt3aWR0aDpiLm91dGVyV2lkdGgoITApLGhlaWdodDpiLm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOmIuY3NzKCJmbG9hdCIpfSxkPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0cnl7ZS5pZH1jYXRjaChmKXtlPWRvY3VtZW50LmJvZHl9cmV0dXJuIGIud3JhcChkKSwoYlswXT09PWV8fGEuY29udGFpbnMoYlswXSxlKSkmJmEoZSkuZm9jdXMoKSxkPWIucGFyZW50KCksYi5jc3MoInBvc2l0aW9uIik9PSJzdGF0aWMiPyhkLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLGIuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihhLmV4dGVuZChjLHtwb3NpdGlvbjpiLmNzcygicG9zaXRpb24iKSx6SW5kZXg6Yi5jc3MoInotaW5kZXgiKX0pLGEuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGEsZCl7Y1tkXT1iLmNzcyhkKSxpc05hTihwYXJzZUludChjW2RdLDEwKSkmJihjW2RdPSJhdXRvIil9KSxiLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksZC5jc3MoYykuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKGIpe3ZhciBjLGQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtyZXR1cm4gYi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpPyhjPWIucGFyZW50KCkucmVwbGFjZVdpdGgoYiksKGJbMF09PT1kfHxhLmNvbnRhaW5zKGJbMF0sZCkpJiZhKGQpLmZvY3VzKCksYyk6Yn0sc2V0VHJhbnNpdGlvbjpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gZT1lfHx7fSxhLmVhY2goYyxmdW5jdGlvbihhLGMpe3ZhciBmPWIuY3NzVW5pdChjKTtmWzBdPjAmJihlW2NdPWZbMF0qZCtmWzFdKX0pLGV9fSksYS5mbi5leHRlbmQoe2VmZmVjdDpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnPXtvcHRpb25zOmZbMV0sZHVyYXRpb246ZlsyXSxjYWxsYmFjazpmWzNdfSxoPWcub3B0aW9ucy5tb2RlLGk9YS5lZmZlY3RzW2JdO3JldHVybiBhLmZ4Lm9mZnx8IWk/aD90aGlzW2hdKGcuZHVyYXRpb24sZy5jYWxsYmFjayk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zy5jYWxsYmFjayYmZy5jYWxsYmFjay5jYWxsKHRoaXMpfSk6aS5jYWxsKHRoaXMsZyl9LF9zaG93OmEuZm4uc2hvdyxzaG93OmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX3Nob3cuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBiWzFdLm1vZGU9InNob3ciLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9oaWRlOmEuZm4uaGlkZSxoaWRlOmZ1bmN0aW9uKGEpe2lmKGwoYSkpcmV0dXJuIHRoaXMuX2hpZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBiPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBiWzFdLm1vZGU9ImhpZGUiLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYil9LF9fdG9nZ2xlOmEuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihiKXtpZihsKGIpfHx0eXBlb2YgYj09ImJvb2xlYW4ifHxhLmlzRnVuY3Rpb24oYikpcmV0dXJuIHRoaXMuX190b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBjPWsuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBjWzFdLm1vZGU9InRvZ2dsZSIsdGhpcy5lZmZlY3QuYXBwbHkodGhpcyxjKX0sY3NzVW5pdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLmNzcyhiKSxkPVtdO3JldHVybiBhLmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24oYSxiKXtjLmluZGV4T2YoYik+MCYmKGQ9W3BhcnNlRmxvYXQoYyksYl0pfSksZH19KTt2YXIgbT17fTthLmVhY2goWyJRdWFkIiwiQ3ViaWMiLCJRdWFydCIsIlF1aW50IiwiRXhwbyJdLGZ1bmN0aW9uKGEsYil7bVtiXT1mdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5wb3coYixhKzIpfX0pLGEuZXh0ZW5kKG0se1NpbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEtTWF0aC5jb3MoYSpNYXRoLlBJLzIpfSxDaXJjOmZ1bmN0aW9uKGEpe3JldHVybiAxLU1hdGguc3FydCgxLWEqYSl9LEVsYXN0aWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0wfHxhPT09MT9hOi1NYXRoLnBvdygyLDgqKGEtMSkpKk1hdGguc2luKCgoYS0xKSo4MC03LjUpKk1hdGguUEkvMTUpfSxCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiBhKmEqKDMqYS0yKX0sQm91bmNlOmZ1bmN0aW9uKGEpe3ZhciBiLGM9NDt3aGlsZShhPCgoYj1NYXRoLnBvdygyLC0tYykpLTEpLzExKTtyZXR1cm4gMS9NYXRoLnBvdyg0LDMtYyktNy41NjI1Kk1hdGgucG93KChiKjMtMikvMjItYSwyKX19KSxhLmVhY2gobSxmdW5jdGlvbihiLGMpe2EuZWFzaW5nWyJlYXNlSW4iK2JdPWMsYS5lYXNpbmdbImVhc2VPdXQiK2JdPWZ1bmN0aW9uKGEpe3JldHVybiAxLWMoMS1hKX0sYS5lYXNpbmdbImVhc2VJbk91dCIrYl09ZnVuY3Rpb24oYSl7cmV0dXJuIGE8LjU/YyhhKjIpLzI6YyhhKi0yKzIpLy0yKzF9fSl9KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuYmxpbmQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKTt2YXIgZz1hLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksaD1mPT0idmVydGljYWwiPyJoZWlnaHQiOiJ3aWR0aCIsaT1mPT0idmVydGljYWwiP2cuaGVpZ2h0KCk6Zy53aWR0aCgpO2U9PSJzaG93IiYmZy5jc3MoaCwwKTt2YXIgaj17fTtqW2hdPWU9PSJzaG93Ij9pOjAsZy5hbmltYXRlKGosYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoY1swXSxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuYm91bmNlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJ1cCIsZz1iLm9wdGlvbnMuZGlzdGFuY2V8fDIwLGg9Yi5vcHRpb25zLnRpbWVzfHw1LGk9Yi5kdXJhdGlvbnx8MjUwOy9zaG93fGhpZGUvLnRlc3QoZSkmJmQucHVzaCgib3BhY2l0eSIpLGEuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixnPWIub3B0aW9ucy5kaXN0YW5jZXx8KGo9PSJ0b3AiP2Mub3V0ZXJIZWlnaHQoITApLzM6Yy5vdXRlcldpZHRoKCEwKS8zKTtlPT0ic2hvdyImJmMuY3NzKCJvcGFjaXR5IiwwKS5jc3MoaixrPT0icG9zIj8tZzpnKSxlPT0iaGlkZSImJihnPWcvKGgqMikpLGUhPSJoaWRlIiYmaC0tO2lmKGU9PSJzaG93Iil7dmFyIGw9e29wYWNpdHk6MX07bFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShsLGkvMixiLm9wdGlvbnMuZWFzaW5nKSxnPWcvMixoLS19Zm9yKHZhciBtPTA7bTxoO20rKyl7dmFyIG49e30scD17fTtuW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2cscFtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnLGMuYW5pbWF0ZShuLGkvMixiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKHAsaS8yLGIub3B0aW9ucy5lYXNpbmcpLGc9ZT09ImhpZGUiP2cqMjpnLzJ9aWYoZT09ImhpZGUiKXt2YXIgbD17b3BhY2l0eTowfTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csYy5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSl9ZWxzZXt2YXIgbj17fSxwPXt9O25bal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxwW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKG4saS8yLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxpLzIsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2EuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1jLnF1ZXVlKCJmeCIsZnVuY3Rpb24oKXtjLmRlcXVldWUoKX0pLGMuZGVxdWV1ZSgpfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmNsaXA9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWNbMF0udGFnTmFtZT09IklNRyI/ZzpjLGk9e3NpemU6Zj09InZlcnRpY2FsIj8iaGVpZ2h0Ijoid2lkdGgiLHBvc2l0aW9uOmY9PSJ2ZXJ0aWNhbCI/InRvcCI6ImxlZnQifSxqPWY9PSJ2ZXJ0aWNhbCI/aC5oZWlnaHQoKTpoLndpZHRoKCk7ZT09InNob3ciJiYoaC5jc3MoaS5zaXplLDApLGguY3NzKGkucG9zaXRpb24sai8yKSk7dmFyIGs9e307a1tpLnNpemVdPWU9PSJzaG93Ij9qOjAsa1tpLnBvc2l0aW9uXT1lPT0ic2hvdyI/MDpqLzIsaC5hbmltYXRlKGsse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZHJvcD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3BhY2l0eSJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxmPWIub3B0aW9ucy5kaXJlY3Rpb258fCJsZWZ0IjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KCEwKS8yOmMub3V0ZXJXaWR0aCghMCkvMik7ZT09InNob3ciJiZjLmNzcygib3BhY2l0eSIsMCkuY3NzKGcsaD09InBvcyI/LWk6aSk7dmFyIGo9e29wYWNpdHk6ZT09InNob3ciPzE6MH07altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZXhwbG9kZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWIub3B0aW9ucy5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQoYi5vcHRpb25zLnBpZWNlcykpOjMsZD1iLm9wdGlvbnMucGllY2VzP01hdGgucm91bmQoTWF0aC5zcXJ0KGIub3B0aW9ucy5waWVjZXMpKTozO2Iub3B0aW9ucy5tb2RlPWIub3B0aW9ucy5tb2RlPT0idG9nZ2xlIj9hKHRoaXMpLmlzKCI6dmlzaWJsZSIpPyJoaWRlIjoic2hvdyI6Yi5vcHRpb25zLm1vZGU7dmFyIGU9YSh0aGlzKS5zaG93KCkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksZj1lLm9mZnNldCgpO2YudG9wLT1wYXJzZUludChlLmNzcygibWFyZ2luVG9wIiksMTApfHwwLGYubGVmdC09cGFyc2VJbnQoZS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDA7dmFyIGc9ZS5vdXRlcldpZHRoKCEwKSxoPWUub3V0ZXJIZWlnaHQoITApO2Zvcih2YXIgaT0wO2k8YztpKyspZm9yKHZhciBqPTA7ajxkO2orKyllLmNsb25lKCkuYXBwZW5kVG8oImJvZHkiKS53cmFwKCI8ZGl2PjwvZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJ2aXNpYmxlIixsZWZ0Oi1qKihnL2QpLHRvcDotaSooaC9jKX0pLnBhcmVudCgpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLWV4cGxvZGUiKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6Zy9kLGhlaWdodDpoL2MsbGVmdDpmLmxlZnQraiooZy9kKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8oai1NYXRoLmZsb29yKGQvMikpKihnL2QpOjApLHRvcDpmLnRvcCtpKihoL2MpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPyhpLU1hdGguZmxvb3IoYy8yKSkqKGgvYyk6MCksb3BhY2l0eTpiLm9wdGlvbnMubW9kZT09InNob3ciPzA6MX0pLmFuaW1hdGUoe2xlZnQ6Zi5sZWZ0K2oqKGcvZCkrKGIub3B0aW9ucy5tb2RlPT0ic2hvdyI/MDooai1NYXRoLmZsb29yKGQvMikpKihnL2QpKSx0b3A6Zi50b3AraSooaC9jKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8wOihpLU1hdGguZmxvb3IoYy8yKSkqKGgvYykpLG9wYWNpdHk6Yi5vcHRpb25zLm1vZGU9PSJzaG93Ij8xOjB9LGIuZHVyYXRpb258fDUwMCk7c2V0VGltZW91dChmdW5jdGlvbigpe2Iub3B0aW9ucy5tb2RlPT0ic2hvdyI/ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSk6ZS5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSkuaGlkZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoZVswXSksZS5kZXF1ZXVlKCksYSgiZGl2LnVpLWVmZmVjdHMtZXhwbG9kZSIpLnJlbW92ZSgpfSxiLmR1cmF0aW9ufHw1MDApfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmZhZGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTtjLmFuaW1hdGUoe29wYWNpdHk6ZH0se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5mb2xkPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZj1iLm9wdGlvbnMuc2l6ZXx8MTUsZz0hIWIub3B0aW9ucy5ob3JpekZpcnN0LGg9Yi5kdXJhdGlvbj9iLmR1cmF0aW9uLzI6YS5meC5zcGVlZHMuX2RlZmF1bHQvMjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBpPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxqPWU9PSJzaG93IiE9ZyxrPWo/WyJ3aWR0aCIsImhlaWdodCJdOlsiaGVpZ2h0Iiwid2lkdGgiXSxsPWo/W2kud2lkdGgoKSxpLmhlaWdodCgpXTpbaS5oZWlnaHQoKSxpLndpZHRoKCldLG09LyhbMC05XSspJS8uZXhlYyhmKTttJiYoZj1wYXJzZUludChtWzFdLDEwKS8xMDAqbFtlPT0iaGlkZSI/MDoxXSksZT09InNob3ciJiZpLmNzcyhnP3toZWlnaHQ6MCx3aWR0aDpmfTp7aGVpZ2h0OmYsd2lkdGg6MH0pO3ZhciBuPXt9LHA9e307bltrWzBdXT1lPT0ic2hvdyI/bFswXTpmLHBba1sxXV09ZT09InNob3ciP2xbMV06MCxpLmFuaW1hdGUobixoLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxoLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5oaWdobGlnaHQ9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kQ29sb3IiLCJvcGFjaXR5Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpLGY9e2JhY2tncm91bmRDb2xvcjpjLmNzcygiYmFja2dyb3VuZENvbG9yIil9O2U9PSJoaWRlIiYmKGYub3BhY2l0eT0wKSxhLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpLmNzcyh7YmFja2dyb3VuZEltYWdlOiJub25lIixiYWNrZ3JvdW5kQ29sb3I6Yi5vcHRpb25zLmNvbG9yfHwiI2ZmZmY5OSJ9KS5hbmltYXRlKGYse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksZT09InNob3ciJiYhYS5zdXBwb3J0Lm9wYWNpdHkmJnRoaXMuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5wdWxzYXRlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJzaG93IiksZT0oYi5vcHRpb25zLnRpbWVzfHw1KSoyLTEsZj1iLmR1cmF0aW9uP2IuZHVyYXRpb24vMjphLmZ4LnNwZWVkcy5fZGVmYXVsdC8yLGc9Yy5pcygiOnZpc2libGUiKSxoPTA7Z3x8KGMuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCksaD0xKSwoZD09ImhpZGUiJiZnfHxkPT0ic2hvdyImJiFnKSYmZS0tO2Zvcih2YXIgaT0wO2k8ZTtpKyspYy5hbmltYXRlKHtvcGFjaXR5Omh9LGYsYi5vcHRpb25zLmVhc2luZyksaD0oaCsxKSUyO2MuYW5pbWF0ZSh7b3BhY2l0eTpofSxmLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtoPT0wJiZjLmhpZGUoKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGMucXVldWUoImZ4IixmdW5jdGlvbigpe2MuZGVxdWV1ZSgpfSkuZGVxdWV1ZSgpfSl9fShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnB1ZmY9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKSxlPXBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKXx8MTUwLGY9ZS8xMDAsZz17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTthLmV4dGVuZChiLm9wdGlvbnMse2ZhZGU6ITAsbW9kZTpkLHBlcmNlbnQ6ZD09ImhpZGUiP2U6MTAwLGZyb206ZD09ImhpZGUiP2c6e2hlaWdodDpnLmhlaWdodCpmLHdpZHRoOmcud2lkdGgqZn19KSxjLmVmZmVjdCgic2NhbGUiLGIub3B0aW9ucyxiLmR1cmF0aW9uLGIuY2FsbGJhY2spLGMuZGVxdWV1ZSgpfSl9LGEuZWZmZWN0cy5zY2FsZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1hLmV4dGVuZCghMCx7fSxiLm9wdGlvbnMpLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9cGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApfHwocGFyc2VJbnQoYi5vcHRpb25zLnBlcmNlbnQsMTApPT0wPzA6ZT09ImhpZGUiPzA6MTAwKSxnPWIub3B0aW9ucy5kaXJlY3Rpb258fCJib3RoIixoPWIub3B0aW9ucy5vcmlnaW47ZSE9ImVmZmVjdCImJihkLm9yaWdpbj1ofHxbIm1pZGRsZSIsImNlbnRlciJdLGQucmVzdG9yZT0hMCk7dmFyIGk9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPWIub3B0aW9ucy5mcm9tfHwoZT09InNob3ciP3toZWlnaHQ6MCx3aWR0aDowfTppKTt2YXIgaj17eTpnIT0iaG9yaXpvbnRhbCI/Zi8xMDA6MSx4OmchPSJ2ZXJ0aWNhbCI/Zi8xMDA6MX07Yy50bz17aGVpZ2h0OmkuaGVpZ2h0KmoueSx3aWR0aDppLndpZHRoKmoueH0sYi5vcHRpb25zLmZhZGUmJihlPT0ic2hvdyImJihjLmZyb20ub3BhY2l0eT0wLGMudG8ub3BhY2l0eT0xKSxlPT0iaGlkZSImJihjLmZyb20ub3BhY2l0eT0xLGMudG8ub3BhY2l0eT0wKSksZC5mcm9tPWMuZnJvbSxkLnRvPWMudG8sZC5tb2RlPWUsYy5lZmZlY3QoInNpemUiLGQsYi5kdXJhdGlvbixiLmNhbGxiYWNrKSxjLmRlcXVldWUoKX0pfSxhLmVmZmVjdHMuc2l6ZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxlPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxmPVsid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyJdLGc9WyJmb250U2l6ZSJdLGg9WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxpPVsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0saj1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiZWZmZWN0Iiksaz1iLm9wdGlvbnMucmVzdG9yZXx8ITEsbD1iLm9wdGlvbnMuc2NhbGV8fCJib3RoIixtPWIub3B0aW9ucy5vcmlnaW4sbj17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTtjLmZyb209Yi5vcHRpb25zLmZyb218fG4sYy50bz1iLm9wdGlvbnMudG98fG47aWYobSl7dmFyIHA9YS5lZmZlY3RzLmdldEJhc2VsaW5lKG0sbik7Yy5mcm9tLnRvcD0obi5oZWlnaHQtYy5mcm9tLmhlaWdodCkqcC55LGMuZnJvbS5sZWZ0PShuLndpZHRoLWMuZnJvbS53aWR0aCkqcC54LGMudG8udG9wPShuLmhlaWdodC1jLnRvLmhlaWdodCkqcC55LGMudG8ubGVmdD0obi53aWR0aC1jLnRvLndpZHRoKSpwLnh9dmFyIHE9e2Zyb206e3k6Yy5mcm9tLmhlaWdodC9uLmhlaWdodCx4OmMuZnJvbS53aWR0aC9uLndpZHRofSx0bzp7eTpjLnRvLmhlaWdodC9uLmhlaWdodCx4OmMudG8ud2lkdGgvbi53aWR0aH19O2lmKGw9PSJib3gifHxsPT0iYm90aCIpcS5mcm9tLnkhPXEudG8ueSYmKGQ9ZC5jb25jYXQoaCksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxoLHEudG8ueSxjLnRvKSkscS5mcm9tLnghPXEudG8ueCYmKGQ9ZC5jb25jYXQoaSksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLmZyb20ueCxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxpLHEudG8ueCxjLnRvKSk7KGw9PSJjb250ZW50Inx8bD09ImJvdGgiKSYmcS5mcm9tLnkhPXEudG8ueSYmKGQ9ZC5jb25jYXQoZyksYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsZyxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxnLHEudG8ueSxjLnRvKSksYS5lZmZlY3RzLnNhdmUoYyxrP2Q6ZSksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyksYy5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikuY3NzKGMuZnJvbSk7aWYobD09ImNvbnRlbnQifHxsPT0iYm90aCIpaD1oLmNvbmNhdChbIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdKS5jb25jYXQoZyksaT1pLmNvbmNhdChbIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCJdKSxmPWQuY29uY2F0KGgpLmNvbmNhdChpKSxjLmZpbmQoIipbd2lkdGhdIikuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyk7ayYmYS5lZmZlY3RzLnNhdmUoYyxmKTt2YXIgZD17aGVpZ2h0OmMuaGVpZ2h0KCksd2lkdGg6Yy53aWR0aCgpfTtjLmZyb209e2hlaWdodDpkLmhlaWdodCpxLmZyb20ueSx3aWR0aDpkLndpZHRoKnEuZnJvbS54fSxjLnRvPXtoZWlnaHQ6ZC5oZWlnaHQqcS50by55LHdpZHRoOmQud2lkdGgqcS50by54fSxxLmZyb20ueSE9cS50by55JiYoYy5mcm9tPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLmZyb20ueSxjLmZyb20pLGMudG89YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxoLHEudG8ueSxjLnRvKSkscS5mcm9tLnghPXEudG8ueCYmKGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS5mcm9tLngsYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLnRvLngsYy50bykpLGMuY3NzKGMuZnJvbSksYy5hbmltYXRlKGMudG8sYi5kdXJhdGlvbixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ayYmYS5lZmZlY3RzLnJlc3RvcmUoYyxmKX0pfSk7Yy5hbmltYXRlKGMudG8se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtjLnRvLm9wYWNpdHk9PT0wJiZjLmNzcygib3BhY2l0eSIsYy5mcm9tLm9wYWNpdHkpLGo9PSJoaWRlIiYmYy5oaWRlKCksYS5lZmZlY3RzLnJlc3RvcmUoYyxrP2Q6ZSksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuc2hha2U9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiLGc9Yi5vcHRpb25zLmRpc3RhbmNlfHwyMCxoPWIub3B0aW9ucy50aW1lc3x8MyxpPWIuZHVyYXRpb258fGIub3B0aW9ucy5kdXJhdGlvbnx8MTQwO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixsPXt9LG09e30sbj17fTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csbVtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnKjIsbltqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnKjIsYy5hbmltYXRlKGwsaSxiLm9wdGlvbnMuZWFzaW5nKTtmb3IodmFyIHA9MTtwPGg7cCsrKWMuYW5pbWF0ZShtLGksYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShuLGksYi5vcHRpb25zLmVhc2luZyk7Yy5hbmltYXRlKG0saSxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXthLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KSxjLmRlcXVldWUoKX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5zbGlkZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwic2hvdyIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYykuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pO3ZhciBnPWY9PSJ1cCJ8fGY9PSJkb3duIj8idG9wIjoibGVmdCIsaD1mPT0idXAifHxmPT0ibGVmdCI/InBvcyI6Im5lZyIsaT1iLm9wdGlvbnMuZGlzdGFuY2V8fChnPT0idG9wIj9jLm91dGVySGVpZ2h0KCEwKTpjLm91dGVyV2lkdGgoITApKTtlPT0ic2hvdyImJmMuY3NzKGcsaD09InBvcyI/aXNOYU4oaSk/Ii0iK2k6LWk6aSk7dmFyIGo9e307altnXT0oZT09InNob3ciP2g9PSJwb3MiPyIrPSI6Ii09IjpoPT0icG9zIj8iLT0iOiIrPSIpK2ksYy5hbmltYXRlKGose3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KGpRdWVyeSksZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMudHJhbnNmZXI9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YShiLm9wdGlvbnMudG8pLGU9ZC5vZmZzZXQoKSxmPXt0b3A6ZS50b3AsbGVmdDplLmxlZnQsaGVpZ2h0OmQuaW5uZXJIZWlnaHQoKSx3aWR0aDpkLmlubmVyV2lkdGgoKX0sZz1jLm9mZnNldCgpLGg9YSgnPGRpdiBjbGFzcz0idWktZWZmZWN0cy10cmFuc2ZlciI+PC9kaXY+JykuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoYi5vcHRpb25zLmNsYXNzTmFtZSkuY3NzKHt0b3A6Zy50b3AsbGVmdDpnLmxlZnQsaGVpZ2h0OmMuaW5uZXJIZWlnaHQoKSx3aWR0aDpjLmlubmVyV2lkdGgoKSxwb3NpdGlvbjoiYWJzb2x1dGUifSkuYW5pbWF0ZShmLGIuZHVyYXRpb24sYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2gucmVtb3ZlKCksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5hY2NvcmRpb24iLHtvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlZDoic2xpZGUiLGF1dG9IZWlnaHQ6ITAsY2xlYXJTdHlsZTohMSxjb2xsYXBzaWJsZTohMSxldmVudDoiY2xpY2siLGZpbGxTcGFjZTohMSxoZWFkZXI6Ij4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIixpY29uczp7aGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtZSIsaGVhZGVyU2VsZWN0ZWQ6InVpLWljb24tdHJpYW5nbGUtMS1zIn0sbmF2aWdhdGlvbjohMSxuYXZpZ2F0aW9uRmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHJlZi50b0xvd2VyQ2FzZSgpPT09bG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1iLm9wdGlvbnM7Yi5ydW5uaW5nPTAsYi5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLmNoaWxkcmVuKCJsaSIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tbGktZml4IiksYi5oZWFkZXJzPWIuZWxlbWVudC5maW5kKGMuaGVhZGVyKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuYmluZCgibW91c2VlbnRlci5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmJpbmQoIm1vdXNlbGVhdmUuYWNjb3JkaW9uIixmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5iaW5kKCJmb2N1cy5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmJpbmQoImJsdXIuYWNjb3JkaW9uIixmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KSxiLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpO2lmKGMubmF2aWdhdGlvbil7dmFyIGQ9Yi5lbGVtZW50LmZpbmQoImEiKS5maWx0ZXIoYy5uYXZpZ2F0aW9uRmlsdGVyKS5lcSgwKTtpZihkLmxlbmd0aCl7dmFyIGU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWhlYWRlciIpO2UubGVuZ3RoP2IuYWN0aXZlPWU6Yi5hY3RpdmU9ZC5jbG9zZXN0KCIudWktYWNjb3JkaW9uLWNvbnRlbnQiKS5wcmV2KCl9fWIuYWN0aXZlPWIuX2ZpbmRBY3RpdmUoYi5hY3RpdmV8fGMuYWN0aXZlKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1zdGF0ZS1hY3RpdmUiKS50b2dnbGVDbGFzcygidWktY29ybmVyLWFsbCIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItdG9wIiksYi5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSxiLl9jcmVhdGVJY29ucygpLGIucmVzaXplKCksYi5lbGVtZW50LmF0dHIoInJvbGUiLCJ0YWJsaXN0IiksYi5oZWFkZXJzLmF0dHIoInJvbGUiLCJ0YWIiKS5iaW5kKCJrZXlkb3duLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX2tleWRvd24oYSl9KS5uZXh0KCkuYXR0cigicm9sZSIsInRhYnBhbmVsIiksYi5oZWFkZXJzLm5vdChiLmFjdGl2ZXx8IiIpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmhpZGUoKSxiLmFjdGl2ZS5sZW5ndGg/Yi5hY3RpdmUuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KTpiLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLGEuYnJvd3Nlci5zYWZhcml8fGIuaGVhZGVycy5maW5kKCJhIikuYXR0cigidGFiSW5kZXgiLC0xKSxjLmV2ZW50JiZiLmhlYWRlcnMuYmluZChjLmV2ZW50LnNwbGl0KCIgIikuam9pbigiLmFjY29yZGlvbiAiKSsiLmFjY29yZGlvbiIsZnVuY3Rpb24oYSl7Yi5fY2xpY2tIYW5kbGVyLmNhbGwoYixhLHRoaXMpLGEucHJldmVudERlZmF1bHQoKX0pfSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5pY29ucyYmKGEoIjxzcGFuPjwvc3Bhbj4iKS5hZGRDbGFzcygidWktaWNvbiAiK2IuaWNvbnMuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSx0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLWljb24iKS50b2dnbGVDbGFzcyhiLmljb25zLmhlYWRlcikudG9nZ2xlQ2xhc3MoYi5pY29ucy5oZWFkZXJTZWxlY3RlZCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuaGVhZGVycy51bmJpbmQoIi5hY2NvcmRpb24iKS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktaGVscGVyLXJlc2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1hY3RpdmUgdWktc3RhdGUtZGlzYWJsZWQgdWktY29ybmVyLXRvcCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1zZWxlY3RlZCIpLnJlbW92ZUF0dHIoInRhYkluZGV4IiksdGhpcy5oZWFkZXJzLmZpbmQoImEiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLHRoaXMuX2Rlc3Ryb3lJY29ucygpO3ZhciBjPXRoaXMuaGVhZGVycy5uZXh0KCkuY3NzKCJkaXNwbGF5IiwiIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS1hY2NvcmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUgdWktYWNjb3JkaW9uLWRpc2FibGVkIHVpLXN0YXRlLWRpc2FibGVkIik7cmV0dXJuKGIuYXV0b0hlaWdodHx8Yi5maWxsSGVpZ2h0KSYmYy5jc3MoImhlaWdodCIsIiIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09ImFjdGl2ZSImJnRoaXMuYWN0aXZhdGUoYyksYj09Imljb25zIiYmKHRoaXMuX2Rlc3Ryb3lJY29ucygpLGMmJnRoaXMuX2NyZWF0ZUljb25zKCkpLGI9PSJkaXNhYmxlZCImJnRoaXMuaGVhZGVycy5hZGQodGhpcy5oZWFkZXJzLm5leHQoKSlbYz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJ1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktc3RhdGUtZGlzYWJsZWQiKX0sX2tleWRvd246ZnVuY3Rpb24oYil7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHxiLmFsdEtleXx8Yi5jdHJsS2V5KXJldHVybjt2YXIgYz1hLnVpLmtleUNvZGUsZD10aGlzLmhlYWRlcnMubGVuZ3RoLGU9dGhpcy5oZWFkZXJzLmluZGV4KGIudGFyZ2V0KSxmPSExO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgYy5SSUdIVDpjYXNlIGMuRE9XTjpmPXRoaXMuaGVhZGVyc1soZSsxKSVkXTticmVhaztjYXNlIGMuTEVGVDpjYXNlIGMuVVA6Zj10aGlzLmhlYWRlcnNbKGUtMStkKSVkXTticmVhaztjYXNlIGMuU1BBQ0U6Y2FzZSBjLkVOVEVSOnRoaXMuX2NsaWNrSGFuZGxlcih7dGFyZ2V0OmIudGFyZ2V0fSxiLnRhcmdldCksYi5wcmV2ZW50RGVmYXVsdCgpfXJldHVybiBmPyhhKGIudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGEoZikuYXR0cigidGFiSW5kZXgiLDApLGYuZm9jdXMoKSwhMSk6ITB9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucyxjO2lmKGIuZmlsbFNwYWNlKXtpZihhLmJyb3dzZXIubXNpZSl7dmFyIGQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmNzcygib3ZlcmZsb3ciKTt0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpfWM9dGhpcy5lbGVtZW50LnBhcmVudCgpLmhlaWdodCgpLGEuYnJvd3Nlci5tc2llJiZ0aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIsZCksdGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24oKXtjLT1hKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2EodGhpcykuaGVpZ2h0KE1hdGgubWF4KDAsYy1hKHRoaXMpLmlubmVySGVpZ2h0KCkrYSh0aGlzKS5oZWlnaHQoKSkpfSkuY3NzKCJvdmVyZmxvdyIsImF1dG8iKX1lbHNlIGIuYXV0b0hlaWdodCYmKGM9MCx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtjPU1hdGgubWF4KGMsYSh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChjKSk7cmV0dXJuIHRoaXN9LGFjdGl2YXRlOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucy5hY3RpdmU9YTt2YXIgYj10aGlzLl9maW5kQWN0aXZlKGEpWzBdO3JldHVybiB0aGlzLl9jbGlja0hhbmRsZXIoe3RhcmdldDpifSxiKSx0aGlzfSxfZmluZEFjdGl2ZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90eXBlb2YgYj09Im51bWJlciI/dGhpcy5oZWFkZXJzLmZpbHRlcigiOmVxKCIrYisiKSIpOnRoaXMuaGVhZGVycy5ub3QodGhpcy5oZWFkZXJzLm5vdChiKSk6Yj09PSExP2EoW10pOnRoaXMuaGVhZGVycy5maWx0ZXIoIjplcSgwKSIpfSxfY2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5vcHRpb25zO2lmKGQuZGlzYWJsZWQpcmV0dXJuO2lmKCFiLnRhcmdldCl7aWYoIWQuY29sbGFwc2libGUpcmV0dXJuO3RoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlciksdGhpcy5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKTt2YXIgZT10aGlzLmFjdGl2ZS5uZXh0KCksZj17b3B0aW9uczpkLG5ld0hlYWRlcjphKFtdKSxvbGRIZWFkZXI6ZC5hY3RpdmUsbmV3Q29udGVudDphKFtdKSxvbGRDb250ZW50OmV9LGc9dGhpcy5hY3RpdmU9YShbXSk7dGhpcy5fdG9nZ2xlKGcsZSxmKTtyZXR1cm59dmFyIGg9YShiLmN1cnJlbnRUYXJnZXR8fGMpLGk9aFswXT09PXRoaXMuYWN0aXZlWzBdO2QuYWN0aXZlPWQuY29sbGFwc2libGUmJmk/ITE6dGhpcy5oZWFkZXJzLmluZGV4KGgpO2lmKHRoaXMucnVubmluZ3x8IWQuY29sbGFwc2libGUmJmkpcmV0dXJuO3ZhciBqPXRoaXMuYWN0aXZlLGc9aC5uZXh0KCksZT10aGlzLmFjdGl2ZS5uZXh0KCksZj17b3B0aW9uczpkLG5ld0hlYWRlcjppJiZkLmNvbGxhcHNpYmxlP2EoW10pOmgsb2xkSGVhZGVyOnRoaXMuYWN0aXZlLG5ld0NvbnRlbnQ6aSYmZC5jb2xsYXBzaWJsZT9hKFtdKTpnLG9sZENvbnRlbnQ6ZX0saz10aGlzLmhlYWRlcnMuaW5kZXgodGhpcy5hY3RpdmVbMF0pPnRoaXMuaGVhZGVycy5pbmRleChoWzBdKTt0aGlzLmFjdGl2ZT1pP2EoW10pOmgsdGhpcy5fdG9nZ2xlKGcsZSxmLGksayksai5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIikuY2hpbGRyZW4oIi51aS1pY29uIikucmVtb3ZlQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCkuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXIpLGl8fChoLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlcikuYWRkQ2xhc3MoZC5pY29ucy5oZWFkZXJTZWxlY3RlZCksaC5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpKTtyZXR1cm59LF90b2dnbGU6ZnVuY3Rpb24oYixjLGQsZSxmKXt2YXIgZz10aGlzLGg9Zy5vcHRpb25zO2cudG9TaG93PWIsZy50b0hpZGU9YyxnLmRhdGE9ZDt2YXIgaT1mdW5jdGlvbigpe2lmKCFnKXJldHVybjtyZXR1cm4gZy5fY29tcGxldGVkLmFwcGx5KGcsYXJndW1lbnRzKX07Zy5fdHJpZ2dlcigiY2hhbmdlc3RhcnQiLG51bGwsZy5kYXRhKSxnLnJ1bm5pbmc9Yy5zaXplKCk9PT0wP2Iuc2l6ZSgpOmMuc2l6ZSgpO2lmKGguYW5pbWF0ZWQpe3ZhciBqPXt9O2guY29sbGFwc2libGUmJmU/aj17dG9TaG93OmEoW10pLHRvSGlkZTpjLGNvbXBsZXRlOmksZG93bjpmLGF1dG9IZWlnaHQ6aC5hdXRvSGVpZ2h0fHxoLmZpbGxTcGFjZX06aj17dG9TaG93OmIsdG9IaWRlOmMsY29tcGxldGU6aSxkb3duOmYsYXV0b0hlaWdodDpoLmF1dG9IZWlnaHR8fGguZmlsbFNwYWNlfSxoLnByb3hpZWR8fChoLnByb3hpZWQ9aC5hbmltYXRlZCksaC5wcm94aWVkRHVyYXRpb258fChoLnByb3hpZWREdXJhdGlvbj1oLmR1cmF0aW9uKSxoLmFuaW1hdGVkPWEuaXNGdW5jdGlvbihoLnByb3hpZWQpP2gucHJveGllZChqKTpoLnByb3hpZWQsaC5kdXJhdGlvbj1hLmlzRnVuY3Rpb24oaC5wcm94aWVkRHVyYXRpb24pP2gucHJveGllZER1cmF0aW9uKGopOmgucHJveGllZER1cmF0aW9uO3ZhciBrPWEudWkuYWNjb3JkaW9uLmFuaW1hdGlvbnMsbD1oLmR1cmF0aW9uLG09aC5hbmltYXRlZDttJiYha1ttXSYmIWEuZWFzaW5nW21dJiYobT0ic2xpZGUiKSxrW21dfHwoa1ttXT1mdW5jdGlvbihhKXt0aGlzLnNsaWRlKGEse2Vhc2luZzptLGR1cmF0aW9uOmx8fDcwMH0pfSksa1ttXShqKX1lbHNlIGguY29sbGFwc2libGUmJmU/Yi50b2dnbGUoKTooYy5oaWRlKCksYi5zaG93KCkpLGkoITApO2MucHJldigpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkuYmx1cigpLGIucHJldigpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIix0YWJJbmRleDowfSkuZm9jdXMoKX0sX2NvbXBsZXRlZDpmdW5jdGlvbihhKXt0aGlzLnJ1bm5pbmc9YT8wOi0tdGhpcy5ydW5uaW5nO2lmKHRoaXMucnVubmluZylyZXR1cm47dGhpcy5vcHRpb25zLmNsZWFyU3R5bGUmJnRoaXMudG9TaG93LmFkZCh0aGlzLnRvSGlkZSkuY3NzKHtoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KSx0aGlzLnRvSGlkZS5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIiksdGhpcy50b0hpZGUubGVuZ3RoJiYodGhpcy50b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lPXRoaXMudG9IaWRlLnBhcmVudCgpWzBdLmNsYXNzTmFtZSksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixudWxsLHRoaXMuZGF0YSl9fSksYS5leHRlbmQoYS51aS5hY2NvcmRpb24se3ZlcnNpb246IjEuOC4yNCIsYW5pbWF0aW9uczp7c2xpZGU6ZnVuY3Rpb24oYixjKXtiPWEuZXh0ZW5kKHtlYXNpbmc6InN3aW5nIixkdXJhdGlvbjozMDB9LGIsYyk7aWYoIWIudG9IaWRlLnNpemUoKSl7Yi50b1Nob3cuYW5pbWF0ZSh7aGVpZ2h0OiJzaG93IixwYWRkaW5nVG9wOiJzaG93IixwYWRkaW5nQm90dG9tOiJzaG93In0sYik7cmV0dXJufWlmKCFiLnRvU2hvdy5zaXplKCkpe2IudG9IaWRlLmFuaW1hdGUoe2hlaWdodDoiaGlkZSIscGFkZGluZ1RvcDoiaGlkZSIscGFkZGluZ0JvdHRvbToiaGlkZSJ9LGIpO3JldHVybn12YXIgZD1iLnRvU2hvdy5jc3MoIm92ZXJmbG93IiksZT0wLGY9e30sZz17fSxoPVsiaGVpZ2h0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxpLGo9Yi50b1Nob3c7aT1qWzBdLnN0eWxlLndpZHRoLGoud2lkdGgoai5wYXJlbnQoKS53aWR0aCgpLXBhcnNlRmxvYXQoai5jc3MoInBhZGRpbmdMZWZ0IikpLXBhcnNlRmxvYXQoai5jc3MoInBhZGRpbmdSaWdodCIpKS0ocGFyc2VGbG9hdChqLmNzcygiYm9yZGVyTGVmdFdpZHRoIikpfHwwKS0ocGFyc2VGbG9hdChqLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpKXx8MCkpLGEuZWFjaChoLGZ1bmN0aW9uKGMsZCl7Z1tkXT0iaGlkZSI7dmFyIGU9KCIiK2EuY3NzKGIudG9TaG93WzBdLGQpKS5tYXRjaCgvXihbXGQrLS5dKykoLiopJC8pO2ZbZF09e3ZhbHVlOmVbMV0sdW5pdDplWzJdfHwicHgifX0pLGIudG9TaG93LmNzcyh7aGVpZ2h0OjAsb3ZlcmZsb3c6ImhpZGRlbiJ9KS5zaG93KCksYi50b0hpZGUuZmlsdGVyKCI6aGlkZGVuIikuZWFjaChiLmNvbXBsZXRlKS5lbmQoKS5maWx0ZXIoIjp2aXNpYmxlIikuYW5pbWF0ZShnLHtzdGVwOmZ1bmN0aW9uKGEsYyl7Yy5wcm9wPT0iaGVpZ2h0IiYmKGU9Yy5lbmQtYy5zdGFydD09PTA/MDooYy5ub3ctYy5zdGFydCkvKGMuZW5kLWMuc3RhcnQpKSxiLnRvU2hvd1swXS5zdHlsZVtjLnByb3BdPWUqZltjLnByb3BdLnZhbHVlK2ZbYy5wcm9wXS51bml0fSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2IuYXV0b0hlaWdodHx8Yi50b1Nob3cuY3NzKCJoZWlnaHQiLCIiKSxiLnRvU2hvdy5jc3Moe3dpZHRoOmksb3ZlcmZsb3c6ZH0pLGIuY29tcGxldGUoKX19KX0sYm91bmNlc2xpZGU6ZnVuY3Rpb24oYSl7dGhpcy5zbGlkZShhLHtlYXNpbmc6YS5kb3duPyJlYXNlT3V0Qm91bmNlIjoic3dpbmciLGR1cmF0aW9uOmEuZG93bj8xZTM6MjAwfSl9fX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9MDthLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIix7b3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbH0scGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQsZDt0aGlzLmlzTXVsdGlMaW5lPXRoaXMuZWxlbWVudC5pcygidGV4dGFyZWEiKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLmF0dHIoe3JvbGU6InRleHRib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Imxpc3QiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9KS5iaW5kKCJrZXlkb3duLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYyl7aWYoYi5vcHRpb25zLmRpc2FibGVkfHxiLmVsZW1lbnQucHJvcEF0dHIoInJlYWRPbmx5IikpcmV0dXJuO2Q9ITE7dmFyIGU9YS51aS5rZXlDb2RlO3N3aXRjaChjLmtleUNvZGUpe2Nhc2UgZS5QQUdFX1VQOmIuX21vdmUoInByZXZpb3VzUGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlBBR0VfRE9XTjpiLl9tb3ZlKCJuZXh0UGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlVQOmIuX2tleUV2ZW50KCJwcmV2aW91cyIsYyk7YnJlYWs7Y2FzZSBlLkRPV046Yi5fa2V5RXZlbnQoIm5leHQiLGMpO2JyZWFrO2Nhc2UgZS5FTlRFUjpjYXNlIGUuTlVNUEFEX0VOVEVSOmIubWVudS5hY3RpdmUmJihkPSEwLGMucHJldmVudERlZmF1bHQoKSk7Y2FzZSBlLlRBQjppZighYi5tZW51LmFjdGl2ZSlyZXR1cm47Yi5tZW51LnNlbGVjdChjKTticmVhaztjYXNlIGUuRVNDQVBFOmIuZWxlbWVudC52YWwoYi50ZXJtKSxiLmNsb3NlKGMpO2JyZWFrO2RlZmF1bHQ6Y2xlYXJUaW1lb3V0KGIuc2VhcmNoaW5nKSxiLnNlYXJjaGluZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi50ZXJtIT1iLmVsZW1lbnQudmFsKCkmJihiLnNlbGVjdGVkSXRlbT1udWxsLGIuc2VhcmNoKG51bGwsYykpfSxiLm9wdGlvbnMuZGVsYXkpfX0pLmJpbmQoImtleXByZXNzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7ZCYmKGQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKX0pLmJpbmQoImZvY3VzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oKXtpZihiLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO2Iuc2VsZWN0ZWRJdGVtPW51bGwsYi5wcmV2aW91cz1iLmVsZW1lbnQudmFsKCl9KS5iaW5kKCJibHVyLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtjbGVhclRpbWVvdXQoYi5zZWFyY2hpbmcpLGIuY2xvc2luZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jbG9zZShhKSxiLl9jaGFuZ2UoYSl9LDE1MCl9KSx0aGlzLl9pbml0U291cmNlKCksdGhpcy5tZW51PWEoIjx1bD48L3VsPiIpLmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUiKS5hcHBlbmRUbyhhKHRoaXMub3B0aW9ucy5hcHBlbmRUb3x8ImJvZHkiLGMpWzBdKS5tb3VzZWRvd24oZnVuY3Rpb24oYyl7dmFyIGQ9Yi5tZW51LmVsZW1lbnRbMF07YShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aHx8c2V0VGltZW91dChmdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9uZSgibW91c2Vkb3duIixmdW5jdGlvbihjKXtjLnRhcmdldCE9PWIuZWxlbWVudFswXSYmYy50YXJnZXQhPT1kJiYhYS51aS5jb250YWlucyhkLGMudGFyZ2V0KSYmYi5jbG9zZSgpfSl9LDEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYi5jbG9zaW5nKX0sMTMpfSkubWVudSh7Zm9jdXM6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLml0ZW0uZGF0YSgiaXRlbS5hdXRvY29tcGxldGUiKTshMSE9PWIuX3RyaWdnZXIoImZvY3VzIixhLHtpdGVtOmR9KSYmL15rZXkvLnRlc3QoYS5vcmlnaW5hbEV2ZW50LnR5cGUpJiZiLmVsZW1lbnQudmFsKGQudmFsdWUpfSxzZWxlY3RlZDpmdW5jdGlvbihhLGQpe3ZhciBlPWQuaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpLGY9Yi5wcmV2aW91cztiLmVsZW1lbnRbMF0hPT1jLmFjdGl2ZUVsZW1lbnQmJihiLmVsZW1lbnQuZm9jdXMoKSxiLnByZXZpb3VzPWYsc2V0VGltZW91dChmdW5jdGlvbigpe2IucHJldmlvdXM9ZixiLnNlbGVjdGVkSXRlbT1lfSwxKSksITEhPT1iLl90cmlnZ2VyKCJzZWxlY3QiLGEse2l0ZW06ZX0pJiZiLmVsZW1lbnQudmFsKGUudmFsdWUpLGIudGVybT1iLmVsZW1lbnQudmFsKCksYi5jbG9zZShhKSxiLnNlbGVjdGVkSXRlbT1lfSxibHVyOmZ1bmN0aW9uKGEsYyl7Yi5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJmIuZWxlbWVudC52YWwoKSE9PWIudGVybSYmYi5lbGVtZW50LnZhbChiLnRlcm0pfX0pLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSkuY3NzKHt0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZGF0YSgibWVudSIpLGEuZm4uYmdpZnJhbWUmJnRoaXMubWVudS5lbGVtZW50LmJnaWZyYW1lKCksYi5iZWZvcmV1bmxvYWRIYW5kbGVyPWZ1bmN0aW9uKCl7Yi5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfSxhKHdpbmRvdykuYmluZCgiYmVmb3JldW5sb2FkIixiLmJlZm9yZXVubG9hZEhhbmRsZXIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1hdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhhc3BvcHVwIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksYSh3aW5kb3cpLnVuYmluZCgiYmVmb3JldW5sb2FkIix0aGlzLmJlZm9yZXVubG9hZEhhbmRsZXIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09PSJzb3VyY2UiJiZ0aGlzLl9pbml0U291cmNlKCksYj09PSJhcHBlbmRUbyImJnRoaXMubWVudS5lbGVtZW50LmFwcGVuZFRvKGEoY3x8ImJvZHkiLHRoaXMuZWxlbWVudFswXS5vd25lckRvY3VtZW50KVswXSksYj09PSJkaXNhYmxlZCImJmMmJnRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfSxfaW5pdFNvdXJjZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYyxkO2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuc291cmNlKT8oYz10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGIsZCl7ZChhLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIoYyxiLnRlcm0pKX0pOnR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlPT0ic3RyaW5nIj8oZD10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGMsZSl7Yi54aHImJmIueGhyLmFib3J0KCksYi54aHI9YS5hamF4KHt1cmw6ZCxkYXRhOmMsZGF0YVR5cGU6Impzb24iLHN1Y2Nlc3M6ZnVuY3Rpb24oYSxiKXtlKGEpfSxlcnJvcjpmdW5jdGlvbigpe2UoW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sc2VhcmNoOmZ1bmN0aW9uKGEsYil7YT1hIT1udWxsP2E6dGhpcy5lbGVtZW50LnZhbCgpLHRoaXMudGVybT10aGlzLmVsZW1lbnQudmFsKCk7aWYoYS5sZW5ndGg8dGhpcy5vcHRpb25zLm1pbkxlbmd0aClyZXR1cm4gdGhpcy5jbG9zZShiKTtjbGVhclRpbWVvdXQodGhpcy5jbG9zaW5nKTtpZih0aGlzLl90cmlnZ2VyKCJzZWFyY2giLGIpPT09ITEpcmV0dXJuO3JldHVybiB0aGlzLl9zZWFyY2goYSl9LF9zZWFyY2g6ZnVuY3Rpb24oYSl7dGhpcy5wZW5kaW5nKyssdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpLHRoaXMuc291cmNlKHt0ZXJtOmF9LHRoaXMuX3Jlc3BvbnNlKCkpfSxfcmVzcG9uc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9KytjO3JldHVybiBmdW5jdGlvbihkKXtiPT09YyYmYS5fX3Jlc3BvbnNlKGQpLGEucGVuZGluZy0tLGEucGVuZGluZ3x8YS5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpfX0sX19yZXNwb25zZTpmdW5jdGlvbihhKXshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZhJiZhLmxlbmd0aD8oYT10aGlzLl9ub3JtYWxpemUoYSksdGhpcy5fc3VnZ2VzdChhKSx0aGlzLl90cmlnZ2VyKCJvcGVuIikpOnRoaXMuY2xvc2UoKX0sY2xvc2U6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KHRoaXMuY2xvc2luZyksdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJih0aGlzLm1lbnUuZWxlbWVudC5oaWRlKCksdGhpcy5tZW51LmRlYWN0aXZhdGUoKSx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsYSkpfSxfY2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMucHJldmlvdXMhPT10aGlzLmVsZW1lbnQudmFsKCkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYSx7aXRlbTp0aGlzLnNlbGVjdGVkSXRlbX0pfSxfbm9ybWFsaXplOmZ1bmN0aW9uKGIpe3JldHVybiBiLmxlbmd0aCYmYlswXS5sYWJlbCYmYlswXS52YWx1ZT9iOmEubWFwKGIsZnVuY3Rpb24oYil7cmV0dXJuIHR5cGVvZiBiPT0ic3RyaW5nIj97bGFiZWw6Yix2YWx1ZTpifTphLmV4dGVuZCh7bGFiZWw6Yi5sYWJlbHx8Yi52YWx1ZSx2YWx1ZTpiLnZhbHVlfHxiLmxhYmVsfSxiKX0pfSxfc3VnZ2VzdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm1lbnUuZWxlbWVudC5lbXB0eSgpLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSk7dGhpcy5fcmVuZGVyTWVudShjLGIpLHRoaXMubWVudS5kZWFjdGl2YXRlKCksdGhpcy5tZW51LnJlZnJlc2goKSxjLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksYy5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dChuZXcgYS5FdmVudCgibW91c2VvdmVyIikpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWVudS5lbGVtZW50O2Eub3V0ZXJXaWR0aChNYXRoLm1heChhLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpczthLmVhY2goYyxmdW5jdGlvbihhLGMpe2QuX3JlbmRlckl0ZW0oYixjKX0pfSxfcmVuZGVySXRlbTpmdW5jdGlvbihiLGMpe3JldHVybiBhKCI8bGk+PC9saT4iKS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIsYykuYXBwZW5kKGEoIjxhPjwvYT4iKS50ZXh0KGMubGFiZWwpKS5hcHBlbmRUbyhiKX0sX21vdmU6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpe3RoaXMuc2VhcmNoKG51bGwsYik7cmV0dXJufWlmKHRoaXMubWVudS5maXJzdCgpJiYvXnByZXZpb3VzLy50ZXN0KGEpfHx0aGlzLm1lbnUubGFzdCgpJiYvXm5leHQvLnRlc3QoYSkpe3RoaXMuZWxlbWVudC52YWwodGhpcy50ZXJtKSx0aGlzLm1lbnUuZGVhY3RpdmF0ZSgpO3JldHVybn10aGlzLm1lbnVbYV0oYil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudH0sX2tleUV2ZW50OmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKXRoaXMuX21vdmUoYSxiKSxiLnByZXZlbnREZWZhdWx0KCl9fSksYS5leHRlbmQoYS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csIlxcJCYiKX0sZmlsdGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IFJlZ0V4cChhLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleChjKSwiaSIpO3JldHVybiBhLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gZC50ZXN0KGEubGFiZWx8fGEudmFsdWV8fGEpfSl9fSl9KGpRdWVyeSksZnVuY3Rpb24oYSl7YS53aWRnZXQoInVpLm1lbnUiLHtfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJsaXN0Ym94IiwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjoidWktYWN0aXZlLW1lbnVpdGVtIn0pLmNsaWNrKGZ1bmN0aW9uKGMpe2lmKCFhKGMudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIGEiKS5sZW5ndGgpcmV0dXJuO2MucHJldmVudERlZmF1bHQoKSxiLnNlbGVjdChjKX0pLHRoaXMucmVmcmVzaCgpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPXRoaXMuZWxlbWVudC5jaGlsZHJlbigibGk6bm90KC51aS1tZW51LWl0ZW0pOmhhcyhhKSIpLmFkZENsYXNzKCJ1aS1tZW51LWl0ZW0iKS5hdHRyKCJyb2xlIiwibWVudWl0ZW0iKTtjLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLWNvcm5lci1hbGwiKS5hdHRyKCJ0YWJpbmRleCIsLTEpLm1vdXNlZW50ZXIoZnVuY3Rpb24oYyl7Yi5hY3RpdmF0ZShjLGEodGhpcykucGFyZW50KCkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2IuZGVhY3RpdmF0ZSgpfSl9LGFjdGl2YXRlOmZ1bmN0aW9uKGEsYil7dGhpcy5kZWFjdGl2YXRlKCk7aWYodGhpcy5oYXNTY3JvbGwoKSl7dmFyIGM9Yi5vZmZzZXQoKS50b3AtdGhpcy5lbGVtZW50Lm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5zY3JvbGxUb3AoKSxlPXRoaXMuZWxlbWVudC5oZWlnaHQoKTtjPDA/dGhpcy5lbGVtZW50LnNjcm9sbFRvcChkK2MpOmM+PWUmJnRoaXMuZWxlbWVudC5zY3JvbGxUb3AoZCtjLWUrYi5oZWlnaHQoKSl9dGhpcy5hY3RpdmU9Yi5lcSgwKS5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLmF0dHIoImlkIiwidWktYWN0aXZlLW1lbnVpdGVtIikuZW5kKCksdGhpcy5fdHJpZ2dlcigiZm9jdXMiLGEse2l0ZW06Yn0pfSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLmFjdGl2ZS5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoImlkIiksdGhpcy5fdHJpZ2dlcigiYmx1ciIpLHRoaXMuYWN0aXZlPW51bGx9LG5leHQ6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlKCJuZXh0IiwiLnVpLW1lbnUtaXRlbTpmaXJzdCIsYSl9LHByZXZpb3VzOmZ1bmN0aW9uKGEpe3RoaXMubW92ZSgicHJldiIsIi51aS1tZW51LWl0ZW06bGFzdCIsYSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LG1vdmU6ZnVuY3Rpb24oYSxiLGMpe2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5hY3RpdmF0ZShjLHRoaXMuZWxlbWVudC5jaGlsZHJlbihiKSk7cmV0dXJufXZhciBkPXRoaXMuYWN0aXZlW2ErIkFsbCJdKCIudWktbWVudS1pdGVtIikuZXEoMCk7ZC5sZW5ndGg/dGhpcy5hY3RpdmF0ZShjLGQpOnRoaXMuYWN0aXZhdGUoYyx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oYikpfSxuZXh0UGFnZTpmdW5jdGlvbihiKXtpZih0aGlzLmhhc1Njcm9sbCgpKXtpZighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpO3JldHVybn12YXIgYz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuaGVpZ2h0KCksZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLm9mZnNldCgpLnRvcC1jLWQrYSh0aGlzKS5oZWlnaHQoKTtyZXR1cm4gYjwxMCYmYj4tMTB9KTtlLmxlbmd0aHx8KGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSksdGhpcy5hY3RpdmF0ZShiLGUpfWVsc2UgdGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpPyI6Zmlyc3QiOiI6bGFzdCIpKX0scHJldmlvdXNQYWdlOmZ1bmN0aW9uKGIpe2lmKHRoaXMuaGFzU2Nyb2xsKCkpe2lmKCF0aGlzLmFjdGl2ZXx8dGhpcy5maXJzdCgpKXt0aGlzLmFjdGl2YXRlKGIsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSk7cmV0dXJufXZhciBjPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxkPXRoaXMuZWxlbWVudC5oZWlnaHQoKSxlPXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBiPWEodGhpcykub2Zmc2V0KCkudG9wLWMrZC1hKHRoaXMpLmhlaWdodCgpO3JldHVybiBiPDEwJiZiPi0xMH0pO2UubGVuZ3RofHwoZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW06Zmlyc3QiKSksdGhpcy5hY3RpdmF0ZShiLGUpfWVsc2UgdGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKT8iOmxhc3QiOiI6Zmlyc3QiKSl9LGhhc1Njcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQuaGVpZ2h0KCk8dGhpcy5lbGVtZW50W2EuZm4ucHJvcD8icHJvcCI6ImF0dHIiXSgic2Nyb2xsSGVpZ2h0Iil9LHNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLl90cmlnZ2VyKCJzZWxlY3RlZCIsYSx7aXRlbTp0aGlzLmFjdGl2ZX0pfX0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz0idWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLGg9InVpLXN0YXRlLWhvdmVyIHVpLXN0YXRlLWFjdGl2ZSAiLGk9InVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLGo9ZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLmZpbmQoIjp1aS1idXR0b24iKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5idXR0b24oInJlZnJlc2giKX0sMSl9LGs9ZnVuY3Rpb24oYil7dmFyIGM9Yi5uYW1lLGQ9Yi5mb3JtLGU9YShbXSk7cmV0dXJuIGMmJihkP2U9YShkKS5maW5kKCJbbmFtZT0nIitjKyInXSIpOmU9YSgiW25hbWU9JyIrYysiJ10iLGIub3duZXJEb2N1bWVudCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZm9ybX0pKSxlfTthLndpZGdldCgidWkuYnV0dG9uIix7b3B0aW9uczp7ZGlzYWJsZWQ6bnVsbCx0ZXh0OiEwLGxhYmVsOm51bGwsaWNvbnM6e3ByaW1hcnk6bnVsbCxzZWNvbmRhcnk6bnVsbH19LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuY2xvc2VzdCgiZm9ybSIpLnVuYmluZCgicmVzZXQuYnV0dG9uIikuYmluZCgicmVzZXQuYnV0dG9uIixqKSx0eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkIT0iYm9vbGVhbiI/dGhpcy5vcHRpb25zLmRpc2FibGVkPSEhdGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiLHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fZGV0ZXJtaW5lQnV0dG9uVHlwZSgpLHRoaXMuaGFzVGl0bGU9ISF0aGlzLmJ1dHRvbkVsZW1lbnQuYXR0cigidGl0bGUiKTt2YXIgYj10aGlzLGg9dGhpcy5vcHRpb25zLGk9dGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIixsPSJ1aS1zdGF0ZS1ob3ZlciIrKGk/IiI6IiB1aS1zdGF0ZS1hY3RpdmUiKSxtPSJ1aS1zdGF0ZS1mb2N1cyI7aC5sYWJlbD09PW51bGwmJihoLmxhYmVsPXRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpLHRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhnKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuYmluZCgibW91c2VlbnRlci5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzPT09YyYmYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIil9KS5iaW5kKCJtb3VzZWxlYXZlLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybjthKHRoaXMpLnJlbW92ZUNsYXNzKGwpfSkuYmluZCgiY2xpY2suYnV0dG9uIixmdW5jdGlvbihhKXtoLmRpc2FibGVkJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5lbGVtZW50LmJpbmQoImZvY3VzLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MobSl9KS5iaW5kKCJibHVyLmJ1dHRvbiIsZnVuY3Rpb24oKXtiLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MobSl9KSxpJiYodGhpcy5lbGVtZW50LmJpbmQoImNoYW5nZS5idXR0b24iLGZ1bmN0aW9uKCl7aWYoZilyZXR1cm47Yi5yZWZyZXNoKCl9KSx0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duLmJ1dHRvbiIsZnVuY3Rpb24oYSl7aWYoaC5kaXNhYmxlZClyZXR1cm47Zj0hMSxkPWEucGFnZVgsZT1hLnBhZ2VZfSkuYmluZCgibW91c2V1cC5idXR0b24iLGZ1bmN0aW9uKGEpe2lmKGguZGlzYWJsZWQpcmV0dXJuO2lmKGQhPT1hLnBhZ2VYfHxlIT09YS5wYWdlWSlmPSEwfSkpLHRoaXMudHlwZT09PSJjaGVja2JveCI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkfHxmKXJldHVybiExO2EodGhpcykudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGIuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLGIuZWxlbWVudFswXS5jaGVja2VkKX0pOnRoaXMudHlwZT09PSJyYWRpbyI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkfHxmKXJldHVybiExO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGIuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik7dmFyIGM9Yi5lbGVtZW50WzBdO2soYykubm90KGMpLm1hcChmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOih0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybiExO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGM9dGhpcyxhKGRvY3VtZW50KS5vbmUoIm1vdXNldXAiLGZ1bmN0aW9uKCl7Yz1udWxsfSl9KS5iaW5kKCJtb3VzZXVwLmJ1dHRvbiIsZnVuY3Rpb24oKXtpZihoLmRpc2FibGVkKXJldHVybiExO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5ZG93bi5idXR0b24iLGZ1bmN0aW9uKGIpe2lmKGguZGlzYWJsZWQpcmV0dXJuITE7KGIua2V5Q29kZT09YS51aS5rZXlDb2RlLlNQQUNFfHxiLmtleUNvZGU9PWEudWkua2V5Q29kZS5FTlRFUikmJmEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5dXAuYnV0dG9uIixmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbihiKXtiLmtleUNvZGU9PT1hLnVpLmtleUNvZGUuU1BBQ0UmJmEodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixoLmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5pcygiOmNoZWNrYm94Iik/dGhpcy50eXBlPSJjaGVja2JveCI6dGhpcy5lbGVtZW50LmlzKCI6cmFkaW8iKT90aGlzLnR5cGU9InJhZGlvIjp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/dGhpcy50eXBlPSJpbnB1dCI6dGhpcy50eXBlPSJidXR0b24iO2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpe3ZhciBhPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkuZmlsdGVyKCI6bGFzdCIpLGI9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iO3RoaXMuYnV0dG9uRWxlbWVudD1hLmZpbmQoYiksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGE9YS5sZW5ndGg/YS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1hLmZpbHRlcihiKSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWEuZmluZChiKSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIik7dmFyIGM9dGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpO2MmJnRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5idXR0b25FbGVtZW50LmF0dHIoImFyaWEtcHJlc3NlZCIsYyl9ZWxzZSB0aGlzLmJ1dHRvbkVsZW1lbnQ9dGhpcy5lbGVtZW50fSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idXR0b25FbGVtZW50fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoZysiICIraCsiICIraSkucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2EuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihiPT09ImRpc2FibGVkIil7Yz90aGlzLmVsZW1lbnQucHJvcEF0dHIoImRpc2FibGVkIiwhMCk6dGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIsITEpO3JldHVybn10aGlzLl9yZXNldEJ1dHRvbigpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LmlzKCI6ZGlzYWJsZWQiKTtiIT09dGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixiKSx0aGlzLnR5cGU9PT0icmFkaW8iP2sodGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5pcygiOmNoZWNrZWQiKT9hKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTphKHRoaXMpLmJ1dHRvbigid2lkZ2V0IikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIil9KTp0aGlzLnR5cGU9PT0iY2hlY2tib3giJiYodGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpP3RoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpOnRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKSl9LF9yZXNldEJ1dHRvbjpmdW5jdGlvbigpe2lmKHRoaXMudHlwZT09PSJpbnB1dCIpe3RoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5lbGVtZW50LnZhbCh0aGlzLm9wdGlvbnMubGFiZWwpO3JldHVybn12YXIgYj10aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoaSksYz1hKCI8c3Bhbj48L3NwYW4+Iix0aGlzLmVsZW1lbnRbMF0ub3duZXJEb2N1bWVudCkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKGIuZW1wdHkoKSkudGV4dCgpLGQ9dGhpcy5vcHRpb25zLmljb25zLGU9ZC5wcmltYXJ5JiZkLnNlY29uZGFyeSxmPVtdO2QucHJpbWFyeXx8ZC5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZmLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhlPyJzIjpkLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxkLnByaW1hcnkmJmIucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK2QucHJpbWFyeSsiJz48L3NwYW4+IiksZC5zZWNvbmRhcnkmJmIuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitkLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChmLnB1c2goZT8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8Yi5hdHRyKCJ0aXRsZSIsYykpKTpmLnB1c2goInVpLWJ1dHRvbi10ZXh0LW9ubHkiKSxiLmFkZENsYXNzKGYuam9pbigiICIpKX19KSxhLndpZGdldCgidWkuYnV0dG9uc2V0Iix7b3B0aW9uczp7aXRlbXM6IjpidXR0b24sIDpzdWJtaXQsIDpyZXNldCwgOmNoZWNrYm94LCA6cmFkaW8sIGEsIDpkYXRhKGJ1dHRvbikifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1idXR0b25zZXQiKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2goKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiJiZ0aGlzLmJ1dHRvbnMuYnV0dG9uKCJvcHRpb24iLGIsYyksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50LmNzcygiZGlyZWN0aW9uIik9PT0icnRsIjt0aGlzLmJ1dHRvbnM9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIjp1aS1idXR0b24iKS5idXR0b24oInJlZnJlc2giKS5lbmQoKS5ub3QoIjp1aS1idXR0b24iKS5idXR0b24oKS5lbmQoKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzKS5idXR0b24oIndpZGdldCIpWzBdfSkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwgdWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IikuZmlsdGVyKCI6Zmlyc3QiKS5hZGRDbGFzcyhiPyJ1aS1jb3JuZXItcmlnaHQiOiJ1aS1jb3JuZXItbGVmdCIpLmVuZCgpLmZpbHRlcigiOmxhc3QiKS5hZGRDbGFzcyhiPyJ1aS1jb3JuZXItbGVmdCI6InVpLWNvcm5lci1yaWdodCIpLmVuZCgpLmVuZCgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKSxhLldpZGdldC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfX0pfShqUXVlcnkpLGZ1bmN0aW9uKCQsdW5kZWZpbmVkKXtmdW5jdGlvbiBEYXRlcGlja2VyKCl7dGhpcy5kZWJ1Zz0hMSx0aGlzLl9jdXJJbnN0PW51bGwsdGhpcy5fa2V5RXZlbnQ9ITEsdGhpcy5fZGlzYWJsZWRJbnB1dHM9W10sdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsdGhpcy5faW5EaWFsb2c9ITEsdGhpcy5fbWFpbkRpdklkPSJ1aS1kYXRlcGlja2VyLWRpdiIsdGhpcy5faW5saW5lQ2xhc3M9InVpLWRhdGVwaWNrZXItaW5saW5lIix0aGlzLl9hcHBlbmRDbGFzcz0idWktZGF0ZXBpY2tlci1hcHBlbmQiLHRoaXMuX3RyaWdnZXJDbGFzcz0idWktZGF0ZXBpY2tlci10cmlnZ2VyIix0aGlzLl9kaWFsb2dDbGFzcz0idWktZGF0ZXBpY2tlci1kaWFsb2ciLHRoaXMuX2Rpc2FibGVDbGFzcz0idWktZGF0ZXBpY2tlci1kaXNhYmxlZCIsdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3M9InVpLWRhdGVwaWNrZXItdW5zZWxlY3RhYmxlIix0aGlzLl9jdXJyZW50Q2xhc3M9InVpLWRhdGVwaWNrZXItY3VycmVudC1kYXkiLHRoaXMuX2RheU92ZXJDbGFzcz0idWktZGF0ZXBpY2tlci1kYXlzLWNlbGwtb3ZlciIsdGhpcy5yZWdpb25hbD1bXSx0aGlzLnJlZ2lvbmFsWyIiXT17Y2xvc2VUZXh0OiJEb25lIixwcmV2VGV4dDoiUHJldiIsbmV4dFRleHQ6Ik5leHQiLGN1cnJlbnRUZXh0OiJUb2RheSIsbW9udGhOYW1lczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sbW9udGhOYW1lc1Nob3J0OlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sZGF5TmFtZXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLGRheU5hbWVzU2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxkYXlOYW1lc01pbjpbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl0sd2Vla0hlYWRlcjoiV2siLGRhdGVGb3JtYXQ6Im1tL2RkL3l5IixmaXJzdERheTowLGlzUlRMOiExLHNob3dNb250aEFmdGVyWWVhcjohMSx5ZWFyU3VmZml4OiIifSx0aGlzLl9kZWZhdWx0cz17c2hvd09uOiJmb2N1cyIsc2hvd0FuaW06ImZhZGVJbiIsc2hvd09wdGlvbnM6e30sZGVmYXVsdERhdGU6bnVsbCxhcHBlbmRUZXh0OiIiLGJ1dHRvblRleHQ6Ii4uLiIsYnV0dG9uSW1hZ2U6IiIsYnV0dG9uSW1hZ2VPbmx5OiExLGhpZGVJZk5vUHJldk5leHQ6ITEsbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdDohMSxnb3RvQ3VycmVudDohMSxjaGFuZ2VNb250aDohMSxjaGFuZ2VZZWFyOiExLHllYXJSYW5nZToiYy0xMDpjKzEwIixzaG93T3RoZXJNb250aHM6ITEsc2VsZWN0T3RoZXJNb250aHM6ITEsc2hvd1dlZWs6ITEsY2FsY3VsYXRlV2Vlazp0aGlzLmlzbzg2MDFXZWVrLHNob3J0WWVhckN1dG9mZjoiKzEwIixtaW5EYXRlOm51bGwsbWF4RGF0ZTpudWxsLGR1cmF0aW9uOiJmYXN0IixiZWZvcmVTaG93RGF5Om51bGwsYmVmb3JlU2hvdzpudWxsLG9uU2VsZWN0Om51bGwsb25DaGFuZ2VNb250aFllYXI6bnVsbCxvbkNsb3NlOm51bGwsbnVtYmVyT2ZNb250aHM6MSxzaG93Q3VycmVudEF0UG9zOjAsc3RlcE1vbnRoczoxLHN0ZXBCaWdNb250aHM6MTIsYWx0RmllbGQ6IiIsYWx0Rm9ybWF0OiIiLGNvbnN0cmFpbklucHV0OiEwLHNob3dCdXR0b25QYW5lbDohMSxhdXRvU2l6ZTohMSxkaXNhYmxlZDohMX0sJC5leHRlbmQodGhpcy5fZGVmYXVsdHMsdGhpcy5yZWdpb25hbFsiIl0pLHRoaXMuZHBEaXY9YmluZEhvdmVyKCQoJzxkaXYgaWQ9IicrdGhpcy5fbWFpbkRpdklkKyciIGNsYXNzPSJ1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpfWZ1bmN0aW9uIGJpbmRIb3ZlcihhKXt2YXIgYj0iYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhIjtyZXR1cm4gYS5iaW5kKCJtb3VzZW91dCIsZnVuY3Rpb24oYSl7dmFyIGM9JChhLnRhcmdldCkuY2xvc2VzdChiKTtpZighYy5sZW5ndGgpcmV0dXJuO2MucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIHVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciB1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKX0pLmJpbmQoIm1vdXNlb3ZlciIsZnVuY3Rpb24oYyl7dmFyIGQ9JChjLnRhcmdldCkuY2xvc2VzdChiKTtpZigkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGluc3RBY3RpdmUuaW5saW5lP2EucGFyZW50KClbMF06aW5zdEFjdGl2ZS5pbnB1dFswXSl8fCFkLmxlbmd0aClyZXR1cm47ZC5wYXJlbnRzKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpLmZpbmQoImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSxkLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLGQuaGFzQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldiIpJiZkLmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLXByZXYtaG92ZXIiKSxkLmhhc0NsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmZC5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9KX1mdW5jdGlvbiBleHRlbmRSZW1vdmUoYSxiKXskLmV4dGVuZChhLGIpO2Zvcih2YXIgYyBpbiBiKWlmKGJbY109PW51bGx8fGJbY109PXVuZGVmaW5lZClhW2NdPWJbY107cmV0dXJuIGF9ZnVuY3Rpb24gaXNBcnJheShhKXtyZXR1cm4gYSYmKCQuYnJvd3Nlci5zYWZhcmkmJnR5cGVvZiBhPT0ib2JqZWN0IiYmYS5sZW5ndGh8fGEuY29uc3RydWN0b3ImJmEuY29uc3RydWN0b3IudG9TdHJpbmcoKS5tYXRjaCgvXEFycmF5XChcKS8pKX0kLmV4dGVuZCgkLnVpLHtkYXRlcGlja2VyOnt2ZXJzaW9uOiIxLjguMjQifX0pO3ZhciBQUk9QX05BTUU9ImRhdGVwaWNrZXIiLGRwdXVpZD0obmV3IERhdGUpLmdldFRpbWUoKSxpbnN0QWN0aXZlOyQuZXh0ZW5kKERhdGVwaWNrZXIucHJvdG90eXBlLHttYXJrZXJDbGFzc05hbWU6Imhhc0RhdGVwaWNrZXIiLG1heFJvd3M6NCxsb2c6ZnVuY3Rpb24oKXt0aGlzLmRlYnVnJiZjb25zb2xlLmxvZy5hcHBseSgiIixhcmd1bWVudHMpfSxfd2lkZ2V0RGF0ZXBpY2tlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRwRGl2fSxzZXREZWZhdWx0czpmdW5jdGlvbihhKXtyZXR1cm4gZXh0ZW5kUmVtb3ZlKHRoaXMuX2RlZmF1bHRzLGF8fHt9KSx0aGlzfSxfYXR0YWNoRGF0ZXBpY2tlcjpmdW5jdGlvbih0YXJnZXQsc2V0dGluZ3Mpe3ZhciBpbmxpbmVTZXR0aW5ncz1udWxsO2Zvcih2YXIgYXR0ck5hbWUgaW4gdGhpcy5fZGVmYXVsdHMpe3ZhciBhdHRyVmFsdWU9dGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0ZToiK2F0dHJOYW1lKTtpZihhdHRyVmFsdWUpe2lubGluZVNldHRpbmdzPWlubGluZVNldHRpbmdzfHx7fTt0cnl7aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdPWV2YWwoYXR0clZhbHVlKX1jYXRjaChlcnIpe2lubGluZVNldHRpbmdzW2F0dHJOYW1lXT1hdHRyVmFsdWV9fX12YXIgbm9kZU5hbWU9dGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaW5saW5lPW5vZGVOYW1lPT0iZGl2Inx8bm9kZU5hbWU9PSJzcGFuIjt0YXJnZXQuaWR8fCh0aGlzLnV1aWQrPTEsdGFyZ2V0LmlkPSJkcCIrdGhpcy51dWlkKTt2YXIgaW5zdD10aGlzLl9uZXdJbnN0KCQodGFyZ2V0KSxpbmxpbmUpO2luc3Quc2V0dGluZ3M9JC5leHRlbmQoe30sc2V0dGluZ3N8fHt9LGlubGluZVNldHRpbmdzfHx7fSksbm9kZU5hbWU9PSJpbnB1dCI/dGhpcy5fY29ubmVjdERhdGVwaWNrZXIodGFyZ2V0LGluc3QpOmlubGluZSYmdGhpcy5faW5saW5lRGF0ZXBpY2tlcih0YXJnZXQsaW5zdCl9LF9uZXdJbnN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YVswXS5pZC5yZXBsYWNlKC8oW15BLVphLXowLTlfLV0pL2csIlxcXFwkMSIpO3JldHVybntpZDpjLGlucHV0OmEsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6YixkcERpdjpiP2JpbmRIb3ZlcigkKCc8ZGl2IGNsYXNzPSInK3RoaXMuX2lubGluZUNsYXNzKycgdWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwiPjwvZGl2PicpKTp0aGlzLmRwRGl2fX0sX2Nvbm5lY3REYXRlcGlja2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKTtiLmFwcGVuZD0kKFtdKSxiLnRyaWdnZXI9JChbXSk7aWYoYy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3RoaXMuX2F0dGFjaG1lbnRzKGMsYiksYy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkua2V5ZG93bih0aGlzLl9kb0tleURvd24pLmtleXByZXNzKHRoaXMuX2RvS2V5UHJlc3MpLmtleXVwKHRoaXMuX2RvS2V5VXApLmJpbmQoInNldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjLGQpe2Iuc2V0dGluZ3NbY109ZH0pLmJpbmQoImdldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5fZ2V0KGIsYyl9KSx0aGlzLl9hdXRvU2l6ZShiKSwkLmRhdGEoYSxQUk9QX05BTUUsYiksYi5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoYSl9LF9hdHRhY2htZW50czpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldChiLCJhcHBlbmRUZXh0IiksZD10aGlzLl9nZXQoYiwiaXNSVEwiKTtiLmFwcGVuZCYmYi5hcHBlbmQucmVtb3ZlKCksYyYmKGIuYXBwZW5kPSQoJzxzcGFuIGNsYXNzPSInK3RoaXMuX2FwcGVuZENsYXNzKyciPicrYysiPC9zcGFuPiIpLGFbZD8iYmVmb3JlIjoiYWZ0ZXIiXShiLmFwcGVuZCkpLGEudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLGIudHJpZ2dlciYmYi50cmlnZ2VyLnJlbW92ZSgpO3ZhciBlPXRoaXMuX2dldChiLCJzaG93T24iKTsoZT09ImZvY3VzInx8ZT09ImJvdGgiKSYmYS5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlcik7aWYoZT09ImJ1dHRvbiJ8fGU9PSJib3RoIil7dmFyIGY9dGhpcy5fZ2V0KGIsImJ1dHRvblRleHQiKSxnPXRoaXMuX2dldChiLCJidXR0b25JbWFnZSIpO2IudHJpZ2dlcj0kKHRoaXMuX2dldChiLCJidXR0b25JbWFnZU9ubHkiKT8kKCI8aW1nLz4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmF0dHIoe3NyYzpnLGFsdDpmLHRpdGxlOmZ9KTokKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5odG1sKGc9PSIiP2Y6JCgiPGltZy8+IikuYXR0cih7c3JjOmcsYWx0OmYsdGl0bGU6Zn0pKSksYVtkPyJiZWZvcmUiOiJhZnRlciJdKGIudHJpZ2dlciksYi50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7cmV0dXJuICQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJiQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT1hWzBdPyQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTokLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCE9YVswXT8oJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLCQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoYVswXSkpOiQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoYVswXSksITF9KX19LF9hdXRvU2l6ZTpmdW5jdGlvbihhKXtpZih0aGlzLl9nZXQoYSwiYXV0b1NpemUiKSYmIWEuaW5saW5lKXt2YXIgYj1uZXcgRGF0ZSgyMDA5LDExLDIwKSxjPXRoaXMuX2dldChhLCJkYXRlRm9ybWF0Iik7aWYoYy5tYXRjaCgvW0RNXS8pKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmxlbmd0aD5iJiYoYj1hW2RdLmxlbmd0aCxjPWQpO3JldHVybiBjfTtiLnNldE1vbnRoKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvTU0vKT8ibW9udGhOYW1lcyI6Im1vbnRoTmFtZXNTaG9ydCIpKSksYi5zZXREYXRlKGQodGhpcy5fZ2V0KGEsYy5tYXRjaCgvREQvKT8iZGF5TmFtZXMiOiJkYXlOYW1lc1Nob3J0IikpKzIwLWIuZ2V0RGF5KCkpfWEuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZShhLGIpLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPSQoYSk7aWYoYy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO2MuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmFwcGVuZChiLmRwRGl2KS5iaW5kKCJzZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGEsYyxkKXtiLnNldHRpbmdzW2NdPWR9KS5iaW5kKCJnZXREYXRhLmRhdGVwaWNrZXIiLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuX2dldChiLGMpfSksJC5kYXRhKGEsUFJPUF9OQU1FLGIpLHRoaXMuX3NldERhdGUoYix0aGlzLl9nZXREZWZhdWx0RGF0ZShiKSwhMCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihiKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoYiksYi5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoYSksYi5kcERpdi5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxfZGlhbG9nRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXMuX2RpYWxvZ0luc3Q7aWYoIWYpe3RoaXMudXVpZCs9MTt2YXIgZz0iZHAiK3RoaXMudXVpZDt0aGlzLl9kaWFsb2dJbnB1dD0kKCc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IicrZysnIiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDBweDsgd2lkdGg6IDBweDsiLz4nKSx0aGlzLl9kaWFsb2dJbnB1dC5rZXlkb3duKHRoaXMuX2RvS2V5RG93biksJCgiYm9keSIpLmFwcGVuZCh0aGlzLl9kaWFsb2dJbnB1dCksZj10aGlzLl9kaWFsb2dJbnN0PXRoaXMuX25ld0luc3QodGhpcy5fZGlhbG9nSW5wdXQsITEpLGYuc2V0dGluZ3M9e30sJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxmKX1leHRlbmRSZW1vdmUoZi5zZXR0aW5ncyxkfHx7fSksYj1iJiZiLmNvbnN0cnVjdG9yPT1EYXRlP3RoaXMuX2Zvcm1hdERhdGUoZixiKTpiLHRoaXMuX2RpYWxvZ0lucHV0LnZhbChiKSx0aGlzLl9wb3M9ZT9lLmxlbmd0aD9lOltlLnBhZ2VYLGUucGFnZVldOm51bGw7aWYoIXRoaXMuX3Bvcyl7dmFyIGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxqPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsaz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDt0aGlzLl9wb3M9W2gvMi0xMDAraixpLzItMTUwK2tdfXJldHVybiB0aGlzLl9kaWFsb2dJbnB1dC5jc3MoImxlZnQiLHRoaXMuX3Bvc1swXSsyMCsicHgiKS5jc3MoInRvcCIsdGhpcy5fcG9zWzFdKyJweCIpLGYuc2V0dGluZ3Mub25TZWxlY3Q9Yyx0aGlzLl9pbkRpYWxvZz0hMCx0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKSx0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSksJC5ibG9ja1VJJiYkLmJsb2NrVUkodGhpcy5kcERpdiksJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLFBST1BfTkFNRSxmKSx0aGlzfSxfZGVzdHJveURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9JChhKSxjPSQuZGF0YShhLFBST1BfTkFNRSk7aWYoIWIuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKXJldHVybjt2YXIgZD1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7JC5yZW1vdmVEYXRhKGEsUFJPUF9OQU1FKSxkPT0iaW5wdXQiPyhjLmFwcGVuZC5yZW1vdmUoKSxjLnRyaWdnZXIucmVtb3ZlKCksYi5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLnVuYmluZCgia2V5ZG93biIsdGhpcy5fZG9LZXlEb3duKS51bmJpbmQoImtleXByZXNzIix0aGlzLl9kb0tleVByZXNzKS51bmJpbmQoImtleXVwIix0aGlzLl9kb0tleVVwKSk6KGQ9PSJkaXYifHxkPT0ic3BhbiIpJiZiLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5lbXB0eSgpfSxfZW5hYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihkPT0iaW5wdXQiKWEuZGlzYWJsZWQ9ITEsYy50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITF9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMS4wIixjdXJzb3I6IiJ9KTtlbHNlIGlmKGQ9PSJkaXYifHxkPT0ic3BhbiIpe3ZhciBlPWIuY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKTtlLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksZS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnJlbW92ZUF0dHIoImRpc2FibGVkIil9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oYil7cmV0dXJuIGI9PWE/bnVsbDpifSl9LF9kaXNhYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihkPT0iaW5wdXQiKWEuZGlzYWJsZWQ9ITAsYy50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITB9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMC41IixjdXJzb3I6ImRlZmF1bHQifSk7ZWxzZSBpZihkPT0iZGl2Inx8ZD09InNwYW4iKXt2YXIgZT1iLmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcyk7ZS5jaGlsZHJlbigpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLGUuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIil9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oYil7cmV0dXJuIGI9PWE/bnVsbDpifSksdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT1hfSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7Zm9yKHZhciBiPTA7Yjx0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg7YisrKWlmKHRoaXMuX2Rpc2FibGVkSW5wdXRzW2JdPT1hKXJldHVybiEwO3JldHVybiExfSxfZ2V0SW5zdDpmdW5jdGlvbihhKXt0cnl7cmV0dXJuICQuZGF0YShhLFBST1BfTkFNRSl9Y2F0Y2goYil7dGhyb3ciTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuX2dldEluc3QoYSk7aWYoYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIGI9PSJzdHJpbmciKXJldHVybiBiPT0iZGVmYXVsdHMiPyQuZXh0ZW5kKHt9LCQuZGF0ZXBpY2tlci5fZGVmYXVsdHMpOmQ/Yj09ImFsbCI/JC5leHRlbmQoe30sZC5zZXR0aW5ncyk6dGhpcy5fZ2V0KGQsYik6bnVsbDt2YXIgZT1ifHx7fTt0eXBlb2YgYj09InN0cmluZyImJihlPXt9LGVbYl09Yyk7aWYoZCl7dGhpcy5fY3VySW5zdD09ZCYmdGhpcy5faGlkZURhdGVwaWNrZXIoKTt2YXIgZj10aGlzLl9nZXREYXRlRGF0ZXBpY2tlcihhLCEwKSxnPXRoaXMuX2dldE1pbk1heERhdGUoZCwibWluIiksaD10aGlzLl9nZXRNaW5NYXhEYXRlKGQsIm1heCIpO2V4dGVuZFJlbW92ZShkLnNldHRpbmdzLGUpLGchPT1udWxsJiZlLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmUubWluRGF0ZT09PXVuZGVmaW5lZCYmKGQuc2V0dGluZ3MubWluRGF0ZT10aGlzLl9mb3JtYXREYXRlKGQsZykpLGghPT1udWxsJiZlLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmUubWF4RGF0ZT09PXVuZGVmaW5lZCYmKGQuc2V0dGluZ3MubWF4RGF0ZT10aGlzLl9mb3JtYXREYXRlKGQsaCkpLHRoaXMuX2F0dGFjaG1lbnRzKCQoYSksZCksdGhpcy5fYXV0b1NpemUoZCksdGhpcy5fc2V0RGF0ZShkLGYpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShkKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGQpfX0sX2NoYW5nZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX29wdGlvbkRhdGVwaWNrZXIoYSxiLGMpfSxfcmVmcmVzaERhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0SW5zdChhKTtiJiZ0aGlzLl91cGRhdGVEYXRlcGlja2VyKGIpfSxfc2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRJbnN0KGEpO2MmJih0aGlzLl9zZXREYXRlKGMsYiksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihjKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoYykpfSxfZ2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRJbnN0KGEpO3JldHVybiBjJiYhYy5pbmxpbmUmJnRoaXMuX3NldERhdGVGcm9tRmllbGQoYyxiKSxjP3RoaXMuX2dldERhdGUoYyk6bnVsbH0sX2RvS2V5RG93bjpmdW5jdGlvbihhKXt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYS50YXJnZXQpLGM9ITAsZD1iLmRwRGl2LmlzKCIudWktZGF0ZXBpY2tlci1ydGwiKTtiLl9rZXlFdmVudD0hMDtpZigkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nKXN3aXRjaChhLmtleUNvZGUpe2Nhc2UgOTokLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksYz0hMTticmVhaztjYXNlIDEzOnZhciBlPSQoInRkLiIrJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MrIjpub3QoLiIrJC5kYXRlcGlja2VyLl9jdXJyZW50Q2xhc3MrIikiLGIuZHBEaXYpO2VbMF0mJiQuZGF0ZXBpY2tlci5fc2VsZWN0RGF5KGEudGFyZ2V0LGIuc2VsZWN0ZWRNb250aCxiLnNlbGVjdGVkWWVhcixlWzBdKTt2YXIgZj0kLmRhdGVwaWNrZXIuX2dldChiLCJvblNlbGVjdCIpO2lmKGYpe3ZhciBnPSQuZGF0ZXBpY2tlci5fZm9ybWF0RGF0ZShiKTtmLmFwcGx5KGIuaW5wdXQ/Yi5pbnB1dFswXTpudWxsLFtnLGJdKX1lbHNlICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTtyZXR1cm4hMTtjYXNlIDI3OiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTticmVhaztjYXNlIDMzOiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNDokLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsYS5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzU6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9jbGVhckRhdGUoYS50YXJnZXQpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXk7YnJlYWs7Y2FzZSAzNjooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShhLnRhcmdldCksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztjYXNlIDM3OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxkPzE6LTEsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5LGEub3JpZ2luYWxFdmVudC5hbHRLZXkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzODooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsLTcsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzk6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGQ/LTE6MSwiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXksYS5vcmlnaW5hbEV2ZW50LmFsdEtleSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8rJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOiskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDQwOihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCw3LCJEIiksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztkZWZhdWx0OmM9ITF9ZWxzZSBhLmtleUNvZGU9PTM2JiZhLmN0cmxLZXk/JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTpjPSExO2MmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSl9LF9kb0tleVByZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCk7aWYoJC5kYXRlcGlja2VyLl9nZXQoYiwiY29uc3RyYWluSW5wdXQiKSl7dmFyIGM9JC5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKCQuZGF0ZXBpY2tlci5fZ2V0KGIsImRhdGVGb3JtYXQiKSksZD1TdHJpbmcuZnJvbUNoYXJDb2RlKGEuY2hhckNvZGU9PXVuZGVmaW5lZD9hLmtleUNvZGU6YS5jaGFyQ29kZSk7cmV0dXJuIGEuY3RybEtleXx8YS5tZXRhS2V5fHxkPCIgInx8IWN8fGMuaW5kZXhPZihkKT4tMX19LF9kb0tleVVwOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCk7aWYoYi5pbnB1dC52YWwoKSE9Yi5sYXN0VmFsKXRyeXt2YXIgYz0kLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGIsImRhdGVGb3JtYXQiKSxiLmlucHV0P2IuaW5wdXQudmFsKCk6bnVsbCwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhiKSk7YyYmKCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChiKSwkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZShiKSwkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoYikpfWNhdGNoKGQpeyQuZGF0ZXBpY2tlci5sb2coZCl9cmV0dXJuITB9LF9zaG93RGF0ZXBpY2tlcjpmdW5jdGlvbihhKXthPWEudGFyZ2V0fHxhLGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9ImlucHV0IiYmKGE9JCgiaW5wdXQiLGEucGFyZW50Tm9kZSlbMF0pO2lmKCQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoYSl8fCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT1hKXJldHVybjt2YXIgYj0kLmRhdGVwaWNrZXIuX2dldEluc3QoYSk7JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPWImJigkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCghMCwhMCksYiYmJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0pKTt2YXIgYz0kLmRhdGVwaWNrZXIuX2dldChiLCJiZWZvcmVTaG93IiksZD1jP2MuYXBwbHkoYSxbYSxiXSk6e307aWYoZD09PSExKXJldHVybjtleHRlbmRSZW1vdmUoYi5zZXR0aW5ncyxkKSxiLmxhc3RWYWw9bnVsbCwkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD1hLCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChiKSwkLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYoYS52YWx1ZT0iIiksJC5kYXRlcGlja2VyLl9wb3N8fCgkLmRhdGVwaWNrZXIuX3Bvcz0kLmRhdGVwaWNrZXIuX2ZpbmRQb3MoYSksJC5kYXRlcGlja2VyLl9wb3NbMV0rPWEub2Zmc2V0SGVpZ2h0KTt2YXIgZT0hMTskKGEpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIGV8PSQodGhpcykuY3NzKCJwb3NpdGlvbiIpPT0iZml4ZWQiLCFlfSksZSYmJC5icm93c2VyLm9wZXJhJiYoJC5kYXRlcGlja2VyLl9wb3NbMF0tPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LCQuZGF0ZXBpY2tlci5fcG9zWzFdLT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKTt2YXIgZj17bGVmdDokLmRhdGVwaWNrZXIuX3Bvc1swXSx0b3A6JC5kYXRlcGlja2VyLl9wb3NbMV19OyQuZGF0ZXBpY2tlci5fcG9zPW51bGwsYi5kcERpdi5lbXB0eSgpLGIuZHBEaXYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6ImJsb2NrIix0b3A6Ii0xMDAwcHgifSksJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGIpLGY9JC5kYXRlcGlja2VyLl9jaGVja09mZnNldChiLGYsZSksYi5kcERpdi5jc3Moe3Bvc2l0aW9uOiQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJiQuYmxvY2tVST8ic3RhdGljIjplPyJmaXhlZCI6ImFic29sdXRlIixkaXNwbGF5OiJub25lIixsZWZ0OmYubGVmdCsicHgiLHRvcDpmLnRvcCsicHgifSk7aWYoIWIuaW5saW5lKXt2YXIgZz0kLmRhdGVwaWNrZXIuX2dldChiLCJzaG93QW5pbSIpLGg9JC5kYXRlcGlja2VyLl9nZXQoYiwiZHVyYXRpb24iKSxpPWZ1bmN0aW9uKCl7dmFyIGE9Yi5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpO2lmKCEhYS5sZW5ndGgpe3ZhciBjPSQuZGF0ZXBpY2tlci5fZ2V0Qm9yZGVycyhiLmRwRGl2KTthLmNzcyh7bGVmdDotY1swXSx0b3A6LWNbMV0sd2lkdGg6Yi5kcERpdi5vdXRlcldpZHRoKCksaGVpZ2h0OmIuZHBEaXYub3V0ZXJIZWlnaHQoKX0pfX07Yi5kcERpdi56SW5kZXgoJChhKS56SW5kZXgoKSsxKSwkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nPSEwLCQuZWZmZWN0cyYmJC5lZmZlY3RzW2ddP2IuZHBEaXYuc2hvdyhnLCQuZGF0ZXBpY2tlci5fZ2V0KGIsInNob3dPcHRpb25zIiksaCxpKTpiLmRwRGl2W2d8fCJzaG93Il0oZz9oOm51bGwsaSksKCFnfHwhaCkmJmkoKSxiLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhYi5pbnB1dC5pcygiOmRpc2FibGVkIikmJmIuaW5wdXQuZm9jdXMoKSwkLmRhdGVwaWNrZXIuX2N1ckluc3Q9Yn19LF91cGRhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7Yi5tYXhSb3dzPTQ7dmFyIGM9JC5kYXRlcGlja2VyLl9nZXRCb3JkZXJzKGEuZHBEaXYpO2luc3RBY3RpdmU9YSxhLmRwRGl2LmVtcHR5KCkuYXBwZW5kKHRoaXMuX2dlbmVyYXRlSFRNTChhKSksdGhpcy5fYXR0YWNoSGFuZGxlcnMoYSk7dmFyIGQ9YS5kcERpdi5maW5kKCJpZnJhbWUudWktZGF0ZXBpY2tlci1jb3ZlciIpOyFkLmxlbmd0aHx8ZC5jc3Moe2xlZnQ6LWNbMF0sdG9wOi1jWzFdLHdpZHRoOmEuZHBEaXYub3V0ZXJXaWR0aCgpLGhlaWdodDphLmRwRGl2Lm91dGVySGVpZ2h0KCl9KSxhLmRwRGl2LmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKS5tb3VzZW92ZXIoKTt2YXIgZT10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhhKSxmPWVbMV0sZz0xNzthLmRwRGl2LnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCIpLndpZHRoKCIiKSxmPjEmJmEuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIitmKS5jc3MoIndpZHRoIixnKmYrImVtIiksYS5kcERpdlsoZVswXSE9MXx8ZVsxXSE9MT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItbXVsdGkiKSxhLmRwRGl2Wyh0aGlzLl9nZXQoYSwiaXNSVEwiKT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIiksYT09JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZhLmlucHV0JiZhLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhYS5pbnB1dC5pcygiOmRpc2FibGVkIikmJmEuaW5wdXRbMF0hPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmEuaW5wdXQuZm9jdXMoKTtpZihhLnllYXJzaHRtbCl7dmFyIGg9YS55ZWFyc2h0bWw7c2V0VGltZW91dChmdW5jdGlvbigpe2g9PT1hLnllYXJzaHRtbCYmYS55ZWFyc2h0bWwmJmEuZHBEaXYuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCIpLnJlcGxhY2VXaXRoKGEueWVhcnNodG1sKSxoPWEueWVhcnNodG1sPW51bGx9LDApfX0sX2dldEJvcmRlcnM6ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oYSl7cmV0dXJue3RoaW46MSxtZWRpdW06Mix0aGljazozfVthXXx8YX07cmV0dXJuW3BhcnNlRmxvYXQoYihhLmNzcygiYm9yZGVyLWxlZnQtd2lkdGgiKSkpLHBhcnNlRmxvYXQoYihhLmNzcygiYm9yZGVyLXRvcC13aWR0aCIpKSldfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZHBEaXYub3V0ZXJXaWR0aCgpLGU9YS5kcERpdi5vdXRlckhlaWdodCgpLGY9YS5pbnB1dD9hLmlucHV0Lm91dGVyV2lkdGgoKTowLGc9YS5pbnB1dD9hLmlucHV0Lm91dGVySGVpZ2h0KCk6MCxoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsoYz8wOiQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhjPzA6JChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiBiLmxlZnQtPXRoaXMuX2dldChhLCJpc1JUTCIpP2QtZjowLGIubGVmdC09YyYmYi5sZWZ0PT1hLmlucHV0Lm9mZnNldCgpLmxlZnQ/JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpOjAsYi50b3AtPWMmJmIudG9wPT1hLmlucHV0Lm9mZnNldCgpLnRvcCtnPyQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOjAsYi5sZWZ0LT1NYXRoLm1pbihiLmxlZnQsYi5sZWZ0K2Q+aCYmaD5kP01hdGguYWJzKGIubGVmdCtkLWgpOjApLGIudG9wLT1NYXRoLm1pbihiLnRvcCxiLnRvcCtlPmkmJmk+ZT9NYXRoLmFicyhlK2cpOjApLGJ9LF9maW5kUG9zOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldEluc3QoYSksYz10aGlzLl9nZXQoYiwiaXNSVEwiKTt3aGlsZShhJiYoYS50eXBlPT0iaGlkZGVuInx8YS5ub2RlVHlwZSE9MXx8JC5leHByLmZpbHRlcnMuaGlkZGVuKGEpKSlhPWFbYz8icHJldmlvdXNTaWJsaW5nIjoibmV4dFNpYmxpbmciXTt2YXIgZD0kKGEpLm9mZnNldCgpO3JldHVybltkLmxlZnQsZC50b3BdfSxfaGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY3VySW5zdDtpZighYnx8YSYmYiE9JC5kYXRhKGEsUFJPUF9OQU1FKSlyZXR1cm47aWYodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpe3ZhciBjPXRoaXMuX2dldChiLCJzaG93QW5pbSIpLGQ9dGhpcy5fZ2V0KGIsImR1cmF0aW9uIiksZT1mdW5jdGlvbigpeyQuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhiKX07JC5lZmZlY3RzJiYkLmVmZmVjdHNbY10/Yi5kcERpdi5oaWRlKGMsJC5kYXRlcGlja2VyLl9nZXQoYiwic2hvd09wdGlvbnMiKSxkLGUpOmIuZHBEaXZbYz09InNsaWRlRG93biI/InNsaWRlVXAiOmM9PSJmYWRlSW4iPyJmYWRlT3V0IjoiaGlkZSJdKGM/ZDpudWxsLGUpLGN8fGUoKSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMTt2YXIgZj10aGlzLl9nZXQoYiwib25DbG9zZSIpO2YmJmYuYXBwbHkoYi5pbnB1dD9iLmlucHV0WzBdOm51bGwsW2IuaW5wdXQ/Yi5pbnB1dC52YWwoKToiIixiXSksdGhpcy5fbGFzdElucHV0PW51bGwsdGhpcy5faW5EaWFsb2cmJih0aGlzLl9kaWFsb2dJbnB1dC5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiMCIsdG9wOiItMTAwcHgifSksJC5ibG9ja1VJJiYoJC51bmJsb2NrVUkoKSwkKCJib2R5IikuYXBwZW5kKHRoaXMuZHBEaXYpKSksdGhpcy5faW5EaWFsb2c9ITF9fSxfdGlkeURpYWxvZzpmdW5jdGlvbihhKXthLmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS51bmJpbmQoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIil9LF9jaGVja0V4dGVybmFsQ2xpY2s6ZnVuY3Rpb24oYSl7aWYoISQuZGF0ZXBpY2tlci5fY3VySW5zdClyZXR1cm47dmFyIGI9JChhLnRhcmdldCksYz0kLmRhdGVwaWNrZXIuX2dldEluc3QoYlswXSk7KGJbMF0uaWQhPSQuZGF0ZXBpY2tlci5fbWFpbkRpdklkJiZiLnBhcmVudHMoIiMiKyQuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGg9PTAmJiFiLmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhYi5jbG9zZXN0KCIuIiskLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykubGVuZ3RoJiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYoISQuZGF0ZXBpY2tlci5faW5EaWFsb2d8fCEkLmJsb2NrVUkpfHxiLmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPWMpJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LF9hZGp1c3REYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0kKGEpLGU9dGhpcy5fZ2V0SW5zdChkWzBdKTtpZih0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihkWzBdKSlyZXR1cm47dGhpcy5fYWRqdXN0SW5zdERhdGUoZSxiKyhjPT0iTSI/dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKTowKSxjKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGUpfSxfZ290b1RvZGF5OmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz10aGlzLl9nZXRJbnN0KGJbMF0pO2lmKHRoaXMuX2dldChjLCJnb3RvQ3VycmVudCIpJiZjLmN1cnJlbnREYXkpYy5zZWxlY3RlZERheT1jLmN1cnJlbnREYXksYy5kcmF3TW9udGg9Yy5zZWxlY3RlZE1vbnRoPWMuY3VycmVudE1vbnRoLGMuZHJhd1llYXI9Yy5zZWxlY3RlZFllYXI9Yy5jdXJyZW50WWVhcjtlbHNle3ZhciBkPW5ldyBEYXRlO2Muc2VsZWN0ZWREYXk9ZC5nZXREYXRlKCksYy5kcmF3TW9udGg9Yy5zZWxlY3RlZE1vbnRoPWQuZ2V0TW9udGgoKSxjLmRyYXdZZWFyPWMuc2VsZWN0ZWRZZWFyPWQuZ2V0RnVsbFllYXIoKX10aGlzLl9ub3RpZnlDaGFuZ2UoYyksdGhpcy5fYWRqdXN0RGF0ZShiKX0sX3NlbGVjdE1vbnRoWWVhcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9JChhKSxlPXRoaXMuX2dldEluc3QoZFswXSk7ZVsic2VsZWN0ZWQiKyhjPT0iTSI/Ik1vbnRoIjoiWWVhciIpXT1lWyJkcmF3IisoYz09Ik0iPyJNb250aCI6IlllYXIiKV09cGFyc2VJbnQoYi5vcHRpb25zW2Iuc2VsZWN0ZWRJbmRleF0udmFsdWUsMTApLHRoaXMuX25vdGlmeUNoYW5nZShlKSx0aGlzLl9hZGp1c3REYXRlKGQpfSxfc2VsZWN0RGF5OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPSQoYSk7aWYoJChkKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGVbMF0pKXJldHVybjt2YXIgZj10aGlzLl9nZXRJbnN0KGVbMF0pO2Yuc2VsZWN0ZWREYXk9Zi5jdXJyZW50RGF5PSQoImEiLGQpLmh0bWwoKSxmLnNlbGVjdGVkTW9udGg9Zi5jdXJyZW50TW9udGg9YixmLnNlbGVjdGVkWWVhcj1mLmN1cnJlbnRZZWFyPWMsdGhpcy5fc2VsZWN0RGF0ZShhLHRoaXMuX2Zvcm1hdERhdGUoZixmLmN1cnJlbnREYXksZi5jdXJyZW50TW9udGgsZi5jdXJyZW50WWVhcikpfSxfY2xlYXJEYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz10aGlzLl9nZXRJbnN0KGJbMF0pO3RoaXMuX3NlbGVjdERhdGUoYiwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKSxkPXRoaXMuX2dldEluc3QoY1swXSk7Yj1iIT1udWxsP2I6dGhpcy5fZm9ybWF0RGF0ZShkKSxkLmlucHV0JiZkLmlucHV0LnZhbChiKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoZCk7dmFyIGU9dGhpcy5fZ2V0KGQsIm9uU2VsZWN0Iik7ZT9lLmFwcGx5KGQuaW5wdXQ/ZC5pbnB1dFswXTpudWxsLFtiLGRdKTpkLmlucHV0JiZkLmlucHV0LnRyaWdnZXIoImNoYW5nZSIpLGQuaW5saW5lP3RoaXMuX3VwZGF0ZURhdGVwaWNrZXIoZCk6KHRoaXMuX2hpZGVEYXRlcGlja2VyKCksdGhpcy5fbGFzdElucHV0PWQuaW5wdXRbMF0sdHlwZW9mIGQuaW5wdXRbMF0hPSJvYmplY3QiJiZkLmlucHV0LmZvY3VzKCksdGhpcy5fbGFzdElucHV0PW51bGwpfSxfdXBkYXRlQWx0ZXJuYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJhbHRGaWVsZCIpO2lmKGIpe3ZhciBjPXRoaXMuX2dldChhLCJhbHRGb3JtYXQiKXx8dGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKSxkPXRoaXMuX2dldERhdGUoYSksZT10aGlzLmZvcm1hdERhdGUoYyxkLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSk7JChiKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS52YWwoZSl9KX19LG5vV2Vla2VuZHM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXREYXkoKTtyZXR1cm5bYj4wJiZiPDYsIiJdfSxpc284NjAxV2VlazpmdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZShhLmdldFRpbWUoKSk7Yi5zZXREYXRlKGIuZ2V0RGF0ZSgpKzQtKGIuZ2V0RGF5KCl8fDcpKTt2YXIgYz1iLmdldFRpbWUoKTtyZXR1cm4gYi5zZXRNb250aCgwKSxiLnNldERhdGUoMSksTWF0aC5mbG9vcihNYXRoLnJvdW5kKChjLWIpLzg2NGU1KS83KSsxfSxwYXJzZURhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGx8fGI9PW51bGwpdGhyb3ciSW52YWxpZCBhcmd1bWVudHMiO2I9dHlwZW9mIGI9PSJvYmplY3QiP2IudG9TdHJpbmcoKTpiKyIiO2lmKGI9PSIiKXJldHVybiBudWxsO3ZhciBkPShjP2Muc2hvcnRZZWFyQ3V0b2ZmOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmY7ZD10eXBlb2YgZCE9InN0cmluZyI/ZDoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGQsMTApO3ZhciBlPShjP2MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxmPShjP2MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLGc9KGM/Yy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxoPShjP2MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxpPS0xLGo9LTEsaz0tMSxsPS0xLG09ITEsbj1mdW5jdGlvbihiKXt2YXIgYz1zKzE8YS5sZW5ndGgmJmEuY2hhckF0KHMrMSk9PWI7cmV0dXJuIGMmJnMrKyxjfSxvPWZ1bmN0aW9uKGEpe3ZhciBjPW4oYSksZD1hPT0iQCI/MTQ6YT09IiEiPzIwOmE9PSJ5IiYmYz80OmE9PSJvIj8zOjIsZT1uZXcgUmVnRXhwKCJeXFxkezEsIitkKyJ9IiksZj1iLnN1YnN0cmluZyhyKS5tYXRjaChlKTtpZighZil0aHJvdyJNaXNzaW5nIG51bWJlciBhdCBwb3NpdGlvbiAiK3I7cmV0dXJuIHIrPWZbMF0ubGVuZ3RoLHBhcnNlSW50KGZbMF0sMTApfSxwPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT0kLm1hcChuKGEpP2Q6YyxmdW5jdGlvbihhLGIpe3JldHVybltbYixhXV19KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuLShhWzFdLmxlbmd0aC1iWzFdLmxlbmd0aCl9KSxmPS0xOyQuZWFjaChlLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y1sxXTtpZihiLnN1YnN0cihyLGQubGVuZ3RoKS50b0xvd2VyQ2FzZSgpPT1kLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGY9Y1swXSxyKz1kLmxlbmd0aCwhMX0pO2lmKGYhPS0xKXJldHVybiBmKzE7dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIrcn0scT1mdW5jdGlvbigpe2lmKGIuY2hhckF0KHIpIT1hLmNoYXJBdChzKSl0aHJvdyJVbmV4cGVjdGVkIGxpdGVyYWwgYXQgcG9zaXRpb24gIityO3IrK30scj0wO2Zvcih2YXIgcz0wO3M8YS5sZW5ndGg7cysrKWlmKG0pYS5jaGFyQXQocyk9PSInIiYmIW4oIiciKT9tPSExOnEoKTtlbHNlIHN3aXRjaChhLmNoYXJBdChzKSl7Y2FzZSJkIjprPW8oImQiKTticmVhaztjYXNlIkQiOnAoIkQiLGUsZik7YnJlYWs7Y2FzZSJvIjpsPW8oIm8iKTticmVhaztjYXNlIm0iOmo9bygibSIpO2JyZWFrO2Nhc2UiTSI6aj1wKCJNIixnLGgpO2JyZWFrO2Nhc2UieSI6aT1vKCJ5Iik7YnJlYWs7Y2FzZSJAIjp2YXIgdD1uZXcgRGF0ZShvKCJAIikpO2k9dC5nZXRGdWxsWWVhcigpLGo9dC5nZXRNb250aCgpKzEsaz10LmdldERhdGUoKTticmVhaztjYXNlIiEiOnZhciB0PW5ldyBEYXRlKChvKCIhIiktdGhpcy5fdGlja3NUbzE5NzApLzFlNCk7aT10LmdldEZ1bGxZZWFyKCksaj10LmdldE1vbnRoKCkrMSxrPXQuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiJyI6bigiJyIpP3EoKTptPSEwO2JyZWFrO2RlZmF1bHQ6cSgpfWlmKHI8Yi5sZW5ndGgpdGhyb3ciRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiK2Iuc3Vic3RyaW5nKHIpO2k9PS0xP2k9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOmk8MTAwJiYoaSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKGk8PWQ/MDotMTAwKSk7aWYobD4tMSl7aj0xLGs9bDtkb3t2YXIgdT10aGlzLl9nZXREYXlzSW5Nb250aChpLGotMSk7aWYoazw9dSlicmVhaztqKyssay09dX13aGlsZSghMCl9dmFyIHQ9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaSxqLTEsaykpO2lmKHQuZ2V0RnVsbFllYXIoKSE9aXx8dC5nZXRNb250aCgpKzEhPWp8fHQuZ2V0RGF0ZSgpIT1rKXRocm93IkludmFsaWQgZGF0ZSI7cmV0dXJuIHR9LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElDS1M6IiEiLFRJTUVTVEFNUDoiQCIsVzNDOiJ5eS1tbS1kZCIsX3RpY2tzVG8xOTcwOig3MTg2ODUrTWF0aC5mbG9vcig0OTIuNSktTWF0aC5mbG9vcigxOS43KStNYXRoLmZsb29yKDQuOTI1KSkqMjQqNjAqNjAqMWU3LGZvcm1hdERhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKCFiKXJldHVybiIiO3ZhciBkPShjP2MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxlPShjP2MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLGY9KGM/Yy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxnPShjP2MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxoPWZ1bmN0aW9uKGIpe3ZhciBjPW0rMTxhLmxlbmd0aCYmYS5jaGFyQXQobSsxKT09YjtyZXR1cm4gYyYmbSsrLGN9LGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIiK2I7aWYoaChhKSl3aGlsZShkLmxlbmd0aDxjKWQ9IjAiK2Q7cmV0dXJuIGR9LGo9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGgoYSk/ZFtiXTpjW2JdfSxrPSIiLGw9ITE7aWYoYilmb3IodmFyIG09MDttPGEubGVuZ3RoO20rKylpZihsKWEuY2hhckF0KG0pPT0iJyImJiFoKCInIik/bD0hMTprKz1hLmNoYXJBdChtKTtlbHNlIHN3aXRjaChhLmNoYXJBdChtKSl7Y2FzZSJkIjprKz1pKCJkIixiLmdldERhdGUoKSwyKTticmVhaztjYXNlIkQiOmsrPWooIkQiLGIuZ2V0RGF5KCksZCxlKTticmVhaztjYXNlIm8iOmsrPWkoIm8iLE1hdGgucm91bmQoKChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSkuZ2V0VGltZSgpLShuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksMCwwKSkuZ2V0VGltZSgpKS84NjRlNSksMyk7YnJlYWs7Y2FzZSJtIjprKz1pKCJtIixiLmdldE1vbnRoKCkrMSwyKTticmVhaztjYXNlIk0iOmsrPWooIk0iLGIuZ2V0TW9udGgoKSxmLGcpO2JyZWFrO2Nhc2UieSI6ays9aCgieSIpP2IuZ2V0RnVsbFllYXIoKTooYi5nZXRZZWFyKCklMTAwPDEwPyIwIjoiIikrYi5nZXRZZWFyKCklMTAwO2JyZWFrO2Nhc2UiQCI6ays9Yi5nZXRUaW1lKCk7YnJlYWs7Y2FzZSIhIjprKz1iLmdldFRpbWUoKSoxZTQrdGhpcy5fdGlja3NUbzE5NzA7YnJlYWs7Y2FzZSInIjpoKCInIik/ays9IiciOmw9ITA7YnJlYWs7ZGVmYXVsdDprKz1hLmNoYXJBdChtKX1yZXR1cm4ga30sX3Bvc3NpYmxlQ2hhcnM6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0hMSxkPWZ1bmN0aW9uKGIpe3ZhciBjPWUrMTxhLmxlbmd0aCYmYS5jaGFyQXQoZSsxKT09YjtyZXR1cm4gYyYmZSsrLGN9O2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGMpYS5jaGFyQXQoZSk9PSInIiYmIWQoIiciKT9jPSExOmIrPWEuY2hhckF0KGUpO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KGUpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOmIrPSIwMTIzNDU2Nzg5IjticmVhaztjYXNlIkQiOmNhc2UiTSI6cmV0dXJuIG51bGw7Y2FzZSInIjpkKCInIik/Yis9IiciOmM9ITA7YnJlYWs7ZGVmYXVsdDpiKz1hLmNoYXJBdChlKX1yZXR1cm4gYn0sX2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnNldHRpbmdzW2JdIT09dW5kZWZpbmVkP2Euc2V0dGluZ3NbYl06dGhpcy5fZGVmYXVsdHNbYl19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGEsYil7aWYoYS5pbnB1dC52YWwoKT09YS5sYXN0VmFsKXJldHVybjt2YXIgYz10aGlzLl9nZXQoYSwiZGF0ZUZvcm1hdCIpLGQ9YS5sYXN0VmFsPWEuaW5wdXQ/YS5pbnB1dC52YWwoKTpudWxsLGUsZjtlPWY9dGhpcy5fZ2V0RGVmYXVsdERhdGUoYSk7dmFyIGc9dGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpO3RyeXtlPXRoaXMucGFyc2VEYXRlKGMsZCxnKXx8Zn1jYXRjaChoKXt0aGlzLmxvZyhoKSxkPWI/IiI6ZH1hLnNlbGVjdGVkRGF5PWUuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1lLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1lLmdldEZ1bGxZZWFyKCksYS5jdXJyZW50RGF5PWQ/ZS5nZXREYXRlKCk6MCxhLmN1cnJlbnRNb250aD1kP2UuZ2V0TW9udGgoKTowLGEuY3VycmVudFllYXI9ZD9lLmdldEZ1bGxZZWFyKCk6MCx0aGlzLl9hZGp1c3RJbnN0RGF0ZShhKX0sX2dldERlZmF1bHREYXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RldGVybWluZURhdGUoYSx0aGlzLl9nZXQoYSwiZGVmYXVsdERhdGUiKSxuZXcgRGF0ZSkpfSxfZGV0ZXJtaW5lRGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGU7cmV0dXJuIGIuc2V0RGF0ZShiLmdldERhdGUoKSthKSxifSxlPWZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gJC5kYXRlcGlja2VyLnBhcnNlRGF0ZSgkLmRhdGVwaWNrZXIuX2dldChhLCJkYXRlRm9ybWF0IiksYiwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhhKSl9Y2F0Y2goYyl7fXZhciBkPShiLnRvTG93ZXJDYXNlKCkubWF0Y2goL15jLyk/JC5kYXRlcGlja2VyLl9nZXREYXRlKGEpOm51bGwpfHxuZXcgRGF0ZSxlPWQuZ2V0RnVsbFllYXIoKSxmPWQuZ2V0TW9udGgoKSxnPWQuZ2V0RGF0ZSgpLGg9LyhbKy1dP1swLTldKylccyooZHxEfHd8V3xtfE18eXxZKT8vZyxpPWguZXhlYyhiKTt3aGlsZShpKXtzd2l0Y2goaVsyXXx8ImQiKXtjYXNlImQiOmNhc2UiRCI6Zys9cGFyc2VJbnQoaVsxXSwxMCk7YnJlYWs7Y2FzZSJ3IjpjYXNlIlciOmcrPXBhcnNlSW50KGlbMV0sMTApKjc7YnJlYWs7Y2FzZSJtIjpjYXNlIk0iOmYrPXBhcnNlSW50KGlbMV0sMTApLGc9TWF0aC5taW4oZywkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGUsZikpO2JyZWFrO2Nhc2UieSI6Y2FzZSJZIjplKz1wYXJzZUludChpWzFdLDEwKSxnPU1hdGgubWluKGcsJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChlLGYpKX1pPWguZXhlYyhiKX1yZXR1cm4gbmV3IERhdGUoZSxmLGcpfSxmPWI9PW51bGx8fGI9PT0iIj9jOnR5cGVvZiBiPT0ic3RyaW5nIj9lKGIpOnR5cGVvZiBiPT0ibnVtYmVyIj9pc05hTihiKT9jOmQoYik6bmV3IERhdGUoYi5nZXRUaW1lKCkpO3JldHVybiBmPWYmJmYudG9TdHJpbmcoKT09IkludmFsaWQgRGF0ZSI/YzpmLGYmJihmLnNldEhvdXJzKDApLGYuc2V0TWludXRlcygwKSxmLnNldFNlY29uZHMoMCksZi5zZXRNaWxsaXNlY29uZHMoMCkpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KGYpfSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/KGEuc2V0SG91cnMoYS5nZXRIb3VycygpPjEyP2EuZ2V0SG91cnMoKSsyOjApLGEpOm51bGx9LF9zZXREYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0hYixlPWEuc2VsZWN0ZWRNb250aCxmPWEuc2VsZWN0ZWRZZWFyLGc9dGhpcy5fcmVzdHJpY3RNaW5NYXgoYSx0aGlzLl9kZXRlcm1pbmVEYXRlKGEsYixuZXcgRGF0ZSkpO2Euc2VsZWN0ZWREYXk9YS5jdXJyZW50RGF5PWcuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1hLmN1cnJlbnRNb250aD1nLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1hLmN1cnJlbnRZZWFyPWcuZ2V0RnVsbFllYXIoKSwoZSE9YS5zZWxlY3RlZE1vbnRofHxmIT1hLnNlbGVjdGVkWWVhcikmJiFjJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoYSksdGhpcy5fYWRqdXN0SW5zdERhdGUoYSksYS5pbnB1dCYmYS5pbnB1dC52YWwoZD8iIjp0aGlzLl9mb3JtYXREYXRlKGEpKX0sX2dldERhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9IWEuY3VycmVudFllYXJ8fGEuaW5wdXQmJmEuaW5wdXQudmFsKCk9PSIiP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYS5jdXJyZW50WWVhcixhLmN1cnJlbnRNb250aCxhLmN1cnJlbnREYXkpKTtyZXR1cm4gYn0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJzdGVwTW9udGhzIiksYz0iIyIrYS5pZC5yZXBsYWNlKC9cXFxcL2csIlxcIik7YS5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbigpe3ZhciBhPXtwcmV2OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYywtYiwiTSIpfSxuZXh0OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYywrYiwiTSIpfSxoaWRlOmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7d2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShjKX0sc2VsZWN0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3REYXkoYywrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9udGgiKSwrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLHRoaXMpLCExfSxzZWxlY3RNb250aDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKGMsdGhpcywiTSIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoYyx0aGlzLCJZIiksITF9fTskKHRoaXMpLmJpbmQodGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtZXZlbnQiKSxhW3RoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWhhbmRsZXIiKV0pfSl9LF9nZW5lcmF0ZUhUTUw6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGU7Yj10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSk7dmFyIGM9dGhpcy5fZ2V0KGEsImlzUlRMIiksZD10aGlzLl9nZXQoYSwic2hvd0J1dHRvblBhbmVsIiksZT10aGlzLl9nZXQoYSwiaGlkZUlmTm9QcmV2TmV4dCIpLGY9dGhpcy5fZ2V0KGEsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKSxnPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGg9dGhpcy5fZ2V0KGEsInNob3dDdXJyZW50QXRQb3MiKSxpPXRoaXMuX2dldChhLCJzdGVwTW9udGhzIiksaj1nWzBdIT0xfHxnWzFdIT0xLGs9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoYS5jdXJyZW50RGF5P25ldyBEYXRlKGEuY3VycmVudFllYXIsYS5jdXJyZW50TW9udGgsYS5jdXJyZW50RGF5KTpuZXcgRGF0ZSg5OTk5LDksOSkpLGw9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtaW4iKSxtPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWF4Iiksbj1hLmRyYXdNb250aC1oLG89YS5kcmF3WWVhcjtuPDAmJihuKz0xMixvLS0pO2lmKG0pe3ZhciBwPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG0uZ2V0RnVsbFllYXIoKSxtLmdldE1vbnRoKCktZ1swXSpnWzFdKzEsbS5nZXREYXRlKCkpKTtwPWwmJnA8bD9sOnA7d2hpbGUodGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobyxuLDEpKT5wKW4tLSxuPDAmJihuPTExLG8tLSl9YS5kcmF3TW9udGg9bixhLmRyYXdZZWFyPW87dmFyIHE9dGhpcy5fZ2V0KGEsInByZXZUZXh0Iik7cT1mP3RoaXMuZm9ybWF0RGF0ZShxLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbi1pLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnE7dmFyIHI9dGhpcy5fY2FuQWRqdXN0TW9udGgoYSwtMSxvLG4pPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0icHJldiIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK3ErJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8iZSI6InciKSsnIj4nK3ErIjwvc3Bhbj48L2E+IjplPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3ErJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8iZSI6InciKSsnIj4nK3ErIjwvc3Bhbj48L2E+IixzPXRoaXMuX2dldChhLCJuZXh0VGV4dCIpO3M9Zj90aGlzLmZvcm1hdERhdGUocyx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4raSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTpzO3ZhciB0PXRoaXMuX2NhbkFkanVzdE1vbnRoKGEsMSxvLG4pPyc8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0ibmV4dCIgZGF0YS1ldmVudD0iY2xpY2siIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+IjplPyIiOic8YSBjbGFzcz0idWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQiIHRpdGxlPSInK3MrJyI+PHNwYW4gY2xhc3M9InVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJysoYz8idyI6ImUiKSsnIj4nK3MrIjwvc3Bhbj48L2E+Iix1PXRoaXMuX2dldChhLCJjdXJyZW50VGV4dCIpLHY9dGhpcy5fZ2V0KGEsImdvdG9DdXJyZW50IikmJmEuY3VycmVudERheT9rOmI7dT1mP3RoaXMuZm9ybWF0RGF0ZSh1LHYsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTp1O3ZhciB3PWEuaW5saW5lPyIiOic8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0iaGlkZSIgZGF0YS1ldmVudD0iY2xpY2siPicrdGhpcy5fZ2V0KGEsImNsb3NlVGV4dCIpKyI8L2J1dHRvbj4iLHg9ZD8nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Ij4nKyhjP3c6IiIpKyh0aGlzLl9pc0luUmFuZ2UoYSx2KT8nPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJ0b2RheSIgZGF0YS1ldmVudD0iY2xpY2siPicrdSsiPC9idXR0b24+IjoiIikrKGM/IiI6dykrIjwvZGl2PiI6IiIseT1wYXJzZUludCh0aGlzLl9nZXQoYSwiZmlyc3REYXkiKSwxMCk7eT1pc05hTih5KT8wOnk7dmFyIHo9dGhpcy5fZ2V0KGEsInNob3dXZWVrIiksQT10aGlzLl9nZXQoYSwiZGF5TmFtZXMiKSxCPXRoaXMuX2dldChhLCJkYXlOYW1lc1Nob3J0IiksQz10aGlzLl9nZXQoYSwiZGF5TmFtZXNNaW4iKSxEPXRoaXMuX2dldChhLCJtb250aE5hbWVzIiksRT10aGlzLl9nZXQoYSwibW9udGhOYW1lc1Nob3J0IiksRj10aGlzLl9nZXQoYSwiYmVmb3JlU2hvd0RheSIpLEc9dGhpcy5fZ2V0KGEsInNob3dPdGhlck1vbnRocyIpLEg9dGhpcy5fZ2V0KGEsInNlbGVjdE90aGVyTW9udGhzIiksST10aGlzLl9nZXQoYSwiY2FsY3VsYXRlV2VlayIpfHx0aGlzLmlzbzg2MDFXZWVrLEo9dGhpcy5fZ2V0RGVmYXVsdERhdGUoYSksSz0iIjtmb3IodmFyIEw9MDtMPGdbMF07TCsrKXt2YXIgTT0iIjt0aGlzLm1heFJvd3M9NDtmb3IodmFyIE49MDtOPGdbMV07TisrKXt2YXIgTz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sYS5zZWxlY3RlZERheSkpLFA9IiB1aS1jb3JuZXItYWxsIixRPSIiO2lmKGope1ErPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWdyb3VwJztpZihnWzFdPjEpc3dpdGNoKE4pe2Nhc2UgMDpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtZmlyc3QiLFA9IiB1aS1jb3JuZXItIisoYz8icmlnaHQiOiJsZWZ0Iik7YnJlYWs7Y2FzZSBnWzFdLTE6USs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QiLFA9IiB1aS1jb3JuZXItIisoYz8ibGVmdCI6InJpZ2h0Iik7YnJlYWs7ZGVmYXVsdDpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIixQPSIifVErPSciPid9USs9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4JytQKyciPicrKC9hbGx8bGVmdC8udGVzdChQKSYmTD09MD9jP3Q6cjoiIikrKC9hbGx8cmlnaHQvLnRlc3QoUCkmJkw9PTA/Yz9yOnQ6IiIpK3RoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGEsbixvLGwsbSxMPjB8fE4+MCxELEUpKyc8L2Rpdj48dGFibGUgY2xhc3M9InVpLWRhdGVwaWNrZXItY2FsZW5kYXIiPjx0aGVhZD4nKyI8dHI+Ijt2YXIgUj16Pyc8dGggY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1jb2wiPicrdGhpcy5fZ2V0KGEsIndlZWtIZWFkZXIiKSsiPC90aD4iOiIiO2Zvcih2YXIgUz0wO1M8NztTKyspe3ZhciBUPShTK3kpJTc7Uis9Ijx0aCIrKChTK3krNiklNz49NT8nIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstZW5kIic6IiIpKyI+IisnPHNwYW4gdGl0bGU9IicrQVtUXSsnIj4nK0NbVF0rIjwvc3Bhbj48L3RoPiJ9USs9UisiPC90cj48L3RoZWFkPjx0Ym9keT4iO3ZhciBVPXRoaXMuX2dldERheXNJbk1vbnRoKG8sbik7bz09YS5zZWxlY3RlZFllYXImJm49PWEuc2VsZWN0ZWRNb250aCYmKGEuc2VsZWN0ZWREYXk9TWF0aC5taW4oYS5zZWxlY3RlZERheSxVKSk7dmFyIFY9KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChvLG4pLXkrNyklNyxXPU1hdGguY2VpbCgoVitVKS83KSxYPWo/dGhpcy5tYXhSb3dzPlc/dGhpcy5tYXhSb3dzOlc6Vzt0aGlzLm1heFJvd3M9WDt2YXIgWT10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sMS1WKSk7Zm9yKHZhciBaPTA7WjxYO1orKyl7USs9Ijx0cj4iO3ZhciBfPXo/Jzx0ZCBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWNvbCI+Jyt0aGlzLl9nZXQoYSwiY2FsY3VsYXRlV2VlayIpKFkpKyI8L3RkPiI6IiI7Zm9yKHZhciBTPTA7Uzw3O1MrKyl7dmFyIGJhPUY/Ri5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbWV0pOlshMCwiIl0sYmI9WS5nZXRNb250aCgpIT1uLGJjPWJiJiYhSHx8IWJhWzBdfHxsJiZZPGx8fG0mJlk+bTtfKz0nPHRkIGNsYXNzPSInKygoUyt5KzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKGJiPyIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCI6IiIpKyhZLmdldFRpbWUoKT09Ty5nZXRUaW1lKCkmJm49PWEuc2VsZWN0ZWRNb250aCYmYS5fa2V5RXZlbnR8fEouZ2V0VGltZSgpPT1ZLmdldFRpbWUoKSYmSi5nZXRUaW1lKCk9PU8uZ2V0VGltZSgpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyhiYz8iICIrdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MrIiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpKyhiYiYmIUc/IiI6IiAiK2JhWzFdKyhZLmdldFRpbWUoKT09ay5nZXRUaW1lKCk/IiAiK3RoaXMuX2N1cnJlbnRDbGFzczoiIikrKFkuZ2V0VGltZSgpPT1iLmdldFRpbWUoKT8iIHVpLWRhdGVwaWNrZXItdG9kYXkiOiIiKSkrJyInKygoIWJifHxHKSYmYmFbMl0/JyB0aXRsZT0iJytiYVsyXSsnIic6IiIpKyhiYz8iIjonIGRhdGEtaGFuZGxlcj0ic2VsZWN0RGF5IiBkYXRhLWV2ZW50PSJjbGljayIgZGF0YS1tb250aD0iJytZLmdldE1vbnRoKCkrJyIgZGF0YS15ZWFyPSInK1kuZ2V0RnVsbFllYXIoKSsnIicpKyI+IisoYmImJiFHPyImI3hhMDsiOmJjPyc8c3BhbiBjbGFzcz0idWktc3RhdGUtZGVmYXVsdCI+JytZLmdldERhdGUoKSsiPC9zcGFuPiI6JzxhIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0JysoWS5nZXRUaW1lKCk9PWIuZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKFkuZ2V0VGltZSgpPT1rLmdldFRpbWUoKT8iIHVpLXN0YXRlLWFjdGl2ZSI6IiIpKyhiYj8iIHVpLXByaW9yaXR5LXNlY29uZGFyeSI6IiIpKyciIGhyZWY9IiMiPicrWS5nZXREYXRlKCkrIjwvYT4iKSsiPC90ZD4iLFkuc2V0RGF0ZShZLmdldERhdGUoKSsxKSxZPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KFkpfVErPV8rIjwvdHI+In1uKyssbj4xMSYmKG49MCxvKyspLFErPSI8L3Rib2R5PjwvdGFibGU+Iisoaj8iPC9kaXY+IisoZ1swXT4wJiZOPT1nWzFdLTE/JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItcm93LWJyZWFrIj48L2Rpdj4nOiIiKToiIiksTSs9UX1LKz1NfXJldHVybiBLKz14KygkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24sMTApPDcmJiFhLmlubGluZT8nPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBjbGFzcz0idWktZGF0ZXBpY2tlci1jb3ZlciIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPic6IiIpLGEuX2tleUV2ZW50PSExLEt9LF9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcjpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe3ZhciBpPXRoaXMuX2dldChhLCJjaGFuZ2VNb250aCIpLGo9dGhpcy5fZ2V0KGEsImNoYW5nZVllYXIiKSxrPXRoaXMuX2dldChhLCJzaG93TW9udGhBZnRlclllYXIiKSxsPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXRpdGxlIj4nLG09IiI7aWYoZnx8IWkpbSs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIj4nK2dbYl0rIjwvc3Bhbj4iO2Vsc2V7dmFyIG49ZCYmZC5nZXRGdWxsWWVhcigpPT1jLG89ZSYmZS5nZXRGdWxsWWVhcigpPT1jO20rPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIiBkYXRhLWhhbmRsZXI9InNlbGVjdE1vbnRoIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7Zm9yKHZhciBwPTA7cDwxMjtwKyspKCFufHxwPj1kLmdldE1vbnRoKCkpJiYoIW98fHA8PWUuZ2V0TW9udGgoKSkmJihtKz0nPG9wdGlvbiB2YWx1ZT0iJytwKyciJysocD09Yj8nIHNlbGVjdGVkPSJzZWxlY3RlZCInOiIiKSsiPiIraFtwXSsiPC9vcHRpb24+Iik7bSs9Ijwvc2VsZWN0PiJ9a3x8KGwrPW0rKGZ8fCFpfHwhaj8iJiN4YTA7IjoiIikpO2lmKCFhLnllYXJzaHRtbCl7YS55ZWFyc2h0bWw9IiI7aWYoZnx8IWopbCs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicrYysiPC9zcGFuPiI7ZWxzZXt2YXIgcT10aGlzLl9nZXQoYSwieWVhclJhbmdlIikuc3BsaXQoIjoiKSxyPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxzPWZ1bmN0aW9uKGEpe3ZhciBiPWEubWF0Y2goL2NbKy1dLiovKT9jK3BhcnNlSW50KGEuc3Vic3RyaW5nKDEpLDEwKTphLm1hdGNoKC9bKy1dLiovKT9yK3BhcnNlSW50KGEsMTApOnBhcnNlSW50KGEsMTApO3JldHVybiBpc05hTihiKT9yOmJ9LHQ9cyhxWzBdKSx1PU1hdGgubWF4KHQscyhxWzFdfHwiIikpO3Q9ZD9NYXRoLm1heCh0LGQuZ2V0RnVsbFllYXIoKSk6dCx1PWU/TWF0aC5taW4odSxlLmdldEZ1bGxZZWFyKCkpOnUsYS55ZWFyc2h0bWwrPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiIGRhdGEtaGFuZGxlcj0ic2VsZWN0WWVhciIgZGF0YS1ldmVudD0iY2hhbmdlIj4nO2Zvcig7dDw9dTt0KyspYS55ZWFyc2h0bWwrPSc8b3B0aW9uIHZhbHVlPSInK3QrJyInKyh0PT1jPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+Iit0KyI8L29wdGlvbj4iO2EueWVhcnNodG1sKz0iPC9zZWxlY3Q+IixsKz1hLnllYXJzaHRtbCxhLnllYXJzaHRtbD1udWxsfX1yZXR1cm4gbCs9dGhpcy5fZ2V0KGEsInllYXJTdWZmaXgiKSxrJiYobCs9KGZ8fCFpfHwhaj8iJiN4YTA7IjoiIikrbSksbCs9IjwvZGl2PiIsbH0sX2FkanVzdEluc3REYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmRyYXdZZWFyKyhjPT0iWSI/YjowKSxlPWEuZHJhd01vbnRoKyhjPT0iTSI/YjowKSxmPU1hdGgubWluKGEuc2VsZWN0ZWREYXksdGhpcy5fZ2V0RGF5c0luTW9udGgoZCxlKSkrKGM9PSJEIj9iOjApLGc9dGhpcy5fcmVzdHJpY3RNaW5NYXgoYSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLGUsZikpKTthLnNlbGVjdGVkRGF5PWcuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1nLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1nLmdldEZ1bGxZZWFyKCksKGM9PSJNInx8Yz09IlkiKSYmdGhpcy5fbm90aWZ5Q2hhbmdlKGEpfSxfcmVzdHJpY3RNaW5NYXg6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1pbiIpLGQ9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtYXgiKSxlPWMmJmI8Yz9jOmI7cmV0dXJuIGU9ZCYmZT5kP2Q6ZSxlfSxfbm90aWZ5Q2hhbmdlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJvbkNoYW5nZU1vbnRoWWVhciIpO2ImJmIuYXBwbHkoYS5pbnB1dD9hLmlucHV0WzBdOm51bGwsW2Euc2VsZWN0ZWRZZWFyLGEuc2VsZWN0ZWRNb250aCsxLGFdKX0sX2dldE51bWJlck9mTW9udGhzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJudW1iZXJPZk1vbnRocyIpO3JldHVybiBiPT1udWxsP1sxLDFdOnR5cGVvZiBiPT0ibnVtYmVyIj9bMSxiXTpifSxfZ2V0TWluTWF4RGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGEsdGhpcy5fZ2V0KGEsYisiRGF0ZSIpLG51bGwpfSxfZ2V0RGF5c0luTW9udGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMzItdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYSxiLDMyKSkuZ2V0RGF0ZSgpfSxfZ2V0Rmlyc3REYXlPZk1vbnRoOmZ1bmN0aW9uKGEsYil7cmV0dXJuKG5ldyBEYXRlKGEsYiwxKSkuZ2V0RGF5KCl9LF9jYW5BZGp1c3RNb250aDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhhKSxmPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGMsZCsoYjwwP2I6ZVswXSplWzFdKSwxKSk7cmV0dXJuIGI8MCYmZi5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGYuZ2V0RnVsbFllYXIoKSxmLmdldE1vbnRoKCkpKSx0aGlzLl9pc0luUmFuZ2UoYSxmKX0sX2lzSW5SYW5nZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWluIiksZD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1heCIpO3JldHVybighY3x8Yi5nZXRUaW1lKCk+PWMuZ2V0VGltZSgpKSYmKCFkfHxiLmdldFRpbWUoKTw9ZC5nZXRUaW1lKCkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2dldChhLCJzaG9ydFllYXJDdXRvZmYiKTtyZXR1cm4gYj10eXBlb2YgYiE9InN0cmluZyI/YjoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGIsMTApLHtzaG9ydFllYXJDdXRvZmY6YixkYXlOYW1lc1Nob3J0OnRoaXMuX2dldChhLCJkYXlOYW1lc1Nob3J0IiksZGF5TmFtZXM6dGhpcy5fZ2V0KGEsImRheU5hbWVzIiksbW9udGhOYW1lc1Nob3J0OnRoaXMuX2dldChhLCJtb250aE5hbWVzU2hvcnQiKSxtb250aE5hbWVzOnRoaXMuX2dldChhLCJtb250aE5hbWVzIil9fSxfZm9ybWF0RGF0ZTpmdW5jdGlvbihhLGIsYyxkKXtifHwoYS5jdXJyZW50RGF5PWEuc2VsZWN0ZWREYXksYS5jdXJyZW50TW9udGg9YS5zZWxlY3RlZE1vbnRoLGEuY3VycmVudFllYXI9YS5zZWxlY3RlZFllYXIpO3ZhciBlPWI/dHlwZW9mIGI9PSJvYmplY3QiP2I6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZCxjLGIpKTp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLmN1cnJlbnRZZWFyLGEuY3VycmVudE1vbnRoLGEuY3VycmVudERheSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKSxlLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSl9fSksJC5mbi5kYXRlcGlja2VyPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczskLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWR8fCgkKGRvY3VtZW50KS5tb3VzZWRvd24oJC5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spLmZpbmQoImJvZHkiKS5hcHBlbmQoJC5kYXRlcGlja2VyLmRwRGl2KSwkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITApO3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmcifHxhIT0iaXNEaXNhYmxlZCImJmEhPSJnZXREYXRlIiYmYSE9IndpZGdldCI/YT09Im9wdGlvbiImJmFyZ3VtZW50cy5sZW5ndGg9PTImJnR5cGVvZiBhcmd1bWVudHNbMV09PSJzdHJpbmciPyQuZGF0ZXBpY2tlclsiXyIrYSsiRGF0ZXBpY2tlciJdLmFwcGx5KCQuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KGIpKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt0eXBlb2YgYT09InN0cmluZyI/JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzXS5jb25jYXQoYikpOiQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLGEpfSk6JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoYikpfSwkLmRhdGVwaWNrZXI9bmV3IERhdGVwaWNrZXIsJC5kYXRlcGlja2VyLmluaXRpYWxpemVkPSExLCQuZGF0ZXBpY2tlci51dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLCQuZGF0ZXBpY2tlci52ZXJzaW9uPSIxLjguMjQiLHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXT0kfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9InVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCAiLGQ9e2J1dHRvbnM6ITAsaGVpZ2h0OiEwLG1heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITAsd2lkdGg6ITB9LGU9e21heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITB9O2Eud2lkZ2V0KCJ1aS5kaWFsb2ciLHtvcHRpb25zOnthdXRvT3BlbjohMCxidXR0b25zOnt9LGNsb3NlT25Fc2NhcGU6ITAsY2xvc2VUZXh0OiJjbG9zZSIsZGlhbG9nQ2xhc3M6IiIsZHJhZ2dhYmxlOiEwLGhpZGU6bnVsbCxoZWlnaHQ6ImF1dG8iLG1heEhlaWdodDohMSxtYXhXaWR0aDohMSxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDohMSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsY29sbGlzaW9uOiJmaXQiLHVzaW5nOmZ1bmN0aW9uKGIpe3ZhciBjPWEodGhpcykuY3NzKGIpLm9mZnNldCgpLnRvcDtjPDAmJmEodGhpcykuY3NzKCJ0b3AiLGIudG9wLWMpfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCxzdGFjazohMCx0aXRsZToiIix3aWR0aDozMDAsekluZGV4OjFlM30sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiKSx0eXBlb2YgdGhpcy5vcmlnaW5hbFRpdGxlIT0ic3RyaW5nIiYmKHRoaXMub3JpZ2luYWxUaXRsZT0iIiksdGhpcy5vcHRpb25zLnRpdGxlPXRoaXMub3B0aW9ucy50aXRsZXx8dGhpcy5vcmlnaW5hbFRpdGxlO3ZhciBiPXRoaXMsZD1iLm9wdGlvbnMsZT1kLnRpdGxlfHwiJiMxNjA7IixmPWEudWkuZGlhbG9nLmdldFRpdGxlSWQoYi5lbGVtZW50KSxnPShiLnVpRGlhbG9nPWEoIjxkaXY+PC9kaXY+IikpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmhpZGUoKS5hZGRDbGFzcyhjK2QuZGlhbG9nQ2xhc3MpLmNzcyh7ekluZGV4OmQuekluZGV4fSkuYXR0cigidGFiSW5kZXgiLC0xKS5jc3MoIm91dGxpbmUiLDApLmtleWRvd24oZnVuY3Rpb24oYyl7ZC5jbG9zZU9uRXNjYXBlJiYhYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5rZXlDb2RlJiZjLmtleUNvZGU9PT1hLnVpLmtleUNvZGUuRVNDQVBFJiYoYi5jbG9zZShjKSxjLnByZXZlbnREZWZhdWx0KCkpfSkuYXR0cih7cm9sZToiZGlhbG9nIiwiYXJpYS1sYWJlbGxlZGJ5IjpmfSkubW91c2Vkb3duKGZ1bmN0aW9uKGEpe2IubW92ZVRvVG9wKCExLGEpfSksaD1iLmVsZW1lbnQuc2hvdygpLnJlbW92ZUF0dHIoInRpdGxlIikuYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuYXBwZW5kVG8oZyksaT0oYi51aURpYWxvZ1RpdGxlYmFyPWEoIjxkaXY+PC9kaXY+IikpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1jbGVhcmZpeCIpLnByZXBlbmRUbyhnKSxqPWEoJzxhIGhyZWY9IiMiPjwvYT4nKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHVpLWNvcm5lci1hbGwiKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuaG92ZXIoZnVuY3Rpb24oKXtqLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxmdW5jdGlvbigpe2oucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2ouYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9KS5ibHVyKGZ1bmN0aW9uKCl7ai5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmNsaWNrKGZ1bmN0aW9uKGEpe3JldHVybiBiLmNsb3NlKGEpLCExfSkuYXBwZW5kVG8oaSksaz0oYi51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0PWEoIjxzcGFuPjwvc3Bhbj4iKSkuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIikudGV4dChkLmNsb3NlVGV4dCkuYXBwZW5kVG8oaiksbD1hKCI8c3Bhbj48L3NwYW4+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZSIpLmF0dHIoImlkIixmKS5odG1sKGUpLnByZXBlbmRUbyhpKTthLmlzRnVuY3Rpb24oZC5iZWZvcmVjbG9zZSkmJiFhLmlzRnVuY3Rpb24oZC5iZWZvcmVDbG9zZSkmJihkLmJlZm9yZUNsb3NlPWQuYmVmb3JlY2xvc2UpLGkuZmluZCgiKiIpLmFkZChpKS5kaXNhYmxlU2VsZWN0aW9uKCksZC5kcmFnZ2FibGUmJmEuZm4uZHJhZ2dhYmxlJiZiLl9tYWtlRHJhZ2dhYmxlKCksZC5yZXNpemFibGUmJmEuZm4ucmVzaXphYmxlJiZiLl9tYWtlUmVzaXphYmxlKCksYi5fY3JlYXRlQnV0dG9ucyhkLmJ1dHRvbnMpLGIuX2lzT3Blbj0hMSxhLmZuLmJnaWZyYW1lJiZnLmJnaWZyYW1lKCl9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmF1dG9PcGVuJiZ0aGlzLm9wZW4oKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIGEub3ZlcmxheSYmYS5vdmVybGF5LmRlc3Ryb3koKSxhLnVpRGlhbG9nLmhpZGUoKSxhLmVsZW1lbnQudW5iaW5kKCIuZGlhbG9nIikucmVtb3ZlRGF0YSgiZGlhbG9nIikucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuaGlkZSgpLmFwcGVuZFRvKCJib2R5IiksYS51aURpYWxvZy5yZW1vdmUoKSxhLm9yaWdpbmFsVGl0bGUmJmEuZWxlbWVudC5hdHRyKCJ0aXRsZSIsYS5vcmlnaW5hbFRpdGxlKSxhfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sY2xvc2U6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkLGU7aWYoITE9PT1jLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsYikpcmV0dXJuO3JldHVybiBjLm92ZXJsYXkmJmMub3ZlcmxheS5kZXN0cm95KCksYy51aURpYWxvZy51bmJpbmQoImtleXByZXNzLnVpLWRpYWxvZyIpLGMuX2lzT3Blbj0hMSxjLm9wdGlvbnMuaGlkZT9jLnVpRGlhbG9nLmhpZGUoYy5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtjLl90cmlnZ2VyKCJjbG9zZSIsYil9KTooYy51aURpYWxvZy5oaWRlKCksYy5fdHJpZ2dlcigiY2xvc2UiLGIpKSxhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpLGMub3B0aW9ucy5tb2RhbCYmKGQ9MCxhKCIudWktZGlhbG9nIikuZWFjaChmdW5jdGlvbigpe3RoaXMhPT1jLnVpRGlhbG9nWzBdJiYoZT1hKHRoaXMpLmNzcygiei1pbmRleCIpLGlzTmFOKGUpfHwoZD1NYXRoLm1heChkLGUpKSl9KSxhLnVpLmRpYWxvZy5tYXhaPWQpLGN9LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc09wZW59LG1vdmVUb1RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMsZT1kLm9wdGlvbnMsZjtyZXR1cm4gZS5tb2RhbCYmIWJ8fCFlLnN0YWNrJiYhZS5tb2RhbD9kLl90cmlnZ2VyKCJmb2N1cyIsYyk6KGUuekluZGV4PmEudWkuZGlhbG9nLm1heFomJihhLnVpLmRpYWxvZy5tYXhaPWUuekluZGV4KSxkLm92ZXJsYXkmJihhLnVpLmRpYWxvZy5tYXhaKz0xLGQub3ZlcmxheS4kZWwuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5vdmVybGF5Lm1heFo9YS51aS5kaWFsb2cubWF4WikpLGY9e3Njcm9sbFRvcDpkLmVsZW1lbnQuc2Nyb2xsVG9wKCksc2Nyb2xsTGVmdDpkLmVsZW1lbnQuc2Nyb2xsTGVmdCgpfSxhLnVpLmRpYWxvZy5tYXhaKz0xLGQudWlEaWFsb2cuY3NzKCJ6LWluZGV4IixhLnVpLmRpYWxvZy5tYXhaKSxkLmVsZW1lbnQuYXR0cihmKSxkLl90cmlnZ2VyKCJmb2N1cyIsYyksZCl9LG9wZW46ZnVuY3Rpb24oKXtpZih0aGlzLl9pc09wZW4pcmV0dXJuO3ZhciBiPXRoaXMsYz1iLm9wdGlvbnMsZD1iLnVpRGlhbG9nO3JldHVybiBiLm92ZXJsYXk9Yy5tb2RhbD9uZXcgYS51aS5kaWFsb2cub3ZlcmxheShiKTpudWxsLGIuX3NpemUoKSxiLl9wb3NpdGlvbihjLnBvc2l0aW9uKSxkLnNob3coYy5zaG93KSxiLm1vdmVUb1RvcCghMCksYy5tb2RhbCYmZC5iaW5kKCJrZXlkb3duLnVpLWRpYWxvZyIsZnVuY3Rpb24oYil7aWYoYi5rZXlDb2RlIT09YS51aS5rZXlDb2RlLlRBQilyZXR1cm47dmFyIGM9YSgiOnRhYmJhYmxlIix0aGlzKSxkPWMuZmlsdGVyKCI6Zmlyc3QiKSxlPWMuZmlsdGVyKCI6bGFzdCIpO2lmKGIudGFyZ2V0PT09ZVswXSYmIWIuc2hpZnRLZXkpcmV0dXJuIGQuZm9jdXMoMSksITE7aWYoYi50YXJnZXQ9PT1kWzBdJiZiLnNoaWZ0S2V5KXJldHVybiBlLmZvY3VzKDEpLCExfSksYShiLmVsZW1lbnQuZmluZCgiOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZmluZCgiLnVpLWRpYWxvZy1idXR0b25wYW5lIDp0YWJiYWJsZSIpLmdldCgpLmNvbmNhdChkLmdldCgpKSkpLmVxKDApLmZvY3VzKCksYi5faXNPcGVuPSEwLGIuX3RyaWdnZXIoIm9wZW4iKSxifSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9ITEsZT1hKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXgiKSxmPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zZXQiKS5hcHBlbmRUbyhlKTtjLnVpRGlhbG9nLmZpbmQoIi51aS1kaWFsb2ctYnV0dG9ucGFuZSIpLnJlbW92ZSgpLHR5cGVvZiBiPT0ib2JqZWN0IiYmYiE9PW51bGwmJmEuZWFjaChiLGZ1bmN0aW9uKCl7cmV0dXJuIShkPSEwKX0pLGQmJihhLmVhY2goYixmdW5jdGlvbihiLGQpe2Q9YS5pc0Z1bmN0aW9uKGQpP3tjbGljazpkLHRleHQ6Yn06ZDt2YXIgZT1hKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PC9idXR0b24+JykuY2xpY2soZnVuY3Rpb24oKXtkLmNsaWNrLmFwcGx5KGMuZWxlbWVudFswXSxhcmd1bWVudHMpfSkuYXBwZW5kVG8oZik7YS5lYWNoKGQsZnVuY3Rpb24oYSxiKXtpZihhPT09ImNsaWNrIilyZXR1cm47YSBpbiBlP2VbYV0oYik6ZS5hdHRyKGEsYil9KSxhLmZuLmJ1dHRvbiYmZS5idXR0b24oKX0pLGUuYXBwZW5kVG8oYy51aURpYWxvZykpfSxfbWFrZURyYWdnYWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGYoYSl7cmV0dXJue3Bvc2l0aW9uOmEucG9zaXRpb24sb2Zmc2V0OmEub2Zmc2V0fX12YXIgYj10aGlzLGM9Yi5vcHRpb25zLGQ9YShkb2N1bWVudCksZTtiLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihkLGcpe2U9Yy5oZWlnaHQ9PT0iYXV0byI/ImF1dG8iOmEodGhpcykuaGVpZ2h0KCksYSh0aGlzKS5oZWlnaHQoYSh0aGlzKS5oZWlnaHQoKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLGIuX3RyaWdnZXIoImRyYWdTdGFydCIsZCxmKGcpKX0sZHJhZzpmdW5jdGlvbihhLGMpe2IuX3RyaWdnZXIoImRyYWciLGEsZihjKSl9LHN0b3A6ZnVuY3Rpb24oZyxoKXtjLnBvc2l0aW9uPVtoLnBvc2l0aW9uLmxlZnQtZC5zY3JvbGxMZWZ0KCksaC5wb3NpdGlvbi50b3AtZC5zY3JvbGxUb3AoKV0sYSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIikuaGVpZ2h0KGUpLGIuX3RyaWdnZXIoImRyYWdTdG9wIixnLGYoaCkpLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGgoYSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246YS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTphLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjphLnBvc2l0aW9uLHNpemU6YS5zaXplfX1jPWM9PT1iP3RoaXMub3B0aW9ucy5yZXNpemFibGU6Yzt2YXIgZD10aGlzLGU9ZC5vcHRpb25zLGY9ZC51aURpYWxvZy5jc3MoInBvc2l0aW9uIiksZz10eXBlb2YgYz09InN0cmluZyI/YzoibixlLHMsdyxzZSxzdyxuZSxudyI7ZC51aURpYWxvZy5yZXNpemFibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50Iixjb250YWlubWVudDoiZG9jdW1lbnQiLGFsc29SZXNpemU6ZC5lbGVtZW50LG1heFdpZHRoOmUubWF4V2lkdGgsbWF4SGVpZ2h0OmUubWF4SGVpZ2h0LG1pbldpZHRoOmUubWluV2lkdGgsbWluSGVpZ2h0OmQuX21pbkhlaWdodCgpLGhhbmRsZXM6ZyxzdGFydDpmdW5jdGlvbihiLGMpe2EodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLGQuX3RyaWdnZXIoInJlc2l6ZVN0YXJ0IixiLGgoYykpfSxyZXNpemU6ZnVuY3Rpb24oYSxiKXtkLl90cmlnZ2VyKCJyZXNpemUiLGEsaChiKSl9LHN0b3A6ZnVuY3Rpb24oYixjKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctcmVzaXppbmciKSxlLmhlaWdodD1hKHRoaXMpLmhlaWdodCgpLGUud2lkdGg9YSh0aGlzKS53aWR0aCgpLGQuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLGIsaChjKSksYS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KS5jc3MoInBvc2l0aW9uIixmKS5maW5kKCIudWktcmVzaXphYmxlLXNlIikuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwLWRpYWdvbmFsLXNlIil9LF9taW5IZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7cmV0dXJuIGEuaGVpZ2h0PT09ImF1dG8iP2EubWluSGVpZ2h0Ok1hdGgubWluKGEubWluSGVpZ2h0LGEuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPVtdLGQ9WzAsMF0sZTtpZihiKXtpZih0eXBlb2YgYj09InN0cmluZyJ8fHR5cGVvZiBiPT0ib2JqZWN0IiYmIjAiaW4gYiljPWIuc3BsaXQ/Yi5zcGxpdCgiICIpOltiWzBdLGJbMV1dLGMubGVuZ3RoPT09MSYmKGNbMV09Y1swXSksYS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGEsYil7K2NbYV09PT1jW2FdJiYoZFthXT1jW2FdLGNbYV09Yil9KSxiPXtteTpjLmpvaW4oIiAiKSxhdDpjLmpvaW4oIiAiKSxvZmZzZXQ6ZC5qb2luKCIgIil9O2I9YS5leHRlbmQoe30sYS51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb24sYil9ZWxzZSBiPWEudWkuZGlhbG9nLnByb3RvdHlwZS5vcHRpb25zLnBvc2l0aW9uO2U9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKSxlfHx0aGlzLnVpRGlhbG9nLnNob3coKSx0aGlzLnVpRGlhbG9nLmNzcyh7dG9wOjAsbGVmdDowfSkucG9zaXRpb24oYS5leHRlbmQoe29mOndpbmRvd30sYikpLGV8fHRoaXMudWlEaWFsb2cuaGlkZSgpfSxfc2V0T3B0aW9uczpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGY9e30sZz0hMTthLmVhY2goYixmdW5jdGlvbihhLGIpe2MuX3NldE9wdGlvbihhLGIpLGEgaW4gZCYmKGc9ITApLGEgaW4gZSYmKGZbYV09Yil9KSxnJiZ0aGlzLl9zaXplKCksdGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIixmKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBlPXRoaXMsZj1lLnVpRGlhbG9nO3N3aXRjaChiKXtjYXNlImJlZm9yZWNsb3NlIjpiPSJiZWZvcmVDbG9zZSI7YnJlYWs7Y2FzZSJidXR0b25zIjplLl9jcmVhdGVCdXR0b25zKGQpO2JyZWFrO2Nhc2UiY2xvc2VUZXh0IjplLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQudGV4dCgiIitkKTticmVhaztjYXNlImRpYWxvZ0NsYXNzIjpmLnJlbW92ZUNsYXNzKGUub3B0aW9ucy5kaWFsb2dDbGFzcykuYWRkQ2xhc3MoYytkKTticmVhaztjYXNlImRpc2FibGVkIjpkP2YuYWRkQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpOmYucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1kaXNhYmxlZCIpO2JyZWFrO2Nhc2UiZHJhZ2dhYmxlIjp2YXIgZz1mLmlzKCI6ZGF0YShkcmFnZ2FibGUpIik7ZyYmIWQmJmYuZHJhZ2dhYmxlKCJkZXN0cm95IiksIWcmJmQmJmUuX21ha2VEcmFnZ2FibGUoKTticmVhaztjYXNlInBvc2l0aW9uIjplLl9wb3NpdGlvbihkKTticmVhaztjYXNlInJlc2l6YWJsZSI6dmFyIGg9Zi5pcygiOmRhdGEocmVzaXphYmxlKSIpO2gmJiFkJiZmLnJlc2l6YWJsZSgiZGVzdHJveSIpLGgmJnR5cGVvZiBkPT0ic3RyaW5nIiYmZi5yZXNpemFibGUoIm9wdGlvbiIsImhhbmRsZXMiLGQpLCFoJiZkIT09ITEmJmUuX21ha2VSZXNpemFibGUoZCk7YnJlYWs7Y2FzZSJ0aXRsZSI6YSgiLnVpLWRpYWxvZy10aXRsZSIsZS51aURpYWxvZ1RpdGxlYmFyKS5odG1sKCIiKyhkfHwiJiMxNjA7IikpfWEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KGUsYXJndW1lbnRzKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMsYyxkLGU9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKTt0aGlzLmVsZW1lbnQuc2hvdygpLmNzcyh7d2lkdGg6ImF1dG8iLG1pbkhlaWdodDowLGhlaWdodDowfSksYi5taW5XaWR0aD5iLndpZHRoJiYoYi53aWR0aD1iLm1pbldpZHRoKSxjPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOmIud2lkdGh9KS5oZWlnaHQoKSxkPU1hdGgubWF4KDAsYi5taW5IZWlnaHQtYyk7aWYoYi5oZWlnaHQ9PT0iYXV0byIpaWYoYS5zdXBwb3J0Lm1pbkhlaWdodCl0aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6ZCxoZWlnaHQ6ImF1dG8ifSk7ZWxzZXt0aGlzLnVpRGlhbG9nLnNob3coKTt2YXIgZj10aGlzLmVsZW1lbnQuY3NzKCJoZWlnaHQiLCJhdXRvIikuaGVpZ2h0KCk7ZXx8dGhpcy51aURpYWxvZy5oaWRlKCksdGhpcy5lbGVtZW50LmhlaWdodChNYXRoLm1heChmLGQpKX1lbHNlIHRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoYi5oZWlnaHQtYywwKSk7dGhpcy51aURpYWxvZy5pcygiOmRhdGEocmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9fSksYS5leHRlbmQoYS51aS5kaWFsb2cse3ZlcnNpb246IjEuOC4yNCIsdXVpZDowLG1heFo6MCxnZXRUaXRsZUlkOmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cigiaWQiKTtyZXR1cm4gYnx8KHRoaXMudXVpZCs9MSxiPXRoaXMudXVpZCksInVpLWRpYWxvZy10aXRsZS0iK2J9LG92ZXJsYXk6ZnVuY3Rpb24oYil7dGhpcy4kZWw9YS51aS5kaWFsb2cub3ZlcmxheS5jcmVhdGUoYil9fSksYS5leHRlbmQoYS51aS5kaWFsb2cub3ZlcmxheSx7aW5zdGFuY2VzOltdLG9sZEluc3RhbmNlczpbXSxtYXhaOjAsZXZlbnRzOmEubWFwKCJmb2N1cyxtb3VzZWRvd24sbW91c2V1cCxrZXlkb3duLGtleXByZXNzLGNsaWNrIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGEpe3JldHVybiBhKyIuZGlhbG9nLW92ZXJsYXkifSkuam9pbigiICIpLGNyZWF0ZTpmdW5jdGlvbihiKXt0aGlzLmluc3RhbmNlcy5sZW5ndGg9PT0wJiYoc2V0VGltZW91dChmdW5jdGlvbigpe2EudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzLmxlbmd0aCYmYShkb2N1bWVudCkuYmluZChhLnVpLmRpYWxvZy5vdmVybGF5LmV2ZW50cyxmdW5jdGlvbihiKXtpZihhKGIudGFyZ2V0KS56SW5kZXgoKTxhLnVpLmRpYWxvZy5vdmVybGF5Lm1heFopcmV0dXJuITF9KX0sMSksYShkb2N1bWVudCkuYmluZCgia2V5ZG93bi5kaWFsb2ctb3ZlcmxheSIsZnVuY3Rpb24oYyl7Yi5vcHRpb25zLmNsb3NlT25Fc2NhcGUmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLmtleUNvZGUmJmMua2V5Q29kZT09PWEudWkua2V5Q29kZS5FU0NBUEUmJihiLmNsb3NlKGMpLGMucHJldmVudERlZmF1bHQoKSl9KSxhKHdpbmRvdykuYmluZCgicmVzaXplLmRpYWxvZy1vdmVybGF5IixhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSkpO3ZhciBjPSh0aGlzLm9sZEluc3RhbmNlcy5wb3AoKXx8YSgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktd2lkZ2V0LW92ZXJsYXkiKSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuY3NzKHt3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9KTtyZXR1cm4gYS5mbi5iZ2lmcmFtZSYmYy5iZ2lmcmFtZSgpLHRoaXMuaW5zdGFuY2VzLnB1c2goYyksY30sZGVzdHJveTpmdW5jdGlvbihiKXt2YXIgYz1hLmluQXJyYXkoYix0aGlzLmluc3RhbmNlcyk7YyE9LTEmJnRoaXMub2xkSW5zdGFuY2VzLnB1c2godGhpcy5pbnN0YW5jZXMuc3BsaWNlKGMsMSlbMF0pLHRoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJmEoW2RvY3VtZW50LHdpbmRvd10pLnVuYmluZCgiLmRpYWxvZy1vdmVybGF5IiksYi5yZW1vdmUoKTt2YXIgZD0wO2EuZWFjaCh0aGlzLmluc3RhbmNlcyxmdW5jdGlvbigpe2Q9TWF0aC5tYXgoZCx0aGlzLmNzcygiei1pbmRleCIpKX0pLHRoaXMubWF4Wj1kfSxoZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgYixjO3JldHVybiBhLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248Nz8oYj1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSxjPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpLGI8Yz9hKHdpbmRvdykuaGVpZ2h0KCkrInB4IjpiKyJweCIpOmEoZG9jdW1lbnQpLmhlaWdodCgpKyJweCJ9LHdpZHRoOmZ1bmN0aW9uKCl7dmFyIGIsYztyZXR1cm4gYS5icm93c2VyLm1zaWU/KGI9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGgpLGM9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgpLGI8Yz9hKHdpbmRvdykud2lkdGgoKSsicHgiOmIrInB4Iik6YShkb2N1bWVudCkud2lkdGgoKSsicHgifSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIgYj1hKFtdKTthLmVhY2goYS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMsZnVuY3Rpb24oKXtiPWIuYWRkKHRoaXMpfSksYi5jc3Moe3dpZHRoOjAsaGVpZ2h0OjB9KS5jc3Moe3dpZHRoOmEudWkuZGlhbG9nLm92ZXJsYXkud2lkdGgoKSxoZWlnaHQ6YS51aS5kaWFsb2cub3ZlcmxheS5oZWlnaHQoKX0pfX0pLGEuZXh0ZW5kKGEudWkuZGlhbG9nLm92ZXJsYXkucHJvdG90eXBlLHtkZXN0cm95OmZ1bmN0aW9uKCl7YS51aS5kaWFsb2cub3ZlcmxheS5kZXN0cm95KHRoaXMuJGVsKX19KX0oalF1ZXJ5KSxmdW5jdGlvbihhLGIpe2EudWk9YS51aXx8e307dmFyIGM9L2xlZnR8Y2VudGVyfHJpZ2h0LyxkPS90b3B8Y2VudGVyfGJvdHRvbS8sZT0iY2VudGVyIixmPXt9LGc9YS5mbi5wb3NpdGlvbixoPWEuZm4ub2Zmc2V0O2EuZm4ucG9zaXRpb249ZnVuY3Rpb24oYil7aWYoIWJ8fCFiLm9mKXJldHVybiBnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtiPWEuZXh0ZW5kKHt9LGIpO3ZhciBoPWEoYi5vZiksaT1oWzBdLGo9KGIuY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIiksaz1iLm9mZnNldD9iLm9mZnNldC5zcGxpdCgiICIpOlswLDBdLGwsbSxuO3JldHVybiBpLm5vZGVUeXBlPT09OT8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDowLGxlZnQ6MH0pOmkuc2V0VGltZW91dD8obD1oLndpZHRoKCksbT1oLmhlaWdodCgpLG49e3RvcDpoLnNjcm9sbFRvcCgpLGxlZnQ6aC5zY3JvbGxMZWZ0KCl9KTppLnByZXZlbnREZWZhdWx0PyhiLmF0PSJsZWZ0IHRvcCIsbD1tPTAsbj17dG9wOmIub2YucGFnZVksbGVmdDpiLm9mLnBhZ2VYfSk6KGw9aC5vdXRlcldpZHRoKCksbT1oLm91dGVySGVpZ2h0KCksbj1oLm9mZnNldCgpKSxhLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgYT0oYlt0aGlzXXx8IiIpLnNwbGl0KCIgIik7YS5sZW5ndGg9PT0xJiYoYT1jLnRlc3QoYVswXSk/YS5jb25jYXQoW2VdKTpkLnRlc3QoYVswXSk/W2VdLmNvbmNhdChhKTpbZSxlXSksYVswXT1jLnRlc3QoYVswXSk/YVswXTplLGFbMV09ZC50ZXN0KGFbMV0pP2FbMV06ZSxiW3RoaXNdPWF9KSxqLmxlbmd0aD09PTEmJihqWzFdPWpbMF0pLGtbMF09cGFyc2VJbnQoa1swXSwxMCl8fDAsay5sZW5ndGg9PT0xJiYoa1sxXT1rWzBdKSxrWzFdPXBhcnNlSW50KGtbMV0sMTApfHwwLGIuYXRbMF09PT0icmlnaHQiP24ubGVmdCs9bDpiLmF0WzBdPT09ZSYmKG4ubGVmdCs9bC8yKSxiLmF0WzFdPT09ImJvdHRvbSI/bi50b3ArPW06Yi5hdFsxXT09PWUmJihuLnRvcCs9bS8yKSxuLmxlZnQrPWtbMF0sbi50b3ArPWtbMV0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWMub3V0ZXJXaWR0aCgpLGc9Yy5vdXRlckhlaWdodCgpLGg9cGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luTGVmdCIsITApKXx8MCxpPXBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpblRvcCIsITApKXx8MCxvPWQraCsocGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luUmlnaHQiLCEwKSl8fDApLHA9ZytpKyhwYXJzZUludChhLmN1ckNTUyh0aGlzLCJtYXJnaW5Cb3R0b20iLCEwKSl8fDApLHE9YS5leHRlbmQoe30sbikscjtiLm15WzBdPT09InJpZ2h0Ij9xLmxlZnQtPWQ6Yi5teVswXT09PWUmJihxLmxlZnQtPWQvMiksYi5teVsxXT09PSJib3R0b20iP3EudG9wLT1nOmIubXlbMV09PT1lJiYocS50b3AtPWcvMiksZi5mcmFjdGlvbnN8fChxLmxlZnQ9TWF0aC5yb3VuZChxLmxlZnQpLHEudG9wPU1hdGgucm91bmQocS50b3ApKSxyPXtsZWZ0OnEubGVmdC1oLHRvcDpxLnRvcC1pfSxhLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24oYyxlKXthLnVpLnBvc2l0aW9uW2pbY11dJiZhLnVpLnBvc2l0aW9uW2pbY11dW2VdKHEse3RhcmdldFdpZHRoOmwsdGFyZ2V0SGVpZ2h0Om0sZWxlbVdpZHRoOmQsZWxlbUhlaWdodDpnLGNvbGxpc2lvblBvc2l0aW9uOnIsY29sbGlzaW9uV2lkdGg6byxjb2xsaXNpb25IZWlnaHQ6cCxvZmZzZXQ6ayxteTpiLm15LGF0OmIuYXR9KX0pLGEuZm4uYmdpZnJhbWUmJmMuYmdpZnJhbWUoKSxjLm9mZnNldChhLmV4dGVuZChxLHt1c2luZzpiLnVzaW5nfSkpfSl9LGEudWkucG9zaXRpb249e2ZpdDp7bGVmdDpmdW5jdGlvbihiLGMpe3ZhciBkPWEod2luZG93KSxlPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdCtjLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKTtiLmxlZnQ9ZT4wP2IubGVmdC1lOk1hdGgubWF4KGIubGVmdC1jLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQsYi5sZWZ0KX0sdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh3aW5kb3cpLGU9Yy5jb2xsaXNpb25Qb3NpdGlvbi50b3ArYy5jb2xsaXNpb25IZWlnaHQtZC5oZWlnaHQoKS1kLnNjcm9sbFRvcCgpO2IudG9wPWU+MD9iLnRvcC1lOk1hdGgubWF4KGIudG9wLWMuY29sbGlzaW9uUG9zaXRpb24udG9wLGIudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oYixjKXtpZihjLmF0WzBdPT09ZSlyZXR1cm47dmFyIGQ9YSh3aW5kb3cpLGY9Yy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0K2MuY29sbGlzaW9uV2lkdGgtZC53aWR0aCgpLWQuc2Nyb2xsTGVmdCgpLGc9Yy5teVswXT09PSJsZWZ0Ij8tYy5lbGVtV2lkdGg6Yy5teVswXT09PSJyaWdodCI/Yy5lbGVtV2lkdGg6MCxoPWMuYXRbMF09PT0ibGVmdCI/Yy50YXJnZXRXaWR0aDotYy50YXJnZXRXaWR0aCxpPS0yKmMub2Zmc2V0WzBdO2IubGVmdCs9Yy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0PDA/ZytoK2k6Zj4wP2craCtpOjB9LHRvcDpmdW5jdGlvbihiLGMpe2lmKGMuYXRbMV09PT1lKXJldHVybjt2YXIgZD1hKHdpbmRvdyksZj1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcCtjLmNvbGxpc2lvbkhlaWdodC1kLmhlaWdodCgpLWQuc2Nyb2xsVG9wKCksZz1jLm15WzFdPT09InRvcCI/LWMuZWxlbUhlaWdodDpjLm15WzFdPT09ImJvdHRvbSI/Yy5lbGVtSGVpZ2h0OjAsaD1jLmF0WzFdPT09InRvcCI/Yy50YXJnZXRIZWlnaHQ6LWMudGFyZ2V0SGVpZ2h0LGk9LTIqYy5vZmZzZXRbMV07Yi50b3ArPWMuY29sbGlzaW9uUG9zaXRpb24udG9wPDA/ZytoK2k6Zj4wP2craCtpOjB9fX0sYS5vZmZzZXQuc2V0T2Zmc2V0fHwoYS5vZmZzZXQuc2V0T2Zmc2V0PWZ1bmN0aW9uKGIsYyl7L3N0YXRpYy8udGVzdChhLmN1ckNTUyhiLCJwb3NpdGlvbiIpKSYmKGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGQ9YShiKSxlPWQub2Zmc2V0KCksZj1wYXJzZUludChhLmN1ckNTUyhiLCJ0b3AiLCEwKSwxMCl8fDAsZz1wYXJzZUludChhLmN1ckNTUyhiLCJsZWZ0IiwhMCksMTApfHwwLGg9e3RvcDpjLnRvcC1lLnRvcCtmLGxlZnQ6Yy5sZWZ0LWUubGVmdCtnfTsidXNpbmciaW4gYz9jLnVzaW5nLmNhbGwoYixoKTpkLmNzcyhoKX0sYS5mbi5vZmZzZXQ9ZnVuY3Rpb24oYil7dmFyIGM9dGhpc1swXTtyZXR1cm4hY3x8IWMub3duZXJEb2N1bWVudD9udWxsOmI/YS5pc0Z1bmN0aW9uKGIpP3RoaXMuZWFjaChmdW5jdGlvbihjKXthKHRoaXMpLm9mZnNldChiLmNhbGwodGhpcyxjLGEodGhpcykub2Zmc2V0KCkpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2Eub2Zmc2V0LnNldE9mZnNldCh0aGlzLGIpfSk6aC5jYWxsKHRoaXMpfSksYS5jdXJDU1N8fChhLmN1ckNTUz1hLmNzcyksZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZCxlLGcsaCxpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiPyJkaXYiOiJib2R5IiksZz17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxiJiZhLmV4dGVuZChnLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii0xMDAwcHgiLHRvcDoiLTEwMDBweCJ9KTtmb3IodmFyIGogaW4gZylkLnN0eWxlW2pdPWdbal07ZC5hcHBlbmRDaGlsZChjKSxlPWJ8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCksYy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDEwLjc0MzIyMjJweDsgdG9wOiAxMC40MzIzMjVweDsgaGVpZ2h0OiAzMHB4OyB3aWR0aDogMjAxcHg7IixoPWEoYykub2Zmc2V0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9KS5vZmZzZXQoKSxkLmlubmVySFRNTD0iIixlLnJlbW92ZUNoaWxkKGQpLGk9aC50b3AraC5sZWZ0KyhiPzJlMzowKSxmLmZyYWN0aW9ucz1pPjIxJiZpPDIyfSgpfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnByb2dyZXNzYmFyIix7b3B0aW9uczp7dmFsdWU6MCxtYXg6MTAwfSxtaW46MCxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLmF0dHIoe3JvbGU6InByb2dyZXNzYmFyIiwiYXJpYS12YWx1ZW1pbiI6dGhpcy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3ZhbHVlKCl9KSx0aGlzLnZhbHVlRGl2PWEoIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLXZhbHVlIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWxlZnQnPjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCksdGhpcy5vbGRWYWx1ZT10aGlzLl92YWx1ZSgpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWluIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1heCIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVub3ciKSx0aGlzLnZhbHVlRGl2LnJlbW92ZSgpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iP3RoaXMuX3ZhbHVlKCk6KHRoaXMuX3NldE9wdGlvbigidmFsdWUiLGEpLHRoaXMpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsYyl7Yj09PSJ2YWx1ZSImJih0aGlzLm9wdGlvbnMudmFsdWU9Yyx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl92YWx1ZSgpPT09dGhpcy5vcHRpb25zLm1heCYmdGhpcy5fdHJpZ2dlcigiY29tcGxldGUiKSksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIHR5cGVvZiBhIT0ibnVtYmVyIiYmKGE9MCksTWF0aC5taW4odGhpcy5vcHRpb25zLm1heCxNYXRoLm1heCh0aGlzLm1pbixhKSl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLl92YWx1ZSgpL3RoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZhbHVlKCksYj10aGlzLl9wZXJjZW50YWdlKCk7dGhpcy5vbGRWYWx1ZSE9PWEmJih0aGlzLm9sZFZhbHVlPWEsdGhpcy5fdHJpZ2dlcigiY2hhbmdlIikpLHRoaXMudmFsdWVEaXYudG9nZ2xlKGE+dGhpcy5taW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItcmlnaHQiLGE9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aChiLnRvRml4ZWQoMCkrIiUiKSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS12YWx1ZW5vdyIsYSl9fSksYS5leHRlbmQoYS51aS5wcm9ncmVzc2Jhcix7dmVyc2lvbjoiMS44LjI0In0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7dmFyIGM9NTthLndpZGdldCgidWkuc2xpZGVyIixhLnVpLm1vdXNlLHt3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNsaWRlci1oYW5kbGUiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiksZj0iPGEgY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyBocmVmPScjJz48L2E+IixnPWQudmFsdWVzJiZkLnZhbHVlcy5sZW5ndGh8fDEsaD1bXTt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKyIgdWktd2lkZ2V0IisiIHVpLXdpZGdldC1jb250ZW50IisiIHVpLWNvcm5lci1hbGwiKyhkLmRpc2FibGVkPyIgdWktc2xpZGVyLWRpc2FibGVkIHVpLWRpc2FibGVkIjoiIikpLHRoaXMucmFuZ2U9YShbXSksZC5yYW5nZSYmKGQucmFuZ2U9PT0hMCYmKGQudmFsdWVzfHwoZC52YWx1ZXM9W3RoaXMuX3ZhbHVlTWluKCksdGhpcy5fdmFsdWVNaW4oKV0pLGQudmFsdWVzLmxlbmd0aCYmZC52YWx1ZXMubGVuZ3RoIT09MiYmKGQudmFsdWVzPVtkLnZhbHVlc1swXSxkLnZhbHVlc1swXV0pKSx0aGlzLnJhbmdlPWEoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktc2xpZGVyLXJhbmdlIHVpLXdpZGdldC1oZWFkZXIiKyhkLnJhbmdlPT09Im1pbiJ8fGQucmFuZ2U9PT0ibWF4Ij8iIHVpLXNsaWRlci1yYW5nZS0iK2QucmFuZ2U6IiIpKSk7Zm9yKHZhciBpPWUubGVuZ3RoO2k8ZztpKz0xKWgucHVzaChmKTt0aGlzLmhhbmRsZXM9ZS5hZGQoYShoLmpvaW4oIiIpKS5hcHBlbmRUbyhiLmVsZW1lbnQpKSx0aGlzLmhhbmRsZT10aGlzLmhhbmRsZXMuZXEoMCksdGhpcy5oYW5kbGVzLmFkZCh0aGlzLnJhbmdlKS5maWx0ZXIoImEiKS5jbGljayhmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9KS5ob3ZlcihmdW5jdGlvbigpe2QuZGlzYWJsZWR8fGEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmZvY3VzKGZ1bmN0aW9uKCl7ZC5kaXNhYmxlZD9hKHRoaXMpLmJsdXIoKTooYSgiLnVpLXNsaWRlciAudWktc3RhdGUtZm9jdXMiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKSxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpKX0pLmJsdXIoZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSksdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYil7YSh0aGlzKS5kYXRhKCJpbmRleC51aS1zbGlkZXItaGFuZGxlIixiKX0pLHRoaXMuaGFuZGxlcy5rZXlkb3duKGZ1bmN0aW9uKGQpe3ZhciBlPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpLGYsZyxoLGk7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtzd2l0Y2goZC5rZXlDb2RlKXtjYXNlIGEudWkua2V5Q29kZS5IT01FOmNhc2UgYS51aS5rZXlDb2RlLkVORDpjYXNlIGEudWkua2V5Q29kZS5QQUdFX1VQOmNhc2UgYS51aS5rZXlDb2RlLlBBR0VfRE9XTjpjYXNlIGEudWkua2V5Q29kZS5VUDpjYXNlIGEudWkua2V5Q29kZS5SSUdIVDpjYXNlIGEudWkua2V5Q29kZS5ET1dOOmNhc2UgYS51aS5rZXlDb2RlLkxFRlQ6ZC5wcmV2ZW50RGVmYXVsdCgpO2lmKCFiLl9rZXlTbGlkaW5nKXtiLl9rZXlTbGlkaW5nPSEwLGEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGY9Yi5fc3RhcnQoZCxlKTtpZihmPT09ITEpcmV0dXJufX1pPWIub3B0aW9ucy5zdGVwLGIub3B0aW9ucy52YWx1ZXMmJmIub3B0aW9ucy52YWx1ZXMubGVuZ3RoP2c9aD1iLnZhbHVlcyhlKTpnPWg9Yi52YWx1ZSgpO3N3aXRjaChkLmtleUNvZGUpe2Nhc2UgYS51aS5rZXlDb2RlLkhPTUU6aD1iLl92YWx1ZU1pbigpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkVORDpoPWIuX3ZhbHVlTWF4KCk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9VUDpoPWIuX3RyaW1BbGlnblZhbHVlKGcrKGIuX3ZhbHVlTWF4KCktYi5fdmFsdWVNaW4oKSkvYyk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9ET1dOOmg9Yi5fdHJpbUFsaWduVmFsdWUoZy0oYi5fdmFsdWVNYXgoKS1iLl92YWx1ZU1pbigpKS9jKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5VUDpjYXNlIGEudWkua2V5Q29kZS5SSUdIVDppZihnPT09Yi5fdmFsdWVNYXgoKSlyZXR1cm47aD1iLl90cmltQWxpZ25WYWx1ZShnK2kpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLkRPV046Y2FzZSBhLnVpLmtleUNvZGUuTEVGVDppZihnPT09Yi5fdmFsdWVNaW4oKSlyZXR1cm47aD1iLl90cmltQWxpZ25WYWx1ZShnLWkpfWIuX3NsaWRlKGQsZSxoKX0pLmtleXVwKGZ1bmN0aW9uKGMpe3ZhciBkPWEodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIpO2IuX2tleVNsaWRpbmcmJihiLl9rZXlTbGlkaW5nPSExLGIuX3N0b3AoYyxkKSxiLl9jaGFuZ2UoYyxkKSxhKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSl9KSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFuZGxlcy5yZW1vdmUoKSx0aGlzLnJhbmdlLnJlbW92ZSgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCB1aS1zbGlkZXItZGlzYWJsZWQgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5yZW1vdmVEYXRhKCJzbGlkZXIiKS51bmJpbmQoIi5zbGlkZXIiKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkLGUsZixnLGgsaSxqLGssbDtyZXR1cm4gYy5kaXNhYmxlZD8hMToodGhpcy5lbGVtZW50U2l6ZT17d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCl9LHRoaXMuZWxlbWVudE9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksZD17eDpiLnBhZ2VYLHk6Yi5wYWdlWX0sZT10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoZCksZj10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkrMSxoPXRoaXMsdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9TWF0aC5hYnMoZS1oLnZhbHVlcyhiKSk7Zj5jJiYoZj1jLGc9YSh0aGlzKSxpPWIpfSksYy5yYW5nZT09PSEwJiZ0aGlzLnZhbHVlcygxKT09PWMubWluJiYoaSs9MSxnPWEodGhpcy5oYW5kbGVzW2ldKSksaj10aGlzLl9zdGFydChiLGkpLGo9PT0hMT8hMToodGhpcy5fbW91c2VTbGlkaW5nPSEwLGguX2hhbmRsZUluZGV4PWksZy5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxrPWcub2Zmc2V0KCksbD0hYShiLnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1sP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OmIucGFnZVgtay5sZWZ0LWcud2lkdGgoKS8yLHRvcDpiLnBhZ2VZLWsudG9wLWcuaGVpZ2h0KCkvMi0ocGFyc2VJbnQoZy5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZy5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZy5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUoYixpLGUpLHRoaXMuX2FuaW1hdGVPZmY9ITAsITApKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYSl7dmFyIGI9e3g6YS5wYWdlWCx5OmEucGFnZVl9LGM9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGIpO3JldHVybiB0aGlzLl9zbGlkZShhLHRoaXMuX2hhbmRsZUluZGV4LGMpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9zdG9wKGEsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2NoYW5nZShhLHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2NsaWNrT2Zmc2V0PW51bGwsdGhpcy5fYW5pbWF0ZU9mZj0hMSwhMX0sX2RldGVjdE9yaWVudGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5vcmllbnRhdGlvbj10aGlzLm9wdGlvbnMub3JpZW50YXRpb249PT0idmVydGljYWwiPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfbm9ybVZhbHVlRnJvbU1vdXNlOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY7cmV0dXJuIHRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/KGI9dGhpcy5lbGVtZW50U2l6ZS53aWR0aCxjPWEueC10aGlzLmVsZW1lbnRPZmZzZXQubGVmdC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQubGVmdDowKSk6KGI9dGhpcy5lbGVtZW50U2l6ZS5oZWlnaHQsYz1hLnktdGhpcy5lbGVtZW50T2Zmc2V0LnRvcC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQudG9wOjApKSxkPWMvYixkPjEmJihkPTEpLGQ8MCYmKGQ9MCksdGhpcy5vcmllbnRhdGlvbj09PSJ2ZXJ0aWNhbCImJihkPTEtZCksZT10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCksZj10aGlzLl92YWx1ZU1pbigpK2QqZSx0aGlzLl90cmltQWxpZ25WYWx1ZShmKX0sX3N0YXJ0OmZ1bmN0aW9uKGEsYil7dmFyIGM9e2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6dGhpcy52YWx1ZSgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixhLGMpfSxfc2xpZGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZjt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD8oZD10aGlzLnZhbHVlcyhiPzA6MSksdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg9PT0yJiZ0aGlzLm9wdGlvbnMucmFuZ2U9PT0hMCYmKGI9PT0wJiZjPmR8fGI9PT0xJiZjPGQpJiYoYz1kKSxjIT09dGhpcy52YWx1ZXMoYikmJihlPXRoaXMudmFsdWVzKCksZVtiXT1jLGY9dGhpcy5fdHJpZ2dlcigic2xpZGUiLGEse2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6Yyx2YWx1ZXM6ZX0pLGQ9dGhpcy52YWx1ZXMoYj8wOjEpLGYhPT0hMSYmdGhpcy52YWx1ZXMoYixjLCEwKSkpOmMhPT10aGlzLnZhbHVlKCkmJihmPXRoaXMuX3RyaWdnZXIoInNsaWRlIixhLHtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOmN9KSxmIT09ITEmJnRoaXMudmFsdWUoYykpfSxfc3RvcDpmdW5jdGlvbihhLGIpe3ZhciBjPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0b3AiLGEsYyl9LF9jaGFuZ2U6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5fa2V5U2xpZGluZyYmIXRoaXMuX21vdXNlU2xpZGluZyl7dmFyIGM9e2hhbmRsZTp0aGlzLmhhbmRsZXNbYl0sdmFsdWU6dGhpcy52YWx1ZSgpfTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKGMudmFsdWU9dGhpcy52YWx1ZXMoYiksYy52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixhLGMpfX0sdmFsdWU6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aCl7dGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3RyaW1BbGlnblZhbHVlKGEpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApO3JldHVybn1yZXR1cm4gdGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKGIsYyl7dmFyIGQsZSxmO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7dGhpcy5vcHRpb25zLnZhbHVlc1tiXT10aGlzLl90cmltQWxpZ25WYWx1ZShjKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCxiKTtyZXR1cm59aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3ZhbHVlcygpO2lmKCFhLmlzQXJyYXkoYXJndW1lbnRzWzBdKSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5fdmFsdWVzKGIpOnRoaXMudmFsdWUoKTtkPXRoaXMub3B0aW9ucy52YWx1ZXMsZT1hcmd1bWVudHNbMF07Zm9yKGY9MDtmPGQubGVuZ3RoO2YrPTEpZFtmXT10aGlzLl90cmltQWxpZ25WYWx1ZShlW2ZdKSx0aGlzLl9jaGFuZ2UobnVsbCxmKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe3ZhciBkLGU9MDthLmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihlPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7c3dpdGNoKGIpe2Nhc2UiZGlzYWJsZWQiOmM/KHRoaXMuaGFuZGxlcy5maWx0ZXIoIi51aS1zdGF0ZS1mb2N1cyIpLmJsdXIoKSx0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5oYW5kbGVzLnByb3BBdHRyKCJkaXNhYmxlZCIsITApLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZGlzYWJsZWQiKSk6KHRoaXMuaGFuZGxlcy5wcm9wQXR0cigiZGlzYWJsZWQiLCExKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRpc2FibGVkIikpO2JyZWFrO2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCk7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpO2ZvcihkPTA7ZDxlO2QrPTEpdGhpcy5fY2hhbmdlKG51bGwsZCk7dGhpcy5fYW5pbWF0ZU9mZj0hMX19LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gYT10aGlzLl90cmltQWxpZ25WYWx1ZShhKSxhfSxfdmFsdWVzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBiPXRoaXMub3B0aW9ucy52YWx1ZXNbYV0sYj10aGlzLl90cmltQWxpZ25WYWx1ZShiKSxiO2M9dGhpcy5vcHRpb25zLnZhbHVlcy5zbGljZSgpO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKz0xKWNbZF09dGhpcy5fdHJpbUFsaWduVmFsdWUoY1tkXSk7cmV0dXJuIGN9LF90cmltQWxpZ25WYWx1ZTpmdW5jdGlvbihhKXtpZihhPD10aGlzLl92YWx1ZU1pbigpKXJldHVybiB0aGlzLl92YWx1ZU1pbigpO2lmKGE+PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuIHRoaXMuX3ZhbHVlTWF4KCk7dmFyIGI9dGhpcy5vcHRpb25zLnN0ZXA+MD90aGlzLm9wdGlvbnMuc3RlcDoxLGM9KGEtdGhpcy5fdmFsdWVNaW4oKSklYixkPWEtYztyZXR1cm4gTWF0aC5hYnMoYykqMj49YiYmKGQrPWM+MD9iOi1iKSxwYXJzZUZsb2F0KGQudG9GaXhlZCg1KSl9LF92YWx1ZU1pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubWlufSxfdmFsdWVNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucy5yYW5nZSxjPXRoaXMub3B0aW9ucyxkPXRoaXMsZT10aGlzLl9hbmltYXRlT2ZmPyExOmMuYW5pbWF0ZSxmLGc9e30saCxpLGosazt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihiLGkpe2Y9KGQudmFsdWVzKGIpLWQuX3ZhbHVlTWluKCkpLyhkLl92YWx1ZU1heCgpLWQuX3ZhbHVlTWluKCkpKjEwMCxnW2Qub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1mKyIlIixhKHRoaXMpLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oZyxjLmFuaW1hdGUpLGQub3B0aW9ucy5yYW5nZT09PSEwJiYoZC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8oYj09PTAmJmQucmFuZ2Uuc3RvcCgxLDEpW2U/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDpmKyIlIn0sYy5hbmltYXRlKSxiPT09MSYmZC5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmYtaCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSk6KGI9PT0wJiZkLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTpmKyIlIn0sYy5hbmltYXRlKSxiPT09MSYmZC5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpmLWgrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSkpKSxoPWZ9KTooaT10aGlzLnZhbHVlKCksaj10aGlzLl92YWx1ZU1pbigpLGs9dGhpcy5fdmFsdWVNYXgoKSxmPWshPT1qPyhpLWopLyhrLWopKjEwMDowLGdbZC5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8ibGVmdCI6ImJvdHRvbSJdPWYrIiUiLHRoaXMuaGFuZGxlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oZyxjLmFuaW1hdGUpLGI9PT0ibWluIiYmdGhpcy5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpmKyIlIn0sYy5hbmltYXRlKSxiPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDoxMDAtZisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSxiPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDpmKyIlIn0sYy5hbmltYXRlKSxiPT09Im1heCImJnRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiZ0aGlzLnJhbmdlW2U/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OjEwMC1mKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmMuYW5pbWF0ZX0pKX19KSxhLmV4dGVuZChhLnVpLnNsaWRlcix7dmVyc2lvbjoiMS44LjI0In0pfShqUXVlcnkpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZSgpe3JldHVybisrY31mdW5jdGlvbiBmKCl7cmV0dXJuKytkfXZhciBjPTAsZD0wO2Eud2lkZ2V0KCJ1aS50YWJzIix7b3B0aW9uczp7YWRkOm51bGwsYWpheE9wdGlvbnM6bnVsbCxjYWNoZTohMSxjb29raWU6bnVsbCxjb2xsYXBzaWJsZTohMSxkaXNhYmxlOm51bGwsZGlzYWJsZWQ6W10sZW5hYmxlOm51bGwsZXZlbnQ6ImNsaWNrIixmeDpudWxsLGlkUHJlZml4OiJ1aS10YWJzLSIsbG9hZDpudWxsLHBhbmVsVGVtcGxhdGU6IjxkaXY+PC9kaXY+IixyZW1vdmU6bnVsbCxzZWxlY3Q6bnVsbCxzaG93Om51bGwsc3Bpbm5lcjoiPGVtPkxvYWRpbmcmIzgyMzA7PC9lbT4iLHRhYlRlbXBsYXRlOiI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+In0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3RhYmlmeSghMCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0ic2VsZWN0ZWQiKXtpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJmI9PXRoaXMub3B0aW9ucy5zZWxlY3RlZClyZXR1cm47dGhpcy5zZWxlY3QoYil9ZWxzZSB0aGlzLm9wdGlvbnNbYV09Yix0aGlzLl90YWJpZnkoKX0sX3RhYklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpdGxlJiZhLnRpdGxlLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKC9bXlx3XHUwMGMwLVx1RkZGRi1dL2csIiIpfHx0aGlzLm9wdGlvbnMuaWRQcmVmaXgrZSgpfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC86L2csIlxcOiIpfSxfY29va2llOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrZigpKTtyZXR1cm4gYS5jb29raWUuYXBwbHkobnVsbCxbYl0uY29uY2F0KGEubWFrZUFycmF5KGFyZ3VtZW50cykpKX0sX3VpOmZ1bmN0aW9uKGEsYil7cmV0dXJue3RhYjphLHBhbmVsOmIsaW5kZXg6dGhpcy5hbmNob3JzLmluZGV4KGEpfX0sX2NsZWFudXA6ZnVuY3Rpb24oKXt0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1wcm9jZXNzaW5nIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKS5maW5kKCJzcGFuOmRhdGEobGFiZWwudGFicykiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtiLmh0bWwoYi5kYXRhKCJsYWJlbC50YWJzIikpLnJlbW92ZURhdGEoImxhYmVsLnRhYnMiKX0pfSxfdGFiaWZ5OmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIG0oYixjKXtiLmNzcygiZGlzcGxheSIsIiIpLCFhLnN1cHBvcnQub3BhY2l0eSYmYy5vcGFjaXR5JiZiWzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9dmFyIGQ9dGhpcyxlPXRoaXMub3B0aW9ucyxmPS9eIy4rLzt0aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCksdGhpcy5saXM9YSgiID4gbGk6aGFzKGFbaHJlZl0pIix0aGlzLmxpc3QpLHRoaXMuYW5jaG9ycz10aGlzLmxpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSgiYSIsdGhpcylbMF19KSx0aGlzLnBhbmVscz1hKFtdKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBnPWEoYykuYXR0cigiaHJlZiIpLGg9Zy5zcGxpdCgiIyIpWzBdLGk7aCYmKGg9PT1sb2NhdGlvbi50b1N0cmluZygpLnNwbGl0KCIjIilbMF18fChpPWEoImJhc2UiKVswXSkmJmg9PT1pLmhyZWYpJiYoZz1jLmhhc2gsYy5ocmVmPWcpO2lmKGYudGVzdChnKSlkLnBhbmVscz1kLnBhbmVscy5hZGQoZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihnKSkpO2Vsc2UgaWYoZyYmZyE9PSIjIil7YS5kYXRhKGMsImhyZWYudGFicyIsZyksYS5kYXRhKGMsImxvYWQudGFicyIsZy5yZXBsYWNlKC8jLiokLywiIikpO3ZhciBqPWQuX3RhYklkKGMpO2MuaHJlZj0iIyIrajt2YXIgaz1kLmVsZW1lbnQuZmluZCgiIyIraik7ay5sZW5ndGh8fChrPWEoZS5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaikuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGQucGFuZWxzW2ItMV18fGQubGlzdCksay5kYXRhKCJkZXN0cm95LnRhYnMiLCEwKSksZC5wYW5lbHM9ZC5wYW5lbHMuYWRkKGspfWVsc2UgZS5kaXNhYmxlZC5wdXNoKGIpfSksYz8odGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5saXN0LmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLHRoaXMubGlzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiksZS5zZWxlY3RlZD09PWI/KGxvY2F0aW9uLmhhc2gmJnRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGEsYil7aWYoYi5oYXNoPT1sb2NhdGlvbi5oYXNoKXJldHVybiBlLnNlbGVjdGVkPWEsITF9KSx0eXBlb2YgZS5zZWxlY3RlZCE9Im51bWJlciImJmUuY29va2llJiYoZS5zZWxlY3RlZD1wYXJzZUludChkLl9jb29raWUoKSwxMCkpLHR5cGVvZiBlLnNlbGVjdGVkIT0ibnVtYmVyIiYmdGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpLmxlbmd0aCYmKGUuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKSksZS5zZWxlY3RlZD1lLnNlbGVjdGVkfHwodGhpcy5saXMubGVuZ3RoPzA6LTEpKTplLnNlbGVjdGVkPT09bnVsbCYmKGUuc2VsZWN0ZWQ9LTEpLGUuc2VsZWN0ZWQ9ZS5zZWxlY3RlZD49MCYmdGhpcy5hbmNob3JzW2Uuc2VsZWN0ZWRdfHxlLnNlbGVjdGVkPDA/ZS5zZWxlY3RlZDowLGUuZGlzYWJsZWQ9YS51bmlxdWUoZS5kaXNhYmxlZC5jb25jYXQoYS5tYXAodGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihhLGIpe3JldHVybiBkLmxpcy5pbmRleChhKX0pKSkuc29ydCgpLGEuaW5BcnJheShlLnNlbGVjdGVkLGUuZGlzYWJsZWQpIT0tMSYmZS5kaXNhYmxlZC5zcGxpY2UoYS5pbkFycmF5KGUuc2VsZWN0ZWQsZS5kaXNhYmxlZCksMSksdGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGUuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9ycy5sZW5ndGgmJihkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLmVxKGUuc2VsZWN0ZWQpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtkLl90cmlnZ2VyKCJzaG93IixudWxsLGQuX3VpKGQuYW5jaG9yc1tlLnNlbGVjdGVkXSxkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSlbMF0pKX0pLHRoaXMubG9hZChlLnNlbGVjdGVkKSksYSh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtkLmxpcy5hZGQoZC5hbmNob3JzKS51bmJpbmQoIi50YWJzIiksZC5saXM9ZC5hbmNob3JzPWQucGFuZWxzPW51bGx9KSk6ZS5zZWxlY3RlZD10aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpLHRoaXMuZWxlbWVudFtlLmNvbGxhcHNpYmxlPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXRhYnMtY29sbGFwc2libGUiKSxlLmNvb2tpZSYmdGhpcy5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2Zvcih2YXIgZz0wLGg7aD10aGlzLmxpc1tnXTtnKyspYShoKVthLmluQXJyYXkoZyxlLmRpc2FibGVkKSE9LTEmJiFhKGgpLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc3RhdGUtZGlzYWJsZWQiKTtlLmNhY2hlPT09ITEmJnRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIiksdGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2lmKGUuZXZlbnQhPT0ibW91c2VvdmVyIil7dmFyIGk9ZnVuY3Rpb24oYSxiKXtiLmlzKCI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSYmYi5hZGRDbGFzcygidWktc3RhdGUtIithKX0saj1mdW5jdGlvbihhLGIpe2IucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLSIrYSl9O3RoaXMubGlzLmJpbmQoIm1vdXNlb3Zlci50YWJzIixmdW5jdGlvbigpe2koImhvdmVyIixhKHRoaXMpKX0pLHRoaXMubGlzLmJpbmQoIm1vdXNlb3V0LnRhYnMiLGZ1bmN0aW9uKCl7aigiaG92ZXIiLGEodGhpcykpfSksdGhpcy5hbmNob3JzLmJpbmQoImZvY3VzLnRhYnMiLGZ1bmN0aW9uKCl7aSgiZm9jdXMiLGEodGhpcykuY2xvc2VzdCgibGkiKSl9KSx0aGlzLmFuY2hvcnMuYmluZCgiYmx1ci50YWJzIixmdW5jdGlvbigpe2ooImZvY3VzIixhKHRoaXMpLmNsb3Nlc3QoImxpIikpfSl9dmFyIGssbDtlLmZ4JiYoYS5pc0FycmF5KGUuZngpPyhrPWUuZnhbMF0sbD1lLmZ4WzFdKTprPWw9ZS5meCk7dmFyIG49bD9mdW5jdGlvbihiLGMpe2EoYikuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxjLmhpZGUoKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIikuYW5pbWF0ZShsLGwuZHVyYXRpb258fCJub3JtYWwiLGZ1bmN0aW9uKCl7bShjLGwpLGQuX3RyaWdnZXIoInNob3ciLG51bGwsZC5fdWkoYixjWzBdKSl9KX06ZnVuY3Rpb24oYixjKXthKGIpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYy5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIiksZC5fdHJpZ2dlcigic2hvdyIsbnVsbCxkLl91aShiLGNbMF0pKX0sbz1rP2Z1bmN0aW9uKGEsYil7Yi5hbmltYXRlKGssay5kdXJhdGlvbnx8Im5vcm1hbCIsZnVuY3Rpb24oKXtkLmxpcy5yZW1vdmVDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxiLmFkZENsYXNzKCJ1aS10YWJzLWhpZGUiKSxtKGIsayksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX0pfTpmdW5jdGlvbihhLGIsYyl7ZC5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYi5hZGRDbGFzcygidWktdGFicy1oaWRlIiksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoZS5ldmVudCsiLnRhYnMiLGZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWEoYikuY2xvc2VzdCgibGkiKSxmPWQucGFuZWxzLmZpbHRlcigiOm5vdCgudWktdGFicy1oaWRlKSIpLGc9ZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihiLmhhc2gpKTtpZihjLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFlLmNvbGxhcHNpYmxlfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIil8fGQucGFuZWxzLmZpbHRlcigiOmFuaW1hdGVkIikubGVuZ3RofHxkLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwsZC5fdWkodGhpcyxnWzBdKSk9PT0hMSlyZXR1cm4gdGhpcy5ibHVyKCksITE7ZS5zZWxlY3RlZD1kLmFuY2hvcnMuaW5kZXgodGhpcyksZC5hYm9ydCgpO2lmKGUuY29sbGFwc2libGUpe2lmKGMuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSlyZXR1cm4gZS5zZWxlY3RlZD0tMSxlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtvKGIsZil9KS5kZXF1ZXVlKCJ0YWJzIiksdGhpcy5ibHVyKCksITE7aWYoIWYubGVuZ3RoKXJldHVybiBlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtuKGIsZyl9KSxkLmxvYWQoZC5hbmNob3JzLmluZGV4KHRoaXMpKSx0aGlzLmJsdXIoKSwhMX1lLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2lmKGcubGVuZ3RoKWYubGVuZ3RoJiZkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7byhiLGYpfSksZC5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe24oYixnKX0pLGQubG9hZChkLmFuY2hvcnMuaW5kZXgodGhpcykpO2Vsc2UgdGhyb3cialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIjthLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KSx0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9dGhpcy5hbmNob3JzLmluZGV4KHRoaXMuYW5jaG9ycy5maWx0ZXIoIltocmVmJD0nIithKyInXSIpKSksYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5hYm9ydCgpLHRoaXMuZWxlbWVudC51bmJpbmQoIi50YWJzIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktdGFicy1jb2xsYXBzaWJsZSIpLnJlbW92ZURhdGEoInRhYnMiKSx0aGlzLmxpc3QucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcywiaHJlZi50YWJzIik7YiYmKHRoaXMuaHJlZj1iKTt2YXIgYz1hKHRoaXMpLnVuYmluZCgiLnRhYnMiKTthLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oYSxiKXtjLnJlbW92ZURhdGEoYisiLnRhYnMiKX0pfSksdGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2EuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKT9hKHRoaXMpLnJlbW92ZSgpOmEodGhpcykucmVtb3ZlQ2xhc3MoWyJ1aS1zdGF0ZS1kZWZhdWx0IiwidWktY29ybmVyLXRvcCIsInVpLXRhYnMtc2VsZWN0ZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiLCJ1aS1zdGF0ZS1ob3ZlciIsInVpLXN0YXRlLWZvY3VzIiwidWktc3RhdGUtZGlzYWJsZWQiLCJ1aS10YWJzLXBhbmVsIiwidWktd2lkZ2V0LWNvbnRlbnQiLCJ1aS1jb3JuZXItYm90dG9tIiwidWktdGFicy1oaWRlIl0uam9pbigiICIpKX0pLGIuY29va2llJiZ0aGlzLl9jb29raWUobnVsbCxiLmNvb2tpZSksdGhpc30sYWRkOmZ1bmN0aW9uKGMsZCxlKXtlPT09YiYmKGU9dGhpcy5hbmNob3JzLmxlbmd0aCk7dmFyIGY9dGhpcyxnPXRoaXMub3B0aW9ucyxoPWEoZy50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxjKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZCkpLGk9Yy5pbmRleE9mKCIjIik/dGhpcy5fdGFiSWQoYSgiYSIsaClbMF0pOmMucmVwbGFjZSgiIyIsIiIpO2guYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoImRlc3Ryb3kudGFicyIsITApO3ZhciBqPWYuZWxlbWVudC5maW5kKCIjIitpKTtyZXR1cm4gai5sZW5ndGh8fChqPWEoZy5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaSkuZGF0YSgiZGVzdHJveS50YWJzIiwhMCkpLGouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKSxlPj10aGlzLmxpcy5sZW5ndGg/KGguYXBwZW5kVG8odGhpcy5saXN0KSxqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKSk6KGguaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2VdKSxqLmluc2VydEJlZm9yZSh0aGlzLnBhbmVsc1tlXSkpLGcuZGlzYWJsZWQ9YS5tYXAoZy5kaXNhYmxlZCxmdW5jdGlvbihhLGIpe3JldHVybiBhPj1lPysrYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5hbmNob3JzLmxlbmd0aD09MSYmKGcuc2VsZWN0ZWQ9MCxoLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGoucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtmLl90cmlnZ2VyKCJzaG93IixudWxsLGYuX3VpKGYuYW5jaG9yc1swXSxmLnBhbmVsc1swXSkpfSksdGhpcy5sb2FkKDApKSx0aGlzLl90cmlnZ2VyKCJhZGQiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2VdLHRoaXMucGFuZWxzW2VdKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksZT10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTtyZXR1cm4gZC5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEmJnRoaXMuc2VsZWN0KGIrKGIrMTx0aGlzLmFuY2hvcnMubGVuZ3RoPzE6LTEpKSxjLmRpc2FibGVkPWEubWFwKGEuZ3JlcChjLmRpc2FibGVkLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPWJ9KSxmdW5jdGlvbihhLGMpe3JldHVybiBhPj1iPy0tYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5fdHJpZ2dlcigicmVtb3ZlIixudWxsLHRoaXMuX3VpKGQuZmluZCgiYSIpWzBdLGVbMF0pKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oYil7Yj10aGlzLl9nZXRJbmRleChiKTt2YXIgYz10aGlzLm9wdGlvbnM7aWYoYS5pbkFycmF5KGIsYy5kaXNhYmxlZCk9PS0xKXJldHVybjtyZXR1cm4gdGhpcy5saXMuZXEoYikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZD1hLmdyZXAoYy5kaXNhYmxlZCxmdW5jdGlvbihhLGMpe3JldHVybiBhIT1ifSksdGhpcy5fdHJpZ2dlcigiZW5hYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tiXSx0aGlzLnBhbmVsc1tiXSkpLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oYSl7YT10aGlzLl9nZXRJbmRleChhKTt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3JldHVybiBhIT1jLnNlbGVjdGVkJiYodGhpcy5saXMuZXEoYSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZC5wdXNoKGEpLGMuZGlzYWJsZWQuc29ydCgpLHRoaXMuX3RyaWdnZXIoImRpc2FibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2FdLHRoaXMucGFuZWxzW2FdKSkpLHRoaXN9LHNlbGVjdDpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO2lmKGE9PS0xKWlmKHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmdGhpcy5vcHRpb25zLnNlbGVjdGVkIT0tMSlhPXRoaXMub3B0aW9ucy5zZWxlY3RlZDtlbHNlIHJldHVybiB0aGlzO3JldHVybiB0aGlzLmFuY2hvcnMuZXEoYSkudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrIi50YWJzIiksdGhpc30sbG9hZDpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmFuY2hvcnMuZXEoYilbMF0sZj1hLmRhdGEoZSwibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFmfHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZhLmRhdGEoZSwiY2FjaGUudGFicyIpKXt0aGlzLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO3JldHVybn10aGlzLmxpcy5lcShiKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGQuc3Bpbm5lcil7dmFyIGc9YSgic3BhbiIsZSk7Zy5kYXRhKCJsYWJlbC50YWJzIixnLmh0bWwoKSkuaHRtbChkLnNwaW5uZXIpfXJldHVybiB0aGlzLnhocj1hLmFqYXgoYS5leHRlbmQoe30sZC5hamF4T3B0aW9ucyx7dXJsOmYsc3VjY2VzczpmdW5jdGlvbihmLGcpe2MuZWxlbWVudC5maW5kKGMuX3Nhbml0aXplU2VsZWN0b3IoZS5oYXNoKSkuaHRtbChmKSxjLl9jbGVhbnVwKCksZC5jYWNoZSYmYS5kYXRhKGUsImNhY2hlLnRhYnMiLCEwKSxjLl90cmlnZ2VyKCJsb2FkIixudWxsLGMuX3VpKGMuYW5jaG9yc1tiXSxjLnBhbmVsc1tiXSkpO3RyeXtkLmFqYXhPcHRpb25zLnN1Y2Nlc3MoZixnKX1jYXRjaChoKXt9fSxlcnJvcjpmdW5jdGlvbihhLGYsZyl7Yy5fY2xlYW51cCgpLGMuX3RyaWdnZXIoImxvYWQiLG51bGwsYy5fdWkoYy5hbmNob3JzW2JdLGMucGFuZWxzW2JdKSk7dHJ5e2QuYWpheE9wdGlvbnMuZXJyb3IoYSxmLGIsZSl9Y2F0Y2goZyl7fX19KSksYy5lbGVtZW50LmRlcXVldWUoInRhYnMiKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQucXVldWUoW10pLHRoaXMucGFuZWxzLnN0b3AoITEsITApLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsdGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIikuc3BsaWNlKC0yLDIpKSx0aGlzLnhociYmKHRoaXMueGhyLmFib3J0KCksZGVsZXRlIHRoaXMueGhyKSx0aGlzLl9jbGVhbnVwKCksdGhpc30sdXJsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYW5jaG9ycy5lcShhKS5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIikuZGF0YSgibG9hZC50YWJzIixiKSx0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KSxhLmV4dGVuZChhLnVpLnRhYnMse3ZlcnNpb246IjEuOC4yNCJ9KSxhLmV4dGVuZChhLnVpLnRhYnMucHJvdG90eXBlLHtyb3RhdGlvbjpudWxsLHJvdGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT1jLl9yb3RhdGV8fChjLl9yb3RhdGU9ZnVuY3Rpb24oYil7Y2xlYXJUaW1lb3V0KGMucm90YXRpb24pLGMucm90YXRpb249c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWQuc2VsZWN0ZWQ7Yy5zZWxlY3QoKythPGMuYW5jaG9ycy5sZW5ndGg/YTowKX0sYSksYiYmYi5zdG9wUHJvcGFnYXRpb24oKX0pLGY9Yy5fdW5yb3RhdGV8fChjLl91bnJvdGF0ZT1iP2Z1bmN0aW9uKGEpe2UoKX06ZnVuY3Rpb24oYSl7YS5jbGllbnRYJiZjLnJvdGF0ZShudWxsKX0pO3JldHVybiBhPyh0aGlzLmVsZW1lbnQuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy5iaW5kKGQuZXZlbnQrIi50YWJzIixmKSxlKCkpOihjbGVhclRpbWVvdXQoYy5yb3RhdGlvbiksdGhpcy5lbGVtZW50LnVuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy51bmJpbmQoZC5ldmVudCsiLnRhYnMiLGYpLGRlbGV0ZSB0aGlzLl9yb3RhdGUsZGVsZXRlIHRoaXMuX3Vucm90YXRlKSx0aGlzfX0pfShqUXVlcnkpOwoK"></script>\n',
' <script id= "script_sl_jquery_easing_js" src="data:/text/plain;base64,LyoKICogalF1ZXJ5IEVhc2luZyB2MS4zIC0gaHR0cDovL2dzZ2QuY28udWsvc2FuZGJveC9qcXVlcnkvZWFzaW5nLwogKgogKiBVc2VzIHRoZSBidWlsdCBpbiBlYXNpbmcgY2FwYWJpbGl0aWVzIGFkZGVkIEluIGpRdWVyeSAxLjEKICogdG8gb2ZmZXIgbXVsdGlwbGUgZWFzaW5nIG9wdGlvbnMKICoKICogVEVSTVMgT0YgVVNFIC0galF1ZXJ5IEVhc2luZwogKiAKICogT3BlbiBzb3VyY2UgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLiAKICogCiAqIENvcHlyaWdodCDCqSAyMDA4IEdlb3JnZSBNY0dpbmxleSBTbWl0aAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogCiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIAogKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IAogKiBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCiAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSAKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiAgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAogKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgCiAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICoKKi8KCi8vIHQ6IGN1cnJlbnQgdGltZSwgYjogYmVnSW5uSW5nIHZhbHVlLCBjOiBjaGFuZ2UgSW4gdmFsdWUsIGQ6IGR1cmF0aW9uCmpRdWVyeS5lYXNpbmdbJ2pzd2luZyddID0galF1ZXJ5LmVhc2luZ1snc3dpbmcnXTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5lYXNpbmcsCnsKCWRlZjogJ2Vhc2VPdXRRdWFkJywKCXN3aW5nOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCS8vYWxlcnQoalF1ZXJ5LmVhc2luZy5kZWZhdWx0KTsKCQlyZXR1cm4galF1ZXJ5LmVhc2luZ1tqUXVlcnkuZWFzaW5nLmRlZl0oeCwgdCwgYiwgYywgZCk7Cgl9LAoJZWFzZUluUXVhZDogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyoodC89ZCkqdCArIGI7Cgl9LAoJZWFzZU91dFF1YWQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jICoodC89ZCkqKHQtMikgKyBiOwoJfSwKCWVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQgKyBiOwoJCXJldHVybiAtYy8yICogKCgtLXQpKih0LTIpIC0gMSkgKyBiOwoJfSwKCWVhc2VJbkN1YmljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiBjKih0Lz1kKSp0KnQgKyBiOwoJfSwKCWVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyooKHQ9dC9kLTEpKnQqdCArIDEpICsgYjsKCX0sCgllYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlpZiAoKHQvPWQvMikgPCAxKSByZXR1cm4gYy8yKnQqdCp0ICsgYjsKCQlyZXR1cm4gYy8yKigodC09MikqdCp0ICsgMikgKyBiOwoJfSwKCWVhc2VJblF1YXJ0OiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiBjKih0Lz1kKSp0KnQqdCArIGI7Cgl9LAoJZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiAtYyAqICgodD10L2QtMSkqdCp0KnQgLSAxKSArIGI7Cgl9LAoJZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQqdCp0ICsgYjsKCQlyZXR1cm4gLWMvMiAqICgodC09MikqdCp0KnQgLSAyKSArIGI7Cgl9LAoJZWFzZUluUXVpbnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMqKHQvPWQpKnQqdCp0KnQgKyBiOwoJfSwKCWVhc2VPdXRRdWludDogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyooKHQ9dC9kLTEpKnQqdCp0KnQgKyAxKSArIGI7Cgl9LAoJZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMip0KnQqdCp0KnQgKyBiOwoJCXJldHVybiBjLzIqKCh0LT0yKSp0KnQqdCp0ICsgMikgKyBiOwoJfSwKCWVhc2VJblNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jICogTWF0aC5jb3ModC9kICogKE1hdGguUEkvMikpICsgYyArIGI7Cgl9LAoJZWFzZU91dFNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMgKiBNYXRoLnNpbih0L2QgKiAoTWF0aC5QSS8yKSkgKyBiOwoJfSwKCWVhc2VJbk91dFNpbmU6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jLzIgKiAoTWF0aC5jb3MoTWF0aC5QSSp0L2QpIC0gMSkgKyBiOwoJfSwKCWVhc2VJbkV4cG86IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuICh0PT0wKSA/IGIgOiBjICogTWF0aC5wb3coMiwgMTAgKiAodC9kIC0gMSkpICsgYjsKCX0sCgllYXNlT3V0RXhwbzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gKHQ9PWQpID8gYitjIDogYyAqICgtTWF0aC5wb3coMiwgLTEwICogdC9kKSArIDEpICsgYjsKCX0sCgllYXNlSW5PdXRFeHBvOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICh0PT0wKSByZXR1cm4gYjsKCQlpZiAodD09ZCkgcmV0dXJuIGIrYzsKCQlpZiAoKHQvPWQvMikgPCAxKSByZXR1cm4gYy8yICogTWF0aC5wb3coMiwgMTAgKiAodCAtIDEpKSArIGI7CgkJcmV0dXJuIGMvMiAqICgtTWF0aC5wb3coMiwgLTEwICogLS10KSArIDIpICsgYjsKCX0sCgllYXNlSW5DaXJjOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXJldHVybiAtYyAqIChNYXRoLnNxcnQoMSAtICh0Lz1kKSp0KSAtIDEpICsgYjsKCX0sCgllYXNlT3V0Q2lyYzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQpIHsKCQlyZXR1cm4gYyAqIE1hdGguc3FydCgxIC0gKHQ9dC9kLTEpKnQpICsgYjsKCX0sCgllYXNlSW5PdXRDaXJjOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICgodC89ZC8yKSA8IDEpIHJldHVybiAtYy8yICogKE1hdGguc3FydCgxIC0gdCp0KSAtIDEpICsgYjsKCQlyZXR1cm4gYy8yICogKE1hdGguc3FydCgxIC0gKHQtPTIpKnQpICsgMSkgKyBiOwoJfSwKCWVhc2VJbkVsYXN0aWM6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJdmFyIHM9MS43MDE1ODt2YXIgcD0wO3ZhciBhPWM7CgkJaWYgKHQ9PTApIHJldHVybiBiOyAgaWYgKCh0Lz1kKT09MSkgcmV0dXJuIGIrYzsgIGlmICghcCkgcD1kKi4zOwoJCWlmIChhIDwgTWF0aC5hYnMoYykpIHsgYT1jOyB2YXIgcz1wLzQ7IH0KCQllbHNlIHZhciBzID0gcC8oMipNYXRoLlBJKSAqIE1hdGguYXNpbiAoYy9hKTsKCQlyZXR1cm4gLShhKk1hdGgucG93KDIsMTAqKHQtPTEpKSAqIE1hdGguc2luKCAodCpkLXMpKigyKk1hdGguUEkpL3AgKSkgKyBiOwoJfSwKCWVhc2VPdXRFbGFzdGljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXZhciBzPTEuNzAxNTg7dmFyIHA9MDt2YXIgYT1jOwoJCWlmICh0PT0wKSByZXR1cm4gYjsgIGlmICgodC89ZCk9PTEpIHJldHVybiBiK2M7ICBpZiAoIXApIHA9ZCouMzsKCQlpZiAoYSA8IE1hdGguYWJzKGMpKSB7IGE9YzsgdmFyIHM9cC80OyB9CgkJZWxzZSB2YXIgcyA9IHAvKDIqTWF0aC5QSSkgKiBNYXRoLmFzaW4gKGMvYSk7CgkJcmV0dXJuIGEqTWF0aC5wb3coMiwtMTAqdCkgKiBNYXRoLnNpbiggKHQqZC1zKSooMipNYXRoLlBJKS9wICkgKyBjICsgYjsKCX0sCgllYXNlSW5PdXRFbGFzdGljOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCXZhciBzPTEuNzAxNTg7dmFyIHA9MDt2YXIgYT1jOwoJCWlmICh0PT0wKSByZXR1cm4gYjsgIGlmICgodC89ZC8yKT09MikgcmV0dXJuIGIrYzsgIGlmICghcCkgcD1kKiguMyoxLjUpOwoJCWlmIChhIDwgTWF0aC5hYnMoYykpIHsgYT1jOyB2YXIgcz1wLzQ7IH0KCQllbHNlIHZhciBzID0gcC8oMipNYXRoLlBJKSAqIE1hdGguYXNpbiAoYy9hKTsKCQlpZiAodCA8IDEpIHJldHVybiAtLjUqKGEqTWF0aC5wb3coMiwxMCoodC09MSkpICogTWF0aC5zaW4oICh0KmQtcykqKDIqTWF0aC5QSSkvcCApKSArIGI7CgkJcmV0dXJuIGEqTWF0aC5wb3coMiwtMTAqKHQtPTEpKSAqIE1hdGguc2luKCAodCpkLXMpKigyKk1hdGguUEkpL3AgKSouNSArIGMgKyBiOwoJfSwKCWVhc2VJbkJhY2s6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkLCBzKSB7CgkJaWYgKHMgPT0gdW5kZWZpbmVkKSBzID0gMS43MDE1ODsKCQlyZXR1cm4gYyoodC89ZCkqdCooKHMrMSkqdCAtIHMpICsgYjsKCX0sCgllYXNlT3V0QmFjazogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGQsIHMpIHsKCQlpZiAocyA9PSB1bmRlZmluZWQpIHMgPSAxLjcwMTU4OwoJCXJldHVybiBjKigodD10L2QtMSkqdCooKHMrMSkqdCArIHMpICsgMSkgKyBiOwoJfSwKCWVhc2VJbk91dEJhY2s6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkLCBzKSB7CgkJaWYgKHMgPT0gdW5kZWZpbmVkKSBzID0gMS43MDE1ODsgCgkJaWYgKCh0Lz1kLzIpIDwgMSkgcmV0dXJuIGMvMioodCp0KigoKHMqPSgxLjUyNSkpKzEpKnQgLSBzKSkgKyBiOwoJCXJldHVybiBjLzIqKCh0LT0yKSp0KigoKHMqPSgxLjUyNSkpKzEpKnQgKyBzKSArIDIpICsgYjsKCX0sCgllYXNlSW5Cb3VuY2U6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIGMgLSBqUXVlcnkuZWFzaW5nLmVhc2VPdXRCb3VuY2UgKHgsIGQtdCwgMCwgYywgZCkgKyBiOwoJfSwKCWVhc2VPdXRCb3VuY2U6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkKSB7CgkJaWYgKCh0Lz1kKSA8ICgxLzIuNzUpKSB7CgkJCXJldHVybiBjKig3LjU2MjUqdCp0KSArIGI7CgkJfSBlbHNlIGlmICh0IDwgKDIvMi43NSkpIHsKCQkJcmV0dXJuIGMqKDcuNTYyNSoodC09KDEuNS8yLjc1KSkqdCArIC43NSkgKyBiOwoJCX0gZWxzZSBpZiAodCA8ICgyLjUvMi43NSkpIHsKCQkJcmV0dXJuIGMqKDcuNTYyNSoodC09KDIuMjUvMi43NSkpKnQgKyAuOTM3NSkgKyBiOwoJCX0gZWxzZSB7CgkJCXJldHVybiBjKig3LjU2MjUqKHQtPSgyLjYyNS8yLjc1KSkqdCArIC45ODQzNzUpICsgYjsKCQl9Cgl9LAoJZWFzZUluT3V0Qm91bmNlOiBmdW5jdGlvbiAoeCwgdCwgYiwgYywgZCkgewoJCWlmICh0IDwgZC8yKSByZXR1cm4galF1ZXJ5LmVhc2luZy5lYXNlSW5Cb3VuY2UgKHgsIHQqMiwgMCwgYywgZCkgKiAuNSArIGI7CgkJcmV0dXJuIGpRdWVyeS5lYXNpbmcuZWFzZU91dEJvdW5jZSAoeCwgdCoyLWQsIDAsIGMsIGQpICogLjUgKyBjKi41ICsgYjsKCX0KfSk7CgovKgogKgogKiBURVJNUyBPRiBVU0UgLSBFQVNJTkcgRVFVQVRJT05TCiAqIAogKiBPcGVuIHNvdXJjZSB1bmRlciB0aGUgQlNEIExpY2Vuc2UuIAogKiAKICogQ29weXJpZ2h0IMKpIDIwMDEgUm9iZXJ0IFBlbm5lcgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogCiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIAogKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IAogKiBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCiAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSAKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiAgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAogKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgCiAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCiAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICoKICov"></script>\n',
' <script id= "script_sl_jquery_mousewheel_js" src="data:/text/plain;base64,LyogQ29weXJpZ2h0IChjKSAyMDA5IEJyYW5kb24gQWFyb24gKGh0dHA6Ly9icmFuZG9uYWFyb24ubmV0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQogKiBhbmQgR1BMIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCkgbGljZW5zZXMuCiAqIFRoYW5rcyB0bzogaHR0cDovL2Fkb21hcy5vcmcvamF2YXNjcmlwdC1tb3VzZS13aGVlbC8gZm9yIHNvbWUgcG9pbnRlcnMuCiAqIFRoYW5rcyB0bzogTWF0aGlhcyBCYW5rKGh0dHA6Ly93d3cubWF0aGlhcy1iYW5rLmRlKSBmb3IgYSBzY29wZSBidWcgZml4LgogKgogKiBWZXJzaW9uOiAzLjAuMgogKiAKICogUmVxdWlyZXM6IDEuMi4yKwogKi8KKGZ1bmN0aW9uKGMpe3ZhciBhPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07Yy5ldmVudC5zcGVjaWFsLm1vdXNld2hlZWw9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRFdmVudExpc3RlbmVyKXtmb3IodmFyIGQ9YS5sZW5ndGg7ZDspe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihhWy0tZF0sYixmYWxzZSl9fWVsc2V7dGhpcy5vbm1vdXNld2hlZWw9Yn19LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKXtmb3IodmFyIGQ9YS5sZW5ndGg7ZDspe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhWy0tZF0sYixmYWxzZSl9fWVsc2V7dGhpcy5vbm1vdXNld2hlZWw9bnVsbH19fTtjLmZuLmV4dGVuZCh7bW91c2V3aGVlbDpmdW5jdGlvbihkKXtyZXR1cm4gZD90aGlzLmJpbmQoIm1vdXNld2hlZWwiLGQpOnRoaXMudHJpZ2dlcigibW91c2V3aGVlbCIpfSx1bm1vdXNld2hlZWw6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMudW5iaW5kKCJtb3VzZXdoZWVsIixkKX19KTtmdW5jdGlvbiBiKGYpe3ZhciBkPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGc9MCxlPXRydWU7Zj1jLmV2ZW50LmZpeChmfHx3aW5kb3cuZXZlbnQpO2YudHlwZT0ibW91c2V3aGVlbCI7aWYoZi53aGVlbERlbHRhKXtnPWYud2hlZWxEZWx0YS8xMjB9aWYoZi5kZXRhaWwpe2c9LWYuZGV0YWlsLzN9ZC51bnNoaWZ0KGYsZyk7cmV0dXJuIGMuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsZCl9fSkoalF1ZXJ5KTs=" ></script>\n',
' <script id="script_zmviewer" src="data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19"></script>\n',
' <script id="script_kogrids">\n',
' function kogrids(args) {\n',
'// alert( "BUGS_330 kogrids args="+args );\n',
' var myko = new Array();\n',
' var mykob = new Array();\n',
' var mykow = new Array();\n',
' var mykoeyeb = new Array();\n',
' var mykoeyew = new Array();\n',
'\n',
' mykob[1]="/imgs/kogrids/tn/tn_kob_grid1.png";\n',
' mykob[2]="/imgs/kogrids/tn/tn_kob_grid2.png";\n',
' mykob[3]="/imgs/kogrids/tn/tn_kob_grid3.png";\n',
' mykob[4]="/imgs/kogrids/tn/tn_kob_grid4.png";\n',
' mykob[5]="/imgs/kogrids/tn/tn_kob_grid5.png";\n',
' mykob[6]="/imgs/kogrids/tn/tn_kob_grid6.png";\n',
' mykob[7]="/imgs/kogrids/tn/tn_kob_grid7.png";\n',
' mykob[8]="/imgs/kogrids/tn/tn_kob_grid8.png";\n',
' mykob[9]="/imgs/kogrids/tn/tn_kob_grid9.png";\n',
' mykob[10]="/imgs/kogrids/tn/tn_kob_grid.gif";\n',
'\n',
' mykow[1]="/imgs/kogrids/tn/tn_kow_grid1.png";\n',
' mykow[2]="/imgs/kogrids/tn/tn_kow_grid2.png";\n',
' mykow[3]="/imgs/kogrids/tn/tn_kow_grid3.png";\n',
' mykow[4]="/imgs/kogrids/tn/tn_kow_grid4.png";\n',
' mykow[5]="/imgs/kogrids/tn/tn_kow_grid5.png";\n',
' mykow[6]="/imgs/kogrids/tn/tn_kow_grid6.png";\n',
' mykow[7]="/imgs/kogrids/tn/tn_kow_grid7.png";\n',
' mykow[8]="/imgs/kogrids/tn/tn_kow_grid8.png";\n',
' mykow[9]="/imgs/kogrids/tn/tn_kow_grid9.png";\n',
' mykow[10]="/imgs/kogrids/tn/tn_kow_grip.gif";\n',
'\n',
' mykoeyeb[1]="/imgs/kogrids/tn/tn_koeyeb_grid1.png";\n',
' mykoeyeb[2]="/imgs/kogrids/tn/tn_koeyeb_grid2.png";\n',
' mykoeyeb[3]="/imgs/kogrids/tn/tn_koeyeb_grid3.png";\n',
' mykoeyeb[4]="/imgs/kogrids/tn/tn_koeyeb_grid4.png";\n',
' mykoeyeb[5]="/imgs/kogrids/tn/tn_koeyeb_grid5.png";\n',
' mykoeyeb[6]="/imgs/kogrids/tn/tn_koeyeb_grid6.png";\n',
' mykoeyeb[7]="/imgs/kogrids/tn/tn_koeyeb_grid7.png";\n',
' mykoeyeb[8]="/imgs/kogrids/tn/tn_koeyeb_grid8.png";\n',
' mykoeyeb[9]="/imgs/kogrids/tn/tn_koeyeb_grid9.png";\n',
' mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyeb_grid_delay5.gif";\n',
'\n',
' mykoeyew[1]="/imgs/kogrids/tn/tn_koeyew_grid1.png";\n',
' mykoeyew[2]="/imgs/kogrids/tn/tn_koeyew_grid2.png";\n',
' mykoeyew[3]="/imgs/kogrids/tn/tn_koeyew_grid3.png";\n',
' mykoeyew[4]="/imgs/kogrids/tn/tn_koeyew_grid4.png";\n',
' mykoeyew[5]="/imgs/kogrids/tn/tn_koeyew_grid5.png";\n',
' mykoeyew[6]="/imgs/kogrids/tn/tn_koeyew_grid6.png";\n',
' mykoeyew[7]="/imgs/kogrids/tn/tn_koeyew_grid7.png";\n',
' mykoeyew[8]="/imgs/kogrids/tn/tn_koeyew_grid8.png";\n',
' mykoeyew[9]="/imgs/kogrids/tn/tn_koeyew_grid9.png";\n',
' mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay5.gif";\n',
'\n',
' myko[1]="/imgs/bh/bluehost_grid01.jpg";\n',
' myko[2]="/imgs/bh/bluehost_grid02.jpg";\n',
' myko[3]="/imgs/bh/bluehost_grid03.jpg";\n',
' myko[4]="/imgs/bh/bluehost_grid04.jpg";\n',
' myko[5]="/imgs/bh/bluehost_grid05.jpg";\n',
' myko[6]="/imgs/bh/bluehost_grid06.jpg";\n',
' myko[7]="/imgs/bh/bluehost_grid07.jpg";\n',
' myko[8]="/imgs/bh/bluehost_grid08.jpg";\n',
' myko[9]="/imgs/bh/bluehost_grid09.jpg";\n',
' myko[10]="/imgs/bh/bh_anim.gif";\n',
' \n',
' var ko=Math.floor(Math.random()*myko.length);\n',
' var kob=Math.floor(Math.random()*mykob.length);\n',
' var kow=Math.floor(Math.random()*mykow.length);\n',
' var koeyeb=Math.floor(Math.random()*mykoeyeb.length);\n',
' var koeyew=Math.floor(Math.random()*mykoeyew.length);\n',
' var koeyeb1=Math.floor(Math.random()*mykoeyeb.length);\n',
' var koeyew1=Math.floor(Math.random()*mykoeyew.length);\n',
' var koeyeb2=Math.floor(Math.random()*mykoeyeb.length);\n',
' var koeyew2=Math.floor(Math.random()*mykoeyew.length);\n',
' var ifid=Math.floor(Math.random()*10);\n',
'\n',
' ifid=0;\n',
' htmout_iframe = ""\n',
'// alert( "BUGS_340 kogrids ifid="+ifid );\n',
'\n',
' htmout_iframe=iframe_new(ifid);\n',
'\n',
' alert( "BUGS_350 kogrids htmout="+htmout );\n',
'\n',
'\n',
'\n',
' var max=4; var min=1;\n',
' var delay1=random_int(max,min);\n',
' var delay2=random_int(max,min);\n',
' var delay3=random_int(max,min);\n',
' var delay4=random_int(max,min);\n',
'\n',
' if( delay1 = 1 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay100.gif";\n',
' if( delay1 = 2 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay25.gif";\n',
' if( delay1 = 3 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay50.gif";\n',
' if( delay1 = 4 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay5.gif";\n',
'\n',
' if( delay2 = 1 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay100.gif";\n',
' if( delay2 = 2 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay25.gif";\n',
' if( delay2 = 3 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay50.gif";\n',
' if( delay2 = 4 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay5.gif";\n',
'// alert( "BUGS_400 delay1="+delay1+" delay2="+delay2 );\n',
' if (ko==0) ko=10;\n',
' if (kob==0) kob=10;\n',
' if (kow==0) kow=10;\n',
' if (koeyeb==0) koeyeb=10;\n',
' if (koeyew==0) koeyew=10;\n',
' if (koeyeb1==0) koeyeb1=10;\n',
' if (koeyew1==0) koeyew1=10;\n',
' if (koeyeb2==0) koeyeb2=10;\n',
' if (koeyew2==0) koeyew2=10;\n',
'\n',
' htmout = "\n";\n',
' htmout += "<a href="index.html" class="thumbnail" target=_blank>";\n',
' htmout += "<img src="\'+mykoeyeb[koeyeb1]+\'" height=75 alt=kob border=0>";\n',
'// htmout += "<span><img src="/imgs/kogrids/tn/tn_links_ko2us.png" height=400 alt="ko2.us" border=0></span>";\n',
' htmout += "<span><img src="/imgs/kogrids/links_ko2us.png" height=400 alt="ko2.us" border=0></span>";\n',
' htmout += "</a>";\n',
' htmout += "   ";\n',
' htmout += "<a href="ko_center/ko_center.php?q=login" class="thumbnail" target=_blank>";\n',
' htmout += "<img src="\'+mykoeyew[koeyew1]+\'" height=75 alt=koeyeb border=0>";\n',
'// htmout += "<span><img src="/imgs/kogrids/tn/tn_links_kologin.png" height=400 alt="kolgin" border=0></span>";\n',
' htmout += "<span><img src="/imgs/kogrids/links_kologin.png" height=400 alt="kolgin" border=0></span>";\n',
' htmout += "</a>";\n',
' htmout += "   ";\n',
' htmout += "<a href="cfaa.html" class="thumbnail" target=_blank>";\n',
' htmout += "<img src=""+mykoeyeb[koeyeb2]+"" height=75 alt=koeyew border=0>";\n',
'// htmout += "<span><img src="/imgs/kogrids/tn/tn_links_cfaa.png" height=400 alt="ko2.us" border=0></span>";\n',
' htmout += "<span><img src="/imgs/kogrids/links_cfaa.png" height=400 alt="ko2.us" border=0></span>";\n',
' htmout += "</a>";\n',
' htmout += "     ";\n',
' htmout += "<a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" class="thumbnail" target=_blank>";\n',
' htmout += "<img src="\'+mykoeyew[koeyew2]+\'" height=75 alt=kow border=0>";\n',
'// htmout += "<span><img src="/imgs/kogrids/tn/tn_links_bluehost.png" height=400 alt="bluehost.com" border=0></span>";\n',
' htmout += "<span><img src="/imgs/kogrids/links_bluehost.png" height=400 alt="bluehost.com" border=0></span>";\n',
' htmout += "</a>";\n',
' htmout += "\n";\n',
'\n',
' htmout_kogrids=htmout;\n',
'\n',
'\n',
' htmout = "";\n',
' htmout += "<hr color=black>\n";\n',
' htmout += "<hr color=white>\n";\n',
'\n',
' htmout += "<a href=#div_kogrids class="popover" >\n"; \n',
' htmout += " <img src=/imgs/btn/kop12.png onclick="kogrids(\'\');" border=0>\n";\n',
' htmout += " <span><img src=/imgs/btn/kop34.png onclick="kogrids(\'\');" border=0></span>\n";\n',
' htmout += " </a>\n";\n',
' htmout += "<button id="btn_kogrids" onclick="kogrids()">-= kogrids =-</button>\n";\n',
'\n',
' htmout += htmout_kogrids;\n',
' htmout += "<br><br><br><br><br>\n";\n',
' htmout += "<hr color=white>\n";\n',
' htmout += "<hr color=black>\n";\n',
'\n',
'\n',
'\n',
' htmout_w = "";\n',
' htmout_w += "<hr color=white>\n";\n',
'// htmout_w += "<button id="btn_kogrids_w" onclick="kogrids()">-= kogrids_w =-</button>\n";\n',
'\n',
' htmout_w += "<a href=# class="popover" >\n"; \n',
' htmout_w += " <img src=/imgs/btn/kop1.png onclick="kogrids(\'w\');" border=0>\n";\n',
' htmout_w += " <span><img src=/imgs/btn/kop2.png onclick="kogrids(\'w\');" border=0></span>\n";\n',
' htmout_w += " </a>\n";\n',
'\n',
' htmout_w += htmout_kogrids;\n',
' htmout_w += "<br><br><br><br><br>\n";\n',
' htmout_w += "<br><br><br><br><br>\n";\n',
' htmout_w += "<hr color=white>\n";\n',
'\n',
' htmout_b = "";\n',
' htmout_b += "<hr color=black>\n";\n',
' htmout_b += htmout_kogrids;\n',
'\n',
' htmout_b += "<a href=# class="popover" >\n"; \n',
' htmout_b += " <img src=/imgs/btn/kop3.png onclick="kogrids(\'b\');" border=0>\n";\n',
' htmout_b += " <span><img src=/imgs/btn/kop4.png onclick="kogrids(\'b\');" border=0></span>\n";\n',
' htmout_b += " </a>\n";\n',
' htmout_b += "<button id="btn_kogrids_b" onclick="kogrids()">-= kogrids_b =-</button>\n";\n',
' htmout_b += "<br><br><br><br>\n";\n',
'\n',
' htmout_b += "<hr color=black>\n";\n',
'\n',
' alert( "BUGS_411 kogrids_w htmout_w="+htmout_w );\n',
' var div_kogrids_w = document.getElementById("div_kogrids_w");\n',
' div_kogrids_w.innerHTML = htmout_w;\n',
'\n',
'// alert( "BUGS_410 kogrids htmout="+htmout );\n',
' var div_kogrids = document.getElementById("div_kogrids");\n',
' div_kogrids.innerHTML = htmout;\n',
'\n',
'// alert( "BUGS_412 kogrids_b htmout_b="+htmout_b );\n',
' var div_kogrids_b = document.getElementById("div_kogrids_b");\n',
' div_kogrids_b.innerHTML = htmout_b;\n',
'// document.getElementByID("div_kogrids").innerHTML = htmout;\n',
'// appends div_kogrids.insertAdjacentHTML("beforeend", htmout);\n',
'\n',
' alert( "BUGS_413 kogrids_b htmout_b="+htmout_b );\n',
'\n',
'\n',
'// var div_kogrids = document.getElementbyID("div_kogrids");\n',
'// var div_kogrids = document.getElementbyID("div_kogrids") = htmout;\n',
'// document.getElementById("div_kogrids").insertAdjacentHTML("beforebegin", htmout )\n',
'// div_kogrids.insertAdjacentHTML("beforeend", htmout);\n',
'// div_kogrids.show();\n',
'// document.write( htmout );\n',
'\n',
'// document.write("<a href=index.html target=_blank>")\n',
'// document.write("<img src="\'+myko[ko]+\'" height=30 border=0 alt=ko_bluehost_affiliate >")\n',
'// document.write("</a>")\n',
'// alert( "BUGS_420 kogrids htmout="+htmout );\n',
' }\n',
'\n',
'\n',
' function random_int(max,min) {\n',
' min = Math.ceil(min);\n',
' max = Math.floor(max);\n',
' return Math.floor(Math.random() * (max - min + 1)) + min; \n',
' }\n',
'\n',
'// random_kolink()\n',
' </script>\n',
'\n',
' <script id="script_random_imglnk">\n',
' function random_imglink(){\n',
' alert( "BGUS_RANDOM_IMGLINK if_src="+if_src )\n',
' var myimgs=new Array()\n',
'//specify random imgs below. You can have as many as you wish\n',
' myimgs[1]="/imgs/bg/bg_frax_ribbon.jpg"\n',
' myimgs[2]="/imgs/bg/bg_frax_thorn.jpg"\n',
' myimgs[3]="/imgs/bg/bg_newton05b.jpg"\n',
' myimgs[4]="/imgs/bg/bg_frax_thorn.jpg"\n',
' myimgs[5]="/imgs/bg/bg_frax_thorn.jpg"\n',
' myimgs[6]="/imgs/bg/bg_newton04bw.gif"\n',
' myimgs[7]="/imgs/bg/bg_newton05b.png"\n',
' myimgs[8]="/imgs/bg/bg_newton05b.png"\n',
' myimgs[9]="/imgs/bg/bg_newton05b.png"\n',
'\n',
' var ry=Math.floor(Math.random()*myimgs.length)\n',
' if (ry==0) ry=1\n',
' document.write("<img src="\'+myimgs[ry]+\'" border=0 height=200>")\n',
' }\n',
'// random_imglink()\n',
'// random_imglink()\n',
'// random_imglink()\n',
' </script>"\n',
'\n',
' <script id="script_iframe">\n',
' function iframe_new(ifid) {\n',
' alert( "BUGS_500 iframe_new " );\n',
' alert( "BUGS_501 iframe_new ifid="+ifid );\n',
' z=0;\n',
' j=0;\n',
' iflinks = new Array();\n',
' iflinks_av = new Array();\n',
' iflinks_svc = new Array();\n',
' iflinks_sl = new Array();\n',
' iflinks_vu = new Array();\n',
' iflinks_pdf = new Array();\n',
' iflinks_pn = new Array();\n',
' iflinks_zm = new Array();\n',
' return( "bugs_600 IFRAME"\n',
' }\n',
'\n',
' function iframe(ifid)\n',
'/*\n',
'// iflinks_bw\n',
' iflinks[j++]="/jkwii/whiteboard.html";\n',
' iflinks[j++]="/jkwii/whiteboard.html";\n',
' iflinks[j++]="/jkwii/whiteboard.html";\n',
' iflinks_svc[j++]="/jkwii/koh5_globe/koh5_globe.html";\n',
' iflinks[j++]="/jkwii/blackboard.html";\n',
' iflinks[j++]="/jkwii/blackboard.html";\n',
' iflinks[j++]="/jkwii/blackboard.html";\n',
'\n',
'\n',
'// iflinks_svc\n',
' iflinks_svc[j++]="/jkwii/js/threejs/examples/index.html";\n',
' iflinks_svc[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html";\n',
' iflinks_svc[j++]="/jkwii/js/gojs/index.html";\n',
'\n',
'\n',
'\n',
'// iflinks_pdf\n',
'\n',
' iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf";\n',
' iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf";\n',
' iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf";\n',
' iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Dreaming_materials_quantum_computers?XanaduAI.pdf";\n',
' iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_XanaduAI?Medium.pdf";\n',
'\n',
'// iflinks_sl\n',
' iflinks_sl[j++] = "/index_sl_kb-books-go-200807.html";\n',
' iflinks_sl[j++] = "/index_sl_kb-books-go-200808.html";\n',
' iflinks_sl[j++] = "/index_sl_kb-books-go-20130726.html";\n',
' iflinks_sl[j++] = "/index_sl_kb-books-jmh-cleveland.html";\n',
' iflinks_sl[j++] = "/index_sl_kb-books-jmh-jmh2015.html";\n',
'\n',
'// iflinks_av\n',
' iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivewaytraffic.mp4";\n',
' iflinks_av[j++] = "/av.mp4";\n',
' iflinks_av[j++] = "/index.mp4";\n',
' iflinks_av[j++] = "/index1.mp4";\n',
'\n',
'\n',
' iflinks_vu[j++]="/index_av.html";\n',
' iflinks_vu[j++]="/index_bb.html";\n',
' iflinks_vu[j++]="/index_bp.html";\n',
' iflinks_vu[j++]="/index_dd.html";\n',
' iflinks_vu[j++]="/index_dl.html";\n',
' iflinks_vu[j++]="/index_dp.html";\n',
' iflinks_vu[j++]="/index_fl.html";\n',
' iflinks_vu[j++]="/index_jg.html";\n',
' iflinks_vu[j++]="/index_pn.html";\n',
' iflinks_vu[j++]="/index_sc.html";\n',
' iflinks_vu[j++]="/index_sl.html";\n',
' iflinks_vu[j++]="/index_tl.html";\n',
' iflinks_vu[j++]="/index_tm.html";\n',
' iflinks_vu[j++]="/index_us.html";\n',
' iflinks_vu[j++]="/index_wc.html";\n',
' iflinks_vu[j++]="/index_av.html";\n',
' iflinks_vu[j++]="/index_zm.html";\n',
'\n',
' iflinks[j++]="/jkwii/whiteboard.html";\n',
' iflinks[j++]="/jkwii/whiteboard.html";\n',
' iflinks[j++]="/jkwii/whiteboard.html";\n',
'\n',
' iflinks[j++]="/jkwii/blackboard.html";\n',
' iflinks[j++]="/jkwii/blackboard.html";\n',
' iflinks[j++]="/jkwii/blackboard.html";\n',
'\n',
'\n',
'\n',
' iflen=iflinks.length;\n',
' iflen_svc=iflinks_svc.length;\n',
' iflen_av=iflinks_av.length;\n',
' iflen_sl=iflinks_sl.length;\n',
' iflen_pn=iflinks_vc.length;\n',
' iflen_vu=iflinks_vu.length;\n',
' iflen_pdf=iflinks_pdf.length;\n',
' iflen_zm=iflinks_zm.length;\n',
'\n',
'\n',
'\n',
' if( ifid == "" ) { ifid=0; }\n',
' if( ifid > iflen ) { ifid=iflen; }\n',
'// if_src = iflist[0];\n',
' if_src = iflist[ifid];\n',
' if( if_src == "" ) { \n',
' alert( "BUGS_600 iframe if_src="+if_src+" ifid="+ifid );\n',
' if_src=iflist[0]; \n',
' }\n',
' if_h=200;\n',
' if_w=800;\n',
' htmout = "";\n',
' htmout += "<a href="\'+if_src+\'" onclick="return false;" target=_blank>\n";\n',
' htmout += "<iframe id="iframe" frameborder="0" \n";\n',
' htmout += " height="\'+if_h+\'" marginheight="0" marginwidth="0" scrolling="no"\n"; \n',
' htmout += " src="\'+if_src+\'"\n";\n',
' htmout += " style="margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)" width="\'+if_w+\'">\n";\n',
' htmout += " </iframe>\n";\n',
' htmout += " </a>\n";\n',
' htmout += "<a href="\'+if_src+\'" class=thumbnail target=_blank class=thumbnail >\n";\n',
' htmout += " <img height=100 src="/imgs/gif/knotb.gif" >"\n',
' htmout += " </span><img height=300 src="/imgs/gif/knotp.gif" ></span>\n"\n',
' htmout += " </a>\n";\n',
' alert( "BUGS_4860 iflen="+iflen+" ifid="+ifid+" if_src="+if_src+" htmout="+htmout );\n',
' var div_iframe = document.getElementById("div_iframe");\n',
' div_iframe.innerHTML = htmout;\n',
' alert( "BUGS_1200 IRAMES htmout="+htmout )\n',
' return( htmout );\n',
' }\n',
'\n',
' </script>\n',
'\n',
'\n',
'\n',
'\n',
'\n',
'\n',
'\n',
'\n',
'\n',
' <script id="script_startup">\n',
' function startup() {\n',
'// clear_div_kov();\n',
' kogrids("");\n',
' kov_links_main();\n',
'// init_pano("canvas"); \n',
'// alert( "BUGS_455 startup done" );\n',
' }\n',
' </script>\n',
'\n',
'\n',
' <script id="script_kovbugs" >\n',
' function kov_links_main() {\n',
'// alert( "BUGS_510 kov_links_main() beg" );\n',
'// clear_div_kov();\n',
' show_kov_links( kov_links );\n',
'// alert( "BUGS_520 kov_links_main() beg" );\n',
' }\n',
' </script>\n'
)
return( htm_ko_js)
def ht_ko_htm(a0,a1,a2,a3):
htm_ko_htm = (
'<body onload="startup();">\n',
'\n',
'<br><br><br><br>\n',
'<br><br><br><br>\n',
'\n',
' <div id="div_kogrids_w"></div>\n',
'\n',
'\n',
'<br><br><br><br><br>\n',
'<hr color=yellow>\n',
' <button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>\n',
' <a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">\n',
' <img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow("hide","all")">\n',
' <span><img height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow("hide","all")"></span>\n',
' <a>\n',
'\n',
'<!-- <img src=/imgs/gif/rings.gif onclick="kovs_hideshow("show","all")"> -->\n',
' <a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">\n',
' <img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow("show","all")">\n',
' <span><img height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow("show","all")"></span>\n',
' <a>\n',
'\n',
' <script id="script_bugs" >\n',
' function bugs(h,d) {\n',
' alert( "BUGS " );\n',
' }\n',
' </script>\n',
'\n',
' <button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow("hide","all")>\n',
' -= kovs_hide_all =-\n',
' </button>\n',
' <button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow("show","all")>\n',
' -= kovs_show_all =-\n',
' </button>\n',
'\n',
'\n',
' <div id="v_hoverdate">\n',
' <span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>\n',
' <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>\n',
' </div>\n',
' <script id="script_hoverdate" >\n',
' kotxt = \"\";\n',
' kotxt += "-== kako =- preview embed vu emchat -= 20190215_1900 =-";\n',
'// kotxt += new Date().toLocaleString();\n',
'// message: "hoverdate " + kotxt;\n',
' var app2 = new Vue({el: "#v_hoverdate",\n',
' data: {\n',
' message: "hover_dttm " + new Date().toLocaleString() + kotxt\n',
' }\n',
' })\n',
' </script>\n',
'\n',
'\n',
' <dic id="div_vues" ><h1>div_vues</h1></div>\n',
'<!-- <button type="button" onclick="script_ajax()">loadlist</button> -->\n',
'\n',
'\n',
' <hr color=yellow>\n',
' <div id="dynDataField"></div>\n',
' <hr color=yellow>\n',
'\n',
' <h1 id="ajaxdb3">ajaxdb3.</h1>\n',
' <button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>\n',
' <script id="script_ajaxdb3">\n',
' db3=indexx.db3;\n',
' sql="select * from list limit 5";\n',
' function script_ajaxdb3(db3,sql) {\n',
' $("button").click(function(){\n',
' $.post("indexx.php", {\n',
' db3: db3,\n',
' sql: "select * from list limit 10"\n',
' },\n',
' function(data, status){\n',
' lines = data.split("\n");\n',
' linelen=lines.length;\n',
' htmout=\"\";\n',
' alert( "BUGS1240 linelen="+linelen );\n',
' for( z=0; z<lines.length; z++ ) {\n',
' line=lines[z];\n',
' if( line.length < 3 ) continue;\n',
' z=z+1; \n',
' flds = line.split(" ");\n',
' img = flds[8];\n',
' dd = flds[7];\n',
' mth = flds[5];\n',
' yyyy = flds[6];\n',
' size = flds[4];\n',
'// htmout += line+"\n";\n',
' htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";\n',
' for( z=0; z<lines.length; z++ ) {\n',
' line=lines[z];\n',
' alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );\n',
' flds = lines.split(" ");\n',
' fldlen = flds.length;\n',
' alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );\n',
' psv=parseline(line);\n',
' alert( "BUGS_1251 ajaxdb3 psv="+psv );\n',
'// (url,img,id,tn,grp,desc) = parseline(line);\n',
'// url = line.split(" ")[0];\n',
'// img = line.split(" ")[1];\n',
'// alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );\n',
'// id = line.split("|")[2];\n',
'// tn = line.split("|")[3];\n',
'// grp = line.split("|")[4];\n',
'// desc = line.split("|")[5];\n',
'\n',
' htmout += "<div id="drag">\n";\n',
' htmout += "<div class="drg" >\n";\n',
' htmout += "<a href="+url+" class="thumbnail" target=_blank>\n";\n',
' htmout += " <img class="drg" src="+img+" border=0>\n";\n',
' htmout += " <span><img class="drg" src="+img+" border=0></span>\n";\n',
' htmout += " </a>\n";\n',
' htmout += " </div>\n";\n',
' htmout += " </div>\n";\n',
'// alert( "BUGS_1248 ajaxdb3 htmout="+htmout );\n',
' }\n',
'\n',
'// getelementbyID("div_ajaxdb3");\n',
'\n',
' div_ajaxdb3 = document.getElementById("div_ajaxdb3");\n',
' div_ajaxdb3.insertAdjacentHTML("afterbegin", htmout);\n',
'// document.write( htmout );\n',
' });\n',
' }); \n',
' }\n',
'\n',
' function parseline(line) {\n',
' alert( "BUGS_1280 line="+line );\n',
' flds=line.split(" ");\n',
'\n',
' url="index.html";\n',
' img="/imgs/gif/ringsb.gif";\n',
' id="jkwii";\n',
' tn="/imgs/btn/ringsd.gif";\n',
' grp="group";\n',
' desc="timejak jkwii";\n',
' psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc\n',
'\n',
'// return(url,img,id,tn,grp,desc);\n',
' return(psv);\n',
' }\n',
' </script>\n',
'\n',
' <hr color=yellow>\n',
' <div id="div_ajaxdb3"></div>\n',
' <hr color=yellow>\n',
'\n',
' <a href=/svc/emchat/index.html class="thumbnail" target=_blank>\n',
' <img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>\n',
' <span><img class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>\n',
' </a>\n',
'\n',
' <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>\n',
' <img class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>\n',
' <span><img class="drg" height=400 src=/imgs/links/tn/tn_meet.png border=0></span>\n',
' </a>\n',
'\n',
' <a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>\n',
' <img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>\n',
' <span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>\n',
' </a>\n',
'\n',
' <a href=# v-on:click="showhide" class=thumbnail >\n',
' <img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>\n',
' <span><img class="drg" v-on:click="showhide" height=400 src=/tl/imgs/construction_sawhorse.gif border=0></span>\n',
' </a>\n',
'\n',
' <a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>\n',
' <img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>\n',
' <span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>\n',
' </a>\n',
'\n',
' <a class="thumbnail" v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>\n',
' <img class="drg" v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>\n',
' <span><img class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>\n',
' </a>\n',
'\n',
'\n',
'\n',
' <br><br>\n',
' <hr color=red>\n',
' <hr color=white>\n',
' <hr color=blue>\n',
' <h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>\n',
' !! NO wall !! NO sawhorse !! NO tape !! NO chalk !!\n',
' <br>\n',
' !! NO EAGLES - OUR NO EAGLES !!\n',
'\n',
' <h1> \n',
' <a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>\n',
' <img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png border=0>\n',
' </a>\n',
' <a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>\n',
' <img src=/imgs/links_201901/tn/tn_youb_across_the_border.png border=0>\n',
' </a>\n',
'\n',
' <a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>\n',
' <img src=/imgs/links/tn/tn_Image332.png border=0>\n',
'<!-- <span><img src=/imgs/links/Image332.png border=0></span> -- >\n',
' </a>\n',
'\n',
'\n',
'\n',
'<!--\n',
' <a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>\n',
' <img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png border=0>\n',
' </a>\n',
' -->\n',
'<!-- -->\n',
' <br>\n',
'\n',
' <span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >\n',
' abcdefghijklmnopqrstuvwxyz <br>\n',
' ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>\n',
' 01234567890\n',
' </font></span>\n',
' <hr>\n',
'\n',
'<!-- <button type="kogrids" id="kogrids" onclick="kogrids(\"\")">-= kogrids =-</button> -->\n',
' <div id="div_kogrids"></div>\n',
'\n',
'\n',
'<!--\n',
' <div id="kov">\n',
' <div>\n',
' kov is it: kov\n',
' </div>\n',
' <button v-on:click="showhide_kov">showhide_kov</button>\n',
' <img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >\n',
' <img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >\n',
' <img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >\n',
'\n',
' <div v-show="collapsed" class="detail"> \n',
' kov detail\n',
' <hr>\n',
' <a href=https://meet.jit.si/ko class="thumbnail" target=_blank>\n',
' <img src=/imgs/links/tn/tn_meet.png border=0>\n',
' <span><img src=/imgs/links/meet.png border=0></span>\n',
' </a>\n',
' <hr>\n',
' </div>\n',
' </div>\n',
' <script>var kov = new Vue({ el: "#kov",\n',
' data: {collapsed: false},\n',
' methods: {\n',
' showhide_kov: function() {\n',
' if (!this.collapsed) this.collapsed = true;\n',
' else this.collapsed = false;\n',
'// document.body.style.background = "darkslategrey";\n',
'// document.body.style.color = "black";\n',
'// document.body.style.fontfamily = "yokkmokkOT";\n',
'// document.body.style.fontsize = "24pt";\n',
' },\n',
' showhide_kov1: function() {\n',
' if (!this.collapsed) this.collapsed = true;\n',
' else this.collapsed = false;\n',
' },\n',
' showhide_kov2: function() {\n',
' if (!this.collapsed) this.collapsed = true;\n',
' else this.collapsed = false;\n',
' }\n',
' }\n',
' }); \n',
' </script>\n',
'\n',
' <hr>\n',
'abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890\n',
' <hr>\n',
' -->\n',
'\n',
'\n',
' <div id="kov_ko">\n',
' <div>\n',
' ko: kov_ko\n',
' </div>\n',
' <button v-on:click="showhide_kov_ko">showhide_kov_ko</button>\n',
' <img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >\n',
' <img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >\n',
' <img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >\n',
'\n',
' <div v-show="collapsed" class="detail_ko"> \n',
' ko\n',
' <hr>\n',
' <a href=kov_ko.html class="thumbnail" target=_blank>\n',
' <img src=/imgs/kov/tn/tn_kov_ko.png border=0>\n',
' <span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>\n',
' </a>\n',
' <hr>\n',
'\n',
'\n',
'\n',
' <div id="drag" >\n',
' <a class="popover" href="/?q=bigtn_drag1">\n',
' <img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">\n',
' <span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>\n',
' </a>\n',
' </div>\n',
'\n',
'\n',
'\n',
'<!--\n',
' <div id="drop">\n',
' <span id="sw"><h1>droptop</h2></span>\n',
' <a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>\n',
' <img height=200 width=300\n',
' src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >\n',
' </a>\n',
' </div>\n',
' -->\n',
'\n',
'\n',
'\n',
' </div>\n',
' </div>\n',
'\n',
'\n',
'\n',
' <div id="div_showhide" hidden>\n',
' <button type="button" id="show">Show Content</button>\n',
' <button type="button" id="hide">Hide Content</button>\n',
' <button type="show_dd" id="show_dd">Show_dd</button>\n',
' <button type="hide_dd" id="hide_dd">Hide_dd</button>\n',
' <button type="show_bb" id="show_bb">Show_bb</button>\n',
' <button type="hide_bb" id="hide_bb">Hide_bb</button>\n',
' <button type="show_tl" id="show_tl">Show_tl</button>\n',
' <button type="hide_tl" id="hide_tl">Hide_tl</button>\n',
' <button type="show_colors" id="show_colors">Show_colors</button>\n',
' <button type="hide_colors" id="hide_colors">Hide_colors</button>\n',
' <button type="show_fonts" id="show_fonts">Show_fonts</button>\n',
' <button type="hide_fonts" id="hide_fonts">Hide_fonts</button>\n',
' <button type="show_alldivs" id="show_alldivs">Show_alldivs</button>\n',
' <button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>\n',
' </div>\n',
'\n',
' <div id="item" hidden>\n',
' <hr><h1>div_showhide</h1><hr>\n',
' </div>\n',
'\n',
' <script id="script_showhide">\n',
' $( "#show" ).click(function() {$("#item").show(); });\n',
' $( "#hide" ).click(function() {$("#item").hide();});\n',
' $( "#show_dd" ).click(function() {$("#div_dd").show(); });\n',
' $( "#hide_dd" ).click(function() {$("#div_dd").hide();});\n',
' $( "#show_bb" ).click(function() {$("#div_bb").show(); });\n',
' $( "#hide_bb" ).click(function() {$("#div_bb").hide();});\n',
' $( "#show_tl" ).click(function() {$("#div_tl").show(); });\n',
' $( "#hide_tl" ).click(function() {$("#div_tl").hide();});\n',
' $( "#show_jkwii" ).click(function() {$("#div_jkwii").show(); });\n',
' $( "#hide_jkwii" ).click(function() {$("#div_jkwii").hide();});\n',
' $( "#show_colors" ).click(function() {$("#div_colors").show(); });\n',
' $( "#hide_colors" ).click(function() {$("#div_colors").hide();});\n',
' $( "#show_fonts" ).click(function() {$("#div_fonts").show(); });\n',
' $( "#hide_fonts" ).click(function() {$("#div_fonts").hide();});\n',
' $( "#show_alldivs" ).click(function() {$("#div_alldivs").show(); });\n',
' $( "#hide_alldivs" ).click(function() {$("#div_alldivs").hide();});\n',
' </script>\n',
' </div>\n',
'\n',
' </div>\n',
' </div>\n',
'\n',
' <script>var kov_ko = new Vue({ el: "#kov_ko",\n',
' data: {collapsed: false},\n',
' methods: {\n',
' showhide_kov_ko: function() {\n',
' if (!this.collapsed) this.collapsed = true;\n',
' else this.collapsed = false;\n',
' document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; \n',
'// font-style font-variant font-weight font-size line-height font-family\n',
'\n',
' },\n',
' showhide_kov_ko1: function() {\n',
' if (!this.collapsed) this.collapsed = true;\n',
' else this.collapsed = false;\n',
' },\n',
' showhide_kov_ko2: function() {\n',
' if (!this.collapsed) this.collapsed = true;\n',
' else this.collapsed = false;\n',
' }\n',
' }\n',
' }); \n',
' </script>\n',
'\n',
'\n',
' <hr color=yellow>\n',
' <hr color=white>\n',
' <hr color=yellow>\n',
'\n',
' <div id="div_neave_im" >\n',
' <iframe frameborder="0" height="250" marginheight="0" marginwidth="0" scrolling="no" \n',
' src="/index_neave_im.html"\n',
' style="margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)" width="100%">\n',
' </iframe>\n',
' <a class="popover" href="/index_neave_im.html" target=_blank>\n',
' <img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im" border=0>\n',
' <span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>\n',
' </a>\n',
' </div>\n',
'\n',
' <div id="div_iframe" height-"150" ><div>\n',
'\n',
' <div id="div_neave_wobble" >\n',
' \n',
' <a class="popover" href="/index_neave_wobble.html" target=_blank>\n',
' <img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble" border=0>\n',
' <span><img height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>\n',
' </a>\n',
' <iframe frameborder="0" height="150" marginheight="0" marginwidth="0" scrolling="no" \n',
' src="/index_neave_wobble.html" \n',
' style="margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)" width="100%">\n',
' </iframe>\n',
' </div>\n',
' <div id="div_files" >\n',
' <output id="zonelist"></output>\n',
' <div id="dropzone">\n',
' dropzone\n',
' <div id="div_canvas" style="position:relative; width:400px; height:200px background:white">\n',
' <canvas id="canvas_dropzone" style="z-index: 1;\n',
' position:absolute;\n',
' left:0px;\n',
' top:0px;\n',
' " height="100px" width="200" background-color="darkSlategrey" color="ivory">\n',
' WARN_1387 unauthorized access has been logged\n',
' </canvas>\n',
' </div>\n',
'\n',
' <script name="script_fileselect">\n',
' function handleFileSelect(evt) {\n',
' evt.stopPropagation();\n',
' evt.preventDefault();\n',
'\n',
' var files = evt.dataTransfer.files; // FileList object.\n',
'\n',
'// files is a FileList of File objects. List some properties.\n',
' var output = [];\n',
' for (var i = 0, f; f = files[i]; i++) {\n',
' output.push("<li><strong>", escape(f.name), "</strong> (", f.type || "n/a", ") - ",\n',
' f.size, " bytes, last modified: ",\n',
' f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : "n/a",\n',
' "</li>");\n',
' }\n',
' document.getElementById("zonelist").innerHTML = "<ul>" + output.join(\"\") + "</ul>";\n',
' }\n',
'\n',
' function handleDragOver(evt) {\n',
' evt.stopPropagation();\n',
' evt.preventDefault();\n',
' evt.dataTransfer.dropEffect = "copy"; // Explicitly show this is a copy.\n',
' }\n',
'\n',
' // Setup the dnd listeners.\n',
' var dropZone = document.getElementById("dropzone");\n',
' dropZone.addEventListener("dragover", handleDragOver, false);\n',
' dropZone.addEventListener("drop", handleFileSelect, false);\n',
'</script>\n',
'\n',
'<hr><hr><hr>\n',
' <label class="fileContainer">\n',
' files\n',
' <input id="files" name="files[]" multiple=\"\" type="file">\n',
' </label>\n',
'\n',
'\n',
'<output id="zonelist"></output>\n',
'\n',
'<script>\n',
' function handleFileSelect(evt) {\n',
' var files = evt.target.files; // FileList object\n',
'\n',
' // files is a FileList of File objects. List some properties.\n',
' var output = [];\n',
' for (var i = 0, f; f = files[i]; i++) {\n',
' output.push("<li><strong>", escape(f.name), "</strong> (", f.type || "n/a", ") - ",\n',
' f.size, " bytes, last modified: ",\n',
' f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : "n/a",\n',
' "</li>");\n',
' }\n',
' document.getElementById("zonelist").innerHTML = "<ul>" + output.join(\"]") + "</ul>";\n',
' }\n',
'\n',
' document.getElementById("files").addEventListener("change", handleFileSelect, false);\n',
' </script>\n',
'\n',
' <div id="div_files2" hidden >\n',
' <label class="fileContainer">\n',
' files2\n',
' <input id="files" name="files[]" multiple=\"\" type="file">\n',
' </label>\n',
' <output id="zonelist"></output>\n',
' </div>\n',
'\n',
'<script>\n',
' function handleFileSelect(evt) {\n',
' var files = evt.target.files; // FileList object\n',
'\n',
' // Loop through the FileList and render image files as thumbnails.\n',
' for (var i = 0, f; f = files[i]; i++) {\n',
'\n',
'// Only process image files.\n',
' if (!f.type.match("image.*")) { continue; }\n',
'\n',
' var reader = new FileReader();\n',
'\n',
' // Closure to capture the file information.\n',
' reader.onload = (function(theFile) {\n',
' return function(e) {\n',
' // Render thumbnail.\n',
' var span = document.createElement("span");\n',
' span.innerHTML = ["<img class="thumb" src=\"\", e.target.result,\n',
' \"\" title=\"\", escape(theFile.name), \"\"/>"].join(\"\");\n',
' document.getElementById("zonelist").insertBefore(span, null);\n',
' };\n',
' })(f);\n',
'\n',
' // Read in the image file as a data URL.\n',
' reader.readAsDataURL(f);\n',
' }\n',
' }\n',
'\n',
' document.getElementById("files").addEventListener("change", handleFileSelect, false);\n',
'</script>\n',
'\n',
' <script id="script_previewfile">\n',
' function previewfile(file) {\n',
' if (tests.filereader === true && acceptedTypes[file.type] === true) {\n',
' var reader = new FileReader();\n',
' reader.onload = function (event) {\n',
' var image = new Image();\n',
' image.src = event.target.result;\n',
' image.width = 250; // a fake resize\n',
' holder.appendChild(image);\n',
' };\n',
'\n',
' reader.readAsDataURL(file);\n',
' } \n',
' else {\n',
' holder.innerHTML += \n',
' "<p>done: koupload" \n',
' + file.name \n',
' + " " \n',
' + (file.size ? (file.size/1024|0) + "K" : \"\"); \n',
' console.log(file);\n',
' }\n',
' }\n',
'\n',
' function readfiles(files) {\n',
' debugger;\n',
' var formData = tests.formdata ? new FormData() : null;\n',
' for (var i = 0; i < files.length; i++) {\n',
' if (tests.formdata) formData.append("file", files[i]);\n',
' previewfile(files[i]);\n',
' }\n',
'\n',
'// now post a new XHR request\n',
' if (tests.formdata) {\n',
' var xhr = new XMLHttpRequest();\n',
' xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok");\n',
'// xhr.open("POST", "ka6/ko/bin/php/index.php?q=upload,filenames");\n',
' xhr.onload = function() {\n',
' progress.value = progress.innerHTML = 100;\n',
' };\n',
'\n',
' if (tests.progress) {\n',
' xhr.upload.onprogress = function (event) {\n',
' if (event.lengthComputable) {\n',
' var complete = (event.loaded / event.total * 100 | 0);\n',
' progress.value = progress.innerHTML = complete;\n',
' }\n',
' }\n',
' }\n',
'\n',
' xhr.send(formData);\n',
' }\n',
' }\n',
'\n',
' if (tests.dnd) { \n',
' holder.ondragover = function () { this.className = "hover"; return false; };\n',
' holder.ondragend = function () { this.className = \"\"; return false; };\n',
' holder.ondrop = function (e) {\n',
' this.className = \"\";\n',
' e.preventDefault();\n',
' readfiles(e.dataTransfer.files);\n',
' }\n',
' } \n',
' else {\n',
' fileupload.className = "hidden";\n',
' fileupload.querySelector("input").onchange = function () {\n',
' readfiles(this.files);\n',
' };\n',
' }\n',
' </script>\n',
'\n',
' <script id="script_myfilework>\n',
'\n',
' funtion myfilework( j, file ) {\n',
'\n',
' alert( j+" file="+file );\n',
' }\n',
'\n',
' </script>\n',
'\n',
'\n',
'\n',
'\n',
'\n',
' <script id="script_upload_input">>\n',
' var upload = document.getElementsByTagName("input")[0],\n',
' holder2 = document.getElementById("holder2"),\n',
' state = document.getElementById("status");\n',
'\n',
' if (typeof window.FileReader === "undefined") {\n',
' state.className = "fail";\n',
' } \n',
' else {\n',
' state.className = "success";\n',
' state.innerHTML = "File API & FileReader available";\n',
' }\n',
' \n',
' upload.onchange = function (e) {\n',
' e.preventDefault();\n',
'\n',
' var file = upload.files[0],\n',
' reader = new FileReader();\n',
' reader.onload = function (event) {\n',
' var img = new Image();\n',
' img.src = event.target.result;\n',
'// note: no onload required since we"ve got the dataurl...I think! :)\n',
' if (img.width > 560) { // holder width\n',
' img.width = 560;\n',
' }\n',
' holder2.innerHTML = \"\";\n',
' holder.appendChild(img);\n',
' };\n',
' reader.readAsDataURL(file);\n',
'\n',
' return false;\n',
' };\n',
'\n',
'// var formData = new FormData();\n',
'// formData.append("part_num", "123ABC"); \n',
'// formData.append("part_price", 7.95);\n',
'// formData.append("part_image", somefile)\n',
'//\n',
'// var xhr = new XMLHttpRequest();\n',
'// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/"); \n',
'// xhr.send(formData);\n',
' </script>\n',
'\n',
'\n',
' <script id="script_ajaxdb3">\n',
'// exit function if nothing has been typed in the textbox\n',
' function showName(str){\n',
' if (str.length == 0){ \n',
' document.getElementById("txtName").innerHTML=\"\"; //clear previous results\n',
' return;\n',
' }\n',
'\n',
'// code for IE7+, Firefox, Chrome, Opera, Safari\n',
'// code for IE6, IE5\n',
' if (window.XMLHttpRequest) {\n',
' xmlhttp=new XMLHttpRequest();\n',
' } \n',
' else {\n',
' xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");\n',
' }\n',
' xmlhttp.onreadystatechange=function() {\n',
' if (xmlhttp.readyState == 4 && xmlhttp.status == 200){\n',
' document.getElementById("txtName").innerHTML=xmlhttp.responseText;\n',
' }\n',
' }\n',
'// xmlhttp.open("POST","idx.php?name="+str,true);\n',
' xmlhttp.open("GET","ajaxdb_page.php?name="+str,true);\n',
' xmlhttp.send();\n',
' </script>\n',
'\n',
'\n',
' <br><br><br><br><br>\n',
' <div id="div_kogrids_b"></div>\n',
'\n',
'\n',
' <script id="script_gethint_ajax">\n',
' function showHint(str) {\n',
' if (str.length == 0) {\n',
' document.getElementById("txtHint").innerHTML = \"\";\n',
' return;\n',
' } \n',
' else {\n',
' var xmlhttp = new XMLHttpRequest();\n',
' xmlhttp.onreadystatechange = function() {\n',
' if (this.readyState == 4 && this.status == 200) {\n',
' document.getElementById("txtHint").innerHTML = this.responseText;\n',
' }\n',
' };\n',
' xmlhttp.open("GET", "gethint.php?q=" + str, true);\n',
' xmlhttp.send();\n',
' }\n',
' }\n',
' </script>\n',
'\n',
' <script id="script_ajaxjs" >\n',
'\n',
'\n',
'function js_ajax() {\n',
' $(document).ready(function(){\n',
' $.ajax({\n',
' url: "idx.php",\n',
' type: "get",\n',
' dataType: "JSON",\n',
' success: function(response){\n',
' var len = response.length;\n',
' for(var i=0; i<len; i++){\n',
' var id = response[i].id;\n',
' var username = response[i].username;\n',
' var name = response[i].name;\n',
' var email = response[i].email;\n',
'\n',
' var tr_str = "<tr>" +\n',
' "<td align=\"center\">" + (i+1) + "</td>" +\n',
' "<td align=\"center\">" + username + "</td>" +\n',
' "<td align=\"center\">" + name + "</td>" +\n',
' "<td align=\"center\">" + email + "</td>" +\n',
' "</tr>";\n',
' $("#userTable tbody").append(tr_str);\n',
' }\n',
'\n',
' }\n',
' });\n',
' });\n',
' return( $ajaxjs );\n',
' }\n',
'\n',
'\n',
' </script>\n',
'\n',
'\n',
' <h1>gethint_ajax</h1>\n',
' <script id="script_gethint_ajax">\n',
' function showHint(str) {\n',
' if (str.length == 0) {\n',
' document.getElementById("txtHint").innerHTML = \"\";\n',
' return;\n',
' } \n',
' else {\n',
' var xmlhttp = new XMLHttpRequest();\n',
' xmlhttp.onreadystatechange = function() {\n',
' if (this.readyState == 4 && this.status == 200) {\n',
' document.getElementById("txtHint").innerHTML = this.responseText;\n',
' }\n',
' };\n',
' xmlhttp.open("POST", "idx.php?hint=" + str, true);\n',
' xmlhttp.send();\n',
' }\n',
' }\n',
' </script>\n',
'\n',
'\n',
' </body>\n',
' </html> \n'
)
return(htm_ko_htm)
def ht_ani(img,size):
# print "{} htmout_ani . .".format(a0)
path=os.path.dirname(img)
base=os.path.basename(img)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace(".", "" )
tag="{}".format(file)
btn="imgs/gifs/firebubble.gif"
img1="imgs/gifs/rings.gif"
img2="imgs/gifs/knot.gif"
url="/?q={}".format(img)
htmout_ani = (
'<html>',
' <head>',
' <title>-= htmout_ani =- {}_{}_{} -= 20192015_0200 =-</title>'.format(tag,w,h),
' ',
' <script type = "text/javascript">',
' var pattern = new Image();',
' ',
' function animate() {',
' pattern.src = \"{}\";.format(img),\n',
' setInterval(drawShape, 100);',
' }',
' ',
' function drawShape() {',
' ',
' // get the canvas element using the DOM',
' var canvas = document.getElementById("canvas_{}");'.format(tag),
' ',
' // Make sure we dont execute when canvas isnt supported',
' if (canvas.getContext) {',
' ',
' // use getContext to use the canvas for drawing',
' var ctx = canvas.getContext("2d");',
' ',
' ctx.fillStyle = "rgba(0,0,0,0.4)";',
' ctx.strokeStyle = "rgba(0,153,255,0.4)";',
' ctx.save();',
' ctx.translate(150,150); ',
' ',
' var time = new Date(); ',
' ctx.rotate( ((2*Math.PI)/6)*time.getSeconds() + ( (2*Math.PI)/6000)*time.getMilliseconds() );',
' ctx.translate(0,28.5);',
' ctx.drawImage(pattern,-3.5,-3.5);',
' ctx.restore();',
' } else {',
' alert("You need Safari or Firefox 1.5+ to see this demo.");',
' }',
' }',
' </script>',
' </head>',
'<body onload = "animate();">',
'<a href"{}" target=_blank class="thumbnail" id="drag">'.format(url),
' <img src="{}" border=0 alt="{}" class="drg" >'.format( img1,tag ),
' <span><img src="{}" border=0 alt="{}" class="drg" ></span>'.format( img2,tag ),
' </a>',
' <h1> canvas_{} width={} height={}></h1>'.format(tag,w,h),
' <canvas id = "canvas_{}" width = "{}" height = "{}"></canvas>'.format(tag,w,h),
' </html>'
)
return(htmout_ani)
def htm_ani(args):
print "pqpqpqpqpqpqpqpqpq"
print "{} ht_ani . .".format( a0)
print "bdndndndndndndndndnd"
img=a2
size=a3
if( a2 != "." ): img="./heart/heart_0.png"
else: img=a2
if( a3 != "." ): size="600x800"
else: size=a3
# img="./heart/heart_0.png"
# size="600x800"
path=os.path.dirname(img)
base=os.path.basename(img)
file=os.path.splitext(base)[0]
ext=os.path.splitext(base)[1].replace(".", "" )
tag="{}".format(file)
if( size == "" ): size="400x500"
# w=size.split("x")[0]
# h=size.split("x")[1]
w=400
h=500
htmout=ht_ani( img, size )
htmfil="ani_{}_{}.html".format( tag, w )
print "htmfil={}".format(htmfil)
print "htmout={}".format(htmout)
# htmout = "<html><head><titld></title></head><body></body></html>"
ht = open( htmfil, "wb" )
# for line in htmout:
# ht.write( htmout )
ht.close()
ht = open(htmfil, "wb" )
htmout = ht_ani(img,size)
for line in htmout:
ht.write(line)
ht.close()
print "{}".format( htmout)
exit()
def cmds(args):
import ko_cfg
progid=ko_cfg.progid
fildb3=ko_cfg.fildb3
j=ko_cfg.j
k=ko_cfg.k
db3nam="{}".format(fildb3.split(".")[0])
dttm=ko_dttm("")
arglen=len(args)
a0=""
a1=""
a2=""
a3=""
a4=""
a5=""
if( arglen > 1): a1=args[1]
if( arglen > 2): a2=args[2]
if( arglen > 3): a3=args[3]
if( arglen > 4): a4=args[4]
if( arglen > 5): a5=args[5]
if( arglen > 6): a6=args[6]
if( a1 == "read" ):
print "{} {} READ a1={} a2={} a3={} a4={}".format( progid,dttm,a1,a2,a3,a4)
file=a2
j=0
for line in read( file ):
j=j+1
print "j={} line={}".format( j, line )
exit()
if( a1 == "sql" ):
print "{} {} SQL a1={} a2={} a3={} a4={}".format( progid,dttm,a1,a2,a3,a4)
fildb3=a2
sqltbl=a3
sqlcmd=a4
sqlout = sqlie3(fildb3,sqltbl, sqlcmd)
exit()
if( a1 == "write" ):
print "{} {} WRITE a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
ifile=a2
ofile=a3
out=""
j=0
o=open(ofile,"wb")
for line in read( ifile ):
j=j+1
out += "j={} line={}".format( j, line )
o.write( out )
o.close
exit()
if( a1 == "wii" ):
print "{} {} WII a1={} a2={} a3={} a4={}".format( progid,dttm,a1,a2,a3,a4)
wii( a1, a2, a3 ,a4)
exit()
if( a1 == "jkwii" ):
print "{} {} WII a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
jkwii( a1, a2, a3, a4 )
exit()
if( a1 == "skwii" ):
print "{} {} WII a1={} a2={} a3={} a4={}".format(progid,dttm,a1,a2,a3,a4)
wii( a1, a2, a3 )
exit()
if( a1 == "ht_ani" ):
print "{} {} HT_ANI a1={} a2={} a3={} a4={}".format( progid,dttm,a1,a2,a3,a4)
htmout = ht_ani(args)
print "{}".format(htmout)
exit()
if( a1 == "ht" ):
print "{} {} HT a1={} a2={} a3={} a4={}".format( progid,dttm,a1,a2,a3,a4)
htmout = ht( a0, a1, a2, a3, a4 )
print htmout
exit()
if( a1 == "go_ht" ):
print "{} {} HT a1={} a2={} a3={} a4={}".format( progid,dttm,a1,a2,a3,a4)
htmout = ht( args )
print htmout
exit()
if( a1 == "go" ) or ( a1 == "g" ):
# go_todo(args)
go(args)
return()
if( a1 == "sql_cr_all" ) or ( a1 == "cr_all" ):
sql3_cr_all(args)
return()
if( a1 == "sql3_drop_all" ) or ( a1 == "drop_all" ):
# sql3_drop_all(args)
sql3_drop_all(args)
return()
if( a1 == "sql3_ins_mov2mp4" ) or ( a1 == "mov2mp4" ):
# go_todo(args)
sql3_ins_mov2mp4(args)
return()
if( a1 == "termh" ) or ( a1 == "help" ):
# term_help(args)
termh(args)
if( a1 == "terms" ) or ( a1 == "test_select_line" ):
# test_select_line(self)
terms(self)
if( a1 == "termx" ) or ( a1 == "executeCommandList" ):
# executeCommandList(self, cmdList)
termx(self, cmdList)
# if( a1 == "terml" ) or ( a1 == "test_select_line_via_line_numbers" ):
if( a1 == "terml" ) or ( a1 == "terml" ):
# test_select_line_via_line_numbers(self)
termn(self)
# if( a1 == "termi" ) or ( a1 == "input" ):
if( a1 == "termi" ) or ( a1 == "termi" ):
# input(self, engine)
termi(self, engine)
# if( a1 == "termm" ) or ( a1 == "mainloop" ):
if( a1 == "termm" ) or ( a1 == "term_main" ):
# mainloop(screen)
screen=curses.initscr()
term_main(screen)
# if( a1 == "termg" ) or ( a1 == "_get_input" ):
if( a1 == "termg" ) or ( a1 == "termg" ):
# _get_input(self, wait_tenths)
termg(self, wait_tenths)
if( a1 == "curses" ) or ( a1 == "c" ):
kocur=kocurses(args)
if ( a1 == "terminal" ) or ( a1 == "tm" ) or ( a1 == "shell" ):
kotm=koterm(args)
if( a1 == "mp4gifs" ):
mp4gifs(args)
exit()
if( a1 == "mp4gif" ):
mp4=a2
mp4gif(mp4)
exit()
if( a1 == "findts" ):
findts(args)
exit()
if( a1 == "findt" ):
ifile=a2
findmatch=a3
tailmatch=a3
ofile=a4
print "MSG_7500 FINDDT: ifile={} findmath={} tailmatch={} ofile={}".format(ifile,findmatch,tailmatch, ofile)
findt(ifile,findmatch, tailmatch, ofile)
exit()
if( a1 == "findf" ):
findf(args)
exit()
if( a1 == "findd" ):
findd(args)
exit()
if( a1 == "find" ):
find(args)
exit()
if( a1 == "komenu" ) or ( a1 == "menu" ):
arglen=len(args)
print "arglen={}".format( arglen )
opt_default=""
list_default="a b c d e f g h i j k l m n o p q r s t u v w x y z big_option"
list_default="create drop insert update tables values"
if( a2 == "" ): list=list_default
else: list=a2
if( a3 == "" ): opt=""
else: opt=a3
print "list={}".format(list)
menutext = komenu(list,"opt")
print "{}".format(menutext)
exit()
opt=a2
list=a3
list=list_default
print "BUGS_3270 KOMENU opt={} list={}".format(opt,list)
menutext = komenu(list,opt)
print "{}".format(menutext)
return()
biglist = " a b c d e f g h iiiiiiiiiiii j k l m n o p q r s t u v w x y z big_option\n"
biglist += " a b c d e f g h i j k llllllllllllll m n o p q r s t u v w x y z big_option\n"
biglist += " a b c d e f g h iiiiiiiiii j k lllllllll m n o p q r s t u v w x y z big_option\n"
biglist += " a b c d e f g h i jjjjjjjjjj k l m n o p q r s t u v w x y z big_option\n"
biglist += " a b c d e f g h i j kkkkkkkkkkkk l m n o p q r s t u v w x y z big_option\n"
biglist += "bigoption_5 a b c d e f g h i j k l m n o p q r s t u v w x y z\n "
if( arglen == 2 ):
opt=opt_default
list=list_default.split(" ")
menutext=komenu(list,opt)
if( arglen == 3 ):
list=a2
if( os.path.exists(list)):
filelist=""
i=open(list, "r")
for line in i.read():
filelist += "{}".format(line)
list=filelist
opt=opt_default
menutext=komenu(list,opt)
if( arglen == 4 ):
opt=a3
list=a4
menutext=komenu(list,opt)
print "menutext=\n {} \n a1={} a2={} a3={}".format(menutext, a1, a2, a3)
exit()
sql3=""
fildb3="{}.db3".format( progid )
sqltbl="ko0"
sqlopt=""
sqlfld=""
sqlval=""
sqlcmd=""
sqlfld=""
sqlval=""
if( a1 == "sql3_db" ):
if( os.path.exists(fildb3)):
sql3=sql3_db(fildb3)
exit()
if( a1 == "sql3_ko" ):
sqltbl="ko"
sql3_ko(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko0" ):
sqltbl="ko0"
sql3_ko0(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko1" ):
sqltbl="ko1"
sql3_ko1(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko2" ):
sqltbl="ko2"
sql3_ko2(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_update_task" ):
sql3_update_task(args)
exit()
if( a1 == "sql3_ko_" ):
sqltbl="ko_"
sql3_ko_(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_0" ):
sqltbl="ko_0"
sql3_ko_0(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_1" ):
sqltbl="ko_1"
sql3_ko_1(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_2" ):
sqltbl="ko_2"
sql3_ko_2(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_3" ):
sqltbl="ko_3"
sql3_ko_3(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_4" ):
sqltbl="ko_4"
sql3_ko_4(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_5" ):
sqltbl="ko_5"
sql3_ko_5(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_6" ):
sqltbl="ko_6"
sql3_ko_6(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_7" ):
sqltbl="ko_7"
sql3_ko_7(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_8" ):
sqltbl="ko_8"
sql3_ko_8(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "sql3_ko_9" ):
sqltbl="ko_9"
sql3_ko_9(sql3,fildb3,sqltbl,sqlopt,sqlcmd,sqlfld,sqlval)
exit()
if( a1 == "ko" ): ko(args)
if( a1 == "ko0" ): ko0(args)
if( a1 == "ko1" ): ko1(args)
if( a1 == "ko2" ): ko2(args)
if( a1 == "kook" ): kook(args)
if( a1 == "ko_" ): ko_(args)
if( a1 == "ko_0" ): ko_0(args)
if( a1 == "ko_1" ): ko_1(args)
if( a1 == "ko_2" ): ko_2(args)
if( a1 == "ko_ok" ): ko_ok(args)
if( a1 == "ko_ko" ): ko_ok(args)
if( a1 == "ko0_" ): ko0_(args)
if( a1 == "ko0_0" ): ko0_0(args)
if( a1 == "ko0_1" ): ko0_1(args)
if( a1 == "ko0_2" ): ko0_2(args)
if( a1 == "ko0_ok" ): ko0_ok(args)
if( a1 == "ko1_" ): ko1_(args)
if( a1 == "ko1_0" ): ko1_0(args)
if( a1 == "ko1_1" ): ko1_1(args)
if( a1 == "ko1_2" ): ko1_2(args)
if( a1 == "ko2_ok" ): ko2_ok(args)
if( a1 == "ko2_" ): ko2_(args)
if( a1 == "ko2_0" ): ko2_0(args)
if( a1 == "ko2_1" ): ko2_1(args)
if( a1 == "ko2_2" ): ko2_2(args)
if( a1 == "ko2_ok" ): ko2_ok(args)
if( a1 == "_kook_" ): ko0_2(args)
if( a1 == "_okko_" ): ko0_2(args)
if( a1 == "okko" ): ko0_(args)
if( a1 == "kook" ): ko0_(args)
if( a1 == "koko" ): ko0_(args)
if( a1 == "okok" ): ko0_(args)
if( a1 == "kok" ): ko0_(args)
if( a1 == "oko" ): ko0_(args)
if( a1 == "sql_ver" ):
sql_ver(args)
exit()
if( a1 == "sql_pragma" ):
sql_pragma(args)
exit()
if( a1 == "sql_schemas" ):
sqltbl=a2
sqlcmd=a3
sqlopt=a4
exit()
if( a1 == "sql_schema" ):
sqltbl=a2
sqlcmd=a3
sqlopt=a4
sqlfld=a5
sql_table=sql_schema(sqltbl,sqlopt,sqlfld,sqlcmd)
if( sqltbl == "" ):
j=0
k=0
clim=5
coltxt=""
# print "BUGS_4661 {} {} -= sql_schema fildb3={} sqltbl={} sqlopt={} {}_{} {}-{}".format(progid, dttm, fildb3, sqltbl, sqlopt, db3nam,sqltbl, j,k )
tblnames=sql_schema(sqltbl,sqlopt,sqlfld,sqlcmd)
# print "BUGS_4662 {} {} -= sql_schema fildb3={} sqltbl={} sqlopt={} {}_{} {}-{} tblnames={}".format(progid, dttm, fildb3, sqltbl, sqlopt, db3nam, sqltbl, j,k, tblnames )
print "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
print "{} {} -= sql_schema fildb3={} sqltbl={} sqlopt={} {}_{} {}-{}".format(progid, dttm, fildb3, sqltbl, sqlopt, db3nam,sqltbl, j,k )
print "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
colmax=0
tblcnt=0
for tblname in tblnames.split(" "):
tblcnt=tblcnt+1
if( len(tblname) > colmax ): colmax=len(tblname)
for tblname in tblnames.split(" "):
# print "BUGS_4663 {} {} -= sql_schema fildb3={} sqltbl={} sqlopt={} {}_{} {}-{} tblname={}".format(progid, dttm, fildb3, sqltbl, sqlopt, db3nam, sqltbl, j,k, tblname )
tbltxt = " {}. {} ".format(j, tblname )
j=j+1
k=k+1
if( j < 10 ):
tbltxt = " {}. {} ".format(j, tblname )
else:
tbltxt = " {}. {} ".format(j, tblname )
coltxt+=" {}".format(tbltxt[:colmax])
if( k==clim):
print coltxt
k=0
coltxt=""
tblcnt=j
print "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
print "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return()
else:
# if( re.search("CREATE", sql_table)):
sql_table=sql_schema(sqltbl,sqlopt,sqlfld,sqlcmd)
sql_table=sql_schema("ko0",sqlopt,sqlfld,sqlcmd)
"BUGS_4692 sqltbl={} sql_table={}".format(sqltbl, sql_table)
if( sqltbl != "" ):
print "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
print "{} {} -= sql_schema fildb3={} sqltbl={} sqlopt={} {}_{} {}-{}".format(progid, dttm, fildb3, sqltbl, sqlopt, db3nam,sqltbl, j,k )
print "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
print " "
print "sql_table={}".format( sql_table )
# print "tblname={}".format( tblname )
# print "tblcnt={} maxcol={}".format(tblcnt,maxcol)
print " "
print "pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq"
print "bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd"
return()
# print "MSG_4680 {} {} -= sql_schema =- {}_{} {}-{} sql_table={}".format(progid, dttm, db3nam, sqltbl, j,k, sql_table )
exit()
if( a1 == "sql_table" ):
sql_table(args)
exit()
if( a1 == "sql_create" ):
sql_create(args)
exit()
if( a1 == "sql_insert" ):
sql_insert(args)
exit()
if( a1 == "sql_import" ):
sql_import(args)
exit()
if( a1 == "sql_export" ):
sql_export(args)
exit()
if( a1 == "sql_cr" ):
sql_cr(args)
exit()
if( a1 == "sql_drop" ):
sql_drop(args)
exit()
if( a1 == "sql_selmem" ):
sql_selmem(args)
exit()
if( a1 == "sql_selall" ):
sql_selall(args)
exit()
if( a1 == "sql_selrow" ):
sql_selrow(args)
exit()
if( a1 == "sql_updqm" ):
sql_updqm(args)
exit()
if( a1 == "sql_updid" ):
sql_updid(args)
exit()
if( a1 == "sql_b64ins" ):
sql_b64ins(args)
exit()
if( a1 == "sql_b64sel" ):
sql_sel(args)
exit()
if( a1 == "sql_sel_pragma" ):
sql_sel_pragma(args)
exit()
if( a1 == "sql_selhdr" ):
sql_updhdr(args)
exit()
if( a1 == "sql_tables" ):
sql_tables(args)
exit()
if( a1 == "sql3_ko0_schemas" ):
sql3_ko0_schemas("",fildb3, sqltbl, sqlopt, sqlcmd, sqlfld,sqlval)
exit()
if( a1 == "sql3_ko0_kofiles" ):
sql3_ko0_kofiles("",fildb3, sqltbl, sqlopt, sqlcmd, sqlfld,sqlval)
exit()
logtxt = "ERR_10400: {} {} -= cmds == {}_{} {}-{} a0={} a1={} a2={} a3={} a4={}".format( progid, dttm, db3nam, sqltbl, j,k, a0,a1,a2,a3,a4 )
# print "{}".format(logtxt)
kolog(logtxt)
def helptext(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
j=ko_cfg.j
k=ko_cfg.k
help = (
'pqpqpqpqpqpqpqpqpqpqpqpq',
'{} {} {}-{} | mp4gifs <ifil>'.format(progid,dttm, j,k ),
'{} {} {}-{} | mp4gif <gif>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | wii'.format(progid,dttm, j,k ),
'{} {} {}-{} | jkwii'.format(progid,dttm, j,k ),
'{} {} {}-{} | skwii'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | sql_sel_tables <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_cr <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_drop <db3><sql><cmd>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | sql_selmem <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_selall <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_selrow <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_selnam <db3><sql><cmd>'.format(progid,dttm, j,k ),
' | ',
'{} {} {}-{} | sql_updqm <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_updid <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_b64sel <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_b64ins <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_sel_pragma <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_selhdr <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | findf <pathfile>'.format(progid,dttm, j,k),
'{} {} {}-{} | findd <path>'.format(progid,dttm, j,k),
'{} {} {}-{} | findt <filtxt><match><filout>'.format(progid,dttm, j,k),
' ',
'{} {} {}-{} | sql_ver <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_schema <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_table <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_insert <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_import <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql_export <db3><sql><cmd>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | sql3_db <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_update_task <db3><sql><cmd>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | sql3_ko_ <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko1_ <db3><sql><cmd>'.format(progid,dttm, j,k ),
'...',
'{} {} {}-{} | sql3_ko9_ <db3><sql><cmd>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | sql3_ko <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko1 <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko2 <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko0 <db3><sql><cmd>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | komenu|menu <list|file|sel><opt>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko0_schema <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko0_kofiles <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | findt <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'{} {} {}-{} | findts <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'{} {} {}-{} |"h" or "termh"'.format(progid,dttm, j,k ),
'{} {} {}-{} |"s" or "terml"'.format(progid,dttm, j,k ),
'{} {} {}-{} |"x" or "termx" '.format(progid,dttm, j,k ),
'{} {} {}-{} |"l" or "terms" '.format(progid,dttm, j,k ),
'{} {} {}-{} |"i" or "termi" '.format(progid,dttm, j,k ),
'{} {} {}-{} |"m" or "term_main" '.format(progid,dttm, j,k ),
'{} {} {}-{} |"g" or "termg" '.format(progid,dttm, j,k ),
# ' ',
# ` '{} {} {}-{} | ko ko0 ko1 ... kook'.format(progid,dttm, j,k ),
# '{} {} {}-{} | ko_ ko_0 ko_1 ko_2 '.format(progid,dttm, j,k ),
# '{} {} {}-{} | ko0_ ko0_0 ko0_1 ko0_2 '.format(progid,dttm, j,k ),
# '{} {} {}-{} | ko1_ ko1_0 ko1_1 ko1_2 '.format(progid,dttm, j,k ),
# '{} {} {}-{} | ko2_ ko2_0 ko2_1 ko2_2 '.format(progid,dttm, j,k ),
# '{} {} {}-{} | kook kook0 kook2 kook3 ... kookok '.format(progid,dttm, j,k ),
# '{} {} {}-{} | okko okko0 okko1 okko2 ... okkoko '.format(progid,dttm, j,k ),
# '{} {} {}-{} | kok oko'.format(progid,dttm, j,k )',
# '{} {} {}-{} | ok <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k )',
# ' ',
# '{} {} {}-{} | komenux <file><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k )',
# '{} {} {}-{} | komenut <file><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k )',
# '{} {} {}-{} | komenusnake <file><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k )',
'bdbdbdbdbdbdbdbdbdbdbdbd'
)
for line in help:
print "{}".format(line)
return( help )
def cfg(args):
import ko_cfg
arglen=len(sys.argv)
progid=args[0].split(".")[0]
dttm=ko_dttm("")
dt=dttm.split("_")[0].replace("-","")
tm=dttm.split("_")[1].replace(":","")
j=0
k=0
dt=dttm.split("_")[0].replace("-","")
fildb3="{}.db3".format(progid)
sqltbl="{}".format(progid)
sqlcmd=""
filtxt="{}.txt".format(progid)
filnew="{}_new.txt".format(progid)
filold="{}_old.txt".format(progid,dt)
fildt="{}_{}.txt".format(progid,dt)
filcsv="{}.csv".format(progid)
filpsv="{}.psv".format(progid)
filsql="{}.sql".format(progid)
fillog="{}.log".format(progid)
fillogd="{}_{}.log".format(progid,dt)
# print "{} {} CFG_3733 {}-{}".format( progid,dttm, j,k )
a0=""
a1=""
a2=""
a3=""
a4=""
a5=""
a5=""
a6=""
a7=""
a8=""
if( arglen == 1 ): a0=args[0]
if( arglen > 1 ): a1=args[1]
if( arglen > 2 ): a2=args[2]
if( arglen > 3 ): a3=args[3]
if( arglen > 4 ): a4=args[4]
if( arglen > 5 ): a5=sys.argv[5]
if( arglen > 6 ): a6=sys.argv[6]
if( arglen > 7 ): a7=sys.argv[7]
if( arglen > 8 ): a8=sys.argv[8]
# print "{} {} CFG_3755 {}-{} fildb3={} sqltbl={} fillogd={}".format(progid, dttm, j,k, fildb3, sqltbl, fillogd )
ko_cfg.progid=progid
ko_cfg.fildb3=fildb3
ko_cfg.sqltbl=sqltbl
ko_cfg.sqlcmd=sqlcmd
ko_cfg.filsql=filsql
ko_cfg.filtxt=filtxt
ko_cfg.filcsv=filcsv
ko_cfg.filpsv=filpsv
ko_cfg.fillog=fillog
ko_cfg.fillogd=fillogd
ko_cfg.j=0
ko_cfg.k=0
j=ko_cfg.k
k=ko_cfg.j
progid=ko_cfg.progid
fildb3=ko_cfg.fildb3
sqltbl=ko_cfg.sqltbl
sqlcmd=ko_cfg.sqlcmd
filtxt=ko_cfg.filtxt
filcsv=ko_cfg.filcsv
filpsv=ko_cfg.filpsv
fillog=ko_cfg.fillog
fillogd=ko_cfg.fillogd
# print "{} {} {}-{} CFG_3750 fildb3={} sqltbl={} fillogd={}".format(progid, dttm, j,k, fildb3, sqltbl, fillogd )
# print "{} {} CFG {}-{} arglen={} a1={} a2={} a3={} a4={}".format(arglen,progid,dttm, j,k, args)
# print "{} {} CFG {}-{} fildb3={} sqltbl={} sqlcmd={} filtxt={} fillog={}".format(progid,dttm, j,k, fildb3,sqltbl,sqlcmd,filtxt,fillog)
# print "{} {} CFG {}-{} filtxt={} filsql={} fillog={} fillogd={}".format(progid,dttm, j,k, filtxt,filsql,fillog,fillogd,)
def startup(args):
import ko_cfg
# config(args)
cfg(args)
arglen=len(args)
# print "BUGS_3849 STARTUP arglen={}".format(arglen)
progid=ko_cfg.progid
dttm=ko_dttm("")
j=ko_cfg.j
k=ko_cfg.k
# print "{} {} {}-{} STARTUP arglen={}".format(progid,dttm, j,k, arglen)
logtxt=" startup arglen={}".format(arglen)
if( arglen == 1 ):
kolog( logtxt )
help=helptext(args)
exit()
logtxt += " arglen={}".format(arglen)
# print "BUGS arglen={} args={}".format(arglen, args)
# for( arg in args ):
# argtxt += " {}".format(arg)
# kolog( logtxt )
return()
# def_text2func(args):
# def fun1(): return "fun1"
# def fun2(): return "fun2"
# def fun3(): return "fun3"
# list of functions
# dsp = [f for fname, f in sorted(globals().items()) if callable(f)]
# tab = range(len(dsp))
# print dsp[tab[2]]()
# dictionary of functions
# d = dict([(fname, f) for fname, f in globals().items() if
# callable(f)])
# tab = [fname for fname, f in sorted(globals().items()) if callable(f)]
# print d[tab[2]]()
# __str__ __repr__ __main__
# my_dict = {}
# x = "Buffalo"
# my_dict[x] = 4
# people = {}
# name = raw_input("name? ") # "person"
# people[name] = User(name)
#
# print people {'person': <User: "person">}
# print people.keys()
# ['person']
# name?Andre
# {'Andre': <__main__.User object at 0x7f6b418a8710>}
# Andre
# fields = ['name','email']
# def clean_name():
# pass
#
# def clean_email():
# pass
# import sys
# ...
# getattr(sys.modules[__name__], "clean_%s" % fieldname)()
# class Cleaner(object):
# def clean_name(self):
# pass
# cleaner = Cleaner()
# for f in fields:
# getattr(cleaner, 'clean_%s' % f)()
# class Cleaner(object):
# def __init__(self, fields):
# self.fields = fields
#
# def clean(self):
# for f in self.fields:
# getattr(self, 'clean_%s' % f)()
# cleaner = Cleaner(['one', 'two'])
## cleaner.clean()
# fields = {'name':clean_name,'email':clean_email}
#
# for key in fields:
# fields[key]()
# myscript.py
# def f1():
# print 'f1'
#
# def f2():
# print 'f2'
#
# def f3():
# print 'f3'
#
# test.py
# import myscript
#
# for i in range(1, 4):
# getattr(myscript, 'f%d' % i)()
#
#
## for field in fields:
## vars()['clean_' + field]()
##
## fields = ['name', 'email', 'subject']
##
## def clean_name():
## pass
## def clean_email():
## pass
##
## # (one-time) field to cleaning-function map construction
## def get_clean_func(field):
## try:
## return eval('clean_'+field)
## except NameError:
## return lambda: None # do nothing
## clean = dict((field, get_clean_func(field)) for field in fields)
##
## # sample usage
## for field in fields:
## clean[field]()
## idispatcher={'add':add}
## w='add'
## try:
## function=dispatcher[w]
## except KeyError:
## raise ValueError('invalid input')
## eval('add(3,4)',{'__builtins__':None},dispatcher)
##
## function_mappings = {
## 'add': add,
## }
## # One safe way is to map from names to functions. It's safer than using eval.
## def select_function():
## while True:
## try:
## return function_mappings[raw_input('Please input the function you want to use')]
## except KeyError:
## print 'Invalid function, try again.'
## def pwr(x, y):
## return x ** y
##
## def add(x, y):
## return x + y
##
## dispatcher = { 'pwr' : pwr, 'add' : add}
##
## def call_func(x, y, func):
## try:
## return dispatcher[func](x, y)
## except:
## return "Invalid function"
## call_func(2, 3, 'add')
## import argparse
## import shlex
## def hello(name):
## print('hello,', name)
## def main():
## parser = argparse.ArgumentParser()
## subparsers = parser.add_subparsers()
## hello_parser = subparsers.add_parser('hello')
## hello_parser.add_argument('name')
## hello_parser.set_defaults(func=hello)
## print('Enter q to quit')
## while True:
## command = input('command> ')
## command = command.strip()
## if not command:
## continue
## if command.lower() == 'q':
## break
## words = shlex.split(command)
## try:
## args = parser.parse_args(words)
## except SystemExit:
## # argparse will sys.exit() on -h and errors; prevent that
## continue
## func_args = {name: value for name, value in vars(args).items()}
## del func_args['func']
## args.func(**func_args)
##
## if __name__ == '__main__':
## try:
## main()
## except KeyboardInterrupt:
## print()
## # test.py
## def fun1(): return "fun1"
## def fun2(): return "fun2"
## def fun3(): return "fun3"
## # list of functions
## dsp = [f for fname, f in sorted(globals().items()) if callable(f)]
## tab = range(len(dsp))
## print dsp[tab[2]]()
## # dictionary of functions
## d = dict([(fname, f) for fname, f in globals().items() if
## callable(f)])
## tab = [fname for fname, f in sorted(globals().items()) if callable(f)]
## print d[tab[2]]()
def cr_ko(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko_(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko_0(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko_1(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko_2(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko_ok(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko0_(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko0_0(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko0_1(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko0_2(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko1()
def cr_ko0_ok(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko1_(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko1()
def cr_ko1_0(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko1_1(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko1()
def cr_ko1_2(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko1_ok(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko2_(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko2_0(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko2_1(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko2_2(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko2_ok(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_kook(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_kook0(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_kook1(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_kook2(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_kookok(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ko_ok(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def cr_ok(sql3, proj):
import ko_cfg
progid=ko_cfg.progid
# """
# Create a new proj into the proj table
# :param sql3:
# :param proj:
# :return: projid
# """
# cur = sql3.cursor()
db = sql3.cursor()
# sql = """create table if exists proj ( name varchar, begdt varchar, enddt varchar );"""
# sql = "create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"
sql = """create table if not exists proj ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql = """create table if not exists file ( name varchar, begdt varchar, enddt varchar );"""
db.execute(sql)
sql="insert into file values('file_name_0','file_begdt_0', 'file_enddt_0' )"
db.execute(sql)
sql="insert into proj values('proj_name_0','proj_begdt_0', 'proj_enddt_0' )"
db.execute(sql)
for j in range(1,100):
sql="insert into file values('file_name_{}','file_begdt_{}', 'file_enddt_{}' )".format(j,j,j)
db.execute(sql)
for j in range(1,200):
sql="insert into proj values('proj_name_{}','proj_begdt_{}', 'proj_enddt_{}' )".format(j,j,j)
db.execute(sql)
return()
sql="insert into proj values('proj_200','begdt_200', 'begdt_200' )"
db.execute(sql)
sql="insert into proj values('proj_300','begdt_300', 'begdt_300' )"
db.execute(sql)
sql="insert into proj values('proj_500','begdt_500', 'begdt_500' )"
db.execute(sql)
sql="insert into proj values('proj_600','begdt_600', 'begdt_600' )"
db.execute(sql)
sql="insert into proj values('proj_700','begdt_700', 'begdt_700' )"
db.execute(sql)
sql="insert into proj values('proj_800','begdt_800', 'begdt_800' )"
db.execute(sql)
sql="insert into proj values('proj_900','begdt_900', 'begdt_900' )"
db.execute(sql)
k=0
for j in range(1000, 1100):
k=j+2
dttm=ko_dttm("dt")
sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
print "{} {} sql3_ko1 sql3_cr_proj {}-{} sql={}".format( progid, dttm, j,k, sql )
db.execute(sql)
# for j in "10 11 12 13 14 15 16 18 19 20".split(" "):
# sql="insert into proj values('proj_{}','begdt_{}', 'begdt_{}' )".format(j,j,j)
# print "PROJ j={} sql={}".format( j, sql )
# db.execute(sql)
# sql = "INSERT INTO proj (name,begdt,enddt) VALUES(?,?,?)"
# proj1 = ("name1","begdt1","enddt1")
# db.execute(sql, proj1)
# proj2 = ("name2","begdt2","enddt2")
# db.execute(sql, proj2)
# return db.lastrowid
# bbbbbbbbbbbbbbbbbbbbbbbb sql3_ko()
def helptext(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
j=ko_cfg.j
k=ko_cfg.k
help = (
'pqpqpqpqpqpqpqpqpqpqpqpq',
'{} {} {}-{} | mp4gifs <ifil>'.format(progid,dttm, j,k ),
'{} {} {}-{} | mp4gif <gif>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | sql3_ko2 <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko0 <db3><sql><cmd>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | komenu|menu <list|file|sel><opt>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko0_schema <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_ko0_kofiles <db3><sql><cmd>'.format(progid,dttm, j,k ),
'{} {} {}-{} | findt <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'{} {} {}-{} | findts <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'{} {} {}-{} | findts <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
' ',
'{} {} {}-{} | go <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_cr_all <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_crop_all <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'{} {} {}-{} | sql3_mov2mpr <ifile><findmatch><tailmatch><ofile>'.format(progid,dttm, j,k ),
'bdbdbdbdbdbdbdbdbdbdbdbd'
)
for line in help:
print "{}".format(line)
return( help )
def args2a(args):
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
dttm=ko_dttm("")
logtxt="{} {} CURSES_komenux_13400 {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog( logtxt )
# print("Path at terminal when executing this file")
# print("This file path, relative to os.getcwd()")
# print("This file full path (following symlinks)")
# print(full_path + "\n")
# print("This file directory and name")
# print(path + ' --> ' + filename + "\n")
# print("This file directory only")
cwd=os.getcwd()
relpath=(__file__)
fullpath = os.path.realpath(__file__)
full_path = fullpath
path, file = os.path.split(full_path)
fullpath = os.path.dirname(full_path)
dirpath = os.path.dirname(os.path.realpath(__file__))
cwd=os.getcwd()
ext=""
oldfil="{}_old.txt".format( dttm )
oldfil="{}_old.txt".format( dttm )
ko_cfg.cwd=cwd
ko_cfg.relpath=relpath
ko_cfg.fullpath=fullpath
ko_cfg.dirpath=dirpath
ko_cfg.path=path
ko_cfg.file=file
ko_cfg.ext=ext
db3nam="{}".format(progid.split(".")[0])
fillog="{}.log".format(progid)
fillogd="{}.log".format(progid)
oldfil="{}.txt".format(progid)
newfil="{}.txt".format(progid)
fildb3="{}.db3".format(progid)
filsql="{}.sql".format(progid)
filpsv="{}.psv".format(progid)
filcsv="{}.csv".format(progid)
filtxt="{}.txt".format(progid)
filimg="{}.png".format(progid)
filtn="{}.png".format(progid)
filimg1="{}_1.png".format(progid)
filimg2="{}_2.png".format(progid)
filmp4="{}.mp4".format(progid)
filmp3="{}.mp3".format(progid)
filgif="{}.gif".format(progid)
filjpg="{}.jpg".format(progid)
filpdf="{}.pdf".format(progid)
filsql="{}.sql".format(progid)
sqltbl="{}".format(db3nam)
sqlcmd="select * from {}".format(sqltbl)
sqlopt=""
sqlfld=""
sqlval=""
j=0
k=0
a0=""
a1=""
a2=""
a3=""
a4=""
a5=""
a6=""
a7=""
a8=""
t=0
x=0
y=0
z=0
h=0
w=0
ko_cfg.alen=len(args)
ko_cfg.a0=args
# for arg in str(args).split():
# ko_cfg.a1
# ko_cfg.a2
# ko_cfg.a3
# ko_cfg.a4
# ko_cfg.a5
# ko_cfg.a5
# ko_cfg.a7
# ko_cfg.a8
# print "{}_{} {}. a={} ka={}".format( j, a, arg )
return(args)
def startup(args):
import ko_cfg
# config(args)
cfg(args)
arglen=len(args)
# print "BUGS_3849 STARTUP arglen={}".format(arglen)
progid=ko_cfg.progid
dttm=ko_dttm("")
j=ko_cfg.j
k=ko_cfg.k
# print "{} {} {}-{} STARTUP arglen={}".format(progid,dttm, j,k, arglen)
logtxt=" startup arglen={}".format(arglen)
main_curses(args)
return()
# if( arglen == 1 ):
# kolog( logtxt )
# help=helptext(args)
# exit()
logtxt += " arglen={}".format(arglen)
# print "BUGS arglen={} args={}".format(arglen, args)
# for( arg in args ):
# argtxt += " {}".format(arg)
# kolog( logtxt )
return()
# def_text2func(args):
# def fun1(): return "fun1"
# def fun2(): return "fun2"
# def fun3(): return "fun3"
# list of functions
# dsp = [f for fname, f in sorted(globals().items()) if callable(f)]
# tab = range(len(dsp))
# print dsp[tab[2]]()
# dictionary of functions
# d = dict([(fname, f) for fname, f in globals().items() if
# callable(f)])
# tab = [fname for fname, f in sorted(globals().items()) if callable(f)]
# print d[tab[2]]()
# __str__ __repr__ __main__
# my_dict = {}
# x = "Buffalo"
# my_dict[x] = 4
# people = {}
# name = raw_input("name? ") # "person"
# people[name] = User(name)
#
# print people {'person': <User: "person">}
# print people.keys()
# ['person']
# name?Andre
# {'Andre': <__main__.User object at 0x7f6b418a8710>}
# Andre
# fields = ['name','email']
# def clean_name():
# pass
#
# def clean_email():
# pass
# import sys
# ...
# getattr(sys.modules[__name__], "clean_%s" % fieldname)()
# class Cleaner(object):
# def clean_name(self):
# pass
# cleaner = Cleaner()
# for f in fields:
# getattr(cleaner, 'clean_%s' % f)()
# class Cleaner(object):
# def __init__(self, fields):
# self.fields = fields
#
# def clean(self):
# for f in self.fields:
# getattr(self, 'clean_%s' % f)()
# cleaner = Cleaner(['one', 'two'])
## cleaner.clean()
# fields = {'name':clean_name,'email':clean_email}
#
# for key in fields:
# fields[key]()
# myscript.py
# def f1():
# print 'f1'
#
# def f2():
# print 'f2'
#
# def f3():
# print 'f3'
#
# test.py
# import myscript
#
# for i in range(1, 4):
# getattr(myscript, 'f%d' % i)()
#
#
## for field in fields:
## vars()['clean_' + field]()
##
## fields = ['name', 'email', 'subject']
##
## def clean_name():
## pass
## def clean_email():
## pass
##
## # (one-time) field to cleaning-function map construction
## def get_clean_func(field):
## try:
## return eval('clean_'+field)
## except NameError:
## return lambda: None # do nothing
## clean = dict((field, get_clean_func(field)) for field in fields)
##
## # sample usage
## for field in fields:
## clean[field]()
## idispatcher={'add':add}
## w='add'
## try:
## function=dispatcher[w]
## except KeyError:
## raise ValueError('invalid input')
## eval('add(3,4)',{'__builtins__':None},dispatcher)
##
## function_mappings = {
## 'add': add,
## }
## # One safe way is to map from names to functions. It's safer than using eval.
## def select_function():
## while True:
## try:
## return function_mappings[raw_input('Please input the function you want to use')]
## except KeyError:
## print 'Invalid function, try again.'
## def pwr(x, y):
## return x ** y
##
## def add(x, y):
## return x + y
##
## dispatcher = { 'pwr' : pwr, 'add' : add}
##
## def call_func(x, y, func):
## try:
## return dispatcher[func](x, y)
## except:
## return "Invalid function"
## call_func(2, 3, 'add')
## import argparse
## import shlex
## def hello(name):
## print('hello,', name)
## def main():
## parser = argparse.ArgumentParser()
## subparsers = parser.add_subparsers()
## hello_parser = subparsers.add_parser('hello')
## hello_parser.add_argument('name')
## hello_parser.set_defaults(func=hello)
## print('Enter q to quit')
## while True:
## command = input('command> ')
## command = command.strip()
## if not command:
## continue
## if command.lower() == 'q':
## break
## words = shlex.split(command)
## try:
## args = parser.parse_args(words)
## except SystemExit:
## # argparse will sys.exit() on -h and errors; prevent that
## continue
## func_args = {name: value for name, value in vars(args).items()}
## del func_args['func']
## args.func(**func_args)
##
## if __name__ == '__main__':
## try:
## main()
## except KeyboardInterrupt:
## print()
## # test.py
## def fun1(): return "fun1"
## def fun2(): return "fun2"
## def fun3(): return "fun3"
## # list of functions
## dsp = [f for fname, f in sorted(globals().items()) if callable(f)]
## tab = range(len(dsp))
## print dsp[tab[2]]()
## # dictionary of functions
# d = dict([(fname, f) for fname, f in globals().items() if
## callable(f)])
## tab = [fname for fname, f in sorted(globals().items()) if callable(f)]
## print d[tab[2]]()
def term_cmds(args):
import ko_cfg
progid=ko_cfg.progid
dttm=ko_dttm("")
args = []
(alen,a0,a1,a2,a3,a4,a5,a6,a7,a8) = args2a(args)
j=0
k=0
if( a1 == "termh" ) or ( a1 == "help" ):
# term_help(args)
termh(args)
if( a1 == "terms" ) or ( a1 == "test_select_line" ):
# test_select_line(self)
terms(self)
if( a1 == "termx" ) or ( a1 == "executeCommandList" ):
# executeCommandList(self, cmdList)
termx(self, cmdList)
if( a1 == "terml" ) or ( a1 == "test_select_line_via_line_numbers" ):
# test_select_line_via_line_numbers(self)
terml(self)
if( a1 == "termi" ) or ( a1 == "input" ):
# input(self, engine)
termi(self, engine)
if( a1 == "termm" ) or ( a1 == "mainloop" ):
# mainloop(screen)
screen= curses.initscr()
term_main(screen)
if( a1 == "termg" ) or ( a1 == "_get_input" ):
# _get_input(self, wait_tenths)
termg(self, wait_tenths)
return()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Topmenu and the submenus are based of the example found at this location http://blog.skeltonnetworks.com/2010/03/python-curses-custom-menu/
# The rest of the work was done by Matthew Bennett and he requests you keep these two mentions when you reuse the code :-)
# Basic code refactoring by Andrew Scheller
def komenux(args):
# import ko_cfg
# dttm=ko_dttm("")
# (progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
# logtxt="{} {} CURSES_komenux_13400 {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
# print logtxt
# kolog( logtxt )
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Topmenu and the submenus are based of the example found at this location http://blog.skeltonnetworks.com/2010/03/python-curses-custom-menu/
# The rest of the work was done by Matthew Bennett and he requests you keep these two mentions when you reuse the code :-)
# Basic code refactoring by Andrew Scheller
from time import sleep
import curses, os #curses is the interface for capturing key presses on the menu, os launches the files
screen = curses.initscr() #initializes a new window for capturing key presses
curses.noecho() # Disables automatic echoing of key presses (prevents program from input each key twice)
curses.cbreak() # Disables line buffering (runs each key as it is pressed rather than waiting for the return key to pressed)
curses.start_color() # Lets you use colors when highlighting selected menu option
screen.keypad(1) # Capture input from keypad
# Change this to use different colors when highlighting
curses.init_pair(1,curses.COLOR_BLACK, curses.COLOR_WHITE) # Sets up color pair #1, it does black text with white background
h = curses.color_pair(1) #h is the coloring for a highlighted menu option
n = curses.A_NORMAL #n is the coloring for a non highlighted menu option
MENU = "menu"
COMMAND = "command"
EXITMENU = "exitmenu"
menu_data = {
'title': "Program Launcher", 'type': MENU, 'subtitle': "Please select an option...",
'options':[
{ 'title': "XBMC", 'type': COMMAND, 'command': 'xbmc' },
{ 'title': "Emulation Station - Hit F4 to return to menu, Esc to exit game", 'type': COMMAND, 'command': 'emulationstation' },
{ 'title': "Ur-Quan Masters", 'type': COMMAND, 'command': 'uqm' },
{ 'title': "Dosbox Games", 'type': MENU, 'subtitle': "Please select an option...",
'options': [
{ 'title': "Midnight Rescue", 'type': COMMAND, 'command': 'dosbox /media/samba/Apps/dosbox/doswin/games/SSR/SSR.EXE -exit' },
{ 'title': "Outnumbered", 'type': COMMAND, 'command': 'dosbox /media/samba/Apps/dosbox/doswin/games/SSO/SSO.EXE -exit' },
{ 'title': "Treasure Mountain", 'type': COMMAND, 'command': 'dosbox /media/samba/Apps/dosbox/doswin/games/SST/SST.EXE -exit' },
]
},
{ 'title': "Pianobar", 'type': COMMAND, 'command': 'clear && pianobar' },
{ 'title': "Windows 3.1", 'type': COMMAND, 'command': 'dosbox /media/samba/Apps/dosbox/doswin/WINDOWS/WIN.COM -conf /home/pi/scripts/dosbox2.conf -exit' },
{ 'title': "Reboot", 'type': MENU, 'subtitle': "Select Yes to Reboot",
'options': [
{'title': "NO", 'type': EXITMENU, },
{'title': "", 'type': COMMAND, 'command': '' },
{'title': "", 'type': COMMAND, 'command': '' },
{'title': "", 'type': COMMAND, 'command': '' },
{'title': "YES", 'type': COMMAND, 'command': 'sudo shutdown -r -time now' },
{'title': "", 'type': COMMAND, 'command': '' },
{'title': "", 'type': COMMAND, 'command': '' },
{'title': "", 'type': COMMAND, 'command': '' },
]
},
]
}
#This function displays the appropriate menu and returns the option selected
def runmenu(menu, parent):
# work out what text to display as the last menu option
if parent is None:
lastoption = "Exit"
else:
lastoption = "Return to %s menu" % parent['title']
optioncount = len(menu['options']) # how many options in this menu
pos=0 #pos is the zero-based index of the hightlighted menu option. Every time runmenu is called, position returns to 0, when runmenu ends the position is returned and tells the program what opt$
oldpos=None # used to prevent the screen being redrawn every time
x = None #control for while loop, let's you scroll through options until return key is pressed then returns pos to program
# Loop until return key is pressed
while x !=ord('\n'):
if pos != oldpos:
oldpos = pos
screen.border(0)
screen.addstr(2,2, menu['title'], curses.A_STANDOUT) # Title for this menu
screen.addstr(4,2, menu['subtitle'], curses.A_BOLD) #Subtitle for this menu
# Display all the menu items, showing the 'pos' item highlighted
for index in range(optioncount):
textstyle = n
if pos==index:
textstyle = h
screen.addstr(5+index,4, "%d - %s" % (index+1, menu['options'][index]['title']), textstyle)
# Now display Exit/Return at bottom of menu
textstyle = n
if pos==optioncount:
textstyle = h
screen.addstr(5+optioncount,4, "%d - %s" % (optioncount+1, lastoption), textstyle)
screen.refresh()
# finished updating screen
x = screen.getch() # Gets user input
# What is user input?
if x >= ord('1') and x <= ord(str(optioncount+1)):
pos = x - ord('0') - 1 # convert keypress back to a number, then subtract 1 to get index
elif x == 258: # down arrow
if pos < optioncount:
pos += 1
else: pos = 0
elif x == 259: # up arrow
if pos > 0:
pos += -1
else: pos = optioncount
# return index of the selected item
return pos
# This function calls showmenu and then acts on the selected item
# def processmenu(menu, parent=None):
def komenux_processmenu(menu, parent=None):
optioncount = len(menu['options'])
exitmenu = False
while not exitmenu: #Loop until the user exits the menu
getin = runmenu(menu, parent)
if getin == optioncount:
exitmenu = True
elif menu['options'][getin]['type'] == COMMAND:
curses.def_prog_mode() # save curent curses environment
os.system('reset')
if menu['options'][getin]['title'] == 'Pianobar':
os.system('amixer cset numid=3 1') # Sets audio output on the pi to 3.5mm headphone jack
screen.clear() #clears previous screen
os.system(menu['options'][getin]['command']) # run the command
screen.clear() #clears previous screen on key press and updates display based on pos
curses.reset_prog_mode() # reset to 'current' curses environment
curses.curs_set(1) # reset doesn't do this right
curses.curs_set(0)
os.system('amixer cset numid=3 2') # Sets audio output on the pi back to HDMI
elif menu['options'][getin]['type'] == MENU:
screen.clear() #clears previous screen on key press and updates display based on pos
processmenu(menu['options'][getin], menu) # display the submenu
screen.clear() #clears previous screen on key press and updates display based on pos
elif menu['options'][getin]['type'] == EXITMENU:
exitmenu = True
# Main program
# processmenu(menu_data)
def komenux_processmenu(menu_data):
curses.endwin() #VITAL! This closes out the menu system and returns you to the bash prompt.
os.system('clear')
curses.curs_set(1)
curses.curs_set(0)
# What is user input?
# if x >= unichr(1) and x <= unichr(int(optioncount+1)):
# pos = x - unichr(0) - 1 # convert keypress back to a number, then subtract 1 to get index
# elif x == 258: # down arrow
# if pos < optioncount:
# pos += 1
# else: pos = 0
# elif x == 259: # up arrow
# if pos > 0:
# pos += -1
# else: pos = optioncount
#
#This function displays the appropriate menu and returns the option selected
# def runmenu(menu, parent):
def komenux_runmenu(menu, parent):
# work out what text to display as the last menu option
if parent is None:
lastoption = "Exit"
else:
lastoption = "Return to %s menu" % parent['title']
optioncount = len(menu['options']) # how many options in this menu
pos=0 #pos is the zero-based index of the hightlighted menu option. Every time runmenu is called, position returns to 0, when runmenu ends the position is returned and tells the program what opt$
oldpos=None # used to prevent the screen being redrawn every time
x = None #control for while loop, let's you scroll through options until return key is pressed then returns pos to program
# Loop until return key is pressed
while x !=ord('\n'):
if pos != oldpos:
oldpos = pos
screen.border(0)
screen.addstr(2,2, menu['title'], curses.A_STANDOUT) # Title for this menu
screen.addstr(4,2, menu['subtitle'], curses.A_BOLD) #Subtitle for this menu
# Display all the menu items, showing the 'pos' item highlighted
for index in range(optioncount):
textstyle = n
if pos==index:
textstyle = h
screen.addstr(5+index,4, "%d - %s" % (index+1, menu['options'][index]['title']), textstyle)
# Now display Exit/Return at bottom of menu
textstyle = n
if pos==optioncount:
textstyle = h
screen.addstr(5+optioncount,4, "%d - %s" % (optioncount+1, lastoption), textstyle)
screen.refresh()
# finished updating screen
x = screen.getch() # Gets user input
# What is user input?
if x >= ord('1') and x <= ord(str(optioncount+1)):
pos = x - ord('0') - 1 # convert keypress back to a number, then subtract 1 to get index
elif x == 258: # down arrow
if pos < optioncount:
pos += 1
else: pos = 0
elif x == 259: # up arrow
if pos > 0:
pos += -1
else: pos = optioncount
# return index of the selected item
return pos
# This function calls showmenu and then acts on the selected item
def processmenu(menu, parent=None):
# import curses
# import sys,os
optioncount = len(menu['options'])
exitmenu = False
while not exitmenu: #Loop until the user exits the menu
getin = komenux_runmenu(menu, parent)
if getin == optioncount:
exitmenu = True
elif menu['options'][getin]['type'] == COMMAND:
curses.def_prog_mode() # save curent curses environment
os.system('reset')
if menu['options'][getin]['title'] == 'Pianobar':
os.system('amixer cset numid=3 1') # Sets audio output on the pi to 3.5mm headphone jack
screen.clear() #clears previous screen
os.system(menu['options'][getin]['command']) # run the command
screen.clear() #clears previous screen on key press and updates display based on pos
curses.reset_prog_mode() # reset to 'current' curses environment
curses.curs_set(1) # reset doesn't do this right
curses.curs_set(0)
os.system('amixer cset numid=3 2') # Sets audio output on the pi back to HDMI
elif menu['options'][getin]['type'] == MENU:
screen.clear() #clears previous screen on key press and updates display based on pos
processmenu(menu['options'][getin], menu) # display the submenu
screen.clear() #clears previous screen on key press and updates display based on pos
elif menu['options'][getin]['type'] == EXITMENU:
exitmenu = True
# Main program
processmenu(menu_data)
curses.endwin() #VITAL! This closes out the menu system and returns you to the bash prompt.
os.system('clear')
curses.curs_set(1)
curses.curs_set(0)
# What is user input?
# if x >= unichr(1) and x <= unichr(int(optioncount+1)):
# pos = x - unichr(0) - 1 # convert keypress back to a number, then subtract 1 to get index
# elif x == 258: # down arrow
# if pos < optioncount:
# pos += 1
# else: pos = 0
# elif x == 259: # up arrow
# if pos > 0:
# pos += -1
# else: pos = optioncount
#
def komenut_draw_menu(stdscr):
k = 0
cursor_x = 0
cursor_y = 0
# Clear and refresh the screen for a blank canvas
stdscr.clear()
stdscr.refresh()
# Start colors in curses
curses.start_color()
curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE)
# Loop where k is the last character pressed
while (k != ord('q')):
# Initialization
stdscr.clear()
height, width = stdscr.getmaxyx()
if k == curses.KEY_DOWN:
cursor_y = cursor_y + 1
elif k == curses.KEY_UP:
cursor_y = cursor_y - 1
elif k == curses.KEY_RIGHT:
cursor_x = cursor_x + 1
elif k == curses.KEY_LEFT:
cursor_x = cursor_x - 1
cursor_x = max(0, cursor_x)
cursor_x = min(width-1, cursor_x)
cursor_y = max(0, cursor_y)
cursor_y = min(height-1, cursor_y)
# Declaration of strings
title = "Curses example"[:width-1]
subtitle = "Written by Clay McLeod"[:width-1]
keystr = "Last key pressed: {}".format(k)[:width-1]
statusbarstr = "Press 'q' to exit | STATUS BAR | Pos: {}, {}".format(cursor_x, cursor_y)
if k == 0:
keystr = "No key press detected..."[:width-1]
# Centering calculations
start_x_title = int((width // 2) - (len(title) // 2) - len(title) % 2)
start_x_subtitle = int((width // 2) - (len(subtitle) // 2) - len(subtitle) % 2)
start_x_keystr = int((width // 2) - (len(keystr) // 2) - len(keystr) % 2)
start_y = int((height // 2) - 2)
# Rendering some text
whstr = "Width: {}, Height: {}".format(width, height)
stdscr.addstr(0, 0, whstr, curses.color_pair(1))
# Render status bar
stdscr.attron(curses.color_pair(3))
stdscr.addstr(height-1, 0, statusbarstr)
stdscr.addstr(height-1, len(statusbarstr), " " * (width - len(statusbarstr) - 1))
stdscr.attroff(curses.color_pair(3))
# Turning on attributes for title
stdscr.attron(curses.color_pair(2))
stdscr.attron(curses.A_BOLD)
# Rendering title
stdscr.addstr(start_y, start_x_title, title)
# Turning off attributes for title
stdscr.attroff(curses.color_pair(2))
stdscr.attroff(curses.A_BOLD)
# Print rest of text
stdscr.addstr(start_y + 1, start_x_subtitle, subtitle)
stdscr.addstr(start_y + 3, (width // 2) - 2, '-' * 4)
stdscr.addstr(start_y + 5, start_x_keystr, keystr)
stdscr.move(cursor_y, cursor_x)
# Refresh the screen
stdscr.refresh()
# Wait for next input
k = stdscr.getch()
# def main_komenu_snake():
# curses.wrapper(draw_menu)
# SNAKES GAME
# Use ARROW KEYS to play, SPACE BAR for pausing/resuming and Esc Key for exiting
def komenus(args):
# import ko_cfg
import curses
dttm=ko_dttm("")
from curses import KEY_RIGHT, KEY_LEFT, KEY_UP, KEY_DOWN
from random import randint
curses.initscr()
win = curses.newwin(20, 60, 0, 0)
win.keypad(1)
curses.noecho()
curses.curs_set(0)
win.border(0)
win.nodelay(1)
key = KEY_RIGHT # Initializing values
score = 0
snake = [[4,10], [4,9], [4,8]] # Initial snake co-ordinates
food = [10,20] # First food co-ordinates
win.addch(food[0], food[1], '*') # Prints the food
# snaketitle="-= kosnake =-".format("kosnake")
# (progid, fildb3, sqltbl, fillog, fillogd, j,k, xlen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
progid=sys.argv[0]
j=0
k=0
snaketitle="-= koSNAKE {}_{} {}-{} =-".format(j,k, progid, dttm )
while key != 27: # While Esc key is not pressed
win.border(0)
win.addstr(0, 2, 'Score : ' + str(score) + ' ') # Printing 'Score' and
# win.addstr(0, 27, ' SNAKE ') # 'SNAKE' strings
# win.addstr(0, 27, ' SNAKE ') # 'SNAKE' strings
win.addstr(0, 27, snaketitle ) # 'SNAKE' strings
win.timeout(150 - (len(snake)/5 + len(snake)/10)%120) # Increases the speed of Snake as its length increases
prevKey = key # Previous key pressed
event = win.getch()
key = key if event == -1 else event
if key == ord(' '): # If SPACE BAR is pressed, wait for another
key = -1 # one (Pause/Resume)
while key != ord(' '):
key = win.getch()
key = prevKey
continue
if key not in [KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, 27]: # If an invalid key is pressed
key = prevKey
# Calculates the new coordinates of the head of the snake. NOTE: len(snake) increases.
# This is taken care of later at [1].
snake.insert(0, [snake[0][0] + (key == KEY_DOWN and 1) + (key == KEY_UP and -1), snake[0][1] + (key == KEY_LEFT and -1) + (key == KEY_RIGHT and 1)])
# If snake crosses the boundaries, make it enter from the other side
if snake[0][0] == 0: snake[0][0] = 18
if snake[0][1] == 0: snake[0][1] = 58
if snake[0][0] == 19: snake[0][0] = 1
if snake[0][1] == 59: snake[0][1] = 1
# Exit if snake crosses the boundaries (Uncomment to enable)
#if snake[0][0] == 0 or snake[0][0] == 19 or snake[0][1] == 0 or snake[0][1] == 59: break
# If snake runs over itself
if snake[0] in snake[1:]: break
if snake[0] == food: # When snake eats the food
food = []
score += 1
while food == []:
food = [randint(1, 18), randint(1, 58)] # Calculating next food's coordinates
if food in snake: food = []
win.addch(food[0], food[1], '*')
else:
last = snake.pop() # [1] If it does not eat the food, length decreases
win.addch(last[0], last[1], ' ')
win.addch(snake[0][0], snake[0][1], '#')
curses.endwin()
# print("\nScore - " + str(score))
# print("http://bitemelater.in\n")
# Example 1 term lineselectt
# def test_select_line(self):
def terml(self):
self.runWithTestFile([
self.displayCheck(0, 0, [
" ci . ",
" ",
" 1 "]),
self.cursorCheck(2, 7),
't', 'e', 's', 't', CTRL_J,
'a', 'p', 'p', 'l', 'e', CTRL_J,
'o', 'r', 'a', 'n', 'g', 'e',
self.cursorCheck(4, 13),
self.selectionCheck(2, 6, 0, 0, 0),
CTRL_L,
self.selectionCheck(2, 6, 2, 0, 4),
KEY_UP,
self.selectionCheck(1, 5, 2, 6, 0),
CTRL_L,
self.selectionCheck(2, 0, 1, 0, 4),
CTRL_L,
self.selectionCheck(2, 6, 1, 0, 4),
self.addMouseInfo(0, 2, 10, curses.BUTTON1_PRESSED),
curses.KEY_MOUSE,
self.selectionCheck(2, 6, 0, 3, 2),
CTRL_Q, 'n']);
# Example 2 Project: ci_edit Author: google File: ci_program.py (license) View Source Project 5 votes vote down vote up
# def executeCommandList(self, cmdList):
def termx(self, cmdList):
for cmd, eventInfo in cmdList:
if cmd == curses.KEY_RESIZE:
self.handleScreenResize(self.focusedWindow)
continue
self.focusedWindow.controller.doCommand(cmd, eventInfo)
if cmd == curses.KEY_MOUSE:
self.handleMouse(eventInfo)
self.focusedWindow.controller.onChange()
# Example 3 Project: ci_edit Author: google File: unit_test_application.py (license) View Source Project 5 votes vote down vote up
# def test_select_line_via_line_numbers(self):
def terms(self):
self.runWithTestFile([
self.displayCheck(0, 0, [
" ci . ",
" ",
" 1 "]),
self.cursorCheck(2, 7),
'a', 'b', 'c', CTRL_J, 'd', 'e', CTRL_J, 'f', 'g', 'h', 'i',
self.cursorCheck(4, 11),
self.addMouseInfo(0, 3, 2, curses.BUTTON1_PRESSED),
curses.KEY_MOUSE,
CTRL_L,
CTRL_Q, 'n']);
# Example 4 Project: anonymine Author: oskar-skog File: anonymine.py (license) View Source Project 4 votes vote down vote up
# def input(self, engine):
def termi(self, engine):
'''This method is called by `engine.play_game`.
It receives a character from the user and interprets it.
Invokes `self.travel` for the steering of the cursor.
It doesn't do any output except for printing the field
initialization message, and forcing the entire screen to be
redrawn on unrecognised input (to de-fuck-up the screen).
'''
if self.gametype == 'hex':
direction_keys = self.direction_keys['hex']
else:
direction_keys = self.direction_keys['square']
look_for = ['reveal', 'flag', 'toggle-attention'] + direction_keys
# Receive input from player.
ch = self.window.getch()
# Interpret.
command = None
if ch == curses.KEY_MOUSE:
_, x, y, _, buttons = curses.getmouse()
valid = True
if self.gametype == 'hex':
valid = self.mouse_travel_hex(x, y, engine.field)
else:
valid = self.mouse_travel_square(x, y, engine.field)
if valid:
for tmp_command in ('flag', 'reveal'):
for mask in self.cfg['curses-mouse-input'][tmp_command]:
if buttons & mask:
command = tmp_command
else:
continue
break
else:
# Keyboard input:
for key in look_for:
if ch in self.cfg['curses-input'][key]:
command = key
# Act.
if command == 'flag':
engine.flag(self.cursor)
elif command == 'reveal':
pre_game = engine.game_status == 'pre-game'
if pre_game:
self.message('Initializing field... This may take a while.')
curses.reset_shell_mode() # BUG: see comments above __init__
engine.reveal(self.cursor)
if pre_game:
curses.reset_prog_mode() # BUG: see comments above __init__
# Clear junk that gets on the screen from impatient players.
self.window.redrawwin()
elif command in direction_keys:
self.travel(engine.field, command)
elif command == 'toggle-attention':
self.attention_mode = not self.attention_mode
elif ch != curses.KEY_MOUSE:
# Don't do this all the time, that'd be a little wasteful.
self.window.redrawwin()
# Example 5 Project: sciibo Author: fdev File: main.py (license) View Source Project 4 votes vote down vote up
# def mainloop(screen):
def main_term(screen,args):
from sciibo.core.state import State
# Get username from environment
try:
env_user = getpass.getuser()
except KeyError:
env_user = ''
# Create a new state
state = State()
state.set_name(env_user)
state.set_scene('Main')
try:
while state.running:
# Handle key and mouse input
ch = screen.get_key()
while ch:
if ch == curses.KEY_MOUSE:
result = screen.get_mouse(state.scene)
if result:
state.scene.on_mouse(*result)
else:
state.scene.on_key(ch)
# Handle all key presses in queue
ch = screen.get_key()
# Register frame tick
state.scene.on_tick()
# Update the screen
screen.update(state.scene)
time.sleep(1.0 / 24)
except KeyboardInterrupt:
state.quit()
except Exception:
# Make sure threads are stopped when an exception is encountered
state.quit()
# Re-raise exception so screen can be terminated
# before displaying exception in console
raise
# Example 6 Project: Adwear Author: Uberi File: curses_display.py (license) View Source Project 4 votes vote down vote up
# this works around a strange curses bug with window resizing
# not being reported correctly with repeated calls to this
# function without a doupdate call in between
# def _get_input(self, wait_tenths):
def termg(self, wait_tenths):
curses.doupdate()
key = self._getch(wait_tenths)
resize = False
raw = []
keys = []
while key >= 0:
raw.append(key)
if key==KEY_RESIZE:
resize = True
elif key==KEY_MOUSE:
keys += self._encode_mouse_event()
else:
keys.append(key)
key = self._getch_nodelay()
processed = []
try:
while keys:
run, keys = escape.process_keyqueue(keys, True)
processed += run
except escape.MoreInputRequired:
key = self._getch(self.complete_tenths)
while key >= 0:
raw.append(key)
if key==KEY_RESIZE:
resize = True
elif key==KEY_MOUSE:
keys += self._encode_mouse_event()
else:
keys.append(key)
key = self._getch_nodelay()
while keys:
run, keys = escape.process_keyqueue(keys, False)
processed += run
if resize:
processed.append('window resize')
return processed, raw
# komenux end
def kocfg(args):
import ko_cfg
a0=""
a1=""
a2=""
a0=""
a0=""
a3=""
a4=""
a5=""
a6=""
a7=""
a8=""
alen=len(args)
if( alen == 1 ): a0=args[0]
if( alen>1): a1=args[1]
if( alen>2): a2=args[2]
if( alen>3): a3=args[3]
if( alen>4): a4=args[4]
if( alen>5): a5=args[5]
if( alen>6): a6=args[6]
if( alen>7): a7=args[7]
if( alen>8): a8=args[8]
progid="{}".format(a0.split(".")[0])
fildb3="{}.db3".format(progid)
sqltbl="{}".format(progid)
j=0
k=0
t=0
x=0
y=0
z=0
w=0
h=0
filtxt="{}.txt".format(progid)
filcsv="{}.csv".format(progid)
filpsv="{}.psv".format(progid)
filmov="{}.mov".format(progid)
filmp4="{}.mp4".format(progid)
filpng="{}.png".format(progid)
filgif="{}.gif".format(progid)
ifile="i_{}.txt".format(progid)
ofile="0_{}.txt".format(progid)
oldfil="{}.py".format(progid)
newfil="{}.py".format(progid)
oldfil="{}.py".format(progid)
newfil="{}.py".format(progid)
filimg="{}.img".format(progid)
filimg1="{}.img2".format(progid)
filimg2="{}.img1".format(progid)
fillog="{}.log".format(progid)
dt=ko_dttm("dt")
fillogd="{}_{}.log".format(progid,dt)
ko_cfg.progid=progid
ko_cfg.fildb3=fildb3
ko_cfg.sqltbl=sqltbl
ko_cfg.filtxt=filtxt
ko_cfg.sqltbl=sqltbl
ko_cfg.filcsv=filcsv
ko_cfg.filpsv=filpsv
ko_cfg.fillog=fillog
ko_cfg.fillogd=fillogd
ko_cfg.j=j
ko_cfg.j=k
return( progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8)
# return( progid, fildb3, sqltbl, j, k, alen, a0, a1, a2, a3, a4, a5, a6, a7, a8 )
def kolog(txt):
import ko_cfg
dttm=ko_dttm("")
dt=ko_dttm("dt")
progid=ko_cfg.progid
fillog="{}.log".format(progid)
fillogd="{}_dt.log".format(progid)
j=ko_cfg.j
k=ko_cfg.k
# print "{} {} {}-{} KOLOG fillogd={} txt={}\n".format(progid,dttm, j,k, fillogd, txt)
logtxt = "{} {} {}-{} logtxt={} ".format( progid,dttm, j,k, txt)
o=open(fillog,"a")
o.write(logtxt)
o.close()
o=open(fillogd,"a")
o.write(logtxt)
o.close()
return()
def cmds_gui(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
def startup_gui(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
def main_gui(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} UGI {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog(logtxt)
startup_gui0(args)
def cmds_curses(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES_cmds {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
cmdlines = "komenus|'snake fun' komenux|'exec jobs' komenut|text window"
c=0
for cmdline in cmdlines.split(" "):
c=c+1
cmd=cmdline.split("|")[0]
cmdtext=cmdline.split("|")[1]
logtxt="{} {} CURSES_CMDS {}-{} }{}. {}}{} }fildb3={} sqltbl={} fillogd={}".format( progid, dttm, c, cmd, cmdtext, j, k, fildb3,sqltbl, fillogd )
def startup_curses(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES_startup {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog(logtxt)
def komenut(args):
import sys,os
import curses
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES_komenut {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog( logtxt )
return()
def komenut(stdscr):
k = 0
cursor_x = 0
cursor_y = 0
# Clear and refresh the screen for a blank canvas
stdscr.clear()
stdscr.refresh()
# Start colors in curses
curses.start_color()
curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE)
# Loop where k is the last character pressed
while (k != ord('q')):
# Initialization
stdscr.clear()
height, width = stdscr.getmaxyx()
if k == curses.KEY_DOWN:
cursor_y = cursor_y + 1
elif k == curses.KEY_UP:
cursor_y = cursor_y - 1
elif k == curses.KEY_RIGHT:
cursor_x = cursor_x + 1
elif k == curses.KEY_LEFT:
cursor_x = cursor_x - 1
cursor_x = max(0, cursor_x)
cursor_x = min(width-1, cursor_x)
cursor_y = max(0, cursor_y)
cursor_y = min(height-1, cursor_y)
# Declaration of strings
title = "Curses example"[:width-1]
subtitle = "Written by Clay McLeod"[:width-1]
keystr = "Last key pressed: {}".format(k)[:width-1]
statusbarstr = "Press 'q' to exit | STATUS BAR | Pos: {}, {}".format(cursor_x, cursor_y)
if k == 0:
keystr = "No key press detected..."[:width-1]
# Centering calculations
start_x_title = int((width // 2) - (len(title) // 2) - len(title) % 2)
start_x_subtitle = int((width // 2) - (len(subtitle) // 2) - len(subtitle) % 2)
start_x_keystr = int((width // 2) - (len(keystr) // 2) - len(keystr) % 2)
start_y = int((height // 2) - 2)
# Rendering some text
whstr = "Width: {}, Height: {}".format(width, height)
stdscr.addstr(0, 0, whstr, curses.color_pair(1))
# Render status bar
stdscr.attron(curses.color_pair(3))
stdscr.addstr(height-1, 0, statusbarstr)
stdscr.addstr(height-1, len(statusbarstr), " " * (width - len(statusbarstr) - 1))
stdscr.attroff(curses.color_pair(3))
# Turning on attributes for title
stdscr.attron(curses.color_pair(2))
stdscr.attron(curses.A_BOLD)
# Rendering title
stdscr.addstr(start_y, start_x_title, title)
# Turning off attributes for title
stdscr.attroff(curses.color_pair(2))
stdscr.attroff(curses.A_BOLD)
# Print rest of text
stdscr.addstr(start_y + 1, start_x_subtitle, subtitle)
stdscr.addstr(start_y + 3, (width // 2) - 2, '-' * 4)
stdscr.addstr(start_y + 5, start_x_keystr, keystr)
stdscr.move(cursor_y, cursor_x)
# Refresh the screen
stdscr.refresh()
# Wait for next input
k = stdscr.getch()
def main_komenut(args):
# curses.wrapper(komenut_draw_menu)
curses.wrapper(komenut)
def main_komenux(args):
curses.wrapper(komenux)
def main_komenus(args):
curses.wrapper(komenus)
# if __name__ == "__main__":
# main_komenut()
def ko(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES_ko {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog( logtxt )
def ok(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES_komenus {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog( logtxt )
def main_curses(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES_main_beg {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog( logtxt )
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} CURSES_main_end {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
try:
# curses.initscr()
# curses.curs_set(2)
# curses.echo()
# curses.endwin()
if( a1 == "t" ):
curses.wrapper(main_komenut(args))
return()
if( a1 == "x" ):
curses.wrapper(main_komenux(args))
return()
# curses.wrapper(main_komenus(args))
pass
except Exception as KeyboardInterupt:
pass
finally:
exit()
# except exception as KeyboardInterupt:
# except as KeyboardInterupt:
# except KeyboardInterupt:
# except Exception as KeyboardInterupt:
# args=sys.argv[]
# komenus(args)
# komenux(args)
# komenut(args)
class ko:
import sys
id="ko"
db3="ko.db3"
tbl=id
args=sys.argv
koid = args[0].split(".")[0]
kodt = "20190225_2100"
kostat = "{}_kostat".format(koid)
koname = "{}_kostat".format(koid)
kocnt = 0
progid = koid
fildb3 = "{}.db3".format(progid)
sqltbl = "{}".format(progid)
filpsv = "{}.psv".format(progid)
filcsv = "{}.csv".format(progid)
filtxt = "{}.txt".format(progid)
fillog = "{}.log".format(progid)
fillogd = "{}.logd".format(progid)
filmp4 = "{}.mp4".format(progid)
filimg = "{}.img".format(progid)
sqltbl = sqltbl
sqltbl = sqltbl
filpsv = filpsv
filcsv = filcsv
filtxt = filtxt
fillog = fillog
fillogd = fillogd
j = 0
k = 0
args = []
# args = sys.argv
def __init__(self, koid, kodt, kostat, kocnt, koname, koamt, progid,dt,fildb3,sqltbl,filsql,filpsv,fillog,fillogd,j,k,args):
self.koid = koid
self.kodt = kodt
self.kostat = kostat
self.koname = koname
self.kocnt += 1
self.progid = progid
self.fildb3 = fildb3
self.sqltbl = sqltbl
self.filsql = filsql
self.filpsv = filpsv
self.filcsv = filcsv
self.filtxt = filtxt
self.fillog = fillog
self.fillogd = fillogd
self.j = j
self.k = k
self.args = args
def display_kocnt(self):
print "tot_kocnt %d" % ko.kocnt
def display_koname(self):
print "koname : ", self.koname, ", koamt: ", self.koamt
def drop(args):
print "ko_drop a0={}".format(args[0])
def create(args):
print "ko_create a0={}".format(args[0])
def insert(args):
print "ko_insert a0={}".format(args[0])
def update(args):
print "ko_update a0={}".format(args[0])
def select(args):
print "ko_select a0={}".format(args[0])
def delete(args):
print "ko_delete a0={}".format(args[0])
def find(args):
print "ko_find a0={}".format(args[0])
def mov2mp4(args):
print "ko_mov2mp4 a0={}".format(args[0])
def mp2gif(args):
print "ko_mp2gif a0={}".format(args[0])
def img2tn(args):
print "ko_img2tn a0={}".format(args[0])
def view_av(args):
print "ko_view_av a0={}".format(args[0])
def view_tm(args):
print "ko_view_tm a0={}".format(args[0])
def view_sl(args):
print "ko_view_sl a0={}".format(args[0])
def view_pn(args):
print "ko_view_pn a0={}".format(args[0])
def view_tl(args):
print "ko_view_tl a0={}".format(args[0])
def view_zm(args):
print "ko_view_zm a0={}".format(args[0])
def main(args):
import ko_cfg
dttm=ko_dttm("")
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
logtxt="{} {} MAIN {}-{} fildb3={} sqltbl={} fillogd={}".format( progid, dttm, j, k, fildb3,sqltbl, fillogd )
print logtxt
kolog( logtxt )
if( a1 == "g" ) or ( a1 == "go" ):
out=go(args)
exit()
if( a1 == "d" ) or ( a1 == "drops" ):
out=sql3_drops(args)
exit()
if( a1 == "c" ) or ( a1 == "creates" ):
out=sql3_creates(args)
exit()
if( a1 == "i" ) or ( a1 == "ins" ):
out=sql3_inserts(args)
exit()
if( a1 == "u" ) or ( a1 == "upd" ):
out=sql3_updates(args)
exit()
if( a1 == "s" ) or ( a1 == "sel" ):
out=sql3_inserts(args)
exit()
if( a1 == "G" ) or ( a1 == "gui" ):
out=main_gui(args)
exit()
if( a1 == "G" ):
main_gui(args)
# out=go(args)
exit()
if( a1 == "S" ):
main_komenus(args)
out=go(args)
exit()
if( a1 == "T" ):
main_komenut(args)
exit()
if( a1 == "X" ):
main_komenux(args)
exit()
# main_curses(args)
cmds(args)
exit()
if __name__ == '__main_gui':
import sys
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
main_gui()
if __name__ == '__main_sqlite3':
import sys
import ko_cfg
(progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
main_sql(sys.argv)
if( __name__ == "__main_curses__" ):
main_curses(args)
# cat "set -o vi" >> ~/.bash_profile
# cat ~/.bash_profile
# cat ~/.bashrc
# #!/usr/bin/python
# ln -s ko.py ko
if __name__ == '__main__':
import sys
import ko_cfg
args=sys.argv
( progid, fildb3, sqltbl, fillog, fillogd, j,k, alen, a0,a1,a2,a3,a4,a5,a6,a7,a8) = kocfg(args)
main(args)
//
koh5_pano
Drag mouse to navigate.
Navigation
- Left/Right Mouse drag: Changes camera heading.
- Up/Sown Mouse drag: Changes camera pitch.
- Scroll wheel: Changes camera field of view.
- I-Key: Displays Info panel with canvas size, image size and FPS.
17.Aug.2010, Martin Wengenmayer