import pyautogui
import time
import pyperclip
import subprocess
import functools
import math
import os
import os.path
import shutil
import sys
import re
# x = 255
# y = 250
# x, y = pyautogui.position()
def askMeToCLick(width, height):
pyautogui.click(width, height, duration=0.50)
def askMeToMaximiseMinimise():
print("\n ------Maximise&askMeToMaximise Invoked ---------\n")
askMeToCLick(1903, 1061)
def startKazam():
print("\n ------startKazam Invoked ---------\n")
pyautogui.hotkey('ctrlleft', 'winleft', 'r')
def stopKazam():
print("\n ------stopKazam Invoked ---------\n")
pyautogui.hotkey('ctrlleft', 'winleft', 'f')
def openKazam():
print("\n ------openKazam Invoked ---------\n")
askMeToCLick(22, 1904)
def saveFile():
print("\n ------saveFile Invoked ---------\n")
askMeToCLick(1880, 1058)
def copyFilename():
pyautogui.moveTo(377, 127)
pyautogui.click()
pyautogui.dragTo(1190, 135, duration=0.25)
pyautogui.hotkey('ctrl', 'c')
def copyFoldername():
# global x, y
# # pyautogui.click(x, y)
pyautogui.click(x, y)
pyautogui.dragRel(300, 10, duration=0.25)
pyautogui.hotkey('ctrl', 'c')
pyautogui.click(x, y)
def checkYoutubeButton():
pyautogui.moveTo(800, 410, duration=0.250)
im = pyautogui.screenshot()
print(im.getpixel((1179, 631)))
print(pyautogui.pixelMatchesColor(1179, 631, (255, 255, 255)))
# sys.exit()
return pyautogui.pixelMatchesColor(1179, 631, (255, 255, 255))
def clickYoutubeButton():
if(checkYoutubeButton):
pyautogui.rightClick(1179, 631, duration=0.250)
askMeToCLick(1199, 654)
downloadVideoInTerminal()
def downloadVideoInTerminal():
global folderName
print("Downloading Youtube Video")
url = pyperclip.paste()
print("Url = {a}".format(a=url))
# dest = '{val}'.format(val=folderName)
subprocess.run(["you-get", "-o", folderName, url])
# subprocess.run(["you-get","-o",'\"Graphs.(SelfStudy)\"',"https://y...content-available-to-author-only...u.be/MTsvJUwZdS4"])
def checkTitleOrFile(x, y):
print("X = {A} Y= {B}".format(A=x, B=y))
im = pyautogui.screenshot()
yn = pyautogui.pixelMatchesColor(x, y, (42, 42, 42))
if yn:
print("File")
return 1 # File
else:
print("Folder")
return 0 # Folder
def get_time():
pyautogui.click(1500, 870)
pyautogui.hotkey('ctrlleft', 'shiftleft', 'j')
pyautogui.click(1498, 735, duration=0.25)
sys.exit()
pyautogui.click(1175, 129, duration=0.25)
pyautogui.click(1145, 170, duration=0.25)
pyautogui.typewrite("document.getElementById('video').duration", 0.10)
pyautogui.press('enter')
pyautogui.click(1155, 171, duration=0.25)
pyautogui.dragTo(1291, 173, duration=0.5)
pyautogui.hotkey('ctrl', 'c')
pyautogui.click(1894, 114)
value = pyperclip.paste()
time = float(value)
time = math.ceil(time)
print("Time For the Video Is ={t}".format(t=time))
return time
def set_duration():
pyautogui.click(1500, 870)
pyautogui.hotkey('ctrlleft', 'shiftleft', 'j')
pyautogui.click(1498, 735, duration=0.25)
pyautogui.click(1175, 129, duration=0.25)
sys.exit()
pyautogui.click(1145, 170, duration=0.25)
pyautogui.typewrite("document.getElementById('video').currentTime=0", 0.10)
pyautogui.press('enter')
pyautogui.click(1894, 114)
def createFolder(folderName):
try:
if os.path.isdir(os.path.join(os.getcwd(), folderName)) == False:
os.makedirs(folderName)
print("Directory Created")
else:
print("\n Directory Present No Need To Create A Directory")
except:
print("Directory Not Created")
def moveFiles(folderName):
try:
path = "/home/ashish/Desktop/folder_name/"
moveto = "/home/ashish/Desktop/folder_name/" + folderName + "/"
files = os.listdir(path)
files.sort()
for f in files:
if f.endswith(".mp4"):
src = path + f
dst = moveto + f
shutil.move(src, dst)
elif f.endswith(".srt"):
src = path + f
dst = moveto + f
shutil.move(src, dst)
except:
print("---------------File Movement Failed------------")
def renameFiles(file):
path = "/home/ashish/Desktop/folder_Name/"
moveTo = "/home/ashish/Desktop/folder_Name/"
os.listdir(os.getcwd())
files = os.listdir(path)
name = file + ".mp4"
for f in files:
if f.startswith("coding"):
print("\n" + f + "\n")
os.rename(f, name)
def scrollIndex():
# global x, y
# pyautogui.click(x, y)
# pyautogui.press('down')
# pyautogui.press('down')
pyautogui.scroll(-16)
def increasey():
global y
y += 40
def close(a, b):
askMeToCLick(a, b)
def PauseVideo():
print("\n ------PauseVideo Invoked ---------\n")
pyautogui.click(777, 458)
pyautogui.press('space')
print("\n ------PauseVideo End ---------\n")
def PlayVideo():
print("\n ------PlayVideo Invoked ---------\n")
pyautogui.click(777, 458)
pyautogui.press('space')
print("\n ------PlayVideo End ---------\n")
def CheckPlayPause():
data = pyautogui.locateOnScreen('pl.png')
if data is None:
PauseVideo()
pyautogui.press('space')
def removeNum(in_string):
out_string = filter(lambda c: not c.isdigit(), in_string)
data = list(out_string)
out_string = ""
for i in data:
out_string += i
return out_string
def createLog(txt):
file = open('log.txt', 'a+')
file.write(txt)
file.close()
folderName = ""
var = 0
x = 100
y = 210
i = 0
a = 0
b = 0
fileCount = 0
def whatIsFolderName():
global folderName
folderName = pyperclip.paste().strip().replace(" ", "")
print("\n---Folder Name={f}---\n".format(f=folderName))
folderName = removeNum(folderName)
folderName = re.sub('\ |(|)|\?|\.|\!|\/|\;|\:', '', folderName)
def whatIsFileName():
fileName = pyperclip.paste().strip().replace(" ", "")
fileName = re.sub('[0-9]| |\| (|)|\?|\.|\!|\/|\;|\:', '', fileName)
print("\n---File Name={f}---\n".format(f=fileName))
return fileName
def youtubeDownloadProcess():
global fileCount, folderName
clickYoutubeButton()
createLog(str(fileCount) + " . Youtube File Created\n")
# print("Move Files Called")
# moveFiles(folderName)
time.sleep(2)
def kazamRecordProcess(fileName):
global folderName, fileCount
set_duration()
time.sleep(2)
videoTime = get_time() - 3
print(
"\n------Sleeping For ----= {d}\n".format(d=videoTime))
askMeToMaximiseMinimise()
time.sleep(1)
# openKazam()
startKazam()
time.sleep(1)
PlayVideo()
time.sleep(videoTime) # videoTime
stopKazam()
time.sleep(2)
renameFiles(fileName)
message = (str(fileCount) + ' . ' +
str(fileName) + ' created\n')
createLog(message)
askMeToMaximiseMinimise()
moveFiles(folderName)
def relocateCursor():
global i, a, b, x, y
temp = ""
if i > 0:
close(a, b)
moveFiles(temp)
# time.sleep(1)
i = 0
y = b + 40
if(i == 0):
a = x
b = y
increasey()
i = i + 1
def checkFilePresent(name):
pathV = "/home/ashish/Desktop/Folder_Name/" + name +".mp4"
return os.path.isfile(pathV)
def main():
global i
global y, x, folderName, a, b, var, fileCount
while(y <= 1080):
if (checkTitleOrFile(x, y) == 0):
# print("\n----------- Creating Folder-----------\n")
#
# copyFoldername()
# whatIsFolderName()
# createFolder(folderName)
relocateCursor()
continue
else:
# FIle Counter
fileCount += 1
# print("\n----------- Creating File-----------\n")
pyautogui.click(x, y, duration=0.25)
# waiting to load video
time.sleep(4)
if checkYoutubeButton():
# print("Youtube File")
# youtubeDownloadProcess()
increasey()
continue
else:
CheckPlayPause()
# Copy File Name
copyFilename()
fileName = whatIsFileName()
if checkFilePresent(fileName) == True:
continue
kazamRecordProcess(fileName)
increasey()
if __name__ == "__main__":
time.sleep(5)
main()
# fileName = removeNum(fileName)
aW1wb3J0IHB5YXV0b2d1aQppbXBvcnQgdGltZQppbXBvcnQgcHlwZXJjbGlwCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IG1hdGgKaW1wb3J0IG9zCmltcG9ydCBvcy5wYXRoCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgcmUKCiMgeCA9IDI1NQojIHkgPSAyNTAKCiMgeCwgeSA9IHB5YXV0b2d1aS5wb3NpdGlvbigpCgoKZGVmIGFza01lVG9DTGljayh3aWR0aCwgaGVpZ2h0KToKICAgIHB5YXV0b2d1aS5jbGljayh3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbj0wLjUwKQoKCmRlZiBhc2tNZVRvTWF4aW1pc2VNaW5pbWlzZSgpOgogICAgcHJpbnQoIlxuIC0tLS0tLU1heGltaXNlJmFza01lVG9NYXhpbWlzZSBJbnZva2VkIC0tLS0tLS0tLVxuIikKICAgIGFza01lVG9DTGljaygxOTAzLCAxMDYxKQoKCmRlZiBzdGFydEthemFtKCk6CiAgICBwcmludCgiXG4gLS0tLS0tc3RhcnRLYXphbSBJbnZva2VkIC0tLS0tLS0tLVxuIikKICAgIHB5YXV0b2d1aS5ob3RrZXkoJ2N0cmxsZWZ0JywgJ3dpbmxlZnQnLCAncicpCgoKZGVmIHN0b3BLYXphbSgpOgogICAgcHJpbnQoIlxuIC0tLS0tLXN0b3BLYXphbSBJbnZva2VkIC0tLS0tLS0tLVxuIikKICAgIHB5YXV0b2d1aS5ob3RrZXkoJ2N0cmxsZWZ0JywgJ3dpbmxlZnQnLCAnZicpCgoKZGVmIG9wZW5LYXphbSgpOgogICAgcHJpbnQoIlxuIC0tLS0tLW9wZW5LYXphbSBJbnZva2VkIC0tLS0tLS0tLVxuIikKICAgIGFza01lVG9DTGljaygyMiwgMTkwNCkKCgpkZWYgc2F2ZUZpbGUoKToKICAgIHByaW50KCJcbiAtLS0tLS1zYXZlRmlsZSBJbnZva2VkIC0tLS0tLS0tLVxuIikKICAgIGFza01lVG9DTGljaygxODgwLCAxMDU4KQoKCmRlZiBjb3B5RmlsZW5hbWUoKToKICAgIHB5YXV0b2d1aS5tb3ZlVG8oMzc3LCAxMjcpCiAgICBweWF1dG9ndWkuY2xpY2soKQogICAgcHlhdXRvZ3VpLmRyYWdUbygxMTkwLCAxMzUsIGR1cmF0aW9uPTAuMjUpCiAgICBweWF1dG9ndWkuaG90a2V5KCdjdHJsJywgJ2MnKQoKCmRlZiBjb3B5Rm9sZGVybmFtZSgpOgogICAgIyBnbG9iYWwgeCwgeQogICAgIyAjIHB5YXV0b2d1aS5jbGljayh4LCB5KQogICAgcHlhdXRvZ3VpLmNsaWNrKHgsIHkpCiAgICBweWF1dG9ndWkuZHJhZ1JlbCgzMDAsIDEwLCBkdXJhdGlvbj0wLjI1KQogICAgcHlhdXRvZ3VpLmhvdGtleSgnY3RybCcsICdjJykKICAgIHB5YXV0b2d1aS5jbGljayh4LCB5KQoKCmRlZiBjaGVja1lvdXR1YmVCdXR0b24oKToKICAgIHB5YXV0b2d1aS5tb3ZlVG8oODAwLCA0MTAsIGR1cmF0aW9uPTAuMjUwKQogICAgaW0gPSBweWF1dG9ndWkuc2NyZWVuc2hvdCgpCiAgICBwcmludChpbS5nZXRwaXhlbCgoMTE3OSwgNjMxKSkpCiAgICBwcmludChweWF1dG9ndWkucGl4ZWxNYXRjaGVzQ29sb3IoMTE3OSwgNjMxLCAoMjU1LCAyNTUsIDI1NSkpKQogICAgIyBzeXMuZXhpdCgpCiAgICByZXR1cm4gcHlhdXRvZ3VpLnBpeGVsTWF0Y2hlc0NvbG9yKDExNzksIDYzMSwgKDI1NSwgMjU1LCAyNTUpKQoKCmRlZiBjbGlja1lvdXR1YmVCdXR0b24oKToKICAgIGlmKGNoZWNrWW91dHViZUJ1dHRvbik6CiAgICAgICAgcHlhdXRvZ3VpLnJpZ2h0Q2xpY2soMTE3OSwgNjMxLCBkdXJhdGlvbj0wLjI1MCkKICAgICAgICBhc2tNZVRvQ0xpY2soMTE5OSwgNjU0KQogICAgICAgIGRvd25sb2FkVmlkZW9JblRlcm1pbmFsKCkKCgpkZWYgZG93bmxvYWRWaWRlb0luVGVybWluYWwoKToKICAgIGdsb2JhbCBmb2xkZXJOYW1lCiAgICBwcmludCgiRG93bmxvYWRpbmcgWW91dHViZSBWaWRlbyIpCiAgICB1cmwgPSBweXBlcmNsaXAucGFzdGUoKQogICAgcHJpbnQoIlVybCA9ICB7YX0iLmZvcm1hdChhPXVybCkpCiAgICAjIGRlc3QgPSAne3ZhbH0nLmZvcm1hdCh2YWw9Zm9sZGVyTmFtZSkKICAgIHN1YnByb2Nlc3MucnVuKFsieW91LWdldCIsICItbyIsIGZvbGRlck5hbWUsIHVybF0pCgogIyBzdWJwcm9jZXNzLnJ1bihbInlvdS1nZXQiLCItbyIsJ1wiR3JhcGhzLihTZWxmU3R1ZHkpXCInLCJodHRwczovL3kuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnUuYmUvTVRzdkpVd1pkUzQiXSkKCgpkZWYgY2hlY2tUaXRsZU9yRmlsZSh4LCB5KToKICAgIHByaW50KCJYID0ge0F9IFk9IHtCfSIuZm9ybWF0KEE9eCwgQj15KSkKICAgIGltID0gcHlhdXRvZ3VpLnNjcmVlbnNob3QoKQogICAgeW4gPSBweWF1dG9ndWkucGl4ZWxNYXRjaGVzQ29sb3IoeCwgeSwgKDQyLCA0MiwgNDIpKQogICAgaWYgeW46CiAgICAgICAgcHJpbnQoIkZpbGUiKQogICAgICAgIHJldHVybiAxICAjIEZpbGUKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoIkZvbGRlciIpCiAgICAgICAgcmV0dXJuIDAgICMgRm9sZGVyCgoKZGVmIGdldF90aW1lKCk6CiAgICBweWF1dG9ndWkuY2xpY2soMTUwMCwgODcwKQogICAgcHlhdXRvZ3VpLmhvdGtleSgnY3RybGxlZnQnLCAnc2hpZnRsZWZ0JywgJ2onKQogICAgcHlhdXRvZ3VpLmNsaWNrKDE0OTgsIDczNSwgZHVyYXRpb249MC4yNSkKICAgIHN5cy5leGl0KCkKICAgIHB5YXV0b2d1aS5jbGljaygxMTc1LCAxMjksIGR1cmF0aW9uPTAuMjUpCiAgICBweWF1dG9ndWkuY2xpY2soMTE0NSwgMTcwLCBkdXJhdGlvbj0wLjI1KQogICAgcHlhdXRvZ3VpLnR5cGV3cml0ZSgiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZGVvJykuZHVyYXRpb24iLCAwLjEwKQogICAgcHlhdXRvZ3VpLnByZXNzKCdlbnRlcicpCiAgICBweWF1dG9ndWkuY2xpY2soMTE1NSwgMTcxLCBkdXJhdGlvbj0wLjI1KQogICAgcHlhdXRvZ3VpLmRyYWdUbygxMjkxLCAxNzMsIGR1cmF0aW9uPTAuNSkKICAgIHB5YXV0b2d1aS5ob3RrZXkoJ2N0cmwnLCAnYycpCiAgICBweWF1dG9ndWkuY2xpY2soMTg5NCwgMTE0KQogICAgdmFsdWUgPSBweXBlcmNsaXAucGFzdGUoKQogICAgdGltZSA9IGZsb2F0KHZhbHVlKQogICAgdGltZSA9IG1hdGguY2VpbCh0aW1lKQogICAgcHJpbnQoIlRpbWUgRm9yIHRoZSBWaWRlbyBJcyA9e3R9Ii5mb3JtYXQodD10aW1lKSkKICAgIHJldHVybiB0aW1lCgoKZGVmIHNldF9kdXJhdGlvbigpOgogICAgcHlhdXRvZ3VpLmNsaWNrKDE1MDAsIDg3MCkKICAgIHB5YXV0b2d1aS5ob3RrZXkoJ2N0cmxsZWZ0JywgJ3NoaWZ0bGVmdCcsICdqJykKICAgIHB5YXV0b2d1aS5jbGljaygxNDk4LCA3MzUsIGR1cmF0aW9uPTAuMjUpCiAgICBweWF1dG9ndWkuY2xpY2soMTE3NSwgMTI5LCBkdXJhdGlvbj0wLjI1KQogICAgc3lzLmV4aXQoKQogICAgcHlhdXRvZ3VpLmNsaWNrKDExNDUsIDE3MCwgZHVyYXRpb249MC4yNSkKICAgIHB5YXV0b2d1aS50eXBld3JpdGUoImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWRlbycpLmN1cnJlbnRUaW1lPTAiLCAwLjEwKQogICAgcHlhdXRvZ3VpLnByZXNzKCdlbnRlcicpCiAgICBweWF1dG9ndWkuY2xpY2soMTg5NCwgMTE0KQoKCmRlZiBjcmVhdGVGb2xkZXIoZm9sZGVyTmFtZSk6CiAgICB0cnk6CiAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIGZvbGRlck5hbWUpKSA9PSBGYWxzZToKICAgICAgICAgICAgb3MubWFrZWRpcnMoZm9sZGVyTmFtZSkKICAgICAgICAgICAgcHJpbnQoIkRpcmVjdG9yeSBDcmVhdGVkIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCgiXG4gRGlyZWN0b3J5IFByZXNlbnQgTm8gTmVlZCBUbyBDcmVhdGUgQSBEaXJlY3RvcnkiKQogICAgZXhjZXB0OgogICAgICAgIHByaW50KCJEaXJlY3RvcnkgTm90IENyZWF0ZWQiKQoKCmRlZiBtb3ZlRmlsZXMoZm9sZGVyTmFtZSk6CiAgICB0cnk6CiAgICAgICAgcGF0aCA9ICIvaG9tZS9hc2hpc2gvRGVza3RvcC9mb2xkZXJfbmFtZS8iCiAgICAgICAgbW92ZXRvID0gIi9ob21lL2FzaGlzaC9EZXNrdG9wL2ZvbGRlcl9uYW1lLyIgKyBmb2xkZXJOYW1lICsgIi8iCiAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHBhdGgpCiAgICAgICAgZmlsZXMuc29ydCgpCiAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIGYuZW5kc3dpdGgoIi5tcDQiKToKICAgICAgICAgICAgICAgIHNyYyA9IHBhdGggKyBmCiAgICAgICAgICAgICAgICBkc3QgPSBtb3ZldG8gKyBmCiAgICAgICAgICAgICAgICBzaHV0aWwubW92ZShzcmMsIGRzdCkKICAgICAgICAgICAgZWxpZiBmLmVuZHN3aXRoKCIuc3J0Iik6CiAgICAgICAgICAgICAgICBzcmMgPSBwYXRoICsgZgogICAgICAgICAgICAgICAgZHN0ID0gbW92ZXRvICsgZgogICAgICAgICAgICAgICAgc2h1dGlsLm1vdmUoc3JjLCBkc3QpCgogICAgZXhjZXB0OgogICAgICAgIHByaW50KCItLS0tLS0tLS0tLS0tLS1GaWxlIE1vdmVtZW50IEZhaWxlZC0tLS0tLS0tLS0tLSIpCgoKZGVmIHJlbmFtZUZpbGVzKGZpbGUpOgogICAgcGF0aCA9ICIvaG9tZS9hc2hpc2gvRGVza3RvcC9mb2xkZXJfTmFtZS8iCiAgICBtb3ZlVG8gPSAiL2hvbWUvYXNoaXNoL0Rlc2t0b3AvZm9sZGVyX05hbWUvIgogICAgb3MubGlzdGRpcihvcy5nZXRjd2QoKSkKICAgIGZpbGVzID0gb3MubGlzdGRpcihwYXRoKQoKICAgIG5hbWUgPSBmaWxlICsgIi5tcDQiCiAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICBpZiBmLnN0YXJ0c3dpdGgoImNvZGluZyIpOgogICAgICAgICAgICBwcmludCgiXG4iICsgZiArICJcbiIpCiAgICAgICAgICAgIG9zLnJlbmFtZShmLCAgbmFtZSkKCgpkZWYgc2Nyb2xsSW5kZXgoKToKICAgICMgZ2xvYmFsIHgsIHkKICAgICMgcHlhdXRvZ3VpLmNsaWNrKHgsIHkpCiAgICAjIHB5YXV0b2d1aS5wcmVzcygnZG93bicpCiAgICAjIHB5YXV0b2d1aS5wcmVzcygnZG93bicpCiAgICBweWF1dG9ndWkuc2Nyb2xsKC0xNikKCgpkZWYgaW5jcmVhc2V5KCk6CiAgICBnbG9iYWwgeQogICAgeSArPSA0MAoKCmRlZiBjbG9zZShhLCBiKToKICAgIGFza01lVG9DTGljayhhLCBiKQoKCmRlZiBQYXVzZVZpZGVvKCk6CiAgICBwcmludCgiXG4gLS0tLS0tUGF1c2VWaWRlbyBJbnZva2VkIC0tLS0tLS0tLVxuIikKICAgIHB5YXV0b2d1aS5jbGljayg3NzcsIDQ1OCkKICAgIHB5YXV0b2d1aS5wcmVzcygnc3BhY2UnKQogICAgcHJpbnQoIlxuIC0tLS0tLVBhdXNlVmlkZW8gRW5kIC0tLS0tLS0tLVxuIikKCgpkZWYgUGxheVZpZGVvKCk6CiAgICBwcmludCgiXG4gLS0tLS0tUGxheVZpZGVvIEludm9rZWQgLS0tLS0tLS0tXG4iKQogICAgcHlhdXRvZ3VpLmNsaWNrKDc3NywgNDU4KQogICAgcHlhdXRvZ3VpLnByZXNzKCdzcGFjZScpCiAgICBwcmludCgiXG4gLS0tLS0tUGxheVZpZGVvIEVuZCAtLS0tLS0tLS1cbiIpCgoKZGVmIENoZWNrUGxheVBhdXNlKCk6CiAgICBkYXRhID0gcHlhdXRvZ3VpLmxvY2F0ZU9uU2NyZWVuKCdwbC5wbmcnKQogICAgaWYgZGF0YSBpcyBOb25lOgogICAgICAgIFBhdXNlVmlkZW8oKQogICAgICAgIHB5YXV0b2d1aS5wcmVzcygnc3BhY2UnKQoKCmRlZiByZW1vdmVOdW0oaW5fc3RyaW5nKToKICAgIG91dF9zdHJpbmcgPSBmaWx0ZXIobGFtYmRhIGM6IG5vdCBjLmlzZGlnaXQoKSwgaW5fc3RyaW5nKQogICAgZGF0YSA9IGxpc3Qob3V0X3N0cmluZykKICAgIG91dF9zdHJpbmcgPSAiIgogICAgZm9yIGkgaW4gZGF0YToKICAgICAgICBvdXRfc3RyaW5nICs9IGkKICAgIHJldHVybiBvdXRfc3RyaW5nCgoKZGVmIGNyZWF0ZUxvZyh0eHQpOgogICAgZmlsZSA9IG9wZW4oJ2xvZy50eHQnLCAnYSsnKQogICAgZmlsZS53cml0ZSh0eHQpCiAgICBmaWxlLmNsb3NlKCkKCgpmb2xkZXJOYW1lID0gIiIKdmFyID0gMAp4ID0gMTAwCnkgPSAyMTAKaSA9IDAKYSA9IDAKYiA9IDAKZmlsZUNvdW50ID0gMAoKCmRlZiB3aGF0SXNGb2xkZXJOYW1lKCk6CiAgICBnbG9iYWwgZm9sZGVyTmFtZQogICAgZm9sZGVyTmFtZSA9IHB5cGVyY2xpcC5wYXN0ZSgpLnN0cmlwKCkucmVwbGFjZSgiICIsICIiKQogICAgcHJpbnQoIlxuLS0tRm9sZGVyIE5hbWU9e2Z9LS0tXG4iLmZvcm1hdChmPWZvbGRlck5hbWUpKQogICAgZm9sZGVyTmFtZSA9IHJlbW92ZU51bShmb2xkZXJOYW1lKQogICAgZm9sZGVyTmFtZSA9IHJlLnN1YignXCB8KHwpfFw/fFwufFwhfFwvfFw7fFw6JywgJycsIGZvbGRlck5hbWUpCgoKZGVmIHdoYXRJc0ZpbGVOYW1lKCk6CiAgICBmaWxlTmFtZSA9IHB5cGVyY2xpcC5wYXN0ZSgpLnN0cmlwKCkucmVwbGFjZSgiICIsICIiKQogICAgZmlsZU5hbWUgPSByZS5zdWIoJ1swLTldfCB8XHwgKHwpfFw/fFwufFwhfFwvfFw7fFw6JywgJycsIGZpbGVOYW1lKQogICAgcHJpbnQoIlxuLS0tRmlsZSBOYW1lPXtmfS0tLVxuIi5mb3JtYXQoZj1maWxlTmFtZSkpCiAgICByZXR1cm4gZmlsZU5hbWUKCgpkZWYgeW91dHViZURvd25sb2FkUHJvY2VzcygpOgogICAgZ2xvYmFsIGZpbGVDb3VudCwgZm9sZGVyTmFtZQogICAgY2xpY2tZb3V0dWJlQnV0dG9uKCkKICAgIGNyZWF0ZUxvZyhzdHIoZmlsZUNvdW50KSArICIgLiBZb3V0dWJlIEZpbGUgQ3JlYXRlZFxuIikKICAgICMgcHJpbnQoIk1vdmUgRmlsZXMgQ2FsbGVkIikKICAgICMgbW92ZUZpbGVzKGZvbGRlck5hbWUpCiAgICB0aW1lLnNsZWVwKDIpCgoKZGVmIGthemFtUmVjb3JkUHJvY2VzcyhmaWxlTmFtZSk6CiAgICBnbG9iYWwgZm9sZGVyTmFtZSwgZmlsZUNvdW50CgogICAgc2V0X2R1cmF0aW9uKCkKICAgIHRpbWUuc2xlZXAoMikKICAgIHZpZGVvVGltZSA9IGdldF90aW1lKCkgLSAzCiAgICBwcmludCgKICAgICAgICAiXG4tLS0tLS1TbGVlcGluZyBGb3IgLS0tLT0ge2R9XG4iLmZvcm1hdChkPXZpZGVvVGltZSkpCgogICAgYXNrTWVUb01heGltaXNlTWluaW1pc2UoKQogICAgdGltZS5zbGVlcCgxKQoKICAgICMgb3BlbkthemFtKCkKICAgIHN0YXJ0S2F6YW0oKQoKICAgIHRpbWUuc2xlZXAoMSkKICAgIFBsYXlWaWRlbygpCgogICAgdGltZS5zbGVlcCh2aWRlb1RpbWUpICAjIHZpZGVvVGltZQoKICAgIHN0b3BLYXphbSgpCiAgICB0aW1lLnNsZWVwKDIpCgogICAgcmVuYW1lRmlsZXMoZmlsZU5hbWUpCgogICAgbWVzc2FnZSA9IChzdHIoZmlsZUNvdW50KSArICcgLiAnICsKICAgICAgICAgICAgICAgc3RyKGZpbGVOYW1lKSArICcgY3JlYXRlZFxuJykKICAgIGNyZWF0ZUxvZyhtZXNzYWdlKQoKICAgIGFza01lVG9NYXhpbWlzZU1pbmltaXNlKCkKCiAgICBtb3ZlRmlsZXMoZm9sZGVyTmFtZSkKCgpkZWYgcmVsb2NhdGVDdXJzb3IoKToKICAgIGdsb2JhbCBpLCBhLCBiLCB4LCB5CiAgICB0ZW1wID0gIiIKICAgIGlmIGkgPiAwOgogICAgICAgIGNsb3NlKGEsIGIpCiAgICAgICAgbW92ZUZpbGVzKHRlbXApCiAgICAgICAgIyB0aW1lLnNsZWVwKDEpCiAgICAgICAgaSA9IDAKICAgICAgICB5ID0gYiArIDQwCiAgICBpZihpID09IDApOgogICAgICAgIGEgPSB4CiAgICAgICAgYiA9IHkKICAgICAgICBpbmNyZWFzZXkoKQogICAgaSA9IGkgKyAxCgoKZGVmIGNoZWNrRmlsZVByZXNlbnQobmFtZSk6CiAgICBwYXRoViA9ICIvaG9tZS9hc2hpc2gvRGVza3RvcC9Gb2xkZXJfTmFtZS8iICsgbmFtZSArIi5tcDQiCiAgICByZXR1cm4gb3MucGF0aC5pc2ZpbGUocGF0aFYpCgoKZGVmIG1haW4oKToKICAgIGdsb2JhbCBpCiAgICBnbG9iYWwgeSwgeCwgZm9sZGVyTmFtZSwgYSwgYiwgdmFyLCBmaWxlQ291bnQKICAgIHdoaWxlKHkgPD0gMTA4MCk6CiAgICAgICAgaWYgKGNoZWNrVGl0bGVPckZpbGUoeCwgeSkgPT0gMCk6CiAgICAgICAgICAgICMgcHJpbnQoIlxuLS0tLS0tLS0tLS0gQ3JlYXRpbmcgRm9sZGVyLS0tLS0tLS0tLS1cbiIpCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBjb3B5Rm9sZGVybmFtZSgpCiAgICAgICAgICAgICMgd2hhdElzRm9sZGVyTmFtZSgpCiAgICAgICAgICAgICMgY3JlYXRlRm9sZGVyKGZvbGRlck5hbWUpCiAgICAgICAgICAgIHJlbG9jYXRlQ3Vyc29yKCkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBGSWxlIENvdW50ZXIKICAgICAgICAgICAgZmlsZUNvdW50ICs9IDEKCiAgICAgICAgICAgICMgcHJpbnQoIlxuLS0tLS0tLS0tLS0gQ3JlYXRpbmcgRmlsZS0tLS0tLS0tLS0tXG4iKQoKICAgICAgICAgICAgcHlhdXRvZ3VpLmNsaWNrKHgsIHksIGR1cmF0aW9uPTAuMjUpCiAgICAgICAgICAgICMgd2FpdGluZyB0byBsb2FkIHZpZGVvCiAgICAgICAgICAgIHRpbWUuc2xlZXAoNCkKCiAgICAgICAgICAgIGlmIGNoZWNrWW91dHViZUJ1dHRvbigpOgogICAgICAgICAgICAgICAgIyBwcmludCgiWW91dHViZSBGaWxlIikKICAgICAgICAgICAgICAgICMgeW91dHViZURvd25sb2FkUHJvY2VzcygpCiAgICAgICAgICAgICAgICBpbmNyZWFzZXkoKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBDaGVja1BsYXlQYXVzZSgpCgogICAgICAgICAgICAgICAgIyBDb3B5IEZpbGUgTmFtZQogICAgICAgICAgICAgICAgY29weUZpbGVuYW1lKCkKICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gd2hhdElzRmlsZU5hbWUoKQoKICAgICAgICAgICAgICAgIGlmIGNoZWNrRmlsZVByZXNlbnQoZmlsZU5hbWUpID09IFRydWU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGthemFtUmVjb3JkUHJvY2VzcyhmaWxlTmFtZSkKICAgICAgICAgICAgICAgIGluY3JlYXNleSgpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRpbWUuc2xlZXAoNSkKICAgIG1haW4oKQoKICAgICMgZmlsZU5hbWUgPSByZW1vdmVOdW0oZmlsZU5hbWUp