├── Dockerfile ├── README.md ├── index.js ├── package.json ├── python ├── app.py └── start.sh └── start.sh /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | 3 | WORKDIR /app 4 | 5 | COPY . . 6 | 7 | EXPOSE 3000 8 | 9 | RUN apk update && apk upgrade &&\ 10 | apk add --no-cache openssl curl gcompat iproute2 coreutils &&\ 11 | apk add --no-cache bash gawk &&\ 12 | chmod +x index.js start.sh &&\ 13 | npm install 14 | 15 | CMD ["node", "index.js"] 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | node环境安装reality节点,容器或玩具支持,集成哪吒探针,支持vps无交互一键部署 2 | 3 | * PaaS 平台设置的环境变量 4 | | 变量名 | 是否必须 | 默认值 | 备注 | 5 | | ------------ | ------ | ------ | ------ | 6 | | PORT | 否 | 7860 |reality端口 | 7 | | HTTP_PORT | 否 | 3000 |http服务端口 | 8 | | UUID | 否 | 1f685446-c968-49f0-9fe1-25847585b0b7 | UUID | 9 | | NEZHA_SERVER | 否 | | 哪吒服务端域名,例如nz.aaa.com | 10 | | NEZHA_PORT | 否 | 5555 | 哪吒端口为{443,8443,2096,2087,2083,2053}其中之一时,开启tls| 11 | | NEZHA_KEY | 否 | | 哪吒客户端专用KEY | 12 | | SNI | 否 | www.yahoo.com |节点伪装域名| 13 | 14 | 15 | VPS一键运行命令,无交互,默认随机端口,如需自定义端口,在下方命令开头加上PORT=8880类似的变量,和bash之间留一个空格运行即可 16 | ``` 17 | bash -c "$(curl -L https://raw.githubusercontent.com/eooce/scripts/master/test.sh)" 18 | ``` 19 | 20 | 自定义哪吒,端口一键安装示列命令 21 | ``` 22 | NEZHA_SERVER=nz.abcd.com NEZHA_PORT=5555 NEZHA_KEY=1234abcd PORT=5678 bash -c "$(curl -L https://raw.githubusercontent.com/eooce/scripts/master/test.sh)" 23 | ``` 24 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const http = require('http'); 2 | const fs = require('fs'); 3 | const exec = require("child_process").exec; 4 | const subtxt = './app/url.txt' 5 | const HTTP_PORT = process.env.HTTP_PORT || 3000; 6 | 7 | // Run start.sh 8 | fs.chmod("start.sh", 0o777, (err) => { 9 | if (err) { 10 | console.error(`start.sh empowerment failed: ${err}`); 11 | return; 12 | } 13 | console.log(`start.sh empowerment successful`); 14 | const child = exec('bash start.sh'); 15 | child.stdout.on('data', (data) => { 16 | console.log(data); 17 | }); 18 | child.stderr.on('data', (data) => { 19 | console.error(data); 20 | }); 21 | child.on('close', (code) => { 22 | console.log(`child process exited with code ${code}`); 23 | console.clear() 24 | console.log(`App is running`); 25 | }); 26 | }); 27 | 28 | // create HTTP server 29 | const server = http.createServer((req, res) => { 30 | if (req.url === '/') { 31 | res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); 32 | res.end('Hello world!'); 33 | } 34 | // get-sub 35 | if (req.url === '/sub') { 36 | fs.readFile(subtxt, 'utf8', (err, data) => { 37 | if (err) { 38 | console.error(err); 39 | res.writeHead(500, { 'Content-Type': 'application/json' }); 40 | res.end(JSON.stringify({ error: 'Error reading url.txt' })); 41 | } else { 42 | res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); 43 | res.end(data); 44 | } 45 | }); 46 | } 47 | }); 48 | 49 | server.listen(HTTP_PORT, () => { 50 | console.log(`Server is running on port ${HTTP_PORT}`); 51 | }); 52 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-reality", 3 | "version": "1.0.0", 4 | "description": "nodejs", 5 | "main": "index.js", 6 | "author": "eooce", 7 | "license": "MIT", 8 | "private": false, 9 | "scripts": { 10 | "start": "node index.js" 11 | }, 12 | "engines": { 13 | "node": ">=14" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /python/app.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import subprocess 4 | import http.server 5 | import socketserver 6 | import threading 7 | 8 | PORT = int(os.environ.get('PORT') or 3000) 9 | 10 | class MyHandler(http.server.SimpleHTTPRequestHandler): 11 | 12 | def log_message(self, format, *args): 13 | pass 14 | 15 | def do_GET(self): 16 | if self.path == '/': 17 | self.send_response(200) 18 | self.end_headers() 19 | self.wfile.write(b'Hello, world') 20 | elif self.path == '/sub': 21 | try: 22 | with open("./.cache/sub.txt", 'rb') as file: 23 | content = file.read() 24 | self.send_response(200) 25 | self.send_header('Content-Type', 'text/plain; charset=utf-8') 26 | self.end_headers() 27 | self.wfile.write(content) 28 | except FileNotFoundError: 29 | self.send_response(500) 30 | self.end_headers() 31 | self.wfile.write(b'Error reading file') 32 | else: 33 | self.send_response(404) 34 | self.end_headers() 35 | self.wfile.write(b'Not found') 36 | httpd = socketserver.TCPServer(('', PORT), MyHandler) 37 | server_thread = threading.Thread(target=httpd.serve_forever) 38 | server_thread.daemon = True 39 | server_thread.start() 40 | 41 | shell_command = "chmod +x start.sh && ./start.sh" 42 | 43 | try: 44 | completed_process = subprocess.run(['bash', '-c', shell_command], stdout=sys.stdout, stderr=subprocess.PIPE, text=True, check=True) 45 | 46 | print("App is running") 47 | print("Thank you for using this script,enjoy!") 48 | 49 | except subprocess.CalledProcessError as e: 50 | print(f"Error: {e.returncode}") 51 | print("Standard Output:") 52 | print(e.stdout) 53 | print("Standard Error:") 54 | print(e.stderr) 55 | sys.exit(1) 56 | 57 | server_thread.join() 58 | -------------------------------------------------------------------------------- /python/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export UUID=${UUID:-'f6bf5ff2-023f-4c00-a572-22bbebae4fbc'} 3 | export SERVER_PORT="${SERVER_PORT:-${PORT:-7860}}" 4 | export NEZHA_SERVER=${NEZHA_SERVER:-'nz.abc.cn'} 5 | export NEZHA_PORT=${NEZHA_PORT:-'5555'} 6 | export NEZHA_KEY=${NEZHA_KEY:-''} 7 | export SNI=${SNI:-'www.yahoo.com'} 8 | export FILE_PATH=${FILE_PATH:-'./.cache'} # 节点路径 9 | 10 | echo "QVJDSD0kKHVuYW1lIC1tKSAmJiBET1dOTE9BRF9ESVI9IiR7RklMRV9QQVRIfSIgJiYgbWtkaXIgLXAgIiRET1dOTE9BRF9ESVIiICYmIEZJTEVfSU5GTz0oKQppZiBbICIkQVJDSCIgPT0gImFybSIgXSB8fCBbICIkQVJDSCIgPT0gImFybTY0IiBdIHx8IFsgIiRBUkNIIiA9PSAiYWFyY2g2NCIgXTsgdGhlbgogICAgRklMRV9JTkZPPSgiaHR0cHM6Ly9naXRodWIuY29tL2Vvb2NlL3Rlc3QvcmVsZWFzZXMvZG93bmxvYWQvYXJtNjQveHJheSB3ZWIiICJodHRwczovL2dpdGh1Yi5jb20vZW9vY2UvdGVzdC9yZWxlYXNlcy9kb3dubG9hZC9BUk0vc3dpdGggbnBtIikKZWxpZiBbICIkQVJDSCIgPT0gImFtZDY0IiBdIHx8IFsgIiRBUkNIIiA9PSAieDg2XzY0IiBdIHx8IFsgIiRBUkNIIiA9PSAieDg2IiBdOyB0aGVuCiAgICBGSUxFX0lORk89KCJodHRwczovL2dpdGh1Yi5jb20vZW9vY2UvdGVzdC9yZWxlYXNlcy9kb3dubG9hZC9hbWQ2NC94cmF5IHdlYiIgImh0dHBzOi8vZ2l0aHViLmNvbS9lb29jZS90ZXN0L3JlbGVhc2VzL2Rvd25sb2FkL2J1bGlkL3N3aXRoIG5wbSIpCmVsc2UKICAgIGVjaG8gIlVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZTogJEFSQ0giCiAgICBleGl0IDEKZmkKZm9yIGVudHJ5IGluICIke0ZJTEVfSU5GT1tAXX0iOyBkbwogICAgVVJMPSQoZWNobyAiJGVudHJ5IiB8IGN1dCAtZCAnICcgLWYgMSkKICAgIE5FV19GSUxFTkFNRT0kKGVjaG8gIiRlbnRyeSIgfCBjdXQgLWQgJyAnIC1mIDIpCiAgICBGSUxFTkFNRT0iJERPV05MT0FEX0RJUi8kTkVXX0ZJTEVOQU1FIgogICAgaWYgWyAtZSAiJEZJTEVOQU1FIiBdOyB0aGVuCiAgICAgICAgZWNobyAtZSAiXGVbMTszMm0kRklMRU5BTUUgYWxyZWFkeSBleGlzdHMsU2tpcHBpbmcgZG93bmxvYWRcZVswbSIKICAgIGVsc2UKICAgICAgICBjdXJsIC1MIC1zUyAtbyAiJEZJTEVOQU1FIiAiJFVSTCIKICAgICAgICBlY2hvIC1lICJcZVsxOzMybURvd25sb2FkaW5nICRGSUxFTkFNRVxlWzBtIgogICAgZmkKICAgIGNobW9kICt4ICRGSUxFTkFNRQpkb25lCndhaXQKCiMgR2VuZXJhdGluZyBDb25maWd1cmF0aW9uIEZpbGVzCmdlbmVyYXRlX2NvbmZpZygpIHsKCiAgICBYMjU1MTlLZXk9JCguLyIke0ZJTEVfUEFUSH0vd2ViIiB4MjU1MTkpCiAgICBQcml2YXRlS2V5PSQoZWNobyAiJHtYMjU1MTlLZXl9IiB8IGhlYWQgLTEgfCBhd2sgJ3twcmludCAkM30nKQogICAgUHVibGljS2V5PSQoZWNobyAiJHtYMjU1MTlLZXl9IiB8IHRhaWwgLW4gMSB8IGF3ayAne3ByaW50ICQzfScpCiAgICBzaG9ydGlkPSQob3BlbnNzbCByYW5kIC1oZXggOCkKCiAgY2F0ID4gJHtGSUxFX1BBVEh9L2NvbmZpZy5qc29uIDw8IEVPRgp7CiAgICAiaW5ib3VuZHMiOiBbCiAgICAgICAgewogICAgICAgICAgICAicG9ydCI6ICRTRVJWRVJfUE9SVCwKICAgICAgICAgICAgInByb3RvY29sIjogInZsZXNzIiwKICAgICAgICAgICAgInNldHRpbmdzIjogewogICAgICAgICAgICAgICAgImNsaWVudHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAiJFVVSUQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmxvdyI6ICJ4dGxzLXJwcngtdmlzaW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGVjcnlwdGlvbiI6ICJub25lIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3RyZWFtU2V0dGluZ3MiOiB7CiAgICAgICAgICAgICAgICAibmV0d29yayI6ICJ0Y3AiLAogICAgICAgICAgICAgICAgInNlY3VyaXR5IjogInJlYWxpdHkiLAogICAgICAgICAgICAgICAgInJlYWxpdHlTZXR0aW5ncyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hvdyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJkZXN0IjogIjEuMS4xLjE6NDQzIiwKICAgICAgICAgICAgICAgICAgICAieHZlciI6IDAsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlck5hbWVzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAiJFNOSSIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJwcml2YXRlS2V5IjogIiRQcml2YXRlS2V5IiwKICAgICAgICAgICAgICAgICAgICAibWluQ2xpZW50VmVyIjogIiIsCiAgICAgICAgICAgICAgICAgICAgIm1heENsaWVudFZlciI6ICIiLAogICAgICAgICAgICAgICAgICAgICJtYXhUaW1lRGlmZiI6IDAsCiAgICAgICAgICAgICAgICAgICAgInNob3J0SWRzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAiJHNob3J0aWQiCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgXSwKICAgICJvdXRib3VuZHMiOiBbCiAgICAgICAgewogICAgICAgICAgICAicHJvdG9jb2wiOiAiZnJlZWRvbSIsCiAgICAgICAgICAgICJ0YWciOiAiZGlyZWN0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAicHJvdG9jb2wiOiAiYmxhY2tob2xlIiwKICAgICAgICAgICAgInRhZyI6ICJibG9ja2VkIgogICAgICAgIH0KICAgIF0gICAgCn0KRU9GCn0KZ2VuZXJhdGVfY29uZmlnCgojIHJ1bm5pbmcgZmlsZXMKcnVuKCkgewogIGlmIFsgLWUgIiR7RklMRV9QQVRIfS9ucG0iIF07IHRoZW4KICAgIGNobW9kIDc3NyAiJHtGSUxFX1BBVEh9L25wbSIKICAgIHRsc1BvcnRzPSgiNDQzIiAiODQ0MyIgIjIwOTYiICIyMDg3IiAiMjA4MyIgIjIwNTMiKQogICAgaWYgW1sgIiR7dGxzUG9ydHNbKl19IiA9fiAiJHtORVpIQV9QT1JUfSIgXV07IHRoZW4KICAgICAgTkVaSEFfVExTPSItLXRscyIKICAgIGVsc2UKICAgICAgTkVaSEFfVExTPSIiCiAgICBmaQogICAgaWYgWyAtbiAiJE5FWkhBX1NFUlZFUiIgXSAmJiBbIC1uICIkTkVaSEFfUE9SVCIgXSAmJiBbIC1uICIkTkVaSEFfS0VZIiBdOyB0aGVuCiAgICAgICAgbm9odXAgJHtGSUxFX1BBVEh9L25wbSAtcyAke05FWkhBX1NFUlZFUn06JHtORVpIQV9QT1JUfSAtcCAke05FWkhBX0tFWX0gJHtORVpIQV9UTFN9ID4vZGV2L251bGwgMj4mMSAmCgkgICAgIHNsZWVwIDEKICAgICAgIGVjaG8gLWUgIlxlWzE7MzJtbnBtIGlzIHJ1bm5pbmdcZVswbSIKICAgIGVsc2UKICAgICAgICBlY2hvIC1lICJcZVsxOzM1bU5FWkhBIHZhcmlhYmxlIGlzIGVtcHR5LHNraXBpbmcgcnVuaW5nXGVbMG0iCiAgICBmaQogIGZpCgogIGlmIFsgLWUgIiR7RklMRV9QQVRIfS93ZWIiIF07IHRoZW4KICAgIGNobW9kIDc3NyAiJHtGSUxFX1BBVEh9L3dlYiIKICAgIG5vaHVwICR7RklMRV9QQVRIfS93ZWIgLWMgJHtGSUxFX1BBVEh9L2NvbmZpZy5qc29uID4vZGV2L251bGwgMj4mMSAmCiAgICBzbGVlcCAxCiAgICBlY2hvIC1lICJcZVsxOzMybXdlYiBpcyBydW5uaW5nXGVbMG0iCiAgZmkKCn0KcnVuCgojIGdldCBpcApJUD0kKGN1cmwgLXMgaHR0cHM6Ly9pcHY0LmljYW5oYXppcC5jb20pCgojIGdldCBpcGluZm8KSVNQPSQoY3VybCAtcyBodHRwczovL3NwZWVkLmNsb3VkZmxhcmUuY29tL21ldGEgfCBhd2sgLUZcIiAne3ByaW50ICQyNiItIiQxOH0nIHwgc2VkIC1lICdzLyAvXy9nJykKCmNhdCA+ICR7RklMRV9QQVRIfS9saXN0LnR4dCA8PEVPRgoKdmxlc3M6Ly8ke1VVSUR9QCR7SVB9OiR7U0VSVkVSX1BPUlR9P2VuY3J5cHRpb249bm9uZSZmbG93PXh0bHMtcnByeC12aXNpb24mc2VjdXJpdHk9cmVhbGl0eSZzbmk9JHtTTkl9JmZwPWNocm9tZSZwYms9JHtQdWJsaWNLZXl9JnNpZD0ke3Nob3J0aWR9JnR5cGU9dGNwJmhlYWRlclR5cGU9bm9uZSMkSVNQCgpFT0YKYmFzZTY0IC13MCAke0ZJTEVfUEFUSH0vbGlzdC50eHQgPiAke0ZJTEVfUEFUSH0vdXJsLnR4dApjYXQgJHtGSUxFX1BBVEh9L3VybC50eHQKZWNobyAtZSAiXG5cZVsxOzMybSR7RklMRV9QQVRIfS91cmwudHh0IHNhdmVkIHN1Y2Nlc3NmdWxseVxlWzBtIgpybSAtcmYgJHtGSUxFX1BBVEh9L2xpc3QudHh0ICR7RklMRV9QQVRIfS9ucG0gJHtGSUxFX1BBVEh9L3dlYgplY2hvICIiCnNsZWVwIDgKY2xlYXIKZWNobyAtZSAiXG5cZVsxOzMybUluc3RhbGwgc3VjY2VzcyFcZVswbSIKCmV4aXQgMA==" | base64 -d | bash 11 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export UUID=${UUID:-'f6bf5ff2-023f-4c00-a572-22bbebae4fbc'} 3 | export SERVER_PORT="${SERVER_PORT:-${PORT:-7860}}" 4 | export NEZHA_SERVER=${NEZHA_SERVER:-'nz.abc.cn'} 5 | export NEZHA_PORT=${NEZHA_PORT:-'5555'} 6 | export NEZHA_KEY=${NEZHA_KEY:-''} 7 | export SNI=${SNI:-'www.yahoo.com'} 8 | export FILE_PATH=${FILE_PATH:-'./.npm'} # 节点路径 9 | 10 | echo "QVJDSD0kKHVuYW1lIC1tKSAmJiBET1dOTE9BRF9ESVI9IiR7RklMRV9QQVRIfSIgJiYgbWtkaXIgLXAgIiRET1dOTE9BRF9ESVIiICYmIEZJTEVfSU5GTz0oKQppZiBbICIkQVJDSCIgPT0gImFybSIgXSB8fCBbICIkQVJDSCIgPT0gImFybTY0IiBdIHx8IFsgIiRBUkNIIiA9PSAiYWFyY2g2NCIgXTsgdGhlbgogICAgRklMRV9JTkZPPSgiaHR0cHM6Ly9naXRodWIuY29tL2Vvb2NlL3Rlc3QvcmVsZWFzZXMvZG93bmxvYWQvYXJtNjQveHJheSB3ZWIiICJodHRwczovL2dpdGh1Yi5jb20vZW9vY2UvdGVzdC9yZWxlYXNlcy9kb3dubG9hZC9BUk0vc3dpdGggbnBtIikKZWxpZiBbICIkQVJDSCIgPT0gImFtZDY0IiBdIHx8IFsgIiRBUkNIIiA9PSAieDg2XzY0IiBdIHx8IFsgIiRBUkNIIiA9PSAieDg2IiBdOyB0aGVuCiAgICBGSUxFX0lORk89KCJodHRwczovL2dpdGh1Yi5jb20vZW9vY2UvdGVzdC9yZWxlYXNlcy9kb3dubG9hZC9hbWQ2NC94cmF5IHdlYiIgImh0dHBzOi8vZ2l0aHViLmNvbS9lb29jZS90ZXN0L3JlbGVhc2VzL2Rvd25sb2FkL2J1bGlkL3N3aXRoIG5wbSIpCmVsc2UKICAgIGVjaG8gIlVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZTogJEFSQ0giCiAgICBleGl0IDEKZmkKZm9yIGVudHJ5IGluICIke0ZJTEVfSU5GT1tAXX0iOyBkbwogICAgVVJMPSQoZWNobyAiJGVudHJ5IiB8IGN1dCAtZCAnICcgLWYgMSkKICAgIE5FV19GSUxFTkFNRT0kKGVjaG8gIiRlbnRyeSIgfCBjdXQgLWQgJyAnIC1mIDIpCiAgICBGSUxFTkFNRT0iJERPV05MT0FEX0RJUi8kTkVXX0ZJTEVOQU1FIgogICAgaWYgWyAtZSAiJEZJTEVOQU1FIiBdOyB0aGVuCiAgICAgICAgZWNobyAtZSAiXGVbMTszMm0kRklMRU5BTUUgYWxyZWFkeSBleGlzdHMsU2tpcHBpbmcgZG93bmxvYWRcZVswbSIKICAgIGVsc2UKICAgICAgICBjdXJsIC1MIC1zUyAtbyAiJEZJTEVOQU1FIiAiJFVSTCIKICAgICAgICBlY2hvIC1lICJcZVsxOzMybURvd25sb2FkaW5nICRGSUxFTkFNRVxlWzBtIgogICAgZmkKICAgIGNobW9kICt4ICRGSUxFTkFNRQpkb25lCndhaXQKCiMgR2VuZXJhdGluZyBDb25maWd1cmF0aW9uIEZpbGVzCmdlbmVyYXRlX2NvbmZpZygpIHsKCiAgICBYMjU1MTlLZXk9JCguLyIke0ZJTEVfUEFUSH0vd2ViIiB4MjU1MTkpCiAgICBQcml2YXRlS2V5PSQoZWNobyAiJHtYMjU1MTlLZXl9IiB8IGhlYWQgLTEgfCBhd2sgJ3twcmludCAkM30nKQogICAgUHVibGljS2V5PSQoZWNobyAiJHtYMjU1MTlLZXl9IiB8IHRhaWwgLW4gMSB8IGF3ayAne3ByaW50ICQzfScpCiAgICBzaG9ydGlkPSQob3BlbnNzbCByYW5kIC1oZXggOCkKCiAgY2F0ID4gJHtGSUxFX1BBVEh9L2NvbmZpZy5qc29uIDw8IEVPRgp7CiAgICAiaW5ib3VuZHMiOiBbCiAgICAgICAgewogICAgICAgICAgICAicG9ydCI6ICRTRVJWRVJfUE9SVCwKICAgICAgICAgICAgInByb3RvY29sIjogInZsZXNzIiwKICAgICAgICAgICAgInNldHRpbmdzIjogewogICAgICAgICAgICAgICAgImNsaWVudHMiOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiAiJFVVSUQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZmxvdyI6ICJ4dGxzLXJwcngtdmlzaW9uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAiZGVjcnlwdGlvbiI6ICJub25lIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3RyZWFtU2V0dGluZ3MiOiB7CiAgICAgICAgICAgICAgICAibmV0d29yayI6ICJ0Y3AiLAogICAgICAgICAgICAgICAgInNlY3VyaXR5IjogInJlYWxpdHkiLAogICAgICAgICAgICAgICAgInJlYWxpdHlTZXR0aW5ncyI6IHsKICAgICAgICAgICAgICAgICAgICAic2hvdyI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJkZXN0IjogIjEuMS4xLjE6NDQzIiwKICAgICAgICAgICAgICAgICAgICAieHZlciI6IDAsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlck5hbWVzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAiJFNOSSIKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICJwcml2YXRlS2V5IjogIiRQcml2YXRlS2V5IiwKICAgICAgICAgICAgICAgICAgICAibWluQ2xpZW50VmVyIjogIiIsCiAgICAgICAgICAgICAgICAgICAgIm1heENsaWVudFZlciI6ICIiLAogICAgICAgICAgICAgICAgICAgICJtYXhUaW1lRGlmZiI6IDAsCiAgICAgICAgICAgICAgICAgICAgInNob3J0SWRzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAiJHNob3J0aWQiCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgXSwKICAgICJvdXRib3VuZHMiOiBbCiAgICAgICAgewogICAgICAgICAgICAicHJvdG9jb2wiOiAiZnJlZWRvbSIsCiAgICAgICAgICAgICJ0YWciOiAiZGlyZWN0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAicHJvdG9jb2wiOiAiYmxhY2tob2xlIiwKICAgICAgICAgICAgInRhZyI6ICJibG9ja2VkIgogICAgICAgIH0KICAgIF0gICAgCn0KRU9GCn0KZ2VuZXJhdGVfY29uZmlnCgojIHJ1bm5pbmcgZmlsZXMKcnVuKCkgewogIGlmIFsgLWUgIiR7RklMRV9QQVRIfS9ucG0iIF07IHRoZW4KICAgIGNobW9kIDc3NyAiJHtGSUxFX1BBVEh9L25wbSIKICAgIHRsc1BvcnRzPSgiNDQzIiAiODQ0MyIgIjIwOTYiICIyMDg3IiAiMjA4MyIgIjIwNTMiKQogICAgaWYgW1sgIiR7dGxzUG9ydHNbKl19IiA9fiAiJHtORVpIQV9QT1JUfSIgXV07IHRoZW4KICAgICAgTkVaSEFfVExTPSItLXRscyIKICAgIGVsc2UKICAgICAgTkVaSEFfVExTPSIiCiAgICBmaQogICAgaWYgWyAtbiAiJE5FWkhBX1NFUlZFUiIgXSAmJiBbIC1uICIkTkVaSEFfUE9SVCIgXSAmJiBbIC1uICIkTkVaSEFfS0VZIiBdOyB0aGVuCiAgICAgICAgbm9odXAgJHtGSUxFX1BBVEh9L25wbSAtcyAke05FWkhBX1NFUlZFUn06JHtORVpIQV9QT1JUfSAtcCAke05FWkhBX0tFWX0gJHtORVpIQV9UTFN9ID4vZGV2L251bGwgMj4mMSAmCgkgICAgIHNsZWVwIDEKICAgICAgIGVjaG8gLWUgIlxlWzE7MzJtbnBtIGlzIHJ1bm5pbmdcZVswbSIKICAgIGVsc2UKICAgICAgICBlY2hvIC1lICJcZVsxOzM1bU5FWkhBIHZhcmlhYmxlIGlzIGVtcHR5LHNraXBpbmcgcnVuaW5nXGVbMG0iCiAgICBmaQogIGZpCgogIGlmIFsgLWUgIiR7RklMRV9QQVRIfS93ZWIiIF07IHRoZW4KICAgIGNobW9kIDc3NyAiJHtGSUxFX1BBVEh9L3dlYiIKICAgIG5vaHVwICR7RklMRV9QQVRIfS93ZWIgLWMgJHtGSUxFX1BBVEh9L2NvbmZpZy5qc29uID4vZGV2L251bGwgMj4mMSAmCiAgICBzbGVlcCAxCiAgICBlY2hvIC1lICJcZVsxOzMybXdlYiBpcyBydW5uaW5nXGVbMG0iCiAgZmkKCn0KcnVuCgojIGdldCBpcApJUD0kKGN1cmwgLXMgaHR0cHM6Ly9pcHY0LmljYW5oYXppcC5jb20pCgojIGdldCBpcGluZm8KSVNQPSQoY3VybCAtcyBodHRwczovL3NwZWVkLmNsb3VkZmxhcmUuY29tL21ldGEgfCBhd2sgLUZcIiAne3ByaW50ICQyNiItIiQxOH0nIHwgc2VkIC1lICdzLyAvXy9nJykKCmNhdCA+ICR7RklMRV9QQVRIfS9saXN0LnR4dCA8PEVPRgoKdmxlc3M6Ly8ke1VVSUR9QCR7SVB9OiR7U0VSVkVSX1BPUlR9P2VuY3J5cHRpb249bm9uZSZmbG93PXh0bHMtcnByeC12aXNpb24mc2VjdXJpdHk9cmVhbGl0eSZzbmk9JHtTTkl9JmZwPWNocm9tZSZwYms9JHtQdWJsaWNLZXl9JnNpZD0ke3Nob3J0aWR9JnR5cGU9dGNwJmhlYWRlclR5cGU9bm9uZSMkSVNQCgpFT0YKYmFzZTY0IC13MCAke0ZJTEVfUEFUSH0vbGlzdC50eHQgPiAke0ZJTEVfUEFUSH0vdXJsLnR4dApjYXQgJHtGSUxFX1BBVEh9L3VybC50eHQKZWNobyAtZSAiXG5cZVsxOzMybSR7RklMRV9QQVRIfS91cmwudHh0IHNhdmVkIHN1Y2Nlc3NmdWxseVxlWzBtIgpybSAtcmYgJHtGSUxFX1BBVEh9L2xpc3QudHh0ICR7RklMRV9QQVRIfS9ucG0gJHtGSUxFX1BBVEh9L3dlYgplY2hvICIiCnNsZWVwIDgKY2xlYXIKZWNobyAtZSAiXG5cZVsxOzMybUluc3RhbGwgc3VjY2VzcyFcZVswbSIKCmV4aXQgMA==" | base64 -d | bash 11 | --------------------------------------------------------------------------------