"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_xlsx_xlsx_mjs"],{ /***/ "../../../node_modules/xlsx/xlsx.mjs": /*!*******************************************!*\ !*** ../../../node_modules/xlsx/xlsx.mjs ***! \*******************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CFB: () => (/* binding */ CFB), /* harmony export */ SSF: () => (/* binding */ SSF), /* harmony export */ parse_xlscfb: () => (/* binding */ parse_xlscfb), /* harmony export */ parse_zip: () => (/* binding */ parse_zip), /* harmony export */ read: () => (/* binding */ readSync), /* harmony export */ readFile: () => (/* binding */ readFileSync), /* harmony export */ readFileSync: () => (/* binding */ readFileSync), /* harmony export */ set_cptable: () => (/* binding */ set_cptable), /* harmony export */ set_fs: () => (/* binding */ set_fs), /* harmony export */ stream: () => (/* binding */ __stream), /* harmony export */ utils: () => (/* binding */ utils), /* harmony export */ version: () => (/* binding */ version), /* harmony export */ write: () => (/* binding */ writeSync), /* harmony export */ writeFile: () => (/* binding */ writeFileSync), /* harmony export */ writeFileAsync: () => (/* binding */ writeFileAsync), /* harmony export */ writeFileSync: () => (/* binding */ writeFileSync), /* harmony export */ writeFileXLSX: () => (/* binding */ writeFileSyncXLSX), /* harmony export */ writeXLSX: () => (/* binding */ writeSyncXLSX) /* harmony export */ }); /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ /* vim: set ts=2: */ /*exported XLSX */ /*global process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */ var XLSX = {}; XLSX.version = '0.18.5'; var current_codepage = 1200, current_ansi = 1252; var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ]; /* ECMA-376 Part I 18.4.1 charset to codepage mapping */ var CS2CP = ({ /*::[*/0/*::]*/: 1252, /* ANSI */ /*::[*/1/*::]*/: 65001, /* DEFAULT */ /*::[*/2/*::]*/: 65001, /* SYMBOL */ /*::[*/77/*::]*/: 10000, /* MAC */ /*::[*/128/*::]*/: 932, /* SHIFTJIS */ /*::[*/129/*::]*/: 949, /* HANGUL */ /*::[*/130/*::]*/: 1361, /* JOHAB */ /*::[*/134/*::]*/: 936, /* GB2312 */ /*::[*/136/*::]*/: 950, /* CHINESEBIG5 */ /*::[*/161/*::]*/: 1253, /* GREEK */ /*::[*/162/*::]*/: 1254, /* TURKISH */ /*::[*/163/*::]*/: 1258, /* VIETNAMESE */ /*::[*/177/*::]*/: 1255, /* HEBREW */ /*::[*/178/*::]*/: 1256, /* ARABIC */ /*::[*/186/*::]*/: 1257, /* BALTIC */ /*::[*/204/*::]*/: 1251, /* RUSSIAN */ /*::[*/222/*::]*/: 874, /* THAI */ /*::[*/238/*::]*/: 1250, /* EASTEUROPE */ /*::[*/255/*::]*/: 1252, /* OEM */ /*::[*/69/*::]*/: 6969 /* MISC */ }/*:any*/); var set_ansi = function(cp/*:number*/) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; }; function reset_ansi() { set_ansi(1252); } var set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); }; function reset_cp() { set_cp(1200); reset_ansi(); } function char_codes(data/*:string*/)/*:Array*/ { var o/*:Array*/ = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; } function utf16leread(data/*:string*/)/*:string*/ { var o/*:Array*/ = []; for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8)); return o.join(""); } function utf16beread(data/*:string*/)/*:string*/ { var o/*:Array*/ = []; for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8)); return o.join(""); } var debom = function(data/*:string*/)/*:string*/ { var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1); if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2)); if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2)); if(c1 == 0xFEFF) return data.slice(1); return data; }; var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); }; var $cptable; function set_cptable(cptable) { $cptable = cptable; set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); }; debom = function(data/*:string*/) { if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); } return data; }; _getchar = function _gc2(x/*:number*/)/*:string*/ { if(current_codepage === 1200) return String.fromCharCode(x); return $cptable.utils.decode(current_codepage, [x&255,x>>8])[0]; }; _getansi = function _ga2(x/*:number*/)/*:string*/ { return $cptable.utils.decode(current_ansi, [x])[0]; }; cpdoit(); } var DENSE = null; var DIF_XL = true; var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function Base64_encode(input) { var o = ""; var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; for (var i = 0; i < input.length; ) { c1 = input.charCodeAt(i++); e1 = c1 >> 2; c2 = input.charCodeAt(i++); e2 = (c1 & 3) << 4 | c2 >> 4; c3 = input.charCodeAt(i++); e3 = (c2 & 15) << 2 | c3 >> 6; e4 = c3 & 63; if (isNaN(c2)) { e3 = e4 = 64; } else if (isNaN(c3)) { e4 = 64; } o += Base64_map.charAt(e1) + Base64_map.charAt(e2) + Base64_map.charAt(e3) + Base64_map.charAt(e4); } return o; } function Base64_decode(input) { var o = ""; var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; input = input.replace(/[^\w\+\/\=]/g, ""); for (var i = 0; i < input.length; ) { e1 = Base64_map.indexOf(input.charAt(i++)); e2 = Base64_map.indexOf(input.charAt(i++)); c1 = e1 << 2 | e2 >> 4; o += String.fromCharCode(c1); e3 = Base64_map.indexOf(input.charAt(i++)); c2 = (e2 & 15) << 4 | e3 >> 2; if (e3 !== 64) { o += String.fromCharCode(c2); } e4 = Base64_map.indexOf(input.charAt(i++)); c3 = (e3 & 3) << 6 | e4; if (e4 !== 64) { o += String.fromCharCode(c3); } } return o; } var has_buf = /*#__PURE__*/(function() { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node; })(); var Buffer_from = /*#__PURE__*/(function() { if(typeof Buffer !== 'undefined') { var nbfs = !Buffer.from; if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; } return nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer); } return function() {}; })(); function new_raw_buf(len/*:number*/) { /* jshint -W056 */ if(has_buf) return Buffer.alloc ? Buffer.alloc(len) : new Buffer(len); return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len); /* jshint +W056 */ } function new_unsafe_buf(len/*:number*/) { /* jshint -W056 */ if(has_buf) return Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : new Buffer(len); return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len); /* jshint +W056 */ } var s2a = function s2a(s/*:string*/)/*:any*/ { if(has_buf) return Buffer_from(s, "binary"); return s.split("").map(function(x/*:string*/)/*:number*/{ return x.charCodeAt(0) & 0xff; }); }; function s2ab(s/*:string*/)/*:any*/ { if(typeof ArrayBuffer === 'undefined') return s2a(s); var buf = new ArrayBuffer(s.length), view = new Uint8Array(buf); for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } function a2s(data/*:any*/)/*:string*/ { if(Array.isArray(data)) return data.map(function(c) { return String.fromCharCode(c); }).join(""); var o/*:Array*/ = []; for(var i = 0; i < data.length; ++i) o[i] = String.fromCharCode(data[i]); return o.join(""); } function a2u(data/*:Array*/)/*:Uint8Array*/ { if(typeof Uint8Array === 'undefined') throw new Error("Unsupported"); return new Uint8Array(data); } function ab2a(data/*:ArrayBuffer|Uint8Array*/)/*:Array*/ { if(typeof ArrayBuffer == 'undefined') throw new Error("Unsupported"); if(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data)); /*:: if(data instanceof ArrayBuffer) throw new Error("unreachable"); */ var o = new Array(data.length); for(var i = 0; i < data.length; ++i) o[i] = data[i]; return o; } var bconcat = has_buf ? function(bufs) { return Buffer.concat(bufs.map(function(buf) { return Buffer.isBuffer(buf) ? buf : Buffer_from(buf); })); } : function(bufs) { if(typeof Uint8Array !== "undefined") { var i = 0, maxlen = 0; for(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length; var o = new Uint8Array(maxlen); var len = 0; for(i = 0, maxlen = 0; i < bufs.length; maxlen += len, ++i) { len = bufs[i].length; if(bufs[i] instanceof Uint8Array) o.set(bufs[i], maxlen); else if(typeof bufs[i] == "string") { throw "wtf"; } else o.set(new Uint8Array(bufs[i]), maxlen); } return o; } return [].concat.apply([], bufs.map(function(buf) { return Array.isArray(buf) ? buf : [].slice.call(buf); })); }; function utf8decode(content/*:string*/) { var out = [], widx = 0, L = content.length + 250; var o = new_raw_buf(content.length + 255); for(var ridx = 0; ridx < content.length; ++ridx) { var c = content.charCodeAt(ridx); if(c < 0x80) o[widx++] = c; else if(c < 0x800) { o[widx++] = (192|((c>>6)&31)); o[widx++] = (128|(c&63)); } else if(c >= 0xD800 && c < 0xE000) { c = (c&1023)+64; var d = content.charCodeAt(++ridx)&1023; o[widx++] = (240|((c>>8)&7)); o[widx++] = (128|((c>>2)&63)); o[widx++] = (128|((d>>6)&15)|((c&3)<<4)); o[widx++] = (128|(d&63)); } else { o[widx++] = (224|((c>>12)&15)); o[widx++] = (128|((c>>6)&63)); o[widx++] = (128|(c&63)); } if(widx > L) { out.push(o.slice(0, widx)); widx = 0; o = new_raw_buf(65535); L = 65530; } } out.push(o.slice(0, widx)); return bconcat(out); } var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g; /*:: declare type Block = any; declare type BufArray = { newblk(sz:number):Block; next(sz:number):Block; end():any; push(buf:Block):void; }; type RecordHopperCB = {(d:any, Rn:string, RT:number):?boolean;}; type EvertType = {[string]:string}; type EvertNumType = {[string]:number}; type EvertArrType = {[string]:Array}; type StringConv = {(string):string}; */ /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ /*jshint -W041 */ function _strrev(x/*:string*/)/*:string*/ { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; } function pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} function pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;} function rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);} function pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;} function pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} var p2_32 = /*#__PURE__*/Math.pow(2,32); function pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); } /* yes, in 2022 this is still faster than string compare */ function SSF_isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; } var days/*:Array >*/ = [ ['Sun', 'Sunday'], ['Mon', 'Monday'], ['Tue', 'Tuesday'], ['Wed', 'Wednesday'], ['Thu', 'Thursday'], ['Fri', 'Friday'], ['Sat', 'Saturday'] ]; var months/*:Array >*/ = [ ['J', 'Jan', 'January'], ['F', 'Feb', 'February'], ['M', 'Mar', 'March'], ['A', 'Apr', 'April'], ['M', 'May', 'May'], ['J', 'Jun', 'June'], ['J', 'Jul', 'July'], ['A', 'Aug', 'August'], ['S', 'Sep', 'September'], ['O', 'Oct', 'October'], ['N', 'Nov', 'November'], ['D', 'Dec', 'December'] ]; function SSF_init_table(t/*:any*/) { if(!t) t = {}; t[0]= 'General'; t[1]= '0'; t[2]= '0.00'; t[3]= '#,##0'; t[4]= '#,##0.00'; t[9]= '0%'; t[10]= '0.00%'; t[11]= '0.00E+00'; t[12]= '# ?/?'; t[13]= '# ??/??'; t[14]= 'm/d/yy'; t[15]= 'd-mmm-yy'; t[16]= 'd-mmm'; t[17]= 'mmm-yy'; t[18]= 'h:mm AM/PM'; t[19]= 'h:mm:ss AM/PM'; t[20]= 'h:mm'; t[21]= 'h:mm:ss'; t[22]= 'm/d/yy h:mm'; t[37]= '#,##0 ;(#,##0)'; t[38]= '#,##0 ;[Red](#,##0)'; t[39]= '#,##0.00;(#,##0.00)'; t[40]= '#,##0.00;[Red](#,##0.00)'; t[45]= 'mm:ss'; t[46]= '[h]:mm:ss'; t[47]= 'mmss.0'; t[48]= '##0.0E+0'; t[49]= '@'; t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "'; return t; } /* repeated to satiate webpack */ var table_fmt = { 0: 'General', 1: '0', 2: '0.00', 3: '#,##0', 4: '#,##0.00', 9: '0%', 10: '0.00%', 11: '0.00E+00', 12: '# ?/?', 13: '# ??/??', 14: 'm/d/yy', 15: 'd-mmm-yy', 16: 'd-mmm', 17: 'mmm-yy', 18: 'h:mm AM/PM', 19: 'h:mm:ss AM/PM', 20: 'h:mm', 21: 'h:mm:ss', 22: 'm/d/yy h:mm', 37: '#,##0 ;(#,##0)', 38: '#,##0 ;[Red](#,##0)', 39: '#,##0.00;(#,##0.00)', 40: '#,##0.00;[Red](#,##0.00)', 45: 'mm:ss', 46: '[h]:mm:ss', 47: 'mmss.0', 48: '##0.0E+0', 49: '@', 56: '"上午/下午 "hh"時"mm"分"ss"秒 "' }; /* Defaults determined by systematically testing in Excel 2019 */ /* These formats appear to default to other formats in the table */ var SSF_default_map = { 5: 37, 6: 38, 7: 39, 8: 40, // 5 -> 37 ... 8 -> 40 23: 0, 24: 0, 25: 0, 26: 0, // 23 -> 0 ... 26 -> 0 27: 14, 28: 14, 29: 14, 30: 14, 31: 14, // 27 -> 14 ... 31 -> 14 50: 14, 51: 14, 52: 14, 53: 14, 54: 14, // 50 -> 14 ... 58 -> 14 55: 14, 56: 14, 57: 14, 58: 14, 59: 1, 60: 2, 61: 3, 62: 4, // 59 -> 1 ... 62 -> 4 67: 9, 68: 10, // 67 -> 9 ... 68 -> 10 69: 12, 70: 13, 71: 14, // 69 -> 12 ... 71 -> 14 72: 14, 73: 15, 74: 16, 75: 17, // 72 -> 14 ... 75 -> 17 76: 20, 77: 21, 78: 22, // 76 -> 20 ... 78 -> 22 79: 45, 80: 46, 81: 47, // 79 -> 45 ... 81 -> 47 82: 0 // 82 -> 0 ... 65536 -> 0 (omitted) }; /* These formats technically refer to Accounting formats with no equivalent */ var SSF_default_str = { // 5 -- Currency, 0 decimal, black negative 5: '"$"#,##0_);\\("$"#,##0\\)', 63: '"$"#,##0_);\\("$"#,##0\\)', // 6 -- Currency, 0 decimal, red negative 6: '"$"#,##0_);[Red]\\("$"#,##0\\)', 64: '"$"#,##0_);[Red]\\("$"#,##0\\)', // 7 -- Currency, 2 decimal, black negative 7: '"$"#,##0.00_);\\("$"#,##0.00\\)', 65: '"$"#,##0.00_);\\("$"#,##0.00\\)', // 8 -- Currency, 2 decimal, red negative 8: '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)', 66: '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)', // 41 -- Accounting, 0 decimal, No Symbol 41: '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)', // 42 -- Accounting, 0 decimal, $ Symbol 42: '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)', // 43 -- Accounting, 2 decimal, No Symbol 43: '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)', // 44 -- Accounting, 2 decimal, $ Symbol 44: '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)' }; function SSF_frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array*/ { var sgn = x < 0 ? -1 : 1; var B = x * sgn; var P_2 = 0, P_1 = 1, P = 0; var Q_2 = 1, Q_1 = 0, Q = 0; var A = Math.floor(B); while(Q_1 < D) { A = Math.floor(B); P = A * P_1 + P_2; Q = A * Q_1 + Q_2; if((B - A) < 0.00000005) break; B = 1 / (B - A); P_2 = P_1; P_1 = P; Q_2 = Q_1; Q_1 = Q; } if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } } if(!mixed) return [0, sgn * P, Q]; var q = Math.floor(sgn * P/Q); return [q, sgn*P - q*Q, Q]; } function SSF_parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) { if(v > 2958465 || v < 0) return null; var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0; var dout=[]; var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0}; if(Math.abs(out.u) < 1e-6) out.u = 0; if(opts && opts.date1904) date += 1462; if(out.u > 0.9999) { out.u = 0; if(++time == 86400) { out.T = time = 0; ++date; ++out.D; } } if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;} else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;} else { if(date > 60) --date; /* 1 = Jan 1 1900 in Gregorian */ var d = new Date(1900, 0, 1); d.setDate(d.getDate() + date - 1); dout = [d.getFullYear(), d.getMonth()+1,d.getDate()]; dow = d.getDay(); if(date < 60) dow = (dow + 6) % 7; if(b2) dow = SSF_fix_hijri(d, dout); } out.y = dout[0]; out.m = dout[1]; out.d = dout[2]; out.S = time % 60; time = Math.floor(time / 60); out.M = time % 60; time = Math.floor(time / 60); out.H = time; out.q = dow; return out; } var SSFbasedate = /*#__PURE__*/new Date(1899, 11, 31, 0, 0, 0); var SSFdnthresh = /*#__PURE__*/SSFbasedate.getTime(); var SSFbase1904 = /*#__PURE__*/new Date(1900, 2, 1, 0, 0, 0); function datenum_local(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { var epoch = /*#__PURE__*/v.getTime(); if(date1904) epoch -= 1461*24*60*60*1000; else if(v >= SSFbase1904) epoch += 24*60*60*1000; return (epoch - (SSFdnthresh + (/*#__PURE__*/v.getTimezoneOffset() - /*#__PURE__*/SSFbasedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000); } /* ECMA-376 18.8.30 numFmt*/ /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */ /* exponent >= -9 and <= 9 */ function SSF_strip_decimal(o/*:string*/)/*:string*/ { return (o.indexOf(".") == -1) ? o : o.replace(/(?:\.0*|(\.\d*[1-9])0+)$/, "$1"); } /* General Exponential always shows 2 digits exp and trims the mantissa */ function SSF_normalize_exp(o/*:string*/)/*:string*/ { if(o.indexOf("E") == -1) return o; return o.replace(/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,"$1E").replace(/(E[+-])(\d)$/,"$10$2"); } /* exponent >= -9 and <= 9 */ function SSF_small_exp(v/*:number*/)/*:string*/ { var w = (v<0?12:11); var o = SSF_strip_decimal(v.toFixed(12)); if(o.length <= w) return o; o = v.toPrecision(10); if(o.length <= w) return o; return v.toExponential(5); } /* exponent >= 11 or <= -10 likely exponential */ function SSF_large_exp(v/*:number*/)/*:string*/ { var o = SSF_strip_decimal(v.toFixed(11)); return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o; } function SSF_general_num(v/*:number*/)/*:string*/ { var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o; if(V >= -4 && V <= -1) o = v.toPrecision(10+V); else if(Math.abs(V) <= 9) o = SSF_small_exp(v); else if(V === 10) o = v.toFixed(10).substr(0,12); else o = SSF_large_exp(v); return SSF_strip_decimal(SSF_normalize_exp(o.toUpperCase())); } /* "General" rules: - text is passed through ("@") - booleans are rendered as TRUE/FALSE - "up to 11 characters" displayed for numbers - Default date format (code 14) used for Dates The longest 32-bit integer text is "-2147483648", exactly 11 chars TODO: technically the display depends on the width of the cell */ function SSF_general(v/*:any*/, opts/*:any*/) { switch(typeof v) { case 'string': return v; case 'boolean': return v ? "TRUE" : "FALSE"; case 'number': return (v|0) === v ? v.toString(10) : SSF_general_num(v); case 'undefined': return ""; case 'object': if(v == null) return ""; if(v instanceof Date) return SSF_format(14, datenum_local(v, opts && opts.date1904), opts); } throw new Error("unsupported value in General format: " + v); } function SSF_fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) { /* TODO: properly adjust y/m/d and */ o[0] -= 581; var dow = date.getDay(); if(date < 60) dow = (dow + 6) % 7; return dow; } //var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split(""); function SSF_write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ { var o="", ss=0, tt=0, y = val.y, out, outl = 0; switch(type) { case 98: /* 'b' buddhist year */ y = val.y + 543; /* falls through */ case 121: /* 'y' year */ switch(fmt.length) { case 1: case 2: out = y % 100; outl = 2; break; default: out = y % 10000; outl = 4; break; } break; case 109: /* 'm' month */ switch(fmt.length) { case 1: case 2: out = val.m; outl = fmt.length; break; case 3: return months[val.m-1][1]; case 5: return months[val.m-1][0]; default: return months[val.m-1][2]; } break; case 100: /* 'd' day */ switch(fmt.length) { case 1: case 2: out = val.d; outl = fmt.length; break; case 3: return days[val.q][0]; default: return days[val.q][1]; } break; case 104: /* 'h' 12-hour */ switch(fmt.length) { case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break; default: throw 'bad hour format: ' + fmt; } break; case 72: /* 'H' 24-hour */ switch(fmt.length) { case 1: case 2: out = val.H; outl = fmt.length; break; default: throw 'bad hour format: ' + fmt; } break; case 77: /* 'M' minutes */ switch(fmt.length) { case 1: case 2: out = val.M; outl = fmt.length; break; default: throw 'bad minute format: ' + fmt; } break; case 115: /* 's' seconds */ if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt; if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length); /*::if(!ss0) ss0 = 0; */ if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100; else tt = ss0 === 1 ? 10 : 1; ss = Math.round((tt)*(val.S + val.u)); if(ss >= 60*tt) ss = 0; if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt; o = pad0(ss,2 + ss0); if(fmt === 'ss') return o.substr(0,2); return "." + o.substr(2,fmt.length-1); case 90: /* 'Z' absolute time */ switch(fmt) { case '[h]': case '[hh]': out = val.D*24+val.H; break; case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break; case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break; default: throw 'bad abstime format: ' + fmt; } outl = fmt.length === 3 ? 1 : 2; break; case 101: /* 'e' era */ out = y; outl = 1; break; } var outstr = outl > 0 ? pad0(out, outl) : ""; return outstr; } /*jshint -W086 */ /*jshint +W086 */ function commaify(s/*:string*/)/*:string*/ { var w = 3; if(s.length <= w) return s; var j = (s.length % w), o = s.substr(0,j); for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w); return o; } var pct1 = /%/g; function write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); } function write_num_cm(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ var idx = fmt.length - 1; while(fmt.charCodeAt(idx-1) === 44) --idx; return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); } function write_num_exp(fmt/*:string*/, val/*:number*/)/*:string*/{ var o/*:string*/; var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; if(fmt.match(/^#+0.0E\+0$/)) { if(val == 0) return "0.0E+0"; else if(val < 0) return "-" + write_num_exp(fmt, -val); var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); var ee = Math.floor(Math.log(val)*Math.LOG10E)%period; if(ee < 0) ee += period; o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); if(o.indexOf("e") === -1) { var fakee = Math.floor(Math.log(val)*Math.LOG10E); if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee); else o += "E+" + (fakee - ee); while(o.substr(0,2) === "0.") { o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period); o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0."); } o = o.replace(/\+-/,"-"); } o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); } else o = val.toExponential(idx); if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1); if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); return o.replace("e","E"); } var frac1 = /# (\?+)( ?)\/( ?)(\d+)/; function write_num_f1(r/*:Array*/, aval/*:number*/, sign/*:string*/)/*:string*/ { var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den); var myn = (rr - base*den), myd = den; return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length)); } function write_num_f2(r/*:Array*/, aval/*:number*/, sign/*:string*/)/*:string*/ { return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length); } var dec1 = /^#*0*\.([0#]+)/; var closeparen = /\).*[0#]/; var phone = /\(###\) ###\\?-####/; function hashq(str/*:string*/)/*:string*/ { var o = "", cc; for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) { case 35: break; case 63: o+= " "; break; case 48: o+= "0"; break; default: o+= String.fromCharCode(cc); } return o; } function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } function dec(val/*:number*/, d/*:number*/)/*:number*/ { var _frac = val - Math.floor(val), dd = Math.pow(10,d); if (d < ('' + Math.round(_frac * dd)).length) return 0; return Math.round(_frac * dd); } function carry(val/*:number*/, d/*:number*/)/*:number*/ { if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) { return 1; } return 0; } function flr(val/*:number*/)/*:string*/ { if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0)); return ""+Math.floor(val); } function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ { if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); if(val >= 0) return write_num_flt('n', ffmt, val); return '(' + write_num_flt('n', ffmt, -val) + ')'; } if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val); if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val); if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val); if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); var o; var r/*:?Array*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length); if(fmt.match(/^[#?]+$/)) { o = pad0r(val,0); if(o === "0") o = ""; return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; } if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign); if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0")); if((r = fmt.match(dec1))) { o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(/*::(*/r/*::||[""])*/[1]).length-$1.length); }); return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); } fmt = fmt.replace(/^#+([0.])/, "$1"); if((r = fmt.match(/^(0*)\.(#*)$/))) { return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); } if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0)); if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length); } if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val); if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val)); ri = 0; return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri= 0) return write_num_int('n', ffmt, val); return '(' + write_num_int('n', ffmt, -val) + ')'; } if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val); if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val); if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val); if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); var o; var r/*:?Array*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length); if(fmt.match(/^[#?]+$/)) { o = (""+val); if(val === 0) o = ""; return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; } if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign); if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0")); if((r = fmt.match(dec1))) { /*:: if(!Array.isArray(r)) throw new Error("unreachable"); */ o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])); o = o.replace(/\.(\d*)$/,function($$, $1) { /*:: if(!Array.isArray(r)) throw new Error("unreachable"); */ return "." + $1 + fill("0", hashq(r[1]).length-$1.length); }); return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); } fmt = fmt.replace(/^#+([0.])/, "$1"); if((r = fmt.match(/^(0*)\.(#*)$/))) { return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); } if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval)); if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length); } if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val); if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val)); ri = 0; return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri*/ { var out/*:Array*/ = []; var in_str = false/*, cc*/; for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) { case 34: /* '"' */ in_str = !in_str; break; case 95: case 42: case 92: /* '_' '*' '\\' */ ++i; break; case 59: /* ';' */ out[out.length] = fmt.substr(j,i-j); j = i+1; } out[out.length] = fmt.substr(j); if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string "); return out; } var SSF_abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/; function fmt_is_date(fmt/*:string*/)/*:boolean*/ { var i = 0, /*cc = 0,*/ c = "", o = ""; while(i < fmt.length) { switch((c = fmt.charAt(i))) { case 'G': if(SSF_isgeneral(fmt, i)) i+= 6; i++; break; case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break; case '\\': i+=2; break; case '_': i+=2; break; case '@': ++i; break; case 'B': case 'b': if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true; /* falls through */ case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': /* falls through */ case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true; case 'A': case 'a': case '上': if(fmt.substr(i, 3).toUpperCase() === "A/P") return true; if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true; if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true; ++i; break; case '[': o = c; while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); if(o.match(SSF_abstime)) return true; break; case '.': /* falls through */ case '0': case '#': while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */} break; case '?': while(fmt.charAt(++i) === c){/* empty */} break; case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; case '(': case ')': ++i; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break; case ' ': ++i; break; default: ++i; break; } } return false; } function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) { var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc; var hr='H'; /* Tokenize */ while(i < fmt.length) { switch((c = fmt.charAt(i))) { case 'G': /* General */ if(!SSF_isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt); out[out.length] = {t:'G', v:'General'}; i+=7; break; case '"': /* Literal text */ for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc); out[out.length] = {t:'t', v:o}; ++i; break; case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't'; out[out.length] = {t:t, v:w}; ++i; break; case '_': out[out.length] = {t:'t', v:" "}; i+=2; break; case '@': /* Text Placeholder */ out[out.length] = {t:'T', v:v}; ++i; break; case 'B': case 'b': if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") { if(dt==null) { dt=SSF_parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; } out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break; } /* falls through */ case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': c = c.toLowerCase(); /* falls through */ case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': if(v < 0) return ""; if(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return ""; } o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c; if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; if(c === 'h') c = hr; out[out.length] = {t:c, v:o}; lst = c; break; case 'A': case 'a': case '上': var q={t:c, v:c}; if(dt==null) dt=SSF_parse_date_code(v, opts); if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } else { q.t = "t"; ++i; } if(dt==null && q.t === 'T') return ""; out[out.length] = q; lst = c; break; case '[': o = c; while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|'; if(o.match(SSF_abstime)) { if(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return ""; } out[out.length] = {t:'Z', v:o.toLowerCase()}; lst = o.charAt(1); } else if(o.indexOf("$") > -1) { o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$"; if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o}; } break; /* Numbers */ case '.': if(dt != null) { o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c; out[out.length] = {t:'s', v:o}; break; } /* falls through */ case '0': case '#': o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c; out[out.length] = {t:'n', v:o}; break; case '?': o = c; while(fmt.charAt(++i) === c) o+=c; out[out.length] = {t:c, v:o}; lst = c; break; case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // ** case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i); out[out.length] = {t:'D', v:o}; break; case ' ': out[out.length] = {t:c, v:c}; ++i; break; case '$': out[out.length] = {t:'t', v:'$'}; ++i; break; default: if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt); out[out.length] = {t:'t', v:c}; ++i; break; } } /* Scan for date/time parts */ var bt = 0, ss0 = 0, ssm; for(i=out.length-1, lst='t'; i >= 0; --i) { switch(out[i].t) { case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break; case 's': if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1); if(bt < 3) bt = 3; /* falls through */ case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break; case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break; case 'X': /*if(out[i].v === "B2");*/ break; case 'Z': if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3; } } /* time rounding depends on presence of minute / second / usec fields */ switch(bt) { case 0: break; case 1: /*::if(!dt) break;*/ if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } if(dt.S >= 60) { dt.S = 0; ++dt.M; } if(dt.M >= 60) { dt.M = 0; ++dt.H; } break; case 2: /*::if(!dt) break;*/ if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } if(dt.S >= 60) { dt.S = 0; ++dt.M; } break; } /* replace fields */ var nstr = "", jj; for(i=0; i < out.length; ++i) { switch(out[i].t) { case 't': case 'T': case ' ': case 'D': break; case 'X': out[i].v = ""; out[i].t = ";"; break; case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z': /*::if(!dt) throw "unreachable"; */ out[i].v = SSF_write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0); out[i].t = 't'; break; case 'n': case '?': jj = i+1; while(out[jj] != null && ( (c=out[jj].t) === "?" || c === "D" || ((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) || (out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) || (c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')) )) { out[i].v += out[jj].v; out[jj] = {v:"", t:";"}; ++jj; } nstr += out[i].v; i = jj-1; break; case 'G': out[i].t = 't'; out[i].v = SSF_general(v,opts); break; } } var vv = "", myv, ostr; if(nstr.length > 0) { if(nstr.charCodeAt(0) == 40) /* '(' */ { myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); ostr = write_num('n', nstr, myv); } else { myv = (v<0 && flen > 1 ? -v : v); ostr = write_num('n', nstr, myv); if(myv < 0 && out[0] && out[0].t == 't') { ostr = ostr.substr(1); out[0].v = "-" + out[0].v; } } jj=ostr.length-1; var decpt = out.length; for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; } var lasti=out.length; if(decpt === out.length && ostr.indexOf("E") === -1) { for(i=out.length-1; i>= 0;--i) { if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); } else if(jj < 0) out[i].v = ""; else { out[i].v = ostr.substr(0, jj+1); jj = -1; } out[i].t = 't'; lasti = i; } if(jj>=0 && lasti= 0; --i) { if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1; vv = out[i].v.substr(j+1); for(; j>=0; --j) { if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv; } out[i].v = vv; out[i].t = 't'; lasti = i; } if(jj>=0 && lasti-1&&i===decpt?out[i].v.indexOf(".")+1:0; vv = out[i].v.substr(0,j); for(; j-1) { myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v); out[i].v = write_num(out[i].t, out[i].v, myv); out[i].t = 't'; } var retval = ""; for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v; return retval; } var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/; function chkcond(v, rr) { if(rr == null) return false; var thresh = parseFloat(rr[2]); switch(rr[1]) { case "=": if(v == thresh) return true; break; case ">": if(v > thresh) return true; break; case "<": if(v < thresh) return true; break; case "<>": if(v != thresh) return true; break; case ">=": if(v >= thresh) return true; break; case "<=": if(v <= thresh) return true; break; } return false; } function choose_fmt(f/*:string*/, v/*:any*/) { var fmt = SSF_split_fmt(f); var l = fmt.length, lat = fmt[l-1].indexOf("@"); if(l<4 && lat>-1) --l; if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|"); if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"]; switch(fmt.length) { case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break; case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break; case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break; case 4: break; } var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2]; if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff]; if(fmt[0].match(/\[[=<>]/) != null || fmt[1].match(/\[[=<>]/) != null) { var m1 = fmt[0].match(cfregex2); var m2 = fmt[1].match(cfregex2); return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]]; } return [l, ff]; } function SSF_format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) { if(o == null) o = {}; var sfmt = ""; switch(typeof fmt) { case "string": if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF; else sfmt = fmt; break; case "number": if(fmt == 14 && o.dateNF) sfmt = o.dateNF; else sfmt = (o.table != null ? (o.table/*:any*/) : table_fmt)[fmt]; if(sfmt == null) sfmt = (o.table && o.table[SSF_default_map[fmt]]) || table_fmt[SSF_default_map[fmt]]; if(sfmt == null) sfmt = SSF_default_str[fmt] || "General"; break; } if(SSF_isgeneral(sfmt,0)) return SSF_general(v, o); if(v instanceof Date) v = datenum_local(v, o.date1904); var f = choose_fmt(sfmt, v); if(SSF_isgeneral(f[1])) return SSF_general(v, o); if(v === true) v = "TRUE"; else if(v === false) v = "FALSE"; else if(v === "" || v == null) return ""; return eval_fmt(f[1], v, o, f[0]); } function SSF_load(fmt/*:string*/, idx/*:?number*/)/*:number*/ { if(typeof idx != 'number') { idx = +idx || -1; /*::if(typeof idx != 'number') return 0x188; */ for(var i = 0; i < 0x0188; ++i) { /*::if(typeof idx != 'number') return 0x188; */ if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; } if(table_fmt[i] == fmt) { idx = i; break; } } /*::if(typeof idx != 'number') return 0x188; */ if(idx < 0) idx = 0x187; } /*::if(typeof idx != 'number') return 0x188; */ table_fmt[idx] = fmt; return idx; } function SSF_load_table(tbl/*:SSFTable*/)/*:void*/ { for(var i=0; i!=0x0188; ++i) if(tbl[i] !== undefined) SSF_load(tbl[i], i); } function make_ssf() { table_fmt = SSF_init_table(); } var SSF = { format: SSF_format, load: SSF_load, _table: table_fmt, load_table: SSF_load_table, parse_date_code: SSF_parse_date_code, is_date: fmt_is_date, get_table: function get_table() { return SSF._table = table_fmt; } }; var SSFImplicit/*{[number]:string}*/ = ({ "5": '"$"#,##0_);\\("$"#,##0\\)', "6": '"$"#,##0_);[Red]\\("$"#,##0\\)', "7": '"$"#,##0.00_);\\("$"#,##0.00\\)', "8": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)', "23": 'General', "24": 'General', "25": 'General', "26": 'General', "27": 'm/d/yy', "28": 'm/d/yy', "29": 'm/d/yy', "30": 'm/d/yy', "31": 'm/d/yy', "32": 'h:mm:ss', "33": 'h:mm:ss', "34": 'h:mm:ss', "35": 'h:mm:ss', "36": 'm/d/yy', "41": '_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)', "42": '_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)', "43": '_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)', "44": '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)', "50": 'm/d/yy', "51": 'm/d/yy', "52": 'm/d/yy', "53": 'm/d/yy', "54": 'm/d/yy', "55": 'm/d/yy', "56": 'm/d/yy', "57": 'm/d/yy', "58": 'm/d/yy', "59": '0', "60": '0.00', "61": '#,##0', "62": '#,##0.00', "63": '"$"#,##0_);\\("$"#,##0\\)', "64": '"$"#,##0_);[Red]\\("$"#,##0\\)', "65": '"$"#,##0.00_);\\("$"#,##0.00\\)', "66": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)', "67": '0%', "68": '0.00%', "69": '# ?/?', "70": '# ??/??', "71": 'm/d/yy', "72": 'm/d/yy', "73": 'd-mmm-yy', "74": 'd-mmm', "75": 'mmm-yy', "76": 'h:mm', "77": 'h:mm:ss', "78": 'm/d/yy h:mm', "79": 'mm:ss', "80": '[h]:mm:ss', "81": 'mmss.0' }/*:any*/); /* dateNF parse TODO: move to SSF */ var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g; function dateNF_regex(dateNF/*:string|number*/)/*:RegExp*/ { var fmt = typeof dateNF == "number" ? table_fmt[dateNF] : dateNF; fmt = fmt.replace(dateNFregex, "(\\d+)"); return new RegExp("^" + fmt + "$"); } function dateNF_fix(str/*:string*/, dateNF/*:string*/, match/*:Array*/)/*:string*/ { var Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1; (dateNF.match(dateNFregex)||[]).forEach(function(n, i) { var v = parseInt(match[i+1], 10); switch(n.toLowerCase().charAt(0)) { case 'y': Y = v; break; case 'd': d = v; break; case 'h': H = v; break; case 's': S = v; break; case 'm': if(H >= 0) M = v; else m = v; break; } }); if(S >= 0 && M == -1 && m >= 0) { M = m; m = -1; } var datestr = (("" + (Y>=0?Y: new Date().getFullYear())).slice(-4) + "-" + ("00" + (m>=1?m:1)).slice(-2) + "-" + ("00" + (d>=1?d:1)).slice(-2)); if(datestr.length == 7) datestr = "0" + datestr; if(datestr.length == 8) datestr = "20" + datestr; var timestr = (("00" + (H>=0?H:0)).slice(-2) + ":" + ("00" + (M>=0?M:0)).slice(-2) + ":" + ("00" + (S>=0?S:0)).slice(-2)); if(H == -1 && M == -1 && S == -1) return datestr; if(Y == -1 && m == -1 && d == -1) return timestr; return datestr + "T" + timestr; } /*:: declare var ReadShift:any; declare var CheckField:any; declare var prep_blob:any; declare var __readUInt32LE:any; declare var __readInt32LE:any; declare var __toBuffer:any; declare var __utf16le:any; declare var bconcat:any; declare var s2a:any; declare var chr0:any; declare var chr1:any; declare var has_buf:boolean; declare var new_buf:any; declare var new_raw_buf:any; declare var new_unsafe_buf:any; declare var Buffer_from:any; */ /* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */ /* vim: set ts=2: */ /*jshint eqnull:true */ /*exported CFB */ /*global Uint8Array:false, Uint16Array:false */ /*:: type SectorEntry = { name?:string; nodes?:Array; data:RawBytes; }; type SectorList = { [k:string|number]:SectorEntry; name:?string; fat_addrs:Array; ssz:number; } type CFBFiles = {[n:string]:CFBEntry}; */ /* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */ /* vim: set ts=2: */ /*exported CRC32 */ var CRC32 = /*#__PURE__*/(function() { var CRC32 = {}; CRC32.version = '1.2.0'; /* see perf/crc32table.js */ /*global Int32Array */ function signed_crc_table()/*:any*/ { var c = 0, table/*:Array*/ = new Array(256); for(var n =0; n != 256; ++n){ c = n; c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1)); table[n] = c; } return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table; } var T0 = signed_crc_table(); function slice_by_16_tables(T) { var c = 0, v = 0, n = 0, table/*:Array*/ = typeof Int32Array !== 'undefined' ? new Int32Array(4096) : new Array(4096) ; for(n = 0; n != 256; ++n) table[n] = T[n]; for(n = 0; n != 256; ++n) { v = T[n]; for(c = 256 + n; c < 4096; c += 256) v = table[c] = (v >>> 8) ^ T[v & 0xFF]; } var out = []; for(n = 1; n != 16; ++n) out[n - 1] = typeof Int32Array !== 'undefined' ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256); return out; } var TT = slice_by_16_tables(T0); var T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4]; var T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9]; var Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14]; function crc32_bstr(bstr/*:string*/, seed/*:number*/)/*:number*/ { var C = seed/*:: ? 0 : 0 */ ^ -1; for(var i = 0, L = bstr.length; i < L;) C = (C>>>8) ^ T0[(C^bstr.charCodeAt(i++))&0xFF]; return ~C; } function crc32_buf(B/*:Uint8Array|Array*/, seed/*:number*/)/*:number*/ { var C = seed/*:: ? 0 : 0 */ ^ -1, L = B.length - 15, i = 0; for(; i < L;) C = Tf[B[i++] ^ (C & 255)] ^ Te[B[i++] ^ ((C >> 8) & 255)] ^ Td[B[i++] ^ ((C >> 16) & 255)] ^ Tc[B[i++] ^ (C >>> 24)] ^ Tb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^ T7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^ T3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]]; L += 15; while(i < L) C = (C>>>8) ^ T0[(C^B[i++])&0xFF]; return ~C; } function crc32_str(str/*:string*/, seed/*:number*/)/*:number*/ { var C = seed ^ -1; for(var i = 0, L = str.length, c = 0, d = 0; i < L;) { c = str.charCodeAt(i++); if(c < 0x80) { C = (C>>>8) ^ T0[(C^c)&0xFF]; } else if(c < 0x800) { C = (C>>>8) ^ T0[(C ^ (192|((c>>6)&31)))&0xFF]; C = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF]; } else if(c >= 0xD800 && c < 0xE000) { c = (c&1023)+64; d = str.charCodeAt(i++)&1023; C = (C>>>8) ^ T0[(C ^ (240|((c>>8)&7)))&0xFF]; C = (C>>>8) ^ T0[(C ^ (128|((c>>2)&63)))&0xFF]; C = (C>>>8) ^ T0[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF]; C = (C>>>8) ^ T0[(C ^ (128|(d&63)))&0xFF]; } else { C = (C>>>8) ^ T0[(C ^ (224|((c>>12)&15)))&0xFF]; C = (C>>>8) ^ T0[(C ^ (128|((c>>6)&63)))&0xFF]; C = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF]; } } return ~C; } CRC32.table = T0; CRC32.bstr = crc32_bstr; CRC32.buf = crc32_buf; CRC32.str = crc32_str; return CRC32; })(); /* [MS-CFB] v20171201 */ var CFB = /*#__PURE__*/(function _CFB(){ var exports = {}; exports.version = '1.2.1'; /* [MS-CFB] 2.6.4 */ function namecmp(l/*:string*/, r/*:string*/)/*:number*/ { var L = l.split("/"), R = r.split("/"); for(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) { if((c = L[i].length - R[i].length)) return c; if(L[i] != R[i]) return L[i] < R[i] ? -1 : 1; } return L.length - R.length; } function dirname(p/*:string*/)/*:string*/ { if(p.charAt(p.length - 1) == "/") return (p.slice(0,-1).indexOf("/") === -1) ? p : dirname(p.slice(0, -1)); var c = p.lastIndexOf("/"); return (c === -1) ? p : p.slice(0, c+1); } function filename(p/*:string*/)/*:string*/ { if(p.charAt(p.length - 1) == "/") return filename(p.slice(0, -1)); var c = p.lastIndexOf("/"); return (c === -1) ? p : p.slice(c+1); } /* -------------------------------------------------------------------------- */ /* DOS Date format: high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low add 1980 to stored year stored second should be doubled */ /* write JS date to buf as a DOS date */ function write_dos_date(buf/*:CFBlob*/, date/*:Date|string*/) { if(typeof date === "string") date = new Date(date); var hms/*:number*/ = date.getHours(); hms = hms << 6 | date.getMinutes(); hms = hms << 5 | (date.getSeconds()>>>1); buf.write_shift(2, hms); var ymd/*:number*/ = (date.getFullYear() - 1980); ymd = ymd << 4 | (date.getMonth()+1); ymd = ymd << 5 | date.getDate(); buf.write_shift(2, ymd); } /* read four bytes from buf and interpret as a DOS date */ function parse_dos_date(buf/*:CFBlob*/)/*:Date*/ { var hms = buf.read_shift(2) & 0xFFFF; var ymd = buf.read_shift(2) & 0xFFFF; var val = new Date(); var d = ymd & 0x1F; ymd >>>= 5; var m = ymd & 0x0F; ymd >>>= 4; val.setMilliseconds(0); val.setFullYear(ymd + 1980); val.setMonth(m-1); val.setDate(d); var S = hms & 0x1F; hms >>>= 5; var M = hms & 0x3F; hms >>>= 6; val.setHours(hms); val.setMinutes(M); val.setSeconds(S<<1); return val; } function parse_extra_field(blob/*:CFBlob*/)/*:any*/ { prep_blob(blob, 0); var o = /*::(*/{}/*:: :any)*/; var flags = 0; while(blob.l <= blob.length - 4) { var type = blob.read_shift(2); var sz = blob.read_shift(2), tgt = blob.l + sz; var p = {}; switch(type) { /* UNIX-style Timestamps */ case 0x5455: { flags = blob.read_shift(1); if(flags & 1) p.mtime = blob.read_shift(4); /* for some reason, CD flag corresponds to LFH */ if(sz > 5) { if(flags & 2) p.atime = blob.read_shift(4); if(flags & 4) p.ctime = blob.read_shift(4); } if(p.mtime) p.mt = new Date(p.mtime*1000); } break; } blob.l = tgt; o[type] = p; } return o; } var fs/*:: = require('fs'); */; function get_fs() { return fs || (fs = {}); } function parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ { if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options); if((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options); if(file.length < 512) throw new Error("CFB file size " + file.length + " < 512"); var mver = 3; var ssz = 512; var nmfs = 0; // number of mini FAT sectors var difat_sec_cnt = 0; var dir_start = 0; var minifat_start = 0; var difat_start = 0; var fat_addrs/*:Array*/ = []; // locations of FAT sectors /* [MS-CFB] 2.2 Compound File Header */ var blob/*:CFBlob*/ = /*::(*/file.slice(0,512)/*:: :any)*/; prep_blob(blob, 0); /* major version */ var mv = check_get_mver(blob); mver = mv[0]; switch(mver) { case 3: ssz = 512; break; case 4: ssz = 4096; break; case 0: if(mv[1] == 0) return parse_zip(file, options); /* falls through */ default: throw new Error("Major Version: Expected 3 or 4 saw " + mver); } /* reprocess header */ if(ssz !== 512) { blob = /*::(*/file.slice(0,ssz)/*:: :any)*/; prep_blob(blob, 28 /* blob.l */); } /* Save header for final object */ var header/*:RawBytes*/ = file.slice(0,ssz); check_shifts(blob, mver); // Number of Directory Sectors var dir_cnt/*:number*/ = blob.read_shift(4, 'i'); if(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt); // Number of FAT Sectors blob.l += 4; // First Directory Sector Location dir_start = blob.read_shift(4, 'i'); // Transaction Signature blob.l += 4; // Mini Stream Cutoff Size blob.chk('00100000', 'Mini Stream Cutoff Size: '); // First Mini FAT Sector Location minifat_start = blob.read_shift(4, 'i'); // Number of Mini FAT Sectors nmfs = blob.read_shift(4, 'i'); // First DIFAT sector location difat_start = blob.read_shift(4, 'i'); // Number of DIFAT Sectors difat_sec_cnt = blob.read_shift(4, 'i'); // Grab FAT Sector Locations for(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */ q = blob.read_shift(4, 'i'); if(q<0) break; fat_addrs[j] = q; } /** Break the file up into sectors */ var sectors/*:Array*/ = sectorify(file, ssz); sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs); /** Chains */ var sector_list/*:SectorList*/ = make_sector_list(sectors, dir_start, fat_addrs, ssz); sector_list[dir_start].name = "!Directory"; if(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT"; sector_list[fat_addrs[0]].name = "!FAT"; sector_list.fat_addrs = fat_addrs; sector_list.ssz = ssz; /* [MS-CFB] 2.6.1 Compound File Directory Entry */ var files/*:CFBFiles*/ = {}, Paths/*:Array*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = []; read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start); build_full_paths(FileIndex, FullPaths, Paths); Paths.shift(); var o = { FileIndex: FileIndex, FullPaths: FullPaths }; // $FlowIgnore if(options && options.raw) o.raw = {header: header, sectors: sectors}; return o; } // parse /* [MS-CFB] 2.2 Compound File Header -- read up to major version */ function check_get_mver(blob/*:CFBlob*/)/*:[number, number]*/ { if(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0]; // header signature 8 blob.chk(HEADER_SIGNATURE, 'Header Signature: '); // clsid 16 //blob.chk(HEADER_CLSID, 'CLSID: '); blob.l += 16; // minor version 2 var mver/*:number*/ = blob.read_shift(2, 'u'); return [blob.read_shift(2,'u'), mver]; } function check_shifts(blob/*:CFBlob*/, mver/*:number*/)/*:void*/ { var shift = 0x09; // Byte Order //blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff blob.l += 2; // Sector Shift switch((shift = blob.read_shift(2))) { case 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break; case 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break; default: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift); } // Mini Sector Shift blob.chk('0600', 'Mini Sector Shift: '); // Reserved blob.chk('000000000000', 'Reserved: '); } /** Break the file up into sectors */ function sectorify(file/*:RawBytes*/, ssz/*:number*/)/*:Array*/ { var nsectors = Math.ceil(file.length/ssz)-1; var sectors/*:Array*/ = []; for(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz); sectors[nsectors-1] = file.slice(nsectors*ssz); return sectors; } /* [MS-CFB] 2.6.4 Red-Black Tree */ function build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array*/, Paths/*:Array*/)/*:void*/ { var i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length; var dad/*:Array*/ = [], q/*:Array*/ = []; for(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; } for(; j < q.length; ++j) { i = q[j]; L = FI[i].L; R = FI[i].R; C = FI[i].C; if(dad[i] === i) { if(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L]; if(R !== -1 && dad[R] !== R) dad[i] = dad[R]; } if(C !== -1 /*NOSTREAM*/) dad[C] = i; if(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); } if(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); } } for(i=1; i < pl; ++i) if(dad[i] === i) { if(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R]; else if(L !== -1 && dad[L] !== L) dad[i] = dad[L]; } for(i=1; i < pl; ++i) { if(FI[i].type === 0 /* unknown */) continue; j = i; if(j != dad[j]) do { j = dad[j]; FP[i] = FP[j] + "/" + FP[i]; } while (j !== 0 && -1 !== dad[j] && j != dad[j]); dad[i] = -1; } FP[0] += "/"; for(i=1; i < pl; ++i) { if(FI[i].type !== 2 /* stream */) FP[i] += "/"; } } function get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ { var start = entry.start, size = entry.size; //return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/); var o = []; var idx = start; while(mini && size > 0 && idx >= 0) { o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ)); size -= MSSZ; idx = __readInt32LE(mini, idx * 4); } if(o.length === 0) return (new_buf(0)/*:any*/); return (bconcat(o).slice(0, entry.size)/*:any*/); } /** Chase down the rest of the DIFAT chain to build a comprehensive list DIFAT chains by storing the next sector number as the last 32 bits */ function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array*/, ssz/*:number*/, fat_addrs)/*:void*/ { var q/*:number*/ = ENDOFCHAIN; if(idx === ENDOFCHAIN) { if(cnt !== 0) throw new Error("DIFAT chain shorter than expected"); } else if(idx !== -1 /*FREESECT*/) { var sector = sectors[idx], m = (ssz>>>2)-1; if(!sector) return; for(var i = 0; i < m; ++i) { if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break; fat_addrs.push(q); } sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs); } } /** Follow the linked list of sectors for a given starting point */ function get_sector_list(sectors/*:Array*/, start/*:number*/, fat_addrs/*:Array*/, ssz/*:number*/, chkd/*:?Array*/)/*:SectorEntry*/ { var buf/*:Array*/ = [], buf_chain/*:Array*/ = []; if(!chkd) chkd = []; var modulus = ssz - 1, j = 0, jj = 0; for(j=start; j>=0;) { chkd[j] = true; buf[buf.length] = j; buf_chain.push(sectors[j]); var addr = fat_addrs[Math.floor(j*4/ssz)]; jj = ((j*4) & modulus); if(ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 "+ssz); if(!sectors[addr]) break; j = __readInt32LE(sectors[addr], jj); } return {nodes: buf, data:__toBuffer([buf_chain])}; } /** Chase down the sector linked lists */ function make_sector_list(sectors/*:Array*/, dir_start/*:number*/, fat_addrs/*:Array*/, ssz/*:number*/)/*:SectorList*/ { var sl = sectors.length, sector_list/*:SectorList*/ = ([]/*:any*/); var chkd/*:Array*/ = [], buf/*:Array*/ = [], buf_chain/*:Array*/ = []; var modulus = ssz - 1, i=0, j=0, k=0, jj=0; for(i=0; i < sl; ++i) { buf = ([]/*:Array*/); k = (i + dir_start); if(k >= sl) k-=sl; if(chkd[k]) continue; buf_chain = []; var seen = []; for(j=k; j>=0;) { seen[j] = true; chkd[j] = true; buf[buf.length] = j; buf_chain.push(sectors[j]); var addr/*:number*/ = fat_addrs[Math.floor(j*4/ssz)]; jj = ((j*4) & modulus); if(ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 "+ssz); if(!sectors[addr]) break; j = __readInt32LE(sectors[addr], jj); if(seen[j]) break; } sector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])}/*:SectorEntry*/); } return sector_list; } /* [MS-CFB] 2.6.1 Compound File Directory Entry */ function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array*/, Paths/*:Array*/, nmfs, files, FileIndex, mini) { var minifat_store = 0, pl = (Paths.length?2:0); var sector = sector_list[dir_start].data; var i = 0, namelen = 0, name; for(; i < sector.length; i+= 128) { var blob/*:CFBlob*/ = /*::(*/sector.slice(i, i+128)/*:: :any)*/; prep_blob(blob, 64); namelen = blob.read_shift(2); name = __utf16le(blob,0,namelen-pl); Paths.push(name); var o/*:CFBEntry*/ = ({ name: name, type: blob.read_shift(1), color: blob.read_shift(1), L: blob.read_shift(4, 'i'), R: blob.read_shift(4, 'i'), C: blob.read_shift(4, 'i'), clsid: blob.read_shift(16), state: blob.read_shift(4, 'i'), start: 0, size: 0 }); var ctime/*:number*/ = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2); if(ctime !== 0) o.ct = read_date(blob, blob.l-8); var mtime/*:number*/ = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2); if(mtime !== 0) o.mt = read_date(blob, blob.l-8); o.start = blob.read_shift(4, 'i'); o.size = blob.read_shift(4, 'i'); if(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = ""; } if(o.type === 5) { /* root */ minifat_store = o.start; if(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = "!StreamData"; /*minifat_size = o.size;*/ } else if(o.size >= 4096 /* MSCSZ */) { o.storage = 'fat'; if(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz); sector_list[o.start].name = o.name; o.content = (sector_list[o.start].data.slice(0,o.size)/*:any*/); } else { o.storage = 'minifat'; if(o.size < 0) o.size = 0; else if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) { o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data); } } if(o.content) prep_blob(o.content, 0); files[name] = o; FileIndex.push(o); } } function read_date(blob/*:RawBytes|CFBlob*/, offset/*:number*/)/*:Date*/ { return new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000); } function read_file(filename/*:string*/, options/*:CFBReadOpts*/) { get_fs(); return parse(fs.readFileSync(filename), options); } function read(blob/*:RawBytes|string*/, options/*:CFBReadOpts*/) { var type = options && options.type; if(!type) { if(has_buf && Buffer.isBuffer(blob)) type = "buffer"; } switch(type || "base64") { case "file": /*:: if(typeof blob !== 'string') throw "Must pass a filename when type='file'"; */return read_file(blob, options); case "base64": /*:: if(typeof blob !== 'string') throw "Must pass a base64-encoded binary string when type='file'"; */return parse(s2a(Base64_decode(blob)), options); case "binary": /*:: if(typeof blob !== 'string') throw "Must pass a binary string when type='file'"; */return parse(s2a(blob), options); } return parse(/*::typeof blob == 'string' ? new Buffer(blob, 'utf-8') : */blob, options); } function init_cfb(cfb/*:CFBContainer*/, opts/*:?any*/)/*:void*/ { var o = opts || {}, root = o.root || "Root Entry"; if(!cfb.FullPaths) cfb.FullPaths = []; if(!cfb.FileIndex) cfb.FileIndex = []; if(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error("inconsistent CFB structure"); if(cfb.FullPaths.length === 0) { cfb.FullPaths[0] = root + "/"; cfb.FileIndex[0] = ({ name: root, type: 5 }/*:any*/); } if(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID; seed_cfb(cfb); } function seed_cfb(cfb/*:CFBContainer*/)/*:void*/ { var nm = "\u0001Sh33tJ5"; if(CFB.find(cfb, "/" + nm)) return; var p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54; cfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }/*:any*/)); cfb.FullPaths.push(cfb.FullPaths[0] + nm); rebuild_cfb(cfb); } function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ { init_cfb(cfb); var gc = false, s = false; for(var i = cfb.FullPaths.length - 1; i >= 0; --i) { var _file = cfb.FileIndex[i]; switch(_file.type) { case 0: if(s) gc = true; else { cfb.FileIndex.pop(); cfb.FullPaths.pop(); } break; case 1: case 2: case 5: s = true; if(isNaN(_file.R * _file.L * _file.C)) gc = true; if(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true; break; default: gc = true; break; } } if(!gc && !f) return; var now = new Date(1987, 1, 19), j = 0; // Track which names exist var fullPaths = Object.create ? Object.create(null) : {}; var data/*:Array<[string, CFBEntry]>*/ = []; for(i = 0; i < cfb.FullPaths.length; ++i) { fullPaths[cfb.FullPaths[i]] = true; if(cfb.FileIndex[i].type === 0) continue; data.push([cfb.FullPaths[i], cfb.FileIndex[i]]); } for(i = 0; i < data.length; ++i) { var dad = dirname(data[i][0]); s = fullPaths[dad]; if(!s) { data.push([dad, ({ name: filename(dad).replace("/",""), type: 1, clsid: HEADER_CLSID, ct: now, mt: now, content: null }/*:any*/)]); // Add name to set fullPaths[dad] = true; } } data.sort(function(x,y) { return namecmp(x[0], y[0]); }); cfb.FullPaths = []; cfb.FileIndex = []; for(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; } for(i = 0; i < data.length; ++i) { var elt = cfb.FileIndex[i]; var nm = cfb.FullPaths[i]; elt.name = filename(nm).replace("/",""); elt.L = elt.R = elt.C = -(elt.color = 1); elt.size = elt.content ? elt.content.length : 0; elt.start = 0; elt.clsid = (elt.clsid || HEADER_CLSID); if(i === 0) { elt.C = data.length > 1 ? 1 : -1; elt.size = 0; elt.type = 5; } else if(nm.slice(-1) == "/") { for(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break; elt.C = j >= data.length ? -1 : j; for(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break; elt.R = j >= data.length ? -1 : j; elt.type = 1; } else { if(dirname(cfb.FullPaths[i+1]||"") == dirname(nm)) elt.R = i + 1; elt.type = 2; } } } function _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|string*/ { var _opts = options || {}; /* MAD is order-sensitive, skip rebuild and sort */ if(_opts.fileType == 'mad') return write_mad(cfb, _opts); rebuild_cfb(cfb); switch(_opts.fileType) { case 'zip': return write_zip(cfb, _opts); //case 'mad': return write_mad(cfb, _opts); } var L = (function(cfb/*:CFBContainer*/)/*:Array*/{ var mini_size = 0, fat_size = 0; for(var i = 0; i < cfb.FileIndex.length; ++i) { var file = cfb.FileIndex[i]; if(!file.content) continue; /*:: if(file.content == null) throw new Error("unreachable"); */ var flen = file.content.length; if(flen > 0){ if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6; else fat_size += (flen + 0x01FF) >> 9; } } var dir_cnt = (cfb.FullPaths.length +3) >> 2; var mini_cnt = (mini_size + 7) >> 3; var mfat_cnt = (mini_size + 0x7F) >> 7; var fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt; var fat_cnt = (fat_base + 0x7F) >> 7; var difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F); while(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F); var L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0]; cfb.FileIndex[0].size = mini_size << 6; L[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3); return L; })(cfb); var o = new_buf(L[7] << 9); var i = 0, T = 0; { for(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]); for(i = 0; i < 8; ++i) o.write_shift(2, 0); o.write_shift(2, 0x003E); o.write_shift(2, 0x0003); o.write_shift(2, 0xFFFE); o.write_shift(2, 0x0009); o.write_shift(2, 0x0006); for(i = 0; i < 3; ++i) o.write_shift(2, 0); o.write_shift(4, 0); o.write_shift(4, L[2]); o.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1); o.write_shift(4, 0); o.write_shift(4, 1<<12); o.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN); o.write_shift(4, L[3]); o.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN); o.write_shift(4, L[1]); for(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1); } if(L[1]) { for(T = 0; T < L[1]; ++T) { for(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1); o.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1); } } var chainit = function(w/*:number*/)/*:void*/ { for(T += w; i> 9); } chainit((L[6] + 7) >> 3); while(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN); T = i = 0; for(j = 0; j < cfb.FileIndex.length; ++j) { file = cfb.FileIndex[j]; if(!file.content) continue; /*:: if(file.content == null) throw new Error("unreachable"); */ flen = file.content.length; if(!flen || flen >= 0x1000) continue; file.start = T; chainit((flen + 0x3F) >> 6); } while(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN); for(i = 0; i < L[4]<<2; ++i) { var nm = cfb.FullPaths[i]; if(!nm || nm.length === 0) { for(j = 0; j < 17; ++j) o.write_shift(4, 0); for(j = 0; j < 3; ++j) o.write_shift(4, -1); for(j = 0; j < 12; ++j) o.write_shift(4, 0); continue; } file = cfb.FileIndex[i]; if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN; var _nm/*:string*/ = (i === 0 && _opts.root) || file.name; flen = 2*(_nm.length+1); o.write_shift(64, _nm, "utf16le"); o.write_shift(2, flen); o.write_shift(1, file.type); o.write_shift(1, file.color); o.write_shift(-4, file.L); o.write_shift(-4, file.R); o.write_shift(-4, file.C); if(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0); else o.write_shift(16, file.clsid, "hex"); o.write_shift(4, file.state || 0); o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(4, file.start); o.write_shift(4, file.size); o.write_shift(4, 0); } for(i = 1; i < cfb.FileIndex.length; ++i) { file = cfb.FileIndex[i]; /*:: if(!file.content) throw new Error("unreachable"); */ if(file.size >= 0x1000) { o.l = (file.start+1) << 9; if (has_buf && Buffer.isBuffer(file.content)) { file.content.copy(o, o.l, 0, file.size); // o is a 0-filled Buffer so just set next offset o.l += (file.size + 511) & -512; } else { for(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]); for(; j & 0x1FF; ++j) o.write_shift(1, 0); } } } for(i = 1; i < cfb.FileIndex.length; ++i) { file = cfb.FileIndex[i]; /*:: if(!file.content) throw new Error("unreachable"); */ if(file.size > 0 && file.size < 0x1000) { if (has_buf && Buffer.isBuffer(file.content)) { file.content.copy(o, o.l, 0, file.size); // o is a 0-filled Buffer so just set next offset o.l += (file.size + 63) & -64; } else { for(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]); for(; j & 0x3F; ++j) o.write_shift(1, 0); } } } if (has_buf) { o.l = o.length; } else { // When using Buffer, already 0-filled while(o.l < o.length) o.write_shift(1, 0); } return o; } /* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */ function find(cfb/*:CFBContainer*/, path/*:string*/)/*:?CFBEntry*/ { var UCFullPaths/*:Array*/ = cfb.FullPaths.map(function(x) { return x.toUpperCase(); }); var UCPaths/*:Array*/ = UCFullPaths.map(function(x) { var y = x.split("/"); return y[y.length - (x.slice(-1) == "/" ? 2 : 1)]; }); var k/*:boolean*/ = false; if(path.charCodeAt(0) === 47 /* "/" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; } else k = path.indexOf("/") !== -1; var UCPath/*:string*/ = path.toUpperCase(); var w/*:number*/ = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath); if(w !== -1) return cfb.FileIndex[w]; var m = !UCPath.match(chr1); UCPath = UCPath.replace(chr0,''); if(m) UCPath = UCPath.replace(chr1,'!'); for(w = 0; w < UCFullPaths.length; ++w) { if((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w]; if((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w]; } return null; } /** CFB Constants */ var MSSZ = 64; /* Mini Sector Size = 1<<6 */ //var MSCSZ = 4096; /* Mini Stream Cutoff Size */ /* 2.1 Compound File Sector Numbers and Types */ var ENDOFCHAIN = -2; /* 2.2 Compound File Header */ var HEADER_SIGNATURE = 'd0cf11e0a1b11ae1'; var HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1]; var HEADER_CLSID = '00000000000000000000000000000000'; var consts = { /* 2.1 Compund File Sector Numbers and Types */ MAXREGSECT: -6, DIFSECT: -4, FATSECT: -3, ENDOFCHAIN: ENDOFCHAIN, FREESECT: -1, /* 2.2 Compound File Header */ HEADER_SIGNATURE: HEADER_SIGNATURE, HEADER_MINOR_VERSION: '3e00', MAXREGSID: -6, NOSTREAM: -1, HEADER_CLSID: HEADER_CLSID, /* 2.6.1 Compound File Directory Entry */ EntryTypes: ['unknown','storage','stream','lockbytes','property','root'] }; function write_file(cfb/*:CFBContainer*/, filename/*:string*/, options/*:CFBWriteOpts*/)/*:void*/ { get_fs(); var o = _write(cfb, options); /*:: if(typeof Buffer == 'undefined' || !Buffer.isBuffer(o) || !(o instanceof Buffer)) throw new Error("unreachable"); */ fs.writeFileSync(filename, o); } function a2s(o/*:RawBytes*/)/*:string*/ { var out = new Array(o.length); for(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]); return out.join(""); } function write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|string*/ { var o = _write(cfb, options); switch(options && options.type || "buffer") { case "file": get_fs(); fs.writeFileSync(options.filename, (o/*:any*/)); return o; case "binary": return typeof o == "string" ? o : a2s(o); case "base64": return Base64_encode(typeof o == "string" ? o : a2s(o)); case "buffer": if(has_buf) return Buffer.isBuffer(o) ? o : Buffer_from(o); /* falls through */ case "array": return typeof o == "string" ? s2a(o) : o; } return o; } /* node < 8.1 zlib does not expose bytesRead, so default to pure JS */ var _zlib; function use_zlib(zlib) { try { var InflateRaw = zlib.InflateRaw; var InflRaw = new InflateRaw(); InflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag); if(InflRaw.bytesRead) _zlib = zlib; else throw new Error("zlib does not expose bytesRead"); } catch(e) {console.error("cannot use native zlib: " + (e.message || e)); } } function _inflateRawSync(payload, usz) { if(!_zlib) return _inflate(payload, usz); var InflateRaw = _zlib.InflateRaw; var InflRaw = new InflateRaw(); var out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag); payload.l += InflRaw.bytesRead; return out; } function _deflateRawSync(payload) { return _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload); } var CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; /* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */ var LEN_LN = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 , 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ]; /* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */ var DST_LN = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ]; function bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; } var use_typed_arrays = typeof Uint8Array !== 'undefined'; var bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : []; for(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q); function bit_swap_n(n, b) { var rev = bitswap8[n & 0xFF]; if(b <= 8) return rev >>> (8-b); rev = (rev << 8) | bitswap8[(n>>8)&0xFF]; if(b <= 16) return rev >>> (16-b); rev = (rev << 8) | bitswap8[(n>>16)&0xFF]; return rev >>> (24-b); } /* helpers for unaligned bit reads */ function read_bits_2(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 6 ? 0 : buf[h+1]<<8))>>>w)& 0x03; } function read_bits_3(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 5 ? 0 : buf[h+1]<<8))>>>w)& 0x07; } function read_bits_4(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 4 ? 0 : buf[h+1]<<8))>>>w)& 0x0F; } function read_bits_5(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 3 ? 0 : buf[h+1]<<8))>>>w)& 0x1F; } function read_bits_7(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 1 ? 0 : buf[h+1]<<8))>>>w)& 0x7F; } /* works up to n = 3 * 8 + 1 = 25 */ function read_bits_n(buf, bl, n) { var w = (bl&7), h = (bl>>>3), f = ((1<>> w; if(n < 8 - w) return v & f; v |= buf[h+1]<<(8-w); if(n < 16 - w) return v & f; v |= buf[h+2]<<(16-w); if(n < 24 - w) return v & f; v |= buf[h+3]<<(24-w); return v & f; } /* helpers for unaligned bit writes */ function write_bits_3(buf, bl, v) { var w = bl & 7, h = bl >>> 3; if(w <= 5) buf[h] |= (v & 7) << w; else { buf[h] |= (v << w) & 0xFF; buf[h+1] = (v&7) >> (8-w); } return bl + 3; } function write_bits_1(buf, bl, v) { var w = bl & 7, h = bl >>> 3; v = (v&1) << w; buf[h] |= v; return bl + 1; } function write_bits_8(buf, bl, v) { var w = bl & 7, h = bl >>> 3; v <<= w; buf[h] |= v & 0xFF; v >>>= 8; buf[h+1] = v; return bl + 8; } function write_bits_16(buf, bl, v) { var w = bl & 7, h = bl >>> 3; v <<= w; buf[h] |= v & 0xFF; v >>>= 8; buf[h+1] = v & 0xFF; buf[h+2] = v >>> 8; return bl + 16; } /* until ArrayBuffer#realloc is a thing, fake a realloc */ function realloc(b, sz/*:number*/) { var L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0; if(L >= sz) return b; if(has_buf) { var o = new_unsafe_buf(M); // $FlowIgnore if(b.copy) b.copy(o); else for(; i < b.length; ++i) o[i] = b[i]; return o; } else if(use_typed_arrays) { var a = new Uint8Array(M); if(a.set) a.set(b); else for(; i < L; ++i) a[i] = b[i]; return a; } b.length = M; return b; } /* zero-filled arrays for older browsers */ function zero_fill_array(n) { var o = new Array(n); for(var i = 0; i < n; ++i) o[i] = 0; return o; } /* build tree (used for literals and lengths) */ function build_tree(clens, cmap, MAX/*:number*/)/*:number*/ { var maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length; var bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32); for(i = 0; i < 32; ++i) bl_count[i] = 0; for(i = L; i < MAX; ++i) clens[i] = 0; L = clens.length; var ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // [] /* build code tree */ for(i = 0; i < L; ++i) { bl_count[(w = clens[i])]++; if(maxlen < w) maxlen = w; ctree[i] = 0; } bl_count[0] = 0; for(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1); for(i = 0; i < L; ++i) { ccode = clens[i]; if(ccode != 0) ctree[i] = bl_count[ccode+16]++; } /* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */ var cleni = 0; for(i = 0; i < L; ++i) { cleni = clens[i]; if(cleni != 0) { ccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni); for(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j) cmap[ccode|(j<*/ = []; var i = 0; for(;i<32; i++) dlens.push(5); build_tree(dlens, fix_dmap, 32); var clens/*:Array*/ = []; i = 0; for(; i<=143; i++) clens.push(8); for(; i<=255; i++) clens.push(9); for(; i<=279; i++) clens.push(7); for(; i<=287; i++) clens.push(8); build_tree(clens, fix_lmap, 288); })();var _deflateRaw = /*#__PURE__*/(function _deflateRawIIFE() { var DST_LN_RE = use_typed_arrays ? new Uint8Array(0x8000) : []; var j = 0, k = 0; for(; j < DST_LN.length - 1; ++j) { for(; k < DST_LN[j+1]; ++k) DST_LN_RE[k] = j; } for(;k < 32768; ++k) DST_LN_RE[k] = 29; var LEN_LN_RE = use_typed_arrays ? new Uint8Array(0x103) : []; for(j = 0, k = 0; j < LEN_LN.length - 1; ++j) { for(; k < LEN_LN[j+1]; ++k) LEN_LN_RE[k] = j; } function write_stored(data, out) { var boff = 0; while(boff < data.length) { var L = Math.min(0xFFFF, data.length - boff); var h = boff + L == data.length; out.write_shift(1, +h); out.write_shift(2, L); out.write_shift(2, (~L) & 0xFFFF); while(L-- > 0) out[out.l++] = data[boff++]; } return out.l; } /* Fixed Huffman */ function write_huff_fixed(data, out) { var bl = 0; var boff = 0; var addrs = use_typed_arrays ? new Uint16Array(0x8000) : []; while(boff < data.length) { var L = /* data.length - boff; */ Math.min(0xFFFF, data.length - boff); /* write a stored block for short data */ if(L < 10) { bl = write_bits_3(out, bl, +!!(boff + L == data.length)); // jshint ignore:line if(bl & 7) bl += 8 - (bl & 7); out.l = (bl / 8) | 0; out.write_shift(2, L); out.write_shift(2, (~L) & 0xFFFF); while(L-- > 0) out[out.l++] = data[boff++]; bl = out.l * 8; continue; } bl = write_bits_3(out, bl, +!!(boff + L == data.length) + 2); // jshint ignore:line var hash = 0; while(L-- > 0) { var d = data[boff]; hash = ((hash << 5) ^ d) & 0x7FFF; var match = -1, mlen = 0; if((match = addrs[hash])) { match |= boff & ~0x7FFF; if(match > boff) match -= 0x8000; if(match < boff) while(data[match + mlen] == data[boff + mlen] && mlen < 250) ++mlen; } if(mlen > 2) { /* Copy Token */ d = LEN_LN_RE[mlen]; if(d <= 22) bl = write_bits_8(out, bl, bitswap8[d+1]>>1) - 1; else { write_bits_8(out, bl, 3); bl += 5; write_bits_8(out, bl, bitswap8[d-23]>>5); bl += 3; } var len_eb = (d < 8) ? 0 : ((d - 4)>>2); if(len_eb > 0) { write_bits_16(out, bl, mlen - LEN_LN[d]); bl += len_eb; } d = DST_LN_RE[boff - match]; bl = write_bits_8(out, bl, bitswap8[d]>>3); bl -= 3; var dst_eb = d < 4 ? 0 : (d-2)>>1; if(dst_eb > 0) { write_bits_16(out, bl, boff - match - DST_LN[d]); bl += dst_eb; } for(var q = 0; q < mlen; ++q) { addrs[hash] = boff & 0x7FFF; hash = ((hash << 5) ^ data[boff]) & 0x7FFF; ++boff; } L-= mlen - 1; } else { /* Literal Token */ if(d <= 143) d = d + 48; else bl = write_bits_1(out, bl, 1); bl = write_bits_8(out, bl, bitswap8[d]); addrs[hash] = boff & 0x7FFF; ++boff; } } bl = write_bits_8(out, bl, 0) - 1; } out.l = ((bl + 7)/8)|0; return out.l; } return function _deflateRaw(data, out) { if(data.length < 8) return write_stored(data, out); return write_huff_fixed(data, out); }; })(); function _deflate(data) { var buf = new_buf(50+Math.floor(data.length*1.1)); var off = _deflateRaw(data, buf); return buf.slice(0, off); } /* modified inflate function also moves original read head */ var dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768); var dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768); var dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128); var dyn_len_1 = 1, dyn_len_2 = 1; /* 5.5.3 Expanding Huffman Codes */ function dyn(data, boff/*:number*/) { /* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */ var _HLIT = read_bits_5(data, boff) + 257; boff += 5; var _HDIST = read_bits_5(data, boff) + 1; boff += 5; var _HCLEN = read_bits_4(data, boff) + 4; boff += 4; var w = 0; /* grab and store code lengths */ var clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19); var ctree = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; var maxlen = 1; var bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8); var next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8); var L = clens.length; /* 19 */ for(var i = 0; i < _HCLEN; ++i) { clens[CLEN_ORDER[i]] = w = read_bits_3(data, boff); if(maxlen < w) maxlen = w; bl_count[w]++; boff += 3; } /* build code tree */ var ccode = 0; bl_count[0] = 0; for(i = 1; i <= maxlen; ++i) next_code[i] = ccode = (ccode + bl_count[i-1])<<1; for(i = 0; i < L; ++i) if((ccode = clens[i]) != 0) ctree[i] = next_code[ccode]++; /* cmap[7 bits from stream] = (off&7) + (lit<<3) */ var cleni = 0; for(i = 0; i < L; ++i) { cleni = clens[i]; if(cleni != 0) { ccode = bitswap8[ctree[i]]>>(8-cleni); for(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<*/ = []; maxlen = 1; for(; hcodes.length < _HLIT + _HDIST;) { ccode = dyn_cmap[read_bits_7(data, boff)]; boff += ccode & 7; switch((ccode >>>= 3)) { case 16: w = 3 + read_bits_2(data, boff); boff += 2; ccode = hcodes[hcodes.length - 1]; while(w-- > 0) hcodes.push(ccode); break; case 17: w = 3 + read_bits_3(data, boff); boff += 3; while(w-- > 0) hcodes.push(0); break; case 18: w = 11 + read_bits_7(data, boff); boff += 7; while(w -- > 0) hcodes.push(0); break; default: hcodes.push(ccode); if(maxlen < ccode) maxlen = ccode; break; } } /* build literal / length trees */ var h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT); for(i = _HLIT; i < 286; ++i) h1[i] = 0; for(i = _HDIST; i < 30; ++i) h2[i] = 0; dyn_len_1 = build_tree(h1, dyn_lmap, 286); dyn_len_2 = build_tree(h2, dyn_dmap, 30); return boff; } /* return [ data, bytesRead ] */ function inflate(data, usz/*:number*/) { /* shortcircuit for empty buffer [0x03, 0x00] */ if(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; } /* bit offset */ var boff = 0; /* header includes final bit and type bits */ var header = 0; var outbuf = new_unsafe_buf(usz ? usz : (1<<18)); var woff = 0; var OL = outbuf.length>>>0; var max_len_1 = 0, max_len_2 = 0; while((header&1) == 0) { header = read_bits_3(data, boff); boff += 3; if((header >>> 1) == 0) { /* Stored block */ if(boff & 7) boff += 8 - (boff&7); /* 2 bytes sz, 2 bytes bit inverse */ var sz = data[boff>>>3] | data[(boff>>>3)+1]<<8; boff += 32; /* push sz bytes */ if(sz > 0) { if(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; } while(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; } } continue; } else if((header >> 1) == 1) { /* Fixed Huffman */ max_len_1 = 9; max_len_2 = 5; } else { /* Dynamic Huffman */ boff = dyn(data, boff); max_len_1 = dyn_len_1; max_len_2 = dyn_len_2; } for(;;) { // while(true) is apparently out of vogue in modern JS circles if(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; } /* ingest code and move read head */ var bits = read_bits_n(data, boff, max_len_1); var code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits]; boff += code & 15; code >>>= 4; /* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */ if(((code>>>8)&0xFF) === 0) outbuf[woff++] = code; else if(code == 256) break; else { code -= 257; var len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0; var tgt = woff + LEN_LN[code]; /* length extra bits */ if(len_eb > 0) { tgt += read_bits_n(data, boff, len_eb); boff += len_eb; } /* dist code */ bits = read_bits_n(data, boff, max_len_2); code = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits]; boff += code & 15; code >>>= 4; var dst_eb = (code < 4 ? 0 : (code-2)>>1); var dst = DST_LN[code]; /* dist extra bits */ if(dst_eb > 0) { dst += read_bits_n(data, boff, dst_eb); boff += dst_eb; } /* in the common case, manual byte copy is faster than TA set / Buffer copy */ if(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt + 100); OL = outbuf.length; } while(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; } } } } if(usz) return [outbuf, (boff+7)>>>3]; return [outbuf.slice(0, woff), (boff+7)>>>3]; } function _inflate(payload, usz) { var data = payload.slice(payload.l||0); var out = inflate(data, usz); payload.l += out[1]; return out[0]; } function warn_or_throw(wrn, msg) { if(wrn) { if(typeof console !== 'undefined') console.error(msg); } else throw new Error(msg); } function parse_zip(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ { var blob/*:CFBlob*/ = /*::(*/file/*:: :any)*/; prep_blob(blob, 0); var FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = []; var o = { FileIndex: FileIndex, FullPaths: FullPaths }; init_cfb(o, { root: options.root }); /* find end of central directory, start just after signature */ var i = blob.length - 4; while((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i; blob.l = i + 4; /* parse end of central directory */ blob.l += 4; var fcnt = blob.read_shift(2); blob.l += 6; var start_cd = blob.read_shift(4); /* parse central directory */ blob.l = start_cd; for(i = 0; i < fcnt; ++i) { /* trust local file header instead of CD entry */ blob.l += 20; var csz = blob.read_shift(4); var usz = blob.read_shift(4); var namelen = blob.read_shift(2); var efsz = blob.read_shift(2); var fcsz = blob.read_shift(2); blob.l += 8; var offset = blob.read_shift(4); var EF = parse_extra_field(/*::(*/blob.slice(blob.l+namelen, blob.l+namelen+efsz)/*:: :any)*/); blob.l += namelen + efsz + fcsz; var L = blob.l; blob.l = offset + 4; parse_local_file(blob, csz, usz, o, EF); blob.l = L; } return o; } /* head starts just after local file header signature */ function parse_local_file(blob/*:CFBlob*/, csz/*:number*/, usz/*:number*/, o/*:CFBContainer*/, EF) { /* [local file header] */ blob.l += 2; var flags = blob.read_shift(2); var meth = blob.read_shift(2); var date = parse_dos_date(blob); if(flags & 0x2041) throw new Error("Unsupported ZIP encryption"); var crc32 = blob.read_shift(4); var _csz = blob.read_shift(4); var _usz = blob.read_shift(4); var namelen = blob.read_shift(2); var efsz = blob.read_shift(2); // TODO: flags & (1<<11) // UTF8 var name = ""; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]); if(efsz) { var ef = parse_extra_field(/*::(*/blob.slice(blob.l, blob.l + efsz)/*:: :any)*/); if((ef[0x5455]||{}).mt) date = ef[0x5455].mt; if(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt; } blob.l += efsz; /* [encryption header] */ /* [file data] */ var data = blob.slice(blob.l, blob.l + _csz); switch(meth) { case 8: data = _inflateRawSync(blob, _usz); break; case 0: break; // TODO: scan for magic number default: throw new Error("Unsupported ZIP Compression method " + meth); } /* [data descriptor] */ var wrn = false; if(flags & 8) { crc32 = blob.read_shift(4); if(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; } _csz = blob.read_shift(4); _usz = blob.read_shift(4); } if(_csz != csz) warn_or_throw(wrn, "Bad compressed size: " + csz + " != " + _csz); if(_usz != usz) warn_or_throw(wrn, "Bad uncompressed size: " + usz + " != " + _usz); //var _crc32 = CRC32.buf(data, 0); //if((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, "Bad CRC32 checksum: " + crc32 + " != " + _crc32); cfb_add(o, name, data, {unsafe: true, mt: date}); } function write_zip(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes*/ { var _opts = options || {}; var out = [], cdirs = []; var o/*:CFBlob*/ = new_buf(1); var method = (_opts.compression ? 8 : 0), flags = 0; var desc = false; if(desc) flags |= 8; var i = 0, j = 0; var start_cd = 0, fcnt = 0; var root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0]; var crcs = []; var sz_cd = 0; for(i = 1; i < cfb.FullPaths.length; ++i) { fp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i]; if(!fi.size || !fi.content || fp == "\u0001Sh33tJ5") continue; var start = start_cd; /* TODO: CP437 filename */ var namebuf = new_buf(fp.length); for(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F); namebuf = namebuf.slice(0, namebuf.l); crcs[fcnt] = CRC32.buf(/*::((*/fi.content/*::||[]):any)*/, 0); var outbuf = fi.content/*::||[]*/; if(method == 8) outbuf = _deflateRawSync(outbuf); /* local file header */ o = new_buf(30); o.write_shift(4, 0x04034b50); o.write_shift(2, 20); o.write_shift(2, flags); o.write_shift(2, method); /* TODO: last mod file time/date */ if(fi.mt) write_dos_date(o, fi.mt); else o.write_shift(4, 0); o.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]); o.write_shift(4, (flags & 8) ? 0 : outbuf.length); o.write_shift(4, (flags & 8) ? 0 : /*::(*/fi.content/*::||[])*/.length); o.write_shift(2, namebuf.length); o.write_shift(2, 0); start_cd += o.length; out.push(o); start_cd += namebuf.length; out.push(namebuf); /* TODO: extra fields? */ /* TODO: encryption header ? */ start_cd += outbuf.length; out.push(outbuf); /* data descriptor */ if(flags & 8) { o = new_buf(12); o.write_shift(-4, crcs[fcnt]); o.write_shift(4, outbuf.length); o.write_shift(4, /*::(*/fi.content/*::||[])*/.length); start_cd += o.l; out.push(o); } /* central directory */ o = new_buf(46); o.write_shift(4, 0x02014b50); o.write_shift(2, 0); o.write_shift(2, 20); o.write_shift(2, flags); o.write_shift(2, method); o.write_shift(4, 0); /* TODO: last mod file time/date */ o.write_shift(-4, crcs[fcnt]); o.write_shift(4, outbuf.length); o.write_shift(4, /*::(*/fi.content/*::||[])*/.length); o.write_shift(2, namebuf.length); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(4, 0); o.write_shift(4, start); sz_cd += o.l; cdirs.push(o); sz_cd += namebuf.length; cdirs.push(namebuf); ++fcnt; } /* end of central directory */ o = new_buf(22); o.write_shift(4, 0x06054b50); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, fcnt); o.write_shift(2, fcnt); o.write_shift(4, sz_cd); o.write_shift(4, start_cd); o.write_shift(2, 0); return bconcat(([bconcat((out/*:any*/)), bconcat(cdirs), o]/*:any*/)); } var ContentTypeMap = ({ "htm": "text/html", "xml": "text/xml", "gif": "image/gif", "jpg": "image/jpeg", "png": "image/png", "mso": "application/x-mso", "thmx": "application/vnd.ms-officetheme", "sh33tj5": "application/octet-stream" }/*:any*/); function get_content_type(fi/*:CFBEntry*/, fp/*:string*/)/*:string*/ { if(fi.ctype) return fi.ctype; var ext = fi.name || "", m = ext.match(/\.([^\.]+)$/); if(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]]; if(fp) { m = (ext = fp).match(/[\.\\]([^\.\\])+$/); if(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]]; } return "application/octet-stream"; } /* 76 character chunks TODO: intertwine encoding */ function write_base64_76(bstr/*:string*/)/*:string*/ { var data = Base64_encode(bstr); var o = []; for(var i = 0; i < data.length; i+= 76) o.push(data.slice(i, i+76)); return o.join("\r\n") + "\r\n"; } /* Rules for QP: - escape =## applies for all non-display characters and literal "=" - space or tab at end of line must be encoded - \r\n newlines can be preserved, but bare \r and \n must be escaped - lines must not exceed 76 characters, use soft breaks =\r\n TODO: Some files from word appear to write line extensions with bare equals: ``` */ = [], split = encoded.split("\r\n"); for(var si = 0; si < split.length; ++si) { var str = split[si]; if(str.length == 0) { o.push(""); continue; } for(var i = 0; i < str.length;) { var end = 76; var tmp = str.slice(i, i + end); if(tmp.charAt(end - 1) == "=") end --; else if(tmp.charAt(end - 2) == "=") end -= 2; else if(tmp.charAt(end - 3) == "=") end -= 3; tmp = str.slice(i, i + end); i += end; if(i < str.length) tmp += "="; o.push(tmp); } } return o.join("\r\n"); } function parse_quoted_printable(data/*:Array*/)/*:RawBytes*/ { var o = []; /* unify long lines */ for(var di = 0; di < data.length; ++di) { var line = data[di]; while(di <= data.length && line.charAt(line.length - 1) == "=") line = line.slice(0, line.length - 1) + data[++di]; o.push(line); } /* decode */ for(var oi = 0; oi < o.length; ++oi) o[oi] = o[oi].replace(/[=][0-9A-Fa-f]{2}/g, function($$) { return String.fromCharCode(parseInt($$.slice(1), 16)); }); return s2a(o.join("\r\n")); } function parse_mime(cfb/*:CFBContainer*/, data/*:Array*/, root/*:string*/)/*:void*/ { var fname = "", cte = "", ctype = "", fdata; var di = 0; for(;di < 10; ++di) { var line = data[di]; if(!line || line.match(/^\s*$/)) break; var m = line.match(/^(.*?):\s*([^\s].*)$/); if(m) switch(m[1].toLowerCase()) { case "content-location": fname = m[2].trim(); break; case "content-type": ctype = m[2].trim(); break; case "content-transfer-encoding": cte = m[2].trim(); break; } } ++di; switch(cte.toLowerCase()) { case 'base64': fdata = s2a(Base64_decode(data.slice(di).join(""))); break; case 'quoted-printable': fdata = parse_quoted_printable(data.slice(di)); break; default: throw new Error("Unsupported Content-Transfer-Encoding " + cte); } var file = cfb_add(cfb, fname.slice(root.length), fdata, {unsafe: true}); if(ctype) file.ctype = ctype; } function parse_mad(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ { if(a2s(file.slice(0,13)).toLowerCase() != "mime-version:") throw new Error("Unsupported MAD header"); var root = (options && options.root || ""); // $FlowIgnore var data = (has_buf && Buffer.isBuffer(file) ? file.toString("binary") : a2s(file)).split("\r\n"); var di = 0, row = ""; /* if root is not specified, scan for the common prefix */ for(di = 0; di < data.length; ++di) { row = data[di]; if(!/^Content-Location:/i.test(row)) continue; row = row.slice(row.indexOf("file")); if(!root) root = row.slice(0, row.lastIndexOf("/") + 1); if(row.slice(0, root.length) == root) continue; while(root.length > 0) { root = root.slice(0, root.length - 1); root = root.slice(0, root.lastIndexOf("/") + 1); if(row.slice(0,root.length) == root) break; } } var mboundary = (data[1] || "").match(/boundary="(.*?)"/); if(!mboundary) throw new Error("MAD cannot find boundary"); var boundary = "--" + (mboundary[1] || ""); var FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = []; var o = { FileIndex: FileIndex, FullPaths: FullPaths }; init_cfb(o); var start_di, fcnt = 0; for(di = 0; di < data.length; ++di) { var line = data[di]; if(line !== boundary && line !== boundary + "--") continue; if(fcnt++) parse_mime(o, data.slice(start_di, di), root); start_di = di; } return o; } function write_mad(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:string*/ { var opts = options || {}; var boundary = opts.boundary || "SheetJS"; boundary = '------=' + boundary; var out = [ 'MIME-Version: 1.0', 'Content-Type: multipart/related; boundary="' + boundary.slice(2) + '"', '', '', '' ]; var root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0]; for(var i = 1; i < cfb.FullPaths.length; ++i) { fp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i]; if(!fi.size || !fi.content || fp == "\u0001Sh33tJ5") continue; /* Normalize filename */ fp = fp.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7E-\xFF]/g, function(c) { return "_x" + c.charCodeAt(0).toString(16) + "_"; }).replace(/[\u0080-\uFFFF]/g, function(u) { return "_u" + u.charCodeAt(0).toString(16) + "_"; }); /* Extract content as binary string */ var ca = fi.content; // $FlowIgnore var cstr = has_buf && Buffer.isBuffer(ca) ? ca.toString("binary") : a2s(ca); /* 4/5 of first 1024 chars ascii -> quoted printable, else base64 */ var dispcnt = 0, L = Math.min(1024, cstr.length), cc = 0; for(var csl = 0; csl <= L; ++csl) if((cc=cstr.charCodeAt(csl)) >= 0x20 && cc < 0x80) ++dispcnt; var qp = dispcnt >= L * 4 / 5; out.push(boundary); out.push('Content-Location: ' + (opts.root || 'file:///C:/SheetJS/') + fp); out.push('Content-Transfer-Encoding: ' + (qp ? 'quoted-printable' : 'base64')); out.push('Content-Type: ' + get_content_type(fi, fp)); out.push(''); out.push(qp ? write_quoted_printable(cstr) : write_base64_76(cstr)); } out.push(boundary + '--\r\n'); return out.join("\r\n"); } function cfb_new(opts/*:?any*/)/*:CFBContainer*/ { var o/*:CFBContainer*/ = ({}/*:any*/); init_cfb(o, opts); return o; } function cfb_add(cfb/*:CFBContainer*/, name/*:string*/, content/*:?RawBytes*/, opts/*:?any*/)/*:CFBEntry*/ { var unsafe = opts && opts.unsafe; if(!unsafe) init_cfb(cfb); var file = !unsafe && CFB.find(cfb, name); if(!file) { var fpath/*:string*/ = cfb.FullPaths[0]; if(name.slice(0, fpath.length) == fpath) fpath = name; else { if(fpath.slice(-1) != "/") fpath += "/"; fpath = (fpath + name).replace("//","/"); } file = ({name: filename(name), type: 2}/*:any*/); cfb.FileIndex.push(file); cfb.FullPaths.push(fpath); if(!unsafe) CFB.utils.cfb_gc(cfb); } /*:: if(!file) throw new Error("unreachable"); */ file.content = (content/*:any*/); file.size = content ? content.length : 0; if(opts) { if(opts.CLSID) file.clsid = opts.CLSID; if(opts.mt) file.mt = opts.mt; if(opts.ct) file.ct = opts.ct; } return file; } function cfb_del(cfb/*:CFBContainer*/, name/*:string*/)/*:boolean*/ { init_cfb(cfb); var file = CFB.find(cfb, name); if(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) { cfb.FileIndex.splice(j, 1); cfb.FullPaths.splice(j, 1); return true; } return false; } function cfb_mov(cfb/*:CFBContainer*/, old_name/*:string*/, new_name/*:string*/)/*:boolean*/ { init_cfb(cfb); var file = CFB.find(cfb, old_name); if(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) { cfb.FileIndex[j].name = filename(new_name); cfb.FullPaths[j] = new_name; return true; } return false; } function cfb_gc(cfb/*:CFBContainer*/)/*:void*/ { rebuild_cfb(cfb, true); } exports.find = find; exports.read = read; exports.parse = parse; exports.write = write; exports.writeFile = write_file; exports.utils = { cfb_new: cfb_new, cfb_add: cfb_add, cfb_del: cfb_del, cfb_mov: cfb_mov, cfb_gc: cfb_gc, ReadShift: ReadShift, CheckField: CheckField, prep_blob: prep_blob, bconcat: bconcat, use_zlib: use_zlib, _deflateRaw: _deflate, _inflateRaw: _inflate, consts: consts }; return exports; })(); let _fs = void 0; function set_fs(fs) { _fs = fs; } /* normalize data for blob ctor */ function blobify(data) { if(typeof data === "string") return s2ab(data); if(Array.isArray(data)) return a2u(data); return data; } /* write or download file */ function write_dl(fname/*:string*/, payload/*:any*/, enc/*:?string*/) { /*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */ if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload); if(typeof Deno !== 'undefined') { /* in this spot, it's safe to assume typed arrays and TextEncoder/TextDecoder exist */ if(enc && typeof payload == "string") switch(enc) { case "utf8": payload = new TextEncoder(enc).encode(payload); break; case "binary": payload = s2ab(payload); break; /* TODO: binary equivalent */ default: throw new Error("Unsupported encoding " + enc); } return Deno.writeFileSync(fname, payload); } var data = (enc == "utf8") ? utf8write(payload) : payload; /*:: declare var IE_SaveFile: any; */ if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname); if(typeof Blob !== 'undefined') { var blob = new Blob([blobify(data)], {type:"application/octet-stream"}); /*:: declare var navigator: any; */ if(typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname); /*:: declare var saveAs: any; */ if(typeof saveAs !== 'undefined') return saveAs(blob, fname); if(typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) { var url = URL.createObjectURL(blob); /*:: declare var chrome: any; */ if(typeof chrome === 'object' && typeof (chrome.downloads||{}).download == "function") { if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000); return chrome.downloads.download({ url: url, filename: fname, saveAs: true}); } var a = document.createElement("a"); if(a.download != null) { /*:: if(document.body == null) throw new Error("unreachable"); */ a.download = fname; a.href = url; document.body.appendChild(a); a.click(); /*:: if(document.body == null) throw new Error("unreachable"); */ document.body.removeChild(a); if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000); return url; } } } // $FlowIgnore if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript // $FlowIgnore var out = File(fname); out.open("w"); out.encoding = "binary"; if(Array.isArray(payload)) payload = a2s(payload); out.write(payload); out.close(); return payload; } catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } throw new Error("cannot save file " + fname); } /* read binary data from file */ function read_binary(path/*:string*/) { if(typeof _fs !== 'undefined') return _fs.readFileSync(path); if(typeof Deno !== 'undefined') return Deno.readFileSync(path); // $FlowIgnore if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript // $FlowIgnore var infile = File(path); infile.open("r"); infile.encoding = "binary"; var data = infile.read(); infile.close(); return data; } catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } throw new Error("Cannot access file " + path); } function keys(o/*:any*/)/*:Array*/ { var ks = Object.keys(o), o2 = []; for(var i = 0; i < ks.length; ++i) if(Object.prototype.hasOwnProperty.call(o, ks[i])) o2.push(ks[i]); return o2; } function evert_key(obj/*:any*/, key/*:string*/)/*:EvertType*/ { var o = ([]/*:any*/), K = keys(obj); for(var i = 0; i !== K.length; ++i) if(o[obj[K[i]][key]] == null) o[obj[K[i]][key]] = K[i]; return o; } function evert(obj/*:any*/)/*:EvertType*/ { var o = ([]/*:any*/), K = keys(obj); for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i]; return o; } function evert_num(obj/*:any*/)/*:EvertNumType*/ { var o = ([]/*:any*/), K = keys(obj); for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10); return o; } function evert_arr(obj/*:any*/)/*:EvertArrType*/ { var o/*:EvertArrType*/ = ([]/*:any*/), K = keys(obj); for(var i = 0; i !== K.length; ++i) { if(o[obj[K[i]]] == null) o[obj[K[i]]] = []; o[obj[K[i]]].push(K[i]); } return o; } var basedate = /*#__PURE__*/new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 function datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { var epoch = /*#__PURE__*/v.getTime(); if(date1904) epoch -= 1462*24*60*60*1000; var dnthresh = /*#__PURE__*/basedate.getTime() + (/*#__PURE__*/v.getTimezoneOffset() - /*#__PURE__*/basedate.getTimezoneOffset()) * 60000; return (epoch - dnthresh) / (24 * 60 * 60 * 1000); } var refdate = /*#__PURE__*/new Date(); var dnthresh = /*#__PURE__*/basedate.getTime() + (/*#__PURE__*/refdate.getTimezoneOffset() - /*#__PURE__*/basedate.getTimezoneOffset()) * 60000; var refoffset = /*#__PURE__*/refdate.getTimezoneOffset(); function numdate(v/*:number*/)/*:Date*/ { var out = new Date(); out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh); if (out.getTimezoneOffset() !== refoffset) { out.setTime(out.getTime() + (out.getTimezoneOffset() - refoffset) * 60000); } return out; } /* ISO 8601 Duration */ function parse_isodur(s) { var sec = 0, mt = 0, time = false; var m = s.match(/P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/); if(!m) throw new Error("|" + s + "| is not an ISO8601 Duration"); for(var i = 1; i != m.length; ++i) { if(!m[i]) continue; mt = 1; if(i > 3) time = true; switch(m[i].slice(m[i].length-1)) { case 'Y': throw new Error("Unsupported ISO Duration Field: " + m[i].slice(m[i].length-1)); case 'D': mt *= 24; /* falls through */ case 'H': mt *= 60; /* falls through */ case 'M': if(!time) throw new Error("Unsupported ISO Duration Field: M"); else mt *= 60; /* falls through */ case 'S': break; } sec += mt * parseInt(m[i], 10); } return sec; } var good_pd_date_1 = /*#__PURE__*/new Date('2017-02-19T19:06:09.000Z'); var good_pd_date = /*#__PURE__*/isNaN(/*#__PURE__*/good_pd_date_1.getFullYear()) ? /*#__PURE__*/new Date('2/19/17') : good_pd_date_1; var good_pd = /*#__PURE__*/good_pd_date.getFullYear() == 2017; /* parses a date as a local date */ function parseDate(str/*:string|Date*/, fixdate/*:?number*/)/*:Date*/ { var d = new Date(str); if(good_pd) { /*:: if(fixdate == null) fixdate = 0; */ if(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000); else if(fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000); return d; } if(str instanceof Date) return str; if(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) { var s = d.getFullYear(); if(str.indexOf("" + s) > -1) return d; d.setFullYear(d.getFullYear() + 100); return d; } var n = str.match(/\d+/g)||["2017","2","19","0","0","0"]; var out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0)); if(str.indexOf("Z") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000); return out; } function cc2str(arr/*:Array*/, debomit)/*:string*/ { if(has_buf && Buffer.isBuffer(arr)) { if(debomit) { if(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(arr.slice(2).toString("utf16le")); if(arr[1] == 0xFE && arr[2] == 0xFF) return utf8write(utf16beread(arr.slice(2).toString("binary"))); } return arr.toString("binary"); } if(typeof TextDecoder !== "undefined") try { if(debomit) { if(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(new TextDecoder("utf-16le").decode(arr.slice(2))); if(arr[0] == 0xFE && arr[1] == 0xFF) return utf8write(new TextDecoder("utf-16be").decode(arr.slice(2))); } var rev = { "\u20ac": "\x80", "\u201a": "\x82", "\u0192": "\x83", "\u201e": "\x84", "\u2026": "\x85", "\u2020": "\x86", "\u2021": "\x87", "\u02c6": "\x88", "\u2030": "\x89", "\u0160": "\x8a", "\u2039": "\x8b", "\u0152": "\x8c", "\u017d": "\x8e", "\u2018": "\x91", "\u2019": "\x92", "\u201c": "\x93", "\u201d": "\x94", "\u2022": "\x95", "\u2013": "\x96", "\u2014": "\x97", "\u02dc": "\x98", "\u2122": "\x99", "\u0161": "\x9a", "\u203a": "\x9b", "\u0153": "\x9c", "\u017e": "\x9e", "\u0178": "\x9f" }; if(Array.isArray(arr)) arr = new Uint8Array(arr); return new TextDecoder("latin1").decode(arr).replace(/[€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ]/g, function(c) { return rev[c] || c; }); } catch(e) {} var o = []; for(var i = 0; i != arr.length; ++i) o.push(String.fromCharCode(arr[i])); return o.join(""); } function dup(o/*:any*/)/*:any*/ { if(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o)); if(typeof o != 'object' || o == null) return o; if(o instanceof Date) return new Date(o.getTime()); var out = {}; for(var k in o) if(Object.prototype.hasOwnProperty.call(o, k)) out[k] = dup(o[k]); return out; } function fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = ""; while(o.length < l) o+=c; return o; } /* TODO: stress test */ function fuzzynum(s/*:string*/)/*:number*/ { var v/*:number*/ = Number(s); if(!isNaN(v)) return isFinite(v) ? v : NaN; if(!/\d/.test(s)) return v; var wt = 1; var ss = s.replace(/([\d]),([\d])/g,"$1$2").replace(/[$]/g,"").replace(/[%]/g, function() { wt *= 100; return "";}); if(!isNaN(v = Number(ss))) return v / wt; ss = ss.replace(/[(](.*)[)]/,function($$, $1) { wt = -wt; return $1;}); if(!isNaN(v = Number(ss))) return v / wt; return v; } var lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; function fuzzydate(s/*:string*/)/*:Date*/ { var o = new Date(s), n = new Date(NaN); var y = o.getYear(), m = o.getMonth(), d = o.getDate(); if(isNaN(d)) return n; var lower = s.toLowerCase(); if(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) { lower = lower.replace(/[^a-z]/g,"").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,""); if(lower.length > 3 && lower_months.indexOf(lower) == -1) return n; } else if(lower.match(/[a-z]/)) return n; if(y < 0 || y > 8099) return n; if((m > 0 || d > 1) && y != 101) return o; if(s.match(/[^-0-9:,\/\\]/)) return n; return o; } var split_regex = /*#__PURE__*/(function() { var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5; return function split_regex(str/*:string*/, re, def/*:string*/)/*:Array*/ { if(safe_split_regex || typeof re == "string") return str.split(re); var p = str.split(re), o = [p[0]]; for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); } return o; }; })(); function getdatastr(data)/*:?string*/ { if(!data) return null; if(data.content && data.type) return cc2str(data.content, true); if(data.data) return debom(data.data); if(data.asNodeBuffer && has_buf) return debom(data.asNodeBuffer().toString('binary')); if(data.asBinary) return debom(data.asBinary()); if(data._data && data._data.getContent) return debom(cc2str(Array.prototype.slice.call(data._data.getContent(),0))); return null; } function getdatabin(data) { if(!data) return null; if(data.data) return char_codes(data.data); if(data.asNodeBuffer && has_buf) return data.asNodeBuffer(); if(data._data && data._data.getContent) { var o = data._data.getContent(); if(typeof o == "string") return char_codes(o); return Array.prototype.slice.call(o); } if(data.content && data.type) return data.content; return null; } function getdata(data) { return (data && data.name.slice(-4) === ".bin") ? getdatabin(data) : getdatastr(data); } /* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */ /* OASIS does not comment on filename case sensitivity */ function safegetzipfile(zip, file/*:string*/) { var k = zip.FullPaths || keys(zip.files); var f = file.toLowerCase().replace(/[\/]/g, '\\'), g = f.replace(/\\/g,'\/'); for(var i=0; i\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g; var tagregex1=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg, tagregex2 = /<[^>]*>/g; var tagregex = /*#__PURE__*/XML_HEADER.match(tagregex1) ? tagregex1 : tagregex2; var nsregex=/<\w*:/, nsregex2 = /<(\/?)\w+:/; function parsexmltag(tag/*:string*/, skip_root/*:?boolean*/, skip_LC/*:?boolean*/)/*:any*/ { var z = ({}/*:any*/); var eq = 0, c = 0; for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break; if(!skip_root) z[0] = tag.slice(0, eq); if(eq === tag.length) return z; var m = tag.match(attregexg), j=0, v="", i=0, q="", cc="", quot = 1; if(m) for(i = 0; i != m.length; ++i) { cc = m[i]; for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break; q = cc.slice(0,c).trim(); while(cc.charCodeAt(c+1) == 32) ++c; quot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0; v = cc.slice(c+1+quot, cc.length-quot); for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break; if(j===q.length) { if(q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods z[q] = v; if(!skip_LC) z[q.toLowerCase()] = v; } else { var k = (j===5 && q.slice(0,5)==="xmlns"?"xmlns":"")+q.slice(j+1); if(z[k] && q.slice(j-3,j) == "ext") continue; // from ods z[k] = v; if(!skip_LC) z[k.toLowerCase()] = v; } } return z; } function strip_ns(x/*:string*/)/*:string*/ { return x.replace(nsregex2, "<$1"); } var encodings = { '"': '"', ''': "'", '>': '>', '<': '<', '&': '&' }; var rencoding = /*#__PURE__*/evert(encodings); //var rencstr = "&<>'\"".split(""); // TODO: CP remap (need to read file version to determine OS) var unescapexml/*:StringConv*/ = /*#__PURE__*/(function() { /* 22.4.2.4 bstr (Basic String) */ var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig, coderegex = /_x([\da-fA-F]{4})_/ig; return function unescapexml(text/*:string*/)/*:string*/ { var s = text + '', i = s.indexOf("-1?16:10))||$$; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));}); var j = s.indexOf("]]>"); return unescapexml(s.slice(0, i)) + s.slice(i+9,j) + unescapexml(s.slice(j+3)); }; })(); var decregex=/[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g; function escapexml(text/*:string*/)/*:string*/{ var s = text + ''; return s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return "_x" + ("000"+s.charCodeAt(0).toString(16)).slice(-4) + "_";}); } function escapexmltag(text/*:string*/)/*:string*/{ return escapexml(text).replace(/ /g,"_x0020_"); } var htmlcharegex = /[\u0000-\u001f]/g; function escapehtml(text/*:string*/)/*:string*/{ var s = text + ''; return s.replace(decregex, function(y) { return rencoding[y]; }).replace(/\n/g, "
").replace(htmlcharegex,function(s) { return "&#x" + ("000"+s.charCodeAt(0).toString(16)).slice(-4) + ";"; }); } function escapexlml(text/*:string*/)/*:string*/{ var s = text + ''; return s.replace(decregex, function(y) { return rencoding[y]; }).replace(htmlcharegex,function(s) { return "&#x" + (s.charCodeAt(0).toString(16)).toUpperCase() + ";"; }); } /* TODO: handle codepages */ var xlml_fixstr/*:StringConv*/ = /*#__PURE__*/(function() { var entregex = /&#(\d+);/g; function entrepl($$/*:string*/,$1/*:string*/)/*:string*/ { return String.fromCharCode(parseInt($1,10)); } return function xlml_fixstr(str/*:string*/)/*:string*/ { return str.replace(entregex,entrepl); }; })(); function xlml_unfixstr(str/*:string*/)/*:string*/ { return str.replace(/(\r\n|[\r\n])/g,"\ "); } function parsexmlbool(value/*:any*/)/*:boolean*/ { switch(value) { case 1: case true: case '1': case 'true': case 'TRUE': return true; /* case '0': case 'false': case 'FALSE':*/ default: return false; } } function utf8reada(orig/*:string*/)/*:string*/ { var out = "", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0; while (i < orig.length) { c = orig.charCodeAt(i++); if (c < 128) { out += String.fromCharCode(c); continue; } d = orig.charCodeAt(i++); if (c>191 && c<224) { f = ((c & 31) << 6); f |= (d & 63); out += String.fromCharCode(f); continue; } e = orig.charCodeAt(i++); if (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; } f = orig.charCodeAt(i++); w = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536; out += String.fromCharCode(0xD800 + ((w>>>10)&1023)); out += String.fromCharCode(0xDC00 + (w&1023)); } return out; } function utf8readb(data) { var out = new_raw_buf(2*data.length), w, i, j = 1, k = 0, ww=0, c; for(i = 0; i < data.length; i+=j) { j = 1; if((c=data.charCodeAt(i)) < 128) w = c; else if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; } else if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; } else { j = 4; w = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63); w -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023); } if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; } out[k++] = w%256; out[k++] = w>>>8; } return out.slice(0,k).toString('ucs2'); } function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); } var utf8corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3"; var utf8read = has_buf && (/*#__PURE__*/utf8readc(utf8corpus) == /*#__PURE__*/utf8reada(utf8corpus) && utf8readc || /*#__PURE__*/utf8readb(utf8corpus) == /*#__PURE__*/utf8reada(utf8corpus) && utf8readb) || utf8reada; var utf8write/*:StringConv*/ = has_buf ? function(data) { return Buffer_from(data, 'utf8').toString("binary"); } : function(orig/*:string*/)/*:string*/ { var out/*:Array*/ = [], i = 0, c = 0, d = 0; while(i < orig.length) { c = orig.charCodeAt(i++); switch(true) { case c < 128: out.push(String.fromCharCode(c)); break; case c < 2048: out.push(String.fromCharCode(192 + (c >> 6))); out.push(String.fromCharCode(128 + (c & 63))); break; case c >= 55296 && c < 57344: c -= 55296; d = orig.charCodeAt(i++) - 56320 + (c<<10); out.push(String.fromCharCode(240 + ((d >>18) & 7))); out.push(String.fromCharCode(144 + ((d >>12) & 63))); out.push(String.fromCharCode(128 + ((d >> 6) & 63))); out.push(String.fromCharCode(128 + (d & 63))); break; default: out.push(String.fromCharCode(224 + (c >> 12))); out.push(String.fromCharCode(128 + ((c >> 6) & 63))); out.push(String.fromCharCode(128 + (c & 63))); } } return out.join(""); }; // matches ... extracts content var matchtag = /*#__PURE__*/(function() { var mtcache/*:{[k:string]:RegExp}*/ = ({}/*:any*/); return function matchtag(f/*:string*/,g/*:?string*/)/*:RegExp*/ { var t = f+"|"+(g||""); if(mtcache[t]) return mtcache[t]; return (mtcache[t] = new RegExp('<(?:\\w+:)?'+f+'(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)',((g||"")/*:any*/))); }; })(); var htmldecode/*:{(s:string):string}*/ = /*#__PURE__*/(function() { var entities/*:Array<[RegExp, string]>*/ = [ ['nbsp', ' '], ['middot', '·'], ['quot', '"'], ['apos', "'"], ['gt', '>'], ['lt', '<'], ['amp', '&'] ].map(function(x/*:[string, string]*/) { return [new RegExp('&' + x[0] + ';', "ig"), x[1]]; }); return function htmldecode(str/*:string*/)/*:string*/ { var o = str // Remove new lines and spaces from start of content .replace(/^[\t\n\r ]+/, "") // Remove new lines and spaces from end of content .replace(/[\t\n\r ]+$/,"") // Added line which removes any white space characters after and before html tags .replace(/>\s+/g,">").replace(/\s+ tags with new lines .replace(/<\s*[bB][rR]\s*\/?>/g,"\n") // Strip HTML elements .replace(/<[^>]*>/g,""); for(var i = 0; i < entities.length; ++i) o = o.replace(entities[i][0], entities[i][1]); return o; }; })(); var vtregex = /*#__PURE__*/(function(){ var vt_cache = {}; return function vt_regex(bt) { if(vt_cache[bt] !== undefined) return vt_cache[bt]; return (vt_cache[bt] = new RegExp("<(?:vt:)?" + bt + ">([\\s\\S]*?)", 'g') ); };})(); var vtvregex = /<\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)*/ { var h = parsexmltag(data); var matches/*:Array*/ = data.match(vtregex(h.baseType))||[]; var res/*:Array*/ = []; if(matches.length != h.size) { if(opts.WTF) throw new Error("unexpected vector length " + matches.length + " != " + h.size); return res; } matches.forEach(function(x/*:string*/) { var v = x.replace(vtvregex,"").match(vtmregex); if(v) res.push({v:utf8read(v[2]), t:v[1]}); }); return res; } var wtregex = /(^\s|\s$|\n)/; function writetag(f/*:string*/,g/*:string*/)/*:string*/ { return '<' + f + (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + ''; } function wxt_helper(h)/*:string*/ { return keys(h).map(function(k) { return " " + k + '="' + h[k] + '"';}).join(""); } function writextag(f/*:string*/,g/*:?string*/,h) { return '<' + f + ((h != null) ? wxt_helper(h) : "") + ((g != null) ? (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '';} function write_w3cdtf(d/*:Date*/, t/*:?boolean*/)/*:string*/ { try { return d.toISOString().replace(/\.\d*/,""); } catch(e) { if(t) throw e; } return ""; } function write_vt(s, xlsx/*:?boolean*/)/*:string*/ { switch(typeof s) { case 'string': var o = writextag('vt:lpwstr', escapexml(s)); if(xlsx) o = o.replace(/"/g, "_x0022_"); return o; case 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', escapexml(String(s))); case 'boolean': return writextag('vt:bool',s?'true':'false'); } if(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s)); throw new Error("Unable to serialize " + s); } function xlml_normalize(d)/*:string*/ { if(has_buf &&/*::typeof Buffer !== "undefined" && d != null && d instanceof Buffer &&*/ Buffer.isBuffer(d)) return d.toString('utf8'); if(typeof d === 'string') return d; /* duktape */ if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d))); throw new Error("Bad input format: expected Buffer or string"); } /* UOS uses CJK in tags */ var xlmlregex = /<(\/?)([^\s?>:\/]+)(?:[\s?:\/][^>]*)?>/mg; //var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg; var XMLNS = ({ CORE_PROPS: 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', CUST_PROPS: "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties", EXT_PROPS: "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties", CT: 'http://schemas.openxmlformats.org/package/2006/content-types', RELS: 'http://schemas.openxmlformats.org/package/2006/relationships', TCMNT: 'http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments', 'dc': 'http://purl.org/dc/elements/1.1/', 'dcterms': 'http://purl.org/dc/terms/', 'dcmitype': 'http://purl.org/dc/dcmitype/', 'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main', 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', 'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties', 'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'xsd': 'http://www.w3.org/2001/XMLSchema' }/*:any*/); var XMLNS_main = [ 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', 'http://purl.oclc.org/ooxml/spreadsheetml/main', 'http://schemas.microsoft.com/office/excel/2006/main', 'http://schemas.microsoft.com/office/excel/2006/2' ]; var XLMLNS = ({ 'o': 'urn:schemas-microsoft-com:office:office', 'x': 'urn:schemas-microsoft-com:office:excel', 'ss': 'urn:schemas-microsoft-com:office:spreadsheet', 'dt': 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882', 'mv': 'http://macVmlSchemaUri', 'v': 'urn:schemas-microsoft-com:vml', 'html': 'http://www.w3.org/TR/REC-html40' }/*:any*/); function read_double_le(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { var s = 1 - 2 * (b[idx + 7] >>> 7); var e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f); var m = (b[idx+6]&0x0f); for(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i]; if(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN; if(e == 0) e = -1022; else { e -= 1023; m += Math.pow(2,52); } return s * Math.pow(2, e - 52) * m; } function write_double_le(b/*:RawBytes|CFBlob*/, v/*:number*/, idx/*:number*/) { var bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0; var av = bs ? (-v) : v; if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } else if(av == 0) e = m = 0; else { e = Math.floor(Math.log(av) / Math.LN2); m = av * Math.pow(2, 52 - e); if((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; } else { m -= Math.pow(2,52); e+=1023; } } for(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff; b[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf); b[idx + 7] = (e >> 4) | bs; } var ___toBuffer = function(bufs/*:Array >*/)/*:RawBytes*/ { var x=[],w=10240; for(var i=0;i 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0].map(function(x) { return Buffer.isBuffer(x) ? x : Buffer_from(x); })) : ___toBuffer(bufs);} : ___toBuffer; var ___utf16le = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/)/*:string*/ { var ss/*:Array*/=[]; for(var i=s; i*/=[]; for(var i=s; i 0 ? __utf8(b, i+4,i+4+len-1) : "";}; var __lpstr = ___lpstr; var ___cpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";}; var __cpstr = ___cpstr; var ___lpwstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";}; var __lpwstr = ___lpwstr; var ___lpp4 = function lpp4_(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : "";}; var __lpp4 = ___lpp4; var ___8lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : "";}; var __8lpp4 = ___8lpp4; var ___double = function(b/*:RawBytes|CFBlob*/, idx/*:number*/) { return read_double_le(b, idx);}; var __double = ___double; var is_buf = function is_buf_a(a) { return Array.isArray(a) || (typeof Uint8Array !== "undefined" && a instanceof Uint8Array); }; if(has_buf/*:: && typeof Buffer !== 'undefined'*/) { __lpstr = function lpstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : "";}; __cpstr = function cpstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___cpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : "";}; __lpwstr = function lpwstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);}; __lpp4 = function lpp4_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len);}; __8lpp4 = function lpp4_8b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___8lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf8',i+4,i+4+len);}; __double = function double_(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(Buffer.isBuffer(b)/*::&& b instanceof Buffer*/) return b.readDoubleLE(i); return ___double(b,i); }; is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a) || (typeof Uint8Array !== "undefined" && a instanceof Uint8Array); }; } /* from js-xls */ function cpdoit() { __utf16le = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/) { return $cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); }; __utf8 = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/) { return $cptable.utils.decode(65001, b.slice(s,e)); }; __lpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(current_ansi, b.slice(i+4, i+4+len-1)) : "";}; __cpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(current_codepage, b.slice(i+4, i+4+len-1)) : "";}; __lpwstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = 2*__readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(1200, b.slice(i+4,i+4+len-1)) : "";}; __lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : "";}; __8lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : "";}; } if(typeof $cptable !== 'undefined') cpdoit(); var __readUInt8 = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx]; }; var __readUInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+1]*(1<<8))+b[idx]; }; var __readInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); }; var __readUInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; }; var __readInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; }; var __readInt32BE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; }; function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ { var o="", oI/*:: :number = 0*/, oR, oo=[], w, vv, i, loc; switch(t) { case 'dbcs': loc = this.l; if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le"); else for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } size *= 2; break; case 'utf8': o = __utf8(this, this.l, this.l + size); break; case 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break; case 'wstr': if(typeof $cptable !== 'undefined') o = $cptable.utils.decode(current_codepage, this.slice(this.l, this.l+2*size)); else return ReadShift.call(this, size, 'dbcs'); size = 2 * size; break; /* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */ case 'lpstr-ansi': o = __lpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break; case 'lpstr-cp': o = __cpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break; /* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */ case 'lpwstr': o = __lpwstr(this, this.l); size = 4 + 2 * __readUInt32LE(this, this.l); break; /* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */ case 'lpp4': size = 4 + __readUInt32LE(this, this.l); o = __lpp4(this, this.l); if(size & 0x02) size += 2; break; /* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */ case '8lpp4': size = 4 + __readUInt32LE(this, this.l); o = __8lpp4(this, this.l); if(size & 0x03) size += 4 - (size & 0x03); break; case 'cstr': size = 0; o = ""; while((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w)); o = oo.join(""); break; case '_wstr': size = 0; o = ""; while((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;} size+=2; o = oo.join(""); break; /* sbcs and dbcs support continue records in the SST way TODO codepages */ case 'dbcs-cont': o = ""; loc = this.l; for(i = 0; i < size; ++i) { if(this.lens && this.lens.indexOf(loc) !== -1) { w = __readUInt8(this, loc); this.l = loc + 1; vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont'); return oo.join("") + vv; } oo.push(_getchar(__readUInt16LE(this, loc))); loc+=2; } o = oo.join(""); size *= 2; break; case 'cpstr': if(typeof $cptable !== 'undefined') { o = $cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size)); break; } /* falls through */ case 'sbcs-cont': o = ""; loc = this.l; for(i = 0; i != size; ++i) { if(this.lens && this.lens.indexOf(loc) !== -1) { w = __readUInt8(this, loc); this.l = loc + 1; vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont'); return oo.join("") + vv; } oo.push(_getchar(__readUInt8(this, loc))); loc+=1; } o = oo.join(""); break; default: switch(size) { case 1: oI = __readUInt8(this, this.l); this.l++; return oI; case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI; case 4: case -4: if(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } else { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR; case 8: case -8: if(t === 'f') { if(size == 8) oR = __double(this, this.l); else oR = __double([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]], 0); this.l += 8; return oR; } else size = 8; /* falls through */ case 16: o = __hexlify(this, this.l, size); break; }} this.l+=size; return o; } var __writeUInt32LE = function(b/*:RawBytes|CFBlob*/, val/*:number*/, idx/*:number*/)/*:void*/ { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); b[idx+2] = ((val >>> 16) & 0xFF); b[idx+3] = ((val >>> 24) & 0xFF); }; var __writeInt32LE = function(b/*:RawBytes|CFBlob*/, val/*:number*/, idx/*:number*/)/*:void*/ { b[idx] = (val & 0xFF); b[idx+1] = ((val >> 8) & 0xFF); b[idx+2] = ((val >> 16) & 0xFF); b[idx+3] = ((val >> 24) & 0xFF); }; var __writeUInt16LE = function(b/*:RawBytes|CFBlob*/, val/*:number*/, idx/*:number*/)/*:void*/ { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); }; function WriteShift(t/*:number*/, val/*:string|number*/, f/*:?string*/)/*:any*/ { var size = 0, i = 0; if(f === 'dbcs') { /*:: if(typeof val !== 'string') throw new Error("unreachable"); */ for(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i); size = 2 * val.length; } else if(f === 'sbcs') { if(typeof $cptable !== 'undefined' && current_ansi == 874) { /* TODO: use tables directly, don't encode */ /*:: if(typeof val !== "string") throw new Error("unreachable"); */ for(i = 0; i != val.length; ++i) { var cppayload = $cptable.utils.encode(current_ansi, val.charAt(i)); this[this.l + i] = cppayload[0]; } } else { /*:: if(typeof val !== 'string') throw new Error("unreachable"); */ val = val.replace(/[^\x00-\x7F]/g, "_"); /*:: if(typeof val !== 'string') throw new Error("unreachable"); */ for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF); } size = val.length; } else if(f === 'hex') { for(; i < t; ++i) { /*:: if(typeof val !== "string") throw new Error("unreachable"); */ this[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0); } return this; } else if(f === 'utf16le') { /*:: if(typeof val !== "string") throw new Error("unreachable"); */ var end/*:number*/ = Math.min(this.l + t, this.length); for(i = 0; i < Math.min(val.length, t); ++i) { var cc = val.charCodeAt(i); this[this.l++] = (cc & 0xff); this[this.l++] = (cc >> 8); } while(this.l < end) this[this.l++] = 0; return this; } else /*:: if(typeof val === 'number') */ switch(t) { case 1: size = 1; this[this.l] = val&0xFF; break; case 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break; case 3: size = 3; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; val >>>= 8; this[this.l+2] = val&0xFF; break; case 4: size = 4; __writeUInt32LE(this, val, this.l); break; case 8: size = 8; if(f === 'f') { write_double_le(this, val, this.l); break; } /* falls through */ case 16: break; case -4: size = 4; __writeInt32LE(this, val, this.l); break; } this.l += size; return this; } function CheckField(hexstr/*:string*/, fld/*:string*/)/*:void*/ { var m = __hexlify(this,this.l,hexstr.length>>1); if(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m); this.l += hexstr.length>>1; } function prep_blob(blob, pos/*:number*/)/*:void*/ { blob.l = pos; blob.read_shift = /*::(*/ReadShift/*:: :any)*/; blob.chk = CheckField; blob.write_shift = WriteShift; } function parsenoop(blob, length/*:: :number, opts?:any */) { blob.l += length; } function new_buf(sz/*:number*/)/*:Block*/ { var o = new_raw_buf(sz); prep_blob(o, 0); return o; } /* [MS-XLSB] 2.1.4 Record */ function recordhopper(data, cb/*:RecordHopperCB*/, opts/*:?any*/) { if(!data) return; var tmpbyte, cntbyte, length; prep_blob(data, data.l || 0); var L = data.length, RT = 0, tgt = 0; while(data.l < L) { RT = data.read_shift(1); if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7); var R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF]; tmpbyte = data.read_shift(1); length = tmpbyte & 0x7F; for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte); tgt = data.l + length; var d = R.f && R.f(data, length, opts); data.l = tgt; if(cb(d, R, RT)) return; } } /* control buffer usage for fixed-length buffers */ function buf_array()/*:BufArray*/ { var bufs/*:Array*/ = [], blksz = has_buf ? 256 : 2048; var newblk = function ba_newblk(sz/*:number*/)/*:Block*/ { var o/*:Block*/ = (new_buf(sz)/*:any*/); prep_blob(o, 0); return o; }; var curbuf/*:Block*/ = newblk(blksz); var endbuf = function ba_endbuf() { if(!curbuf) return; if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } if(curbuf.length > 0) bufs.push(curbuf); curbuf = null; }; var next = function ba_next(sz/*:number*/)/*:Block*/ { if(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf; endbuf(); return (curbuf = newblk(Math.max(sz+1, blksz))); }; var end = function ba_end() { endbuf(); return bconcat(bufs); }; var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); }; return ({ next:next, push:push, end:end, _bufs:bufs }/*:any*/); } function write_record(ba/*:BufArray*/, type/*:number*/, payload, length/*:?number*/) { var t/*:number*/ = +type, l; if(isNaN(t)) return; // TODO: throw something here? if(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0; l = 1 + (t >= 0x80 ? 1 : 0) + 1/* + length*/; if(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l; var o = ba.next(l); if(t <= 0x7F) o.write_shift(1, t); else { o.write_shift(1, (t & 0x7F) + 0x80); o.write_shift(1, (t >> 7)); } for(var i = 0; i != 4; ++i) { if(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; } else { o.write_shift(1, length); break; } } if(/*:: length != null &&*/length > 0 && is_buf(payload)) ba.push(payload); } /* XLS ranges enforced */ function shift_cell_xls(cell/*:CellAddress*/, tgt/*:any*/, opts/*:?any*/)/*:CellAddress*/ { var out = dup(cell); if(tgt.s) { if(out.cRel) out.c += tgt.s.c; if(out.rRel) out.r += tgt.s.r; } else { if(out.cRel) out.c += tgt.c; if(out.rRel) out.r += tgt.r; } if(!opts || opts.biff < 12) { while(out.c >= 0x100) out.c -= 0x100; while(out.r >= 0x10000) out.r -= 0x10000; } return out; } function shift_range_xls(cell, range, opts) { var out = dup(cell); out.s = shift_cell_xls(out.s, range.s, opts); out.e = shift_cell_xls(out.e, range.s, opts); return out; } function encode_cell_xls(c/*:CellAddress*/, biff/*:number*/)/*:string*/ { if(c.cRel && c.c < 0) { c = dup(c); while(c.c < 0) c.c += (biff > 8) ? 0x4000 : 0x100; } if(c.rRel && c.r < 0) { c = dup(c); while(c.r < 0) c.r += (biff > 8) ? 0x100000 : ((biff > 5) ? 0x10000 : 0x4000); } var s = encode_cell(c); if(!c.cRel && c.cRel != null) s = fix_col(s); if(!c.rRel && c.rRel != null) s = fix_row(s); return s; } function encode_range_xls(r, opts)/*:string*/ { if(r.s.r == 0 && !r.s.rRel) { if(r.e.r == (opts.biff >= 12 ? 0xFFFFF : (opts.biff >= 8 ? 0x10000 : 0x4000)) && !r.e.rRel) { return (r.s.cRel ? "" : "$") + encode_col(r.s.c) + ":" + (r.e.cRel ? "" : "$") + encode_col(r.e.c); } } if(r.s.c == 0 && !r.s.cRel) { if(r.e.c == (opts.biff >= 12 ? 0x3FFF : 0xFF) && !r.e.cRel) { return (r.s.rRel ? "" : "$") + encode_row(r.s.r) + ":" + (r.e.rRel ? "" : "$") + encode_row(r.e.r); } } return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff); } function decode_row(rowstr/*:string*/)/*:number*/ { return parseInt(unfix_row(rowstr),10) - 1; } function encode_row(row/*:number*/)/*:string*/ { return "" + (row + 1); } function fix_row(cstr/*:string*/)/*:string*/ { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); } function unfix_row(cstr/*:string*/)/*:string*/ { return cstr.replace(/\$(\d+)$/,"$1"); } function decode_col(colstr/*:string*/)/*:number*/ { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; } function encode_col(col/*:number*/)/*:string*/ { if(col < 0) throw new Error("invalid column " + col); var s=""; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; } function fix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^([A-Z])/,"$$$1"); } function unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\$([A-Z])/,"$1"); } function split_cell(cstr/*:string*/)/*:Array*/ { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); } //function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; } function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var R = 0, C = 0; for(var i = 0; i < cstr.length; ++i) { var cc = cstr.charCodeAt(i); if(cc >= 48 && cc <= 57) R = 10 * R + (cc - 48); else if(cc >= 65 && cc <= 90) C = 26 * C + (cc - 64); } return { c: C - 1, r:R - 1 }; } //function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); } function encode_cell(cell/*:CellAddress*/)/*:string*/ { var col = cell.c + 1; var s=""; for(; col; col=((col-1)/26)|0) s = String.fromCharCode(((col-1)%26) + 65) + s; return s + (cell.r + 1); } function decode_range(range/*:string*/)/*:Range*/ { var idx = range.indexOf(":"); if(idx == -1) return { s: decode_cell(range), e: decode_cell(range) }; return { s: decode_cell(range.slice(0, idx)), e: decode_cell(range.slice(idx + 1)) }; } /*# if only one arg, it is assumed to be a Range. If 2 args, both are cell addresses */ function encode_range(cs/*:CellAddrSpec|Range*/,ce/*:?CellAddrSpec*/)/*:string*/ { if(typeof ce === 'undefined' || typeof ce === 'number') { /*:: if(!(cs instanceof Range)) throw "unreachable"; */ return encode_range(cs.s, cs.e); } /*:: if((cs instanceof Range)) throw "unreachable"; */ if(typeof cs !== 'string') cs = encode_cell((cs/*:any*/)); if(typeof ce !== 'string') ce = encode_cell((ce/*:any*/)); /*:: if(typeof cs !== 'string') throw "unreachable"; */ /*:: if(typeof ce !== 'string') throw "unreachable"; */ return cs == ce ? cs : cs + ":" + ce; } function safe_decode_range(range/*:string*/)/*:Range*/ { var o = {s:{c:0,r:0},e:{c:0,r:0}}; var idx = 0, i = 0, cc = 0; var len = range.length; for(idx = 0; i < len; ++i) { if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break; idx = 26*idx + cc; } o.s.c = --idx; for(idx = 0; i < len; ++i) { if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break; idx = 10*idx + cc; } o.s.r = --idx; if(i === len || cc != 10) { o.e.c=o.s.c; o.e.r=o.s.r; return o; } ++i; for(idx = 0; i != len; ++i) { if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break; idx = 26*idx + cc; } o.e.c = --idx; for(idx = 0; i != len; ++i) { if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break; idx = 10*idx + cc; } o.e.r = --idx; return o; } function safe_format_cell(cell/*:Cell*/, v/*:any*/) { var q = (cell.t == 'd' && v instanceof Date); if(cell.z != null) try { return (cell.w = SSF_format(cell.z, q ? datenum(v) : v)); } catch(e) { } try { return (cell.w = SSF_format((cell.XF||{}).numFmtId||(q ? 14 : 0), q ? datenum(v) : v)); } catch(e) { return ''+v; } } function format_cell(cell/*:Cell*/, v/*:any*/, o/*:any*/) { if(cell == null || cell.t == null || cell.t == 'z') return ""; if(cell.w !== undefined) return cell.w; if(cell.t == 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF; if(cell.t == "e") return BErr[cell.v] || cell.v; if(v == undefined) return safe_format_cell(cell, cell.v); return safe_format_cell(cell, v); } function sheet_to_workbook(sheet/*:Worksheet*/, opts)/*:Workbook*/ { var n = opts && opts.sheet ? opts.sheet : "Sheet1"; var sheets = {}; sheets[n] = sheet; return { SheetNames: [n], Sheets: sheets }; } function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksheet*/ { var o = opts || {}; var dense = _ws ? Array.isArray(_ws) : o.dense; if(DENSE != null && dense == null) dense = DENSE; var ws/*:Worksheet*/ = _ws || (dense ? ([]/*:any*/) : ({}/*:any*/)); var _R = 0, _C = 0; if(ws && o.origin != null) { if(typeof o.origin == 'number') _R = o.origin; else { var _origin/*:CellAddress*/ = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin; _R = _origin.r; _C = _origin.c; } if(!ws["!ref"]) ws["!ref"] = "A1:A1"; } var range/*:Range*/ = ({s: {c:10000000, r:10000000}, e: {c:0, r:0}}/*:any*/); if(ws['!ref']) { var _range = safe_decode_range(ws['!ref']); range.s.c = _range.s.c; range.s.r = _range.s.r; range.e.c = Math.max(range.e.c, _range.e.c); range.e.r = Math.max(range.e.r, _range.e.r); if(_R == -1) range.e.r = _R = _range.e.r + 1; } for(var R = 0; R != data.length; ++R) { if(!data[R]) continue; if(!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays"); for(var C = 0; C != data[R].length; ++C) { if(typeof data[R][C] === 'undefined') continue; var cell/*:Cell*/ = ({v: data[R][C] }/*:any*/); var __R = _R + R, __C = _C + C; if(range.s.r > __R) range.s.r = __R; if(range.s.c > __C) range.s.c = __C; if(range.e.r < __R) range.e.r = __R; if(range.e.c < __C) range.e.c = __C; if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C]; else { if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; } if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(o.nullError) { cell.t = 'e'; cell.v = 0; } else if(!o.sheetStubs) continue; else cell.t = 'z'; } else if(typeof cell.v === 'number') cell.t = 'n'; else if(typeof cell.v === 'boolean') cell.t = 'b'; else if(cell.v instanceof Date) { cell.z = o.dateNF || table_fmt[14]; if(o.cellDates) { cell.t = 'd'; cell.w = SSF_format(cell.z, datenum(cell.v)); } else { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF_format(cell.z, cell.v); } } else cell.t = 's'; } if(dense) { if(!ws[__R]) ws[__R] = []; if(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z; ws[__R][__C] = cell; } else { var cell_ref = encode_cell(({c:__C,r:__R}/*:any*/)); if(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z; ws[cell_ref] = cell; } } } if(range.s.c < 10000000) ws['!ref'] = encode_range(range); return ws; } function aoa_to_sheet(data/*:AOA*/, opts/*:?any*/)/*:Worksheet*/ { return sheet_add_aoa(null, data, opts); } function parse_Int32LE(data) { return data.read_shift(4, 'i'); } function write_UInt32LE(x/*:number*/, o) { if (!o) o = new_buf(4); o.write_shift(4, x); return o; } /* [MS-XLSB] 2.5.168 */ function parse_XLWideString(data/*::, length*/)/*:string*/ { var cchCharacters = data.read_shift(4); return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, 'dbcs'); } function write_XLWideString(data/*:string*/, o) { var _null = false; if (o == null) { _null = true; o = new_buf(4 + 2 * data.length); } o.write_shift(4, data.length); if (data.length > 0) o.write_shift(0, data, 'dbcs'); return _null ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.5.91 */ //function parse_LPWideString(data/*::, length*/)/*:string*/ { // var cchCharacters = data.read_shift(2); // return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, "utf16le"); //} /* [MS-XLSB] 2.5.143 */ function parse_StrRun(data) { return { ich: data.read_shift(2), ifnt: data.read_shift(2) }; } function write_StrRun(run, o) { if (!o) o = new_buf(4); o.write_shift(2, run.ich || 0); o.write_shift(2, run.ifnt || 0); return o; } /* [MS-XLSB] 2.5.121 */ function parse_RichStr(data, length/*:number*/)/*:XLString*/ { var start = data.l; var flags = data.read_shift(1); var str = parse_XLWideString(data); var rgsStrRun = []; var z = ({ t: str, h: str }/*:any*/); if ((flags & 1) !== 0) { /* fRichStr */ /* TODO: formatted string */ var dwSizeStrRun = data.read_shift(4); for (var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data)); z.r = rgsStrRun; } else z.r = [{ ich: 0, ifnt: 0 }]; //if((flags & 2) !== 0) { /* fExtStr */ // /* TODO: phonetic string */ //} data.l = start + length; return z; } function write_RichStr(str/*:XLString*/, o/*:?Block*/)/*:Block*/ { /* TODO: formatted string */ var _null = false; if (o == null) { _null = true; o = new_buf(15 + 4 * str.t.length); } o.write_shift(1, 0); write_XLWideString(str.t, o); return _null ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */ var parse_BrtCommentText = parse_RichStr; function write_BrtCommentText(str/*:XLString*/, o/*:?Block*/)/*:Block*/ { /* TODO: formatted string */ var _null = false; if (o == null) { _null = true; o = new_buf(23 + 4 * str.t.length); } o.write_shift(1, 1); write_XLWideString(str.t, o); o.write_shift(4, 1); write_StrRun({ ich: 0, ifnt: 0 }, o); return _null ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.5.9 */ function parse_XLSBCell(data)/*:any*/ { var col = data.read_shift(4); var iStyleRef = data.read_shift(2); iStyleRef += data.read_shift(1) << 16; data.l++; //var fPhShow = data.read_shift(1); return { c: col, iStyleRef: iStyleRef }; } function write_XLSBCell(cell/*:any*/, o/*:?Block*/) { if (o == null) o = new_buf(8); o.write_shift(-4, cell.c); o.write_shift(3, cell.iStyleRef || cell.s); o.write_shift(1, 0); /* fPhShow */ return o; } /* Short XLSB Cell does not include column */ function parse_XLSBShortCell(data)/*:any*/ { var iStyleRef = data.read_shift(2); iStyleRef += data.read_shift(1) <<16; data.l++; //var fPhShow = data.read_shift(1); return { c:-1, iStyleRef: iStyleRef }; } function write_XLSBShortCell(cell/*:any*/, o/*:?Block*/) { if(o == null) o = new_buf(4); o.write_shift(3, cell.iStyleRef || cell.s); o.write_shift(1, 0); /* fPhShow */ return o; } /* [MS-XLSB] 2.5.21 */ var parse_XLSBCodeName = parse_XLWideString; var write_XLSBCodeName = write_XLWideString; /* [MS-XLSB] 2.5.166 */ function parse_XLNullableWideString(data/*::, length*/)/*:string*/ { var cchCharacters = data.read_shift(4); return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data.read_shift(cchCharacters, 'dbcs'); } function write_XLNullableWideString(data/*:string*/, o) { var _null = false; if (o == null) { _null = true; o = new_buf(127); } o.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF); if (data.length > 0) o.write_shift(0, data, 'dbcs'); return _null ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.5.165 */ var parse_XLNameWideString = parse_XLWideString; //var write_XLNameWideString = write_XLWideString; /* [MS-XLSB] 2.5.114 */ var parse_RelID = parse_XLNullableWideString; var write_RelID = write_XLNullableWideString; /* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */ function parse_RkNumber(data)/*:number*/ { var b = data.slice(data.l, data.l + 4); var fX100 = (b[0] & 1), fInt = (b[0] & 2); data.l += 4; var RK = fInt === 0 ? __double([0, 0, 0, 0, (b[0] & 0xFC), b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2; return fX100 ? (RK / 100) : RK; } function write_RkNumber(data/*:number*/, o) { if (o == null) o = new_buf(4); var fX100 = 0, fInt = 0, d100 = data * 100; if ((data == (data | 0)) && (data >= -(1 << 29)) && (data < (1 << 29))) { fInt = 1; } else if ((d100 == (d100 | 0)) && (d100 >= -(1 << 29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; } if (fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2)); else throw new Error("unsupported RkNumber " + data); // TODO } /* [MS-XLSB] 2.5.117 RfX */ function parse_RfX(data /*::, length*/)/*:Range*/ { var cell/*:Range*/ = ({ s: {}, e: {} }/*:any*/); cell.s.r = data.read_shift(4); cell.e.r = data.read_shift(4); cell.s.c = data.read_shift(4); cell.e.c = data.read_shift(4); return cell; } function write_RfX(r/*:Range*/, o) { if (!o) o = new_buf(16); o.write_shift(4, r.s.r); o.write_shift(4, r.e.r); o.write_shift(4, r.s.c); o.write_shift(4, r.e.c); return o; } /* [MS-XLSB] 2.5.153 UncheckedRfX */ var parse_UncheckedRfX = parse_RfX; var write_UncheckedRfX = write_RfX; /* [MS-XLSB] 2.5.155 UncheckedSqRfX */ //function parse_UncheckedSqRfX(data) { // var cnt = data.read_shift(4); // var out = []; // for(var i = 0; i < cnt; ++i) { // var rng = parse_UncheckedRfX(data); // out.push(encode_range(rng)); // } // return out.join(","); //} //function write_UncheckedSqRfX(sqrfx/*:string*/) { // var parts = sqrfx.split(/\s*,\s*/); // var o = new_buf(4); o.write_shift(4, parts.length); // var out = [o]; // parts.forEach(function(rng) { // out.push(write_UncheckedRfX(safe_decode_range(rng))); // }); // return bconcat(out); //} /* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */ /* TODO: error checking, NaN and Infinity values are not valid Xnum */ function parse_Xnum(data/*::, length*/) { if(data.length - data.l < 8) throw "XLS Xnum Buffer underflow"; return data.read_shift(8, 'f'); } function write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, data, 'f'); } /* [MS-XLSB] 2.4.324 BrtColor */ function parse_BrtColor(data/*::, length*/) { var out = {}; var d = data.read_shift(1); //var fValidRGB = d & 1; var xColorType = d >>> 1; var index = data.read_shift(1); var nTS = data.read_shift(2, 'i'); var bR = data.read_shift(1); var bG = data.read_shift(1); var bB = data.read_shift(1); data.l++; //var bAlpha = data.read_shift(1); switch (xColorType) { case 0: out.auto = 1; break; case 1: out.index = index; var icv = XLSIcv[index]; /* automatic pseudo index 81 */ if (icv) out.rgb = rgb2Hex(icv); break; case 2: /* if(!fValidRGB) throw new Error("invalid"); */ out.rgb = rgb2Hex([bR, bG, bB]); break; case 3: out.theme = index; break; } if (nTS != 0) out.tint = nTS > 0 ? nTS / 32767 : nTS / 32768; return out; } function write_BrtColor(color, o) { if (!o) o = new_buf(8); if (!color || color.auto) { o.write_shift(4, 0); o.write_shift(4, 0); return o; } if (color.index != null) { o.write_shift(1, 0x02); o.write_shift(1, color.index); } else if (color.theme != null) { o.write_shift(1, 0x06); o.write_shift(1, color.theme); } else { o.write_shift(1, 0x05); o.write_shift(1, 0); } var nTS = color.tint || 0; if (nTS > 0) nTS *= 32767; else if (nTS < 0) nTS *= 32768; o.write_shift(2, nTS); if (!color.rgb || color.theme != null) { o.write_shift(2, 0); o.write_shift(1, 0); o.write_shift(1, 0); } else { var rgb = (color.rgb || 'FFFFFF'); if (typeof rgb == 'number') rgb = ("000000" + rgb.toString(16)).slice(-6); o.write_shift(1, parseInt(rgb.slice(0, 2), 16)); o.write_shift(1, parseInt(rgb.slice(2, 4), 16)); o.write_shift(1, parseInt(rgb.slice(4, 6), 16)); o.write_shift(1, 0xFF); } return o; } /* [MS-XLSB] 2.5.52 */ function parse_FontFlags(data/*::, length, opts*/) { var d = data.read_shift(1); data.l++; var out = { fBold: d & 0x01, fItalic: d & 0x02, fUnderline: d & 0x04, fStrikeout: d & 0x08, fOutline: d & 0x10, fShadow: d & 0x20, fCondense: d & 0x40, fExtend: d & 0x80 }; return out; } function write_FontFlags(font, o) { if (!o) o = new_buf(2); var grbit = (font.italic ? 0x02 : 0) | (font.strike ? 0x08 : 0) | (font.outline ? 0x10 : 0) | (font.shadow ? 0x20 : 0) | (font.condense ? 0x40 : 0) | (font.extend ? 0x80 : 0); o.write_shift(1, grbit); o.write_shift(1, 0); return o; } /* [MS-OLEDS] 2.3.1 and 2.3.2 */ function parse_ClipboardFormatOrString(o, w/*:number*/)/*:string*/ { // $FlowIgnore var ClipFmt = { 2: "BITMAP", 3: "METAFILEPICT", 8: "DIB", 14: "ENHMETAFILE" }; var m/*:number*/ = o.read_shift(4); switch (m) { case 0x00000000: return ""; case 0xffffffff: case 0xfffffffe: return ClipFmt[o.read_shift(4)] || ""; } if (m > 0x190) throw new Error("Unsupported Clipboard: " + m.toString(16)); o.l -= 4; return o.read_shift(0, w == 1 ? "lpstr" : "lpwstr"); } function parse_ClipboardFormatOrAnsiString(o) { return parse_ClipboardFormatOrString(o, 1); } function parse_ClipboardFormatOrUnicodeString(o) { return parse_ClipboardFormatOrString(o, 2); } /* [MS-OLEPS] 2.2 PropertyType */ // Note: some tree shakers cannot handle VT_VECTOR | $CONST, hence extra vars //var VT_EMPTY = 0x0000; //var VT_NULL = 0x0001; var VT_I2 = 0x0002; var VT_I4 = 0x0003; //var VT_R4 = 0x0004; //var VT_R8 = 0x0005; //var VT_CY = 0x0006; //var VT_DATE = 0x0007; //var VT_BSTR = 0x0008; //var VT_ERROR = 0x000A; var VT_BOOL = 0x000B; var VT_VARIANT = 0x000C; //var VT_DECIMAL = 0x000E; //var VT_I1 = 0x0010; //var VT_UI1 = 0x0011; //var VT_UI2 = 0x0012; var VT_UI4 = 0x0013; //var VT_I8 = 0x0014; //var VT_UI8 = 0x0015; //var VT_INT = 0x0016; //var VT_UINT = 0x0017; var VT_LPSTR = 0x001E; //var VT_LPWSTR = 0x001F; var VT_FILETIME = 0x0040; var VT_BLOB = 0x0041; //var VT_STREAM = 0x0042; //var VT_STORAGE = 0x0043; //var VT_STREAMED_Object = 0x0044; //var VT_STORED_Object = 0x0045; //var VT_BLOB_Object = 0x0046; var VT_CF = 0x0047; //var VT_CLSID = 0x0048; //var VT_VERSIONED_STREAM = 0x0049; var VT_VECTOR = 0x1000; var VT_VECTOR_VARIANT = 0x100C; var VT_VECTOR_LPSTR = 0x101E; //var VT_ARRAY = 0x2000; var VT_STRING = 0x0050; // 2.3.3.1.11 VtString var VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString var VT_CUSTOM = [VT_STRING, VT_USTR]; /* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */ var DocSummaryPIDDSI = { /*::[*/0x01/*::]*/: { n: 'CodePage', t: VT_I2 }, /*::[*/0x02/*::]*/: { n: 'Category', t: VT_STRING }, /*::[*/0x03/*::]*/: { n: 'PresentationFormat', t: VT_STRING }, /*::[*/0x04/*::]*/: { n: 'ByteCount', t: VT_I4 }, /*::[*/0x05/*::]*/: { n: 'LineCount', t: VT_I4 }, /*::[*/0x06/*::]*/: { n: 'ParagraphCount', t: VT_I4 }, /*::[*/0x07/*::]*/: { n: 'SlideCount', t: VT_I4 }, /*::[*/0x08/*::]*/: { n: 'NoteCount', t: VT_I4 }, /*::[*/0x09/*::]*/: { n: 'HiddenCount', t: VT_I4 }, /*::[*/0x0a/*::]*/: { n: 'MultimediaClipCount', t: VT_I4 }, /*::[*/0x0b/*::]*/: { n: 'ScaleCrop', t: VT_BOOL }, /*::[*/0x0c/*::]*/: { n: 'HeadingPairs', t: VT_VECTOR_VARIANT /* VT_VECTOR | VT_VARIANT */ }, /*::[*/0x0d/*::]*/: { n: 'TitlesOfParts', t: VT_VECTOR_LPSTR /* VT_VECTOR | VT_LPSTR */ }, /*::[*/0x0e/*::]*/: { n: 'Manager', t: VT_STRING }, /*::[*/0x0f/*::]*/: { n: 'Company', t: VT_STRING }, /*::[*/0x10/*::]*/: { n: 'LinksUpToDate', t: VT_BOOL }, /*::[*/0x11/*::]*/: { n: 'CharacterCount', t: VT_I4 }, /*::[*/0x13/*::]*/: { n: 'SharedDoc', t: VT_BOOL }, /*::[*/0x16/*::]*/: { n: 'HyperlinksChanged', t: VT_BOOL }, /*::[*/0x17/*::]*/: { n: 'AppVersion', t: VT_I4, p: 'version' }, /*::[*/0x18/*::]*/: { n: 'DigSig', t: VT_BLOB }, /*::[*/0x1A/*::]*/: { n: 'ContentType', t: VT_STRING }, /*::[*/0x1B/*::]*/: { n: 'ContentStatus', t: VT_STRING }, /*::[*/0x1C/*::]*/: { n: 'Language', t: VT_STRING }, /*::[*/0x1D/*::]*/: { n: 'Version', t: VT_STRING }, /*::[*/0xFF/*::]*/: {}, /* [MS-OLEPS] 2.18 */ /*::[*/0x80000000/*::]*/: { n: 'Locale', t: VT_UI4 }, /*::[*/0x80000003/*::]*/: { n: 'Behavior', t: VT_UI4 }, /*::[*/0x72627262/*::]*/: {} }; /* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */ var SummaryPIDSI = { /*::[*/0x01/*::]*/: { n: 'CodePage', t: VT_I2 }, /*::[*/0x02/*::]*/: { n: 'Title', t: VT_STRING }, /*::[*/0x03/*::]*/: { n: 'Subject', t: VT_STRING }, /*::[*/0x04/*::]*/: { n: 'Author', t: VT_STRING }, /*::[*/0x05/*::]*/: { n: 'Keywords', t: VT_STRING }, /*::[*/0x06/*::]*/: { n: 'Comments', t: VT_STRING }, /*::[*/0x07/*::]*/: { n: 'Template', t: VT_STRING }, /*::[*/0x08/*::]*/: { n: 'LastAuthor', t: VT_STRING }, /*::[*/0x09/*::]*/: { n: 'RevNumber', t: VT_STRING }, /*::[*/0x0A/*::]*/: { n: 'EditTime', t: VT_FILETIME }, /*::[*/0x0B/*::]*/: { n: 'LastPrinted', t: VT_FILETIME }, /*::[*/0x0C/*::]*/: { n: 'CreatedDate', t: VT_FILETIME }, /*::[*/0x0D/*::]*/: { n: 'ModifiedDate', t: VT_FILETIME }, /*::[*/0x0E/*::]*/: { n: 'PageCount', t: VT_I4 }, /*::[*/0x0F/*::]*/: { n: 'WordCount', t: VT_I4 }, /*::[*/0x10/*::]*/: { n: 'CharCount', t: VT_I4 }, /*::[*/0x11/*::]*/: { n: 'Thumbnail', t: VT_CF }, /*::[*/0x12/*::]*/: { n: 'Application', t: VT_STRING }, /*::[*/0x13/*::]*/: { n: 'DocSecurity', t: VT_I4 }, /*::[*/0xFF/*::]*/: {}, /* [MS-OLEPS] 2.18 */ /*::[*/0x80000000/*::]*/: { n: 'Locale', t: VT_UI4 }, /*::[*/0x80000003/*::]*/: { n: 'Behavior', t: VT_UI4 }, /*::[*/0x72627262/*::]*/: {} }; /* [MS-XLS] 2.4.63 Country/Region codes */ var CountryEnum = { /*::[*/0x0001/*::]*/: "US", // United States /*::[*/0x0002/*::]*/: "CA", // Canada /*::[*/0x0003/*::]*/: "", // Latin America (except Brazil) /*::[*/0x0007/*::]*/: "RU", // Russia /*::[*/0x0014/*::]*/: "EG", // Egypt /*::[*/0x001E/*::]*/: "GR", // Greece /*::[*/0x001F/*::]*/: "NL", // Netherlands /*::[*/0x0020/*::]*/: "BE", // Belgium /*::[*/0x0021/*::]*/: "FR", // France /*::[*/0x0022/*::]*/: "ES", // Spain /*::[*/0x0024/*::]*/: "HU", // Hungary /*::[*/0x0027/*::]*/: "IT", // Italy /*::[*/0x0029/*::]*/: "CH", // Switzerland /*::[*/0x002B/*::]*/: "AT", // Austria /*::[*/0x002C/*::]*/: "GB", // United Kingdom /*::[*/0x002D/*::]*/: "DK", // Denmark /*::[*/0x002E/*::]*/: "SE", // Sweden /*::[*/0x002F/*::]*/: "NO", // Norway /*::[*/0x0030/*::]*/: "PL", // Poland /*::[*/0x0031/*::]*/: "DE", // Germany /*::[*/0x0034/*::]*/: "MX", // Mexico /*::[*/0x0037/*::]*/: "BR", // Brazil /*::[*/0x003d/*::]*/: "AU", // Australia /*::[*/0x0040/*::]*/: "NZ", // New Zealand /*::[*/0x0042/*::]*/: "TH", // Thailand /*::[*/0x0051/*::]*/: "JP", // Japan /*::[*/0x0052/*::]*/: "KR", // Korea /*::[*/0x0054/*::]*/: "VN", // Viet Nam /*::[*/0x0056/*::]*/: "CN", // China /*::[*/0x005A/*::]*/: "TR", // Turkey /*::[*/0x0069/*::]*/: "JS", // Ramastan /*::[*/0x00D5/*::]*/: "DZ", // Algeria /*::[*/0x00D8/*::]*/: "MA", // Morocco /*::[*/0x00DA/*::]*/: "LY", // Libya /*::[*/0x015F/*::]*/: "PT", // Portugal /*::[*/0x0162/*::]*/: "IS", // Iceland /*::[*/0x0166/*::]*/: "FI", // Finland /*::[*/0x01A4/*::]*/: "CZ", // Czech Republic /*::[*/0x0376/*::]*/: "TW", // Taiwan /*::[*/0x03C1/*::]*/: "LB", // Lebanon /*::[*/0x03C2/*::]*/: "JO", // Jordan /*::[*/0x03C3/*::]*/: "SY", // Syria /*::[*/0x03C4/*::]*/: "IQ", // Iraq /*::[*/0x03C5/*::]*/: "KW", // Kuwait /*::[*/0x03C6/*::]*/: "SA", // Saudi Arabia /*::[*/0x03CB/*::]*/: "AE", // United Arab Emirates /*::[*/0x03CC/*::]*/: "IL", // Israel /*::[*/0x03CE/*::]*/: "QA", // Qatar /*::[*/0x03D5/*::]*/: "IR", // Iran /*::[*/0xFFFF/*::]*/: "US" // United States }; /* [MS-XLS] 2.5.127 */ var XLSFillPattern = [ null, 'solid', 'mediumGray', 'darkGray', 'lightGray', 'darkHorizontal', 'darkVertical', 'darkDown', 'darkUp', 'darkGrid', 'darkTrellis', 'lightHorizontal', 'lightVertical', 'lightDown', 'lightUp', 'lightGrid', 'lightTrellis', 'gray125', 'gray0625' ]; function rgbify(arr/*:Array*/)/*:Array<[number, number, number]>*/ { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); } /* [MS-XLS] 2.5.161 */ /* [MS-XLSB] 2.5.75 Icv */ var _XLSIcv = /*#__PURE__*/ rgbify([ /* Color Constants */ 0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, /* Overridable Defaults */ 0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0x800000, 0x008000, 0x000080, 0x808000, 0x800080, 0x008080, 0xC0C0C0, 0x808080, 0x9999FF, 0x993366, 0xFFFFCC, 0xCCFFFF, 0x660066, 0xFF8080, 0x0066CC, 0xCCCCFF, 0x000080, 0xFF00FF, 0xFFFF00, 0x00FFFF, 0x800080, 0x800000, 0x008080, 0x0000FF, 0x00CCFF, 0xCCFFFF, 0xCCFFCC, 0xFFFF99, 0x99CCFF, 0xFF99CC, 0xCC99FF, 0xFFCC99, 0x3366FF, 0x33CCCC, 0x99CC00, 0xFFCC00, 0xFF9900, 0xFF6600, 0x666699, 0x969696, 0x003366, 0x339966, 0x003300, 0x333300, 0x993300, 0x993366, 0x333399, 0x333333, /* Other entries to appease BIFF8/12 */ 0xFFFFFF, /* 0x40 icvForeground ?? */ 0x000000, /* 0x41 icvBackground ?? */ 0x000000, /* 0x42 icvFrame ?? */ 0x000000, /* 0x43 icv3D ?? */ 0x000000, /* 0x44 icv3DText ?? */ 0x000000, /* 0x45 icv3DHilite ?? */ 0x000000, /* 0x46 icv3DShadow ?? */ 0x000000, /* 0x47 icvHilite ?? */ 0x000000, /* 0x48 icvCtlText ?? */ 0x000000, /* 0x49 icvCtlScrl ?? */ 0x000000, /* 0x4A icvCtlInv ?? */ 0x000000, /* 0x4B icvCtlBody ?? */ 0x000000, /* 0x4C icvCtlFrame ?? */ 0x000000, /* 0x4D icvCtlFore ?? */ 0x000000, /* 0x4E icvCtlBack ?? */ 0x000000, /* 0x4F icvCtlNeutral */ 0x000000, /* 0x50 icvInfoBk ?? */ 0x000000 /* 0x51 icvInfoText ?? */ ]); var XLSIcv = /*#__PURE__*/dup(_XLSIcv); /* [MS-XLSB] 2.5.97.2 */ var BErr = { /*::[*/0x00/*::]*/: "#NULL!", /*::[*/0x07/*::]*/: "#DIV/0!", /*::[*/0x0F/*::]*/: "#VALUE!", /*::[*/0x17/*::]*/: "#REF!", /*::[*/0x1D/*::]*/: "#NAME?", /*::[*/0x24/*::]*/: "#NUM!", /*::[*/0x2A/*::]*/: "#N/A", /*::[*/0x2B/*::]*/: "#GETTING_DATA", /*::[*/0xFF/*::]*/: "#WTF?" }; //var RBErr = evert_num(BErr); var RBErr = { "#NULL!": 0x00, "#DIV/0!": 0x07, "#VALUE!": 0x0F, "#REF!": 0x17, "#NAME?": 0x1D, "#NUM!": 0x24, "#N/A": 0x2A, "#GETTING_DATA": 0x2B, "#WTF?": 0xFF }; /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */ /* 12.3 Part Summary */ /* 14.2 Part Summary */ /* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */ var ct2type/*{[string]:string}*/ = ({ /* Workbook */ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks", "application/vnd.ms-excel.sheet.macroEnabled.main+xml": "workbooks", "application/vnd.ms-excel.sheet.binary.macroEnabled.main": "workbooks", "application/vnd.ms-excel.addin.macroEnabled.main+xml": "workbooks", "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": "workbooks", /* Worksheet */ "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": "sheets", "application/vnd.ms-excel.worksheet": "sheets", "application/vnd.ms-excel.binIndexWs": "TODO", /* Binary Index */ /* Chartsheet */ "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": "charts", "application/vnd.ms-excel.chartsheet": "charts", /* Macrosheet */ "application/vnd.ms-excel.macrosheet+xml": "macros", "application/vnd.ms-excel.macrosheet": "macros", "application/vnd.ms-excel.intlmacrosheet": "TODO", "application/vnd.ms-excel.binIndexMs": "TODO", /* Binary Index */ /* Dialogsheet */ "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": "dialogs", "application/vnd.ms-excel.dialogsheet": "dialogs", /* Shared Strings */ "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml": "strs", "application/vnd.ms-excel.sharedStrings": "strs", /* Styles */ "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": "styles", "application/vnd.ms-excel.styles": "styles", /* File Properties */ "application/vnd.openxmlformats-package.core-properties+xml": "coreprops", "application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops", "application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops", /* Custom Data Properties */ "application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty": "TODO", /* Comments */ "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": "comments", "application/vnd.ms-excel.comments": "comments", "application/vnd.ms-excel.threadedcomments+xml": "threadedcomments", "application/vnd.ms-excel.person+xml": "people", /* Metadata (Stock/Geography and Dynamic Array) */ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "metadata", "application/vnd.ms-excel.sheetMetadata": "metadata", /* PivotTable */ "application/vnd.ms-excel.pivotTable": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO", /* Chart Objects */ "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO", /* Chart Colors */ "application/vnd.ms-office.chartcolorstyle+xml": "TODO", /* Chart Style */ "application/vnd.ms-office.chartstyle+xml": "TODO", /* Chart Advanced */ "application/vnd.ms-office.chartex+xml": "TODO", /* Calculation Chain */ "application/vnd.ms-excel.calcChain": "calcchains", "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains", /* Printer Settings */ "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO", /* ActiveX */ "application/vnd.ms-office.activeX": "TODO", "application/vnd.ms-office.activeX+xml": "TODO", /* Custom Toolbars */ "application/vnd.ms-excel.attachedToolbars": "TODO", /* External Data Connections */ "application/vnd.ms-excel.connections": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO", /* External Links */ "application/vnd.ms-excel.externalLink": "links", "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links", /* PivotCache */ "application/vnd.ms-excel.pivotCacheDefinition": "TODO", "application/vnd.ms-excel.pivotCacheRecords": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO", /* Query Table */ "application/vnd.ms-excel.queryTable": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO", /* Shared Workbook */ "application/vnd.ms-excel.userNames": "TODO", "application/vnd.ms-excel.revisionHeaders": "TODO", "application/vnd.ms-excel.revisionLog": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO", /* Single Cell Table */ "application/vnd.ms-excel.tableSingleCells": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO", /* Slicer */ "application/vnd.ms-excel.slicer": "TODO", "application/vnd.ms-excel.slicerCache": "TODO", "application/vnd.ms-excel.slicer+xml": "TODO", "application/vnd.ms-excel.slicerCache+xml": "TODO", /* Sort Map */ "application/vnd.ms-excel.wsSortMap": "TODO", /* Table */ "application/vnd.ms-excel.table": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO", /* Themes */ "application/vnd.openxmlformats-officedocument.theme+xml": "themes", /* Theme Override */ "application/vnd.openxmlformats-officedocument.themeOverride+xml": "TODO", /* Timeline */ "application/vnd.ms-excel.Timeline+xml": "TODO", /* verify */ "application/vnd.ms-excel.TimelineCache+xml": "TODO", /* verify */ /* VBA */ "application/vnd.ms-office.vbaProject": "vba", "application/vnd.ms-office.vbaProjectSignature": "TODO", /* Volatile Dependencies */ "application/vnd.ms-office.volatileDependencies": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO", /* Control Properties */ "application/vnd.ms-excel.controlproperties+xml": "TODO", /* Data Model */ "application/vnd.openxmlformats-officedocument.model+data": "TODO", /* Survey */ "application/vnd.ms-excel.Survey+xml": "TODO", /* Drawing */ "application/vnd.openxmlformats-officedocument.drawing+xml": "drawings", "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO", /* VML */ "application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO", "application/vnd.openxmlformats-package.relationships+xml": "rels", "application/vnd.openxmlformats-officedocument.oleObject": "TODO", /* Image */ "image/png": "TODO", "sheet": "js" }/*:any*/); var CT_LIST = { workbooks: { xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml", xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" }, strs: { /* Shared Strings */ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsb: "application/vnd.ms-excel.sharedStrings" }, comments: { /* Comments */ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", xlsb: "application/vnd.ms-excel.comments" }, sheets: { /* Worksheet */ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsb: "application/vnd.ms-excel.worksheet" }, charts: { /* Chartsheet */ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", xlsb: "application/vnd.ms-excel.chartsheet" }, dialogs: { /* Dialogsheet */ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml", xlsb: "application/vnd.ms-excel.dialogsheet" }, macros: { /* Macrosheet (Excel 4.0 Macros) */ xlsx: "application/vnd.ms-excel.macrosheet+xml", xlsb: "application/vnd.ms-excel.macrosheet" }, metadata: { /* Metadata (Stock/Geography and Dynamic Array) */ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", xlsb: "application/vnd.ms-excel.sheetMetadata" }, styles: { /* Styles */ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsb: "application/vnd.ms-excel.styles" } }; function new_ct()/*:any*/ { return ({ workbooks:[], sheets:[], charts:[], dialogs:[], macros:[], rels:[], strs:[], comments:[], threadedcomments:[], links:[], coreprops:[], extprops:[], custprops:[], themes:[], styles:[], calcchains:[], vba: [], drawings: [], metadata: [], people:[], TODO:[], xmlns: "" }/*:any*/); } function parse_ct(data/*:?string*/) { var ct = new_ct(); if(!data || !data.match) return ct; var ctext = {}; (data.match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x); switch(y[0].replace(nsregex,"<")) { case ' 0 ? ct.calcchains[0] : ""; ct.sst = ct.strs.length > 0 ? ct.strs[0] : ""; ct.style = ct.styles.length > 0 ? ct.styles[0] : ""; ct.defaults = ctext; delete ct.calcchains; return ct; } function write_ct(ct, opts)/*:string*/ { var type2ct/*{[string]:Array}*/ = evert_arr(ct2type); var o/*:Array*/ = [], v; o[o.length] = (XML_HEADER); o[o.length] = writextag('Types', null, { 'xmlns': XMLNS.CT, 'xmlns:xsd': XMLNS.xsd, 'xmlns:xsi': XMLNS.xsi }); o = o.concat([ ['xml', 'application/xml'], ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'], ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'], ['data', 'application/vnd.openxmlformats-officedocument.model+data'], /* from test files */ ['bmp', 'image/bmp'], ['png', 'image/png'], ['gif', 'image/gif'], ['emf', 'image/x-emf'], ['wmf', 'image/x-wmf'], ['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'], ['tif', 'image/tiff'], ['tiff', 'image/tiff'], ['pdf', 'application/pdf'], ['rels', 'application/vnd.openxmlformats-package.relationships+xml'] ].map(function(x) { return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]}); })); /* only write first instance */ var f1 = function(w) { if(ct[w] && ct[w].length > 0) { v = ct[w][0]; o[o.length] = (writextag('Override', null, { 'PartName': (v[0] == '/' ? "":"/") + v, 'ContentType': CT_LIST[w][opts.bookType] || CT_LIST[w]['xlsx'] })); } }; /* book type-specific */ var f2 = function(w) { (ct[w]||[]).forEach(function(v) { o[o.length] = (writextag('Override', null, { 'PartName': (v[0] == '/' ? "":"/") + v, 'ContentType': CT_LIST[w][opts.bookType] || CT_LIST[w]['xlsx'] })); }); }; /* standard type */ var f3 = function(t) { (ct[t]||[]).forEach(function(v) { o[o.length] = (writextag('Override', null, { 'PartName': (v[0] == '/' ? "":"/") + v, 'ContentType': type2ct[t][0] })); }); }; f1('workbooks'); f2('sheets'); f2('charts'); f3('themes'); ['strs', 'styles'].forEach(f1); ['coreprops', 'extprops', 'custprops'].forEach(f3); f3('vba'); f3('comments'); f3('threadedcomments'); f3('drawings'); f2('metadata'); f3('people'); if(o.length>2){ o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* 9.3 Relationships */ var RELS = ({ WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument", HLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", VML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", XPATH: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath", XMISS: "http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing", XLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink", CXML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CXMLP: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", CMNT: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", CORE_PROPS: "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", EXT_PROPS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', CUST_PROPS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties', SST: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", STY: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", THEME: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", CHART: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart", CHARTEX: "http://schemas.microsoft.com/office/2014/relationships/chartEx", CS: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet", WS: [ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", "http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet" ], DS: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet", MS: "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet", IMG: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", DRAW: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing", XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata", TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment", PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person", VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject" }/*:any*/); /* 9.3.3 Representing Relationships */ function get_rels_path(file/*:string*/)/*:string*/ { var n = file.lastIndexOf("/"); return file.slice(0,n+1) + '_rels/' + file.slice(n+1) + ".rels"; } function parse_rels(data/*:?string*/, currentFilePath/*:string*/) { var rels = {"!id":{}}; if (!data) return rels; if (currentFilePath.charAt(0) !== '/') { currentFilePath = '/'+currentFilePath; } var hash = {}; (data.match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x); /* 9.3.2.2 OPC_Relationships */ if (y[0] === '2){ o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } function add_rels(rels, rId/*:number*/, f, type, relobj, targetmode/*:?string*/)/*:number*/ { if(!relobj) relobj = {}; if(!rels['!id']) rels['!id'] = {}; if(!rels['!idx']) rels['!idx'] = 1; if(rId < 0) for(rId = rels['!idx']; rels['!id']['rId' + rId]; ++rId){/* empty */} rels['!idx'] = rId + 1; relobj.Id = 'rId' + rId; relobj.Type = type; relobj.Target = f; if(targetmode) relobj.TargetMode = targetmode; else if([RELS.HLINK, RELS.XPATH, RELS.XMISS].indexOf(relobj.Type) > -1) relobj.TargetMode = "External"; if(rels['!id'][relobj.Id]) throw new Error("Cannot rewrite rId " + rId); rels['!id'][relobj.Id] = relobj; rels[('/' + relobj.Target).replace("//","/")] = relobj; return rId; } /* Open Document Format for Office Applications (OpenDocument) Version 1.2 */ /* Part 3 Section 4 Manifest File */ var CT_ODS = "application/vnd.oasis.opendocument.spreadsheet"; function parse_manifest(d, opts) { var str = xlml_normalize(d); var Rn; var FEtag; while((Rn = xlmlregex.exec(str))) switch(Rn[3]) { case 'manifest': break; // 4.2 case 'file-entry': // 4.3 FEtag = parsexmltag(Rn[0], false); if(FEtag.path == '/' && FEtag.type !== CT_ODS) throw new Error("This OpenDocument is not a spreadsheet"); break; case 'encryption-data': // 4.4 case 'algorithm': // 4.5 case 'start-key-generation': // 4.6 case 'key-derivation': // 4.7 throw new Error("Unsupported ODS Encryption"); default: if(opts && opts.WTF) throw Rn; } } function write_manifest(manifest/*:Array >*/)/*:string*/ { var o = [XML_HEADER]; o.push('\n'); o.push(' \n'); for(var i = 0; i < manifest.length; ++i) o.push(' \n'); o.push(''); return o.join(""); } /* Part 3 Section 6 Metadata Manifest File */ function write_rdf_type(file/*:string*/, res/*:string*/, tag/*:?string*/) { return [ ' \n', ' \n', ' \n' ].join(""); } function write_rdf_has(base/*:string*/, file/*:string*/) { return [ ' \n', ' \n', ' \n' ].join(""); } function write_rdf(rdf) { var o = [XML_HEADER]; o.push('\n'); for(var i = 0; i != rdf.length; ++i) { o.push(write_rdf_type(rdf[i][0], rdf[i][1])); o.push(write_rdf_has("",rdf[i][0])); } o.push(write_rdf_type("","Document", "pkg")); o.push(''); return o.join(""); } /* TODO: pull properties */ function write_meta_ods(/*:: wb: Workbook, opts: any*/)/*:string*/ { return 'Sheet' + 'JS ' + XLSX.version + ''; } /* ECMA-376 Part II 11.1 Core Properties Part */ /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */ var CORE_PROPS/*:Array >*/ = [ ["cp:category", "Category"], ["cp:contentStatus", "ContentStatus"], ["cp:keywords", "Keywords"], ["cp:lastModifiedBy", "LastAuthor"], ["cp:lastPrinted", "LastPrinted"], ["cp:revision", "RevNumber"], ["cp:version", "Version"], ["dc:creator", "Author"], ["dc:description", "Comments"], ["dc:identifier", "Identifier"], ["dc:language", "Language"], ["dc:subject", "Subject"], ["dc:title", "Title"], ["dcterms:created", "CreatedDate", 'date'], ["dcterms:modified", "ModifiedDate", 'date'] ]; var CORE_PROPS_REGEX/*:Array*/ = /*#__PURE__*/(function() { var r = new Array(CORE_PROPS.length); for(var i = 0; i < CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; var g = "(?:"+ f[0].slice(0,f[0].indexOf(":")) +":)"+ f[0].slice(f[0].indexOf(":")+1); r[i] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">"); } return r; })(); function parse_core_props(data) { var p = {}; data = utf8read(data); for(var i = 0; i < CORE_PROPS.length; ++i) { var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]); if(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]); if(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]); } return p; } function cp_doit(f, g, h, o, p) { if(p[f] != null || g == null || g === "") return; p[f] = g; g = escapexml(g); o[o.length] = (h ? writextag(f,g,h) : writetag(f,g)); } function write_core_props(cp, _opts) { var opts = _opts || {}; var o = [XML_HEADER, writextag('cp:coreProperties', null, { //'xmlns': XMLNS.CORE_PROPS, 'xmlns:cp': XMLNS.CORE_PROPS, 'xmlns:dc': XMLNS.dc, 'xmlns:dcterms': XMLNS.dcterms, 'xmlns:dcmitype': XMLNS.dcmitype, 'xmlns:xsi': XMLNS.xsi })], p = {}; if(!cp && !opts.Props) return o.join(""); if(cp) { if(cp.CreatedDate != null) cp_doit("dcterms:created", typeof cp.CreatedDate === "string" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p); if(cp.ModifiedDate != null) cp_doit("dcterms:modified", typeof cp.ModifiedDate === "string" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p); } for(var i = 0; i != CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; var v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null; if(v === true) v = "1"; else if(v === false) v = "0"; else if(typeof v == "number") v = String(v); if(v != null) cp_doit(f[0], v, null, o, p); } if(o.length>2){ o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* 15.2.12.3 Extended File Properties Part */ /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */ var EXT_PROPS/*:Array >*/ = [ ["Application", "Application", "string"], ["AppVersion", "AppVersion", "string"], ["Company", "Company", "string"], ["DocSecurity", "DocSecurity", "string"], ["Manager", "Manager", "string"], ["HyperlinksChanged", "HyperlinksChanged", "bool"], ["SharedDoc", "SharedDoc", "bool"], ["LinksUpToDate", "LinksUpToDate", "bool"], ["ScaleCrop", "ScaleCrop", "bool"], ["HeadingPairs", "HeadingPairs", "raw"], ["TitlesOfParts", "TitlesOfParts", "raw"] ]; var PseudoPropsPairs = [ "Worksheets", "SheetNames", "NamedRanges", "DefinedNames", "Chartsheets", "ChartNames" ]; function load_props_pairs(HP/*:string|Array>*/, TOP, props, opts) { var v = []; if(typeof HP == "string") v = parseVector(HP, opts); else for(var j = 0; j < HP.length; ++j) v = v.concat(HP[j].map(function(hp) { return {v:hp}; })); var parts = (typeof TOP == "string") ? parseVector(TOP, opts).map(function (x) { return x.v; }) : TOP; var idx = 0, len = 0; if(parts.length > 0) for(var i = 0; i !== v.length; i += 2) { len = +(v[i+1].v); switch(v[i].v) { case "Worksheets": case "工作表": case "Листы": case "أوراق العمل": case "ワークシート": case "גליונות עבודה": case "Arbeitsblätter": case "Çalışma Sayfaları": case "Feuilles de calcul": case "Fogli di lavoro": case "Folhas de cálculo": case "Planilhas": case "Regneark": case "Hojas de cálculo": case "Werkbladen": props.Worksheets = len; props.SheetNames = parts.slice(idx, idx + len); break; case "Named Ranges": case "Rangos con nombre": case "名前付き一覧": case "Benannte Bereiche": case "Navngivne områder": props.NamedRanges = len; props.DefinedNames = parts.slice(idx, idx + len); break; case "Charts": case "Diagramme": props.Chartsheets = len; props.ChartNames = parts.slice(idx, idx + len); break; } idx += len; } } function parse_ext_props(data, p, opts) { var q = {}; if(!p) p = {}; data = utf8read(data); EXT_PROPS.forEach(function(f) { var xml = (data.match(matchtag(f[0]))||[])[1]; switch(f[2]) { case "string": if(xml) p[f[1]] = unescapexml(xml); break; case "bool": p[f[1]] = xml === "true"; break; case "raw": var cur = data.match(new RegExp("<" + f[0] + "[^>]*>([\\s\\S]*?)<\/" + f[0] + ">")); if(cur && cur.length > 0) q[f[1]] = cur[1]; break; } }); if(q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts); return p; } function write_ext_props(cp/*::, opts*/)/*:string*/ { var o/*:Array*/ = [], W = writextag; if(!cp) cp = {}; cp.Application = "SheetJS"; o[o.length] = (XML_HEADER); o[o.length] = (writextag('Properties', null, { 'xmlns': XMLNS.EXT_PROPS, 'xmlns:vt': XMLNS.vt })); EXT_PROPS.forEach(function(f) { if(cp[f[1]] === undefined) return; var v; switch(f[2]) { case 'string': v = escapexml(String(cp[f[1]])); break; case 'bool': v = cp[f[1]] ? 'true' : 'false'; break; } if(v !== undefined) o[o.length] = (W(f[0], v)); }); /* TODO: HeadingPairs, TitlesOfParts */ o[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', 'Worksheets')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:"variant"}))); o[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return "" + escapexml(s) + ""; }).join(""), {size: cp.Worksheets, baseType:"lpstr"}))); if(o.length>2){ o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* 15.2.12.2 Custom File Properties Part */ var custregex = /<[^>]+>[^<]*/g; function parse_cust_props(data/*:string*/, opts) { var p = {}, name = ""; var m = data.match(custregex); if(m) for(var i = 0; i != m.length; ++i) { var x = m[i], y = parsexmltag(x); switch(y[0]) { case '': name = null; break; default: if (x.indexOf(''); var type = toks[0].slice(4), text = toks[1]; /* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */ switch(type) { case 'lpstr': case 'bstr': case 'lpwstr': p[name] = unescapexml(text); break; case 'bool': p[name] = parsexmlbool(text); break; case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint': p[name] = parseInt(text, 10); break; case 'r4': case 'r8': case 'decimal': p[name] = parseFloat(text); break; case 'filetime': case 'date': p[name] = parseDate(text); break; case 'cy': case 'error': p[name] = unescapexml(text); break; default: if(type.slice(-1) == '/') break; if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks); } } else if(x.slice(0,2) === "2){ o[o.length] = ''; o[1]=o[1].replace("/>",">"); } return o.join(""); } /* Common Name -> XLML Name */ var XLMLDocPropsMap = { Title: 'Title', Subject: 'Subject', Author: 'Author', Keywords: 'Keywords', Comments: 'Description', LastAuthor: 'LastAuthor', RevNumber: 'Revision', Application: 'AppName', /* TotalTime: 'TotalTime', */ LastPrinted: 'LastPrinted', CreatedDate: 'Created', ModifiedDate: 'LastSaved', /* Pages */ /* Words */ /* Characters */ Category: 'Category', /* PresentationFormat */ Manager: 'Manager', Company: 'Company', /* Guid */ /* HyperlinkBase */ /* Bytes */ /* Lines */ /* Paragraphs */ /* CharactersWithSpaces */ AppVersion: 'Version', ContentStatus: 'ContentStatus', /* NOTE: missing from schema */ Identifier: 'Identifier', /* NOTE: missing from schema */ Language: 'Language' /* NOTE: missing from schema */ }; var evert_XLMLDPM; function xlml_set_prop(Props, tag/*:string*/, val) { if(!evert_XLMLDPM) evert_XLMLDPM = evert(XLMLDocPropsMap); tag = evert_XLMLDPM[tag] || tag; Props[tag] = val; } function xlml_write_docprops(Props, opts) { var o/*:Array*/ = []; keys(XLMLDocPropsMap).map(function(m) { for(var i = 0; i < CORE_PROPS.length; ++i) if(CORE_PROPS[i][1] == m) return CORE_PROPS[i]; for(i = 0; i < EXT_PROPS.length; ++i) if(EXT_PROPS[i][1] == m) return EXT_PROPS[i]; throw m; }).forEach(function(p) { if(Props[p[1]] == null) return; var m = opts && opts.Props && opts.Props[p[1]] != null ? opts.Props[p[1]] : Props[p[1]]; switch(p[2]) { case 'date': m = new Date(m).toISOString().replace(/\.\d*Z/,"Z"); break; } if(typeof m == 'number') m = String(m); else if(m === true || m === false) { m = m ? "1" : "0"; } else if(m instanceof Date) m = new Date(m).toISOString().replace(/\.\d*Z/,""); o.push(writetag(XLMLDocPropsMap[p[1]] || p[1], m)); }); return writextag('DocumentProperties', o.join(""), {xmlns:XLMLNS.o }); } function xlml_write_custprops(Props, Custprops/*::, opts*/) { var BLACKLIST = ["Worksheets","SheetNames"]; var T = 'CustomDocumentProperties'; var o/*:Array*/ = []; if(Props) keys(Props).forEach(function(k) { /*:: if(!Props) return; */ if(!Object.prototype.hasOwnProperty.call(Props, k)) return; for(var i = 0; i < CORE_PROPS.length; ++i) if(k == CORE_PROPS[i][1]) return; for(i = 0; i < EXT_PROPS.length; ++i) if(k == EXT_PROPS[i][1]) return; for(i = 0; i < BLACKLIST.length; ++i) if(k == BLACKLIST[i]) return; var m = Props[k]; var t = "string"; if(typeof m == 'number') { t = "float"; m = String(m); } else if(m === true || m === false) { t = "boolean"; m = m ? "1" : "0"; } else m = String(m); o.push(writextag(escapexmltag(k), m, {"dt:dt":t})); }); if(Custprops) keys(Custprops).forEach(function(k) { /*:: if(!Custprops) return; */ if(!Object.prototype.hasOwnProperty.call(Custprops, k)) return; if(Props && Object.prototype.hasOwnProperty.call(Props, k)) return; var m = Custprops[k]; var t = "string"; if(typeof m == 'number') { t = "float"; m = String(m); } else if(m === true || m === false) { t = "boolean"; m = m ? "1" : "0"; } else if(m instanceof Date) { t = "dateTime.tz"; m = m.toISOString(); } else m = String(m); o.push(writextag(escapexmltag(k), m, {"dt:dt":t})); }); return '<' + T + ' xmlns="' + XLMLNS.o + '">' + o.join("") + ''; } /* [MS-DTYP] 2.3.3 FILETIME */ /* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */ /* [MS-OLEPS] 2.8 FILETIME (Packet Version) */ function parse_FILETIME(blob) { var dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4); return new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\.000/,""); } function write_FILETIME(time/*:string|Date*/) { var date = (typeof time == "string") ? new Date(Date.parse(time)) : time; var t = date.getTime() / 1000 + 11644473600; var l = t % Math.pow(2,32), h = (t - l) / Math.pow(2,32); l *= 1e7; h *= 1e7; var w = (l / Math.pow(2,32)) | 0; if(w > 0) { l = l % Math.pow(2,32); h += w; } var o = new_buf(8); o.write_shift(4, l); o.write_shift(4, h); return o; } /* [MS-OSHARED] 2.3.3.1.4 Lpstr */ function parse_lpstr(blob, type, pad/*:?number*/) { var start = blob.l; var str = blob.read_shift(0, 'lpstr-cp'); if(pad) while((blob.l - start) & 3) ++blob.l; return str; } /* [MS-OSHARED] 2.3.3.1.6 Lpwstr */ function parse_lpwstr(blob, type, pad) { var str = blob.read_shift(0, 'lpwstr'); if(pad) blob.l += (4 - ((str.length+1) & 3)) & 3; return str; } /* [MS-OSHARED] 2.3.3.1.11 VtString */ /* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */ function parse_VtStringBase(blob, stringType, pad) { if(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob); return parse_lpstr(blob, stringType, pad); } function parse_VtString(blob, t/*:number*/, pad/*:?boolean*/) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); } function parse_VtUnalignedString(blob, t/*:number*/) { if(!t) throw new Error("VtUnalignedString must have positive length"); return parse_VtStringBase(blob, t, 0); } /* [MS-OSHARED] 2.3.3.1.7 VtVecLpwstrValue */ function parse_VtVecLpwstrValue(blob)/*:Array*/ { var length = blob.read_shift(4); var ret/*:Array*/ = []; for(var i = 0; i != length; ++i) { var start = blob.l; ret[i] = blob.read_shift(0, 'lpwstr').replace(chr0,''); if((blob.l - start) & 0x02) blob.l += 2; } return ret; } /* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */ function parse_VtVecUnalignedLpstrValue(blob)/*:Array*/ { var length = blob.read_shift(4); var ret/*:Array*/ = []; for(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr-cp').replace(chr0,''); return ret; } /* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */ function parse_VtHeadingPair(blob) { var start = blob.l; var headingString = parse_TypedPropertyValue(blob, VT_USTR); if(blob[blob.l] == 0x00 && blob[blob.l+1] == 0x00 && ((blob.l - start) & 0x02)) blob.l += 2; var headerParts = parse_TypedPropertyValue(blob, VT_I4); return [headingString, headerParts]; } /* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */ function parse_VtVecHeadingPairValue(blob) { var cElements = blob.read_shift(4); var out = []; for(var i = 0; i < cElements / 2; ++i) out.push(parse_VtHeadingPair(blob)); return out; } /* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */ function parse_dictionary(blob,CodePage) { var cnt = blob.read_shift(4); var dict/*:{[number]:string}*/ = ({}/*:any*/); for(var j = 0; j != cnt; ++j) { var pid = blob.read_shift(4); var len = blob.read_shift(4); dict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!'); if(CodePage === 0x4B0 && (len % 2)) blob.l += 2; } if(blob.l & 3) blob.l = (blob.l>>2+1)<<2; return dict; } /* [MS-OLEPS] 2.9 BLOB */ function parse_BLOB(blob) { var size = blob.read_shift(4); var bytes = blob.slice(blob.l,blob.l+size); blob.l += size; if((size & 3) > 0) blob.l += (4 - (size & 3)) & 3; return bytes; } /* [MS-OLEPS] 2.11 ClipboardData */ function parse_ClipboardData(blob) { // TODO var o = {}; o.Size = blob.read_shift(4); //o.Format = blob.read_shift(4); blob.l += o.Size + 3 - (o.Size - 1) % 4; return o; } /* [MS-OLEPS] 2.15 TypedPropertyValue */ function parse_TypedPropertyValue(blob, type/*:number*/, _opts)/*:any*/ { var t = blob.read_shift(2), ret, opts = _opts||{}; blob.l += 2; if(type !== VT_VARIANT) if(t !== type && VT_CUSTOM.indexOf(type)===-1 && !((type & 0xFFFE) == 0x101E && (t & 0xFFFE) == 0x101E)) throw new Error('Expected type ' + type + ' saw ' + t); switch(type === VT_VARIANT ? t : type) { case 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret; case 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret; case 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0; case 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret; case 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,''); case 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob); case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob); case 0x41 /*VT_BLOB*/: return parse_BLOB(blob); case 0x47 /*VT_CF*/: return parse_ClipboardData(blob); case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,''); case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,''); case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPairValue(blob); case 0x101E /*VT_VECTOR|VT_LPSTR*/: case 0x101F /*VT_VECTOR|VT_LPWSTR*/: return t == 0x101F ? parse_VtVecLpwstrValue(blob) : parse_VtVecUnalignedLpstrValue(blob); default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + t); } } function write_TypedPropertyValue(type/*:number*/, value) { var o = new_buf(4), p = new_buf(4); o.write_shift(4, type == 0x50 ? 0x1F : type); switch(type) { case 0x03 /*VT_I4*/: p.write_shift(-4, value); break; case 0x05 /*VT_I4*/: p = new_buf(8); p.write_shift(8, value, 'f'); break; case 0x0B /*VT_BOOL*/: p.write_shift(4, value ? 0x01 : 0x00); break; case 0x40 /*VT_FILETIME*/: /*:: if(typeof value !== "string" && !(value instanceof Date)) throw "unreachable"; */ p = write_FILETIME(value); break; case 0x1F /*VT_LPWSTR*/: case 0x50 /*VT_STRING*/: /*:: if(typeof value !== "string") throw "unreachable"; */ p = new_buf(4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2)); p.write_shift(4, value.length + 1); p.write_shift(0, value, "dbcs"); while(p.l != p.length) p.write_shift(1, 0); break; default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + value); } return bconcat([o, p]); } /* [MS-OLEPS] 2.20 PropertySet */ function parse_PropertySet(blob, PIDSI) { var start_addr = blob.l; var size = blob.read_shift(4); var NumProps = blob.read_shift(4); var Props = [], i = 0; var CodePage = 0; var Dictionary = -1, DictObj/*:{[number]:string}*/ = ({}/*:any*/); for(i = 0; i != NumProps; ++i) { var PropID = blob.read_shift(4); var Offset = blob.read_shift(4); Props[i] = [PropID, Offset + start_addr]; } Props.sort(function(x,y) { return x[1] - y[1]; }); var PropH = {}; for(i = 0; i != NumProps; ++i) { if(blob.l !== Props[i][1]) { var fail = true; if(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) { case 0x02 /*VT_I2*/: if(blob.l+2 === Props[i][1]) { blob.l+=2; fail = false; } break; case 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break; case 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break; } if((!PIDSI||i==0) && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; } if(fail) throw new Error("Read Error: Expected address " + Props[i][1] + ' at ' + blob.l + ' :' + i); } if(PIDSI) { var piddsi = PIDSI[Props[i][0]]; PropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true}); if(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + "." + ("0000" + String(PropH[piddsi.n] & 0xFFFF)).slice(-4); if(piddsi.n == "CodePage") switch(PropH[piddsi.n]) { case 0: PropH[piddsi.n] = 1252; /* falls through */ case 874: case 932: case 936: case 949: case 950: case 1250: case 1251: case 1253: case 1254: case 1255: case 1256: case 1257: case 1258: case 10000: case 1200: case 1201: case 1252: case 65000: case -536: case 65001: case -535: set_cp(CodePage = (PropH[piddsi.n]>>>0) & 0xFFFF); break; default: throw new Error("Unsupported CodePage: " + PropH[piddsi.n]); } } else { if(Props[i][0] === 0x1) { CodePage = PropH.CodePage = (parse_TypedPropertyValue(blob, VT_I2)/*:number*/); set_cp(CodePage); if(Dictionary !== -1) { var oldpos = blob.l; blob.l = Props[Dictionary][1]; DictObj = parse_dictionary(blob,CodePage); blob.l = oldpos; } } else if(Props[i][0] === 0) { if(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; } DictObj = parse_dictionary(blob,CodePage); } else { var name = DictObj[Props[i][0]]; var val; /* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */ switch(blob[blob.l]) { case 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break; case 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\u0000+$/,""); break; case 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\u0000+$/,""); break; case 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break; case 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break; case 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break; case 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break; case 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break; default: throw new Error("unparsed value: " + blob[blob.l]); } PropH[name] = val; } } } blob.l = start_addr + size; /* step ahead to skip padding */ return PropH; } var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ]; //.concat(PseudoPropsPairs); function guess_property_type(val/*:any*/)/*:number*/ { switch(typeof val) { case "boolean": return 0x0B; case "number": return ((val|0)==val) ? 0x03 : 0x05; case "string": return 0x1F; case "object": if(val instanceof Date) return 0x40; break; } return -1; } function write_PropertySet(entries, RE, PIDSI) { var hdr = new_buf(8), piao = [], prop = []; var sz = 8, i = 0; var pr = new_buf(8), pio = new_buf(8); pr.write_shift(4, 0x0002); pr.write_shift(4, 0x04B0); pio.write_shift(4, 0x0001); prop.push(pr); piao.push(pio); sz += 8 + pr.length; if(!RE) { pio = new_buf(8); pio.write_shift(4, 0); piao.unshift(pio); var bufs = [new_buf(4)]; bufs[0].write_shift(4, entries.length); for(i = 0; i < entries.length; ++i) { var value = entries[i][0]; pr = new_buf(4 + 4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2)); pr.write_shift(4, i+2); pr.write_shift(4, value.length + 1); pr.write_shift(0, value, "dbcs"); while(pr.l != pr.length) pr.write_shift(1, 0); bufs.push(pr); } pr = bconcat(bufs); prop.unshift(pr); sz += 8 + pr.length; } for(i = 0; i < entries.length; ++i) { if(RE && !RE[entries[i][0]]) continue; if(XLSPSSkip.indexOf(entries[i][0]) > -1 || PseudoPropsPairs.indexOf(entries[i][0]) > -1) continue; if(entries[i][1] == null) continue; var val = entries[i][1], idx = 0; if(RE) { idx = +RE[entries[i][0]]; var pinfo = (PIDSI/*:: || {}*/)[idx]/*:: || {} */; if(pinfo.p == "version" && typeof val == "string") { /*:: if(typeof val !== "string") throw "unreachable"; */ var arr = val.split("."); val = ((+arr[0])<<16) + ((+arr[1])||0); } pr = write_TypedPropertyValue(pinfo.t, val); } else { var T = guess_property_type(val); if(T == -1) { T = 0x1F; val = String(val); } pr = write_TypedPropertyValue(T, val); } prop.push(pr); pio = new_buf(8); pio.write_shift(4, !RE ? 2+i : idx); piao.push(pio); sz += 8 + pr.length; } var w = 8 * (prop.length + 1); for(i = 0; i < prop.length; ++i) { piao[i].write_shift(4, w); w += prop[i].length; } hdr.write_shift(4, sz); hdr.write_shift(4, prop.length); return bconcat([hdr].concat(piao).concat(prop)); } /* [MS-OLEPS] 2.21 PropertySetStream */ function parse_PropertySetStream(file, PIDSI, clsid) { var blob = file.content; if(!blob) return ({}/*:any*/); prep_blob(blob, 0); var NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0; blob.chk('feff', 'Byte Order: '); /*var vers = */blob.read_shift(2); // TODO: check version var SystemIdentifier = blob.read_shift(4); var CLSID = blob.read_shift(16); if(CLSID !== CFB.utils.consts.HEADER_CLSID && CLSID !== clsid) throw new Error("Bad PropertySet CLSID " + CLSID); NumSets = blob.read_shift(4); if(NumSets !== 1 && NumSets !== 2) throw new Error("Unrecognized #Sets: " + NumSets); FMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4); if(NumSets === 1 && Offset0 !== blob.l) throw new Error("Length mismatch: " + Offset0 + " !== " + blob.l); else if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); } var PSet0 = parse_PropertySet(blob, PIDSI); var rval = ({ SystemIdentifier: SystemIdentifier }/*:any*/); for(var y in PSet0) rval[y] = PSet0[y]; //rval.blob = blob; rval.FMTID = FMTID0; //rval.PSet0 = PSet0; if(NumSets === 1) return rval; if(Offset1 - blob.l == 2) blob.l += 2; if(blob.l !== Offset1) throw new Error("Length mismatch 2: " + blob.l + " !== " + Offset1); var PSet1; try { PSet1 = parse_PropertySet(blob, null); } catch(e) {/* empty */} for(y in PSet1) rval[y] = PSet1[y]; rval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1 return rval; } function write_PropertySetStream(entries, clsid, RE, PIDSI/*:{[key:string|number]:any}*/, entries2/*:?any*/, clsid2/*:?any*/) { var hdr = new_buf(entries2 ? 68 : 48); var bufs = [hdr]; hdr.write_shift(2, 0xFFFE); hdr.write_shift(2, 0x0000); /* TODO: type 1 props */ hdr.write_shift(4, 0x32363237); hdr.write_shift(16, CFB.utils.consts.HEADER_CLSID, "hex"); hdr.write_shift(4, (entries2 ? 2 : 1)); hdr.write_shift(16, clsid, "hex"); hdr.write_shift(4, (entries2 ? 68 : 48)); var ps0 = write_PropertySet(entries, RE, PIDSI); bufs.push(ps0); if(entries2) { var ps1 = write_PropertySet(entries2, null, null); hdr.write_shift(16, clsid2, "hex"); hdr.write_shift(4, 68 + ps0.length); bufs.push(ps1); } return bconcat(bufs); } function parsenoop2(blob, length) { blob.read_shift(length); return null; } function writezeroes(n, o) { if(!o) o=new_buf(n); for(var j=0; j= 12 ? 2 : 1); var encoding = 'sbcs-cont'; var cp = current_codepage; if(opts && opts.biff >= 8) current_codepage = 1200; if(!opts || opts.biff == 8 ) { var fHighByte = blob.read_shift(1); if(fHighByte) { encoding = 'dbcs-cont'; } } else if(opts.biff == 12) { encoding = 'wstr'; } if(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr'; var o = cch ? blob.read_shift(cch, encoding) : ""; current_codepage = cp; return o; } /* 2.5.293 XLUnicodeRichExtendedString */ function parse_XLUnicodeRichExtendedString(blob) { var cp = current_codepage; current_codepage = 1200; var cch = blob.read_shift(2), flags = blob.read_shift(1); var /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4, fRichSt = flags & 0x8; var width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs var cRun = 0, cbExtRst; var z = {}; if(fRichSt) cRun = blob.read_shift(2); if(fExtSt) cbExtRst = blob.read_shift(4); var encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont'; var msg = cch === 0 ? "" : blob.read_shift(cch, encoding); if(fRichSt) blob.l += 4 * cRun; //TODO: parse this if(fExtSt) blob.l += cbExtRst; //TODO: parse this z.t = msg; if(!fRichSt) { z.raw = "" + z.t + ""; z.r = z.t; } current_codepage = cp; return z; } function write_XLUnicodeRichExtendedString(xlstr/*:: :XLString, opts*/) { var str = (xlstr.t||""), nfmts = 1; var hdr = new_buf(3 + (nfmts > 1 ? 2 : 0)); hdr.write_shift(2, str.length); hdr.write_shift(1, (nfmts > 1 ? 0x08 : 0x00) | 0x01); if(nfmts > 1) hdr.write_shift(2, nfmts); var otext = new_buf(2 * str.length); otext.write_shift(2 * str.length, str, 'utf16le'); var out = [hdr, otext]; return bconcat(out); } /* 2.5.296 XLUnicodeStringNoCch */ function parse_XLUnicodeStringNoCch(blob, cch, opts) { var retval; if(opts) { if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr'); if(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont'); } var fHighByte = blob.read_shift(1); if(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); } else { retval = blob.read_shift(cch, 'dbcs-cont'); } return retval; } /* 2.5.294 XLUnicodeString */ function parse_XLUnicodeString(blob, length, opts) { var cch = blob.read_shift(opts && opts.biff == 2 ? 1 : 2); if(cch === 0) { blob.l++; return ""; } return parse_XLUnicodeStringNoCch(blob, cch, opts); } /* BIFF5 override */ function parse_XLUnicodeString2(blob, length, opts) { if(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts); var cch = blob.read_shift(1); if(cch === 0) { blob.l++; return ""; } return blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont'); } /* TODO: BIFF5 and lower, codepage awareness */ function write_XLUnicodeString(str, opts, o) { if(!o) o = new_buf(3 + 2 * str.length); o.write_shift(2, str.length); o.write_shift(1, 1); o.write_shift(31, str, 'utf16le'); return o; } /* [MS-XLS] 2.5.61 ControlInfo */ function parse_ControlInfo(blob/*::, length, opts*/) { var flags = blob.read_shift(1); blob.l++; var accel = blob.read_shift(2); blob.l += 2; return [flags, accel]; } /* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */ function parse_URLMoniker(blob/*::, length, opts*/) { var len = blob.read_shift(4), start = blob.l; var extra = false; if(len > 24) { /* look ahead */ blob.l += len - 24; if(blob.read_shift(16) === "795881f43b1d7f48af2c825dc4852763") extra = true; blob.l = start; } var url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,""); if(extra) blob.l += 24; return url; } /* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */ function parse_FileMoniker(blob/*::, length*/) { var cAnti = blob.read_shift(2); var preamble = ""; while(cAnti-- > 0) preamble += "../"; var ansiPath = blob.read_shift(0, 'lpstr-ansi'); blob.l += 2; //var endServer = blob.read_shift(2); if(blob.read_shift(2) != 0xDEAD) throw new Error("Bad FileMoniker"); var sz = blob.read_shift(4); if(sz === 0) return preamble + ansiPath.replace(/\\/g,"/"); var bytes = blob.read_shift(4); if(blob.read_shift(2) != 3) throw new Error("Bad FileMoniker"); var unicodePath = blob.read_shift(bytes>>1, 'utf16le').replace(chr0,""); return preamble + unicodePath; } /* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */ function parse_HyperlinkMoniker(blob, length) { var clsid = blob.read_shift(16); length -= 16; switch(clsid) { case "e0c9ea79f9bace118c8200aa004ba90b": return parse_URLMoniker(blob, length); case "0303000000000000c000000000000046": return parse_FileMoniker(blob, length); default: throw new Error("Unsupported Moniker " + clsid); } } /* [MS-OSHARED] 2.3.7.9 HyperlinkString */ function parse_HyperlinkString(blob/*::, length*/) { var len = blob.read_shift(4); var o = len > 0 ? blob.read_shift(len, 'utf16le').replace(chr0, "") : ""; return o; } function write_HyperlinkString(str/*:string*/, o) { if(!o) o = new_buf(6 + str.length * 2); o.write_shift(4, 1 + str.length); for(var i = 0; i < str.length; ++i) o.write_shift(2, str.charCodeAt(i)); o.write_shift(2, 0); return o; } /* [MS-OSHARED] 2.3.7.1 Hyperlink Object */ function parse_Hyperlink(blob, length)/*:Hyperlink*/ { var end = blob.l + length; var sVer = blob.read_shift(4); if(sVer !== 2) throw new Error("Unrecognized streamVersion: " + sVer); var flags = blob.read_shift(2); blob.l += 2; var displayName, targetFrameName, moniker, oleMoniker, Loc="", guid, fileTime; if(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l); if(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l); if((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l); if((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l); if(flags & 0x0008) Loc = parse_HyperlinkString(blob, end - blob.l); if(flags & 0x0020) guid = blob.read_shift(16); if(flags & 0x0040) fileTime = parse_FILETIME(blob/*, 8*/); blob.l = end; var target = targetFrameName||moniker||oleMoniker||""; if(target && Loc) target+="#"+Loc; if(!target) target = "#" + Loc; if((flags & 0x0002) && target.charAt(0) == "/" && target.charAt(1) != "/") target = "file://" + target; var out = ({Target:target}/*:any*/); if(guid) out.guid = guid; if(fileTime) out.time = fileTime; if(displayName) out.Tooltip = displayName; return out; } function write_Hyperlink(hl) { var out = new_buf(512), i = 0; var Target = hl.Target; if(Target.slice(0,7) == "file://") Target = Target.slice(7); var hashidx = Target.indexOf("#"); var F = hashidx > -1 ? 0x1f : 0x17; switch(Target.charAt(0)) { case "#": F=0x1c; break; case ".": F&=~2; break; } out.write_shift(4,2); out.write_shift(4, F); var data = [8,6815827,6619237,4849780,83]; for(i = 0; i < data.length; ++i) out.write_shift(4, data[i]); if(F == 0x1C) { Target = Target.slice(1); write_HyperlinkString(Target, out); } else if(F & 0x02) { data = "e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" "); for(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16)); var Pretarget = hashidx > -1 ? Target.slice(0, hashidx) : Target; out.write_shift(4, 2*(Pretarget.length + 1)); for(i = 0; i < Pretarget.length; ++i) out.write_shift(2, Pretarget.charCodeAt(i)); out.write_shift(2, 0); if(F & 0x08) write_HyperlinkString(hashidx > -1 ? Target.slice(hashidx+1): "", out); } else { data = "03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46".split(" "); for(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16)); var P = 0; while(Target.slice(P*3,P*3+3)=="../"||Target.slice(P*3,P*3+3)=="..\\") ++P; out.write_shift(2, P); out.write_shift(4, Target.length - 3 * P + 1); for(i = 0; i < Target.length - 3 * P; ++i) out.write_shift(1, Target.charCodeAt(i + 3 * P) & 0xFF); out.write_shift(1, 0); out.write_shift(2, 0xFFFF); out.write_shift(2, 0xDEAD); for(i = 0; i < 6; ++i) out.write_shift(4, 0); } return out.slice(0, out.l); } /* 2.5.178 LongRGBA */ function parse_LongRGBA(blob/*::, length*/) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; } /* 2.5.177 LongRGB */ function parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; } /* [MS-XLS] 2.5.19 */ function parse_XLSCell(blob/*::, length*/)/*:Cell*/ { var rw = blob.read_shift(2); // 0-indexed var col = blob.read_shift(2); var ixfe = blob.read_shift(2); return ({r:rw, c:col, ixfe:ixfe}/*:any*/); } function write_XLSCell(R/*:number*/, C/*:number*/, ixfe/*:?number*/, o) { if(!o) o = new_buf(6); o.write_shift(2, R); o.write_shift(2, C); o.write_shift(2, ixfe||0); return o; } /* [MS-XLS] 2.5.134 */ function parse_frtHeader(blob) { var rt = blob.read_shift(2); var flags = blob.read_shift(2); // TODO: parse these flags blob.l += 8; return {type: rt, flags: flags}; } function parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? "" : parse_XLUnicodeString2(blob, length, opts); } /* [MS-XLS] 2.5.344 */ function parse_XTI(blob, length, opts) { var w = opts.biff > 8 ? 4 : 2; var iSupBook = blob.read_shift(w), itabFirst = blob.read_shift(w,'i'), itabLast = blob.read_shift(w,'i'); return [iSupBook, itabFirst, itabLast]; } /* [MS-XLS] 2.5.218 */ function parse_RkRec(blob) { var ixfe = blob.read_shift(2); var RK = parse_RkNumber(blob); return [ixfe, RK]; } /* [MS-XLS] 2.5.1 */ function parse_AddinUdf(blob, length, opts) { blob.l += 4; length -= 4; var l = blob.l + length; var udfName = parse_ShortXLUnicodeString(blob, length, opts); var cb = blob.read_shift(2); l -= blob.l; if(cb !== l) throw new Error("Malformed AddinUdf: padding = " + l + " != " + cb); blob.l += cb; return udfName; } /* [MS-XLS] 2.5.209 TODO: Check sizes */ function parse_Ref8U(blob/*::, length*/) { var rwFirst = blob.read_shift(2); var rwLast = blob.read_shift(2); var colFirst = blob.read_shift(2); var colLast = blob.read_shift(2); return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}}; } function write_Ref8U(r/*:Range*/, o) { if(!o) o = new_buf(8); o.write_shift(2, r.s.r); o.write_shift(2, r.e.r); o.write_shift(2, r.s.c); o.write_shift(2, r.e.c); return o; } /* [MS-XLS] 2.5.211 */ function parse_RefU(blob/*::, length*/) { var rwFirst = blob.read_shift(2); var rwLast = blob.read_shift(2); var colFirst = blob.read_shift(1); var colLast = blob.read_shift(1); return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}}; } /* [MS-XLS] 2.5.207 */ var parse_Ref = parse_RefU; /* [MS-XLS] 2.5.143 */ function parse_FtCmo(blob/*::, length*/) { blob.l += 4; var ot = blob.read_shift(2); var id = blob.read_shift(2); var flags = blob.read_shift(2); blob.l+=12; return [id, ot, flags]; } /* [MS-XLS] 2.5.149 */ function parse_FtNts(blob) { var out = {}; blob.l += 4; blob.l += 16; // GUID TODO out.fSharedNote = blob.read_shift(2); blob.l += 4; return out; } /* [MS-XLS] 2.5.142 */ function parse_FtCf(blob) { var out = {}; blob.l += 4; blob.cf = blob.read_shift(2); return out; } /* [MS-XLS] 2.5.140 - 2.5.154 and friends */ function parse_FtSkip(blob) { blob.l += 2; blob.l += blob.read_shift(2); } var FtTab = { /*::[*/0x00/*::]*/: parse_FtSkip, /* FtEnd */ /*::[*/0x04/*::]*/: parse_FtSkip, /* FtMacro */ /*::[*/0x05/*::]*/: parse_FtSkip, /* FtButton */ /*::[*/0x06/*::]*/: parse_FtSkip, /* FtGmo */ /*::[*/0x07/*::]*/: parse_FtCf, /* FtCf */ /*::[*/0x08/*::]*/: parse_FtSkip, /* FtPioGrbit */ /*::[*/0x09/*::]*/: parse_FtSkip, /* FtPictFmla */ /*::[*/0x0A/*::]*/: parse_FtSkip, /* FtCbls */ /*::[*/0x0B/*::]*/: parse_FtSkip, /* FtRbo */ /*::[*/0x0C/*::]*/: parse_FtSkip, /* FtSbs */ /*::[*/0x0D/*::]*/: parse_FtNts, /* FtNts */ /*::[*/0x0E/*::]*/: parse_FtSkip, /* FtSbsFmla */ /*::[*/0x0F/*::]*/: parse_FtSkip, /* FtGboData */ /*::[*/0x10/*::]*/: parse_FtSkip, /* FtEdoData */ /*::[*/0x11/*::]*/: parse_FtSkip, /* FtRboData */ /*::[*/0x12/*::]*/: parse_FtSkip, /* FtCblsData */ /*::[*/0x13/*::]*/: parse_FtSkip, /* FtLbsData */ /*::[*/0x14/*::]*/: parse_FtSkip, /* FtCblsFmla */ /*::[*/0x15/*::]*/: parse_FtCmo }; function parse_FtArray(blob, length/*::, ot*/) { var tgt = blob.l + length; var fts = []; while(blob.l < tgt) { var ft = blob.read_shift(2); blob.l-=2; try { fts.push(FtTab[ft](blob, tgt - blob.l)); } catch(e) { blob.l = tgt; return fts; } } if(blob.l != tgt) blob.l = tgt; //throw new Error("bad Object Ft-sequence"); return fts; } /* --- 2.4 Records --- */ /* [MS-XLS] 2.4.21 */ function parse_BOF(blob, length) { var o = {BIFFVer:0, dt:0}; o.BIFFVer = blob.read_shift(2); length -= 2; if(length >= 2) { o.dt = blob.read_shift(2); blob.l -= 2; } switch(o.BIFFVer) { case 0x0600: /* BIFF8 */ case 0x0500: /* BIFF5 */ case 0x0400: /* BIFF4 */ case 0x0300: /* BIFF3 */ case 0x0200: /* BIFF2 */ case 0x0002: case 0x0007: /* BIFF2 */ break; default: if(length > 6) throw new Error("Unexpected BIFF Ver " + o.BIFFVer); } blob.read_shift(length); return o; } function write_BOF(wb/*:Workbook*/, t/*:number*/, o) { var h = 0x0600, w = 16; switch(o.bookType) { case 'biff8': break; case 'biff5': h = 0x0500; w = 8; break; case 'biff4': h = 0x0004; w = 6; break; case 'biff3': h = 0x0003; w = 6; break; case 'biff2': h = 0x0002; w = 4; break; case 'xla': break; default: throw new Error("unsupported BIFF version"); } var out = new_buf(w); out.write_shift(2, h); out.write_shift(2, t); if(w > 4) out.write_shift(2, 0x7262); if(w > 6) out.write_shift(2, 0x07CD); if(w > 8) { out.write_shift(2, 0xC009); out.write_shift(2, 0x0001); out.write_shift(2, 0x0706); out.write_shift(2, 0x0000); } return out; } /* [MS-XLS] 2.4.146 */ function parse_InterfaceHdr(blob, length) { if(length === 0) return 0x04b0; if((blob.read_shift(2))!==0x04b0){/* empty */} return 0x04b0; } /* [MS-XLS] 2.4.349 */ function parse_WriteAccess(blob, length, opts) { if(opts.enc) { blob.l += length; return ""; } var l = blob.l; // TODO: make sure XLUnicodeString doesnt overrun var UserName = parse_XLUnicodeString2(blob, 0, opts); blob.read_shift(length + l - blob.l); return UserName; } function write_WriteAccess(s/*:string*/, opts) { var b8 = !opts || opts.biff == 8; var o = new_buf(b8 ? 112 : 54); o.write_shift(opts.biff == 8 ? 2 : 1, 7); if(b8) o.write_shift(1, 0); o.write_shift(4, 0x33336853); o.write_shift(4, (0x00534A74 | (b8 ? 0 : 0x20000000))); while(o.l < o.length) o.write_shift(1, (b8 ? 0 : 32)); return o; } /* [MS-XLS] 2.4.351 */ function parse_WsBool(blob, length, opts) { var flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0); return { fDialog: flags & 0x10, fBelow: flags & 0x40, fRight: flags & 0x80 }; } /* [MS-XLS] 2.4.28 */ function parse_BoundSheet8(blob, length, opts) { var pos = blob.read_shift(4); var hidden = blob.read_shift(1) & 0x03; var dt = blob.read_shift(1); switch(dt) { case 0: dt = 'Worksheet'; break; case 1: dt = 'Macrosheet'; break; case 2: dt = 'Chartsheet'; break; case 6: dt = 'VBAModule'; break; } var name = parse_ShortXLUnicodeString(blob, 0, opts); if(name.length === 0) name = "Sheet1"; return { pos:pos, hs:hidden, dt:dt, name:name }; } function write_BoundSheet8(data, opts) { var w = (!opts || opts.biff >= 8 ? 2 : 1); var o = new_buf(8 + w * data.name.length); o.write_shift(4, data.pos); o.write_shift(1, data.hs || 0); o.write_shift(1, data.dt); o.write_shift(1, data.name.length); if(opts.biff >= 8) o.write_shift(1, 1); o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le'); var out = o.slice(0, o.l); out.l = o.l; return out; } /* [MS-XLS] 2.4.265 TODO */ function parse_SST(blob, length)/*:SST*/ { var end = blob.l + length; var cnt = blob.read_shift(4); var ucnt = blob.read_shift(4); var strs/*:SST*/ = ([]/*:any*/); for(var i = 0; i != ucnt && blob.l < end; ++i) { strs.push(parse_XLUnicodeRichExtendedString(blob)); } strs.Count = cnt; strs.Unique = ucnt; return strs; } function write_SST(sst, opts) { var header = new_buf(8); header.write_shift(4, sst.Count); header.write_shift(4, sst.Unique); var strs = []; for(var j = 0; j < sst.length; ++j) strs[j] = write_XLUnicodeRichExtendedString(sst[j], opts); var o = bconcat([header].concat(strs)); /*::(*/o/*:: :any)*/.parts = [header.length].concat(strs.map(function(str) { return str.length; })); return o; } /* [MS-XLS] 2.4.107 */ function parse_ExtSST(blob, length) { var extsst = {}; extsst.dsst = blob.read_shift(2); blob.l += length-2; return extsst; } /* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */ function parse_Row(blob) { var z = ({}/*:any*/); z.r = blob.read_shift(2); z.c = blob.read_shift(2); z.cnt = blob.read_shift(2) - z.c; var miyRw = blob.read_shift(2); blob.l += 4; // reserved(2), unused(2) var flags = blob.read_shift(1); // various flags blob.l += 3; // reserved(8), ixfe(12), flags(4) if(flags & 0x07) z.level = flags & 0x07; // collapsed: flags & 0x10 if(flags & 0x20) z.hidden = true; if(flags & 0x40) z.hpt = miyRw / 20; return z; } /* [MS-XLS] 2.4.125 */ function parse_ForceFullCalculation(blob) { var header = parse_frtHeader(blob); if(header.type != 0x08A3) throw new Error("Invalid Future Record " + header.type); var fullcalc = blob.read_shift(4); return fullcalc !== 0x0; } /* [MS-XLS] 2.4.215 rt */ function parse_RecalcId(blob) { blob.read_shift(2); return blob.read_shift(4); } /* [MS-XLS] 2.4.87 */ function parse_DefaultRowHeight(blob, length, opts) { var f = 0; if(!(opts && opts.biff == 2)) { f = blob.read_shift(2); } var miyRw = blob.read_shift(2); if((opts && opts.biff == 2)) { f = 1 - (miyRw >> 15); miyRw &= 0x7fff; } var fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3}; return [fl, miyRw]; } /* [MS-XLS] 2.4.345 TODO */ function parse_Window1(blob) { var xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2); var flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2); var ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2); return { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur, FirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio }; } function write_Window1(/*::opts*/) { var o = new_buf(18); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 0x7260); o.write_shift(2, 0x44c0); o.write_shift(2, 0x38); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 1); o.write_shift(2, 0x01f4); return o; } /* [MS-XLS] 2.4.346 TODO */ function parse_Window2(blob, length, opts) { if(opts && opts.biff >= 2 && opts.biff < 5) return {}; var f = blob.read_shift(2); return { RTL: f & 0x40 }; } function write_Window2(view) { var o = new_buf(18), f = 0x6b6; if(view && view.RTL) f |= 0x40; o.write_shift(2, f); o.write_shift(4, 0); o.write_shift(4, 64); o.write_shift(4, 0); o.write_shift(4, 0); return o; } /* [MS-XLS] 2.4.189 TODO */ function parse_Pane(/*blob, length, opts*/) { } /* [MS-XLS] 2.4.122 TODO */ function parse_Font(blob, length, opts) { var o/*:any*/ = { dyHeight: blob.read_shift(2), fl: blob.read_shift(2) }; switch((opts && opts.biff) || 8) { case 2: break; case 3: case 4: blob.l += 2; break; default: blob.l += 10; break; } o.name = parse_ShortXLUnicodeString(blob, 0, opts); return o; } function write_Font(data, opts) { var name = data.name || "Arial"; var b5 = (opts && (opts.biff == 5)), w = (b5 ? (15 + name.length) : (16 + 2 * name.length)); var o = new_buf(w); o.write_shift(2, (data.sz || 12) * 20); o.write_shift(4, 0); o.write_shift(2, 400); o.write_shift(4, 0); o.write_shift(2, 0); o.write_shift(1, name.length); if(!b5) o.write_shift(1, 1); o.write_shift((b5 ? 1 : 2) * name.length, name, (b5 ? "sbcs" : "utf16le")); return o; } /* [MS-XLS] 2.4.149 */ function parse_LabelSst(blob) { var cell = parse_XLSCell(blob); cell.isst = blob.read_shift(4); return cell; } function write_LabelSst(R/*:number*/, C/*:number*/, v/*:number*/, os/*:number*/ /*::, opts*/) { var o = new_buf(10); write_XLSCell(R, C, os, o); o.write_shift(4, v); return o; } /* [MS-XLS] 2.4.148 */ function parse_Label(blob, length, opts) { if(opts.biffguess && opts.biff == 2) opts.biff = 5; var target = blob.l + length; var cell = parse_XLSCell(blob, 6); if(opts.biff == 2) blob.l++; var str = parse_XLUnicodeString(blob, target - blob.l, opts); cell.val = str; return cell; } function write_Label(R/*:number*/, C/*:number*/, v/*:string*/, os/*:number*/, opts) { var b8 = !opts || opts.biff == 8; var o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length); write_XLSCell(R, C, os, o); o.write_shift(2, v.length); if(b8) o.write_shift(1, 1); o.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs'); return o; } /* [MS-XLS] 2.4.126 Number Formats */ function parse_Format(blob, length, opts) { var numFmtId = blob.read_shift(2); var fmtstr = parse_XLUnicodeString2(blob, 0, opts); return [numFmtId, fmtstr]; } function write_Format(i/*:number*/, f/*:string*/, opts, o) { var b5 = (opts && (opts.biff == 5)); if(!o) o = new_buf(b5 ? (3 + f.length) : (5 + 2 * f.length)); o.write_shift(2, i); o.write_shift((b5 ? 1 : 2), f.length); if(!b5) o.write_shift(1, 1); o.write_shift((b5 ? 1 : 2) * f.length, f, (b5 ? 'sbcs' : 'utf16le')); var out = (o.length > o.l) ? o.slice(0, o.l) : o; if(out.l == null) out.l = out.length; return out; } var parse_BIFF2Format = parse_XLUnicodeString2; /* [MS-XLS] 2.4.90 */ function parse_Dimensions(blob, length, opts) { var end = blob.l + length; var w = opts.biff == 8 || !opts.biff ? 4 : 2; var r = blob.read_shift(w), R = blob.read_shift(w); var c = blob.read_shift(2), C = blob.read_shift(2); blob.l = end; return {s: {r:r, c:c}, e: {r:R, c:C}}; } function write_Dimensions(range, opts) { var w = opts.biff == 8 || !opts.biff ? 4 : 2; var o = new_buf(2*w + 6); o.write_shift(w, range.s.r); o.write_shift(w, range.e.r + 1); o.write_shift(2, range.s.c); o.write_shift(2, range.e.c + 1); o.write_shift(2, 0); return o; } /* [MS-XLS] 2.4.220 */ function parse_RK(blob) { var rw = blob.read_shift(2), col = blob.read_shift(2); var rkrec = parse_RkRec(blob); return {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]}; } /* [MS-XLS] 2.4.175 */ function parse_MulRk(blob, length) { var target = blob.l + length - 2; var rw = blob.read_shift(2), col = blob.read_shift(2); var rkrecs = []; while(blob.l < target) rkrecs.push(parse_RkRec(blob)); if(blob.l !== target) throw new Error("MulRK read error"); var lastcol = blob.read_shift(2); if(rkrecs.length != lastcol - col + 1) throw new Error("MulRK length mismatch"); return {r:rw, c:col, C:lastcol, rkrec:rkrecs}; } /* [MS-XLS] 2.4.174 */ function parse_MulBlank(blob, length) { var target = blob.l + length - 2; var rw = blob.read_shift(2), col = blob.read_shift(2); var ixfes = []; while(blob.l < target) ixfes.push(blob.read_shift(2)); if(blob.l !== target) throw new Error("MulBlank read error"); var lastcol = blob.read_shift(2); if(ixfes.length != lastcol - col + 1) throw new Error("MulBlank length mismatch"); return {r:rw, c:col, C:lastcol, ixfe:ixfes}; } /* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */ function parse_CellStyleXF(blob, length, style, opts) { var o = {}; var a = blob.read_shift(4), b = blob.read_shift(4); var c = blob.read_shift(4), d = blob.read_shift(2); o.patternType = XLSFillPattern[c >> 26]; if(!opts.cellStyles) return o; o.alc = a & 0x07; o.fWrap = (a >> 3) & 0x01; o.alcV = (a >> 4) & 0x07; o.fJustLast = (a >> 7) & 0x01; o.trot = (a >> 8) & 0xFF; o.cIndent = (a >> 16) & 0x0F; o.fShrinkToFit = (a >> 20) & 0x01; o.iReadOrder = (a >> 22) & 0x02; o.fAtrNum = (a >> 26) & 0x01; o.fAtrFnt = (a >> 27) & 0x01; o.fAtrAlc = (a >> 28) & 0x01; o.fAtrBdr = (a >> 29) & 0x01; o.fAtrPat = (a >> 30) & 0x01; o.fAtrProt = (a >> 31) & 0x01; o.dgLeft = b & 0x0F; o.dgRight = (b >> 4) & 0x0F; o.dgTop = (b >> 8) & 0x0F; o.dgBottom = (b >> 12) & 0x0F; o.icvLeft = (b >> 16) & 0x7F; o.icvRight = (b >> 23) & 0x7F; o.grbitDiag = (b >> 30) & 0x03; o.icvTop = c & 0x7F; o.icvBottom = (c >> 7) & 0x7F; o.icvDiag = (c >> 14) & 0x7F; o.dgDiag = (c >> 21) & 0x0F; o.icvFore = d & 0x7F; o.icvBack = (d >> 7) & 0x7F; o.fsxButton = (d >> 14) & 0x01; return o; } //function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);} //function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);} /* [MS-XLS] 2.4.353 TODO: actually do this right */ function parse_XF(blob, length, opts) { var o = {}; o.ifnt = blob.read_shift(2); o.numFmtId = blob.read_shift(2); o.flags = blob.read_shift(2); o.fStyle = (o.flags >> 2) & 0x01; length -= 6; o.data = parse_CellStyleXF(blob, length, o.fStyle, opts); return o; } function write_XF(data, ixfeP, opts, o) { var b5 = (opts && (opts.biff == 5)); if(!o) o = new_buf(b5 ? 16 : 20); o.write_shift(2, 0); if(data.style) { o.write_shift(2, (data.numFmtId||0)); o.write_shift(2, 0xFFF4); } else { o.write_shift(2, (data.numFmtId||0)); o.write_shift(2, (ixfeP<<4)); } var f = 0; if(data.numFmtId > 0 && b5) f |= 0x0400; o.write_shift(4, f); o.write_shift(4, 0); if(!b5) o.write_shift(4, 0); o.write_shift(2, 0); return o; } /* [MS-XLS] 2.4.134 */ function parse_Guts(blob) { blob.l += 4; var out = [blob.read_shift(2), blob.read_shift(2)]; if(out[0] !== 0) out[0]--; if(out[1] !== 0) out[1]--; if(out[0] > 7 || out[1] > 7) throw new Error("Bad Gutters: " + out.join("|")); return out; } function write_Guts(guts/*:Array*/) { var o = new_buf(8); o.write_shift(4, 0); o.write_shift(2, guts[0] ? guts[0] + 1 : 0); o.write_shift(2, guts[1] ? guts[1] + 1 : 0); return o; } /* [MS-XLS] 2.4.24 */ function parse_BoolErr(blob, length, opts) { var cell = parse_XLSCell(blob, 6); if(opts.biff == 2 || length == 9) ++blob.l; var val = parse_Bes(blob, 2); cell.val = val; cell.t = (val === true || val === false) ? 'b' : 'e'; return cell; } function write_BoolErr(R/*:number*/, C/*:number*/, v, os/*:number*/, opts, t/*:string*/) { var o = new_buf(8); write_XLSCell(R, C, os, o); write_Bes(v, t, o); return o; } /* [MS-XLS] 2.4.180 Number */ function parse_Number(blob, length, opts) { if(opts.biffguess && opts.biff == 2) opts.biff = 5; var cell = parse_XLSCell(blob, 6); var xnum = parse_Xnum(blob, 8); cell.val = xnum; return cell; } function write_Number(R/*:number*/, C/*:number*/, v, os/*:: :number, opts*/) { var o = new_buf(14); write_XLSCell(R, C, os, o); write_Xnum(v, o); return o; } var parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136 /* [MS-XLS] 2.4.271 */ function parse_SupBook(blob, length, opts) { var end = blob.l + length; var ctab = blob.read_shift(2); var cch = blob.read_shift(2); opts.sbcch = cch; if(cch == 0x0401 || cch == 0x3A01) return [cch, ctab]; if(cch < 0x01 || cch >0xff) throw new Error("Unexpected SupBook type: "+cch); var virtPath = parse_XLUnicodeStringNoCch(blob, cch); /* TODO: 2.5.277 Virtual Path */ var rgst = []; while(end > blob.l) rgst.push(parse_XLUnicodeString(blob)); return [cch, ctab, virtPath, rgst]; } /* [MS-XLS] 2.4.105 TODO */ function parse_ExternName(blob, length, opts) { var flags = blob.read_shift(2); var body; var o = ({ fBuiltIn: flags & 0x01, fWantAdvise: (flags >>> 1) & 0x01, fWantPict: (flags >>> 2) & 0x01, fOle: (flags >>> 3) & 0x01, fOleLink: (flags >>> 4) & 0x01, cf: (flags >>> 5) & 0x3FF, fIcon: flags >>> 15 & 0x01 }/*:any*/); if(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2, opts); //else throw new Error("unsupported SupBook cch: " + opts.sbcch); o.body = body || blob.read_shift(length-2); if(typeof body === "string") o.Name = body; return o; } /* [MS-XLS] 2.4.150 TODO */ var XLSLblBuiltIn = [ "_xlnm.Consolidate_Area", "_xlnm.Auto_Open", "_xlnm.Auto_Close", "_xlnm.Extract", "_xlnm.Database", "_xlnm.Criteria", "_xlnm.Print_Area", "_xlnm.Print_Titles", "_xlnm.Recorder", "_xlnm.Data_Form", "_xlnm.Auto_Activate", "_xlnm.Auto_Deactivate", "_xlnm.Sheet_Title", "_xlnm._FilterDatabase" ]; function parse_Lbl(blob, length, opts) { var target = blob.l + length; var flags = blob.read_shift(2); var chKey = blob.read_shift(1); var cch = blob.read_shift(1); var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2); var itab = 0; if(!opts || opts.biff >= 5) { if(opts.biff != 5) blob.l += 2; itab = blob.read_shift(2); if(opts.biff == 5) blob.l += 2; blob.l += 4; } var name = parse_XLUnicodeStringNoCch(blob, cch, opts); if(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)]; var npflen = target - blob.l; if(opts && opts.biff == 2) --npflen; /*jshint -W018 */ var rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce); /*jshint +W018 */ return { chKey: chKey, Name: name, itab: itab, rgce: rgce }; } /* [MS-XLS] 2.4.106 TODO: verify filename encoding */ function parse_ExternSheet(blob, length, opts) { if(opts.biff < 8) return parse_BIFF5ExternSheet(blob, length, opts); var o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2); while(len-- !== 0) o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts)); // [iSupBook, itabFirst, itabLast]; if(blob.l != target) throw new Error("Bad ExternSheet: " + blob.l + " != " + target); return o; } function parse_BIFF5ExternSheet(blob, length, opts) { if(blob[blob.l + 1] == 0x03) blob[blob.l]++; var o = parse_ShortXLUnicodeString(blob, length, opts); return o.charCodeAt(0) == 0x03 ? o.slice(1) : o; } /* [MS-XLS] 2.4.176 TODO: check older biff */ function parse_NameCmt(blob, length, opts) { if(opts.biff < 8) { blob.l += length; return; } var cchName = blob.read_shift(2); var cchComment = blob.read_shift(2); var name = parse_XLUnicodeStringNoCch(blob, cchName, opts); var comment = parse_XLUnicodeStringNoCch(blob, cchComment, opts); return [name, comment]; } /* [MS-XLS] 2.4.260 */ function parse_ShrFmla(blob, length, opts) { var ref = parse_RefU(blob, 6); blob.l++; var cUse = blob.read_shift(1); length -= 8; return [parse_SharedParsedFormula(blob, length, opts), cUse, ref]; } /* [MS-XLS] 2.4.4 TODO */ function parse_Array(blob, length, opts) { var ref = parse_Ref(blob, 6); /* TODO: fAlwaysCalc */ switch(opts.biff) { case 2: blob.l ++; length -= 7; break; case 3: case 4: blob.l += 2; length -= 8; break; default: blob.l += 6; length -= 12; } return [ref, parse_ArrayParsedFormula(blob, length, opts, ref)]; } /* [MS-XLS] 2.4.173 */ function parse_MTRSettings(blob) { var fMTREnabled = blob.read_shift(4) !== 0x00; var fUserSetThreadCount = blob.read_shift(4) !== 0x00; var cUserThreadCount = blob.read_shift(4); return [fMTREnabled, fUserSetThreadCount, cUserThreadCount]; } /* [MS-XLS] 2.5.186 TODO: BIFF5 */ function parse_NoteSh(blob, length, opts) { if(opts.biff < 8) return; var row = blob.read_shift(2), col = blob.read_shift(2); var flags = blob.read_shift(2), idObj = blob.read_shift(2); var stAuthor = parse_XLUnicodeString2(blob, 0, opts); if(opts.biff < 8) blob.read_shift(1); return [{r:row,c:col}, stAuthor, idObj, flags]; } /* [MS-XLS] 2.4.179 */ function parse_Note(blob, length, opts) { /* TODO: Support revisions */ return parse_NoteSh(blob, length, opts); } /* [MS-XLS] 2.4.168 */ function parse_MergeCells(blob, length)/*:Array*/ { var merges/*:Array*/ = []; var cmcs = blob.read_shift(2); while (cmcs--) merges.push(parse_Ref8U(blob,length)); return merges; } function write_MergeCells(merges/*:Array*/) { var o = new_buf(2 + merges.length * 8); o.write_shift(2, merges.length); for(var i = 0; i < merges.length; ++i) write_Ref8U(merges[i], o); return o; } /* [MS-XLS] 2.4.181 TODO: parse all the things! */ function parse_Obj(blob, length, opts) { if(opts && opts.biff < 8) return parse_BIFF5Obj(blob, length, opts); var cmo = parse_FtCmo(blob, 22); // id, ot, flags var fts = parse_FtArray(blob, length-22, cmo[1]); return { cmo: cmo, ft:fts }; } /* from older spec */ var parse_BIFF5OT = { 0x08: function(blob, length) { var tgt = blob.l + length; blob.l += 10; // todo var cf = blob.read_shift(2); blob.l += 4; blob.l += 2; //var cbPictFmla = blob.read_shift(2); blob.l += 2; blob.l += 2; //var grbit = blob.read_shift(2); blob.l += 4; var cchName = blob.read_shift(1); blob.l += cchName; // TODO: stName blob.l = tgt; // TODO: fmla return { fmt:cf }; } }; function parse_BIFF5Obj(blob, length, opts) { blob.l += 4; //var cnt = blob.read_shift(4); var ot = blob.read_shift(2); var id = blob.read_shift(2); var grbit = blob.read_shift(2); blob.l += 2; //var colL = blob.read_shift(2); blob.l += 2; //var dxL = blob.read_shift(2); blob.l += 2; //var rwT = blob.read_shift(2); blob.l += 2; //var dyT = blob.read_shift(2); blob.l += 2; //var colR = blob.read_shift(2); blob.l += 2; //var dxR = blob.read_shift(2); blob.l += 2; //var rwB = blob.read_shift(2); blob.l += 2; //var dyB = blob.read_shift(2); blob.l += 2; //var cbMacro = blob.read_shift(2); blob.l += 6; length -= 36; var fts = []; fts.push((parse_BIFF5OT[ot]||parsenoop)(blob, length, opts)); return { cmo: [id, ot, grbit], ft:fts }; } /* [MS-XLS] 2.4.329 TODO: parse properly */ function parse_TxO(blob, length, opts) { var s = blob.l; var texts = ""; try { blob.l += 4; var ot = (opts.lastobj||{cmo:[0,0]}).cmo[1]; var controlInfo; // eslint-disable-line no-unused-vars if([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6; else controlInfo = parse_ControlInfo(blob, 6, opts); // eslint-disable-line no-unused-vars var cchText = blob.read_shift(2); /*var cbRuns = */blob.read_shift(2); /*var ifntEmpty = */parseuint16(blob, 2); var len = blob.read_shift(2); blob.l += len; //var fmla = parse_ObjFmla(blob, s + length - blob.l); for(var i = 1; i < blob.lens.length-1; ++i) { if(blob.l-s != blob.lens[i]) throw new Error("TxO: bad continue record"); var hdr = blob[blob.l]; var t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1); texts += t; if(texts.length >= (hdr ? cchText : 2*cchText)) break; } if(texts.length !== cchText && texts.length !== cchText*2) { throw new Error("cchText: " + cchText + " != " + texts.length); } blob.l = s + length; /* [MS-XLS] 2.5.272 TxORuns */ // var rgTxoRuns = []; // for(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8; // var cchText2 = blob.read_shift(2); // if(cchText2 !== cchText) throw new Error("TxOLastRun mismatch: " + cchText2 + " " + cchText); // blob.l += 6; // if(s + length != blob.l) throw new Error("TxO " + (s + length) + ", at " + blob.l); return { t: texts }; } catch(e) { blob.l = s + length; return { t: texts }; } } /* [MS-XLS] 2.4.140 */ function parse_HLink(blob, length) { var ref = parse_Ref8U(blob, 8); blob.l += 16; /* CLSID */ var hlink = parse_Hyperlink(blob, length-24); return [ref, hlink]; } function write_HLink(hl) { var O = new_buf(24); var ref = decode_cell(hl[0]); O.write_shift(2, ref.r); O.write_shift(2, ref.r); O.write_shift(2, ref.c); O.write_shift(2, ref.c); var clsid = "d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" "); for(var i = 0; i < 16; ++i) O.write_shift(1, parseInt(clsid[i], 16)); return bconcat([O, write_Hyperlink(hl[1])]); } /* [MS-XLS] 2.4.141 */ function parse_HLinkTooltip(blob, length) { blob.read_shift(2); var ref = parse_Ref8U(blob, 8); var wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont'); wzTooltip = wzTooltip.replace(chr0,""); return [ref, wzTooltip]; } function write_HLinkTooltip(hl) { var TT = hl[1].Tooltip; var O = new_buf(10 + 2 * (TT.length + 1)); O.write_shift(2, 0x0800); var ref = decode_cell(hl[0]); O.write_shift(2, ref.r); O.write_shift(2, ref.r); O.write_shift(2, ref.c); O.write_shift(2, ref.c); for(var i = 0; i < TT.length; ++i) O.write_shift(2, TT.charCodeAt(i)); O.write_shift(2, 0); return O; } /* [MS-XLS] 2.4.63 */ function parse_Country(blob)/*:[string|number, string|number]*/ { var o = [0,0], d; d = blob.read_shift(2); o[0] = CountryEnum[d] || d; d = blob.read_shift(2); o[1] = CountryEnum[d] || d; return o; } function write_Country(o) { if(!o) o = new_buf(4); o.write_shift(2, 0x01); o.write_shift(2, 0x01); return o; } /* [MS-XLS] 2.4.50 ClrtClient */ function parse_ClrtClient(blob) { var ccv = blob.read_shift(2); var o = []; while(ccv-->0) o.push(parse_LongRGB(blob, 8)); return o; } /* [MS-XLS] 2.4.188 */ function parse_Palette(blob) { var ccv = blob.read_shift(2); var o = []; while(ccv-->0) o.push(parse_LongRGB(blob, 8)); return o; } /* [MS-XLS] 2.4.354 */ function parse_XFCRC(blob) { blob.l += 2; var o = {cxfs:0, crc:0}; o.cxfs = blob.read_shift(2); o.crc = blob.read_shift(4); return o; } /* [MS-XLS] 2.4.53 TODO: parse flags */ /* [MS-XLSB] 2.4.323 TODO: parse flags */ function parse_ColInfo(blob, length, opts) { if(!opts.cellStyles) return parsenoop(blob, length); var w = opts && opts.biff >= 12 ? 4 : 2; var colFirst = blob.read_shift(w); var colLast = blob.read_shift(w); var coldx = blob.read_shift(w); var ixfe = blob.read_shift(w); var flags = blob.read_shift(2); if(w == 2) blob.l += 2; var o = ({s:colFirst, e:colLast, w:coldx, ixfe:ixfe, flags:flags}/*:any*/); if(opts.biff >= 5 || !opts.biff) o.level = (flags >> 8) & 0x7; return o; } function write_ColInfo(col, idx) { var o = new_buf(12); o.write_shift(2, idx); o.write_shift(2, idx); o.write_shift(2, col.width * 256); o.write_shift(2, 0); var f = 0; if(col.hidden) f |= 1; o.write_shift(1, f); f = col.level || 0; o.write_shift(1, f); o.write_shift(2, 0); return o; } /* [MS-XLS] 2.4.257 */ function parse_Setup(blob, length) { var o = {}; if(length < 32) return o; blob.l += 16; o.header = parse_Xnum(blob, 8); o.footer = parse_Xnum(blob, 8); blob.l += 2; return o; } /* [MS-XLS] 2.4.261 */ function parse_ShtProps(blob, length, opts) { var def = {area:false}; if(opts.biff != 5) { blob.l += length; return def; } var d = blob.read_shift(1); blob.l += 3; if((d & 0x10)) def.area = true; return def; } /* [MS-XLS] 2.4.241 */ function write_RRTabId(n/*:number*/) { var out = new_buf(2 * n); for(var i = 0; i < n; ++i) out.write_shift(2, i+1); return out; } var parse_Blank = parse_XLSCell; /* [MS-XLS] 2.4.20 Just the cell */ var parse_Scl = parseuint16a; /* [MS-XLS] 2.4.247 num, den */ var parse_String = parse_XLUnicodeString; /* [MS-XLS] 2.4.268 */ /* --- Specific to versions before BIFF8 --- */ function parse_ImData(blob) { var cf = blob.read_shift(2); var env = blob.read_shift(2); var lcb = blob.read_shift(4); var o = {fmt:cf, env:env, len:lcb, data:blob.slice(blob.l,blob.l+lcb)}; blob.l += lcb; return o; } /* BIFF2_??? where ??? is the name from [XLS] */ function parse_BIFF2STR(blob, length, opts) { if(opts.biffguess && opts.biff == 5) opts.biff = 2; var cell = parse_XLSCell(blob, 6); ++blob.l; var str = parse_XLUnicodeString2(blob, length-7, opts); cell.t = 'str'; cell.val = str; return cell; } function parse_BIFF2NUM(blob/*::, length*/) { var cell = parse_XLSCell(blob, 6); ++blob.l; var num = parse_Xnum(blob, 8); cell.t = 'n'; cell.val = num; return cell; } function write_BIFF2NUM(r/*:number*/, c/*:number*/, val/*:number*/) { var out = new_buf(15); write_BIFF2Cell(out, r, c); out.write_shift(8, val, 'f'); return out; } function parse_BIFF2INT(blob) { var cell = parse_XLSCell(blob, 6); ++blob.l; var num = blob.read_shift(2); cell.t = 'n'; cell.val = num; return cell; } function write_BIFF2INT(r/*:number*/, c/*:number*/, val/*:number*/) { var out = new_buf(9); write_BIFF2Cell(out, r, c); out.write_shift(2, val); return out; } function parse_BIFF2STRING(blob) { var cch = blob.read_shift(1); if(cch === 0) { blob.l++; return ""; } return blob.read_shift(cch, 'sbcs-cont'); } /* TODO: convert to BIFF8 font struct */ function parse_BIFF2FONTXTRA(blob, length) { blob.l += 6; // unknown blob.l += 2; // font weight "bls" blob.l += 1; // charset blob.l += 3; // unknown blob.l += 1; // font family blob.l += length - 13; } /* TODO: parse rich text runs */ function parse_RString(blob, length, opts) { var end = blob.l + length; var cell = parse_XLSCell(blob, 6); var cch = blob.read_shift(2); var str = parse_XLUnicodeStringNoCch(blob, cch, opts); blob.l = end; cell.t = 'str'; cell.val = str; return cell; } /* from js-harb (C) 2014-present SheetJS */ var DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5]; var DBF = /*#__PURE__*/(function() { var dbf_codepage_map = { /* Code Pages Supported by Visual FoxPro */ /*::[*/0x01/*::]*/: 437, /*::[*/0x02/*::]*/: 850, /*::[*/0x03/*::]*/: 1252, /*::[*/0x04/*::]*/: 10000, /*::[*/0x64/*::]*/: 852, /*::[*/0x65/*::]*/: 866, /*::[*/0x66/*::]*/: 865, /*::[*/0x67/*::]*/: 861, /*::[*/0x68/*::]*/: 895, /*::[*/0x69/*::]*/: 620, /*::[*/0x6A/*::]*/: 737, /*::[*/0x6B/*::]*/: 857, /*::[*/0x78/*::]*/: 950, /*::[*/0x79/*::]*/: 949, /*::[*/0x7A/*::]*/: 936, /*::[*/0x7B/*::]*/: 932, /*::[*/0x7C/*::]*/: 874, /*::[*/0x7D/*::]*/: 1255, /*::[*/0x7E/*::]*/: 1256, /*::[*/0x96/*::]*/: 10007, /*::[*/0x97/*::]*/: 10029, /*::[*/0x98/*::]*/: 10006, /*::[*/0xC8/*::]*/: 1250, /*::[*/0xC9/*::]*/: 1251, /*::[*/0xCA/*::]*/: 1254, /*::[*/0xCB/*::]*/: 1253, /* shapefile DBF extension */ /*::[*/0x00/*::]*/: 20127, /*::[*/0x08/*::]*/: 865, /*::[*/0x09/*::]*/: 437, /*::[*/0x0A/*::]*/: 850, /*::[*/0x0B/*::]*/: 437, /*::[*/0x0D/*::]*/: 437, /*::[*/0x0E/*::]*/: 850, /*::[*/0x0F/*::]*/: 437, /*::[*/0x10/*::]*/: 850, /*::[*/0x11/*::]*/: 437, /*::[*/0x12/*::]*/: 850, /*::[*/0x13/*::]*/: 932, /*::[*/0x14/*::]*/: 850, /*::[*/0x15/*::]*/: 437, /*::[*/0x16/*::]*/: 850, /*::[*/0x17/*::]*/: 865, /*::[*/0x18/*::]*/: 437, /*::[*/0x19/*::]*/: 437, /*::[*/0x1A/*::]*/: 850, /*::[*/0x1B/*::]*/: 437, /*::[*/0x1C/*::]*/: 863, /*::[*/0x1D/*::]*/: 850, /*::[*/0x1F/*::]*/: 852, /*::[*/0x22/*::]*/: 852, /*::[*/0x23/*::]*/: 852, /*::[*/0x24/*::]*/: 860, /*::[*/0x25/*::]*/: 850, /*::[*/0x26/*::]*/: 866, /*::[*/0x37/*::]*/: 850, /*::[*/0x40/*::]*/: 852, /*::[*/0x4D/*::]*/: 936, /*::[*/0x4E/*::]*/: 949, /*::[*/0x4F/*::]*/: 950, /*::[*/0x50/*::]*/: 874, /*::[*/0x57/*::]*/: 1252, /*::[*/0x58/*::]*/: 1252, /*::[*/0x59/*::]*/: 1252, /*::[*/0x6C/*::]*/: 863, /*::[*/0x86/*::]*/: 737, /*::[*/0x87/*::]*/: 852, /*::[*/0x88/*::]*/: 857, /*::[*/0xCC/*::]*/: 1257, /*::[*/0xFF/*::]*/: 16969 }; var dbf_reverse_map = evert({ /*::[*/0x01/*::]*/: 437, /*::[*/0x02/*::]*/: 850, /*::[*/0x03/*::]*/: 1252, /*::[*/0x04/*::]*/: 10000, /*::[*/0x64/*::]*/: 852, /*::[*/0x65/*::]*/: 866, /*::[*/0x66/*::]*/: 865, /*::[*/0x67/*::]*/: 861, /*::[*/0x68/*::]*/: 895, /*::[*/0x69/*::]*/: 620, /*::[*/0x6A/*::]*/: 737, /*::[*/0x6B/*::]*/: 857, /*::[*/0x78/*::]*/: 950, /*::[*/0x79/*::]*/: 949, /*::[*/0x7A/*::]*/: 936, /*::[*/0x7B/*::]*/: 932, /*::[*/0x7C/*::]*/: 874, /*::[*/0x7D/*::]*/: 1255, /*::[*/0x7E/*::]*/: 1256, /*::[*/0x96/*::]*/: 10007, /*::[*/0x97/*::]*/: 10029, /*::[*/0x98/*::]*/: 10006, /*::[*/0xC8/*::]*/: 1250, /*::[*/0xC9/*::]*/: 1251, /*::[*/0xCA/*::]*/: 1254, /*::[*/0xCB/*::]*/: 1253, /*::[*/0x00/*::]*/: 20127 }); /* TODO: find an actual specification */ function dbf_to_aoa(buf, opts)/*:AOA*/ { var out/*:AOA*/ = []; var d/*:Block*/ = (new_raw_buf(1)/*:any*/); switch(opts.type) { case 'base64': d = s2a(Base64_decode(buf)); break; case 'binary': d = s2a(buf); break; case 'buffer': case 'array': d = buf; break; } prep_blob(d, 0); /* header */ var ft = d.read_shift(1); var memo = !!(ft & 0x88); var vfp = false, l7 = false; switch(ft) { case 0x02: break; // dBASE II case 0x03: break; // dBASE III case 0x30: vfp = true; memo = true; break; // VFP case 0x31: vfp = true; memo = true; break; // VFP with autoincrement // 0x43 dBASE IV SQL table files // 0x63 dBASE IV SQL system files case 0x83: break; // dBASE III with memo case 0x8B: break; // dBASE IV with memo case 0x8C: l7 = true; break; // dBASE Level 7 with memo // case 0xCB dBASE IV SQL table files with memo case 0xF5: break; // FoxPro 2.x with memo // case 0xFB FoxBASE default: throw new Error("DBF Unsupported Version: " + ft.toString(16)); } var nrow = 0, fpos = 0x0209; if(ft == 0x02) nrow = d.read_shift(2); d.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD if(ft != 0x02) nrow = d.read_shift(4); if(nrow > 1048576) nrow = 1e6; if(ft != 0x02) fpos = d.read_shift(2); // header length var rlen = d.read_shift(2); // record length var /*flags = 0,*/ current_cp = opts.codepage || 1252; if(ft != 0x02) { // 20 reserved bytes d.l+=16; /*flags = */d.read_shift(1); //if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16)); /* codepage present in FoxPro and dBASE Level 7 */ if(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]]; d.l+=1; d.l+=2; } if(l7) d.l += 36; // Level 7: 32 byte "Language driver name", 4 byte reserved /*:: type DBFField = { name:string; len:number; type:string; } */ var fields/*:Array*/ = [], field/*:DBFField*/ = ({}/*:any*/); var hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0)))); var ww = l7 ? 32 : 11; while(d.l < hend && d[d.l] != 0x0d) { field = ({}/*:any*/); field.name = $cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\u0000\r\n].*$/g,""); d.l += ww; field.type = String.fromCharCode(d.read_shift(1)); if(ft != 0x02 && !l7) field.offset = d.read_shift(4); field.len = d.read_shift(1); if(ft == 0x02) field.offset = d.read_shift(2); field.dec = d.read_shift(1); if(field.name.length) fields.push(field); if(ft != 0x02) d.l += l7 ? 13 : 14; switch(field.type) { case 'B': // Double (VFP) / Binary (dBASE L7) if((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type); break; case 'G': // General (FoxPro and dBASE L7) case 'P': // Picture (FoxPro and dBASE L7) if(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type); break; case '+': // Autoincrement (dBASE L7 only) case '0': // _NullFlags (VFP only) case '@': // Timestamp (dBASE L7 only) case 'C': // Character (dBASE II) case 'D': // Date (dBASE III) case 'F': // Float (dBASE IV) case 'I': // Long (VFP and dBASE L7) case 'L': // Logical (dBASE II) case 'M': // Memo (dBASE III) case 'N': // Number (dBASE II) case 'O': // Double (dBASE L7 only) case 'T': // Datetime (VFP only) case 'Y': // Currency (VFP only) break; default: throw new Error('Unknown Field Type: ' + field.type); } } if(d[d.l] !== 0x0D) d.l = fpos-1; if(d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]); d.l = fpos; /* data */ var R = 0, C = 0; out[0] = []; for(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name; while(nrow-- > 0) { if(d[d.l] === 0x2A) { // TODO: record marked as deleted -- create a hidden row? d.l+=rlen; continue; } ++d.l; out[++R] = []; C = 0; for(C = 0; C != fields.length; ++C) { var dd = d.slice(d.l, d.l+fields[C].len); d.l+=fields[C].len; prep_blob(dd, 0); var s = $cptable.utils.decode(current_cp, dd); switch(fields[C].type) { case 'C': // NOTE: it is conventional to write ' / / ' for empty dates if(s.trim().length) out[R][C] = s.replace(/\s+$/,""); break; case 'D': if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8)); else out[R][C] = s; break; case 'F': out[R][C] = parseFloat(s.trim()); break; case '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break; case 'L': switch(s.trim().toUpperCase()) { case 'Y': case 'T': out[R][C] = true; break; case 'N': case 'F': out[R][C] = false; break; case '': case '?': break; default: throw new Error("DBF Unrecognized L:|" + s + "|"); } break; case 'M': /* TODO: handle memo files */ if(!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16)); out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4)); break; case 'N': s = s.replace(/\u0000/g,"").trim(); // NOTE: dBASE II interprets " . " as 0 if(s && s != ".") out[R][C] = +s || 0; break; case '@': // NOTE: dBASE specs appear to be incorrect out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400); break; case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break; case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4 + (dd.read_shift(4, 'i')/1e4)*Math.pow(2,32); break; case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break; case 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; } /* falls through */ case 'G': case 'P': dd.l += fields[C].len; break; case '0': if(fields[C].name === '_NullFlags') break; /* falls through */ default: throw new Error("DBF Unsupported data type " + fields[C].type); } } } if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16)); if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows); opts.DBF = fields; return out; } function dbf_to_sheet(buf, opts)/*:Worksheet*/ { var o = opts || {}; if(!o.dateNF) o.dateNF = "yyyymmdd"; var ws = aoa_to_sheet(dbf_to_aoa(buf, o), o); ws["!cols"] = o.DBF.map(function(field) { return { wch: field.len, DBF: field };}); delete o.DBF; return ws; } function dbf_to_workbook(buf, opts)/*:Workbook*/ { try { return sheet_to_workbook(dbf_to_sheet(buf, opts), opts); } catch(e) { if(opts && opts.WTF) throw e; } return ({SheetNames:[],Sheets:{}}); } var _RLEN = { 'B': 8, 'C': 250, 'L': 1, 'D': 8, '?': 0, '': 0 }; function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) { var o = opts || {}; if(+o.codepage >= 0) set_cp(+o.codepage); if(o.type == "string") throw new Error("Cannot write DBF to JS string"); var ba = buf_array(); var aoa/*:AOA*/ = sheet_to_json(ws, {header:1, raw:true, cellDates:true}); var headers = aoa[0], data = aoa.slice(1), cols = ws["!cols"] || []; var i = 0, j = 0, hcnt = 0, rlen = 1; for(i = 0; i < headers.length; ++i) { if(((cols[i]||{}).DBF||{}).name) { headers[i] = cols[i].DBF.name; ++hcnt; continue; } if(headers[i] == null) continue; ++hcnt; if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10); if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|"); if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j) if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; } } var range = safe_decode_range(ws['!ref']); var coltypes/*:Array*/ = []; var colwidths/*:Array*/ = []; var coldecimals/*:Array*/ = []; for(i = 0; i <= range.e.c - range.s.c; ++i) { var guess = '', _guess = '', maxlen = 0; var col/*:Array*/ = []; for(j=0; j < data.length; ++j) { if(data[j][i] != null) col.push(data[j][i]); } if(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; } for(j = 0; j < col.length; ++j) { switch(typeof col[j]) { /* TODO: check if L2 compat is desired */ case 'number': _guess = 'B'; break; case 'string': _guess = 'C'; break; case 'boolean': _guess = 'L'; break; case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break; default: _guess = 'C'; } maxlen = Math.max(maxlen, String(col[j]).length); guess = guess && guess != _guess ? 'C' : _guess; //if(guess == 'C') break; } if(maxlen > 250) maxlen = 250; _guess = ((cols[i]||{}).DBF||{}).type; /* TODO: more fine grained control over DBF type resolution */ if(_guess == 'C') { if(cols[i].DBF.len > maxlen) maxlen = cols[i].DBF.len; } if(guess == 'B' && _guess == 'N') { guess = 'N'; coldecimals[i] = cols[i].DBF.dec; maxlen = cols[i].DBF.len; } colwidths[i] = guess == 'C' || _guess == 'N' ? maxlen : (_RLEN[guess] || 0); rlen += colwidths[i]; coltypes[i] = guess; } var h = ba.next(32); h.write_shift(4, 0x13021130); h.write_shift(4, data.length); h.write_shift(2, 296 + 32 * hcnt); h.write_shift(2, rlen); for(i=0; i < 4; ++i) h.write_shift(4, 0); h.write_shift(4, 0x00000000 | ((+dbf_reverse_map[/*::String(*/current_ansi/*::)*/] || 0x03)<<8)); for(i = 0, j = 0; i < headers.length; ++i) { if(headers[i] == null) continue; var hf = ba.next(32); var _f = (headers[i].slice(-10) + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00").slice(0, 11); hf.write_shift(1, _f, "sbcs"); hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs"); hf.write_shift(4, j); hf.write_shift(1, colwidths[i] || _RLEN[coltypes[i]] || 0); hf.write_shift(1, coldecimals[i] || 0); hf.write_shift(1, 0x02); hf.write_shift(4, 0); hf.write_shift(1, 0); hf.write_shift(4, 0); hf.write_shift(4, 0); j += (colwidths[i] || _RLEN[coltypes[i]] || 0); } var hb = ba.next(264); hb.write_shift(4, 0x0000000D); for(i=0; i < 65;++i) hb.write_shift(4, 0x00000000); for(i=0; i < data.length; ++i) { var rout = ba.next(rlen); rout.write_shift(1, 0); for(j=0; j":190, "?":191, "{":223 }/*:any*/); var sylk_char_regex = new RegExp("\u001BN(" + keys(sylk_escapes).join("|").replace(/\|\|\|/, "|\\||").replace(/([?()+])/g,"\\$1") + "|\\|)", "gm"); var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; }; var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); }; sylk_escapes["|"] = 254; /* TODO: find an actual specification */ function sylk_to_aoa(d/*:RawData*/, opts)/*:[AOA, Worksheet]*/ { switch(opts.type) { case 'base64': return sylk_to_aoa_str(Base64_decode(d), opts); case 'binary': return sylk_to_aoa_str(d, opts); case 'buffer': return sylk_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts); case 'array': return sylk_to_aoa_str(cc2str(d), opts); } throw new Error("Unrecognized type " + opts.type); } function sylk_to_aoa_str(str/*:string*/, opts)/*:[AOA, Worksheet]*/ { var records = str.split(/[\n\r]+/), R = -1, C = -1, ri = 0, rj = 0, arr/*:AOA*/ = []; var formats/*:Array*/ = []; var next_cell_format/*:string|null*/ = null; var sht = {}, rowinfo/*:Array*/ = [], colinfo/*:Array*/ = [], cw/*:Array*/ = []; var Mval = 0, j; if(+opts.codepage >= 0) set_cp(+opts.codepage); for (; ri !== records.length; ++ri) { Mval = 0; var rstr=records[ri].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn); var record=rstr.replace(/;;/g, "\u0000").split(";").map(function(x) { return x.replace(/\u0000/g, ";"); }); var RT=record[0], val; if(rstr.length > 0) switch(RT) { case 'ID': break; /* header */ case 'E': break; /* EOF */ case 'B': break; /* dimensions */ case 'O': break; /* options? */ case 'W': break; /* window? */ case 'P': if(record[1].charAt(0) == 'P') formats.push(rstr.slice(3).replace(/;;/g, ";")); break; case 'C': var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; for(rj=1; rj -1 && arr[_R][_C]; if(!shrbase || !shrbase[1]) throw new Error("SYLK shared formula cannot find base"); arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C}); } break; case 'F': var F_seen = 0; for(rj=1; rj 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } else if(Mval === 0) rowinfo[R].hidden = true; break; default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); } if(F_seen < 1) next_cell_format = null; break; default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); } } if(rowinfo.length > 0) sht['!rows'] = rowinfo; if(colinfo.length > 0) sht['!cols'] = colinfo; if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); return [arr, sht]; } function sylk_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { var aoasht = sylk_to_aoa(d, opts); var aoa = aoasht[0], ws = aoasht[1]; var o = aoa_to_sheet(aoa, opts); keys(ws).forEach(function(k) { o[k] = ws[k]; }); return o; } function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); } function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ { var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; switch(cell.t) { case 'n': o += (cell.v||0); if(cell.f && !cell.F) o += ";E" + a1_to_rc(cell.f, {r:R, c:C}); break; case 'b': o += cell.v ? "TRUE" : "FALSE"; break; case 'e': o += cell.w || cell.v; break; case 'd': o += '"' + (cell.w || cell.v) + '"'; break; case 's': o += '"' + cell.v.replace(/"/g,"").replace(/;/g, ";;") + '"'; break; } return o; } function write_ws_cols_sylk(out, cols) { cols.forEach(function(col, i) { var rec = "F;W" + (i+1) + " " + (i+1) + " "; if(col.hidden) rec += "0"; else { if(typeof col.width == 'number' && !col.wpx) col.wpx = width2px(col.width); if(typeof col.wpx == 'number' && !col.wch) col.wch = px2char(col.wpx); if(typeof col.wch == 'number') rec += Math.round(col.wch); } if(rec.charAt(rec.length - 1) != " ") out.push(rec); }); } function write_ws_rows_sylk(out/*:Array*/, rows/*:Array*/) { rows.forEach(function(row, i) { var rec = "F;"; if(row.hidden) rec += "M0;"; else if(row.hpt) rec += "M" + 20 * row.hpt + ";"; else if(row.hpx) rec += "M" + 20 * px2pt(row.hpx) + ";"; if(rec.length > 2) out.push(rec + "R" + (i+1)); }); } function sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ { var preamble/*:Array*/ = ["ID;PWXL;N;E"], o/*:Array*/ = []; var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; var dense = Array.isArray(ws); var RS = "\r\n"; preamble.push("P;PGeneral"); preamble.push("F;P0;DG0G8;M255"); if(ws['!cols']) write_ws_cols_sylk(preamble, ws['!cols']); if(ws['!rows']) write_ws_rows_sylk(preamble, ws['!rows']); preamble.push("B;Y" + (r.e.r - r.s.r + 1) + ";X" + (r.e.c - r.s.c + 1) + ";D" + [r.s.c,r.s.r,r.e.c,r.e.r].join(" ")); for(var R = r.s.r; R <= r.e.r; ++R) { for(var C = r.s.c; C <= r.e.c; ++C) { var coord = encode_cell({r:R,c:C}); cell = dense ? (ws[R]||[])[C]: ws[coord]; if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; o.push(write_ws_cell_sylk(cell, ws, R, C, opts)); } } return preamble.join(RS) + RS + o.join(RS) + RS + "E" + RS; } return { to_workbook: sylk_to_workbook, to_sheet: sylk_to_sheet, from_sheet: sheet_to_sylk }; })(); var DIF = /*#__PURE__*/(function() { function dif_to_aoa(d/*:RawData*/, opts)/*:AOA*/ { switch(opts.type) { case 'base64': return dif_to_aoa_str(Base64_decode(d), opts); case 'binary': return dif_to_aoa_str(d, opts); case 'buffer': return dif_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts); case 'array': return dif_to_aoa_str(cc2str(d), opts); } throw new Error("Unrecognized type " + opts.type); } function dif_to_aoa_str(str/*:string*/, opts)/*:AOA*/ { var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = []; for (; ri !== records.length; ++ri) { if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; } if (R < 0) continue; var metadata = records[ri].trim().split(","); var type = metadata[0], value = metadata[1]; ++ri; var data = records[ri] || ""; while(((data.match(/["]/g)||[]).length & 1) && ri < records.length - 1) data += "\n" + records[++ri]; data = data.trim(); switch (+type) { case -1: if (data === 'BOT') { arr[++R] = []; C = 0; continue; } else if (data !== 'EOD') throw new Error("Unrecognized DIF special command " + data); break; case 0: if(data === 'TRUE') arr[R][C] = true; else if(data === 'FALSE') arr[R][C] = false; else if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value); else if(!isNaN(fuzzydate(value).getDate())) arr[R][C] = parseDate(value); else arr[R][C] = value; ++C; break; case 1: data = data.slice(1,data.length-1); data = data.replace(/""/g, '"'); if(DIF_XL && data && data.match(/^=".*"$/)) data = data.slice(2, -1); arr[R][C++] = data !== '' ? data : null; break; } if (data === 'EOD') break; } if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); return arr; } function dif_to_sheet(str/*:string*/, opts)/*:Worksheet*/ { return aoa_to_sheet(dif_to_aoa(str, opts), opts); } function dif_to_workbook(str/*:string*/, opts)/*:Workbook*/ { return sheet_to_workbook(dif_to_sheet(str, opts), opts); } var sheet_to_dif = /*#__PURE__*/(function() { var push_field = function pf(o/*:Array*/, topic/*:string*/, v/*:number*/, n/*:number*/, s/*:string*/) { o.push(topic); o.push(v + "," + n); o.push('"' + s.replace(/"/g,'""') + '"'); }; var push_value = function po(o/*:Array*/, type/*:number*/, v/*:any*/, s/*:string*/) { o.push(type + "," + v); o.push(type == 1 ? '"' + s.replace(/"/g,'""') + '"' : s); }; return function sheet_to_dif(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ { var o/*:Array*/ = []; var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; var dense = Array.isArray(ws); push_field(o, "TABLE", 0, 1, "sheetjs"); push_field(o, "VECTORS", 0, r.e.r - r.s.r + 1,""); push_field(o, "TUPLES", 0, r.e.c - r.s.c + 1,""); push_field(o, "DATA", 0, 0,""); for(var R = r.s.r; R <= r.e.r; ++R) { push_value(o, -1, 0, "BOT"); for(var C = r.s.c; C <= r.e.c; ++C) { var coord = encode_cell({r:R,c:C}); cell = dense ? (ws[R]||[])[C] : ws[coord]; if(!cell) { push_value(o, 1, 0, ""); continue;} switch(cell.t) { case 'n': var val = DIF_XL ? cell.w : cell.v; if(!val && cell.v != null) val = cell.v; if(val == null) { if(DIF_XL && cell.f && !cell.F) push_value(o, 1, 0, "=" + cell.f); else push_value(o, 1, 0, ""); } else push_value(o, 0, val, "V"); break; case 'b': push_value(o, 0, cell.v ? 1 : 0, cell.v ? "TRUE" : "FALSE"); break; case 's': push_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '="' + cell.v + '"'); break; case 'd': if(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate(cell.v))); if(DIF_XL) push_value(o, 0, cell.w, "V"); else push_value(o, 1, 0, cell.w); break; default: push_value(o, 1, 0, ""); } } } push_value(o, -1, 0, "EOD"); var RS = "\r\n"; var oo = o.join(RS); //while((oo.length & 0x7F) != 0) oo += "\0"; return oo; }; })(); return { to_workbook: dif_to_workbook, to_sheet: dif_to_sheet, from_sheet: sheet_to_dif }; })(); var ETH = /*#__PURE__*/(function() { function decode(s/*:string*/)/*:string*/ { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); } function encode(s/*:string*/)/*:string*/ { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); } function eth_to_aoa(str/*:string*/, opts)/*:AOA*/ { var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = []; for (; ri !== records.length; ++ri) { var record = records[ri].trim().split(":"); if(record[0] !== 'cell') continue; var addr = decode_cell(record[1]); if(arr.length <= addr.r) for(R = arr.length; R <= addr.r; ++R) if(!arr[R]) arr[R] = []; R = addr.r; C = addr.c; switch(record[2]) { case 't': arr[R][C] = decode(record[3]); break; case 'v': arr[R][C] = +record[3]; break; case 'vtf': var _f = record[record.length - 1]; /* falls through */ case 'vtc': switch(record[3]) { case 'nl': arr[R][C] = +record[4] ? true : false; break; default: arr[R][C] = +record[4]; break; } if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f]; } } if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); return arr; } function eth_to_sheet(d/*:string*/, opts)/*:Worksheet*/ { return aoa_to_sheet(eth_to_aoa(d, opts), opts); } function eth_to_workbook(d/*:string*/, opts)/*:Workbook*/ { return sheet_to_workbook(eth_to_sheet(d, opts), opts); } var header = [ "socialcalc:version:1.5", "MIME-Version: 1.0", "Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave" ].join("\n"); var sep = [ "--SocialCalcSpreadsheetControlSave", "Content-type: text/plain; charset=UTF-8" ].join("\n") + "\n"; /* TODO: the other parts */ var meta = [ "# SocialCalc Spreadsheet Control Save", "part:sheet" ].join("\n"); var end = "--SocialCalcSpreadsheetControlSave--"; function sheet_to_eth_data(ws/*:Worksheet*/)/*:string*/ { if(!ws || !ws['!ref']) return ""; var o/*:Array*/ = [], oo/*:Array*/ = [], cell, coord = ""; var r = decode_range(ws['!ref']); var dense = Array.isArray(ws); for(var R = r.s.r; R <= r.e.r; ++R) { for(var C = r.s.c; C <= r.e.c; ++C) { coord = encode_cell({r:R,c:C}); cell = dense ? (ws[R]||[])[C] : ws[coord]; if(!cell || cell.v == null || cell.t === 'z') continue; oo = ["cell", coord, 't']; switch(cell.t) { case 's': case 'str': oo.push(encode(cell.v)); break; case 'n': if(!cell.f) { oo[2]='v'; oo[3]=cell.v; } else { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); } break; case 'b': oo[2] = 'vt'+(cell.f?'f':'c'); oo[3]='nl'; oo[4]=cell.v?"1":"0"; oo[5] = encode(cell.f||(cell.v?'TRUE':'FALSE')); break; case 'd': var t = datenum(parseDate(cell.v)); oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t; oo[5] = cell.w || SSF_format(cell.z || table_fmt[14], t); break; case 'e': continue; } o.push(oo.join(":")); } } o.push("sheet:c:" + (r.e.c-r.s.c+1) + ":r:" + (r.e.r-r.s.r+1) + ":tvf:1"); o.push("valueformat:1:text-wiki"); //o.push("copiedfrom:" + ws['!ref']); // clipboard only return o.join("\n"); } function sheet_to_eth(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ { return [header, sep, meta, sep, sheet_to_eth_data(ws), end].join("\n"); // return ["version:1.5", sheet_to_eth_data(ws)].join("\n"); // clipboard form } return { to_workbook: eth_to_workbook, to_sheet: eth_to_sheet, from_sheet: sheet_to_eth }; })(); var PRN = /*#__PURE__*/(function() { function set_text_arr(data/*:string*/, arr/*:AOA*/, R/*:number*/, C/*:number*/, o/*:any*/) { if(o.raw) arr[R][C] = data; else if(data === ""){/* empty */} else if(data === 'TRUE') arr[R][C] = true; else if(data === 'FALSE') arr[R][C] = false; else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data); else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data); else arr[R][C] = data; } function prn_to_aoa_str(f/*:string*/, opts)/*:AOA*/ { var o = opts || {}; var arr/*:AOA*/ = ([]/*:any*/); if(!f || f.length === 0) return arr; var lines = f.split(/[\r\n]/); var L = lines.length - 1; while(L >= 0 && lines[L].length === 0) --L; var start = 10, idx = 0; var R = 0; for(; R <= L; ++R) { idx = lines[R].indexOf(" "); if(idx == -1) idx = lines[R].length; else idx++; start = Math.max(start, idx); } for(R = 0; R <= L; ++R) { arr[R] = []; /* TODO: confirm that widths are always 10 */ var C = 0; set_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o); for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C) set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o); } if(o.sheetRows) arr = arr.slice(0, o.sheetRows); return arr; } // List of accepted CSV separators var guess_seps = { /*::[*/0x2C/*::]*/: ',', /*::[*/0x09/*::]*/: "\t", /*::[*/0x3B/*::]*/: ';', /*::[*/0x7C/*::]*/: '|' }; // CSV separator weights to be used in case of equal numbers var guess_sep_weights = { /*::[*/0x2C/*::]*/: 3, /*::[*/0x09/*::]*/: 2, /*::[*/0x3B/*::]*/: 1, /*::[*/0x7C/*::]*/: 0 }; function guess_sep(str) { var cnt = {}, instr = false, end = 0, cc = 0; for(;end < str.length;++end) { if((cc=str.charCodeAt(end)) == 0x22) instr = !instr; else if(!instr && cc in guess_seps) cnt[cc] = (cnt[cc]||0)+1; } cc = []; for(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) { cc.push([ cnt[end], end ]); } if ( !cc.length ) { cnt = guess_sep_weights; for(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) { cc.push([ cnt[end], end ]); } } cc.sort(function(a, b) { return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]]; }); return guess_seps[cc.pop()[1]] || 0x2C; } function dsv_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ { var o = opts || {}; var sep = ""; if(DENSE != null && o.dense == null) o.dense = DENSE; var ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/); var range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:0}}/*:any*/); if(str.slice(0,4) == "sep=") { // If the line ends in \r\n if(str.charCodeAt(5) == 13 && str.charCodeAt(6) == 10 ) { sep = str.charAt(4); str = str.slice(7); } // If line ends in \r OR \n else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) { sep = str.charAt(4); str = str.slice(6); } else sep = guess_sep(str.slice(0,1024)); } else if(o && o.FS) sep = o.FS; else sep = guess_sep(str.slice(0,1024)); var R = 0, C = 0, v = 0; var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0, startcc=str.charCodeAt(0); str = str.replace(/\r\n/mg, "\n"); var _re/*:?RegExp*/ = o.dateNF != null ? dateNF_regex(o.dateNF) : null; function finish_cell() { var s = str.slice(start, end); var cell = ({}/*:any*/); if(s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') s = s.slice(1,-1).replace(/""/g,'"'); if(s.length === 0) cell.t = 'z'; else if(o.raw) { cell.t = 's'; cell.v = s; } else if(s.trim().length === 0) { cell.t = 's'; cell.v = s; } else if(s.charCodeAt(0) == 0x3D) { if(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/""/g,'"'); } else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); } else { cell.t = 's'; cell.v = s; } } else if(s == "TRUE") { cell.t = 'b'; cell.v = true; } else if(s == "FALSE") { cell.t = 'b'; cell.v = false; } else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; } else if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) { cell.z = o.dateNF || table_fmt[14]; var k = 0; if(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; } if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); } else { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); } if(o.cellText !== false) cell.w = SSF_format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v); if(!o.cellNF) delete cell.z; } else { cell.t = 's'; cell.v = s; } if(cell.t == 'z'){} else if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; } else ws[encode_cell({c:C,r:R})] = cell; start = end+1; startcc = str.charCodeAt(start); if(range.e.c < C) range.e.c = C; if(range.e.r < R) range.e.r = R; if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; } } outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) { case 0x22: if(startcc === 0x22) instr = !instr; break; case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break; default: break; } if(end - start > 0) finish_cell(); ws['!ref'] = encode_range(range); return ws; } function prn_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ { if(!(opts && opts.PRN)) return dsv_to_sheet_str(str, opts); if(opts.FS) return dsv_to_sheet_str(str, opts); if(str.slice(0,4) == "sep=") return dsv_to_sheet_str(str, opts); if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts); return aoa_to_sheet(prn_to_aoa_str(str, opts), opts); } function prn_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { var str = "", bytes = opts.type == 'string' ? [0,0,0,0] : firstbyte(d, opts); switch(opts.type) { case 'base64': str = Base64_decode(d); break; case 'binary': str = d; break; case 'buffer': if(opts.codepage == 65001) str = d.toString('utf8'); // TODO: test if buf else if(opts.codepage && typeof $cptable !== 'undefined') str = $cptable.utils.decode(opts.codepage, d); else str = has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d); break; case 'array': str = cc2str(d); break; case 'string': str = d; break; default: throw new Error("Unrecognized type " + opts.type); } if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3)); else if(opts.type != 'string' && opts.type != 'buffer' && opts.codepage == 65001) str = utf8read(str); else if((opts.type == 'binary') && typeof $cptable !== 'undefined' && opts.codepage) str = $cptable.utils.decode(opts.codepage, $cptable.utils.encode(28591,str)); if(str.slice(0,19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts); return prn_to_sheet_str(str, opts); } function prn_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(prn_to_sheet(d, opts), opts); } function sheet_to_prn(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ { var o/*:Array*/ = []; var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; var dense = Array.isArray(ws); for(var R = r.s.r; R <= r.e.r; ++R) { var oo/*:Array*/ = []; for(var C = r.s.c; C <= r.e.c; ++C) { var coord = encode_cell({r:R,c:C}); cell = dense ? (ws[R]||[])[C] : ws[coord]; if(!cell || cell.v == null) { oo.push(" "); continue; } var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10); while(w.length < 10) w += " "; oo.push(w + (C === 0 ? " " : "")); } o.push(oo.join("")); } return o.join("\n"); } return { to_workbook: prn_to_workbook, to_sheet: prn_to_sheet, from_sheet: sheet_to_prn }; })(); /* Excel defaults to SYLK but warns if data is not valid */ function read_wb_ID(d, opts) { var o = opts || {}, OLD_WTF = !!o.WTF; o.WTF = true; try { var out = SYLK.to_workbook(d, o); o.WTF = OLD_WTF; return out; } catch(e) { o.WTF = OLD_WTF; if(!e.message.match(/SYLK bad record ID/) && OLD_WTF) throw e; return PRN.to_workbook(d, opts); } } var WK_ = /*#__PURE__*/(function() { function lotushopper(data, cb/*:RecordHopperCB*/, opts/*:any*/) { if(!data) return; prep_blob(data, data.l || 0); var Enum = opts.Enum || WK1Enum; while(data.l < data.length) { var RT = data.read_shift(2); var R = Enum[RT] || Enum[0xFFFF]; var length = data.read_shift(2); var tgt = data.l + length; var d = R.f && R.f(data, length, opts); data.l = tgt; if(cb(d, R, RT)) return; } } function lotus_to_workbook(d/*:RawData*/, opts) { switch(opts.type) { case 'base64': return lotus_to_workbook_buf(s2a(Base64_decode(d)), opts); case 'binary': return lotus_to_workbook_buf(s2a(d), opts); case 'buffer': case 'array': return lotus_to_workbook_buf(d, opts); } throw "Unsupported type " + opts.type; } function lotus_to_workbook_buf(d, opts)/*:Workbook*/ { if(!d) return d; var o = opts || {}; if(DENSE != null && o.dense == null) o.dense = DENSE; var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = "Sheet1", next_n = "", sidx = 0; var sheets = {}, snames = [], realnames = []; var refguess = {s: {r:0, c:0}, e: {r:0, c:0} }; var sheetRows = o.sheetRows || 0; if(d[2] == 0x00) { if(d[3] == 0x08 || d[3] == 0x09) { if(d.length >= 16 && d[14] == 0x05 && d[15] === 0x6c) throw new Error("Unsupported Works 3 for Mac file"); } } if(d[2] == 0x02) { o.Enum = WK1Enum; lotushopper(d, function(val, R, RT) { switch(RT) { case 0x00: /* BOF */ o.vers = val; if(val >= 0x1000) o.qpro = true; break; case 0x06: refguess = val; break; /* RANGE */ case 0xCC: if(val) next_n = val; break; /* SHEETNAMECS */ case 0xDE: next_n = val; break; /* SHEETNAMELP */ case 0x0F: /* LABEL */ case 0x33: /* STRING */ if(!o.qpro) val[1].v = val[1].v.slice(1); /* falls through */ case 0x0D: /* INTEGER */ case 0x0E: /* NUMBER */ case 0x10: /* FORMULA */ /* TODO: actual translation of the format code */ if(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) { val[1].z = o.dateNF || table_fmt[14]; if(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); } } if(o.qpro) { if(val[3] > sidx) { s["!ref"] = encode_range(refguess); sheets[n] = s; snames.push(n); s = (o.dense ? [] : {}); refguess = {s: {r:0, c:0}, e: {r:0, c:0} }; sidx = val[3]; n = next_n || "Sheet" + (sidx + 1); next_n = ""; } } var tmpcell = o.dense ? (s[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])]; if(tmpcell) { tmpcell.t = val[1].t; tmpcell.v = val[1].v; if(val[1].z != null) tmpcell.z = val[1].z; if(val[1].f != null) tmpcell.f = val[1].f; break; } if(o.dense) { if(!s[val[0].r]) s[val[0].r] = []; s[val[0].r][val[0].c] = val[1]; } else s[encode_cell(val[0])] = val[1]; break; default: }}, o); } else if(d[2] == 0x1A || d[2] == 0x0E) { o.Enum = WK3Enum; if(d[2] == 0x0E) { o.qpro = true; d.l = 0; } lotushopper(d, function(val, R, RT) { switch(RT) { case 0xCC: n = val; break; /* SHEETNAMECS */ case 0x16: /* LABEL16 */ val[1].v = val[1].v.slice(1); /* falls through */ case 0x17: /* NUMBER17 */ case 0x18: /* NUMBER18 */ case 0x19: /* FORMULA19 */ case 0x25: /* NUMBER25 */ case 0x27: /* NUMBER27 */ case 0x28: /* FORMULA28 */ if(val[3] > sidx) { s["!ref"] = encode_range(refguess); sheets[n] = s; snames.push(n); s = (o.dense ? [] : {}); refguess = {s: {r:0, c:0}, e: {r:0, c:0} }; sidx = val[3]; n = "Sheet" + (sidx + 1); } if(sheetRows > 0 && val[0].r >= sheetRows) break; if(o.dense) { if(!s[val[0].r]) s[val[0].r] = []; s[val[0].r][val[0].c] = val[1]; } else s[encode_cell(val[0])] = val[1]; if(refguess.e.c < val[0].c) refguess.e.c = val[0].c; if(refguess.e.r < val[0].r) refguess.e.r = val[0].r; break; case 0x1B: /* XFORMAT */ if(val[0x36b0]) realnames[val[0x36b0][0]] = val[0x36b0][1]; break; case 0x0601: /* SHEETINFOQP */ realnames[val[0]] = val[1]; if(val[0] == sidx) n = val[1]; break; default: break; }}, o); } else throw new Error("Unrecognized LOTUS BOF " + d[2]); s["!ref"] = encode_range(refguess); sheets[next_n || n] = s; snames.push(next_n || n); if(!realnames.length) return { SheetNames: snames, Sheets: sheets }; var osheets = {}, rnames = []; /* TODO: verify no collisions */ for(var i = 0; i < realnames.length; ++i) if(sheets[snames[i]]) { rnames.push(realnames[i] || snames[i]); osheets[realnames[i]] = sheets[realnames[i]] || sheets[snames[i]]; } else { rnames.push(realnames[i]); osheets[realnames[i]] = ({ "!ref": "A1" }); } return { SheetNames: rnames, Sheets: osheets }; } function sheet_to_wk1(ws/*:Worksheet*/, opts/*:WriteOpts*/) { var o = opts || {}; if(+o.codepage >= 0) set_cp(+o.codepage); if(o.type == "string") throw new Error("Cannot write WK1 to JS string"); var ba = buf_array(); var range = safe_decode_range(ws["!ref"]); var dense = Array.isArray(ws); var cols = []; write_biff_rec(ba, 0x00, write_BOF_WK1(0x0406)); write_biff_rec(ba, 0x06, write_RANGE(range)); var max_R = Math.min(range.e.r, 8191); for(var R = range.s.r; R <= max_R; ++R) { var rr = encode_row(R); for(var C = range.s.c; C <= range.e.c; ++C) { if(R === range.s.r) cols[C] = encode_col(C); var ref = cols[C] + rr; var cell = dense ? (ws[R]||[])[C] : ws[ref]; if(!cell || cell.t == "z") continue; /* TODO: formula records */ if(cell.t == "n") { if((cell.v|0)==cell.v && cell.v >= -32768 && cell.v <= 32767) write_biff_rec(ba, 0x0d, write_INTEGER(R, C, cell.v)); else write_biff_rec(ba, 0x0e, write_NUMBER(R, C, cell.v)); } else { var str = format_cell(cell); write_biff_rec(ba, 0x0F, write_LABEL(R, C, str.slice(0, 239))); } } } write_biff_rec(ba, 0x01); return ba.end(); } function book_to_wk3(wb/*:Workbook*/, opts/*:WriteOpts*/) { var o = opts || {}; if(+o.codepage >= 0) set_cp(+o.codepage); if(o.type == "string") throw new Error("Cannot write WK3 to JS string"); var ba = buf_array(); write_biff_rec(ba, 0x00, write_BOF_WK3(wb)); for(var i = 0, cnt = 0; i < wb.SheetNames.length; ++i) if((wb.Sheets[wb.SheetNames[i]] || {})["!ref"]) write_biff_rec(ba, 0x1b, write_XFORMAT_SHEETNAME(wb.SheetNames[i], cnt++)); var wsidx = 0; for(i = 0; i < wb.SheetNames.length; ++i) { var ws = wb.Sheets[wb.SheetNames[i]]; if(!ws || !ws["!ref"]) continue; var range = safe_decode_range(ws["!ref"]); var dense = Array.isArray(ws); var cols = []; var max_R = Math.min(range.e.r, 8191); for(var R = range.s.r; R <= max_R; ++R) { var rr = encode_row(R); for(var C = range.s.c; C <= range.e.c; ++C) { if(R === range.s.r) cols[C] = encode_col(C); var ref = cols[C] + rr; var cell = dense ? (ws[R]||[])[C] : ws[ref]; if(!cell || cell.t == "z") continue; /* TODO: FORMULA19 NUMBER18 records */ if(cell.t == "n") { write_biff_rec(ba, 0x17, write_NUMBER_17(R, C, wsidx, cell.v)); } else { var str = format_cell(cell); /* TODO: max len? */ write_biff_rec(ba, 0x16, write_LABEL_16(R, C, wsidx, str.slice(0, 239))); } } } ++wsidx; } write_biff_rec(ba, 0x01); return ba.end(); } function write_BOF_WK1(v/*:number*/) { var out = new_buf(2); out.write_shift(2, v); return out; } function write_BOF_WK3(wb/*:Workbook*/) { var out = new_buf(26); out.write_shift(2, 0x1000); out.write_shift(2, 0x0004); out.write_shift(4, 0x0000); var rows = 0, cols = 0, wscnt = 0; for(var i = 0; i < wb.SheetNames.length; ++i) { var name = wb.SheetNames[i]; var ws = wb.Sheets[name]; if(!ws || !ws["!ref"]) continue; ++wscnt; var range = decode_range(ws["!ref"]); if(rows < range.e.r) rows = range.e.r; if(cols < range.e.c) cols = range.e.c; } if(rows > 8191) rows = 8191; out.write_shift(2, rows); out.write_shift(1, wscnt); out.write_shift(1, cols); out.write_shift(2, 0x00); out.write_shift(2, 0x00); out.write_shift(1, 0x01); out.write_shift(1, 0x02); out.write_shift(4, 0); out.write_shift(4, 0); return out; } function parse_RANGE(blob, length, opts) { var o = {s:{c:0,r:0},e:{c:0,r:0}}; if(length == 8 && opts.qpro) { o.s.c = blob.read_shift(1); blob.l++; o.s.r = blob.read_shift(2); o.e.c = blob.read_shift(1); blob.l++; o.e.r = blob.read_shift(2); return o; } o.s.c = blob.read_shift(2); o.s.r = blob.read_shift(2); if(length == 12 && opts.qpro) blob.l += 2; o.e.c = blob.read_shift(2); o.e.r = blob.read_shift(2); if(length == 12 && opts.qpro) blob.l += 2; if(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0; return o; } function write_RANGE(range) { var out = new_buf(8); out.write_shift(2, range.s.c); out.write_shift(2, range.s.r); out.write_shift(2, range.e.c); out.write_shift(2, range.e.r); return out; } function parse_cell(blob, length, opts) { var o = [{c:0,r:0}, {t:'n',v:0}, 0, 0]; if(opts.qpro && opts.vers != 0x5120) { o[0].c = blob.read_shift(1); o[3] = blob.read_shift(1); o[0].r = blob.read_shift(2); blob.l+=2; } else { o[2] = blob.read_shift(1); o[0].c = blob.read_shift(2); o[0].r = blob.read_shift(2); } return o; } function parse_LABEL(blob, length, opts) { var tgt = blob.l + length; var o = parse_cell(blob, length, opts); o[1].t = 's'; if(opts.vers == 0x5120) { blob.l++; var len = blob.read_shift(1); o[1].v = blob.read_shift(len, 'utf8'); return o; } if(opts.qpro) blob.l++; o[1].v = blob.read_shift(tgt - blob.l, 'cstr'); return o; } function write_LABEL(R, C, s) { /* TODO: encoding */ var o = new_buf(7 + s.length); o.write_shift(1, 0xFF); o.write_shift(2, C); o.write_shift(2, R); o.write_shift(1, 0x27); // ?? for(var i = 0; i < o.length; ++i) { var cc = s.charCodeAt(i); o.write_shift(1, cc >= 0x80 ? 0x5F : cc); } o.write_shift(1, 0); return o; } function parse_INTEGER(blob, length, opts) { var o = parse_cell(blob, length, opts); o[1].v = blob.read_shift(2, 'i'); return o; } function write_INTEGER(R, C, v) { var o = new_buf(7); o.write_shift(1, 0xFF); o.write_shift(2, C); o.write_shift(2, R); o.write_shift(2, v, 'i'); return o; } function parse_NUMBER(blob, length, opts) { var o = parse_cell(blob, length, opts); o[1].v = blob.read_shift(8, 'f'); return o; } function write_NUMBER(R, C, v) { var o = new_buf(13); o.write_shift(1, 0xFF); o.write_shift(2, C); o.write_shift(2, R); o.write_shift(8, v, 'f'); return o; } function parse_FORMULA(blob, length, opts) { var tgt = blob.l + length; var o = parse_cell(blob, length, opts); /* TODO: formula */ o[1].v = blob.read_shift(8, 'f'); if(opts.qpro) blob.l = tgt; else { var flen = blob.read_shift(2); wk1_fmla_to_csf(blob.slice(blob.l, blob.l + flen), o); blob.l += flen; } return o; } function wk1_parse_rc(B, V, col) { var rel = V & 0x8000; V &= ~0x8000; V = (rel ? B : 0) + ((V >= 0x2000) ? V - 0x4000 : V); return (rel ? "" : "$") + (col ? encode_col(V) : encode_row(V)); } /* var oprec = [ 8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 4, 5, 5, 7, 3, 3, 3, 3, 3, 3, 1, 1, 2, 6, 8, 8, 8, 8, 8, 8, 8, 8 ]; */ /* TODO: flesh out */ var FuncTab = { 0x33: ["FALSE", 0], 0x34: ["TRUE", 0], 0x46: ["LEN", 1], 0x50: ["SUM", 69], 0x51: ["AVERAGEA", 69], 0x52: ["COUNTA", 69], 0x53: ["MINA", 69], 0x54: ["MAXA", 69], 0x6F: ["T", 1] }; var BinOpTab = [ "", "", "", "", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs "", "+", "-", "*", "/", "^", "=", "<>", // eslint-disable-line no-mixed-spaces-and-tabs "<=", ">=", "<", ">", "", "", "", "", // eslint-disable-line no-mixed-spaces-and-tabs "&", "", "", "", "", "", "", "" // eslint-disable-line no-mixed-spaces-and-tabs ]; function wk1_fmla_to_csf(blob, o) { prep_blob(blob, 0); var out = [], argc = 0, R = "", C = "", argL = "", argR = ""; while(blob.l < blob.length) { var cc = blob[blob.l++]; switch(cc) { case 0x00: out.push(blob.read_shift(8, 'f')); break; case 0x01: { C = wk1_parse_rc(o[0].c, blob.read_shift(2), true); R = wk1_parse_rc(o[0].r, blob.read_shift(2), false); out.push(C + R); } break; case 0x02: { var c = wk1_parse_rc(o[0].c, blob.read_shift(2), true); var r = wk1_parse_rc(o[0].r, blob.read_shift(2), false); C = wk1_parse_rc(o[0].c, blob.read_shift(2), true); R = wk1_parse_rc(o[0].r, blob.read_shift(2), false); out.push(c + r + ":" + C + R); } break; case 0x03: if(blob.l < blob.length) { console.error("WK1 premature formula end"); return; } break; case 0x04: out.push("(" + out.pop() + ")"); break; case 0x05: out.push(blob.read_shift(2)); break; case 0x06: { /* TODO: text encoding */ var Z = ""; while((cc = blob[blob.l++])) Z += String.fromCharCode(cc); out.push('"' + Z.replace(/"/g, '""') + '"'); } break; case 0x08: out.push("-" + out.pop()); break; case 0x17: out.push("+" + out.pop()); break; case 0x16: out.push("NOT(" + out.pop() + ")"); break; case 0x14: case 0x15: { argR = out.pop(); argL = out.pop(); out.push(["AND", "OR"][cc - 0x14] + "(" + argL + "," + argR + ")"); } break; default: if(cc < 0x20 && BinOpTab[cc]) { argR = out.pop(); argL = out.pop(); out.push(argL + BinOpTab[cc] + argR); } else if(FuncTab[cc]) { argc = FuncTab[cc][1]; if(argc == 69) argc = blob[blob.l++]; if(argc > out.length) { console.error("WK1 bad formula parse 0x" + cc.toString(16) + ":|" + out.join("|") + "|"); return; } var args = out.slice(-argc); out.length -= argc; out.push(FuncTab[cc][0] + "(" + args.join(",") + ")"); } else if(cc <= 0x07) return console.error("WK1 invalid opcode " + cc.toString(16)); else if(cc <= 0x18) return console.error("WK1 unsupported op " + cc.toString(16)); else if(cc <= 0x1E) return console.error("WK1 invalid opcode " + cc.toString(16)); else if(cc <= 0x73) return console.error("WK1 unsupported function opcode " + cc.toString(16)); // possible future functions ?? else return console.error("WK1 unrecognized opcode " + cc.toString(16)); } } if(out.length == 1) o[1].f = "" + out[0]; else console.error("WK1 bad formula parse |" + out.join("|") + "|"); } function parse_cell_3(blob/*::, length*/) { var o = [{c:0,r:0}, {t:'n',v:0}, 0]; o[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++]; return o; } function parse_LABEL_16(blob, length) { var o = parse_cell_3(blob, length); o[1].t = 's'; o[1].v = blob.read_shift(length - 4, 'cstr'); return o; } function write_LABEL_16(R, C, wsidx, s) { /* TODO: encoding */ var o = new_buf(6 + s.length); o.write_shift(2, R); o.write_shift(1, wsidx); o.write_shift(1, C); o.write_shift(1, 0x27); for(var i = 0; i < s.length; ++i) { var cc = s.charCodeAt(i); o.write_shift(1, cc >= 0x80 ? 0x5F : cc); } o.write_shift(1, 0); return o; } function parse_NUMBER_18(blob, length) { var o = parse_cell_3(blob, length); o[1].v = blob.read_shift(2); var v = o[1].v >> 1; if(o[1].v & 0x1) { switch(v & 0x07) { case 0: v = (v >> 3) * 5000; break; case 1: v = (v >> 3) * 500; break; case 2: v = (v >> 3) / 20; break; case 3: v = (v >> 3) / 200; break; case 4: v = (v >> 3) / 2000; break; case 5: v = (v >> 3) / 20000; break; case 6: v = (v >> 3) / 16; break; case 7: v = (v >> 3) / 64; break; } } o[1].v = v; return o; } function parse_NUMBER_17(blob, length) { var o = parse_cell_3(blob, length); var v1 = blob.read_shift(4); var v2 = blob.read_shift(4); var e = blob.read_shift(2); if(e == 0xFFFF) { if(v1 === 0 && v2 === 0xC0000000) { o[1].t = "e"; o[1].v = 0x0F; } // ERR -> #VALUE! else if(v1 === 0 && v2 === 0xD0000000) { o[1].t = "e"; o[1].v = 0x2A; } // NA -> #N/A else o[1].v = 0; return o; } var s = e & 0x8000; e = (e&0x7FFF) - 16446; o[1].v = (1 - s*2) * (v2 * Math.pow(2, e+32) + v1 * Math.pow(2, e)); return o; } function write_NUMBER_17(R, C, wsidx, v) { var o = new_buf(14); o.write_shift(2, R); o.write_shift(1, wsidx); o.write_shift(1, C); if(v == 0) { o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(2, 0xFFFF); return o; } var s = 0, e = 0, v1 = 0, v2 = 0; if(v < 0) { s = 1; v = -v; } e = Math.log2(v) | 0; v /= Math.pow(2, e-31); v2 = (v)>>>0; if((v2&0x80000000) == 0) { v/=2; ++e; v2 = v >>> 0; } v -= v2; v2 |= 0x80000000; v2 >>>= 0; v *= Math.pow(2, 32); v1 = v>>>0; o.write_shift(4, v1); o.write_shift(4, v2); e += 0x3FFF + (s ? 0x8000 : 0); o.write_shift(2, e); return o; } function parse_FORMULA_19(blob, length) { var o = parse_NUMBER_17(blob, 14); blob.l += length - 14; /* TODO: WK3 formula */ return o; } function parse_NUMBER_25(blob, length) { var o = parse_cell_3(blob, length); var v1 = blob.read_shift(4); o[1].v = v1 >> 6; return o; } function parse_NUMBER_27(blob, length) { var o = parse_cell_3(blob, length); var v1 = blob.read_shift(8,'f'); o[1].v = v1; return o; } function parse_FORMULA_28(blob, length) { var o = parse_NUMBER_27(blob, 14); blob.l += length - 10; /* TODO: formula */ return o; } function parse_SHEETNAMECS(blob, length) { return blob[blob.l + length - 1] == 0 ? blob.read_shift(length, 'cstr') : ""; } function parse_SHEETNAMELP(blob, length) { var len = blob[blob.l++]; if(len > length - 1) len = length - 1; var o = ""; while(o.length < len) o += String.fromCharCode(blob[blob.l++]); return o; } function parse_SHEETINFOQP(blob, length, opts) { if(!opts.qpro || length < 21) return; var id = blob.read_shift(1); blob.l += 17; blob.l += 1; //var len = blob.read_shift(1); blob.l += 2; var nm = blob.read_shift(length - 21, 'cstr'); return [id, nm]; } function parse_XFORMAT(blob, length) { var o = {}, tgt = blob.l + length; while(blob.l < tgt) { var dt = blob.read_shift(2); if(dt == 0x36b0) { o[dt] = [0, ""]; o[dt][0] = blob.read_shift(2); while(blob[blob.l]) { o[dt][1] += String.fromCharCode(blob[blob.l]); blob.l++; } blob.l++; } // TODO: 0x3a99 ?? } return o; } function write_XFORMAT_SHEETNAME(name, wsidx) { var out = new_buf(5 + name.length); out.write_shift(2, 0x36b0); out.write_shift(2, wsidx); for(var i = 0; i < name.length; ++i) { var cc = name.charCodeAt(i); out[out.l++] = cc > 0x7F ? 0x5F : cc; } out[out.l++] = 0; return out; } var WK1Enum = { /*::[*/0x0000/*::]*/: { n:"BOF", f:parseuint16 }, /*::[*/0x0001/*::]*/: { n:"EOF" }, /*::[*/0x0002/*::]*/: { n:"CALCMODE" }, /*::[*/0x0003/*::]*/: { n:"CALCORDER" }, /*::[*/0x0004/*::]*/: { n:"SPLIT" }, /*::[*/0x0005/*::]*/: { n:"SYNC" }, /*::[*/0x0006/*::]*/: { n:"RANGE", f:parse_RANGE }, /*::[*/0x0007/*::]*/: { n:"WINDOW1" }, /*::[*/0x0008/*::]*/: { n:"COLW1" }, /*::[*/0x0009/*::]*/: { n:"WINTWO" }, /*::[*/0x000A/*::]*/: { n:"COLW2" }, /*::[*/0x000B/*::]*/: { n:"NAME" }, /*::[*/0x000C/*::]*/: { n:"BLANK" }, /*::[*/0x000D/*::]*/: { n:"INTEGER", f:parse_INTEGER }, /*::[*/0x000E/*::]*/: { n:"NUMBER", f:parse_NUMBER }, /*::[*/0x000F/*::]*/: { n:"LABEL", f:parse_LABEL }, /*::[*/0x0010/*::]*/: { n:"FORMULA", f:parse_FORMULA }, /*::[*/0x0018/*::]*/: { n:"TABLE" }, /*::[*/0x0019/*::]*/: { n:"ORANGE" }, /*::[*/0x001A/*::]*/: { n:"PRANGE" }, /*::[*/0x001B/*::]*/: { n:"SRANGE" }, /*::[*/0x001C/*::]*/: { n:"FRANGE" }, /*::[*/0x001D/*::]*/: { n:"KRANGE1" }, /*::[*/0x0020/*::]*/: { n:"HRANGE" }, /*::[*/0x0023/*::]*/: { n:"KRANGE2" }, /*::[*/0x0024/*::]*/: { n:"PROTEC" }, /*::[*/0x0025/*::]*/: { n:"FOOTER" }, /*::[*/0x0026/*::]*/: { n:"HEADER" }, /*::[*/0x0027/*::]*/: { n:"SETUP" }, /*::[*/0x0028/*::]*/: { n:"MARGINS" }, /*::[*/0x0029/*::]*/: { n:"LABELFMT" }, /*::[*/0x002A/*::]*/: { n:"TITLES" }, /*::[*/0x002B/*::]*/: { n:"SHEETJS" }, /*::[*/0x002D/*::]*/: { n:"GRAPH" }, /*::[*/0x002E/*::]*/: { n:"NGRAPH" }, /*::[*/0x002F/*::]*/: { n:"CALCCOUNT" }, /*::[*/0x0030/*::]*/: { n:"UNFORMATTED" }, /*::[*/0x0031/*::]*/: { n:"CURSORW12" }, /*::[*/0x0032/*::]*/: { n:"WINDOW" }, /*::[*/0x0033/*::]*/: { n:"STRING", f:parse_LABEL }, /*::[*/0x0037/*::]*/: { n:"PASSWORD" }, /*::[*/0x0038/*::]*/: { n:"LOCKED" }, /*::[*/0x003C/*::]*/: { n:"QUERY" }, /*::[*/0x003D/*::]*/: { n:"QUERYNAME" }, /*::[*/0x003E/*::]*/: { n:"PRINT" }, /*::[*/0x003F/*::]*/: { n:"PRINTNAME" }, /*::[*/0x0040/*::]*/: { n:"GRAPH2" }, /*::[*/0x0041/*::]*/: { n:"GRAPHNAME" }, /*::[*/0x0042/*::]*/: { n:"ZOOM" }, /*::[*/0x0043/*::]*/: { n:"SYMSPLIT" }, /*::[*/0x0044/*::]*/: { n:"NSROWS" }, /*::[*/0x0045/*::]*/: { n:"NSCOLS" }, /*::[*/0x0046/*::]*/: { n:"RULER" }, /*::[*/0x0047/*::]*/: { n:"NNAME" }, /*::[*/0x0048/*::]*/: { n:"ACOMM" }, /*::[*/0x0049/*::]*/: { n:"AMACRO" }, /*::[*/0x004A/*::]*/: { n:"PARSE" }, /*::[*/0x0066/*::]*/: { n:"PRANGES??" }, /*::[*/0x0067/*::]*/: { n:"RRANGES??" }, /*::[*/0x0068/*::]*/: { n:"FNAME??" }, /*::[*/0x0069/*::]*/: { n:"MRANGES??" }, /*::[*/0x00CC/*::]*/: { n:"SHEETNAMECS", f:parse_SHEETNAMECS }, /*::[*/0x00DE/*::]*/: { n:"SHEETNAMELP", f:parse_SHEETNAMELP }, /*::[*/0xFFFF/*::]*/: { n:"" } }; var WK3Enum = { /*::[*/0x0000/*::]*/: { n:"BOF" }, /*::[*/0x0001/*::]*/: { n:"EOF" }, /*::[*/0x0002/*::]*/: { n:"PASSWORD" }, /*::[*/0x0003/*::]*/: { n:"CALCSET" }, /*::[*/0x0004/*::]*/: { n:"WINDOWSET" }, /*::[*/0x0005/*::]*/: { n:"SHEETCELLPTR" }, /*::[*/0x0006/*::]*/: { n:"SHEETLAYOUT" }, /*::[*/0x0007/*::]*/: { n:"COLUMNWIDTH" }, /*::[*/0x0008/*::]*/: { n:"HIDDENCOLUMN" }, /*::[*/0x0009/*::]*/: { n:"USERRANGE" }, /*::[*/0x000A/*::]*/: { n:"SYSTEMRANGE" }, /*::[*/0x000B/*::]*/: { n:"ZEROFORCE" }, /*::[*/0x000C/*::]*/: { n:"SORTKEYDIR" }, /*::[*/0x000D/*::]*/: { n:"FILESEAL" }, /*::[*/0x000E/*::]*/: { n:"DATAFILLNUMS" }, /*::[*/0x000F/*::]*/: { n:"PRINTMAIN" }, /*::[*/0x0010/*::]*/: { n:"PRINTSTRING" }, /*::[*/0x0011/*::]*/: { n:"GRAPHMAIN" }, /*::[*/0x0012/*::]*/: { n:"GRAPHSTRING" }, /*::[*/0x0013/*::]*/: { n:"??" }, /*::[*/0x0014/*::]*/: { n:"ERRCELL" }, /*::[*/0x0015/*::]*/: { n:"NACELL" }, /*::[*/0x0016/*::]*/: { n:"LABEL16", f:parse_LABEL_16}, /*::[*/0x0017/*::]*/: { n:"NUMBER17", f:parse_NUMBER_17 }, /*::[*/0x0018/*::]*/: { n:"NUMBER18", f:parse_NUMBER_18 }, /*::[*/0x0019/*::]*/: { n:"FORMULA19", f:parse_FORMULA_19}, /*::[*/0x001A/*::]*/: { n:"FORMULA1A" }, /*::[*/0x001B/*::]*/: { n:"XFORMAT", f:parse_XFORMAT }, /*::[*/0x001C/*::]*/: { n:"DTLABELMISC" }, /*::[*/0x001D/*::]*/: { n:"DTLABELCELL" }, /*::[*/0x001E/*::]*/: { n:"GRAPHWINDOW" }, /*::[*/0x001F/*::]*/: { n:"CPA" }, /*::[*/0x0020/*::]*/: { n:"LPLAUTO" }, /*::[*/0x0021/*::]*/: { n:"QUERY" }, /*::[*/0x0022/*::]*/: { n:"HIDDENSHEET" }, /*::[*/0x0023/*::]*/: { n:"??" }, /*::[*/0x0025/*::]*/: { n:"NUMBER25", f:parse_NUMBER_25 }, /*::[*/0x0026/*::]*/: { n:"??" }, /*::[*/0x0027/*::]*/: { n:"NUMBER27", f:parse_NUMBER_27 }, /*::[*/0x0028/*::]*/: { n:"FORMULA28", f:parse_FORMULA_28 }, /*::[*/0x008E/*::]*/: { n:"??" }, /*::[*/0x0093/*::]*/: { n:"??" }, /*::[*/0x0096/*::]*/: { n:"??" }, /*::[*/0x0097/*::]*/: { n:"??" }, /*::[*/0x0098/*::]*/: { n:"??" }, /*::[*/0x0099/*::]*/: { n:"??" }, /*::[*/0x009A/*::]*/: { n:"??" }, /*::[*/0x009B/*::]*/: { n:"??" }, /*::[*/0x009C/*::]*/: { n:"??" }, /*::[*/0x00A3/*::]*/: { n:"??" }, /*::[*/0x00AE/*::]*/: { n:"??" }, /*::[*/0x00AF/*::]*/: { n:"??" }, /*::[*/0x00B0/*::]*/: { n:"??" }, /*::[*/0x00B1/*::]*/: { n:"??" }, /*::[*/0x00B8/*::]*/: { n:"??" }, /*::[*/0x00B9/*::]*/: { n:"??" }, /*::[*/0x00BA/*::]*/: { n:"??" }, /*::[*/0x00BB/*::]*/: { n:"??" }, /*::[*/0x00BC/*::]*/: { n:"??" }, /*::[*/0x00C3/*::]*/: { n:"??" }, /*::[*/0x00C9/*::]*/: { n:"??" }, /*::[*/0x00CC/*::]*/: { n:"SHEETNAMECS", f:parse_SHEETNAMECS }, /*::[*/0x00CD/*::]*/: { n:"??" }, /*::[*/0x00CE/*::]*/: { n:"??" }, /*::[*/0x00CF/*::]*/: { n:"??" }, /*::[*/0x00D0/*::]*/: { n:"??" }, /*::[*/0x0100/*::]*/: { n:"??" }, /*::[*/0x0103/*::]*/: { n:"??" }, /*::[*/0x0104/*::]*/: { n:"??" }, /*::[*/0x0105/*::]*/: { n:"??" }, /*::[*/0x0106/*::]*/: { n:"??" }, /*::[*/0x0107/*::]*/: { n:"??" }, /*::[*/0x0109/*::]*/: { n:"??" }, /*::[*/0x010A/*::]*/: { n:"??" }, /*::[*/0x010B/*::]*/: { n:"??" }, /*::[*/0x010C/*::]*/: { n:"??" }, /*::[*/0x010E/*::]*/: { n:"??" }, /*::[*/0x010F/*::]*/: { n:"??" }, /*::[*/0x0180/*::]*/: { n:"??" }, /*::[*/0x0185/*::]*/: { n:"??" }, /*::[*/0x0186/*::]*/: { n:"??" }, /*::[*/0x0189/*::]*/: { n:"??" }, /*::[*/0x018C/*::]*/: { n:"??" }, /*::[*/0x0200/*::]*/: { n:"??" }, /*::[*/0x0202/*::]*/: { n:"??" }, /*::[*/0x0201/*::]*/: { n:"??" }, /*::[*/0x0204/*::]*/: { n:"??" }, /*::[*/0x0205/*::]*/: { n:"??" }, /*::[*/0x0280/*::]*/: { n:"??" }, /*::[*/0x0281/*::]*/: { n:"??" }, /*::[*/0x0282/*::]*/: { n:"??" }, /*::[*/0x0283/*::]*/: { n:"??" }, /*::[*/0x0284/*::]*/: { n:"??" }, /*::[*/0x0285/*::]*/: { n:"??" }, /*::[*/0x0286/*::]*/: { n:"??" }, /*::[*/0x0287/*::]*/: { n:"??" }, /*::[*/0x0288/*::]*/: { n:"??" }, /*::[*/0x0292/*::]*/: { n:"??" }, /*::[*/0x0293/*::]*/: { n:"??" }, /*::[*/0x0294/*::]*/: { n:"??" }, /*::[*/0x0295/*::]*/: { n:"??" }, /*::[*/0x0296/*::]*/: { n:"??" }, /*::[*/0x0299/*::]*/: { n:"??" }, /*::[*/0x029A/*::]*/: { n:"??" }, /*::[*/0x0300/*::]*/: { n:"??" }, /*::[*/0x0304/*::]*/: { n:"??" }, /*::[*/0x0601/*::]*/: { n:"SHEETINFOQP", f:parse_SHEETINFOQP }, /*::[*/0x0640/*::]*/: { n:"??" }, /*::[*/0x0642/*::]*/: { n:"??" }, /*::[*/0x0701/*::]*/: { n:"??" }, /*::[*/0x0702/*::]*/: { n:"??" }, /*::[*/0x0703/*::]*/: { n:"??" }, /*::[*/0x0704/*::]*/: { n:"??" }, /*::[*/0x0780/*::]*/: { n:"??" }, /*::[*/0x0800/*::]*/: { n:"??" }, /*::[*/0x0801/*::]*/: { n:"??" }, /*::[*/0x0804/*::]*/: { n:"??" }, /*::[*/0x0A80/*::]*/: { n:"??" }, /*::[*/0x2AF6/*::]*/: { n:"??" }, /*::[*/0x3231/*::]*/: { n:"??" }, /*::[*/0x6E49/*::]*/: { n:"??" }, /*::[*/0x6F44/*::]*/: { n:"??" }, /*::[*/0xFFFF/*::]*/: { n:"" } }; return { sheet_to_wk1: sheet_to_wk1, book_to_wk3: book_to_wk3, to_workbook: lotus_to_workbook }; })(); /* 18.4.7 rPr CT_RPrElt */ function parse_rpr(rpr) { var font = {}, m = rpr.match(tagregex), i = 0; var pass = false; if(m) for(;i!=m.length; ++i) { var y = parsexmltag(m[i]); switch(y[0].replace(/\w*:/g,"")) { /* 18.8.12 condense CT_BooleanProperty */ /* ** not required . */ case '': case '': font.shadow = 1; break; case '': break; /* 18.4.1 charset CT_IntProperty TODO */ case '': case '': font.outline = 1; break; case '': break; /* 18.4.5 rFont CT_FontName */ case '': case '': font.strike = 1; break; case '': break; /* 18.4.13 u CT_UnderlineProperty */ case '': case '': font.u = 1; break; case '': break; /* 18.8.2 b */ case '': case '': font.b = 1; break; case '': break; /* 18.8.26 i */ case '': case '': font.i = 1; break; case '': break; /* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */ case '': case '': case '': break; /* 18.8.18 family ST_FontFamily */ case '': case '': case '': break; /* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */ case '': case '': case '': break; /* 18.8.35 scheme CT_FontScheme TODO */ case '': case '': case '': break; /* 18.2.10 extLst CT_ExtensionList ? */ case '': case '': break; case '': pass = false; break; default: if(y[0].charCodeAt(1) !== 47 && !pass) throw new Error('Unrecognized rich format ' + y[0]); } } return font; } var parse_rs = /*#__PURE__*/(function() { var tregex = matchtag("t"), rpregex = matchtag("rPr"); /* 18.4.4 r CT_RElt */ function parse_r(r) { /* 18.4.12 t ST_Xstring */ var t = r.match(tregex)/*, cp = 65001*/; if(!t) return {t:"s", v:""}; var o/*:Cell*/ = ({t:'s', v:unescapexml(t[1])}/*:any*/); var rpr = r.match(rpregex); if(rpr) o.s = parse_rpr(rpr[1]); return o; } var rregex = /<(?:\w+:)?r>/g, rend = /<\/(?:\w+:)?r>/; return function parse_rs(rs) { return rs.replace(rregex,"").split(rend).map(parse_r).filter(function(r) { return r.v; }); }; })(); /* Parse a list of tags */ var rs_to_html = /*#__PURE__*/(function parse_rs_factory() { var nlregex = /(\r\n|\n)/g; function parse_rpr2(font, intro, outro) { var style/*:Array*/ = []; if(font.u) style.push("text-decoration: underline;"); if(font.uval) style.push("text-underline-style:" + font.uval + ";"); if(font.sz) style.push("font-size:" + font.sz + "pt;"); if(font.outline) style.push("text-effect: outline;"); if(font.shadow) style.push("text-shadow: auto;"); intro.push(''); if(font.b) { intro.push(""); outro.push(""); } if(font.i) { intro.push(""); outro.push(""); } if(font.strike) { intro.push(""); outro.push(""); } var align = font.valign || ""; if(align == "superscript" || align == "super") align = "sup"; else if(align == "subscript") align = "sub"; if(align != "") { intro.push("<" + align + ">"); outro.push(""); } outro.push(""); return font; } /* 18.4.4 r CT_RElt */ function r_to_html(r) { var terms/*:[Array, string, Array]*/ = [[],r.v,[]]; if(!r.v) return ""; if(r.s) parse_rpr2(r.s, terms[0], terms[2]); return terms[0].join("") + terms[1].replace(nlregex,'
') + terms[2].join(""); } return function parse_rs(rs) { return rs.map(r_to_html).join(""); }; })(); /* 18.4.8 si CT_Rst */ var sitregex = /<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g, sirregex = /<(?:\w+:)?r>/; var sirphregex = /<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g; function parse_si(x, opts) { var html = opts ? opts.cellHTML : true; var z = {}; if(!x) return { t: "" }; //var y; /* 18.4.12 t ST_Xstring (Plaintext String) */ // TODO: is whitespace actually valid here? if(x.match(/^\s*<(?:\w+:)?t[^>]*>/)) { z.t = unescapexml(utf8read(x.slice(x.indexOf(">")+1).split(/<\/(?:\w+:)?t>/)[0]||"")); z.r = utf8read(x); if(html) z.h = escapehtml(z.t); } /* 18.4.4 r CT_RElt (Rich Text Run) */ else if((/*y = */x.match(sirregex))) { z.r = utf8read(x); z.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex)||[]).join("").replace(tagregex,""))); if(html) z.h = rs_to_html(parse_rs(z.r)); } /* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */ /* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */ return z; } /* 18.4 Shared String Table */ var sstr0 = /<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/; var sstr1 = /<(?:\w+:)?(?:si|sstItem)>/g; var sstr2 = /<\/(?:\w+:)?(?:si|sstItem)>/; function parse_sst_xml(data/*:string*/, opts)/*:SST*/ { var s/*:SST*/ = ([]/*:any*/), ss = ""; if(!data) return s; /* 18.4.9 sst CT_Sst */ var sst = data.match(sstr0); if(sst) { ss = sst[2].replace(sstr1,"").split(sstr2); for(var i = 0; i != ss.length; ++i) { var o = parse_si(ss[i].trim(), opts); if(o != null) s[s.length] = o; } sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount; } return s; } var straywsregex = /^\s|\s$|[\t\n\r]/; function write_sst_xml(sst/*:SST*/, opts)/*:string*/ { if(!opts.bookSST) return ""; var o = [XML_HEADER]; o[o.length] = (writextag('sst', null, { xmlns: XMLNS_main[0], count: sst.Count, uniqueCount: sst.Unique })); for(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue; var s/*:XLString*/ = sst[i]; var sitag = ""; if(s.r) sitag += s.r; else { sitag += ""; } sitag += ""; o[o.length] = (sitag); } if(o.length>2){ o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* [MS-XLSB] 2.4.221 BrtBeginSst */ function parse_BrtBeginSst(data) { return [data.read_shift(4), data.read_shift(4)]; } /* [MS-XLSB] 2.1.7.45 Shared Strings */ function parse_sst_bin(data, opts)/*:SST*/ { var s/*:SST*/ = ([]/*:any*/); var pass = false; recordhopper(data, function hopper_sst(val, R, RT) { switch(RT) { case 0x009F: /* BrtBeginSst */ s.Count = val[0]; s.Unique = val[1]; break; case 0x0013: /* BrtSSTItem */ s.push(val); break; case 0x00A0: /* BrtEndSst */ return true; case 0x0023: /* BrtFRTBegin */ pass = true; break; case 0x0024: /* BrtFRTEnd */ pass = false; break; default: if(R.T){} if(!pass || opts.WTF) throw new Error("Unexpected record 0x" + RT.toString(16)); } }); return s; } function write_BrtBeginSst(sst, o) { if(!o) o = new_buf(8); o.write_shift(4, sst.Count); o.write_shift(4, sst.Unique); return o; } var write_BrtSSTItem = write_RichStr; function write_sst_bin(sst/*::, opts*/) { var ba = buf_array(); write_record(ba, 0x009F /* BrtBeginSst */, write_BrtBeginSst(sst)); for(var i = 0; i < sst.length; ++i) write_record(ba, 0x0013 /* BrtSSTItem */, write_BrtSSTItem(sst[i])); /* FRTSST */ write_record(ba, 0x00A0 /* BrtEndSst */); return ba.end(); } function _JS2ANSI(str/*:string*/)/*:Array*/ { if(typeof $cptable !== 'undefined') return $cptable.utils.encode(current_ansi, str); var o/*:Array*/ = [], oo = str.split(""); for(var i = 0; i < oo.length; ++i) o[i] = oo[i].charCodeAt(0); return o; } /* [MS-OFFCRYPTO] 2.1.4 Version */ function parse_CRYPTOVersion(blob, length/*:?number*/) { var o/*:any*/ = {}; o.Major = blob.read_shift(2); o.Minor = blob.read_shift(2); /*:: if(length == null) return o; */ if(length >= 4) blob.l += length - 4; return o; } /* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */ function parse_DataSpaceVersionInfo(blob) { var o = {}; o.id = blob.read_shift(0, 'lpp4'); o.R = parse_CRYPTOVersion(blob, 4); o.U = parse_CRYPTOVersion(blob, 4); o.W = parse_CRYPTOVersion(blob, 4); return o; } /* [MS-OFFCRYPTO] 2.1.6.1 DataSpaceMapEntry Structure */ function parse_DataSpaceMapEntry(blob) { var len = blob.read_shift(4); var end = blob.l + len - 4; var o = {}; var cnt = blob.read_shift(4); var comps/*:Array<{t:number, v:string}>*/ = []; /* [MS-OFFCRYPTO] 2.1.6.2 DataSpaceReferenceComponent Structure */ while(cnt-- > 0) comps.push({ t: blob.read_shift(4), v: blob.read_shift(0, 'lpp4') }); o.name = blob.read_shift(0, 'lpp4'); o.comps = comps; if(blob.l != end) throw new Error("Bad DataSpaceMapEntry: " + blob.l + " != " + end); return o; } /* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */ function parse_DataSpaceMap(blob) { var o = []; blob.l += 4; // must be 0x8 var cnt = blob.read_shift(4); while(cnt-- > 0) o.push(parse_DataSpaceMapEntry(blob)); return o; } /* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */ function parse_DataSpaceDefinition(blob)/*:Array*/ { var o/*:Array*/ = []; blob.l += 4; // must be 0x8 var cnt = blob.read_shift(4); while(cnt-- > 0) o.push(blob.read_shift(0, 'lpp4')); return o; } /* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */ function parse_TransformInfoHeader(blob) { var o = {}; /*var len = */blob.read_shift(4); blob.l += 4; // must be 0x1 o.id = blob.read_shift(0, 'lpp4'); o.name = blob.read_shift(0, 'lpp4'); o.R = parse_CRYPTOVersion(blob, 4); o.U = parse_CRYPTOVersion(blob, 4); o.W = parse_CRYPTOVersion(blob, 4); return o; } function parse_Primary(blob) { /* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */ var hdr = parse_TransformInfoHeader(blob); /* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */ hdr.ename = blob.read_shift(0, '8lpp4'); hdr.blksz = blob.read_shift(4); hdr.cmode = blob.read_shift(4); if(blob.read_shift(4) != 0x04) throw new Error("Bad !Primary record"); return hdr; } /* [MS-OFFCRYPTO] 2.3.2 Encryption Header */ function parse_EncryptionHeader(blob, length/*:number*/) { var tgt = blob.l + length; var o = {}; o.Flags = (blob.read_shift(4) & 0x3F); blob.l += 4; o.AlgID = blob.read_shift(4); var valid = false; switch(o.AlgID) { case 0x660E: case 0x660F: case 0x6610: valid = (o.Flags == 0x24); break; case 0x6801: valid = (o.Flags == 0x04); break; case 0: valid = (o.Flags == 0x10 || o.Flags == 0x04 || o.Flags == 0x24); break; default: throw 'Unrecognized encryption algorithm: ' + o.AlgID; } if(!valid) throw new Error("Encryption Flags/AlgID mismatch"); o.AlgIDHash = blob.read_shift(4); o.KeySize = blob.read_shift(4); o.ProviderType = blob.read_shift(4); blob.l += 8; o.CSPName = blob.read_shift((tgt-blob.l)>>1, 'utf16le'); blob.l = tgt; return o; } /* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */ function parse_EncryptionVerifier(blob, length/*:number*/) { var o = {}, tgt = blob.l + length; blob.l += 4; // SaltSize must be 0x10 o.Salt = blob.slice(blob.l, blob.l+16); blob.l += 16; o.Verifier = blob.slice(blob.l, blob.l+16); blob.l += 16; /*var sz = */blob.read_shift(4); o.VerifierHash = blob.slice(blob.l, tgt); blob.l = tgt; return o; } /* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */ function parse_EncryptionInfo(blob) { var vers = parse_CRYPTOVersion(blob); switch(vers.Minor) { case 0x02: return [vers.Minor, parse_EncInfoStd(blob, vers)]; case 0x03: return [vers.Minor, parse_EncInfoExt(blob, vers)]; case 0x04: return [vers.Minor, parse_EncInfoAgl(blob, vers)]; } throw new Error("ECMA-376 Encrypted file unrecognized Version: " + vers.Minor); } /* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */ function parse_EncInfoStd(blob/*::, vers*/) { var flags = blob.read_shift(4); if((flags & 0x3F) != 0x24) throw new Error("EncryptionInfo mismatch"); var sz = blob.read_shift(4); //var tgt = blob.l + sz; var hdr = parse_EncryptionHeader(blob, sz); var verifier = parse_EncryptionVerifier(blob, blob.length - blob.l); return { t:"Std", h:hdr, v:verifier }; } /* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */ function parse_EncInfoExt(/*::blob, vers*/) { throw new Error("File is password-protected: ECMA-376 Extensible"); } /* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */ function parse_EncInfoAgl(blob/*::, vers*/) { var KeyData = ["saltSize","blockSize","keyBits","hashSize","cipherAlgorithm","cipherChaining","hashAlgorithm","saltValue"]; blob.l+=4; var xml = blob.read_shift(blob.length - blob.l, 'utf8'); var o = {}; xml.replace(tagregex, function xml_agile(x) { var y/*:any*/ = parsexmltag(x); switch(strip_ns(y[0])) { case '': break; case '': case '': break; case '': break; case ' 4 || vers.Major < 2) throw new Error('unrecognized major version code: ' + vers.Major); o.Flags = blob.read_shift(4); length -= 4; var sz = blob.read_shift(4); length -= 4; o.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz; o.EncryptionVerifier = parse_EncryptionVerifier(blob, length); return o; } /* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */ function parse_RC4Header(blob/*::, length*/) { var o = {}; var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4); if(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor; o.Salt = blob.read_shift(16); o.EncryptedVerifier = blob.read_shift(16); o.EncryptedVerifierHash = blob.read_shift(16); return o; } /* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */ function crypto_CreatePasswordVerifier_Method1(Password/*:string*/) { var Verifier = 0x0000, PasswordArray; var PasswordDecoded = _JS2ANSI(Password); var len = PasswordDecoded.length + 1, i, PasswordByte; var Intermediate1, Intermediate2, Intermediate3; PasswordArray = new_raw_buf(len); PasswordArray[0] = PasswordDecoded.length; for(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1]; for(i = len-1; i >= 0; --i) { PasswordByte = PasswordArray[i]; Intermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1; Intermediate2 = (Verifier << 1) & 0x7FFF; Intermediate3 = Intermediate1 | Intermediate2; Verifier = Intermediate3 ^ PasswordByte; } return Verifier ^ 0xCE4B; } /* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */ var crypto_CreateXorArray_Method1 = /*#__PURE__*/(function() { var PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00]; var InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3]; var XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4]; var Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; }; var XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); }; var CreateXorKey_Method1 = function(Password) { var XorKey = InitialCode[Password.length - 1]; var CurrentElement = 0x68; for(var i = Password.length-1; i >= 0; --i) { var Char = Password[i]; for(var j = 0; j != 7; ++j) { if(Char & 0x40) XorKey ^= XorMatrix[CurrentElement]; Char *= 2; --CurrentElement; } } return XorKey; }; return function(password/*:string*/) { var Password = _JS2ANSI(password); var XorKey = CreateXorKey_Method1(Password); var Index = Password.length; var ObfuscationArray = new_raw_buf(16); for(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00; var Temp, PasswordLastChar, PadIndex; if((Index & 1) === 1) { Temp = XorKey >> 8; ObfuscationArray[Index] = XorRor(PadArray[0], Temp); --Index; Temp = XorKey & 0xFF; PasswordLastChar = Password[Password.length - 1]; ObfuscationArray[Index] = XorRor(PasswordLastChar, Temp); } while(Index > 0) { --Index; Temp = XorKey >> 8; ObfuscationArray[Index] = XorRor(Password[Index], Temp); --Index; Temp = XorKey & 0xFF; ObfuscationArray[Index] = XorRor(Password[Index], Temp); } Index = 15; PadIndex = 15 - Password.length; while(PadIndex > 0) { Temp = XorKey >> 8; ObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp); --Index; --PadIndex; Temp = XorKey & 0xFF; ObfuscationArray[Index] = XorRor(Password[Index], Temp); --Index; --PadIndex; } return ObfuscationArray; }; })(); /* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */ var crypto_DecryptData_Method1 = function(password/*:string*/, Data, XorArrayIndex, XorArray, O) { /* If XorArray is set, use it; if O is not set, make changes in-place */ if(!O) O = Data; if(!XorArray) XorArray = crypto_CreateXorArray_Method1(password); var Index, Value; for(Index = 0; Index != Data.length; ++Index) { Value = Data[Index]; Value ^= XorArray[XorArrayIndex]; Value = ((Value>>5) | (Value<<3)) & 0xFF; O[Index] = Value; ++XorArrayIndex; } return [O, XorArrayIndex, XorArray]; }; var crypto_MakeXorDecryptor = function(password/*:string*/) { var XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password); return function(Data) { var O = crypto_DecryptData_Method1("", Data, XorArrayIndex, XorArray); XorArrayIndex = O[1]; return O[0]; }; }; /* 2.5.343 */ function parse_XORObfuscation(blob, length, opts, out) { var o = ({ key: parseuint16(blob), verificationBytes: parseuint16(blob) }/*:any*/); if(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password); out.valid = o.verificationBytes === o.verifier; if(out.valid) out.insitu = crypto_MakeXorDecryptor(opts.password); return o; } /* 2.4.117 */ function parse_FilePassHeader(blob, length/*:number*/, oo) { var o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2; if(o.Info === 1) o.Data = parse_RC4Header(blob, length); else o.Data = parse_RC4CryptoHeader(blob, length); return o; } function parse_FilePass(blob, length/*:number*/, opts) { var o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }/*:any*/); /* wEncryptionType */ if(o.Type) parse_FilePassHeader(blob, length-2, o); else parse_XORObfuscation(blob, opts.biff >= 8 ? length : length - 2, opts, o); return o; } var RTF = /*#__PURE__*/(function() { function rtf_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { switch(opts.type) { case 'base64': return rtf_to_sheet_str(Base64_decode(d), opts); case 'binary': return rtf_to_sheet_str(d, opts); case 'buffer': return rtf_to_sheet_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts); case 'array': return rtf_to_sheet_str(cc2str(d), opts); } throw new Error("Unrecognized type " + opts.type); } /* TODO: this is a stub */ function rtf_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ { var o = opts || {}; var ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/); var rows = str.match(/\\trowd.*?\\row\b/g); if(!rows.length) throw new Error("RTF missing table"); var range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:rows.length - 1}}/*:any*/); rows.forEach(function(rowtf, R) { if(Array.isArray(ws)) ws[R] = []; var rtfre = /\\\w+\b/g; var last_index = 0; var res; var C = -1; while((res = rtfre.exec(rowtf))) { switch(res[0]) { case "\\cell": var data = rowtf.slice(last_index, rtfre.lastIndex - res[0].length); if(data[0] == " ") data = data.slice(1); ++C; if(data.length) { // TODO: value parsing, including codepage adjustments var cell = {v: data, t:"s"}; if(Array.isArray(ws)) ws[R][C] = cell; else ws[encode_cell({r:R, c:C})] = cell; } break; } last_index = rtfre.lastIndex; } if(C > range.e.c) range.e.c = C; }); ws['!ref'] = encode_range(range); return ws; } function rtf_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); } /* TODO: this is a stub */ function sheet_to_rtf(ws/*:Worksheet*//*::, opts*/)/*:string*/ { var o = ["{\\rtf1\\ansi"]; var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; var dense = Array.isArray(ws); for(var R = r.s.r; R <= r.e.r; ++R) { o.push("\\trowd\\trautofit1"); for(var C = r.s.c; C <= r.e.c; ++C) o.push("\\cellx" + (C+1)); o.push("\\pard\\intbl"); for(C = r.s.c; C <= r.e.c; ++C) { var coord = encode_cell({r:R,c:C}); cell = dense ? (ws[R]||[])[C]: ws[coord]; if(!cell || cell.v == null && (!cell.f || cell.F)) continue; o.push(" " + (cell.w || (format_cell(cell), cell.w))); o.push("\\cell"); } o.push("\\pard\\intbl\\row"); } return o.join("") + "}"; } return { to_workbook: rtf_to_workbook, to_sheet: rtf_to_sheet, from_sheet: sheet_to_rtf }; })(); function hex2RGB(h) { var o = h.slice(h[0]==="#"?1:0).slice(0,6); return [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)]; } function rgb2Hex(rgb) { for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]); return o.toString(16).toUpperCase().slice(1); } function rgb2HSL(rgb) { var R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255; var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m; if(C === 0) return [0, 0, R]; var H6 = 0, S = 0, L2 = (M + m); S = C / (L2 > 1 ? 2 - L2 : L2); switch(M){ case R: H6 = ((G - B) / C + 6)%6; break; case G: H6 = ((B - R) / C + 2); break; case B: H6 = ((R - G) / C + 4); break; } return [H6 / 6, S, L2 / 2]; } function hsl2RGB(hsl){ var H = hsl[0], S = hsl[1], L = hsl[2]; var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2; var rgb = [m,m,m], h6 = 6*H; var X; if(S !== 0) switch(h6|0) { case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break; case 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break; case 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break; case 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break; case 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break; case 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break; } for(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255); return rgb; } /* 18.8.3 bgColor tint algorithm */ function rgb_tint(hex, tint) { if(tint === 0) return hex; var hsl = rgb2HSL(hex2RGB(hex)); if (tint < 0) hsl[2] = hsl[2] * (1 + tint); else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint); return rgb2Hex(hsl2RGB(hsl)); } /* 18.3.1.13 width calculations */ /* [MS-OI29500] 2.1.595 Column Width & Formatting */ var DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW; function width2px(width) { return Math.floor(( width + (Math.round(128/MDW))/256 )* MDW ); } function px2char(px) { return (Math.floor((px - 5)/MDW * 100 + 0.5))/100; } function char2width(chr) { return (Math.round((chr * MDW + 5)/MDW*256))/256; } //function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; } //function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; } function cycle_width(collw) { return char2width(px2char(width2px(collw))); } /* XLSX/XLSB/XLS specify width in units of MDW */ function find_mdw_colw(collw) { var delta = Math.abs(collw - cycle_width(collw)), _MDW = MDW; if(delta > 0.005) for(MDW=MIN_MDW; MDW 0.5) guess--; if(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; } } MDW = _MDW; }*/ function process_col(coll/*:ColInfo*/) { if(coll.width) { coll.wpx = width2px(coll.width); coll.wch = px2char(coll.wpx); coll.MDW = MDW; } else if(coll.wpx) { coll.wch = px2char(coll.wpx); coll.width = char2width(coll.wch); coll.MDW = MDW; } else if(typeof coll.wch == 'number') { coll.width = char2width(coll.wch); coll.wpx = width2px(coll.width); coll.MDW = MDW; } if(coll.customWidth) delete coll.customWidth; } var DEF_PPI = 96, PPI = DEF_PPI; function px2pt(px) { return px * 96 / PPI; } function pt2px(pt) { return pt * PPI / 96; } /* [MS-EXSPXML3] 2.4.54 ST_enmPattern */ var XLMLPatternTypeMap = { "None": "none", "Solid": "solid", "Gray50": "mediumGray", "Gray75": "darkGray", "Gray25": "lightGray", "HorzStripe": "darkHorizontal", "VertStripe": "darkVertical", "ReverseDiagStripe": "darkDown", "DiagStripe": "darkUp", "DiagCross": "darkGrid", "ThickDiagCross": "darkTrellis", "ThinHorzStripe": "lightHorizontal", "ThinVertStripe": "lightVertical", "ThinReverseDiagStripe": "lightDown", "ThinHorzCross": "lightGrid" }; /* 18.8.5 borders CT_Borders */ function parse_borders(t, styles, themes, opts) { styles.Borders = []; var border = {}; var pass = false; (t[0].match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x); switch(strip_ns(y[0])) { case '': case '': break; /* 18.8.4 border CT_Border */ case '': case '': border = /*::(*/{}/*:: :any)*/; if(y.diagonalUp) border.diagonalUp = parsexmlbool(y.diagonalUp); if(y.diagonalDown) border.diagonalDown = parsexmlbool(y.diagonalDown); styles.Borders.push(border); break; case '': break; /* note: not in spec, appears to be CT_BorderPr */ case '': break; case '': break; case '': break; /* note: not in spec, appears to be CT_BorderPr */ case '': break; case '': break; case '': break; /* 18.8.43 top CT_BorderPr */ case '': break; case '': break; case '': break; /* 18.8.6 bottom CT_BorderPr */ case '': break; case '': break; case '': break; /* 18.8.13 diagonal CT_BorderPr */ case '': case '': break; case '': break; /* 18.8.25 horizontal CT_BorderPr */ case '': case '': break; case '': break; /* 18.8.44 vertical CT_BorderPr */ case '': case '': break; case '': break; /* 18.8.37 start CT_BorderPr */ case '': case '': break; case '': break; /* 18.8.16 end CT_BorderPr */ case '': case '': break; case '': break; /* 18.8.? color CT_Color */ case '': break; case '': case '': break; /* 18.2.10 extLst CT_ExtensionList ? */ case '': case '': break; case '': pass = false; break; default: if(opts && opts.WTF) { if(!pass) throw new Error('unrecognized ' + y[0] + ' in borders'); } } }); } /* 18.8.21 fills CT_Fills */ function parse_fills(t, styles, themes, opts) { styles.Fills = []; var fill = {}; var pass = false; (t[0].match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x); switch(strip_ns(y[0])) { case '': case '': break; /* 18.8.20 fill CT_Fill */ case '': case '': fill = {}; styles.Fills.push(fill); break; case '': break; /* 18.8.24 gradientFill CT_GradientFill */ case '': break; case '': styles.Fills.push(fill); fill = {}; break; /* 18.8.32 patternFill CT_PatternFill */ case '': if(y.patternType) fill.patternType = y.patternType; break; case '': case '': break; /* 18.8.3 bgColor CT_Color */ case '': case '': break; /* 18.8.19 fgColor CT_Color */ case '': case '': break; /* 18.8.38 stop CT_GradientStop */ case '': break; case '': break; /* 18.8.? color CT_Color */ case '': break; case '': break; /* 18.2.10 extLst CT_ExtensionList ? */ case '': case '': break; case '': pass = false; break; default: if(opts && opts.WTF) { if(!pass) throw new Error('unrecognized ' + y[0] + ' in fills'); } } }); } /* 18.8.23 fonts CT_Fonts */ function parse_fonts(t, styles, themes, opts) { styles.Fonts = []; var font = {}; var pass = false; (t[0].match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x); switch(strip_ns(y[0])) { case '': case '': break; /* 18.8.22 font CT_Font */ case '': break; case '': case '': styles.Fonts.push(font); font = {}; break; /* 18.8.29 name CT_FontName */ case '': case '': break; /* 18.8.2 b CT_BooleanProperty */ case '': font.bold = 1; break; /* 18.8.26 i CT_BooleanProperty */ case '': font.italic = 1; break; /* 18.4.13 u CT_UnderlineProperty */ case '': font.underline = 1; break; /* 18.4.10 strike CT_BooleanProperty */ case '': font.strike = 1; break; /* 18.4.2 outline CT_BooleanProperty */ case '': font.outline = 1; break; /* 18.8.36 shadow CT_BooleanProperty */ case '': font.shadow = 1; break; /* 18.8.12 condense CT_BooleanProperty */ case '': font.condense = 1; break; /* 18.8.17 extend CT_BooleanProperty */ case '': font.extend = 1; break; /* 18.4.11 sz CT_FontSize */ case '': case '': break; /* 18.4.14 vertAlign CT_VerticalAlignFontProperty */ case '': case '': break; /* 18.8.18 family CT_FontFamily */ case '': case '': break; /* 18.8.35 scheme CT_FontScheme */ case '': case '': break; /* 18.4.1 charset CT_IntProperty */ case '': case '': break; /* note: sometimes mc:AlternateContent appears bare */ case '': pass = false; break; /* 18.2.10 extLst CT_ExtensionList ? */ case '': case '': break; case '': pass = false; break; default: if(opts && opts.WTF) { if(!pass) throw new Error('unrecognized ' + y[0] + ' in fonts'); } } }); } /* 18.8.31 numFmts CT_NumFmts */ function parse_numFmts(t, styles, opts) { styles.NumberFmt = []; var k/*Array*/ = (keys(table_fmt)/*:any*/); for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = table_fmt[k[i]]; var m = t[0].match(tagregex); if(!m) return; for(i=0; i < m.length; ++i) { var y = parsexmltag(m[i]); switch(strip_ns(y[0])) { case '': case '': case '': break; case '0) { if(j > 0x188) { for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break; styles.NumberFmt[j] = f; } SSF_load(f,j); } } break; case '': break; default: if(opts.WTF) throw new Error('unrecognized ' + y[0] + ' in numFmts'); } } } function write_numFmts(NF/*:{[n:number|string]:string}*//*::, opts*/) { var o = [""]; [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) { for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])})); }); if(o.length === 1) return ""; o[o.length] = (""); o[0] = writextag('numFmts', null, { count:o.length-2 }).replace("/>", ">"); return o.join(""); } /* 18.8.10 cellXfs CT_CellXfs */ var cellXF_uint = [ "numFmtId", "fillId", "fontId", "borderId", "xfId" ]; var cellXF_bool = [ "applyAlignment", "applyBorder", "applyFill", "applyFont", "applyNumberFormat", "applyProtection", "pivotButton", "quotePrefix" ]; function parse_cellXfs(t, styles, opts) { styles.CellXf = []; var xf; var pass = false; (t[0].match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x), i = 0; switch(strip_ns(y[0])) { case '': case '': case '': break; /* 18.8.45 xf CT_Xf */ case '': xf = y; delete xf[0]; for(i = 0; i < cellXF_uint.length; ++i) if(xf[cellXF_uint[i]]) xf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10); for(i = 0; i < cellXF_bool.length; ++i) if(xf[cellXF_bool[i]]) xf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]); if(styles.NumberFmt && xf.numFmtId > 0x188) { for(i = 0x188; i > 0x3c; --i) if(styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) { xf.numFmtId = i; break; } } styles.CellXf.push(xf); break; case '': break; /* 18.8.1 alignment CT_CellAlignment */ case '': var alignment = {}; if(y.vertical) alignment.vertical = y.vertical; if(y.horizontal) alignment.horizontal = y.horizontal; if(y.textRotation != null) alignment.textRotation = y.textRotation; if(y.indent) alignment.indent = y.indent; if(y.wrapText) alignment.wrapText = parsexmlbool(y.wrapText); xf.alignment = alignment; break; case '': break; /* 18.8.33 protection CT_CellProtection */ case '': case '': break; /* note: sometimes mc:AlternateContent appears bare */ case '': pass = false; break; /* 18.2.10 extLst CT_ExtensionList ? */ case '': case '': break; case '': pass = false; break; default: if(opts && opts.WTF) { if(!pass) throw new Error('unrecognized ' + y[0] + ' in cellXfs'); } } }); } function write_cellXfs(cellXfs)/*:string*/ { var o/*:Array*/ = []; o[o.length] = (writextag('cellXfs',null)); cellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); }); o[o.length] = (""); if(o.length === 2) return ""; o[0] = writextag('cellXfs',null, {count:o.length-2}).replace("/>",">"); return o.join(""); } /* 18.8 Styles CT_Stylesheet*/ var parse_sty_xml= /*#__PURE__*/(function make_pstyx() { var numFmtRegex = /<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/; var cellXfRegex = /<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/; var fillsRegex = /<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/; var fontsRegex = /<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/; var bordersRegex = /<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/; return function parse_sty_xml(data, themes, opts) { var styles = {}; if(!data) return styles; data = data.replace(//mg,"").replace(//gm,""); /* 18.8.39 styleSheet CT_Stylesheet */ var t; /* 18.8.31 numFmts CT_NumFmts ? */ if((t=data.match(numFmtRegex))) parse_numFmts(t, styles, opts); /* 18.8.23 fonts CT_Fonts ? */ if((t=data.match(fontsRegex))) parse_fonts(t, styles, themes, opts); /* 18.8.21 fills CT_Fills ? */ if((t=data.match(fillsRegex))) parse_fills(t, styles, themes, opts); /* 18.8.5 borders CT_Borders ? */ if((t=data.match(bordersRegex))) parse_borders(t, styles, themes, opts); /* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */ /* 18.8.8 cellStyles CT_CellStyles ? */ /* 18.8.10 cellXfs CT_CellXfs ? */ if((t=data.match(cellXfRegex))) parse_cellXfs(t, styles, opts); /* 18.8.15 dxfs CT_Dxfs ? */ /* 18.8.42 tableStyles CT_TableStyles ? */ /* 18.8.11 colors CT_Colors ? */ /* 18.2.10 extLst CT_ExtensionList ? */ return styles; }; })(); function write_sty_xml(wb/*:Workbook*/, opts)/*:string*/ { var o = [XML_HEADER, writextag('styleSheet', null, { 'xmlns': XMLNS_main[0], 'xmlns:vt': XMLNS.vt })], w; if(wb.SSF && (w = write_numFmts(wb.SSF)) != null) o[o.length] = w; o[o.length] = (''); o[o.length] = (''); o[o.length] = (''); o[o.length] = (''); if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w); o[o.length] = (''); o[o.length] = (''); o[o.length] = (''); if(o.length>2){ o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* [MS-XLSB] 2.4.657 BrtFmt */ function parse_BrtFmt(data, length/*:number*/) { var numFmtId = data.read_shift(2); var stFmtCode = parse_XLWideString(data,length-2); return [numFmtId, stFmtCode]; } function write_BrtFmt(i/*:number*/, f/*:string*/, o) { if(!o) o = new_buf(6 + 4 * f.length); o.write_shift(2, i); write_XLWideString(f, o); var out = (o.length > o.l) ? o.slice(0, o.l) : o; if(o.l == null) o.l = o.length; return out; } /* [MS-XLSB] 2.4.659 BrtFont TODO */ function parse_BrtFont(data, length/*:number*/, opts) { var out = ({}/*:any*/); out.sz = data.read_shift(2) / 20; var grbit = parse_FontFlags(data, 2, opts); if(grbit.fItalic) out.italic = 1; if(grbit.fCondense) out.condense = 1; if(grbit.fExtend) out.extend = 1; if(grbit.fShadow) out.shadow = 1; if(grbit.fOutline) out.outline = 1; if(grbit.fStrikeout) out.strike = 1; var bls = data.read_shift(2); if(bls === 0x02BC) out.bold = 1; switch(data.read_shift(2)) { /* case 0: out.vertAlign = "baseline"; break; */ case 1: out.vertAlign = "superscript"; break; case 2: out.vertAlign = "subscript"; break; } var underline = data.read_shift(1); if(underline != 0) out.underline = underline; var family = data.read_shift(1); if(family > 0) out.family = family; var bCharSet = data.read_shift(1); if(bCharSet > 0) out.charset = bCharSet; data.l++; out.color = parse_BrtColor(data, 8); switch(data.read_shift(1)) { /* case 0: out.scheme = "none": break; */ case 1: out.scheme = "major"; break; case 2: out.scheme = "minor"; break; } out.name = parse_XLWideString(data, length - 21); return out; } function write_BrtFont(font/*:any*/, o) { if(!o) o = new_buf(25+4*32); o.write_shift(2, font.sz * 20); write_FontFlags(font, o); o.write_shift(2, font.bold ? 0x02BC : 0x0190); var sss = 0; if(font.vertAlign == "superscript") sss = 1; else if(font.vertAlign == "subscript") sss = 2; o.write_shift(2, sss); o.write_shift(1, font.underline || 0); o.write_shift(1, font.family || 0); o.write_shift(1, font.charset || 0); o.write_shift(1, 0); write_BrtColor(font.color, o); var scheme = 0; if(font.scheme == "major") scheme = 1; if(font.scheme == "minor") scheme = 2; o.write_shift(1, scheme); write_XLWideString(font.name, o); return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.650 BrtFill */ var XLSBFillPTNames = [ "none", "solid", "mediumGray", "darkGray", "lightGray", "darkHorizontal", "darkVertical", "darkDown", "darkUp", "darkGrid", "darkTrellis", "lightHorizontal", "lightVertical", "lightDown", "lightUp", "lightGrid", "lightTrellis", "gray125", "gray0625" ]; var rev_XLSBFillPTNames/*:EvertNumType*/; /* TODO: gradient fill representation */ var parse_BrtFill = parsenoop; function write_BrtFill(fill, o) { if(!o) o = new_buf(4*3 + 8*7 + 16*1); if(!rev_XLSBFillPTNames) rev_XLSBFillPTNames = (evert(XLSBFillPTNames)/*:any*/); var fls/*:number*/ = rev_XLSBFillPTNames[fill.patternType]; if(fls == null) fls = 0x28; o.write_shift(4, fls); var j = 0; if(fls != 0x28) { /* TODO: custom FG Color */ write_BrtColor({auto:1}, o); /* TODO: custom BG Color */ write_BrtColor({auto:1}, o); for(; j < 12; ++j) o.write_shift(4, 0); } else { for(; j < 4; ++j) o.write_shift(4, 0); for(; j < 12; ++j) o.write_shift(4, 0); /* TODO */ /* iGradientType */ /* xnumDegree */ /* xnumFillToLeft */ /* xnumFillToRight */ /* xnumFillToTop */ /* xnumFillToBottom */ /* cNumStop */ /* xfillGradientStop */ } return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.824 BrtXF */ function parse_BrtXF(data, length/*:number*/) { var tgt = data.l + length; var ixfeParent = data.read_shift(2); var ifmt = data.read_shift(2); data.l = tgt; return {ixfe:ixfeParent, numFmtId:ifmt }; } function write_BrtXF(data, ixfeP, o) { if(!o) o = new_buf(16); o.write_shift(2, ixfeP||0); o.write_shift(2, data.numFmtId||0); o.write_shift(2, 0); /* iFont */ o.write_shift(2, 0); /* iFill */ o.write_shift(2, 0); /* ixBorder */ o.write_shift(1, 0); /* trot */ o.write_shift(1, 0); /* indent */ var flow = 0; o.write_shift(1, flow); /* flags */ o.write_shift(1, 0); /* flags */ o.write_shift(1, 0); /* xfGrbitAtr */ o.write_shift(1, 0); return o; } /* [MS-XLSB] 2.5.4 Blxf TODO */ function write_Blxf(data, o) { if(!o) o = new_buf(10); o.write_shift(1, 0); /* dg */ o.write_shift(1, 0); o.write_shift(4, 0); /* color */ o.write_shift(4, 0); /* color */ return o; } /* [MS-XLSB] 2.4.302 BrtBorder TODO */ var parse_BrtBorder = parsenoop; function write_BrtBorder(border, o) { if(!o) o = new_buf(51); o.write_shift(1, 0); /* diagonal */ write_Blxf(null, o); /* top */ write_Blxf(null, o); /* bottom */ write_Blxf(null, o); /* left */ write_Blxf(null, o); /* right */ write_Blxf(null, o); /* diag */ return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.763 BrtStyle TODO */ function write_BrtStyle(style, o) { if(!o) o = new_buf(12+4*10); o.write_shift(4, style.xfId); o.write_shift(2, 1); o.write_shift(1, +style.builtinId); o.write_shift(1, 0); /* iLevel */ write_XLNullableWideString(style.name || "", o); return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.272 BrtBeginTableStyles */ function write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) { var o = new_buf(4+256*2*4); o.write_shift(4, cnt); write_XLNullableWideString(defTableStyle, o); write_XLNullableWideString(defPivotStyle, o); return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.1.7.50 Styles */ function parse_sty_bin(data, themes, opts) { var styles = {}; styles.NumberFmt = ([]/*:any*/); for(var y in table_fmt) styles.NumberFmt[y] = table_fmt[y]; styles.CellXf = []; styles.Fonts = []; var state/*:Array*/ = []; var pass = false; recordhopper(data, function hopper_sty(val, R, RT) { switch(RT) { case 0x002C: /* BrtFmt */ styles.NumberFmt[val[0]] = val[1]; SSF_load(val[1], val[0]); break; case 0x002B: /* BrtFont */ styles.Fonts.push(val); if(val.color.theme != null && themes && themes.themeElements && themes.themeElements.clrScheme) { val.color.rgb = rgb_tint(themes.themeElements.clrScheme[val.color.theme].rgb, val.color.tint || 0); } break; case 0x0401: /* BrtKnownFonts */ break; case 0x002D: /* BrtFill */ break; case 0x002E: /* BrtBorder */ break; case 0x002F: /* BrtXF */ if(state[state.length - 1] == 0x0269 /* BrtBeginCellXFs */) { styles.CellXf.push(val); } break; case 0x0030: /* BrtStyle */ case 0x01FB: /* BrtDXF */ case 0x023C: /* BrtMRUColor */ case 0x01DB: /* BrtIndexedColor */ break; case 0x0493: /* BrtDXF14 */ case 0x0836: /* BrtDXF15 */ case 0x046A: /* BrtSlicerStyleElement */ case 0x0200: /* BrtTableStyleElement */ case 0x082F: /* BrtTimelineStyleElement */ case 0x0C00: /* BrtUid */ break; case 0x0023: /* BrtFRTBegin */ pass = true; break; case 0x0024: /* BrtFRTEnd */ pass = false; break; case 0x0025: /* BrtACBegin */ state.push(RT); pass = true; break; case 0x0026: /* BrtACEnd */ state.pop(); pass = false; break; default: if(R.T > 0) state.push(RT); else if(R.T < 0) state.pop(); else if(!pass || (opts.WTF && state[state.length-1] != 0x0025 /* BrtACBegin */)) throw new Error("Unexpected record 0x" + RT.toString(16)); } }); return styles; } function write_FMTS_bin(ba, NF/*:?SSFTable*/) { if(!NF) return; var cnt = 0; [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) { /*:: if(!NF) return; */ for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) ++cnt; }); if(cnt == 0) return; write_record(ba, 0x0267 /* BrtBeginFmts */, write_UInt32LE(cnt)); [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) { /*:: if(!NF) return; */ for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_record(ba, 0x002C /* BrtFmt */, write_BrtFmt(i, NF[i])); }); write_record(ba, 0x0268 /* BrtEndFmts */); } function write_FONTS_bin(ba/*::, data*/) { var cnt = 1; if(cnt == 0) return; write_record(ba, 0x0263 /* BrtBeginFonts */, write_UInt32LE(cnt)); write_record(ba, 0x002B /* BrtFont */, write_BrtFont({ sz:12, color: {theme:1}, name: "Calibri", family: 2, scheme: "minor" })); /* 1*65491BrtFont [ACFONTS] */ write_record(ba, 0x0264 /* BrtEndFonts */); } function write_FILLS_bin(ba/*::, data*/) { var cnt = 2; if(cnt == 0) return; write_record(ba, 0x025B /* BrtBeginFills */, write_UInt32LE(cnt)); write_record(ba, 0x002D /* BrtFill */, write_BrtFill({patternType:"none"})); write_record(ba, 0x002D /* BrtFill */, write_BrtFill({patternType:"gray125"})); /* 1*65431BrtFill */ write_record(ba, 0x025C /* BrtEndFills */); } function write_BORDERS_bin(ba/*::, data*/) { var cnt = 1; if(cnt == 0) return; write_record(ba, 0x0265 /* BrtBeginBorders */, write_UInt32LE(cnt)); write_record(ba, 0x002E /* BrtBorder */, write_BrtBorder({})); /* 1*65430BrtBorder */ write_record(ba, 0x0266 /* BrtEndBorders */); } function write_CELLSTYLEXFS_bin(ba/*::, data*/) { var cnt = 1; write_record(ba, 0x0272 /* BrtBeginCellStyleXFs */, write_UInt32LE(cnt)); write_record(ba, 0x002F /* BrtXF */, write_BrtXF({ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0 }, 0xFFFF)); /* 1*65430(BrtXF *FRT) */ write_record(ba, 0x0273 /* BrtEndCellStyleXFs */); } function write_CELLXFS_bin(ba, data) { write_record(ba, 0x0269 /* BrtBeginCellXFs */, write_UInt32LE(data.length)); data.forEach(function(c) { write_record(ba, 0x002F /* BrtXF */, write_BrtXF(c,0)); }); /* 1*65430(BrtXF *FRT) */ write_record(ba, 0x026A /* BrtEndCellXFs */); } function write_STYLES_bin(ba/*::, data*/) { var cnt = 1; write_record(ba, 0x026B /* BrtBeginStyles */, write_UInt32LE(cnt)); write_record(ba, 0x0030 /* BrtStyle */, write_BrtStyle({ xfId:0, builtinId:0, name:"Normal" })); /* 1*65430(BrtStyle *FRT) */ write_record(ba, 0x026C /* BrtEndStyles */); } function write_DXFS_bin(ba/*::, data*/) { var cnt = 0; write_record(ba, 0x01F9 /* BrtBeginDXFs */, write_UInt32LE(cnt)); /* *2147483647(BrtDXF *FRT) */ write_record(ba, 0x01FA /* BrtEndDXFs */); } function write_TABLESTYLES_bin(ba/*::, data*/) { var cnt = 0; write_record(ba, 0x01FC /* BrtBeginTableStyles */, write_BrtBeginTableStyles(cnt, "TableStyleMedium9", "PivotStyleMedium4")); /* *TABLESTYLE */ write_record(ba, 0x01FD /* BrtEndTableStyles */); } function write_COLORPALETTE_bin(/*::ba, data*/) { return; /* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */ } /* [MS-XLSB] 2.1.7.50 Styles */ function write_sty_bin(wb, opts) { var ba = buf_array(); write_record(ba, 0x0116 /* BrtBeginStyleSheet */); write_FMTS_bin(ba, wb.SSF); write_FONTS_bin(ba, wb); write_FILLS_bin(ba, wb); write_BORDERS_bin(ba, wb); write_CELLSTYLEXFS_bin(ba, wb); write_CELLXFS_bin(ba, opts.cellXfs); write_STYLES_bin(ba, wb); write_DXFS_bin(ba, wb); write_TABLESTYLES_bin(ba, wb); write_COLORPALETTE_bin(ba, wb); /* FRTSTYLESHEET*/ write_record(ba, 0x0117 /* BrtEndStyleSheet */); return ba.end(); } /* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */ var XLSXThemeClrScheme = [ '', '', '', '', '', '', '', '', '', '', '', '' ]; /* 20.1.6.2 clrScheme CT_ColorScheme */ function parse_clrScheme(t, themes, opts) { themes.themeElements.clrScheme = []; var color = {}; (t[0].match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x); switch(y[0]) { /* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */ case '': break; /* 20.1.2.3.32 srgbClr CT_SRgbColor */ case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': case '': if (y[0].charAt(1) === '/') { themes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color; color = {}; } else { color.name = y[0].slice(3, y[0].length - 1); } break; default: if(opts && opts.WTF) throw new Error('Unrecognized ' + y[0] + ' in clrScheme'); } }); } /* 20.1.4.1.18 fontScheme CT_FontScheme */ function parse_fontScheme(/*::t, themes, opts*/) { } /* 20.1.4.1.15 fmtScheme CT_StyleMatrix */ function parse_fmtScheme(/*::t, themes, opts*/) { } var clrsregex = /]*)>[\s\S]*<\/a:clrScheme>/; var fntsregex = /]*)>[\s\S]*<\/a:fontScheme>/; var fmtsregex = /]*)>[\s\S]*<\/a:fmtScheme>/; /* 20.1.6.10 themeElements CT_BaseStyles */ function parse_themeElements(data, themes, opts) { themes.themeElements = {}; var t; [ /* clrScheme CT_ColorScheme */ ['clrScheme', clrsregex, parse_clrScheme], /* fontScheme CT_FontScheme */ ['fontScheme', fntsregex, parse_fontScheme], /* fmtScheme CT_StyleMatrix */ ['fmtScheme', fmtsregex, parse_fmtScheme] ].forEach(function(m) { if(!(t=data.match(m[1]))) throw new Error(m[0] + ' not found in themeElements'); m[2](t, themes, opts); }); } var themeltregex = /]*)>[\s\S]*<\/a:themeElements>/; /* 14.2.7 Theme Part */ function parse_theme_xml(data/*:string*/, opts) { /* 20.1.6.9 theme CT_OfficeStyleSheet */ if(!data || data.length === 0) data = write_theme(); var t; var themes = {}; /* themeElements CT_BaseStyles */ if(!(t=data.match(themeltregex))) throw new Error('themeElements not found in theme'); parse_themeElements(t[0], themes, opts); themes.raw = data; return themes; } function write_theme(Themes, opts)/*:string*/ { if(opts && opts.themeXLSX) return opts.themeXLSX; if(Themes && typeof Themes.raw == "string") return Themes.raw; var o = [XML_HEADER]; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; o[o.length] = ''; return o.join(""); } /* [MS-XLS] 2.4.326 TODO: payload is a zip file */ function parse_Theme(blob, length, opts) { var end = blob.l + length; var dwThemeVersion = blob.read_shift(4); if(dwThemeVersion === 124226) return; if(!opts.cellStyles) { blob.l = end; return; } var data = blob.slice(blob.l); blob.l = end; var zip; try { zip = zip_read(data, {type: "array"}); } catch(e) { return; } var themeXML = getzipstr(zip, "theme/theme/theme1.xml", true); if(!themeXML) return; return parse_theme_xml(themeXML, opts); } /* 2.5.49 */ function parse_ColorTheme(blob/*::, length*/) { return blob.read_shift(4); } /* 2.5.155 */ function parse_FullColorExt(blob/*::, length*/) { var o = {}; o.xclrType = blob.read_shift(2); o.nTintShade = blob.read_shift(2); switch(o.xclrType) { case 0: blob.l += 4; break; case 1: o.xclrValue = parse_IcvXF(blob, 4); break; case 2: o.xclrValue = parse_LongRGBA(blob, 4); break; case 3: o.xclrValue = parse_ColorTheme(blob, 4); break; case 4: blob.l += 4; break; } blob.l += 8; return o; } /* 2.5.164 TODO: read 7 bits*/ function parse_IcvXF(blob, length) { return parsenoop(blob, length); } /* 2.5.280 */ function parse_XFExtGradient(blob, length) { return parsenoop(blob, length); } /* [MS-XLS] 2.5.108 */ function parse_ExtProp(blob/*::, length*/)/*:Array*/ { var extType = blob.read_shift(2); var cb = blob.read_shift(2) - 4; var o = [extType]; switch(extType) { case 0x04: case 0x05: case 0x07: case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0D: o[1] = parse_FullColorExt(blob, cb); break; case 0x06: o[1] = parse_XFExtGradient(blob, cb); break; case 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 1 ? 1 : 2); break; default: throw new Error("Unrecognized ExtProp type: " + extType + " " + cb); } return o; } /* 2.4.355 */ function parse_XFExt(blob, length) { var end = blob.l + length; blob.l += 2; var ixfe = blob.read_shift(2); blob.l += 2; var cexts = blob.read_shift(2); var ext/*:AOA*/ = []; while(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l)); return {ixfe:ixfe, ext:ext}; } /* xf is an XF, see parse_XFExt for xfext */ function update_xfext(xf, xfext) { xfext.forEach(function(xfe) { switch(xfe[0]) { /* 2.5.108 extPropData */ case 0x04: break; /* foreground color */ case 0x05: break; /* background color */ case 0x06: break; /* gradient fill */ case 0x07: break; /* top cell border color */ case 0x08: break; /* bottom cell border color */ case 0x09: break; /* left cell border color */ case 0x0a: break; /* right cell border color */ case 0x0b: break; /* diagonal cell border color */ case 0x0d: /* text color */ break; case 0x0e: break; /* font scheme */ case 0x0f: break; /* indentation level */ } }); } function parse_BrtMdtinfo(data, length) { return { flags: data.read_shift(4), version: data.read_shift(4), name: parse_XLWideString(data, length - 8) }; } function write_BrtMdtinfo(data) { var o = new_buf(12 + 2 * data.name.length); o.write_shift(4, data.flags); o.write_shift(4, data.version); write_XLWideString(data.name, o); return o.slice(0, o.l); } function parse_BrtMdb(data) { var out = []; var cnt = data.read_shift(4); while (cnt-- > 0) out.push([data.read_shift(4), data.read_shift(4)]); return out; } function write_BrtMdb(mdb) { var o = new_buf(4 + 8 * mdb.length); o.write_shift(4, mdb.length); for (var i = 0; i < mdb.length; ++i) { o.write_shift(4, mdb[i][0]); o.write_shift(4, mdb[i][1]); } return o; } function write_BrtBeginEsfmd(cnt, name) { var o = new_buf(8 + 2 * name.length); o.write_shift(4, cnt); write_XLWideString(name, o); return o.slice(0, o.l); } function parse_BrtBeginEsmdb(data) { data.l += 4; return data.read_shift(4) != 0; } function write_BrtBeginEsmdb(cnt, cm) { var o = new_buf(8); o.write_shift(4, cnt); o.write_shift(4, cm ? 1 : 0); return o; } function parse_xlmeta_bin(data, name, _opts) { var out = { Types: [], Cell: [], Value: [] }; var opts = _opts || {}; var state = []; var pass = false; var metatype = 2; recordhopper(data, function(val, R, RT) { switch (RT) { case 335: out.Types.push({ name: val.name }); break; case 51: val.forEach(function(r) { if (metatype == 1) out.Cell.push({ type: out.Types[r[0] - 1].name, index: r[1] }); else if (metatype == 0) out.Value.push({ type: out.Types[r[0] - 1].name, index: r[1] }); }); break; case 337: metatype = val ? 1 : 0; break; case 338: metatype = 2; break; case 35: state.push(RT); pass = true; break; case 36: state.pop(); pass = false; break; default: if (R.T) { } else if (!pass || opts.WTF && state[state.length - 1] != 35) throw new Error("Unexpected record 0x" + RT.toString(16)); } }); return out; } function write_xlmeta_bin() { var ba = buf_array(); write_record(ba, 332); write_record(ba, 334, write_UInt32LE(1)); write_record(ba, 335, write_BrtMdtinfo({ name: "XLDAPR", version: 12e4, flags: 3496657072 })); write_record(ba, 336); write_record(ba, 339, write_BrtBeginEsfmd(1, "XLDAPR")); write_record(ba, 52); write_record(ba, 35, write_UInt32LE(514)); write_record(ba, 4096, write_UInt32LE(0)); write_record(ba, 4097, writeuint16(1)); write_record(ba, 36); write_record(ba, 53); write_record(ba, 340); write_record(ba, 337, write_BrtBeginEsmdb(1, true)); write_record(ba, 51, write_BrtMdb([[1, 0]])); write_record(ba, 338); write_record(ba, 333); return ba.end(); } function parse_xlmeta_xml(data, name, opts) { var out = { Types: [], Cell: [], Value: [] }; if (!data) return out; var pass = false; var metatype = 2; var lastmeta; data.replace(tagregex, function(x) { var y = parsexmltag(x); switch (strip_ns(y[0])) { case "": break; case "": break; case "": break; case "": break; case "": break; case "": break; case "": break; case "": metatype = 2; break; case "": metatype = 2; break; case "": case "": case "": break; case "": pass = false; break; case "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n'); return o.join(""); } /* 18.6 Calculation Chain */ function parse_cc_xml(data/*::, name, opts*/)/*:Array*/ { var d = []; if(!data) return d; var i = 1; (data.match(tagregex)||[]).forEach(function(x) { var y = parsexmltag(x); switch(y[0]) { case '': case '': break; /* 18.6.1 c CT_CalcCell 1 */ case ']*r:id="([^"]*)"/)||["",""])[1]; return rels['!id'][id].Target; } /* L.5.5.2 SpreadsheetML Comments + VML Schema */ var _shapeid = 1024; function write_comments_vml(rId/*:number*/, comments) { var csize = [21600, 21600]; /* L.5.2.1.2 Path Attribute */ var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(","); var o = [ writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"), writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}), writextag("v:shapetype", [ writextag("v:stroke", null, {joinstyle:"miter"}), writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"}) ].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox}) ]; while(_shapeid < rId * 1000) _shapeid += 1000; comments.forEach(function(x) { var c = decode_cell(x[0]); var fillopts = /*::(*/{'color2':"#BEFF82", 'type':"gradient"}/*:: :any)*/; if(fillopts.type == "gradient") fillopts.angle = "-180"; var fillparm = fillopts.type == "gradient" ? writextag("o:fill", null, {type:"gradientUnscaled", 'v:ext':"view"}) : null; var fillxml = writextag('v:fill', fillparm, fillopts); var shadata = ({on:"t", 'obscured':"t"}/*:any*/); ++_shapeid; o = o.concat([ '', fillxml, writextag("v:shadow", null, shadata), writextag("v:path", null, {'o:connecttype':"none"}), '
', '', '', '', /* Part 4 19.4.2.3 Anchor (Anchor) */ writetag('x:Anchor', [c.c+1, 0, c.r+1, 0, c.c+3, 20, c.r+5, 20].join(",")), writetag('x:AutoFill', "False"), writetag('x:Row', String(c.r)), writetag('x:Column', String(c.c)), x[1].hidden ? '' : '', '', '' ]); }); o.push(''); return o.join(""); } function sheet_insert_comments(sheet, comments/*:Array*/, threaded/*:boolean*/, people/*:?Array*/) { var dense = Array.isArray(sheet); var cell/*:Cell*/; comments.forEach(function(comment) { var r = decode_cell(comment.ref); if(dense) { if(!sheet[r.r]) sheet[r.r] = []; cell = sheet[r.r][r.c]; } else cell = sheet[comment.ref]; if (!cell) { cell = ({t:"z"}/*:any*/); if(dense) sheet[r.r][r.c] = cell; else sheet[comment.ref] = cell; var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1"); if(range.s.r > r.r) range.s.r = r.r; if(range.e.r < r.r) range.e.r = r.r; if(range.s.c > r.c) range.s.c = r.c; if(range.e.c < r.c) range.e.c = r.c; var encoded = encode_range(range); if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded; } if (!cell.c) cell.c = []; var o/*:Comment*/ = ({a: comment.author, t: comment.t, r: comment.r, T: threaded}); if(comment.h) o.h = comment.h; /* threaded comments always override */ for(var i = cell.c.length - 1; i >= 0; --i) { if(!threaded && cell.c[i].T) return; if(threaded && !cell.c[i].T) cell.c.splice(i, 1); } if(threaded && people) for(i = 0; i < people.length; ++i) { if(o.a == people[i].id) { o.a = people[i].name || o.a; break; } } cell.c.push(o); }); } /* 18.7 Comments */ function parse_comments_xml(data/*:string*/, opts)/*:Array*/ { /* 18.7.6 CT_Comments */ if(data.match(/<(?:\w+:)?comments *\/>/)) return []; var authors/*:Array*/ = []; var commentList/*:Array*/ = []; var authtag = data.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/); if(authtag && authtag[1]) authtag[1].split(/<\/\w*:?author>/).forEach(function(x) { if(x === "" || x.trim() === "") return; var a = x.match(/<(?:\w+:)?author[^>]*>(.*)/); if(a) authors.push(a[1]); }); var cmnttag = data.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/); if(cmnttag && cmnttag[1]) cmnttag[1].split(/<\/\w*:?comment>/).forEach(function(x) { if(x === "" || x.trim() === "") return; var cm = x.match(/<(?:\w+:)?comment[^>]*>/); if(!cm) return; var y = parsexmltag(cm[0]); var comment/*:RawComment*/ = ({ author: y.authorId && authors[y.authorId] || "sheetjsghost", ref: y.ref, guid: y.guid }/*:any*/); var cell = decode_cell(y.ref); if(opts.sheetRows && opts.sheetRows <= cell.r) return; var textMatch = x.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/); var rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {r:"",t:"",h:""}; comment.r = rt.r; if(rt.r == "") rt.t = rt.h = ""; comment.t = (rt.t||"").replace(/\r\n/g,"\n").replace(/\r/g,"\n"); if(opts.cellHTML) comment.h = rt.h; commentList.push(comment); }); return commentList; } function write_comments_xml(data/*::, opts*/) { var o = [XML_HEADER, writextag('comments', null, { 'xmlns': XMLNS_main[0] })]; var iauthor/*:Array*/ = []; o.push(""); data.forEach(function(x) { x[1].forEach(function(w) { var a = escapexml(w.a); if(iauthor.indexOf(a) == -1) { iauthor.push(a); o.push("" + a + ""); } if(w.T && w.ID && iauthor.indexOf("tc=" + w.ID) == -1) { iauthor.push("tc=" + w.ID); o.push("" + "tc=" + w.ID + ""); } }); }); if(iauthor.length == 0) { iauthor.push("SheetJ5"); o.push("SheetJ5"); } o.push(""); o.push(""); data.forEach(function(d) { /* 18.7.3 CT_Comment */ var lastauthor = 0, ts = []; if(d[1][0] && d[1][0].T && d[1][0].ID) lastauthor = iauthor.indexOf("tc=" + d[1][0].ID); else d[1].forEach(function(c) { if(c.a) lastauthor = iauthor.indexOf(escapexml(c.a)); ts.push(c.t||""); }); o.push(''); if(ts.length <= 1) o.push(writetag("t", escapexml(ts[0]||""))); else { /* based on Threaded Comments -> Comments projection */ var t = "Comment:\n " + (ts[0]) + "\n"; for(var i = 1; i < ts.length; ++i) t += "Reply:\n " + ts[i] + "\n"; o.push(writetag("t", escapexml(t))); } o.push(''); }); o.push(""); if(o.length>2) { o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* [MS-XLSX] 2.1.17 */ function parse_tcmnt_xml(data/*:string*/, opts)/*:Array*/ { var out = []; var pass = false, comment = {}, tidx = 0; data.replace(tagregex, function xml_tcmnt(x, idx) { var y/*:any*/ = parsexmltag(x); switch(strip_ns(y[0])) { case '': break; /* 2.6.205 threadedComment CT_ThreadedComment */ case '': if(comment.t != null) out.push(comment); break; case '': case '': comment.t = data.slice(tidx, idx).replace(/\r\n/g, "\n").replace(/\r/g, "\n"); break; /* 2.6.206 mentions CT_ThreadedCommentMentions TODO */ case '': pass = true; break; case '': pass = false; break; /* 2.6.202 mention CT_Mention TODO */ /* 18.2.10 extLst CT_ExtensionList ? */ case '': case '
': case '': break; /* 18.2.7 ext CT_Extension + */ case '': pass=false; break; default: if(!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in threaded comments'); } return x; }); return out; } function write_tcmnt_xml(comments, people, opts) { var o = [XML_HEADER, writextag('ThreadedComments', null, { 'xmlns': XMLNS.TCMNT }).replace(/[\/]>/, ">")]; comments.forEach(function(carr) { var rootid = ""; (carr[1] || []).forEach(function(c, idx) { if(!c.T) { delete c.ID; return; } if(c.a && people.indexOf(c.a) == -1) people.push(c.a); var tcopts = { ref: carr[0], id: "{54EE7951-7262-4200-6969-" + ("000000000000" + opts.tcid++).slice(-12) + "}" }; if(idx == 0) rootid = tcopts.id; else tcopts.parentId = rootid; c.ID = tcopts.id; if(c.a) tcopts.personId = "{54EE7950-7262-4200-6969-" + ("000000000000" + people.indexOf(c.a)).slice(-12) + "}"; o.push(writextag('threadedComment', writetag('text', c.t||""), tcopts)); }); }); o.push(''); return o.join(""); } /* [MS-XLSX] 2.1.18 */ function parse_people_xml(data/*:string*/, opts) { var out = []; var pass = false; data.replace(tagregex, function xml_tcmnt(x) { var y/*:any*/ = parsexmltag(x); switch(strip_ns(y[0])) { case '': break; /* 2.6.203 person CT_Person TODO: providers */ case '': break; /* 18.2.10 extLst CT_ExtensionList ? */ case '': case '': case '': break; /* 18.2.7 ext CT_Extension + */ case '': pass=false; break; default: if(!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in threaded comments'); } return x; }); return out; } function write_people_xml(people/*, opts*/) { var o = [XML_HEADER, writextag('personList', null, { 'xmlns': XMLNS.TCMNT, 'xmlns:x': XMLNS_main[0] }).replace(/[\/]>/, ">")]; people.forEach(function(person, idx) { o.push(writextag('person', null, { displayName: person, id: "{54EE7950-7262-4200-6969-" + ("000000000000" + idx).slice(-12) + "}", userId: person, providerId: "None" })); }); o.push(""); return o.join(""); } /* [MS-XLSB] 2.4.28 BrtBeginComment */ function parse_BrtBeginComment(data) { var out = {}; out.iauthor = data.read_shift(4); var rfx = parse_UncheckedRfX(data, 16); out.rfx = rfx.s; out.ref = encode_cell(rfx.s); data.l += 16; /*var guid = parse_GUID(data); */ return out; } function write_BrtBeginComment(data, o) { if(o == null) o = new_buf(36); o.write_shift(4, data[1].iauthor); write_UncheckedRfX((data[0]/*:any*/), o); o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(4, 0); o.write_shift(4, 0); return o; } /* [MS-XLSB] 2.4.327 BrtCommentAuthor */ var parse_BrtCommentAuthor = parse_XLWideString; function write_BrtCommentAuthor(data) { return write_XLWideString(data.slice(0, 54)); } /* [MS-XLSB] 2.1.7.8 Comments */ function parse_comments_bin(data, opts)/*:Array*/ { var out/*:Array*/ = []; var authors/*:Array*/ = []; var c = {}; var pass = false; recordhopper(data, function hopper_cmnt(val, R, RT) { switch(RT) { case 0x0278: /* 'BrtCommentAuthor' */ authors.push(val); break; case 0x027B: /* 'BrtBeginComment' */ c = val; break; case 0x027D: /* 'BrtCommentText' */ c.t = val.t; c.h = val.h; c.r = val.r; break; case 0x027C: /* 'BrtEndComment' */ c.author = authors[c.iauthor]; delete (c/*:any*/).iauthor; if(opts.sheetRows && c.rfx && opts.sheetRows <= c.rfx.r) break; if(!c.t) c.t = ""; delete c.rfx; out.push(c); break; case 0x0C00: /* 'BrtUid' */ break; case 0x0023: /* 'BrtFRTBegin' */ pass = true; break; case 0x0024: /* 'BrtFRTEnd' */ pass = false; break; case 0x0025: /* 'BrtACBegin' */ break; case 0x0026: /* 'BrtACEnd' */ break; default: if(R.T){/* empty */} else if(!pass || opts.WTF) throw new Error("Unexpected record 0x" + RT.toString(16)); } }); return out; } function write_comments_bin(data/*::, opts*/) { var ba = buf_array(); var iauthor/*:Array*/ = []; write_record(ba, 0x0274 /* BrtBeginComments */); write_record(ba, 0x0276 /* BrtBeginCommentAuthors */); data.forEach(function(comment) { comment[1].forEach(function(c) { if(iauthor.indexOf(c.a) > -1) return; iauthor.push(c.a.slice(0,54)); write_record(ba, 0x0278 /* BrtCommentAuthor */, write_BrtCommentAuthor(c.a)); }); }); write_record(ba, 0x0277 /* BrtEndCommentAuthors */); write_record(ba, 0x0279 /* BrtBeginCommentList */); data.forEach(function(comment) { comment[1].forEach(function(c) { c.iauthor = iauthor.indexOf(c.a); var range = {s:decode_cell(comment[0]),e:decode_cell(comment[0])}; write_record(ba, 0x027B /* BrtBeginComment */, write_BrtBeginComment([range, c])); if(c.t && c.t.length > 0) write_record(ba, 0x027D /* BrtCommentText */, write_BrtCommentText(c)); write_record(ba, 0x027C /* BrtEndComment */); delete c.iauthor; }); }); write_record(ba, 0x027A /* BrtEndCommentList */); write_record(ba, 0x0275 /* BrtEndComments */); return ba.end(); } var CT_VBA = "application/vnd.ms-office.vbaProject"; function make_vba_xls(cfb) { var newcfb = CFB.utils.cfb_new({ root: "R" }); cfb.FullPaths.forEach(function(p, i) { if (p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return; var newpath = p.replace(/^[^\/]*/, "R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content); }); return CFB.write(newcfb); } function fill_vba_xls(cfb, vba) { vba.FullPaths.forEach(function(p, i) { if (i == 0) return; var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/"); if (newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content); }); } var VBAFMTS = ["xlsb", "xlsm", "xlam", "biff8", "xla"]; /* macro and dialog sheet stubs */ function parse_ds_bin(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'dialog'}; } function parse_ds_xml(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'dialog'}; } function parse_ms_bin(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'macro'}; } function parse_ms_xml(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'macro'}; } /* TODO: it will be useful to parse the function str */ var rc_to_a1 = /*#__PURE__*/(function(){ var rcregex = /(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g; var rcbase/*:Cell*/ = ({r:0,c:0}/*:any*/); function rcfunc($$,$1,$2,$3) { var cRel = false, rRel = false; if($2.length == 0) rRel = true; else if($2.charAt(0) == "[") { rRel = true; $2 = $2.slice(1, -1); } if($3.length == 0) cRel = true; else if($3.charAt(0) == "[") { cRel = true; $3 = $3.slice(1, -1); } var R = $2.length>0?parseInt($2,10)|0:0, C = $3.length>0?parseInt($3,10)|0:0; if(cRel) C += rcbase.c; else --C; if(rRel) R += rcbase.r; else --R; return $1 + (cRel ? "" : "$") + encode_col(C) + (rRel ? "" : "$") + encode_row(R); } return function rc_to_a1(fstr/*:string*/, base/*:Cell*/)/*:string*/ { rcbase = base; return fstr.replace(rcregex, rcfunc); }; })(); var crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g; var a1_to_rc = /*#__PURE__*/(function(){ return function a1_to_rc(fstr/*:string*/, base/*:CellAddress*/) { return fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) { var c = decode_col($3) - ($2 ? 0 : base.c); var r = decode_row($5) - ($4 ? 0 : base.r); var R = (r == 0 ? "" : !$4 ? "[" + r + "]" : (r+1)); var C = (c == 0 ? "" : !$2 ? "[" + c + "]" : (c+1)); return $1 + "R" + R + "C" + C; }); }; })(); /* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */ function shift_formula_str(f/*:string*/, delta/*:Cell*/)/*:string*/ { return f.replace(crefregex, function($0, $1, $2, $3, $4, $5) { return $1+($2=="$" ? $2+$3 : encode_col(decode_col($3)+delta.c))+($4=="$" ? $4+$5 : encode_row(decode_row($5) + delta.r)); }); } function shift_formula_xlsx(f/*:string*/, range/*:string*/, cell/*:string*/)/*:string*/ { var r = decode_range(range), s = r.s, c = decode_cell(cell); var delta = {r:c.r - s.r, c:c.c - s.c}; return shift_formula_str(f, delta); } /* TODO: parse formula */ function fuzzyfmla(f/*:string*/)/*:boolean*/ { if(f.length == 1) return false; return true; } function _xlfn(f/*:string*/)/*:string*/ { return f.replace(/_xlfn\./g,""); } function parseread1(blob) { blob.l+=1; return; } /* [MS-XLS] 2.5.51 */ function parse_ColRelU(blob, length) { var c = blob.read_shift(length == 1 ? 1 : 2); return [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1]; } /* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */ function parse_RgceArea(blob, length, opts) { var w = 2; if(opts) { if(opts.biff >= 2 && opts.biff <= 5) return parse_RgceArea_BIFF2(blob, length, opts); else if(opts.biff == 12) w = 4; } var r=blob.read_shift(w), R=blob.read_shift(w); var c=parse_ColRelU(blob, 2); var C=parse_ColRelU(blob, 2); return { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} }; } /* BIFF 2-5 encodes flags in the row field */ function parse_RgceArea_BIFF2(blob/*::, length, opts*/) { var r=parse_ColRelU(blob, 2), R=parse_ColRelU(blob, 2); var c=blob.read_shift(1); var C=blob.read_shift(1); return { s:{r:r[0], c:c, cRel:r[1], rRel:r[2]}, e:{r:R[0], c:C, cRel:R[1], rRel:R[2]} }; } /* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */ function parse_RgceAreaRel(blob, length, opts) { if(opts.biff < 8) return parse_RgceArea_BIFF2(blob, length, opts); var r=blob.read_shift(opts.biff == 12 ? 4 : 2), R=blob.read_shift(opts.biff == 12 ? 4 : 2); var c=parse_ColRelU(blob, 2); var C=parse_ColRelU(blob, 2); return { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} }; } /* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */ function parse_RgceLoc(blob, length, opts) { if(opts && opts.biff >= 2 && opts.biff <= 5) return parse_RgceLoc_BIFF2(blob, length, opts); var r = blob.read_shift(opts && opts.biff == 12 ? 4 : 2); var c = parse_ColRelU(blob, 2); return {r:r, c:c[0], cRel:c[1], rRel:c[2]}; } function parse_RgceLoc_BIFF2(blob/*::, length, opts*/) { var r = parse_ColRelU(blob, 2); var c = blob.read_shift(1); return {r:r[0], c:c, cRel:r[1], rRel:r[2]}; } /* [MS-XLS] 2.5.198.107, 2.5.47 */ function parse_RgceElfLoc(blob/*::, length, opts*/) { var r = blob.read_shift(2); var c = blob.read_shift(2); return {r:r, c:c & 0xFF, fQuoted:!!(c & 0x4000), cRel:c>>15, rRel:c>>15 }; } /* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */ function parse_RgceLocRel(blob, length, opts) { var biff = opts && opts.biff ? opts.biff : 8; if(biff >= 2 && biff <= 5) return parse_RgceLocRel_BIFF2(blob, length, opts); var r = blob.read_shift(biff >= 12 ? 4 : 2); var cl = blob.read_shift(2); var cRel = (cl & 0x4000) >> 14, rRel = (cl & 0x8000) >> 15; cl &= 0x3FFF; if(rRel == 1) while(r > 0x7FFFF) r -= 0x100000; if(cRel == 1) while(cl > 0x1FFF) cl = cl - 0x4000; return {r:r,c:cl,cRel:cRel,rRel:rRel}; } function parse_RgceLocRel_BIFF2(blob/*::, length:number, opts*/) { var rl = blob.read_shift(2); var c = blob.read_shift(1); var rRel = (rl & 0x8000) >> 15, cRel = (rl & 0x4000) >> 14; rl &= 0x3FFF; if(rRel == 1 && rl >= 0x2000) rl = rl - 0x4000; if(cRel == 1 && c >= 0x80) c = c - 0x100; return {r:rl,c:c,cRel:cRel,rRel:rRel}; } /* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */ function parse_PtgArea(blob, length, opts) { var type = (blob[blob.l++] & 0x60) >> 5; var area = parse_RgceArea(blob, opts.biff >= 2 && opts.biff <= 5 ? 6 : 8, opts); return [type, area]; } /* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */ function parse_PtgArea3d(blob, length, opts) { var type = (blob[blob.l++] & 0x60) >> 5; var ixti = blob.read_shift(2, 'i'); var w = 8; if(opts) switch(opts.biff) { case 5: blob.l += 12; w = 6; break; case 12: w = 12; break; } var area = parse_RgceArea(blob, w, opts); return [type, ixti, area]; } /* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */ function parse_PtgAreaErr(blob, length, opts) { var type = (blob[blob.l++] & 0x60) >> 5; blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8); return [type]; } /* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */ function parse_PtgAreaErr3d(blob, length, opts) { var type = (blob[blob.l++] & 0x60) >> 5; var ixti = blob.read_shift(2); var w = 8; if(opts) switch(opts.biff) { case 5: blob.l += 12; w = 6; break; case 12: w = 12; break; } blob.l += w; return [type, ixti]; } /* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */ function parse_PtgAreaN(blob, length, opts) { var type = (blob[blob.l++] & 0x60) >> 5; var area = parse_RgceAreaRel(blob, length - 1, opts); return [type, area]; } /* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */ function parse_PtgArray(blob, length, opts) { var type = (blob[blob.l++] & 0x60) >> 5; blob.l += opts.biff == 2 ? 6 : opts.biff == 12 ? 14 : 7; return [type]; } /* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */ function parse_PtgAttrBaxcel(blob) { var bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */ var bitBaxcel = 1; blob.l += 4; return [bitSemi, bitBaxcel]; } /* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */ function parse_PtgAttrChoose(blob, length, opts)/*:Array*/ { blob.l +=2; var offset = blob.read_shift(opts && opts.biff == 2 ? 1 : 2); var o/*:Array*/ = []; /* offset is 1 less than the number of elements */ for(var i = 0; i <= offset; ++i) o.push(blob.read_shift(opts && opts.biff == 2 ? 1 : 2)); return o; } /* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */ function parse_PtgAttrGoto(blob, length, opts) { var bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0; blob.l += 2; return [bitGoto, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)]; } /* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */ function parse_PtgAttrIf(blob, length, opts) { var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0; blob.l += 2; return [bitIf, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)]; } /* [MS-XLSB] 2.5.97.28 */ function parse_PtgAttrIfError(blob) { var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0; blob.l += 2; return [bitIf, blob.read_shift(2)]; } /* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */ function parse_PtgAttrSemi(blob, length, opts) { var bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0; blob.l += opts && opts.biff == 2 ? 3 : 4; return [bitSemi]; } /* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */ function parse_PtgAttrSpaceType(blob/*::, length*/) { var type = blob.read_shift(1), cch = blob.read_shift(1); return [type, cch]; } /* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */ function parse_PtgAttrSpace(blob) { blob.read_shift(2); return parse_PtgAttrSpaceType(blob, 2); } /* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */ function parse_PtgAttrSpaceSemi(blob) { blob.read_shift(2); return parse_PtgAttrSpaceType(blob, 2); } /* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */ function parse_PtgRef(blob, length, opts) { //var ptg = blob[blob.l] & 0x1F; var type = (blob[blob.l] & 0x60)>>5; blob.l += 1; var loc = parse_RgceLoc(blob, 0, opts); return [type, loc]; } /* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */ function parse_PtgRefN(blob, length, opts) { var type = (blob[blob.l] & 0x60)>>5; blob.l += 1; var loc = parse_RgceLocRel(blob, 0, opts); return [type, loc]; } /* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */ function parse_PtgRef3d(blob, length, opts) { var type = (blob[blob.l] & 0x60)>>5; blob.l += 1; var ixti = blob.read_shift(2); // XtiIndex if(opts && opts.biff == 5) blob.l += 12; var loc = parse_RgceLoc(blob, 0, opts); // TODO: or RgceLocRel return [type, ixti, loc]; } /* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */ function parse_PtgFunc(blob, length, opts) { //var ptg = blob[blob.l] & 0x1F; var type = (blob[blob.l] & 0x60)>>5; blob.l += 1; var iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2); return [FtabArgc[iftab], Ftab[iftab], type]; } /* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */ function parse_PtgFuncVar(blob, length, opts) { var type = blob[blob.l++]; var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob); return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]]; } function parsetab(blob) { return [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF]; } /* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */ function parse_PtgAttrSum(blob, length, opts) { blob.l += opts && opts.biff == 2 ? 3 : 4; return; } /* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */ function parse_PtgExp(blob, length, opts) { blob.l++; if(opts && opts.biff == 12) return [blob.read_shift(4, 'i'), 0]; var row = blob.read_shift(2); var col = blob.read_shift(opts && opts.biff == 2 ? 1 : 2); return [row, col]; } /* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */ function parse_PtgErr(blob) { blob.l++; return BErr[blob.read_shift(1)]; } /* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */ function parse_PtgInt(blob) { blob.l++; return blob.read_shift(2); } /* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */ function parse_PtgBool(blob) { blob.l++; return blob.read_shift(1)!==0;} /* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */ function parse_PtgNum(blob) { blob.l++; return parse_Xnum(blob, 8); } /* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */ function parse_PtgStr(blob, length, opts) { blob.l++; return parse_ShortXLUnicodeString(blob, length-1, opts); } /* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */ /* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7} */ function parse_SerAr(blob, biff/*:number*/) { var val = [blob.read_shift(1)]; if(biff == 12) switch(val[0]) { case 0x02: val[0] = 0x04; break; /* SerBool */ case 0x04: val[0] = 0x10; break; /* SerErr */ case 0x00: val[0] = 0x01; break; /* SerNum */ case 0x01: val[0] = 0x02; break; /* SerStr */ } switch(val[0]) { case 0x04: /* SerBool -- boolean */ val[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE'; if(biff != 12) blob.l += 7; break; case 0x25: /* appears to be an alias */ case 0x10: /* SerErr -- error */ val[1] = BErr[blob[blob.l]]; blob.l += ((biff == 12) ? 4 : 8); break; case 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */ blob.l += 8; break; case 0x01: /* SerNum -- Xnum */ val[1] = parse_Xnum(blob, 8); break; case 0x02: /* SerStr -- XLUnicodeString (<256 chars) */ val[1] = parse_XLUnicodeString2(blob, 0, {biff:biff > 0 && biff < 8 ? 2 : biff}); break; default: throw new Error("Bad SerAr: " + val[0]); /* Unreachable */ } return val; } /* [MS-XLS] 2.5.198.61 ; [MS-XLSB] 2.5.97.44 */ function parse_PtgExtraMem(blob, cce, opts) { var count = blob.read_shift((opts.biff == 12) ? 4 : 2); var out/*:Array*/ = []; for(var i = 0; i != count; ++i) out.push(((opts.biff == 12) ? parse_UncheckedRfX : parse_Ref8U)(blob, 8)); return out; } /* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */ function parse_PtgExtraArray(blob, length, opts) { var rows = 0, cols = 0; if(opts.biff == 12) { rows = blob.read_shift(4); // DRw cols = blob.read_shift(4); // DCol } else { cols = 1 + blob.read_shift(1); //DColByteU rows = 1 + blob.read_shift(2); //DRw } if(opts.biff >= 2 && opts.biff < 8) { --rows; if(--cols == 0) cols = 0x100; } // $FlowIgnore for(var i = 0, o/*:Array>*/ = []; i != rows && (o[i] = []); ++i) for(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob, opts.biff); return o; } /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */ function parse_PtgName(blob, length, opts) { var type = (blob.read_shift(1) >>> 5) & 0x03; var w = (!opts || (opts.biff >= 8)) ? 4 : 2; var nameindex = blob.read_shift(w); switch(opts.biff) { case 2: blob.l += 5; break; case 3: case 4: blob.l += 8; break; case 5: blob.l += 12; break; } return [type, 0, nameindex]; } /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */ function parse_PtgNameX(blob, length, opts) { if(opts.biff == 5) return parse_PtgNameX_BIFF5(blob, length, opts); var type = (blob.read_shift(1) >>> 5) & 0x03; var ixti = blob.read_shift(2); // XtiIndex var nameindex = blob.read_shift(4); return [type, ixti, nameindex]; } function parse_PtgNameX_BIFF5(blob/*::, length, opts*/) { var type = (blob.read_shift(1) >>> 5) & 0x03; var ixti = blob.read_shift(2, 'i'); // XtiIndex blob.l += 8; var nameindex = blob.read_shift(2); blob.l += 12; return [type, ixti, nameindex]; } /* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */ function parse_PtgMemArea(blob, length, opts) { var type = (blob.read_shift(1) >>> 5) & 0x03; blob.l += (opts && opts.biff == 2 ? 3 : 4); var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2); return [type, cce]; } /* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */ function parse_PtgMemFunc(blob, length, opts) { var type = (blob.read_shift(1) >>> 5) & 0x03; var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2); return [type, cce]; } /* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */ function parse_PtgRefErr(blob, length, opts) { var type = (blob.read_shift(1) >>> 5) & 0x03; blob.l += 4; if(opts.biff < 8) blob.l--; if(opts.biff == 12) blob.l += 2; return [type]; } /* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */ function parse_PtgRefErr3d(blob, length, opts) { var type = (blob[blob.l++] & 0x60) >> 5; var ixti = blob.read_shift(2); var w = 4; if(opts) switch(opts.biff) { case 5: w = 15; break; case 12: w = 6; break; } blob.l += w; return [type, ixti]; } /* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */ var parse_PtgMemErr = parsenoop; /* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */ var parse_PtgMemNoMem = parsenoop; /* [MS-XLS] 2.5.198.92 */ var parse_PtgTbl = parsenoop; function parse_PtgElfLoc(blob, length, opts) { blob.l += 2; return [parse_RgceElfLoc(blob, 4, opts)]; } function parse_PtgElfNoop(blob/*::, length, opts*/) { blob.l += 6; return []; } /* [MS-XLS] 2.5.198.46 */ var parse_PtgElfCol = parse_PtgElfLoc; /* [MS-XLS] 2.5.198.47 */ var parse_PtgElfColS = parse_PtgElfNoop; /* [MS-XLS] 2.5.198.48 */ var parse_PtgElfColSV = parse_PtgElfNoop; /* [MS-XLS] 2.5.198.49 */ var parse_PtgElfColV = parse_PtgElfLoc; /* [MS-XLS] 2.5.198.50 */ function parse_PtgElfLel(blob/*::, length, opts*/) { blob.l += 2; return [parseuint16(blob), blob.read_shift(2) & 0x01]; } /* [MS-XLS] 2.5.198.51 */ var parse_PtgElfRadical = parse_PtgElfLoc; /* [MS-XLS] 2.5.198.52 */ var parse_PtgElfRadicalLel = parse_PtgElfLel; /* [MS-XLS] 2.5.198.53 */ var parse_PtgElfRadicalS = parse_PtgElfNoop; /* [MS-XLS] 2.5.198.54 */ var parse_PtgElfRw = parse_PtgElfLoc; /* [MS-XLS] 2.5.198.55 */ var parse_PtgElfRwV = parse_PtgElfLoc; /* [MS-XLSB] 2.5.97.52 TODO */ var PtgListRT = [ "Data", "All", "Headers", "??", "?Data2", "??", "?DataHeaders", "??", "Totals", "??", "??", "??", "?DataTotals", "??", "??", "??", "?Current" ]; function parse_PtgList(blob/*::, length, opts*/) { blob.l += 2; var ixti = blob.read_shift(2); var flags = blob.read_shift(2); var idx = blob.read_shift(4); var c = blob.read_shift(2); var C = blob.read_shift(2); var rt = PtgListRT[(flags >> 2) & 0x1F]; return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C}; } /* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */ function parse_PtgSxName(blob/*::, length, opts*/) { blob.l += 2; return [blob.read_shift(4)]; } /* [XLS] old spec */ function parse_PtgSheet(blob, length, opts) { blob.l += 5; blob.l += 2; blob.l += (opts.biff == 2 ? 1 : 4); return ["PTGSHEET"]; } function parse_PtgEndSheet(blob, length, opts) { blob.l += (opts.biff == 2 ? 4 : 5); return ["PTGENDSHEET"]; } function parse_PtgMemAreaN(blob/*::, length, opts*/) { var type = (blob.read_shift(1) >>> 5) & 0x03; var cce = blob.read_shift(2); return [type, cce]; } function parse_PtgMemNoMemN(blob/*::, length, opts*/) { var type = (blob.read_shift(1) >>> 5) & 0x03; var cce = blob.read_shift(2); return [type, cce]; } function parse_PtgAttrNoop(blob/*::, length, opts*/) { blob.l += 4; return [0, 0]; } /* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */ var PtgTypes = { /*::[*/0x01/*::]*/: { n:'PtgExp', f:parse_PtgExp }, /*::[*/0x02/*::]*/: { n:'PtgTbl', f:parse_PtgTbl }, /*::[*/0x03/*::]*/: { n:'PtgAdd', f:parseread1 }, /*::[*/0x04/*::]*/: { n:'PtgSub', f:parseread1 }, /*::[*/0x05/*::]*/: { n:'PtgMul', f:parseread1 }, /*::[*/0x06/*::]*/: { n:'PtgDiv', f:parseread1 }, /*::[*/0x07/*::]*/: { n:'PtgPower', f:parseread1 }, /*::[*/0x08/*::]*/: { n:'PtgConcat', f:parseread1 }, /*::[*/0x09/*::]*/: { n:'PtgLt', f:parseread1 }, /*::[*/0x0A/*::]*/: { n:'PtgLe', f:parseread1 }, /*::[*/0x0B/*::]*/: { n:'PtgEq', f:parseread1 }, /*::[*/0x0C/*::]*/: { n:'PtgGe', f:parseread1 }, /*::[*/0x0D/*::]*/: { n:'PtgGt', f:parseread1 }, /*::[*/0x0E/*::]*/: { n:'PtgNe', f:parseread1 }, /*::[*/0x0F/*::]*/: { n:'PtgIsect', f:parseread1 }, /*::[*/0x10/*::]*/: { n:'PtgUnion', f:parseread1 }, /*::[*/0x11/*::]*/: { n:'PtgRange', f:parseread1 }, /*::[*/0x12/*::]*/: { n:'PtgUplus', f:parseread1 }, /*::[*/0x13/*::]*/: { n:'PtgUminus', f:parseread1 }, /*::[*/0x14/*::]*/: { n:'PtgPercent', f:parseread1 }, /*::[*/0x15/*::]*/: { n:'PtgParen', f:parseread1 }, /*::[*/0x16/*::]*/: { n:'PtgMissArg', f:parseread1 }, /*::[*/0x17/*::]*/: { n:'PtgStr', f:parse_PtgStr }, /*::[*/0x1A/*::]*/: { n:'PtgSheet', f:parse_PtgSheet }, /*::[*/0x1B/*::]*/: { n:'PtgEndSheet', f:parse_PtgEndSheet }, /*::[*/0x1C/*::]*/: { n:'PtgErr', f:parse_PtgErr }, /*::[*/0x1D/*::]*/: { n:'PtgBool', f:parse_PtgBool }, /*::[*/0x1E/*::]*/: { n:'PtgInt', f:parse_PtgInt }, /*::[*/0x1F/*::]*/: { n:'PtgNum', f:parse_PtgNum }, /*::[*/0x20/*::]*/: { n:'PtgArray', f:parse_PtgArray }, /*::[*/0x21/*::]*/: { n:'PtgFunc', f:parse_PtgFunc }, /*::[*/0x22/*::]*/: { n:'PtgFuncVar', f:parse_PtgFuncVar }, /*::[*/0x23/*::]*/: { n:'PtgName', f:parse_PtgName }, /*::[*/0x24/*::]*/: { n:'PtgRef', f:parse_PtgRef }, /*::[*/0x25/*::]*/: { n:'PtgArea', f:parse_PtgArea }, /*::[*/0x26/*::]*/: { n:'PtgMemArea', f:parse_PtgMemArea }, /*::[*/0x27/*::]*/: { n:'PtgMemErr', f:parse_PtgMemErr }, /*::[*/0x28/*::]*/: { n:'PtgMemNoMem', f:parse_PtgMemNoMem }, /*::[*/0x29/*::]*/: { n:'PtgMemFunc', f:parse_PtgMemFunc }, /*::[*/0x2A/*::]*/: { n:'PtgRefErr', f:parse_PtgRefErr }, /*::[*/0x2B/*::]*/: { n:'PtgAreaErr', f:parse_PtgAreaErr }, /*::[*/0x2C/*::]*/: { n:'PtgRefN', f:parse_PtgRefN }, /*::[*/0x2D/*::]*/: { n:'PtgAreaN', f:parse_PtgAreaN }, /*::[*/0x2E/*::]*/: { n:'PtgMemAreaN', f:parse_PtgMemAreaN }, /*::[*/0x2F/*::]*/: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN }, /*::[*/0x39/*::]*/: { n:'PtgNameX', f:parse_PtgNameX }, /*::[*/0x3A/*::]*/: { n:'PtgRef3d', f:parse_PtgRef3d }, /*::[*/0x3B/*::]*/: { n:'PtgArea3d', f:parse_PtgArea3d }, /*::[*/0x3C/*::]*/: { n:'PtgRefErr3d', f:parse_PtgRefErr3d }, /*::[*/0x3D/*::]*/: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d }, /*::[*/0xFF/*::]*/: {} }; /* These are duplicated in the PtgTypes table */ var PtgDupes = { /*::[*/0x40/*::]*/: 0x20, /*::[*/0x60/*::]*/: 0x20, /*::[*/0x41/*::]*/: 0x21, /*::[*/0x61/*::]*/: 0x21, /*::[*/0x42/*::]*/: 0x22, /*::[*/0x62/*::]*/: 0x22, /*::[*/0x43/*::]*/: 0x23, /*::[*/0x63/*::]*/: 0x23, /*::[*/0x44/*::]*/: 0x24, /*::[*/0x64/*::]*/: 0x24, /*::[*/0x45/*::]*/: 0x25, /*::[*/0x65/*::]*/: 0x25, /*::[*/0x46/*::]*/: 0x26, /*::[*/0x66/*::]*/: 0x26, /*::[*/0x47/*::]*/: 0x27, /*::[*/0x67/*::]*/: 0x27, /*::[*/0x48/*::]*/: 0x28, /*::[*/0x68/*::]*/: 0x28, /*::[*/0x49/*::]*/: 0x29, /*::[*/0x69/*::]*/: 0x29, /*::[*/0x4A/*::]*/: 0x2A, /*::[*/0x6A/*::]*/: 0x2A, /*::[*/0x4B/*::]*/: 0x2B, /*::[*/0x6B/*::]*/: 0x2B, /*::[*/0x4C/*::]*/: 0x2C, /*::[*/0x6C/*::]*/: 0x2C, /*::[*/0x4D/*::]*/: 0x2D, /*::[*/0x6D/*::]*/: 0x2D, /*::[*/0x4E/*::]*/: 0x2E, /*::[*/0x6E/*::]*/: 0x2E, /*::[*/0x4F/*::]*/: 0x2F, /*::[*/0x6F/*::]*/: 0x2F, /*::[*/0x58/*::]*/: 0x22, /*::[*/0x78/*::]*/: 0x22, /*::[*/0x59/*::]*/: 0x39, /*::[*/0x79/*::]*/: 0x39, /*::[*/0x5A/*::]*/: 0x3A, /*::[*/0x7A/*::]*/: 0x3A, /*::[*/0x5B/*::]*/: 0x3B, /*::[*/0x7B/*::]*/: 0x3B, /*::[*/0x5C/*::]*/: 0x3C, /*::[*/0x7C/*::]*/: 0x3C, /*::[*/0x5D/*::]*/: 0x3D, /*::[*/0x7D/*::]*/: 0x3D }; var Ptg18 = { /*::[*/0x01/*::]*/: { n:'PtgElfLel', f:parse_PtgElfLel }, /*::[*/0x02/*::]*/: { n:'PtgElfRw', f:parse_PtgElfRw }, /*::[*/0x03/*::]*/: { n:'PtgElfCol', f:parse_PtgElfCol }, /*::[*/0x06/*::]*/: { n:'PtgElfRwV', f:parse_PtgElfRwV }, /*::[*/0x07/*::]*/: { n:'PtgElfColV', f:parse_PtgElfColV }, /*::[*/0x0A/*::]*/: { n:'PtgElfRadical', f:parse_PtgElfRadical }, /*::[*/0x0B/*::]*/: { n:'PtgElfRadicalS', f:parse_PtgElfRadicalS }, /*::[*/0x0D/*::]*/: { n:'PtgElfColS', f:parse_PtgElfColS }, /*::[*/0x0F/*::]*/: { n:'PtgElfColSV', f:parse_PtgElfColSV }, /*::[*/0x10/*::]*/: { n:'PtgElfRadicalLel', f:parse_PtgElfRadicalLel }, /*::[*/0x19/*::]*/: { n:'PtgList', f:parse_PtgList }, /*::[*/0x1D/*::]*/: { n:'PtgSxName', f:parse_PtgSxName }, /*::[*/0xFF/*::]*/: {} }; var Ptg19 = { /*::[*/0x00/*::]*/: { n:'PtgAttrNoop', f:parse_PtgAttrNoop }, /*::[*/0x01/*::]*/: { n:'PtgAttrSemi', f:parse_PtgAttrSemi }, /*::[*/0x02/*::]*/: { n:'PtgAttrIf', f:parse_PtgAttrIf }, /*::[*/0x04/*::]*/: { n:'PtgAttrChoose', f:parse_PtgAttrChoose }, /*::[*/0x08/*::]*/: { n:'PtgAttrGoto', f:parse_PtgAttrGoto }, /*::[*/0x10/*::]*/: { n:'PtgAttrSum', f:parse_PtgAttrSum }, /*::[*/0x20/*::]*/: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel }, /*::[*/0x21/*::]*/: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel }, /*::[*/0x40/*::]*/: { n:'PtgAttrSpace', f:parse_PtgAttrSpace }, /*::[*/0x41/*::]*/: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi }, /*::[*/0x80/*::]*/: { n:'PtgAttrIfError', f:parse_PtgAttrIfError }, /*::[*/0xFF/*::]*/: {} }; /* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */ function parse_RgbExtra(blob, length, rgce, opts) { if(opts.biff < 8) return parsenoop(blob, length); var target = blob.l + length; var o = []; for(var i = 0; i !== rgce.length; ++i) { switch(rgce[i][0]) { case 'PtgArray': /* PtgArray -> PtgExtraArray */ rgce[i][1] = parse_PtgExtraArray(blob, 0, opts); o.push(rgce[i][1]); break; case 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */ rgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1], opts); o.push(rgce[i][2]); break; case 'PtgExp': /* PtgExp -> PtgExtraCol */ if(opts && opts.biff == 12) { rgce[i][1][1] = blob.read_shift(4); o.push(rgce[i][1]); } break; case 'PtgList': /* TODO: PtgList -> PtgExtraList */ case 'PtgElfRadicalS': /* TODO: PtgElfRadicalS -> PtgExtraElf */ case 'PtgElfColS': /* TODO: PtgElfColS -> PtgExtraElf */ case 'PtgElfColSV': /* TODO: PtgElfColSV -> PtgExtraElf */ throw "Unsupported " + rgce[i][0]; default: break; } } length = target - blob.l; /* note: this is technically an error but Excel disregards */ //if(target !== blob.l && blob.l !== target - length) throw new Error(target + " != " + blob.l); if(length !== 0) o.push(parsenoop(blob, length)); return o; } /* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */ function parse_Rgce(blob, length, opts) { var target = blob.l + length; var R, id, ptgs = []; while(target != blob.l) { length = target - blob.l; id = blob[blob.l]; R = PtgTypes[id] || PtgTypes[PtgDupes[id]]; if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]]; if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); } else { ptgs.push([R.n, R.f(blob, length, opts)]); } } return ptgs; } function stringify_array(f/*:Array>*/)/*:string*/ { var o/*:Array*/ = []; for(var i = 0; i < f.length; ++i) { var x = f[i], r/*:Array*/ = []; for(var j = 0; j < x.length; ++j) { var y = x[j]; if(y) switch(y[0]) { // TODO: handle embedded quotes case 0x02: /*:: if(typeof y[1] != 'string') throw "unreachable"; */ r.push('"' + y[1].replace(/"/g,'""') + '"'); break; default: r.push(y[1]); } else r.push(""); } o.push(r.join(",")); } return o.join(";"); } /* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */ var PtgBinOp = { PtgAdd: "+", PtgConcat: "&", PtgDiv: "/", PtgEq: "=", PtgGe: ">=", PtgGt: ">", PtgLe: "<=", PtgLt: "<", PtgMul: "*", PtgNe: "<>", PtgPower: "^", PtgSub: "-" }; // List of invalid characters needs to be tested further function formula_quote_sheet_name(sname/*:string*/, opts)/*:string*/ { if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name"); if (/[^\w\u4E00-\u9FFF\u3040-\u30FF]/.test(sname)) return "'" + sname + "'"; return sname; } function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ { if(!supbooks) return "SH33TJSERR0"; if(opts.biff > 8 && (!supbooks.XTI || !supbooks.XTI[ixti])) return supbooks.SheetNames[ixti]; if(!supbooks.XTI) return "SH33TJSERR6"; var XTI = supbooks.XTI[ixti]; if(opts.biff < 8) { if(ixti > 10000) ixti-= 65536; if(ixti < 0) ixti = -ixti; return ixti == 0 ? "" : supbooks.XTI[ixti - 1]; } if(!XTI) return "SH33TJSERR1"; var o = ""; if(opts.biff > 8) switch(supbooks[XTI[0]][0]) { case 0x0165: /* 'BrtSupSelf' */ o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]]; return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]]; case 0x0166: /* 'BrtSupSame' */ if(opts.SID != null) return supbooks.SheetNames[opts.SID]; return "SH33TJSSAME" + supbooks[XTI[0]][0]; case 0x0163: /* 'BrtSupBookSrc' */ /* falls through */ default: return "SH33TJSSRC" + supbooks[XTI[0]][0]; } switch(supbooks[XTI[0]][0][0]) { case 0x0401: o = XTI[1] == -1 ? "#REF" : (supbooks.SheetNames[XTI[1]] || "SH33TJSERR3"); return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]]; case 0x3A01: return supbooks[XTI[0]].slice(1).map(function(name) { return name.Name; }).join(";;"); //return "SH33TJSERR8"; default: if(!supbooks[XTI[0]][0][3]) return "SH33TJSERR2"; o = XTI[1] == -1 ? "#REF" : (supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4"); return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]]; } } function get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ { var ixtiraw = get_ixti_raw(supbooks, ixti, opts); return ixtiraw == "#REF" ? ixtiraw : formula_quote_sheet_name(ixtiraw, opts); } function stringify_formula(formula/*Array*/, range, cell/*:any*/, supbooks, opts)/*:string*/ { var biff = (opts && opts.biff) || 8; var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}}; var stack/*:Array*/ = [], e1, e2, /*::type,*/ c/*:CellAddress*/, ixti=0, nameidx=0, r, sname=""; if(!formula[0] || !formula[0][0]) return ""; var last_sp = -1, sp = ""; for(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) { var f = formula[0][ff]; switch(f[0]) { case 'PtgUminus': /* [MS-XLS] 2.5.198.93 */ stack.push("-" + stack.pop()); break; case 'PtgUplus': /* [MS-XLS] 2.5.198.95 */ stack.push("+" + stack.pop()); break; case 'PtgPercent': /* [MS-XLS] 2.5.198.81 */ stack.push(stack.pop() + "%"); break; case 'PtgAdd': /* [MS-XLS] 2.5.198.26 */ case 'PtgConcat': /* [MS-XLS] 2.5.198.43 */ case 'PtgDiv': /* [MS-XLS] 2.5.198.45 */ case 'PtgEq': /* [MS-XLS] 2.5.198.56 */ case 'PtgGe': /* [MS-XLS] 2.5.198.64 */ case 'PtgGt': /* [MS-XLS] 2.5.198.65 */ case 'PtgLe': /* [MS-XLS] 2.5.198.68 */ case 'PtgLt': /* [MS-XLS] 2.5.198.69 */ case 'PtgMul': /* [MS-XLS] 2.5.198.75 */ case 'PtgNe': /* [MS-XLS] 2.5.198.78 */ case 'PtgPower': /* [MS-XLS] 2.5.198.82 */ case 'PtgSub': /* [MS-XLS] 2.5.198.90 */ e1 = stack.pop(); e2 = stack.pop(); if(last_sp >= 0) { switch(formula[0][last_sp][1][0]) { case 0: // $FlowIgnore sp = fill(" ", formula[0][last_sp][1][1]); break; case 1: // $FlowIgnore sp = fill("\r", formula[0][last_sp][1][1]); break; default: sp = ""; // $FlowIgnore if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]); } e2 = e2 + sp; last_sp = -1; } stack.push(e2+PtgBinOp[f[0]]+e1); break; case 'PtgIsect': /* [MS-XLS] 2.5.198.67 */ e1 = stack.pop(); e2 = stack.pop(); stack.push(e2+" "+e1); break; case 'PtgUnion': /* [MS-XLS] 2.5.198.94 */ e1 = stack.pop(); e2 = stack.pop(); stack.push(e2+","+e1); break; case 'PtgRange': /* [MS-XLS] 2.5.198.83 */ e1 = stack.pop(); e2 = stack.pop(); stack.push(e2+":"+e1); break; case 'PtgAttrChoose': /* [MS-XLS] 2.5.198.34 */ break; case 'PtgAttrGoto': /* [MS-XLS] 2.5.198.35 */ break; case 'PtgAttrIf': /* [MS-XLS] 2.5.198.36 */ break; case 'PtgAttrIfError': /* [MS-XLSB] 2.5.97.28 */ break; case 'PtgRef': /* [MS-XLS] 2.5.198.84 */ /*::type = f[1][0]; */c = shift_cell_xls((f[1][1]/*:any*/), _range, opts); stack.push(encode_cell_xls(c, biff)); break; case 'PtgRefN': /* [MS-XLS] 2.5.198.88 */ /*::type = f[1][0]; */c = cell ? shift_cell_xls((f[1][1]/*:any*/), cell, opts) : (f[1][1]/*:any*/); stack.push(encode_cell_xls(c, biff)); break; case 'PtgRef3d': /* [MS-XLS] 2.5.198.85 */ /*::type = f[1][0]; */ixti = /*::Number(*/f[1][1]/*::)*/; c = shift_cell_xls((f[1][2]/*:any*/), _range, opts); sname = get_ixti(supbooks, ixti, opts); var w = sname; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars stack.push(sname + "!" + encode_cell_xls(c, biff)); break; case 'PtgFunc': /* [MS-XLS] 2.5.198.62 */ case 'PtgFuncVar': /* [MS-XLS] 2.5.198.63 */ /* f[1] = [argc, func, type] */ var argc/*:number*/ = (f[1][0]/*:any*/), func/*:string*/ = (f[1][1]/*:any*/); if(!argc) argc = 0; argc &= 0x7F; var args = argc == 0 ? [] : stack.slice(-argc); stack.length -= argc; if(func === 'User') func = args.shift(); stack.push(func + "(" + args.join(",") + ")"); break; case 'PtgBool': /* [MS-XLS] 2.5.198.42 */ stack.push(f[1] ? "TRUE" : "FALSE"); break; case 'PtgInt': /* [MS-XLS] 2.5.198.66 */ stack.push(/*::String(*/f[1]/*::)*/); break; case 'PtgNum': /* [MS-XLS] 2.5.198.79 TODO: precision? */ stack.push(String(f[1])); break; case 'PtgStr': /* [MS-XLS] 2.5.198.89 */ // $FlowIgnore stack.push('"' + f[1].replace(/"/g, '""') + '"'); break; case 'PtgErr': /* [MS-XLS] 2.5.198.57 */ stack.push(/*::String(*/f[1]/*::)*/); break; case 'PtgAreaN': /* [MS-XLS] 2.5.198.31 TODO */ /*::type = f[1][0]; */r = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts); stack.push(encode_range_xls((r/*:any*/), opts)); break; case 'PtgArea': /* [MS-XLS] 2.5.198.27 TODO: fixed points */ /*::type = f[1][0]; */r = shift_range_xls(f[1][1], _range, opts); stack.push(encode_range_xls((r/*:any*/), opts)); break; case 'PtgArea3d': /* [MS-XLS] 2.5.198.28 TODO */ /*::type = f[1][0]; */ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2]; sname = get_ixti(supbooks, ixti, opts); stack.push(sname + "!" + encode_range_xls((r/*:any*/), opts)); break; case 'PtgAttrSum': /* [MS-XLS] 2.5.198.41 */ stack.push("SUM(" + stack.pop() + ")"); break; case 'PtgAttrBaxcel': /* [MS-XLS] 2.5.198.33 */ case 'PtgAttrSemi': /* [MS-XLS] 2.5.198.37 */ break; case 'PtgName': /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */ /* f[1] = type, 0, nameindex */ nameidx = (f[1][2]/*:any*/); var lbl = (supbooks.names||[])[nameidx-1] || (supbooks[0]||[])[nameidx]; var name = lbl ? lbl.Name : "SH33TJSNAME" + String(nameidx); /* [MS-XLSB] 2.5.97.10 Ftab -- last verified 20220204 */ if(name && name.slice(0,6) == "_xlfn." && !opts.xlfn) name = name.slice(6); stack.push(name); break; case 'PtgNameX': /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */ /* f[1] = type, ixti, nameindex */ var bookidx/*:number*/ = (f[1][1]/*:any*/); nameidx = (f[1][2]/*:any*/); var externbook; /* TODO: Properly handle missing values -- this should be using get_ixti_raw primarily */ if(opts.biff <= 5) { if(bookidx < 0) bookidx = -bookidx; if(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx]; } else { var o = ""; if(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */} else if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){ if(supbooks[bookidx][nameidx] && supbooks[bookidx][nameidx].itab > 0) { o = supbooks.SheetNames[supbooks[bookidx][nameidx].itab-1] + "!"; } } else o = supbooks.SheetNames[nameidx-1]+ "!"; if(supbooks[bookidx] && supbooks[bookidx][nameidx]) o += supbooks[bookidx][nameidx].Name; else if(supbooks[0] && supbooks[0][nameidx]) o += supbooks[0][nameidx].Name; else { var ixtidata = (get_ixti_raw(supbooks, bookidx, opts)||"").split(";;"); if(ixtidata[nameidx - 1]) o = ixtidata[nameidx - 1]; // TODO: confirm this is correct else o += "SH33TJSERRX"; } stack.push(o); break; } if(!externbook) externbook = {Name: "SH33TJSERRY"}; stack.push(externbook.Name); break; case 'PtgParen': /* [MS-XLS] 2.5.198.80 */ var lp = '(', rp = ')'; if(last_sp >= 0) { sp = ""; switch(formula[0][last_sp][1][0]) { // $FlowIgnore case 2: lp = fill(" ", formula[0][last_sp][1][1]) + lp; break; // $FlowIgnore case 3: lp = fill("\r", formula[0][last_sp][1][1]) + lp; break; // $FlowIgnore case 4: rp = fill(" ", formula[0][last_sp][1][1]) + rp; break; // $FlowIgnore case 5: rp = fill("\r", formula[0][last_sp][1][1]) + rp; break; default: // $FlowIgnore if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]); } last_sp = -1; } stack.push(lp + stack.pop() + rp); break; case 'PtgRefErr': /* [MS-XLS] 2.5.198.86 */ stack.push('#REF!'); break; case 'PtgRefErr3d': /* [MS-XLS] 2.5.198.87 */ stack.push('#REF!'); break; case 'PtgExp': /* [MS-XLS] 2.5.198.58 TODO */ c = {c:(f[1][1]/*:any*/),r:(f[1][0]/*:any*/)}; var q = ({c: cell.c, r:cell.r}/*:any*/); if(supbooks.sharedf[encode_cell(c)]) { var parsedf = (supbooks.sharedf[encode_cell(c)]); stack.push(stringify_formula(parsedf, _range, q, supbooks, opts)); } else { var fnd = false; for(e1=0;e1!=supbooks.arrayf.length; ++e1) { /* TODO: should be something like range_has */ e2 = supbooks.arrayf[e1]; if(c.c < e2[0].s.c || c.c > e2[0].e.c) continue; if(c.r < e2[0].s.r || c.r > e2[0].e.r) continue; stack.push(stringify_formula(e2[1], _range, q, supbooks, opts)); fnd = true; break; } if(!fnd) stack.push(/*::String(*/f[1]/*::)*/); } break; case 'PtgArray': /* [MS-XLS] 2.5.198.32 TODO */ stack.push("{" + stringify_array(/*::(*/f[1]/*:: :any)*/) + "}"); break; case 'PtgMemArea': /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */ //stack.push("(" + f[2].map(encode_range).join(",") + ")"); break; case 'PtgAttrSpace': /* [MS-XLS] 2.5.198.38 */ case 'PtgAttrSpaceSemi': /* [MS-XLS] 2.5.198.39 */ last_sp = ff; break; case 'PtgTbl': /* [MS-XLS] 2.5.198.92 TODO */ break; case 'PtgMemErr': /* [MS-XLS] 2.5.198.71 */ break; case 'PtgMissArg': /* [MS-XLS] 2.5.198.74 */ stack.push(""); break; case 'PtgAreaErr': /* [MS-XLS] 2.5.198.29 */ stack.push("#REF!"); break; case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */ stack.push("#REF!"); break; case 'PtgList': /* [MS-XLSB] 2.5.97.52 */ // $FlowIgnore stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]"); break; case 'PtgMemAreaN': case 'PtgMemNoMemN': case 'PtgAttrNoop': case 'PtgSheet': case 'PtgEndSheet': break; case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */ break; case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */ break; case 'PtgElfCol': /* [MS-XLS] 2.5.198.46 */ case 'PtgElfColS': /* [MS-XLS] 2.5.198.47 */ case 'PtgElfColSV': /* [MS-XLS] 2.5.198.48 */ case 'PtgElfColV': /* [MS-XLS] 2.5.198.49 */ case 'PtgElfLel': /* [MS-XLS] 2.5.198.50 */ case 'PtgElfRadical': /* [MS-XLS] 2.5.198.51 */ case 'PtgElfRadicalLel': /* [MS-XLS] 2.5.198.52 */ case 'PtgElfRadicalS': /* [MS-XLS] 2.5.198.53 */ case 'PtgElfRw': /* [MS-XLS] 2.5.198.54 */ case 'PtgElfRwV': /* [MS-XLS] 2.5.198.55 */ throw new Error("Unsupported ELFs"); case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */ throw new Error('Unrecognized Formula Token: ' + String(f)); default: throw new Error('Unrecognized Formula Token: ' + String(f)); } var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto']; if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) { f = formula[0][last_sp]; var _left = true; switch(f[1][0]) { /* note: some bad XLSB files omit the PtgParen */ case 4: _left = false; /* falls through */ case 0: // $FlowIgnore sp = fill(" ", f[1][1]); break; case 5: _left = false; /* falls through */ case 1: // $FlowIgnore sp = fill("\r", f[1][1]); break; default: sp = ""; // $FlowIgnore if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + f[1][0]); } stack.push((_left ? sp : "") + stack.pop() + (_left ? "" : sp)); last_sp = -1; } } if(stack.length > 1 && opts.WTF) throw new Error("bad formula stack"); return stack[0]; } /* [MS-XLS] 2.5.198.1 TODO */ function parse_ArrayParsedFormula(blob, length, opts/*::, ref*/) { var target = blob.l + length, len = opts.biff == 2 ? 1 : 2; var rgcb, cce = blob.read_shift(len); // length of rgce if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)]; var rgce = parse_Rgce(blob, cce, opts); if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts); blob.l = target; return [rgce, rgcb]; } /* [MS-XLS] 2.5.198.3 TODO */ function parse_XLSCellParsedFormula(blob, length, opts) { var target = blob.l + length, len = opts.biff == 2 ? 1 : 2; var rgcb, cce = blob.read_shift(len); // length of rgce if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)]; var rgce = parse_Rgce(blob, cce, opts); if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts); blob.l = target; return [rgce, rgcb]; } /* [MS-XLS] 2.5.198.21 */ function parse_NameParsedFormula(blob, length, opts, cce) { var target = blob.l + length; var rgce = parse_Rgce(blob, cce, opts); var rgcb; if(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts); return [rgce, rgcb]; } /* [MS-XLS] 2.5.198.118 TODO */ function parse_SharedParsedFormula(blob, length, opts) { var target = blob.l + length; var rgcb, cce = blob.read_shift(2); // length of rgce var rgce = parse_Rgce(blob, cce, opts); if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)]; if(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts); return [rgce, rgcb]; } /* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */ function parse_FormulaValue(blob/*::, length*/) { var b; if(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n']; switch(blob[blob.l]) { case 0x00: blob.l += 8; return ["String", 's']; case 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b']; case 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e']; case 0x03: blob.l += 8; return ["",'s']; } return []; } function write_FormulaValue(value) { if(value == null) { // Blank String Value var o = new_buf(8); o.write_shift(1, 0x03); o.write_shift(1, 0); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 0xFFFF); return o; } else if(typeof value == "number") return write_Xnum(value); return write_Xnum(0); } /* [MS-XLS] 2.4.127 TODO */ function parse_Formula(blob, length, opts) { var end = blob.l + length; var cell = parse_XLSCell(blob, 6); if(opts.biff == 2) ++blob.l; var val = parse_FormulaValue(blob,8); var flags = blob.read_shift(1); if(opts.biff != 2) { blob.read_shift(1); if(opts.biff >= 5) { /*var chn = */blob.read_shift(4); } } var cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts); return {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]}; } function write_Formula(cell/*:Cell*/, R/*:number*/, C/*:number*/, opts, os/*:number*/) { // Cell var o1 = write_XLSCell(R, C, os); // FormulaValue var o2 = write_FormulaValue(cell.v); // flags + cache var o3 = new_buf(6); var flags = 0x01 | 0x20; o3.write_shift(2, flags); o3.write_shift(4, 0); // CellParsedFormula var bf = new_buf(cell.bf.length); for(var i = 0; i < cell.bf.length; ++i) bf[i] = cell.bf[i]; var out = bconcat([o1, o2, o3, bf]); return out; } /* XLSB Parsed Formula records have the same shape */ function parse_XLSBParsedFormula(data, length, opts) { var cce = data.read_shift(4); var rgce = parse_Rgce(data, cce, opts); var cb = data.read_shift(4); var rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null; return [rgce, rgcb]; } /* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */ var parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula; /* [MS-XLSB] 2.5.97.4 CellParsedFormula */ var parse_XLSBCellParsedFormula = parse_XLSBParsedFormula; /* [MS-XLSB] 2.5.97.8 DVParsedFormula */ //var parse_XLSBDVParsedFormula = parse_XLSBParsedFormula; /* [MS-XLSB] 2.5.97.9 FRTParsedFormula */ //var parse_XLSBFRTParsedFormula = parse_XLSBParsedFormula2; /* [MS-XLSB] 2.5.97.12 NameParsedFormula */ var parse_XLSBNameParsedFormula = parse_XLSBParsedFormula; /* [MS-XLSB] 2.5.97.98 SharedParsedFormula */ var parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula; var Cetab = { 0: "BEEP", 1: "OPEN", 2: "OPEN.LINKS", 3: "CLOSE.ALL", 4: "SAVE", 5: "SAVE.AS", 6: "FILE.DELETE", 7: "PAGE.SETUP", 8: "PRINT", 9: "PRINTER.SETUP", 10: "QUIT", 11: "NEW.WINDOW", 12: "ARRANGE.ALL", 13: "WINDOW.SIZE", 14: "WINDOW.MOVE", 15: "FULL", 16: "CLOSE", 17: "RUN", 22: "SET.PRINT.AREA", 23: "SET.PRINT.TITLES", 24: "SET.PAGE.BREAK", 25: "REMOVE.PAGE.BREAK", 26: "FONT", 27: "DISPLAY", 28: "PROTECT.DOCUMENT", 29: "PRECISION", 30: "A1.R1C1", 31: "CALCULATE.NOW", 32: "CALCULATION", 34: "DATA.FIND", 35: "EXTRACT", 36: "DATA.DELETE", 37: "SET.DATABASE", 38: "SET.CRITERIA", 39: "SORT", 40: "DATA.SERIES", 41: "TABLE", 42: "FORMAT.NUMBER", 43: "ALIGNMENT", 44: "STYLE", 45: "BORDER", 46: "CELL.PROTECTION", 47: "COLUMN.WIDTH", 48: "UNDO", 49: "CUT", 50: "COPY", 51: "PASTE", 52: "CLEAR", 53: "PASTE.SPECIAL", 54: "EDIT.DELETE", 55: "INSERT", 56: "FILL.RIGHT", 57: "FILL.DOWN", 61: "DEFINE.NAME", 62: "CREATE.NAMES", 63: "FORMULA.GOTO", 64: "FORMULA.FIND", 65: "SELECT.LAST.CELL", 66: "SHOW.ACTIVE.CELL", 67: "GALLERY.AREA", 68: "GALLERY.BAR", 69: "GALLERY.COLUMN", 70: "GALLERY.LINE", 71: "GALLERY.PIE", 72: "GALLERY.SCATTER", 73: "COMBINATION", 74: "PREFERRED", 75: "ADD.OVERLAY", 76: "GRIDLINES", 77: "SET.PREFERRED", 78: "AXES", 79: "LEGEND", 80: "ATTACH.TEXT", 81: "ADD.ARROW", 82: "SELECT.CHART", 83: "SELECT.PLOT.AREA", 84: "PATTERNS", 85: "MAIN.CHART", 86: "OVERLAY", 87: "SCALE", 88: "FORMAT.LEGEND", 89: "FORMAT.TEXT", 90: "EDIT.REPEAT", 91: "PARSE", 92: "JUSTIFY", 93: "HIDE", 94: "UNHIDE", 95: "WORKSPACE", 96: "FORMULA", 97: "FORMULA.FILL", 98: "FORMULA.ARRAY", 99: "DATA.FIND.NEXT", 100: "DATA.FIND.PREV", 101: "FORMULA.FIND.NEXT", 102: "FORMULA.FIND.PREV", 103: "ACTIVATE", 104: "ACTIVATE.NEXT", 105: "ACTIVATE.PREV", 106: "UNLOCKED.NEXT", 107: "UNLOCKED.PREV", 108: "COPY.PICTURE", 109: "SELECT", 110: "DELETE.NAME", 111: "DELETE.FORMAT", 112: "VLINE", 113: "HLINE", 114: "VPAGE", 115: "HPAGE", 116: "VSCROLL", 117: "HSCROLL", 118: "ALERT", 119: "NEW", 120: "CANCEL.COPY", 121: "SHOW.CLIPBOARD", 122: "MESSAGE", 124: "PASTE.LINK", 125: "APP.ACTIVATE", 126: "DELETE.ARROW", 127: "ROW.HEIGHT", 128: "FORMAT.MOVE", 129: "FORMAT.SIZE", 130: "FORMULA.REPLACE", 131: "SEND.KEYS", 132: "SELECT.SPECIAL", 133: "APPLY.NAMES", 134: "REPLACE.FONT", 135: "FREEZE.PANES", 136: "SHOW.INFO", 137: "SPLIT", 138: "ON.WINDOW", 139: "ON.DATA", 140: "DISABLE.INPUT", 142: "OUTLINE", 143: "LIST.NAMES", 144: "FILE.CLOSE", 145: "SAVE.WORKBOOK", 146: "DATA.FORM", 147: "COPY.CHART", 148: "ON.TIME", 149: "WAIT", 150: "FORMAT.FONT", 151: "FILL.UP", 152: "FILL.LEFT", 153: "DELETE.OVERLAY", 155: "SHORT.MENUS", 159: "SET.UPDATE.STATUS", 161: "COLOR.PALETTE", 162: "DELETE.STYLE", 163: "WINDOW.RESTORE", 164: "WINDOW.MAXIMIZE", 166: "CHANGE.LINK", 167: "CALCULATE.DOCUMENT", 168: "ON.KEY", 169: "APP.RESTORE", 170: "APP.MOVE", 171: "APP.SIZE", 172: "APP.MINIMIZE", 173: "APP.MAXIMIZE", 174: "BRING.TO.FRONT", 175: "SEND.TO.BACK", 185: "MAIN.CHART.TYPE", 186: "OVERLAY.CHART.TYPE", 187: "SELECT.END", 188: "OPEN.MAIL", 189: "SEND.MAIL", 190: "STANDARD.FONT", 191: "CONSOLIDATE", 192: "SORT.SPECIAL", 193: "GALLERY.3D.AREA", 194: "GALLERY.3D.COLUMN", 195: "GALLERY.3D.LINE", 196: "GALLERY.3D.PIE", 197: "VIEW.3D", 198: "GOAL.SEEK", 199: "WORKGROUP", 200: "FILL.GROUP", 201: "UPDATE.LINK", 202: "PROMOTE", 203: "DEMOTE", 204: "SHOW.DETAIL", 206: "UNGROUP", 207: "OBJECT.PROPERTIES", 208: "SAVE.NEW.OBJECT", 209: "SHARE", 210: "SHARE.NAME", 211: "DUPLICATE", 212: "APPLY.STYLE", 213: "ASSIGN.TO.OBJECT", 214: "OBJECT.PROTECTION", 215: "HIDE.OBJECT", 216: "SET.EXTRACT", 217: "CREATE.PUBLISHER", 218: "SUBSCRIBE.TO", 219: "ATTRIBUTES", 220: "SHOW.TOOLBAR", 222: "PRINT.PREVIEW", 223: "EDIT.COLOR", 224: "SHOW.LEVELS", 225: "FORMAT.MAIN", 226: "FORMAT.OVERLAY", 227: "ON.RECALC", 228: "EDIT.SERIES", 229: "DEFINE.STYLE", 240: "LINE.PRINT", 243: "ENTER.DATA", 249: "GALLERY.RADAR", 250: "MERGE.STYLES", 251: "EDITION.OPTIONS", 252: "PASTE.PICTURE", 253: "PASTE.PICTURE.LINK", 254: "SPELLING", 256: "ZOOM", 259: "INSERT.OBJECT", 260: "WINDOW.MINIMIZE", 265: "SOUND.NOTE", 266: "SOUND.PLAY", 267: "FORMAT.SHAPE", 268: "EXTEND.POLYGON", 269: "FORMAT.AUTO", 272: "GALLERY.3D.BAR", 273: "GALLERY.3D.SURFACE", 274: "FILL.AUTO", 276: "CUSTOMIZE.TOOLBAR", 277: "ADD.TOOL", 278: "EDIT.OBJECT", 279: "ON.DOUBLECLICK", 280: "ON.ENTRY", 281: "WORKBOOK.ADD", 282: "WORKBOOK.MOVE", 283: "WORKBOOK.COPY", 284: "WORKBOOK.OPTIONS", 285: "SAVE.WORKSPACE", 288: "CHART.WIZARD", 289: "DELETE.TOOL", 290: "MOVE.TOOL", 291: "WORKBOOK.SELECT", 292: "WORKBOOK.ACTIVATE", 293: "ASSIGN.TO.TOOL", 295: "COPY.TOOL", 296: "RESET.TOOL", 297: "CONSTRAIN.NUMERIC", 298: "PASTE.TOOL", 302: "WORKBOOK.NEW", 305: "SCENARIO.CELLS", 306: "SCENARIO.DELETE", 307: "SCENARIO.ADD", 308: "SCENARIO.EDIT", 309: "SCENARIO.SHOW", 310: "SCENARIO.SHOW.NEXT", 311: "SCENARIO.SUMMARY", 312: "PIVOT.TABLE.WIZARD", 313: "PIVOT.FIELD.PROPERTIES", 314: "PIVOT.FIELD", 315: "PIVOT.ITEM", 316: "PIVOT.ADD.FIELDS", 318: "OPTIONS.CALCULATION", 319: "OPTIONS.EDIT", 320: "OPTIONS.VIEW", 321: "ADDIN.MANAGER", 322: "MENU.EDITOR", 323: "ATTACH.TOOLBARS", 324: "VBAActivate", 325: "OPTIONS.CHART", 328: "VBA.INSERT.FILE", 330: "VBA.PROCEDURE.DEFINITION", 336: "ROUTING.SLIP", 338: "ROUTE.DOCUMENT", 339: "MAIL.LOGON", 342: "INSERT.PICTURE", 343: "EDIT.TOOL", 344: "GALLERY.DOUGHNUT", 350: "CHART.TREND", 352: "PIVOT.ITEM.PROPERTIES", 354: "WORKBOOK.INSERT", 355: "OPTIONS.TRANSITION", 356: "OPTIONS.GENERAL", 370: "FILTER.ADVANCED", 373: "MAIL.ADD.MAILER", 374: "MAIL.DELETE.MAILER", 375: "MAIL.REPLY", 376: "MAIL.REPLY.ALL", 377: "MAIL.FORWARD", 378: "MAIL.NEXT.LETTER", 379: "DATA.LABEL", 380: "INSERT.TITLE", 381: "FONT.PROPERTIES", 382: "MACRO.OPTIONS", 383: "WORKBOOK.HIDE", 384: "WORKBOOK.UNHIDE", 385: "WORKBOOK.DELETE", 386: "WORKBOOK.NAME", 388: "GALLERY.CUSTOM", 390: "ADD.CHART.AUTOFORMAT", 391: "DELETE.CHART.AUTOFORMAT", 392: "CHART.ADD.DATA", 393: "AUTO.OUTLINE", 394: "TAB.ORDER", 395: "SHOW.DIALOG", 396: "SELECT.ALL", 397: "UNGROUP.SHEETS", 398: "SUBTOTAL.CREATE", 399: "SUBTOTAL.REMOVE", 400: "RENAME.OBJECT", 412: "WORKBOOK.SCROLL", 413: "WORKBOOK.NEXT", 414: "WORKBOOK.PREV", 415: "WORKBOOK.TAB.SPLIT", 416: "FULL.SCREEN", 417: "WORKBOOK.PROTECT", 420: "SCROLLBAR.PROPERTIES", 421: "PIVOT.SHOW.PAGES", 422: "TEXT.TO.COLUMNS", 423: "FORMAT.CHARTTYPE", 424: "LINK.FORMAT", 425: "TRACER.DISPLAY", 430: "TRACER.NAVIGATE", 431: "TRACER.CLEAR", 432: "TRACER.ERROR", 433: "PIVOT.FIELD.GROUP", 434: "PIVOT.FIELD.UNGROUP", 435: "CHECKBOX.PROPERTIES", 436: "LABEL.PROPERTIES", 437: "LISTBOX.PROPERTIES", 438: "EDITBOX.PROPERTIES", 439: "PIVOT.REFRESH", 440: "LINK.COMBO", 441: "OPEN.TEXT", 442: "HIDE.DIALOG", 443: "SET.DIALOG.FOCUS", 444: "ENABLE.OBJECT", 445: "PUSHBUTTON.PROPERTIES", 446: "SET.DIALOG.DEFAULT", 447: "FILTER", 448: "FILTER.SHOW.ALL", 449: "CLEAR.OUTLINE", 450: "FUNCTION.WIZARD", 451: "ADD.LIST.ITEM", 452: "SET.LIST.ITEM", 453: "REMOVE.LIST.ITEM", 454: "SELECT.LIST.ITEM", 455: "SET.CONTROL.VALUE", 456: "SAVE.COPY.AS", 458: "OPTIONS.LISTS.ADD", 459: "OPTIONS.LISTS.DELETE", 460: "SERIES.AXES", 461: "SERIES.X", 462: "SERIES.Y", 463: "ERRORBAR.X", 464: "ERRORBAR.Y", 465: "FORMAT.CHART", 466: "SERIES.ORDER", 467: "MAIL.LOGOFF", 468: "CLEAR.ROUTING.SLIP", 469: "APP.ACTIVATE.MICROSOFT", 470: "MAIL.EDIT.MAILER", 471: "ON.SHEET", 472: "STANDARD.WIDTH", 473: "SCENARIO.MERGE", 474: "SUMMARY.INFO", 475: "FIND.FILE", 476: "ACTIVE.CELL.FONT", 477: "ENABLE.TIPWIZARD", 478: "VBA.MAKE.ADDIN", 480: "INSERTDATATABLE", 481: "WORKGROUP.OPTIONS", 482: "MAIL.SEND.MAILER", 485: "AUTOCORRECT", 489: "POST.DOCUMENT", 491: "PICKLIST", 493: "VIEW.SHOW", 494: "VIEW.DEFINE", 495: "VIEW.DELETE", 509: "SHEET.BACKGROUND", 510: "INSERT.MAP.OBJECT", 511: "OPTIONS.MENONO", 517: "MSOCHECKS", 518: "NORMAL", 519: "LAYOUT", 520: "RM.PRINT.AREA", 521: "CLEAR.PRINT.AREA", 522: "ADD.PRINT.AREA", 523: "MOVE.BRK", 545: "HIDECURR.NOTE", 546: "HIDEALL.NOTES", 547: "DELETE.NOTE", 548: "TRAVERSE.NOTES", 549: "ACTIVATE.NOTES", 620: "PROTECT.REVISIONS", 621: "UNPROTECT.REVISIONS", 647: "OPTIONS.ME", 653: "WEB.PUBLISH", 667: "NEWWEBQUERY", 673: "PIVOT.TABLE.CHART", 753: "OPTIONS.SAVE", 755: "OPTIONS.SPELL", 808: "HIDEALL.INKANNOTS" }; var Ftab = { 0: "COUNT", 1: "IF", 2: "ISNA", 3: "ISERROR", 4: "SUM", 5: "AVERAGE", 6: "MIN", 7: "MAX", 8: "ROW", 9: "COLUMN", 10: "NA", 11: "NPV", 12: "STDEV", 13: "DOLLAR", 14: "FIXED", 15: "SIN", 16: "COS", 17: "TAN", 18: "ATAN", 19: "PI", 20: "SQRT", 21: "EXP", 22: "LN", 23: "LOG10", 24: "ABS", 25: "INT", 26: "SIGN", 27: "ROUND", 28: "LOOKUP", 29: "INDEX", 30: "REPT", 31: "MID", 32: "LEN", 33: "VALUE", 34: "TRUE", 35: "FALSE", 36: "AND", 37: "OR", 38: "NOT", 39: "MOD", 40: "DCOUNT", 41: "DSUM", 42: "DAVERAGE", 43: "DMIN", 44: "DMAX", 45: "DSTDEV", 46: "VAR", 47: "DVAR", 48: "TEXT", 49: "LINEST", 50: "TREND", 51: "LOGEST", 52: "GROWTH", 53: "GOTO", 54: "HALT", 55: "RETURN", 56: "PV", 57: "FV", 58: "NPER", 59: "PMT", 60: "RATE", 61: "MIRR", 62: "IRR", 63: "RAND", 64: "MATCH", 65: "DATE", 66: "TIME", 67: "DAY", 68: "MONTH", 69: "YEAR", 70: "WEEKDAY", 71: "HOUR", 72: "MINUTE", 73: "SECOND", 74: "NOW", 75: "AREAS", 76: "ROWS", 77: "COLUMNS", 78: "OFFSET", 79: "ABSREF", 80: "RELREF", 81: "ARGUMENT", 82: "SEARCH", 83: "TRANSPOSE", 84: "ERROR", 85: "STEP", 86: "TYPE", 87: "ECHO", 88: "SET.NAME", 89: "CALLER", 90: "DEREF", 91: "WINDOWS", 92: "SERIES", 93: "DOCUMENTS", 94: "ACTIVE.CELL", 95: "SELECTION", 96: "RESULT", 97: "ATAN2", 98: "ASIN", 99: "ACOS", 100: "CHOOSE", 101: "HLOOKUP", 102: "VLOOKUP", 103: "LINKS", 104: "INPUT", 105: "ISREF", 106: "GET.FORMULA", 107: "GET.NAME", 108: "SET.VALUE", 109: "LOG", 110: "EXEC", 111: "CHAR", 112: "LOWER", 113: "UPPER", 114: "PROPER", 115: "LEFT", 116: "RIGHT", 117: "EXACT", 118: "TRIM", 119: "REPLACE", 120: "SUBSTITUTE", 121: "CODE", 122: "NAMES", 123: "DIRECTORY", 124: "FIND", 125: "CELL", 126: "ISERR", 127: "ISTEXT", 128: "ISNUMBER", 129: "ISBLANK", 130: "T", 131: "N", 132: "FOPEN", 133: "FCLOSE", 134: "FSIZE", 135: "FREADLN", 136: "FREAD", 137: "FWRITELN", 138: "FWRITE", 139: "FPOS", 140: "DATEVALUE", 141: "TIMEVALUE", 142: "SLN", 143: "SYD", 144: "DDB", 145: "GET.DEF", 146: "REFTEXT", 147: "TEXTREF", 148: "INDIRECT", 149: "REGISTER", 150: "CALL", 151: "ADD.BAR", 152: "ADD.MENU", 153: "ADD.COMMAND", 154: "ENABLE.COMMAND", 155: "CHECK.COMMAND", 156: "RENAME.COMMAND", 157: "SHOW.BAR", 158: "DELETE.MENU", 159: "DELETE.COMMAND", 160: "GET.CHART.ITEM", 161: "DIALOG.BOX", 162: "CLEAN", 163: "MDETERM", 164: "MINVERSE", 165: "MMULT", 166: "FILES", 167: "IPMT", 168: "PPMT", 169: "COUNTA", 170: "CANCEL.KEY", 171: "FOR", 172: "WHILE", 173: "BREAK", 174: "NEXT", 175: "INITIATE", 176: "REQUEST", 177: "POKE", 178: "EXECUTE", 179: "TERMINATE", 180: "RESTART", 181: "HELP", 182: "GET.BAR", 183: "PRODUCT", 184: "FACT", 185: "GET.CELL", 186: "GET.WORKSPACE", 187: "GET.WINDOW", 188: "GET.DOCUMENT", 189: "DPRODUCT", 190: "ISNONTEXT", 191: "GET.NOTE", 192: "NOTE", 193: "STDEVP", 194: "VARP", 195: "DSTDEVP", 196: "DVARP", 197: "TRUNC", 198: "ISLOGICAL", 199: "DCOUNTA", 200: "DELETE.BAR", 201: "UNREGISTER", 204: "USDOLLAR", 205: "FINDB", 206: "SEARCHB", 207: "REPLACEB", 208: "LEFTB", 209: "RIGHTB", 210: "MIDB", 211: "LENB", 212: "ROUNDUP", 213: "ROUNDDOWN", 214: "ASC", 215: "DBCS", 216: "RANK", 219: "ADDRESS", 220: "DAYS360", 221: "TODAY", 222: "VDB", 223: "ELSE", 224: "ELSE.IF", 225: "END.IF", 226: "FOR.CELL", 227: "MEDIAN", 228: "SUMPRODUCT", 229: "SINH", 230: "COSH", 231: "TANH", 232: "ASINH", 233: "ACOSH", 234: "ATANH", 235: "DGET", 236: "CREATE.OBJECT", 237: "VOLATILE", 238: "LAST.ERROR", 239: "CUSTOM.UNDO", 240: "CUSTOM.REPEAT", 241: "FORMULA.CONVERT", 242: "GET.LINK.INFO", 243: "TEXT.BOX", 244: "INFO", 245: "GROUP", 246: "GET.OBJECT", 247: "DB", 248: "PAUSE", 251: "RESUME", 252: "FREQUENCY", 253: "ADD.TOOLBAR", 254: "DELETE.TOOLBAR", 255: "User", 256: "RESET.TOOLBAR", 257: "EVALUATE", 258: "GET.TOOLBAR", 259: "GET.TOOL", 260: "SPELLING.CHECK", 261: "ERROR.TYPE", 262: "APP.TITLE", 263: "WINDOW.TITLE", 264: "SAVE.TOOLBAR", 265: "ENABLE.TOOL", 266: "PRESS.TOOL", 267: "REGISTER.ID", 268: "GET.WORKBOOK", 269: "AVEDEV", 270: "BETADIST", 271: "GAMMALN", 272: "BETAINV", 273: "BINOMDIST", 274: "CHIDIST", 275: "CHIINV", 276: "COMBIN", 277: "CONFIDENCE", 278: "CRITBINOM", 279: "EVEN", 280: "EXPONDIST", 281: "FDIST", 282: "FINV", 283: "FISHER", 284: "FISHERINV", 285: "FLOOR", 286: "GAMMADIST", 287: "GAMMAINV", 288: "CEILING", 289: "HYPGEOMDIST", 290: "LOGNORMDIST", 291: "LOGINV", 292: "NEGBINOMDIST", 293: "NORMDIST", 294: "NORMSDIST", 295: "NORMINV", 296: "NORMSINV", 297: "STANDARDIZE", 298: "ODD", 299: "PERMUT", 300: "POISSON", 301: "TDIST", 302: "WEIBULL", 303: "SUMXMY2", 304: "SUMX2MY2", 305: "SUMX2PY2", 306: "CHITEST", 307: "CORREL", 308: "COVAR", 309: "FORECAST", 310: "FTEST", 311: "INTERCEPT", 312: "PEARSON", 313: "RSQ", 314: "STEYX", 315: "SLOPE", 316: "TTEST", 317: "PROB", 318: "DEVSQ", 319: "GEOMEAN", 320: "HARMEAN", 321: "SUMSQ", 322: "KURT", 323: "SKEW", 324: "ZTEST", 325: "LARGE", 326: "SMALL", 327: "QUARTILE", 328: "PERCENTILE", 329: "PERCENTRANK", 330: "MODE", 331: "TRIMMEAN", 332: "TINV", 334: "MOVIE.COMMAND", 335: "GET.MOVIE", 336: "CONCATENATE", 337: "POWER", 338: "PIVOT.ADD.DATA", 339: "GET.PIVOT.TABLE", 340: "GET.PIVOT.FIELD", 341: "GET.PIVOT.ITEM", 342: "RADIANS", 343: "DEGREES", 344: "SUBTOTAL", 345: "SUMIF", 346: "COUNTIF", 347: "COUNTBLANK", 348: "SCENARIO.GET", 349: "OPTIONS.LISTS.GET", 350: "ISPMT", 351: "DATEDIF", 352: "DATESTRING", 353: "NUMBERSTRING", 354: "ROMAN", 355: "OPEN.DIALOG", 356: "SAVE.DIALOG", 357: "VIEW.GET", 358: "GETPIVOTDATA", 359: "HYPERLINK", 360: "PHONETIC", 361: "AVERAGEA", 362: "MAXA", 363: "MINA", 364: "STDEVPA", 365: "VARPA", 366: "STDEVA", 367: "VARA", 368: "BAHTTEXT", 369: "THAIDAYOFWEEK", 370: "THAIDIGIT", 371: "THAIMONTHOFYEAR", 372: "THAINUMSOUND", 373: "THAINUMSTRING", 374: "THAISTRINGLENGTH", 375: "ISTHAIDIGIT", 376: "ROUNDBAHTDOWN", 377: "ROUNDBAHTUP", 378: "THAIYEAR", 379: "RTD", 380: "CUBEVALUE", 381: "CUBEMEMBER", 382: "CUBEMEMBERPROPERTY", 383: "CUBERANKEDMEMBER", 384: "HEX2BIN", 385: "HEX2DEC", 386: "HEX2OCT", 387: "DEC2BIN", 388: "DEC2HEX", 389: "DEC2OCT", 390: "OCT2BIN", 391: "OCT2HEX", 392: "OCT2DEC", 393: "BIN2DEC", 394: "BIN2OCT", 395: "BIN2HEX", 396: "IMSUB", 397: "IMDIV", 398: "IMPOWER", 399: "IMABS", 400: "IMSQRT", 401: "IMLN", 402: "IMLOG2", 403: "IMLOG10", 404: "IMSIN", 405: "IMCOS", 406: "IMEXP", 407: "IMARGUMENT", 408: "IMCONJUGATE", 409: "IMAGINARY", 410: "IMREAL", 411: "COMPLEX", 412: "IMSUM", 413: "IMPRODUCT", 414: "SERIESSUM", 415: "FACTDOUBLE", 416: "SQRTPI", 417: "QUOTIENT", 418: "DELTA", 419: "GESTEP", 420: "ISEVEN", 421: "ISODD", 422: "MROUND", 423: "ERF", 424: "ERFC", 425: "BESSELJ", 426: "BESSELK", 427: "BESSELY", 428: "BESSELI", 429: "XIRR", 430: "XNPV", 431: "PRICEMAT", 432: "YIELDMAT", 433: "INTRATE", 434: "RECEIVED", 435: "DISC", 436: "PRICEDISC", 437: "YIELDDISC", 438: "TBILLEQ", 439: "TBILLPRICE", 440: "TBILLYIELD", 441: "PRICE", 442: "YIELD", 443: "DOLLARDE", 444: "DOLLARFR", 445: "NOMINAL", 446: "EFFECT", 447: "CUMPRINC", 448: "CUMIPMT", 449: "EDATE", 450: "EOMONTH", 451: "YEARFRAC", 452: "COUPDAYBS", 453: "COUPDAYS", 454: "COUPDAYSNC", 455: "COUPNCD", 456: "COUPNUM", 457: "COUPPCD", 458: "DURATION", 459: "MDURATION", 460: "ODDLPRICE", 461: "ODDLYIELD", 462: "ODDFPRICE", 463: "ODDFYIELD", 464: "RANDBETWEEN", 465: "WEEKNUM", 466: "AMORDEGRC", 467: "AMORLINC", 468: "CONVERT", 724: "SHEETJS", 469: "ACCRINT", 470: "ACCRINTM", 471: "WORKDAY", 472: "NETWORKDAYS", 473: "GCD", 474: "MULTINOMIAL", 475: "LCM", 476: "FVSCHEDULE", 477: "CUBEKPIMEMBER", 478: "CUBESET", 479: "CUBESETCOUNT", 480: "IFERROR", 481: "COUNTIFS", 482: "SUMIFS", 483: "AVERAGEIF", 484: "AVERAGEIFS" }; var FtabArgc = { 2: 1, 3: 1, 10: 0, 15: 1, 16: 1, 17: 1, 18: 1, 19: 0, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 2, 30: 2, 31: 3, 32: 1, 33: 1, 34: 0, 35: 0, 38: 1, 39: 2, 40: 3, 41: 3, 42: 3, 43: 3, 44: 3, 45: 3, 47: 3, 48: 2, 53: 1, 61: 3, 63: 0, 65: 3, 66: 3, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 0, 75: 1, 76: 1, 77: 1, 79: 2, 80: 2, 83: 1, 85: 0, 86: 1, 89: 0, 90: 1, 94: 0, 95: 0, 97: 2, 98: 1, 99: 1, 101: 3, 102: 3, 105: 1, 106: 1, 108: 2, 111: 1, 112: 1, 113: 1, 114: 1, 117: 2, 118: 1, 119: 4, 121: 1, 126: 1, 127: 1, 128: 1, 129: 1, 130: 1, 131: 1, 133: 1, 134: 1, 135: 1, 136: 2, 137: 2, 138: 2, 140: 1, 141: 1, 142: 3, 143: 4, 144: 4, 161: 1, 162: 1, 163: 1, 164: 1, 165: 2, 172: 1, 175: 2, 176: 2, 177: 3, 178: 2, 179: 1, 184: 1, 186: 1, 189: 3, 190: 1, 195: 3, 196: 3, 197: 1, 198: 1, 199: 3, 201: 1, 207: 4, 210: 3, 211: 1, 212: 2, 213: 2, 214: 1, 215: 1, 225: 0, 229: 1, 230: 1, 231: 1, 232: 1, 233: 1, 234: 1, 235: 3, 244: 1, 247: 4, 252: 2, 257: 1, 261: 1, 271: 1, 273: 4, 274: 2, 275: 2, 276: 2, 277: 3, 278: 3, 279: 1, 280: 3, 281: 3, 282: 3, 283: 1, 284: 1, 285: 2, 286: 4, 287: 3, 288: 2, 289: 4, 290: 3, 291: 3, 292: 3, 293: 4, 294: 1, 295: 3, 296: 1, 297: 3, 298: 1, 299: 2, 300: 3, 301: 3, 302: 4, 303: 2, 304: 2, 305: 2, 306: 2, 307: 2, 308: 2, 309: 3, 310: 2, 311: 2, 312: 2, 313: 2, 314: 2, 315: 2, 316: 4, 325: 2, 326: 2, 327: 2, 328: 2, 331: 2, 332: 2, 337: 2, 342: 1, 343: 1, 346: 2, 347: 1, 350: 4, 351: 3, 352: 1, 353: 2, 360: 1, 368: 1, 369: 1, 370: 1, 371: 1, 372: 1, 373: 1, 374: 1, 375: 1, 376: 1, 377: 1, 378: 1, 382: 3, 385: 1, 392: 1, 393: 1, 396: 2, 397: 2, 398: 2, 399: 1, 400: 1, 401: 1, 402: 1, 403: 1, 404: 1, 405: 1, 406: 1, 407: 1, 408: 1, 409: 1, 410: 1, 414: 4, 415: 1, 416: 1, 417: 2, 420: 1, 421: 1, 422: 2, 424: 1, 425: 2, 426: 2, 427: 2, 428: 2, 430: 3, 438: 3, 439: 3, 440: 3, 443: 2, 444: 2, 445: 2, 446: 2, 447: 6, 448: 6, 449: 2, 450: 2, 464: 2, 468: 3, 476: 2, 479: 1, 480: 2, 65535: 0 }; /* Part 3 TODO: actually parse formulae */ function ods_to_csf_formula(f/*:string*/)/*:string*/ { if(f.slice(0,3) == "of:") f = f.slice(3); /* 5.2 Basic Expressions */ if(f.charCodeAt(0) == 61) { f = f.slice(1); if(f.charCodeAt(0) == 61) f = f.slice(1); } f = f.replace(/COM\.MICROSOFT\./g, ""); /* Part 3 Section 5.8 References */ f = f.replace(/\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g, function($$, $1) { return $1.replace(/\./g,""); }); /* TODO: something other than this */ f = f.replace(/\[.(#[A-Z]*[?!])\]/g, "$1"); return f.replace(/[;~]/g,",").replace(/\|/g,";"); } function csf_to_ods_formula(f/*:string*/)/*:string*/ { var o = "of:=" + f.replace(crefregex, "$1[.$2$3$4$5]").replace(/\]:\[/g,":"); /* TODO: something other than this */ return o.replace(/;/g, "|").replace(/,/g,";"); } function ods_to_csf_3D(r/*:string*/)/*:[string, string]*/ { var a = r.split(":"); var s = a[0].split(".")[0]; return [s, a[0].split(".")[1] + (a.length > 1 ? (":" + (a[1].split(".")[1] || a[1].split(".")[0])) : "")]; } function csf_to_ods_3D(r/*:string*/)/*:string*/ { return r.replace(/\./,"!"); } var strs = {}; // shared strings var _ssfopts = {}; // spreadsheet formatting options /*global Map */ var browser_has_Map = typeof Map !== 'undefined'; function get_sst_id(sst/*:SST*/, str/*:string*/, rev)/*:number*/ { var i = 0, len = sst.length; if(rev) { if(browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) { var revarr = browser_has_Map ? rev.get(str) : rev[str]; for(; i < revarr.length; ++i) { if(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; } } } } else for(; i < len; ++i) { if(sst[i].t === str) { sst.Count ++; return i; } } sst[len] = ({t:str}/*:any*/); sst.Count ++; sst.Unique ++; if(rev) { if(browser_has_Map) { if(!rev.has(str)) rev.set(str, []); rev.get(str).push(len); } else { if(!Object.prototype.hasOwnProperty.call(rev, str)) rev[str] = []; rev[str].push(len); } } return len; } function col_obj_w(C/*:number*/, col) { var p = ({min:C+1,max:C+1}/*:any*/); /* wch (chars), wpx (pixels) */ var wch = -1; if(col.MDW) MDW = col.MDW; if(col.width != null) p.customWidth = 1; else if(col.wpx != null) wch = px2char(col.wpx); else if(col.wch != null) wch = col.wch; if(wch > -1) { p.width = char2width(wch); p.customWidth = 1; } else if(col.width != null) p.width = col.width; if(col.hidden) p.hidden = true; if(col.level != null) { p.outlineLevel = p.level = col.level; } return p; } function default_margins(margins/*:Margins*/, mode/*:?string*/) { if(!margins) return; var defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3]; if(mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5]; if(margins.left == null) margins.left = defs[0]; if(margins.right == null) margins.right = defs[1]; if(margins.top == null) margins.top = defs[2]; if(margins.bottom == null) margins.bottom = defs[3]; if(margins.header == null) margins.header = defs[4]; if(margins.footer == null) margins.footer = defs[5]; } function get_cell_style(styles/*:Array*/, cell/*:Cell*/, opts) { var z = opts.revssf[cell.z != null ? cell.z : "General"]; var i = 0x3c, len = styles.length; if(z == null && opts.ssf) { for(; i < 0x188; ++i) if(opts.ssf[i] == null) { SSF_load(cell.z, i); // $FlowIgnore opts.ssf[i] = cell.z; opts.revssf[cell.z] = z = i; break; } } for(i = 0; i != len; ++i) if(styles[i].numFmtId === z) return i; styles[len] = { numFmtId:z, fontId:0, fillId:0, borderId:0, xfId:0, applyNumberFormat:1 }; return len; } function safe_format(p/*:Cell*/, fmtid/*:number*/, fillid/*:?number*/, opts, themes, styles) { try { if(opts.cellNF) p.z = table_fmt[fmtid]; } catch(e) { if(opts.WTF) throw e; } if(p.t === 'z' && !opts.cellStyles) return; if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v); if((!opts || opts.cellText !== false) && p.t !== 'z') try { if(table_fmt[fmtid] == null) SSF_load(SSFImplicit[fmtid] || "General", fmtid); if(p.t === 'e') p.w = p.w || BErr[p.v]; else if(fmtid === 0) { if(p.t === 'n') { if((p.v|0) === p.v) p.w = p.v.toString(10); else p.w = SSF_general_num(p.v); } else if(p.t === 'd') { var dd = datenum(p.v); if((dd|0) === dd) p.w = dd.toString(10); else p.w = SSF_general_num(dd); } else if(p.v === undefined) return ""; else p.w = SSF_general(p.v,_ssfopts); } else if(p.t === 'd') p.w = SSF_format(fmtid,datenum(p.v),_ssfopts); else p.w = SSF_format(fmtid,p.v,_ssfopts); } catch(e) { if(opts.WTF) throw e; } if(!opts.cellStyles) return; if(fillid != null) try { p.s = styles.Fills[fillid]; if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) { p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0); if(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb; } if (p.s.bgColor && p.s.bgColor.theme) { p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0); if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb; } } catch(e) { if(opts.WTF && styles.Fills) throw e; } } function check_ws(ws/*:Worksheet*/, sname/*:string*/, i/*:number*/) { if(ws && ws['!ref']) { var range = safe_decode_range(ws['!ref']); if(range.e.c < range.s.c || range.e.r < range.s.r) throw new Error("Bad range (" + i + "): " + ws['!ref']); } } function parse_ws_xml_dim(ws/*:Worksheet*/, s/*:string*/) { var d = safe_decode_range(s); if(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws["!ref"] = encode_range(d); } var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g; var sheetdataregex = /<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/; var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg; var dimregex = /"(\w*:\w*)"/; var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g; var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g; var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g; var sheetprregex = /<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/; var sheetprregex2= /<(?:\w:)?sheetPr[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetPr)>/; var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/; /* 18.3 Worksheets */ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBProps*/, themes, styles)/*:Worksheet*/ { if(!data) return data; if(!rels) rels = {'!id':{}}; if(DENSE != null && opts.dense == null) opts.dense = DENSE; /* 18.3.1.99 worksheet CT_Worksheet */ var s = opts.dense ? ([]/*:any*/) : ({}/*:any*/); var refguess/*:Range*/ = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} }/*:any*/); var data1 = "", data2 = ""; var mtch/*:?any*/ = data.match(sheetdataregex); if(mtch) { data1 = data.slice(0, mtch.index); data2 = data.slice(mtch.index + mtch[0].length); } else data1 = data2 = data; /* 18.3.1.82 sheetPr CT_SheetPr */ var sheetPr = data1.match(sheetprregex); if(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx); else if((sheetPr = data1.match(sheetprregex2))) parse_ws_xml_sheetpr2(sheetPr[0], sheetPr[1]||"", s, wb, idx, styles, themes); /* 18.3.1.35 dimension CT_SheetDimension */ var ridx = (data1.match(/<(?:\w*:)?dimension/)||{index:-1}).index; if(ridx > 0) { var ref = data1.slice(ridx,ridx+50).match(dimregex); if(ref) parse_ws_xml_dim(s, ref[1]); } /* 18.3.1.88 sheetViews CT_SheetViews */ var svs = data1.match(svsregex); if(svs && svs[1]) parse_ws_xml_sheetviews(svs[1], wb); /* 18.3.1.17 cols CT_Cols */ var columns/*:Array*/ = []; if(opts.cellStyles) { /* 18.3.1.13 col CT_Col */ var cols = data1.match(colregex); if(cols) parse_ws_xml_cols(columns, cols); } /* 18.3.1.80 sheetData CT_SheetData ? */ if(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles); /* 18.3.1.2 autoFilter CT_AutoFilter */ var afilter = data2.match(afregex); if(afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]); /* 18.3.1.55 mergeCells CT_MergeCells */ var merges/*:Array*/ = []; var _merge = data2.match(mergecregex); if(_merge) for(ridx = 0; ridx != _merge.length; ++ridx) merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"")+1)); /* 18.3.1.48 hyperlinks CT_Hyperlinks */ var hlink = data2.match(hlinkregex); if(hlink) parse_ws_xml_hlinks(s, hlink, rels); /* 18.3.1.62 pageMargins CT_PageMargins */ var margins = data2.match(marginregex); if(margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0])); if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess); if(opts.sheetRows > 0 && s["!ref"]) { var tmpref = safe_decode_range(s["!ref"]); if(opts.sheetRows <= +tmpref.e.r) { tmpref.e.r = opts.sheetRows - 1; if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r; if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r; if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c; if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c; s["!fullref"] = s["!ref"]; s["!ref"] = encode_range(tmpref); } } if(columns.length > 0) s["!cols"] = columns; if(merges.length > 0) s["!merges"] = merges; return s; } function write_ws_xml_merges(merges/*:Array*/)/*:string*/ { if(merges.length === 0) return ""; var o = ''; for(var i = 0; i != merges.length; ++i) o += ''; return o + ''; } /* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */ function parse_ws_xml_sheetpr(sheetPr/*:string*/, s, wb/*:WBWBProps*/, idx/*:number*/) { var data = parsexmltag(sheetPr); if(!wb.Sheets[idx]) wb.Sheets[idx] = {}; if(data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName)); } function parse_ws_xml_sheetpr2(sheetPr/*:string*/, body/*:string*/, s, wb/*:WBWBProps*/, idx/*:number*/) { parse_ws_xml_sheetpr(sheetPr.slice(0, sheetPr.indexOf(">")), s, wb, idx); } function write_ws_xml_sheetpr(ws, wb, idx, opts, o) { var needed = false; var props = {}, payload = null; if(opts.bookType !== 'xlsx' && wb.vbaraw) { var cname = wb.SheetNames[idx]; try { if(wb.Workbook) cname = wb.Workbook.Sheets[idx].CodeName || cname; } catch(e) {} needed = true; props.codeName = utf8write(escapexml(cname)); } if(ws && ws["!outline"]) { var outlineprops = {summaryBelow:1, summaryRight:1}; if(ws["!outline"].above) outlineprops.summaryBelow = 0; if(ws["!outline"].left) outlineprops.summaryRight = 0; payload = (payload||"") + writextag('outlinePr', null, outlineprops); } if(!needed && !payload) return; o[o.length] = (writextag('sheetPr', payload, props)); } /* 18.3.1.85 sheetProtection CT_SheetProtection */ var sheetprot_deffalse = ["objects", "scenarios", "selectLockedCells", "selectUnlockedCells"]; var sheetprot_deftrue = [ "formatColumns", "formatRows", "formatCells", "insertColumns", "insertRows", "insertHyperlinks", "deleteColumns", "deleteRows", "sort", "autoFilter", "pivotTables" ]; function write_ws_xml_protection(sp)/*:string*/ { // algorithmName, hashValue, saltValue, spinCount var o = ({sheet:1}/*:any*/); sheetprot_deffalse.forEach(function(n) { if(sp[n] != null && sp[n]) o[n] = "1"; }); sheetprot_deftrue.forEach(function(n) { if(sp[n] != null && !sp[n]) o[n] = "0"; }); /* TODO: algorithm */ if(sp.password) o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase(); return writextag('sheetProtection', null, o); } function parse_ws_xml_hlinks(s, data/*:Array*/, rels) { var dense = Array.isArray(s); for(var i = 0; i != data.length; ++i) { var val = parsexmltag(utf8read(data[i]), true); if(!val.ref) return; var rel = ((rels || {})['!id']||[])[val.id]; if(rel) { val.Target = rel.Target; if(val.location) val.Target += "#"+unescapexml(val.location); } else { val.Target = "#" + unescapexml(val.location); rel = {Target: val.Target, TargetMode: 'Internal'}; } val.Rel = rel; if(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; } var rng = safe_decode_range(val.ref); for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) { var addr = encode_cell({c:C,r:R}); if(dense) { if(!s[R]) s[R] = []; if(!s[R][C]) s[R][C] = {t:"z",v:undefined}; s[R][C].l = val; } else { if(!s[addr]) s[addr] = {t:"z",v:undefined}; s[addr].l = val; } } } } function parse_ws_xml_margins(margin) { var o = {}; ["left", "right", "top", "bottom", "header", "footer"].forEach(function(k) { if(margin[k]) o[k] = parseFloat(margin[k]); }); return o; } function write_ws_xml_margins(margin)/*:string*/ { default_margins(margin); return writextag('pageMargins', null, margin); } function parse_ws_xml_cols(columns, cols) { var seencol = false; for(var coli = 0; coli != cols.length; ++coli) { var coll = parsexmltag(cols[coli], true); if(coll.hidden) coll.hidden = parsexmlbool(coll.hidden); var colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1; if(coll.outlineLevel) coll.level = (+coll.outlineLevel || 0); delete coll.min; delete coll.max; coll.width = +coll.width; if(!seencol && coll.width) { seencol = true; find_mdw_colw(coll.width); } process_col(coll); while(colm <= colM) columns[colm++] = dup(coll); } } function write_ws_xml_cols(ws, cols)/*:string*/ { var o = [""], col; for(var i = 0; i != cols.length; ++i) { if(!(col = cols[i])) continue; o[o.length] = (writextag('col', null, col_obj_w(i, col))); } o[o.length] = ""; return o.join(""); } function parse_ws_xml_autofilter(data/*:string*/) { var o = { ref: (data.match(/ref="([^"]*)"/)||[])[1]}; return o; } function write_ws_xml_autofilter(data, ws, wb, idx)/*:string*/ { var ref = typeof data.ref == "string" ? data.ref : encode_range(data.ref); if(!wb.Workbook) wb.Workbook = ({Sheets:[]}/*:any*/); if(!wb.Workbook.Names) wb.Workbook.Names = []; var names/*: Array */ = wb.Workbook.Names; var range = decode_range(ref); if(range.s.r == range.e.r) { range.e.r = decode_range(ws["!ref"]).e.r; ref = encode_range(range); } for(var i = 0; i < names.length; ++i) { var name = names[i]; if(name.Name != '_xlnm._FilterDatabase') continue; if(name.Sheet != idx) continue; name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref; break; } if(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref }); return writextag("autoFilter", null, {ref:ref}); } /* 18.3.1.88 sheetViews CT_SheetViews */ /* 18.3.1.87 sheetView CT_SheetView */ var sviewregex = /<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/; function parse_ws_xml_sheetviews(data, wb/*:WBWBProps*/) { if(!wb.Views) wb.Views = [{}]; (data.match(sviewregex)||[]).forEach(function(r/*:string*/, i/*:number*/) { var tag = parsexmltag(r); // $FlowIgnore if(!wb.Views[i]) wb.Views[i] = {}; // $FlowIgnore if(+tag.zoomScale) wb.Views[i].zoom = +tag.zoomScale; // $FlowIgnore if(parsexmlbool(tag.rightToLeft)) wb.Views[i].RTL = true; }); } function write_ws_xml_sheetviews(ws, opts, idx, wb)/*:string*/ { var sview = ({workbookViewId:"0"}/*:any*/); // $FlowIgnore if((((wb||{}).Workbook||{}).Views||[])[0]) sview.rightToLeft = wb.Workbook.Views[0].RTL ? "1" : "0"; return writextag("sheetViews", writextag("sheetView", null, sview), {}); } function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts/*::, idx, wb*/)/*:string*/ { if(cell.c) ws['!comments'].push([ref, cell.c]); if(cell.v === undefined && typeof cell.f !== "string" || cell.t === 'z' && !cell.f) return ""; var vv = ""; var oldt = cell.t, oldv = cell.v; if(cell.t !== "z") switch(cell.t) { case 'b': vv = cell.v ? "1" : "0"; break; case 'n': vv = ''+cell.v; break; case 'e': vv = BErr[cell.v]; break; case 'd': if(opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString(); else { cell = dup(cell); cell.t = 'n'; vv = ''+(cell.v = datenum(parseDate(cell.v))); } if(typeof cell.z === 'undefined') cell.z = table_fmt[14]; break; default: vv = cell.v; break; } var v = writetag('v', escapexml(vv)), o = ({r:ref}/*:any*/); /* TODO: cell style */ var os = get_cell_style(opts.cellXfs, cell, opts); if(os !== 0) o.s = os; switch(cell.t) { case 'n': break; case 'd': o.t = "d"; break; case 'b': o.t = "b"; break; case 'e': o.t = "e"; break; case 'z': break; default: if(cell.v == null) { delete cell.t; break; } if(cell.v.length > 32767) throw new Error("Text length must not exceed 32767 characters"); if(opts && opts.bookSST) { v = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings)); o.t = "s"; break; } o.t = "str"; break; } if(cell.t != oldt) { cell.t = oldt; cell.v = oldv; } if(typeof cell.f == "string" && cell.f) { var ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:"array", ref:cell.F} : null; v = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : ""); } if(cell.l) ws['!links'].push([ref, cell.l]); if(cell.D) o.cm = 1; return writextag('c', v, o); } var parse_ws_xml_data = /*#__PURE__*/(function() { var cellregex = /<(?:\w+:)?c[ \/>]/, rowregex = /<\/(?:\w+:)?row>/; var rregex = /r=["']([^"']*)["']/, isregex = /<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/; var refregex = /ref=["']([^"']*)["']/; var match_v = matchtag("v"), match_f = matchtag("f"); return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, themes, styles) { var ri = 0, x = "", cells/*:Array*/ = [], cref/*:?Array*/ = [], idx=0, i=0, cc=0, d="", p/*:any*/; var tag, tagr = 0, tagc = 0; var sstr, ftag; var fmtid = 0, fillid = 0; var do_format = Array.isArray(styles.CellXf), cf; var arrayf/*:Array<[Range, string]>*/ = []; var sharedf = []; var dense = Array.isArray(s); var rows/*:Array*/ = [], rowobj = {}, rowrite = false; var sheetStubs = !!opts.sheetStubs; for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) { x = marr[mt].trim(); var xlen = x.length; if(xlen === 0) continue; /* 18.3.1.73 row CT_Row */ var rstarti = 0; outa: for(ri = 0; ri < xlen; ++ri) switch(/*x.charCodeAt(ri)*/x[ri]) { case ">" /*62*/: if(/*x.charCodeAt(ri-1) != 47*/x[ri-1] != "/") { ++ri; break outa; } if(opts && opts.cellStyles) { // TODO: avoid duplication tag = parsexmltag(x.slice(rstarti,ri), true); tagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1; if(opts.sheetRows && opts.sheetRows < tagr) continue; rowobj = {}; rowrite = false; if(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); } if(tag.hidden == "1") { rowrite = true; rowobj.hidden = true; } if(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; } if(rowrite) rows[tagr-1] = rowobj; } break; case "<" /*60*/: rstarti = ri; break; } if(rstarti >= ri) break; tag = parsexmltag(x.slice(rstarti,ri), true); tagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1; if(opts.sheetRows && opts.sheetRows < tagr) continue; if(guess.s.r > tagr - 1) guess.s.r = tagr - 1; if(guess.e.r < tagr - 1) guess.e.r = tagr - 1; if(opts && opts.cellStyles) { rowobj = {}; rowrite = false; if(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); } if(tag.hidden == "1") { rowrite = true; rowobj.hidden = true; } if(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; } if(rowrite) rows[tagr-1] = rowobj; } /* 18.3.1.4 c CT_Cell */ cells = x.slice(ri).split(cellregex); for(var rslice = 0; rslice != cells.length; ++rslice) if(cells[rslice].trim().charAt(0) != "<") break; cells = cells.slice(rslice); for(ri = 0; ri != cells.length; ++ri) { x = cells[ri].trim(); if(x.length === 0) continue; cref = x.match(rregex); idx = ri; i=0; cc=0; x = "":"") + x; if(cref != null && cref.length === 2) { idx = 0; d=cref[1]; for(i=0; i != d.length; ++i) { if((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break; idx = 26*idx + cc; } --idx; tagc = idx; } else ++tagc; for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i; tag = parsexmltag(x.slice(0,i), true); if(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc}); d = x.slice(i); p = ({t:""}/*:any*/); if((cref=d.match(match_v))!= null && /*::cref != null && */cref[1] !== '') p.v=unescapexml(cref[1]); if(opts.cellFormula) { if((cref=d.match(match_f))!= null && /*::cref != null && */cref[1] !== '') { /* TODO: match against XLSXFutureFunctions */ p.f=unescapexml(utf8read(cref[1])).replace(/\r\n/g, "\n"); if(!opts.xlfn) p.f = _xlfn(p.f); if(/*::cref != null && cref[0] != null && */cref[0].indexOf('t="array"') > -1) { p.F = (d.match(refregex)||[])[1]; if(p.F.indexOf(":") > -1) arrayf.push([safe_decode_range(p.F), p.F]); } else if(/*::cref != null && cref[0] != null && */cref[0].indexOf('t="shared"') > -1) { // TODO: parse formula ftag = parsexmltag(cref[0]); var ___f = unescapexml(utf8read(cref[1])); if(!opts.xlfn) ___f = _xlfn(___f); sharedf[parseInt(ftag.si, 10)] = [ftag, ___f, tag.r]; } } else if((cref=d.match(/]*\/>/))) { ftag = parsexmltag(cref[0]); if(sharedf[ftag.si]) p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2]/*[0].ref*/, tag.r); } /* TODO: factor out contains logic */ var _tag = decode_cell(tag.r); for(i = 0; i < arrayf.length; ++i) if(_tag.r >= arrayf[i][0].s.r && _tag.r <= arrayf[i][0].e.r) if(_tag.c >= arrayf[i][0].s.c && _tag.c <= arrayf[i][0].e.c) p.F = arrayf[i][1]; } if(tag.t == null && p.v === undefined) { if(p.f || p.F) { p.v = 0; p.t = "n"; } else if(!sheetStubs) continue; else p.t = "z"; } else p.t = tag.t || "n"; if(guess.s.c > tagc) guess.s.c = tagc; if(guess.e.c < tagc) guess.e.c = tagc; /* 18.18.11 t ST_CellType */ switch(p.t) { case 'n': if(p.v == "" || p.v == null) { if(!sheetStubs) continue; p.t = 'z'; } else p.v = parseFloat(p.v); break; case 's': if(typeof p.v == 'undefined') { if(!sheetStubs) continue; p.t = 'z'; } else { sstr = strs[parseInt(p.v, 10)]; p.v = sstr.t; p.r = sstr.r; if(opts.cellHTML) p.h = sstr.h; } break; case 'str': p.t = "s"; p.v = (p.v!=null) ? utf8read(p.v) : ''; if(opts.cellHTML) p.h = escapehtml(p.v); break; case 'inlineStr': cref = d.match(isregex); p.t = 's'; if(cref != null && (sstr = parse_si(cref[1]))) { p.v = sstr.t; if(opts.cellHTML) p.h = sstr.h; } else p.v = ""; break; case 'b': p.v = parsexmlbool(p.v); break; case 'd': if(opts.cellDates) p.v = parseDate(p.v, 1); else { p.v = datenum(parseDate(p.v, 1)); p.t = 'n'; } break; /* error string in .w, number in .v */ case 'e': if(!opts || opts.cellText !== false) p.w = p.v; p.v = RBErr[p.v]; break; } /* formatting */ fmtid = fillid = 0; cf = null; if(do_format && tag.s !== undefined) { cf = styles.CellXf[tag.s]; if(cf != null) { if(cf.numFmtId != null) fmtid = cf.numFmtId; if(opts.cellStyles) { if(cf.fillId != null) fillid = cf.fillId; } } } safe_format(p, fmtid, fillid, opts, themes, styles); if(opts.cellDates && do_format && p.t == 'n' && fmt_is_date(table_fmt[fmtid])) { p.t = 'd'; p.v = numdate(p.v); } if(tag.cm && opts.xlmeta) { var cm = (opts.xlmeta.Cell||[])[+tag.cm-1]; if(cm && cm.type == 'XLDAPR') p.D = true; } if(dense) { var _r = decode_cell(tag.r); if(!s[_r.r]) s[_r.r] = []; s[_r.r][_r.c] = p; } else s[tag.r] = p; } } if(rows.length > 0) s['!rows'] = rows; }; })(); function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*//*::, rels*/)/*:string*/ { var o/*:Array*/ = [], r/*:Array*/ = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols/*:Array*/ = [], R=0, C=0, rows = ws['!rows']; var dense = Array.isArray(ws); var params = ({r:rr}/*:any*/), row/*:RowInfo*/, height = -1; for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); for(R = range.s.r; R <= range.e.r; ++R) { r = []; rr = encode_row(R); for(C = range.s.c; C <= range.e.c; ++C) { ref = cols[C] + rr; var _cell = dense ? (ws[R]||[])[C]: ws[ref]; if(_cell === undefined) continue; if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); } if(r.length > 0 || (rows && rows[R])) { params = ({r:rr}/*:any*/); if(rows && rows[R]) { row = rows[R]; if(row.hidden) params.hidden = 1; height = -1; if(row.hpx) height = px2pt(row.hpx); else if(row.hpt) height = row.hpt; if(height > -1) { params.ht = height; params.customHeight = 1; } if(row.level) { params.outlineLevel = row.level; } } o[o.length] = (writextag('row', r.join(""), params)); } } if(rows) for(; R < rows.length; ++R) { if(rows && rows[R]) { params = ({r:R+1}/*:any*/); row = rows[R]; if(row.hidden) params.hidden = 1; height = -1; if (row.hpx) height = px2pt(row.hpx); else if (row.hpt) height = row.hpt; if (height > -1) { params.ht = height; params.customHeight = 1; } if (row.level) { params.outlineLevel = row.level; } o[o.length] = (writextag('row', "", params)); } } return o.join(""); } function write_ws_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ { var o = [XML_HEADER, writextag('worksheet', null, { 'xmlns': XMLNS_main[0], 'xmlns:r': XMLNS.r })]; var s = wb.SheetNames[idx], sidx = 0, rdata = ""; var ws = wb.Sheets[s]; if(ws == null) ws = {}; var ref = ws['!ref'] || 'A1'; var range = safe_decode_range(ref); if(range.e.c > 0x3FFF || range.e.r > 0xFFFFF) { if(opts.WTF) throw new Error("Range " + ref + " exceeds format limit A1:XFD1048576"); range.e.c = Math.min(range.e.c, 0x3FFF); range.e.r = Math.min(range.e.c, 0xFFFFF); ref = encode_range(range); } if(!rels) rels = {}; ws['!comments'] = []; var _drawing = []; write_ws_xml_sheetpr(ws, wb, idx, opts, o); o[o.length] = (writextag('dimension', null, {'ref': ref})); o[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb); /* TODO: store in WB, process styles */ if(opts.sheetFormat) o[o.length] = (writextag('sheetFormatPr', null, { defaultRowHeight:opts.sheetFormat.defaultRowHeight||'16', baseColWidth:opts.sheetFormat.baseColWidth||'10', outlineLevelRow:opts.sheetFormat.outlineLevelRow||'7' })); if(ws['!cols'] != null && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols'])); o[sidx = o.length] = ''; ws['!links'] = []; if(ws['!ref'] != null) { rdata = write_ws_xml_data(ws, opts, idx, wb, rels); if(rdata.length > 0) o[o.length] = (rdata); } if(o.length>sidx+1) { o[o.length] = (''); o[sidx]=o[sidx].replace("/>",">"); } /* sheetCalcPr */ if(ws['!protect']) o[o.length] = write_ws_xml_protection(ws['!protect']); /* protectedRanges */ /* scenarios */ if(ws['!autofilter'] != null) o[o.length] = write_ws_xml_autofilter(ws['!autofilter'], ws, wb, idx); /* sortState */ /* dataConsolidate */ /* customSheetViews */ if(ws['!merges'] != null && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges'])); /* phoneticPr */ /* conditionalFormatting */ /* dataValidations */ var relc = -1, rel, rId = -1; if(/*::(*/ws['!links']/*::||[])*/.length > 0) { o[o.length] = ""; /*::(*/ws['!links']/*::||[])*/.forEach(function(l) { if(!l[1].Target) return; rel = ({"ref":l[0]}/*:any*/); if(l[1].Target.charAt(0) != "#") { rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK); rel["r:id"] = "rId"+rId; } if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1)); if(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip); o[o.length] = writextag("hyperlink",null,rel); }); o[o.length] = ""; } delete ws['!links']; /* printOptions */ if(ws['!margins'] != null) o[o.length] = write_ws_xml_margins(ws['!margins']); /* pageSetup */ /* headerFooter */ /* rowBreaks */ /* colBreaks */ /* customProperties */ /* cellWatches */ if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) o[o.length] = writetag("ignoredErrors", writextag("ignoredError", null, {numberStoredAsText:1, sqref:ref})); /* smartTags */ if(_drawing.length > 0) { rId = add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW); o[o.length] = writextag("drawing", null, {"r:id":"rId" + rId}); ws['!drawing'] = _drawing; } if(ws['!comments'].length > 0) { rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx+1) + ".vml", RELS.VML); o[o.length] = writextag("legacyDrawing", null, {"r:id":"rId" + rId}); ws['!legacy'] = rId; } /* legacyDrawingHF */ /* picture */ /* oleObjects */ /* controls */ /* webPublishItems */ /* tableParts */ /* extLst */ if(o.length>1) { o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* [MS-XLSB] 2.4.726 BrtRowHdr */ function parse_BrtRowHdr(data, length) { var z = ({}/*:any*/); var tgt = data.l + length; z.r = data.read_shift(4); data.l += 4; // TODO: ixfe var miyRw = data.read_shift(2); data.l += 1; // TODO: top/bot padding var flags = data.read_shift(1); data.l = tgt; if(flags & 0x07) z.level = flags & 0x07; if(flags & 0x10) z.hidden = true; if(flags & 0x20) z.hpt = miyRw / 20; return z; } function write_BrtRowHdr(R/*:number*/, range, ws) { var o = new_buf(17+8*16); var row = (ws['!rows']||[])[R]||{}; o.write_shift(4, R); o.write_shift(4, 0); /* TODO: ixfe */ var miyRw = 0x0140; if(row.hpx) miyRw = px2pt(row.hpx) * 20; else if(row.hpt) miyRw = row.hpt * 20; o.write_shift(2, miyRw); o.write_shift(1, 0); /* top/bot padding */ var flags = 0x0; if(row.level) flags |= row.level; if(row.hidden) flags |= 0x10; if(row.hpx || row.hpt) flags |= 0x20; o.write_shift(1, flags); o.write_shift(1, 0); /* phonetic guide */ /* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */ var ncolspan = 0, lcs = o.l; o.l += 4; var caddr = {r:R, c:0}; for(var i = 0; i < 16; ++i) { if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue; var first = -1, last = -1; for(var j = (i<<10); j < ((i+1)<<10); ++j) { caddr.c = j; var cell = Array.isArray(ws) ? (ws[caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)]; if(cell) { if(first < 0) first = j; last = j; } } if(first < 0) continue; ++ncolspan; o.write_shift(4, first); o.write_shift(4, last); } var l = o.l; o.l = lcs; o.write_shift(4, ncolspan); o.l = l; return o.length > o.l ? o.slice(0, o.l) : o; } function write_row_header(ba, ws, range, R) { var o = write_BrtRowHdr(R, range, ws); if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 0x0000 /* BrtRowHdr */, o); } /* [MS-XLSB] 2.4.820 BrtWsDim */ var parse_BrtWsDim = parse_UncheckedRfX; var write_BrtWsDim = write_UncheckedRfX; /* [MS-XLSB] 2.4.821 BrtWsFmtInfo */ function parse_BrtWsFmtInfo(/*::data, length*/) { } //function write_BrtWsFmtInfo(ws, o) { } /* [MS-XLSB] 2.4.823 BrtWsProp */ function parse_BrtWsProp(data, length) { var z = {}; var f = data[data.l]; ++data.l; z.above = !(f & 0x40); z.left = !(f & 0x80); /* TODO: pull flags */ data.l += 18; z.name = parse_XLSBCodeName(data, length - 19); return z; } function write_BrtWsProp(str, outl, o) { if(o == null) o = new_buf(84+4*str.length); var f = 0xC0; if(outl) { if(outl.above) f &= ~0x40; if(outl.left) f &= ~0x80; } o.write_shift(1, f); for(var i = 1; i < 3; ++i) o.write_shift(1,0); write_BrtColor({auto:1}, o); o.write_shift(-4,-1); o.write_shift(-4,-1); write_XLSBCodeName(str, o); return o.slice(0, o.l); } /* [MS-XLSB] 2.4.306 BrtCellBlank */ function parse_BrtCellBlank(data) { var cell = parse_XLSBCell(data); return [cell]; } function write_BrtCellBlank(cell, ncell, o) { if(o == null) o = new_buf(8); return write_XLSBCell(ncell, o); } function parse_BrtShortBlank(data) { var cell = parse_XLSBShortCell(data); return [cell]; } function write_BrtShortBlank(cell, ncell, o) { if(o == null) o = new_buf(4); return write_XLSBShortCell(ncell, o); } /* [MS-XLSB] 2.4.307 BrtCellBool */ function parse_BrtCellBool(data) { var cell = parse_XLSBCell(data); var fBool = data.read_shift(1); return [cell, fBool, 'b']; } function write_BrtCellBool(cell, ncell, o) { if(o == null) o = new_buf(9); write_XLSBCell(ncell, o); o.write_shift(1, cell.v ? 1 : 0); return o; } function parse_BrtShortBool(data) { var cell = parse_XLSBShortCell(data); var fBool = data.read_shift(1); return [cell, fBool, 'b']; } function write_BrtShortBool(cell, ncell, o) { if(o == null) o = new_buf(5); write_XLSBShortCell(ncell, o); o.write_shift(1, cell.v ? 1 : 0); return o; } /* [MS-XLSB] 2.4.308 BrtCellError */ function parse_BrtCellError(data) { var cell = parse_XLSBCell(data); var bError = data.read_shift(1); return [cell, bError, 'e']; } function write_BrtCellError(cell, ncell, o) { if(o == null) o = new_buf(9); write_XLSBCell(ncell, o); o.write_shift(1, cell.v); return o; } function parse_BrtShortError(data) { var cell = parse_XLSBShortCell(data); var bError = data.read_shift(1); return [cell, bError, 'e']; } function write_BrtShortError(cell, ncell, o) { if(o == null) o = new_buf(8); write_XLSBShortCell(ncell, o); o.write_shift(1, cell.v); o.write_shift(2, 0); o.write_shift(1, 0); return o; } /* [MS-XLSB] 2.4.311 BrtCellIsst */ function parse_BrtCellIsst(data) { var cell = parse_XLSBCell(data); var isst = data.read_shift(4); return [cell, isst, 's']; } function write_BrtCellIsst(cell, ncell, o) { if(o == null) o = new_buf(12); write_XLSBCell(ncell, o); o.write_shift(4, ncell.v); return o; } function parse_BrtShortIsst(data) { var cell = parse_XLSBShortCell(data); var isst = data.read_shift(4); return [cell, isst, 's']; } function write_BrtShortIsst(cell, ncell, o) { if(o == null) o = new_buf(8); write_XLSBShortCell(ncell, o); o.write_shift(4, ncell.v); return o; } /* [MS-XLSB] 2.4.313 BrtCellReal */ function parse_BrtCellReal(data) { var cell = parse_XLSBCell(data); var value = parse_Xnum(data); return [cell, value, 'n']; } function write_BrtCellReal(cell, ncell, o) { if(o == null) o = new_buf(16); write_XLSBCell(ncell, o); write_Xnum(cell.v, o); return o; } function parse_BrtShortReal(data) { var cell = parse_XLSBShortCell(data); var value = parse_Xnum(data); return [cell, value, 'n']; } function write_BrtShortReal(cell, ncell, o) { if(o == null) o = new_buf(12); write_XLSBShortCell(ncell, o); write_Xnum(cell.v, o); return o; } /* [MS-XLSB] 2.4.314 BrtCellRk */ function parse_BrtCellRk(data) { var cell = parse_XLSBCell(data); var value = parse_RkNumber(data); return [cell, value, 'n']; } function write_BrtCellRk(cell, ncell, o) { if(o == null) o = new_buf(12); write_XLSBCell(ncell, o); write_RkNumber(cell.v, o); return o; } function parse_BrtShortRk(data) { var cell = parse_XLSBShortCell(data); var value = parse_RkNumber(data); return [cell, value, 'n']; } function write_BrtShortRk(cell, ncell, o) { if(o == null) o = new_buf(8); write_XLSBShortCell(ncell, o); write_RkNumber(cell.v, o); return o; } /* [MS-XLSB] 2.4.323 BrtCellRString */ function parse_BrtCellRString(data) { var cell = parse_XLSBCell(data); var value = parse_RichStr(data); return [cell, value, 'is']; } /* [MS-XLSB] 2.4.317 BrtCellSt */ function parse_BrtCellSt(data) { var cell = parse_XLSBCell(data); var value = parse_XLWideString(data); return [cell, value, 'str']; } function write_BrtCellSt(cell, ncell, o) { if(o == null) o = new_buf(12 + 4 * cell.v.length); write_XLSBCell(ncell, o); write_XLWideString(cell.v, o); return o.length > o.l ? o.slice(0, o.l) : o; } function parse_BrtShortSt(data) { var cell = parse_XLSBShortCell(data); var value = parse_XLWideString(data); return [cell, value, 'str']; } function write_BrtShortSt(cell, ncell, o) { if(o == null) o = new_buf(8 + 4 * cell.v.length); write_XLSBShortCell(ncell, o); write_XLWideString(cell.v, o); return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.653 BrtFmlaBool */ function parse_BrtFmlaBool(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = data.read_shift(1); var o = [cell, value, 'b']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o; } /* [MS-XLSB] 2.4.654 BrtFmlaError */ function parse_BrtFmlaError(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = data.read_shift(1); var o = [cell, value, 'e']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o; } /* [MS-XLSB] 2.4.655 BrtFmlaNum */ function parse_BrtFmlaNum(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = parse_Xnum(data); var o = [cell, value, 'n']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o; } /* [MS-XLSB] 2.4.656 BrtFmlaString */ function parse_BrtFmlaString(data, length, opts) { var end = data.l + length; var cell = parse_XLSBCell(data); cell.r = opts['!row']; var value = parse_XLWideString(data); var o = [cell, value, 'str']; if(opts.cellFormula) { data.l += 2; var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts); o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */ } else data.l = end; return o; } /* [MS-XLSB] 2.4.682 BrtMergeCell */ var parse_BrtMergeCell = parse_UncheckedRfX; var write_BrtMergeCell = write_UncheckedRfX; /* [MS-XLSB] 2.4.107 BrtBeginMergeCells */ function write_BrtBeginMergeCells(cnt, o) { if(o == null) o = new_buf(4); o.write_shift(4, cnt); return o; } /* [MS-XLSB] 2.4.662 BrtHLink */ function parse_BrtHLink(data, length/*::, opts*/) { var end = data.l + length; var rfx = parse_UncheckedRfX(data, 16); var relId = parse_XLNullableWideString(data); var loc = parse_XLWideString(data); var tooltip = parse_XLWideString(data); var display = parse_XLWideString(data); data.l = end; var o = ({rfx:rfx, relId:relId, loc:loc, display:display}/*:any*/); if(tooltip) o.Tooltip = tooltip; return o; } function write_BrtHLink(l, rId) { var o = new_buf(50+4*(l[1].Target.length + (l[1].Tooltip || "").length)); write_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o); write_RelID("rId" + rId, o); var locidx = l[1].Target.indexOf("#"); var loc = locidx == -1 ? "" : l[1].Target.slice(locidx+1); write_XLWideString(loc || "", o); write_XLWideString(l[1].Tooltip || "", o); write_XLWideString("", o); return o.slice(0, o.l); } /* [MS-XLSB] 2.4.692 BrtPane */ function parse_BrtPane(/*data, length, opts*/) { } /* [MS-XLSB] 2.4.6 BrtArrFmla */ function parse_BrtArrFmla(data, length, opts) { var end = data.l + length; var rfx = parse_RfX(data, 16); var fAlwaysCalc = data.read_shift(1); var o = [rfx]; o[2] = fAlwaysCalc; if(opts.cellFormula) { var formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts); o[1] = formula; } else data.l = end; return o; } /* [MS-XLSB] 2.4.750 BrtShrFmla */ function parse_BrtShrFmla(data, length, opts) { var end = data.l + length; var rfx = parse_UncheckedRfX(data, 16); var o = [rfx]; if(opts.cellFormula) { var formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts); o[1] = formula; data.l = end; } else data.l = end; return o; } /* [MS-XLSB] 2.4.323 BrtColInfo */ /* TODO: once XLS ColInfo is set, combine the functions */ function write_BrtColInfo(C/*:number*/, col, o) { if(o == null) o = new_buf(18); var p = col_obj_w(C, col); o.write_shift(-4, C); o.write_shift(-4, C); o.write_shift(4, (p.width || 10) * 256); o.write_shift(4, 0/*ixfe*/); // style var flags = 0; if(col.hidden) flags |= 0x01; if(typeof p.width == 'number') flags |= 0x02; if(col.level) flags |= (col.level << 8); o.write_shift(2, flags); // bit flag return o; } /* [MS-XLSB] 2.4.678 BrtMargins */ var BrtMarginKeys = ["left","right","top","bottom","header","footer"]; function parse_BrtMargins(data/*::, length, opts*/)/*:Margins*/ { var margins = ({}/*:any*/); BrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); }); return margins; } function write_BrtMargins(margins/*:Margins*/, o) { if(o == null) o = new_buf(6*8); default_margins(margins); BrtMarginKeys.forEach(function(k) { write_Xnum((margins/*:any*/)[k], o); }); return o; } /* [MS-XLSB] 2.4.299 BrtBeginWsView */ function parse_BrtBeginWsView(data/*::, length, opts*/) { var f = data.read_shift(2); data.l += 28; return { RTL: f & 0x20 }; } function write_BrtBeginWsView(ws, Workbook, o) { if(o == null) o = new_buf(30); var f = 0x39c; if((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20; o.write_shift(2, f); // bit flag o.write_shift(4, 0); o.write_shift(4, 0); // view first row o.write_shift(4, 0); // view first col o.write_shift(1, 0); // gridline color ICV o.write_shift(1, 0); o.write_shift(2, 0); o.write_shift(2, 100); // zoom scale o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(2, 0); o.write_shift(4, 0); // workbook view id return o; } /* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */ function write_BrtCellIgnoreEC(ref) { var o = new_buf(24); o.write_shift(4, 4); o.write_shift(4, 1); write_UncheckedRfX(ref, o); return o; } /* [MS-XLSB] 2.4.748 BrtSheetProtection */ function write_BrtSheetProtection(sp, o) { if(o == null) o = new_buf(16*4+2); o.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0); o.write_shift(4, 1); // this record should not be written if no protection [ ["objects", false], // fObjects ["scenarios", false], // fScenarios ["formatCells", true], // fFormatCells ["formatColumns", true], // fFormatColumns ["formatRows", true], // fFormatRows ["insertColumns", true], // fInsertColumns ["insertRows", true], // fInsertRows ["insertHyperlinks", true], // fInsertHyperlinks ["deleteColumns", true], // fDeleteColumns ["deleteRows", true], // fDeleteRows ["selectLockedCells", false], // fSelLockedCells ["sort", true], // fSort ["autoFilter", true], // fAutoFilter ["pivotTables", true], // fPivotTables ["selectUnlockedCells", false] // fSelUnlockedCells ].forEach(function(n) { /*:: if(o == null) throw "unreachable"; */ if(n[1]) o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0); else o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1); }); return o; } function parse_BrtDVal(/*data, length, opts*/) { } function parse_BrtDVal14(/*data, length, opts*/) { } /* [MS-XLSB] 2.1.7.61 Worksheet */ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/*:Worksheet*/ { if(!data) return data; var opts = _opts || {}; if(!rels) rels = {'!id':{}}; if(DENSE != null && opts.dense == null) opts.dense = DENSE; var s/*:Worksheet*/ = (opts.dense ? [] : {}); var ref; var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} }; var state/*:Array*/ = []; var pass = false, end = false; var row, p, cf, R, C, addr, sstr, rr, cell/*:Cell*/; var merges/*:Array*/ = []; opts.biff = 12; opts['!row'] = 0; var ai = 0, af = false; var arrayf/*:Array<[Range, string]>*/ = []; var sharedf = {}; var supbooks = opts.supbooks || /*::(*/wb/*:: :any)*/.supbooks || ([[]]/*:any*/); supbooks.sharedf = sharedf; supbooks.arrayf = arrayf; supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; }); if(!opts.supbooks) { opts.supbooks = supbooks; if(wb.Names) for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i]; } var colinfo/*:Array*/ = [], rowinfo/*:Array*/ = []; var seencol = false; XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal }; var cm, vm; recordhopper(data, function ws_parse(val, RR, RT) { if(end) return; switch(RT) { case 0x0094: /* 'BrtWsDim' */ ref = val; break; case 0x0000: /* 'BrtRowHdr' */ row = val; if(opts.sheetRows && opts.sheetRows <= row.r) end=true; rr = encode_row(R = row.r); opts['!row'] = row.r; if(val.hidden || val.hpt || val.level != null) { if(val.hpt) val.hpx = pt2px(val.hpt); rowinfo[val.r] = val; } break; case 0x0002: /* 'BrtCellRk' */ case 0x0003: /* 'BrtCellError' */ case 0x0004: /* 'BrtCellBool' */ case 0x0005: /* 'BrtCellReal' */ case 0x0006: /* 'BrtCellSt' */ case 0x0007: /* 'BrtCellIsst' */ case 0x0008: /* 'BrtFmlaString' */ case 0x0009: /* 'BrtFmlaNum' */ case 0x000A: /* 'BrtFmlaBool' */ case 0x000B: /* 'BrtFmlaError' */ case 0x000D: /* 'BrtShortRk' */ case 0x000E: /* 'BrtShortError' */ case 0x000F: /* 'BrtShortBool' */ case 0x0010: /* 'BrtShortReal' */ case 0x0011: /* 'BrtShortSt' */ case 0x0012: /* 'BrtShortIsst' */ case 0x003E: /* 'BrtCellRString' */ p = ({t:val[2]}/*:any*/); switch(val[2]) { case 'n': p.v = val[1]; break; case 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break; case 'b': p.v = val[1] ? true : false; break; case 'e': p.v = val[1]; if(opts.cellText !== false) p.w = BErr[p.v]; break; case 'str': p.t = 's'; p.v = val[1]; break; case 'is': p.t = 's'; p.v = val[1].t; break; } if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles); C = val[0].c == -1 ? C + 1 : val[0].c; if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } else s[encode_col(C) + rr] = p; if(opts.cellFormula) { af = false; for(ai = 0; ai < arrayf.length; ++ai) { var aii = arrayf[ai]; if(row.r >= aii[0].s.r && row.r <= aii[0].e.r) if(C >= aii[0].s.c && C <= aii[0].e.c) { p.F = encode_range(aii[0]); af = true; } } if(!af && val.length > 3) p.f = val[3]; } if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.c > C) refguess.s.c = C; if(refguess.e.r < row.r) refguess.e.r = row.r; if(refguess.e.c < C) refguess.e.c = C; if(opts.cellDates && cf && p.t == 'n' && fmt_is_date(table_fmt[cf.numFmtId])) { var _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); } } if(cm) { if(cm.type == 'XLDAPR') p.D = true; cm = void 0; } if(vm) vm = void 0; break; case 0x0001: /* 'BrtCellBlank' */ case 0x000C: /* 'BrtShortBlank' */ if(!opts.sheetStubs || pass) break; p = ({t:'z',v:void 0}/*:any*/); C = val[0].c == -1 ? C + 1 : val[0].c; if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; } else s[encode_col(C) + rr] = p; if(refguess.s.r > row.r) refguess.s.r = row.r; if(refguess.s.c > C) refguess.s.c = C; if(refguess.e.r < row.r) refguess.e.r = row.r; if(refguess.e.c < C) refguess.e.c = C; if(cm) { if(cm.type == 'XLDAPR') p.D = true; cm = void 0; } if(vm) vm = void 0; break; case 0x00B0: /* 'BrtMergeCell' */ merges.push(val); break; case 0x0031: { /* 'BrtCellMeta' */ cm = ((opts.xlmeta||{}).Cell||[])[val-1]; } break; case 0x01EE: /* 'BrtHLink' */ var rel = rels['!id'][val.relId]; if(rel) { val.Target = rel.Target; if(val.loc) val.Target += "#"+val.loc; val.Rel = rel; } else if(val.relId == '') { val.Target = "#" + val.loc; } for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) { if(opts.dense) { if(!s[R]) s[R] = []; if(!s[R][C]) s[R][C] = {t:'z',v:undefined}; s[R][C].l = val; } else { addr = encode_cell({c:C,r:R}); if(!s[addr]) s[addr] = {t:'z',v:undefined}; s[addr].l = val; } } break; case 0x01AA: /* 'BrtArrFmla' */ if(!opts.cellFormula) break; arrayf.push(val); cell = ((opts.dense ? s[R][C] : s[encode_col(C) + rr])/*:any*/); cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts); cell.F = encode_range(val[0]); break; case 0x01AB: /* 'BrtShrFmla' */ if(!opts.cellFormula) break; sharedf[encode_cell(val[0].s)] = val[1]; cell = (opts.dense ? s[R][C] : s[encode_col(C) + rr]); cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts); break; /* identical to 'ColInfo' in XLS */ case 0x003C: /* 'BrtColInfo' */ if(!opts.cellStyles) break; while(val.e >= val.s) { colinfo[val.e--] = { width: val.w/256, hidden: !!(val.flags & 0x01), level: val.level }; if(!seencol) { seencol = true; find_mdw_colw(val.w/256); } process_col(colinfo[val.e+1]); } break; case 0x00A1: /* 'BrtBeginAFilter' */ s['!autofilter'] = { ref:encode_range(val) }; break; case 0x01DC: /* 'BrtMargins' */ s['!margins'] = val; break; case 0x0093: /* 'BrtWsProp' */ if(!wb.Sheets[idx]) wb.Sheets[idx] = {}; if(val.name) wb.Sheets[idx].CodeName = val.name; if(val.above || val.left) s['!outline'] = { above: val.above, left: val.left }; break; case 0x0089: /* 'BrtBeginWsView' */ if(!wb.Views) wb.Views = [{}]; if(!wb.Views[0]) wb.Views[0] = {}; if(val.RTL) wb.Views[0].RTL = true; break; case 0x01E5: /* 'BrtWsFmtInfo' */ break; case 0x0040: /* 'BrtDVal' */ case 0x041D: /* 'BrtDVal14' */ break; case 0x0097: /* 'BrtPane' */ break; case 0x0098: /* 'BrtSel' */ case 0x00AF: /* 'BrtAFilterDateGroupItem' */ case 0x0284: /* 'BrtActiveX' */ case 0x0271: /* 'BrtBigName' */ case 0x0232: /* 'BrtBkHim' */ case 0x018C: /* 'BrtBrk' */ case 0x0458: /* 'BrtCFIcon' */ case 0x047A: /* 'BrtCFRuleExt' */ case 0x01D7: /* 'BrtCFVO' */ case 0x041A: /* 'BrtCFVO14' */ case 0x0289: /* 'BrtCellIgnoreEC' */ case 0x0451: /* 'BrtCellIgnoreEC14' */ case 0x024D: /* 'BrtCellSmartTagProperty' */ case 0x025F: /* 'BrtCellWatch' */ case 0x0234: /* 'BrtColor' */ case 0x041F: /* 'BrtColor14' */ case 0x00A8: /* 'BrtColorFilter' */ case 0x00AE: /* 'BrtCustomFilter' */ case 0x049C: /* 'BrtCustomFilter14' */ case 0x01F3: /* 'BrtDRef' */ case 0x01FB: /* 'BrtDXF' */ case 0x0226: /* 'BrtDrawing' */ case 0x00AB: /* 'BrtDynamicFilter' */ case 0x00A7: /* 'BrtFilter' */ case 0x0499: /* 'BrtFilter14' */ case 0x00A9: /* 'BrtIconFilter' */ case 0x049D: /* 'BrtIconFilter14' */ case 0x0227: /* 'BrtLegacyDrawing' */ case 0x0228: /* 'BrtLegacyDrawingHF' */ case 0x0295: /* 'BrtListPart' */ case 0x027F: /* 'BrtOleObject' */ case 0x01DE: /* 'BrtPageSetup' */ case 0x0219: /* 'BrtPhoneticInfo' */ case 0x01DD: /* 'BrtPrintOptions' */ case 0x0218: /* 'BrtRangeProtection' */ case 0x044F: /* 'BrtRangeProtection14' */ case 0x02A8: /* 'BrtRangeProtectionIso' */ case 0x0450: /* 'BrtRangeProtectionIso14' */ case 0x0400: /* 'BrtRwDescent' */ case 0x0297: /* 'BrtSheetCalcProp' */ case 0x0217: /* 'BrtSheetProtection' */ case 0x02A6: /* 'BrtSheetProtectionIso' */ case 0x01F8: /* 'BrtSlc' */ case 0x0413: /* 'BrtSparkline' */ case 0x01AC: /* 'BrtTable' */ case 0x00AA: /* 'BrtTop10Filter' */ case 0x0C00: /* 'BrtUid' */ case 0x0032: /* 'BrtValueMeta' */ case 0x0816: /* 'BrtWebExtension' */ case 0x0415: /* 'BrtWsFmtInfoEx14' */ break; case 0x0023: /* 'BrtFRTBegin' */ pass = true; break; case 0x0024: /* 'BrtFRTEnd' */ pass = false; break; case 0x0025: /* 'BrtACBegin' */ state.push(RT); pass = true; break; case 0x0026: /* 'BrtACEnd' */ state.pop(); pass = false; break; default: if(RR.T){/* empty */} else if(!pass || opts.WTF) throw new Error("Unexpected record 0x" + RT.toString(16)); } }, opts); delete opts.supbooks; delete opts['!row']; if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess); if(opts.sheetRows && s["!ref"]) { var tmpref = safe_decode_range(s["!ref"]); if(opts.sheetRows <= +tmpref.e.r) { tmpref.e.r = opts.sheetRows - 1; if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r; if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r; if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c; if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c; s["!fullref"] = s["!ref"]; s["!ref"] = encode_range(tmpref); } } if(merges.length > 0) s["!merges"] = merges; if(colinfo.length > 0) s["!cols"] = colinfo; if(rowinfo.length > 0) s["!rows"] = rowinfo; return s; } /* TODO: something useful -- this is a stub */ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts, ws/*:Worksheet*/, last_seen/*:boolean*/)/*:boolean*/ { if(cell.v === undefined) return false; var vv = ""; switch(cell.t) { case 'b': vv = cell.v ? "1" : "0"; break; case 'd': // no BrtCellDate :( cell = dup(cell); cell.z = cell.z || table_fmt[14]; cell.v = datenum(parseDate(cell.v)); cell.t = 'n'; break; /* falls through */ case 'n': case 'e': vv = ''+cell.v; break; default: vv = cell.v; break; } var o/*:any*/ = ({r:R, c:C}/*:any*/); /* TODO: cell style */ o.s = get_cell_style(opts.cellXfs, cell, opts); if(cell.l) ws['!links'].push([encode_cell(o), cell.l]); if(cell.c) ws['!comments'].push([encode_cell(o), cell.c]); switch(cell.t) { case 's': case 'str': if(opts.bookSST) { vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings); o.t = "s"; o.v = vv; if(last_seen) write_record(ba, 0x0012 /* BrtShortIsst */, write_BrtShortIsst(cell, o)); else write_record(ba, 0x0007 /* BrtCellIsst */, write_BrtCellIsst(cell, o)); } else { o.t = "str"; if(last_seen) write_record(ba, 0x0011 /* BrtShortSt */, write_BrtShortSt(cell, o)); else write_record(ba, 0x0006 /* BrtCellSt */, write_BrtCellSt(cell, o)); } return true; case 'n': /* TODO: determine threshold for Real vs RK */ if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) { if(last_seen) write_record(ba, 0x000D /* BrtShortRk */, write_BrtShortRk(cell, o)); else write_record(ba, 0x0002 /* BrtCellRk */, write_BrtCellRk(cell, o)); } else { if(last_seen) write_record(ba, 0x0010 /* BrtShortReal */, write_BrtShortReal(cell, o)); else write_record(ba, 0x0005 /* BrtCellReal */, write_BrtCellReal(cell, o)); } return true; case 'b': o.t = "b"; if(last_seen) write_record(ba, 0x000F /* BrtShortBool */, write_BrtShortBool(cell, o)); else write_record(ba, 0x0004 /* BrtCellBool */, write_BrtCellBool(cell, o)); return true; case 'e': o.t = "e"; if(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError(cell, o)); else write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError(cell, o)); return true; } if(last_seen) write_record(ba, 0x000C /* BrtShortBlank */, write_BrtShortBlank(cell, o)); else write_record(ba, 0x0001 /* BrtCellBlank */, write_BrtCellBlank(cell, o)); return true; } function write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) { var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols/*:Array*/ = []; write_record(ba, 0x0091 /* BrtBeginSheetData */); var dense = Array.isArray(ws); var cap = range.e.r; if(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1); for(var R = range.s.r; R <= cap; ++R) { rr = encode_row(R); /* [ACCELLTABLE] */ /* BrtRowHdr */ write_row_header(ba, ws, range, R); var last_seen = false; if(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) { /* *16384CELL */ if(R === range.s.r) cols[C] = encode_col(C); ref = cols[C] + rr; var cell = dense ? (ws[R]||[])[C] : ws[ref]; if(!cell) { last_seen = false; continue; } /* write cell */ last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen); } } write_record(ba, 0x0092 /* BrtEndSheetData */); } function write_MERGECELLS(ba, ws/*:Worksheet*/) { if(!ws || !ws['!merges']) return; write_record(ba, 0x00B1 /* BrtBeginMergeCells */, write_BrtBeginMergeCells(ws['!merges'].length)); ws['!merges'].forEach(function(m) { write_record(ba, 0x00B0 /* BrtMergeCell */, write_BrtMergeCell(m)); }); write_record(ba, 0x00B2 /* BrtEndMergeCells */); } function write_COLINFOS(ba, ws/*:Worksheet*//*::, idx:number, opts, wb:Workbook*/) { if(!ws || !ws['!cols']) return; write_record(ba, 0x0186 /* BrtBeginColInfos */); ws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 0x003C /* 'BrtColInfo' */, write_BrtColInfo(i, m)); }); write_record(ba, 0x0187 /* BrtEndColInfos */); } function write_IGNOREECS(ba, ws/*:Worksheet*/) { if(!ws || !ws['!ref']) return; write_record(ba, 0x0288 /* BrtBeginCellIgnoreECs */); write_record(ba, 0x0289 /* BrtCellIgnoreEC */, write_BrtCellIgnoreEC(safe_decode_range(ws['!ref']))); write_record(ba, 0x028A /* BrtEndCellIgnoreECs */); } function write_HLINKS(ba, ws/*:Worksheet*/, rels) { /* *BrtHLink */ ws['!links'].forEach(function(l) { if(!l[1].Target) return; var rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, ""), RELS.HLINK); write_record(ba, 0x01EE /* BrtHLink */, write_BrtHLink(l, rId)); }); delete ws['!links']; } function write_LEGACYDRAWING(ba, ws/*:Worksheet*/, idx/*:number*/, rels) { /* [BrtLegacyDrawing] */ if(ws['!comments'].length > 0) { var rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx+1) + ".vml", RELS.VML); write_record(ba, 0x0227 /* BrtLegacyDrawing */, write_RelID("rId" + rId)); ws['!legacy'] = rId; } } function write_AUTOFILTER(ba, ws, wb, idx) { if(!ws['!autofilter']) return; var data = ws['!autofilter']; var ref = typeof data.ref === "string" ? data.ref : encode_range(data.ref); /* Update FilterDatabase defined name for the worksheet */ if(!wb.Workbook) wb.Workbook = ({Sheets:[]}/*:any*/); if(!wb.Workbook.Names) wb.Workbook.Names = []; var names/*: Array */ = wb.Workbook.Names; var range = decode_range(ref); if(range.s.r == range.e.r) { range.e.r = decode_range(ws["!ref"]).e.r; ref = encode_range(range); } for(var i = 0; i < names.length; ++i) { var name = names[i]; if(name.Name != '_xlnm._FilterDatabase') continue; if(name.Sheet != idx) continue; name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref; break; } if(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref }); write_record(ba, 0x00A1 /* BrtBeginAFilter */, write_UncheckedRfX(safe_decode_range(ref))); /* *FILTERCOLUMN */ /* [SORTSTATE] */ /* BrtEndAFilter */ write_record(ba, 0x00A2 /* BrtEndAFilter */); } function write_WSVIEWS2(ba, ws, Workbook) { write_record(ba, 0x0085 /* BrtBeginWsViews */); { /* 1*WSVIEW2 */ /* [ACUID] */ write_record(ba, 0x0089 /* BrtBeginWsView */, write_BrtBeginWsView(ws, Workbook)); /* [BrtPane] */ /* *4BrtSel */ /* *4SXSELECT */ /* *FRT */ write_record(ba, 0x008A /* BrtEndWsView */); } /* *FRT */ write_record(ba, 0x0086 /* BrtEndWsViews */); } function write_WSFMTINFO(/*::ba, ws*/) { /* [ACWSFMTINFO] */ // write_record(ba, 0x01E5 /* BrtWsFmtInfo */, write_BrtWsFmtInfo(ws)); } function write_SHEETPROTECT(ba, ws) { if(!ws['!protect']) return; /* [BrtSheetProtectionIso] */ write_record(ba, 0x0217 /* BrtSheetProtection */, write_BrtSheetProtection(ws['!protect'])); } function write_ws_bin(idx/*:number*/, opts, wb/*:Workbook*/, rels) { var ba = buf_array(); var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {}; var c/*:string*/ = s; try { if(wb && wb.Workbook) c = wb.Workbook.Sheets[idx].CodeName || c; } catch(e) {} var r = safe_decode_range(ws['!ref'] || "A1"); if(r.e.c > 0x3FFF || r.e.r > 0xFFFFF) { if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:XFD1048576"); r.e.c = Math.min(r.e.c, 0x3FFF); r.e.r = Math.min(r.e.c, 0xFFFFF); } ws['!links'] = []; /* passed back to write_zip and removed there */ ws['!comments'] = []; write_record(ba, 0x0081 /* BrtBeginSheet */); if(wb.vbaraw || ws['!outline']) write_record(ba, 0x0093 /* BrtWsProp */, write_BrtWsProp(c, ws['!outline'])); write_record(ba, 0x0094 /* BrtWsDim */, write_BrtWsDim(r)); write_WSVIEWS2(ba, ws, wb.Workbook); write_WSFMTINFO(ba, ws); write_COLINFOS(ba, ws, idx, opts, wb); write_CELLTABLE(ba, ws, idx, opts, wb); /* [BrtSheetCalcProp] */ write_SHEETPROTECT(ba, ws); /* *([BrtRangeProtectionIso] BrtRangeProtection) */ /* [SCENMAN] */ write_AUTOFILTER(ba, ws, wb, idx); /* [SORTSTATE] */ /* [DCON] */ /* [USERSHVIEWS] */ write_MERGECELLS(ba, ws); /* [BrtPhoneticInfo] */ /* *CONDITIONALFORMATTING */ /* [DVALS] */ write_HLINKS(ba, ws, rels); /* [BrtPrintOptions] */ if(ws['!margins']) write_record(ba, 0x01DC /* BrtMargins */, write_BrtMargins(ws['!margins'])); /* [BrtPageSetup] */ /* [HEADERFOOTER] */ /* [RWBRK] */ /* [COLBRK] */ /* *BrtBigName */ /* [CELLWATCHES] */ if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws); /* [SMARTTAGS] */ /* [BrtDrawing] */ write_LEGACYDRAWING(ba, ws, idx, rels); /* [BrtLegacyDrawingHF] */ /* [BrtBkHim] */ /* [OLEOBJECTS] */ /* [ACTIVEXCONTROLS] */ /* [WEBPUBITEMS] */ /* [LISTPARTS] */ /* FRTWORKSHEET */ write_record(ba, 0x0082 /* BrtEndSheet */); return ba.end(); } function parse_Cache(data/*:string*/)/*:[Array, string, ?string]*/ { var col/*:Array*/ = []; var num = data.match(/^/); var f; /* 21.2.2.150 pt CT_NumVal */ (data.match(/(.*?)<\/c:pt>/mg)||[]).forEach(function(pt) { var q = pt.match(/(.*)<\/c:v><\/c:pt>/); if(!q) return; col[+q[1]] = num ? +q[2] : q[2]; }); /* 21.2.2.71 formatCode CT_Xstring */ var nf = unescapexml((data.match(/([\s\S]*?)<\/c:formatCode>/) || ["","General"])[1]); (data.match(/(.*?)<\/c:f>/mg)||[]).forEach(function(F) { f = F.replace(/<.*?>/g,""); }); return [col, nf, f]; } /* 21.2 DrawingML - Charts */ function parse_chart(data/*:?string*/, name/*:string*/, opts, rels, wb, csheet) { var cs/*:Worksheet*/ = ((csheet || {"!type":"chart"})/*:any*/); if(!data) return csheet; /* 21.2.2.27 chart CT_Chart */ var C = 0, R = 0, col = "A"; var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} }; /* 21.2.2.120 numCache CT_NumData */ (data.match(/[\s\S]*?<\/c:numCache>/gm)||[]).forEach(function(nc) { var cache = parse_Cache(nc); refguess.s.r = refguess.s.c = 0; refguess.e.c = C; col = encode_col(C); cache[0].forEach(function(n,i) { cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] }; R = i; }); if(refguess.e.r < R) refguess.e.r = R; ++C; }); if(C > 0) cs["!ref"] = encode_range(refguess); return cs; } /* 18.3 Worksheets also covers Chartsheets */ function parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ { if(!data) return data; /* 18.3.1.12 chartsheet CT_ChartSheet */ if(!rels) rels = {'!id':{}}; var s = ({'!type':"chart", '!drawel':null, '!rel':""}/*:any*/); var m; /* 18.3.1.83 sheetPr CT_ChartsheetPr */ var sheetPr = data.match(sheetprregex); if(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx); /* 18.3.1.36 drawing CT_Drawing */ if((m = data.match(/drawing r:id="(.*?)"/))) s['!rel'] = m[1]; if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']]; return s; } function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ { var o = [XML_HEADER, writextag('chartsheet', null, { 'xmlns': XMLNS_main[0], 'xmlns:r': XMLNS.r })]; o[o.length] = writextag("drawing", null, {"r:id": "rId1"}); add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW); if(o.length>2) { o[o.length] = (''); o[1]=o[1].replace("/>",">"); } return o.join(""); } /* [MS-XLSB] 2.4.331 BrtCsProp */ function parse_BrtCsProp(data, length/*:number*/) { data.l += 10; var name = parse_XLWideString(data, length - 10); return { name: name }; } /* [MS-XLSB] 2.1.7.7 Chart Sheet */ function parse_cs_bin(data, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ { if(!data) return data; if(!rels) rels = {'!id':{}}; var s = {'!type':"chart", '!drawel':null, '!rel':""}; var state/*:Array*/ = []; var pass = false; recordhopper(data, function cs_parse(val, R, RT) { switch(RT) { case 0x0226: /* 'BrtDrawing' */ s['!rel'] = val; break; case 0x028B: /* 'BrtCsProp' */ if(!wb.Sheets[idx]) wb.Sheets[idx] = {}; if(val.name) wb.Sheets[idx].CodeName = val.name; break; case 0x0232: /* 'BrtBkHim' */ case 0x028C: /* 'BrtCsPageSetup' */ case 0x029D: /* 'BrtCsProtection' */ case 0x02A7: /* 'BrtCsProtectionIso' */ case 0x0227: /* 'BrtLegacyDrawing' */ case 0x0228: /* 'BrtLegacyDrawingHF' */ case 0x01DC: /* 'BrtMargins' */ case 0x0C00: /* 'BrtUid' */ break; case 0x0023: /* 'BrtFRTBegin' */ pass = true; break; case 0x0024: /* 'BrtFRTEnd' */ pass = false; break; case 0x0025: /* 'BrtACBegin' */ state.push(RT); break; case 0x0026: /* 'BrtACEnd' */ state.pop(); break; default: if(R.T > 0) state.push(RT); else if(R.T < 0) state.pop(); else if(!pass || opts.WTF) throw new Error("Unexpected record 0x" + RT.toString(16)); } }, opts); if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']]; return s; } function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) { var ba = buf_array(); write_record(ba, 0x0081 /* BrtBeginSheet */); /* [BrtCsProp] */ /* CSVIEWS */ /* [[BrtCsProtectionIso] BrtCsProtection] */ /* [USERCSVIEWS] */ /* [BrtMargins] */ /* [BrtCsPageSetup] */ /* [HEADERFOOTER] */ /* BrtDrawing */ /* [BrtLegacyDrawing] */ /* [BrtLegacyDrawingHF] */ /* [BrtBkHim] */ /* [WEBPUBITEMS] */ /* FRTCHARTSHEET */ write_record(ba, 0x0082 /* BrtEndSheet */); return ba.end(); } /* 18.2.28 (CT_WorkbookProtection) Defaults */ var WBPropsDef = [ ['allowRefreshQuery', false, "bool"], ['autoCompressPictures', true, "bool"], ['backupFile', false, "bool"], ['checkCompatibility', false, "bool"], ['CodeName', ''], ['date1904', false, "bool"], ['defaultThemeVersion', 0, "int"], ['filterPrivacy', false, "bool"], ['hidePivotFieldList', false, "bool"], ['promptedSolutions', false, "bool"], ['publishItems', false, "bool"], ['refreshAllConnections', false, "bool"], ['saveExternalLinkValues', true, "bool"], ['showBorderUnselectedTables', true, "bool"], ['showInkAnnotation', true, "bool"], ['showObjects', 'all'], ['showPivotChartFilter', false, "bool"], ['updateLinks', 'userSet'] ]; /* 18.2.30 (CT_BookView) Defaults */ var WBViewDef = [ ['activeTab', 0, "int"], ['autoFilterDateGrouping', true, "bool"], ['firstSheet', 0, "int"], ['minimized', false, "bool"], ['showHorizontalScroll', true, "bool"], ['showSheetTabs', true, "bool"], ['showVerticalScroll', true, "bool"], ['tabRatio', 600, "int"], ['visibility', 'visible'] //window{Height,Width}, {x,y}Window ]; /* 18.2.19 (CT_Sheet) Defaults */ var SheetDef = [ //['state', 'visible'] ]; /* 18.2.2 (CT_CalcPr) Defaults */ var CalcPrDef = [ ['calcCompleted', 'true'], ['calcMode', 'auto'], ['calcOnSave', 'true'], ['concurrentCalc', 'true'], ['fullCalcOnLoad', 'false'], ['fullPrecision', 'true'], ['iterate', 'false'], ['iterateCount', '100'], ['iterateDelta', '0.001'], ['refMode', 'A1'] ]; /* 18.2.3 (CT_CustomWorkbookView) Defaults */ /*var CustomWBViewDef = [ ['autoUpdate', 'false'], ['changesSavedWin', 'false'], ['includeHiddenRowCol', 'true'], ['includePrintSettings', 'true'], ['maximized', 'false'], ['minimized', 'false'], ['onlySync', 'false'], ['personalView', 'false'], ['showComments', 'commIndicator'], ['showFormulaBar', 'true'], ['showHorizontalScroll', 'true'], ['showObjects', 'all'], ['showSheetTabs', 'true'], ['showStatusbar', 'true'], ['showVerticalScroll', 'true'], ['tabRatio', '600'], ['xWindow', '0'], ['yWindow', '0'] ];*/ function push_defaults_array(target, defaults) { for(var j = 0; j != target.length; ++j) { var w = target[j]; for(var i=0; i != defaults.length; ++i) { var z = defaults[i]; if(w[z[0]] == null) w[z[0]] = z[1]; else switch(z[2]) { case "bool": if(typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]]); break; case "int": if(typeof w[z[0]] == "string") w[z[0]] = parseInt(w[z[0]], 10); break; } } } } function push_defaults(target, defaults) { for(var i = 0; i != defaults.length; ++i) { var z = defaults[i]; if(target[z[0]] == null) target[z[0]] = z[1]; else switch(z[2]) { case "bool": if(typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]]); break; case "int": if(typeof target[z[0]] == "string") target[z[0]] = parseInt(target[z[0]], 10); break; } } } function parse_wb_defaults(wb) { push_defaults(wb.WBProps, WBPropsDef); push_defaults(wb.CalcPr, CalcPrDef); push_defaults_array(wb.WBView, WBViewDef); push_defaults_array(wb.Sheets, SheetDef); _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904); } function safe1904(wb/*:Workbook*/)/*:string*/ { /* TODO: store date1904 somewhere else */ if(!wb.Workbook) return "false"; if(!wb.Workbook.WBProps) return "false"; return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false"; } var badchars = /*#__PURE__*/"][*?\/\\".split(""); function check_ws_name(n/*:string*/, safe/*:?boolean*/)/*:boolean*/ { if(n.length > 31) { if(safe) return false; throw new Error("Sheet names cannot exceed 31 chars"); } var _good = true; badchars.forEach(function(c) { if(n.indexOf(c) == -1) return; if(!safe) throw new Error("Sheet name cannot contain : \\ / ? * [ ]"); _good = false; }); return _good; } function check_wb_names(N, S, codes) { N.forEach(function(n,i) { check_ws_name(n); for(var j = 0; j < i; ++j) if(n == N[j]) throw new Error("Duplicate Sheet Name: " + n); if(codes) { var cn = (S && S[i] && S[i].CodeName) || n; if(cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error("Bad Code Name: Worksheet" + cn); } }); } function check_wb(wb) { if(!wb || !wb.SheetNames || !wb.Sheets) throw new Error("Invalid Workbook"); if(!wb.SheetNames.length) throw new Error("Workbook is empty"); var Sheets = (wb.Workbook && wb.Workbook.Sheets) || []; check_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw); for(var i = 0; i < wb.SheetNames.length; ++i) check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i); /* TODO: validate workbook */ } /* 18.2 Workbook */ var wbnsregex = /<\w+:workbook/; function parse_wb_xml(data, opts)/*:WorkbookFile*/ { if(!data) throw new Error("Could not find file"); var wb = /*::(*/{ AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, Names:[], xmlns: "" }/*::)*/; var pass = false, xmlns = "xmlns"; var dname = {}, dnstart = 0; data.replace(tagregex, function xml_wb(x, idx) { var y/*:any*/ = parsexmltag(x); switch(strip_ns(y[0])) { case '': break; /* 18.2.13 fileVersion CT_FileVersion ? */ case '': case '': break; /* 18.2.12 fileSharing CT_FileSharing ? */ case '': break; /* 18.2.28 workbookPr CT_WorkbookPr ? */ case '': WBPropsDef.forEach(function(w) { if(y[w[0]] == null) return; switch(w[2]) { case "bool": wb.WBProps[w[0]] = parsexmlbool(y[w[0]]); break; case "int": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break; default: wb.WBProps[w[0]] = y[w[0]]; } }); if(y.codeName) wb.WBProps.CodeName = utf8read(y.codeName); break; case '': break; /* 18.2.29 workbookProtection CT_WorkbookProtection ? */ case '': break; /* 18.2.1 bookViews CT_BookViews ? */ case '': case '': break; /* 18.2.30 workbookView CT_BookView + */ case '': delete y[0]; wb.WBView.push(y); break; case '': break; /* 18.2.20 sheets CT_Sheets 1 */ case '': case '': break; // aggregate sheet /* 18.2.19 sheet CT_Sheet + */ case '': break; /* 18.2.15 functionGroups CT_FunctionGroups ? */ case '': break; /* 18.2.14 functionGroup CT_FunctionGroup + */ case '': case '': break; /* 18.2.8 externalReference CT_ExternalReference + */ case '': break; case '': case '': pass=false; break; /* 18.2.5 definedName CT_DefinedName + */ case '': { dname.Ref = unescapexml(utf8read(data.slice(dnstart, idx))); wb.Names.push(dname); } break; case '': break; /* 18.2.2 calcPr CT_CalcPr ? */ case '': delete y[0]; wb.CalcPr = y; break; case '': break; /* 18.2.16 oleSize CT_OleSize ? (ref required) */ case '': case '': case '': break; /* 18.2.18 pivotCaches CT_PivotCaches ? */ case '': case '': case '': break; /* 18.2.23 smartTagTypes CT_SmartTagTypes ? */ case '': case '': break; /* 18.2.22 smartTagType CT_SmartTagType ? */ case '': break; /* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */ case '': break; /* 18.2.26 webPublishObjects CT_WebPublishObjects ? */ case '': case '': break; /* 18.2.25 webPublishObject CT_WebPublishObject ? */ case '': case '': case '': break; /* 18.2.7 ext CT_Extension + */ case '': pass=false; break; /* Others */ case '': pass=true; break; case '': pass=false; break; /* TODO */ case ' 0); /* fileVersion */ /* fileSharing */ var workbookPr/*:any*/ = ({codeName:"ThisWorkbook"}/*:any*/); if(wb.Workbook && wb.Workbook.WBProps) { WBPropsDef.forEach(function(x) { /*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw "unreachable"; */ if((wb.Workbook.WBProps[x[0]]/*:any*/) == null) return; if((wb.Workbook.WBProps[x[0]]/*:any*/) == x[1]) return; workbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]/*:any*/); }); /*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw "unreachable"; */ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.CodeName; delete workbookPr.CodeName; } } o[o.length] = (writextag('workbookPr', null, workbookPr)); /* workbookProtection */ var sheets = wb.Workbook && wb.Workbook.Sheets || []; var i = 0; /* bookViews only written if first worksheet is hidden */ if(sheets && sheets[0] && !!sheets[0].Hidden) { o[o.length] = ""; for(i = 0; i != wb.SheetNames.length; ++i) { if(!sheets[i]) break; if(!sheets[i].Hidden) break; } if(i == wb.SheetNames.length) i = 0; o[o.length] = ''; o[o.length] = ""; } o[o.length] = ""; for(i = 0; i != wb.SheetNames.length; ++i) { var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))}/*:any*/); sht.sheetId = ""+(i+1); sht["r:id"] = "rId"+(i+1); if(sheets[i]) switch(sheets[i].Hidden) { case 1: sht.state = "hidden"; break; case 2: sht.state = "veryHidden"; break; } o[o.length] = (writextag('sheet',null,sht)); } o[o.length] = ""; /* functionGroups */ /* externalReferences */ if(write_names) { o[o.length] = ""; if(wb.Workbook && wb.Workbook.Names) wb.Workbook.Names.forEach(function(n) { var d/*:any*/ = {name:n.Name}; if(n.Comment) d.comment = n.Comment; if(n.Sheet != null) d.localSheetId = ""+n.Sheet; if(n.Hidden) d.hidden = "1"; if(!n.Ref) return; o[o.length] = writextag('definedName', escapexml(n.Ref), d); }); o[o.length] = ""; } /* calcPr */ /* oleSize */ /* customWorkbookViews */ /* pivotCaches */ /* smartTagPr */ /* smartTagTypes */ /* webPublishing */ /* fileRecoveryPr */ /* webPublishObjects */ /* extLst */ if(o.length>2){ o[o.length] = ''; o[1]=o[1].replace("/>",">"); } return o.join(""); } /* [MS-XLSB] 2.4.304 BrtBundleSh */ function parse_BrtBundleSh(data, length/*:number*/) { var z = {}; z.Hidden = data.read_shift(4); //hsState ST_SheetState z.iTabID = data.read_shift(4); z.strRelID = parse_RelID(data,length-8); z.name = parse_XLWideString(data); return z; } function write_BrtBundleSh(data, o) { if(!o) o = new_buf(127); o.write_shift(4, data.Hidden); o.write_shift(4, data.iTabID); write_RelID(data.strRelID, o); write_XLWideString(data.name.slice(0,31), o); return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.815 BrtWbProp */ function parse_BrtWbProp(data, length)/*:WBProps*/ { var o/*:WBProps*/ = ({}/*:any*/); var flags = data.read_shift(4); o.defaultThemeVersion = data.read_shift(4); var strName = (length > 8) ? parse_XLWideString(data) : ""; if(strName.length > 0) o.CodeName = strName; o.autoCompressPictures = !!(flags & 0x10000); o.backupFile = !!(flags & 0x40); o.checkCompatibility = !!(flags & 0x1000); o.date1904 = !!(flags & 0x01); o.filterPrivacy = !!(flags & 0x08); o.hidePivotFieldList = !!(flags & 0x400); o.promptedSolutions = !!(flags & 0x10); o.publishItems = !!(flags & 0x800); o.refreshAllConnections = !!(flags & 0x40000); o.saveExternalLinkValues = !!(flags & 0x80); o.showBorderUnselectedTables = !!(flags & 0x04); o.showInkAnnotation = !!(flags & 0x20); o.showObjects = ["all", "placeholders", "none"][(flags >> 13) & 0x03]; o.showPivotChartFilter = !!(flags & 0x8000); o.updateLinks = ["userSet", "never", "always"][(flags >> 8) & 0x03]; return o; } function write_BrtWbProp(data/*:?WBProps*/, o) { if(!o) o = new_buf(72); var flags = 0; if(data) { /* TODO: mirror parse_BrtWbProp fields */ if(data.filterPrivacy) flags |= 0x08; } o.write_shift(4, flags); o.write_shift(4, 0); write_XLSBCodeName(data && data.CodeName || "ThisWorkbook", o); return o.slice(0, o.l); } function parse_BrtFRTArchID$(data, length) { var o = {}; data.read_shift(4); o.ArchID = data.read_shift(4); data.l += length - 8; return o; } /* [MS-XLSB] 2.4.687 BrtName */ function parse_BrtName(data, length, opts) { var end = data.l + length; data.l += 4; //var flags = data.read_shift(4); data.l += 1; //var chKey = data.read_shift(1); var itab = data.read_shift(4); var name = parse_XLNameWideString(data); var formula = parse_XLSBNameParsedFormula(data, 0, opts); var comment = parse_XLNullableWideString(data); //if(0 /* fProc */) { // unusedstring1: XLNullableWideString // description: XLNullableWideString // helpTopic: XLNullableWideString // unusedstring2: XLNullableWideString //} data.l = end; var out = ({Name:name, Ptg:formula}/*:any*/); if(itab < 0xFFFFFFF) out.Sheet = itab; if(comment) out.Comment = comment; return out; } /* [MS-XLSB] 2.1.7.61 Workbook */ function parse_wb_bin(data, opts)/*:WorkbookFile*/ { var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" }; var state/*:Array*/ = []; var pass = false; if(!opts) opts = {}; opts.biff = 12; var Names = []; var supbooks = ([[]]/*:any*/); supbooks.SheetNames = []; supbooks.XTI = []; XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ }; recordhopper(data, function hopper_wb(val, R, RT) { switch(RT) { case 0x009C: /* 'BrtBundleSh' */ supbooks.SheetNames.push(val.name); wb.Sheets.push(val); break; case 0x0099: /* 'BrtWbProp' */ wb.WBProps = val; break; case 0x0027: /* 'BrtName' */ if(val.Sheet != null) opts.SID = val.Sheet; val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts); delete opts.SID; delete val.Ptg; Names.push(val); break; case 0x040C: /* 'BrtNameExt' */ break; case 0x0165: /* 'BrtSupSelf' */ case 0x0166: /* 'BrtSupSame' */ case 0x0163: /* 'BrtSupBookSrc' */ case 0x029B: /* 'BrtSupAddin' */ if(!supbooks[0].length) supbooks[0] = [RT, val]; else supbooks.push([RT, val]); supbooks[supbooks.length - 1].XTI = []; break; case 0x016A: /* 'BrtExternSheet' */ if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; } supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break; case 0x0169: /* 'BrtPlaceholderName' */ break; case 0x0817: /* 'BrtAbsPath15' */ case 0x009E: /* 'BrtBookView' */ case 0x008F: /* 'BrtBeginBundleShs' */ case 0x0298: /* 'BrtBeginFnGroup' */ case 0x0161: /* 'BrtBeginExternals' */ break; /* case 'BrtModelTimeGroupingCalcCol' */ case 0x0C00: /* 'BrtUid' */ case 0x0C01: /* 'BrtRevisionPtr' */ case 0x0216: /* 'BrtBookProtection' */ case 0x02A5: /* 'BrtBookProtectionIso' */ case 0x009D: /* 'BrtCalcProp' */ case 0x0262: /* 'BrtCrashRecErr' */ case 0x0802: /* 'BrtDecoupledPivotCacheID' */ case 0x009B: /* 'BrtFileRecover' */ case 0x0224: /* 'BrtFileSharing' */ case 0x02A4: /* 'BrtFileSharingIso' */ case 0x0080: /* 'BrtFileVersion' */ case 0x0299: /* 'BrtFnGroup' */ case 0x0850: /* 'BrtModelRelationship' */ case 0x084D: /* 'BrtModelTable' */ case 0x0225: /* 'BrtOleSize' */ case 0x0805: /* 'BrtPivotTableRef' */ case 0x0254: /* 'BrtSmartTagType' */ case 0x081C: /* 'BrtTableSlicerCacheID' */ case 0x081B: /* 'BrtTableSlicerCacheIDs' */ case 0x0822: /* 'BrtTimelineCachePivotCacheID' */ case 0x018D: /* 'BrtUserBookView' */ case 0x009A: /* 'BrtWbFactoid' */ case 0x045D: /* 'BrtWbProp14' */ case 0x0229: /* 'BrtWebOpt' */ case 0x082B: /* 'BrtWorkBookPr15' */ break; case 0x0023: /* 'BrtFRTBegin' */ state.push(RT); pass = true; break; case 0x0024: /* 'BrtFRTEnd' */ state.pop(); pass = false; break; case 0x0025: /* 'BrtACBegin' */ state.push(RT); pass = true; break; case 0x0026: /* 'BrtACEnd' */ state.pop(); pass = false; break; case 0x0010: /* 'BrtFRTArchID$' */ break; default: if(R.T){/* empty */} else if(!pass || (opts.WTF && state[state.length-1] != 0x0025 /* BrtACBegin */ && state[state.length-1] != 0x0023 /* BrtFRTBegin */)) throw new Error("Unexpected record 0x" + RT.toString(16)); } }, opts); parse_wb_defaults(wb); // $FlowIgnore wb.Names = Names; (wb/*:any*/).supbooks = supbooks; return wb; } function write_BUNDLESHS(ba, wb/*::, opts*/) { write_record(ba, 0x008F /* BrtBeginBundleShs */); for(var idx = 0; idx != wb.SheetNames.length; ++idx) { var viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0; var d = { Hidden: viz, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] }; write_record(ba, 0x009C /* BrtBundleSh */, write_BrtBundleSh(d)); } write_record(ba, 0x0090 /* BrtEndBundleShs */); } /* [MS-XLSB] 2.4.649 BrtFileVersion */ function write_BrtFileVersion(data, o) { if(!o) o = new_buf(127); for(var i = 0; i != 4; ++i) o.write_shift(4, 0); write_XLWideString("SheetJS", o); write_XLWideString(XLSX.version, o); write_XLWideString(XLSX.version, o); write_XLWideString("7262", o); return o.length > o.l ? o.slice(0, o.l) : o; } /* [MS-XLSB] 2.4.301 BrtBookView */ function write_BrtBookView(idx, o) { if(!o) o = new_buf(29); o.write_shift(-4, 0); o.write_shift(-4, 460); o.write_shift(4, 28800); o.write_shift(4, 17600); o.write_shift(4, 500); o.write_shift(4, idx); o.write_shift(4, idx); var flags = 0x78; o.write_shift(1, flags); return o.length > o.l ? o.slice(0, o.l) : o; } function write_BOOKVIEWS(ba, wb/*::, opts*/) { /* required if hidden tab appears before visible tab */ if(!wb.Workbook || !wb.Workbook.Sheets) return; var sheets = wb.Workbook.Sheets; var i = 0, vistab = -1, hidden = -1; for(; i < sheets.length; ++i) { if(!sheets[i] || !sheets[i].Hidden && vistab == -1) vistab = i; else if(sheets[i].Hidden == 1 && hidden == -1) hidden = i; } if(hidden > vistab) return; write_record(ba, 0x0087 /* BrtBeginBookViews */); write_record(ba, 0x009E /* BrtBookView */, write_BrtBookView(vistab)); /* 1*(BrtBookView *FRT) */ write_record(ba, 0x0088 /* BrtEndBookViews */); } /* [MS-XLSB] 2.4.305 BrtCalcProp */ /*function write_BrtCalcProp(data, o) { if(!o) o = new_buf(26); o.write_shift(4,0); // force recalc o.write_shift(4,1); o.write_shift(4,0); write_Xnum(0, o); o.write_shift(-4, 1023); o.write_shift(1, 0x33); o.write_shift(1, 0x00); return o; }*/ /* [MS-XLSB] 2.4.646 BrtFileRecover */ /*function write_BrtFileRecover(data, o) { if(!o) o = new_buf(1); o.write_shift(1,0); return o; }*/ /* [MS-XLSB] 2.1.7.61 Workbook */ function write_wb_bin(wb, opts) { var ba = buf_array(); write_record(ba, 0x0083 /* BrtBeginBook */); write_record(ba, 0x0080 /* BrtFileVersion */, write_BrtFileVersion()); /* [[BrtFileSharingIso] BrtFileSharing] */ write_record(ba, 0x0099 /* BrtWbProp */, write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null)); /* [ACABSPATH] */ /* [[BrtBookProtectionIso] BrtBookProtection] */ write_BOOKVIEWS(ba, wb, opts); write_BUNDLESHS(ba, wb, opts); /* [FNGROUP] */ /* [EXTERNALS] */ /* *BrtName */ /* write_record(ba, 0x009D BrtCalcProp, write_BrtCalcProp()); */ /* [BrtOleSize] */ /* *(BrtUserBookView *FRT) */ /* [PIVOTCACHEIDS] */ /* [BrtWbFactoid] */ /* [SMARTTAGTYPES] */ /* [BrtWebOpt] */ /* write_record(ba, 0x009B BrtFileRecover, write_BrtFileRecover()); */ /* [WEBPUBITEMS] */ /* [CRERRS] */ /* FRTWORKBOOK */ write_record(ba, 0x0084 /* BrtEndBook */); return ba.end(); } function parse_wb(data, name/*:string*/, opts)/*:WorkbookFile*/ { if(name.slice(-4)===".bin") return parse_wb_bin((data/*:any*/), opts); return parse_wb_xml((data/*:any*/), opts); } function parse_ws(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ { if(name.slice(-4)===".bin") return parse_ws_bin((data/*:any*/), opts, idx, rels, wb, themes, styles); return parse_ws_xml((data/*:any*/), opts, idx, rels, wb, themes, styles); } function parse_cs(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ { if(name.slice(-4)===".bin") return parse_cs_bin((data/*:any*/), opts, idx, rels, wb, themes, styles); return parse_cs_xml((data/*:any*/), opts, idx, rels, wb, themes, styles); } function parse_ms(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ { if(name.slice(-4)===".bin") return parse_ms_bin((data/*:any*/), opts, idx, rels, wb, themes, styles); return parse_ms_xml((data/*:any*/), opts, idx, rels, wb, themes, styles); } function parse_ds(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ { if(name.slice(-4)===".bin") return parse_ds_bin((data/*:any*/), opts, idx, rels, wb, themes, styles); return parse_ds_xml((data/*:any*/), opts, idx, rels, wb, themes, styles); } function parse_sty(data, name/*:string*/, themes, opts) { if(name.slice(-4)===".bin") return parse_sty_bin((data/*:any*/), themes, opts); return parse_sty_xml((data/*:any*/), themes, opts); } function parse_theme(data/*:string*/, name/*:string*/, opts) { return parse_theme_xml(data, opts); } function parse_sst(data, name/*:string*/, opts)/*:SST*/ { if(name.slice(-4)===".bin") return parse_sst_bin((data/*:any*/), opts); return parse_sst_xml((data/*:any*/), opts); } function parse_cmnt(data, name/*:string*/, opts)/*:Array*/ { if(name.slice(-4)===".bin") return parse_comments_bin((data/*:any*/), opts); return parse_comments_xml((data/*:any*/), opts); } function parse_cc(data, name/*:string*/, opts) { if(name.slice(-4)===".bin") return parse_cc_bin((data/*:any*/), name, opts); return parse_cc_xml((data/*:any*/), name, opts); } function parse_xlink(data, rel, name/*:string*/, opts) { if(name.slice(-4)===".bin") return parse_xlink_bin((data/*:any*/), rel, name, opts); return parse_xlink_xml((data/*:any*/), rel, name, opts); } function parse_xlmeta(data, name/*:string*/, opts) { if(name.slice(-4)===".bin") return parse_xlmeta_bin((data/*:any*/), name, opts); return parse_xlmeta_xml((data/*:any*/), name, opts); } function write_wb(wb, name/*:string*/, opts) { return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts); } function write_ws(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) { return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels); } // eslint-disable-next-line no-unused-vars function write_cs(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) { return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels); } function write_sty(data, name/*:string*/, opts) { return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts); } function write_sst(data/*:SST*/, name/*:string*/, opts) { return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts); } function write_cmnt(data/*:Array*/, name/*:string*/, opts) { return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts); } /* function write_cc(data, name:string, opts) { return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts); } */ function write_xlmeta(name/*:string*/) { return (name.slice(-4)===".bin" ? write_xlmeta_bin : write_xlmeta_xml)(); } var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g; var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/; function xlml_parsexmltag(tag/*:string*/, skip_root/*:?boolean*/) { var words = tag.split(/\s+/); var z/*:any*/ = ([]/*:any*/); if(!skip_root) z[0] = words[0]; if(words.length === 1) return z; var m = tag.match(attregexg2), y, j, w, i; if(m) for(i = 0; i != m.length; ++i) { y = m[i].match(attregex2); /*:: if(!y || !y[2]) continue; */ if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); else { if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); else w = y[1].slice(j+1); z[w] = y[2].slice(1,y[2].length-1); } } return z; } function xlml_parsexmltagobj(tag/*:string*/) { var words = tag.split(/\s+/); var z = {}; if(words.length === 1) return z; var m = tag.match(attregexg2), y, j, w, i; if(m) for(i = 0; i != m.length; ++i) { y = m[i].match(attregex2); /*:: if(!y || !y[2]) continue; */ if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); else { if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); else w = y[1].slice(j+1); z[w] = y[2].slice(1,y[2].length-1); } } return z; } // ---- /* map from xlml named formats to SSF TODO: localize */ var XLMLFormatMap/*: {[string]:string}*/; function xlml_format(format, value)/*:string*/ { var fmt = XLMLFormatMap[format] || unescapexml(format); if(fmt === "General") return SSF_general(value); return SSF_format(fmt, value); } function xlml_set_custprop(Custprops, key, cp, val/*:string*/) { var oval/*:any*/ = val; switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]) { case "boolean": oval = parsexmlbool(val); break; case "i2": case "int": oval = parseInt(val, 10); break; case "r4": case "float": oval = parseFloat(val); break; case "date": case "dateTime.tz": oval = parseDate(val); break; case "i8": case "string": case "fixed": case "uuid": case "bin.base64": break; default: throw new Error("bad custprop:" + cp[0]); } Custprops[unescapexml(key)] = oval; } function safe_format_xlml(cell/*:Cell*/, nf, o) { if(cell.t === 'z') return; if(!o || o.cellText !== false) try { if(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; } else if(nf === "General") { if(cell.t === 'n') { if((cell.v|0) === cell.v) cell.w = cell.v.toString(10); else cell.w = SSF_general_num(cell.v); } else cell.w = SSF_general(cell.v); } else cell.w = xlml_format(nf||"General", cell.v); } catch(e) { if(o.WTF) throw e; } try { var z = XLMLFormatMap[nf]||nf||"General"; if(o.cellNF) cell.z = z; if(o.cellDates && cell.t == 'n' && fmt_is_date(z)) { var _d = SSF_parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); } } } catch(e) { if(o.WTF) throw e; } } function process_style_xlml(styles, stag, opts) { if(opts.cellStyles) { if(stag.Interior) { var I = stag.Interior; if(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern; } } styles[stag.ID] = stag; } /* TODO: there must exist some form of OSP-blessed spec */ function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, arrayf, o) { var nf = "General", sid = cell.StyleID, S = {}; o = o || {}; var interiors = []; var i = 0; if(sid === undefined && row) sid = row.StyleID; if(sid === undefined && csty) sid = csty.StyleID; while(styles[sid] !== undefined) { if(styles[sid].nf) nf = styles[sid].nf; if(styles[sid].Interior) interiors.push(styles[sid].Interior); if(!styles[sid].Parent) break; sid = styles[sid].Parent; } switch(data.Type) { case 'Boolean': cell.t = 'b'; cell.v = parsexmlbool(xml); break; case 'String': cell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml)); cell.v = (xml.indexOf("<") > -1 ? unescapexml(ss||xml).replace(/<.*?>/g, "") : cell.r); // todo: BR etc break; case 'DateTime': if(xml.slice(-1) != "Z") xml += "Z"; cell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); if(cell.v !== cell.v) cell.v = unescapexml(xml); else if(cell.v<60) cell.v = cell.v -1; if(!nf || nf == "General") nf = "yyyy-mm-dd"; /* falls through */ case 'Number': if(cell.v === undefined) cell.v=+xml; if(!cell.t) cell.t = 'n'; break; case 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break; default: if(xml == "" && ss == "") { cell.t = 'z'; } else { cell.t = 's'; cell.v = xlml_fixstr(ss||xml); } break; } safe_format_xlml(cell, nf, o); if(o.cellFormula !== false) { if(cell.Formula) { var fstr = unescapexml(cell.Formula); /* strictly speaking, the leading = is required but some writers omit */ if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1); cell.f = rc_to_a1(fstr, base); delete cell.Formula; if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base); else if(cell.ArrayRange) { cell.F = rc_to_a1(cell.ArrayRange, base); arrayf.push([safe_decode_range(cell.F), cell.F]); } } else { for(i = 0; i < arrayf.length; ++i) if(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r) if(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c) cell.F = arrayf[i][1]; } } if(o.cellStyles) { interiors.forEach(function(x) { if(!S.patternType && x.patternType) S.patternType = x.patternType; }); cell.s = S; } if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID; } function xlml_clean_comment(comment/*:any*/) { comment.t = comment.v || ""; comment.t = comment.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n"); comment.v = comment.w = comment.ixfe = undefined; } /* TODO: Everything */ function parse_xlml_xml(d, _opts)/*:Workbook*/ { var opts = _opts || {}; make_ssf(); var str = debom(xlml_normalize(d)); if(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') { if(typeof $cptable !== 'undefined') str = $cptable.utils.decode(65001, char_codes(str)); else str = utf8read(str); } var opening = str.slice(0, 1024).toLowerCase(), ishtml = false; opening = opening.replace(/".*?"/g, ""); if((opening.indexOf(">") & 1023) > Math.min((opening.indexOf(",") & 1023), (opening.indexOf(";")&1023))) { var _o = dup(opts); _o.type = "string"; return PRN.to_workbook(str, _o); } if(opening.indexOf("= 0) ishtml = true; }); if(ishtml) return html_to_workbook(str, opts); XLMLFormatMap = ({ "General Number": "General", "General Date": table_fmt[22], "Long Date": "dddd, mmmm dd, yyyy", "Medium Date": table_fmt[15], "Short Date": table_fmt[14], "Long Time": table_fmt[19], "Medium Time": table_fmt[18], "Short Time": table_fmt[20], "Currency": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)', "Fixed": table_fmt[2], "Standard": table_fmt[4], "Percent": table_fmt[10], "Scientific": table_fmt[11], "Yes/No": '"Yes";"Yes";"No";@', "True/False": '"True";"True";"False";@', "On/Off": '"Yes";"Yes";"No";@' }/*:any*/); var Rn; var state = [], tmp; if(DENSE != null && opts.dense == null) opts.dense = DENSE; var sheets = {}, sheetnames/*:Array*/ = [], cursheet/*:Worksheet*/ = (opts.dense ? [] : {}), sheetname = ""; var cell = ({}/*:any*/), row = {};// eslint-disable-line no-unused-vars var dtag = xlml_parsexmltag(''), didx = 0; var c = 0, r = 0; var refguess/*:Range*/ = {s: {r:2000000, c:2000000}, e: {r:0, c:0} }; var styles = {}, stag = {}; var ss = "", fidx = 0; var merges/*:Array*/ = []; var Props = {}, Custprops = {}, pidx = 0, cp = []; var comments/*:Array*/ = [], comment/*:Comment*/ = ({}/*:any*/); var cstys = [], csty, seencol = false; var arrayf/*:Array<[Range, string]>*/ = []; var rowinfo/*:Array*/ = [], rowobj = {}, cc = 0, rr = 0; var Workbook/*:WBWBProps*/ = ({ Sheets:[], WBProps:{date1904:false} }/*:any*/), wsprops = {}; xlmlregex.lastIndex = 0; str = str.replace(//mg,""); var raw_Rn3 = ""; while((Rn = xlmlregex.exec(str))) switch((Rn[3] = (raw_Rn3 = Rn[3]).toLowerCase())) { case 'data' /*case 'Data'*/: if(raw_Rn3 == "data") { if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]); break; } if(state[state.length-1][1]) break; if(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]==/*"Comment"*/"comment"?comment:cell, {c:c,r:r}, styles, cstys[c], row, arrayf, opts); else { ss = ""; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; } break; case 'cell' /*case 'Cell'*/: if(Rn[1]==='/'){ if(comments.length > 0) cell.c = comments; if((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) { if(opts.dense) { if(!cursheet[r]) cursheet[r] = []; cursheet[r][c] = cell; } else cursheet[encode_col(c) + encode_row(r)] = cell; } if(cell.HRef) { cell.l = ({Target:unescapexml(cell.HRef)}/*:any*/); if(cell.HRefScreenTip) cell.l.Tooltip = cell.HRefScreenTip; delete cell.HRef; delete cell.HRefScreenTip; } if(cell.MergeAcross || cell.MergeDown) { cc = c + (parseInt(cell.MergeAcross,10)|0); rr = r + (parseInt(cell.MergeDown,10)|0); merges.push({s:{c:c,r:r},e:{c:cc,r:rr}}); } if(!opts.sheetStubs) { if(cell.MergeAcross) c = cc + 1; else ++c; } else if(cell.MergeAcross || cell.MergeDown) { /*:: if(!cc) cc = 0; if(!rr) rr = 0; */ for(var cma = c; cma <= cc; ++cma) { for(var cmd = r; cmd <= rr; ++cmd) { if(cma > c || cmd > r) { if(opts.dense) { if(!cursheet[cmd]) cursheet[cmd] = []; cursheet[cmd][cma] = {t:'z'}; } else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'}; } } } c = cc + 1; } else ++c; } else { cell = xlml_parsexmltagobj(Rn[0]); if(cell.Index) c = +cell.Index - 1; if(c < refguess.s.c) refguess.s.c = c; if(c > refguess.e.c) refguess.e.c = c; if(Rn[0].slice(-2) === "/>") ++c; comments = []; } break; case 'row' /*case 'Row'*/: if(Rn[1]==='/' || Rn[0].slice(-2) === "/>") { if(r < refguess.s.r) refguess.s.r = r; if(r > refguess.e.r) refguess.e.r = r; if(Rn[0].slice(-2) === "/>") { row = xlml_parsexmltag(Rn[0]); if(row.Index) r = +row.Index - 1; } c = 0; ++r; } else { row = xlml_parsexmltag(Rn[0]); if(row.Index) r = +row.Index - 1; rowobj = {}; if(row.AutoFitHeight == "0" || row.Height) { rowobj.hpx = parseInt(row.Height, 10); rowobj.hpt = px2pt(rowobj.hpx); rowinfo[r] = rowobj; } if(row.Hidden == "1") { rowobj.hidden = true; rowinfo[r] = rowobj; } } break; case 'worksheet' /*case 'Worksheet'*/: /* TODO: read range from FullRows/FullColumns */ if(Rn[1]==='/'){ if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|")); sheetnames.push(sheetname); if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) { cursheet["!ref"] = encode_range(refguess); if(opts.sheetRows && opts.sheetRows <= refguess.e.r) { cursheet["!fullref"] = cursheet["!ref"]; refguess.e.r = opts.sheetRows - 1; cursheet["!ref"] = encode_range(refguess); } } if(merges.length) cursheet["!merges"] = merges; if(cstys.length > 0) cursheet["!cols"] = cstys; if(rowinfo.length > 0) cursheet["!rows"] = rowinfo; sheets[sheetname] = cursheet; } else { refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} }; r = c = 0; state.push([Rn[3], false]); tmp = xlml_parsexmltag(Rn[0]); sheetname = unescapexml(tmp.Name); cursheet = (opts.dense ? [] : {}); merges = []; arrayf = []; rowinfo = []; wsprops = {name:sheetname, Hidden:0}; Workbook.Sheets.push(wsprops); } break; case 'table' /*case 'Table'*/: if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].slice(-2) == "/>") break; else { state.push([Rn[3], false]); cstys = []; seencol = false; } break; case 'style' /*case 'Style'*/: if(Rn[1]==='/') process_style_xlml(styles, stag, opts); else stag = xlml_parsexmltag(Rn[0]); break; case 'numberformat' /*case 'NumberFormat'*/: stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General"); if(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf]; for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == stag.nf) break; if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == null) { SSF_load(stag.nf, ssfidx); break; } break; case 'column' /*case 'Column'*/: if(state[state.length-1][0] !== /*'Table'*/'table') break; csty = xlml_parsexmltag(Rn[0]); if(csty.Hidden) { csty.hidden = true; delete csty.Hidden; } if(csty.Width) csty.wpx = parseInt(csty.Width, 10); if(!seencol && csty.wpx > 10) { seencol = true; MDW = DEF_MDW; //find_mdw_wpx(csty.wpx); for(var _col = 0; _col < cstys.length; ++_col) if(cstys[_col]) process_col(cstys[_col]); } if(seencol) process_col(csty); cstys[(csty.Index-1||cstys.length)] = csty; for(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = dup(csty); break; case 'namedrange' /*case 'NamedRange'*/: if(Rn[1]==='/') break; if(!Workbook.Names) Workbook.Names = []; var _NamedRange = parsexmltag(Rn[0]); var _DefinedName/*:DefinedName*/ = ({ Name: _NamedRange.Name, Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0}) }/*:any*/); if(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1; /*:: if(Workbook.Names) */Workbook.Names.push(_DefinedName); break; case 'namedcell' /*case 'NamedCell'*/: break; case 'b' /*case 'B'*/: break; case 'i' /*case 'I'*/: break; case 'u' /*case 'U'*/: break; case 's' /*case 'S'*/: break; case 'em' /*case 'EM'*/: break; case 'h2' /*case 'H2'*/: break; case 'h3' /*case 'H3'*/: break; case 'sub' /*case 'Sub'*/: break; case 'sup' /*case 'Sup'*/: break; case 'span' /*case 'Span'*/: break; case 'alignment' /*case 'Alignment'*/: break; case 'borders' /*case 'Borders'*/: break; case 'border' /*case 'Border'*/: break; case 'font' /*case 'Font'*/: if(Rn[0].slice(-2) === "/>") break; else if(Rn[1]==="/") ss += str.slice(fidx, Rn.index); else fidx = Rn.index + Rn[0].length; break; case 'interior' /*case 'Interior'*/: if(!opts.cellStyles) break; stag.Interior = xlml_parsexmltag(Rn[0]); break; case 'protection' /*case 'Protection'*/: break; case 'author' /*case 'Author'*/: case 'title' /*case 'Title'*/: case 'description' /*case 'Description'*/: case 'created' /*case 'Created'*/: case 'keywords' /*case 'Keywords'*/: case 'subject' /*case 'Subject'*/: case 'category' /*case 'Category'*/: case 'company' /*case 'Company'*/: case 'lastauthor' /*case 'LastAuthor'*/: case 'lastsaved' /*case 'LastSaved'*/: case 'lastprinted' /*case 'LastPrinted'*/: case 'version' /*case 'Version'*/: case 'revision' /*case 'Revision'*/: case 'totaltime' /*case 'TotalTime'*/: case 'hyperlinkbase' /*case 'HyperlinkBase'*/: case 'manager' /*case 'Manager'*/: case 'contentstatus' /*case 'ContentStatus'*/: case 'identifier' /*case 'Identifier'*/: case 'language' /*case 'Language'*/: case 'appname' /*case 'AppName'*/: if(Rn[0].slice(-2) === "/>") break; else if(Rn[1]==="/") xlml_set_prop(Props, raw_Rn3, str.slice(pidx, Rn.index)); else pidx = Rn.index + Rn[0].length; break; case 'paragraphs' /*case 'Paragraphs'*/: break; case 'styles' /*case 'Styles'*/: case 'workbook' /*case 'Workbook'*/: if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else state.push([Rn[3], false]); break; case 'comment' /*case 'Comment'*/: if(Rn[1]==='/'){ if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|")); xlml_clean_comment(comment); comments.push(comment); } else { state.push([Rn[3], false]); tmp = xlml_parsexmltag(Rn[0]); comment = ({a:tmp.Author}/*:any*/); } break; case 'autofilter' /*case 'AutoFilter'*/: if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].charAt(Rn[0].length-2) !== '/') { var AutoFilter = xlml_parsexmltag(Rn[0]); cursheet['!autofilter'] = { ref:rc_to_a1(AutoFilter.Range).replace(/\$/g,"") }; state.push([Rn[3], true]); } break; case 'name' /*case 'Name'*/: break; case 'datavalidation' /*case 'DataValidation'*/: if(Rn[1]==='/'){ if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|")); } else { if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]); } break; case 'pixelsperinch' /*case 'PixelsPerInch'*/: break; case 'componentoptions' /*case 'ComponentOptions'*/: case 'documentproperties' /*case 'DocumentProperties'*/: case 'customdocumentproperties' /*case 'CustomDocumentProperties'*/: case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/: case 'pivottable' /*case 'PivotTable'*/: case 'pivotcache' /*case 'PivotCache'*/: case 'names' /*case 'Names'*/: case 'mapinfo' /*case 'MapInfo'*/: case 'pagebreaks' /*case 'PageBreaks'*/: case 'querytable' /*case 'QueryTable'*/: case 'sorting' /*case 'Sorting'*/: case 'schema' /*case 'Schema'*/: //case 'data' /*case 'data'*/: case 'conditionalformatting' /*case 'ConditionalFormatting'*/: case 'smarttagtype' /*case 'SmartTagType'*/: case 'smarttags' /*case 'SmartTags'*/: case 'excelworkbook' /*case 'ExcelWorkbook'*/: case 'workbookoptions' /*case 'WorkbookOptions'*/: case 'worksheetoptions' /*case 'WorksheetOptions'*/: if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]); break; case 'null' /*case 'Null'*/: break; default: /* FODS file root is */ if(state.length == 0 && Rn[3] == "document") return parse_fods(str, opts); /* UOS file root is */ if(state.length == 0 && Rn[3] == "uof"/*"UOF"*/) return parse_fods(str, opts); var seen = true; switch(state[state.length-1][0]) { /* OfficeDocumentSettings */ case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/: switch(Rn[3]) { case 'allowpng' /*case 'AllowPNG'*/: break; case 'removepersonalinformation' /*case 'RemovePersonalInformation'*/: break; case 'downloadcomponents' /*case 'DownloadComponents'*/: break; case 'locationofcomponents' /*case 'LocationOfComponents'*/: break; case 'colors' /*case 'Colors'*/: break; case 'color' /*case 'Color'*/: break; case 'index' /*case 'Index'*/: break; case 'rgb' /*case 'RGB'*/: break; case 'targetscreensize' /*case 'TargetScreenSize'*/: break; case 'readonlyrecommended' /*case 'ReadOnlyRecommended'*/: break; default: seen = false; } break; /* ComponentOptions */ case 'componentoptions' /*case 'ComponentOptions'*/: switch(Rn[3]) { case 'toolbar' /*case 'Toolbar'*/: break; case 'hideofficelogo' /*case 'HideOfficeLogo'*/: break; case 'spreadsheetautofit' /*case 'SpreadsheetAutoFit'*/: break; case 'label' /*case 'Label'*/: break; case 'caption' /*case 'Caption'*/: break; case 'maxheight' /*case 'MaxHeight'*/: break; case 'maxwidth' /*case 'MaxWidth'*/: break; case 'nextsheetnumber' /*case 'NextSheetNumber'*/: break; default: seen = false; } break; /* ExcelWorkbook */ case 'excelworkbook' /*case 'ExcelWorkbook'*/: switch(Rn[3]) { case 'date1904' /*case 'Date1904'*/: /*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */ Workbook.WBProps.date1904 = true; break; case 'windowheight' /*case 'WindowHeight'*/: break; case 'windowwidth' /*case 'WindowWidth'*/: break; case 'windowtopx' /*case 'WindowTopX'*/: break; case 'windowtopy' /*case 'WindowTopY'*/: break; case 'tabratio' /*case 'TabRatio'*/: break; case 'protectstructure' /*case 'ProtectStructure'*/: break; case 'protectwindow' /*case 'ProtectWindow'*/: break; case 'protectwindows' /*case 'ProtectWindows'*/: break; case 'activesheet' /*case 'ActiveSheet'*/: break; case 'displayinknotes' /*case 'DisplayInkNotes'*/: break; case 'firstvisiblesheet' /*case 'FirstVisibleSheet'*/: break; case 'supbook' /*case 'SupBook'*/: break; case 'sheetname' /*case 'SheetName'*/: break; case 'sheetindex' /*case 'SheetIndex'*/: break; case 'sheetindexfirst' /*case 'SheetIndexFirst'*/: break; case 'sheetindexlast' /*case 'SheetIndexLast'*/: break; case 'dll' /*case 'Dll'*/: break; case 'acceptlabelsinformulas' /*case 'AcceptLabelsInFormulas'*/: break; case 'donotsavelinkvalues' /*case 'DoNotSaveLinkValues'*/: break; case 'iteration' /*case 'Iteration'*/: break; case 'maxiterations' /*case 'MaxIterations'*/: break; case 'maxchange' /*case 'MaxChange'*/: break; case 'path' /*case 'Path'*/: break; case 'xct' /*case 'Xct'*/: break; case 'count' /*case 'Count'*/: break; case 'selectedsheets' /*case 'SelectedSheets'*/: break; case 'calculation' /*case 'Calculation'*/: break; case 'uncalced' /*case 'Uncalced'*/: break; case 'startupprompt' /*case 'StartupPrompt'*/: break; case 'crn' /*case 'Crn'*/: break; case 'externname' /*case 'ExternName'*/: break; case 'formula' /*case 'Formula'*/: break; case 'colfirst' /*case 'ColFirst'*/: break; case 'collast' /*case 'ColLast'*/: break; case 'wantadvise' /*case 'WantAdvise'*/: break; case 'boolean' /*case 'Boolean'*/: break; case 'error' /*case 'Error'*/: break; case 'text' /*case 'Text'*/: break; case 'ole' /*case 'OLE'*/: break; case 'noautorecover' /*case 'NoAutoRecover'*/: break; case 'publishobjects' /*case 'PublishObjects'*/: break; case 'donotcalculatebeforesave' /*case 'DoNotCalculateBeforeSave'*/: break; case 'number' /*case 'Number'*/: break; case 'refmoder1c1' /*case 'RefModeR1C1'*/: break; case 'embedsavesmarttags' /*case 'EmbedSaveSmartTags'*/: break; default: seen = false; } break; /* WorkbookOptions */ case 'workbookoptions' /*case 'WorkbookOptions'*/: switch(Rn[3]) { case 'owcversion' /*case 'OWCVersion'*/: break; case 'height' /*case 'Height'*/: break; case 'width' /*case 'Width'*/: break; default: seen = false; } break; /* WorksheetOptions */ case 'worksheetoptions' /*case 'WorksheetOptions'*/: switch(Rn[3]) { case 'visible' /*case 'Visible'*/: if(Rn[0].slice(-2) === "/>"){/* empty */} else if(Rn[1]==="/") switch(str.slice(pidx, Rn.index)) { case "SheetHidden": wsprops.Hidden = 1; break; case "SheetVeryHidden": wsprops.Hidden = 2; break; } else pidx = Rn.index + Rn[0].length; break; case 'header' /*case 'Header'*/: if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml'); if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].header = +parsexmltag(Rn[0]).Margin; break; case 'footer' /*case 'Footer'*/: if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml'); if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].footer = +parsexmltag(Rn[0]).Margin; break; case 'pagemargins' /*case 'PageMargins'*/: var pagemargins = parsexmltag(Rn[0]); if(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml'); if(!isNaN(+pagemargins.Top)) cursheet['!margins'].top = +pagemargins.Top; if(!isNaN(+pagemargins.Left)) cursheet['!margins'].left = +pagemargins.Left; if(!isNaN(+pagemargins.Right)) cursheet['!margins'].right = +pagemargins.Right; if(!isNaN(+pagemargins.Bottom)) cursheet['!margins'].bottom = +pagemargins.Bottom; break; case 'displayrighttoleft' /*case 'DisplayRightToLeft'*/: if(!Workbook.Views) Workbook.Views = []; if(!Workbook.Views[0]) Workbook.Views[0] = {}; Workbook.Views[0].RTL = true; break; case 'freezepanes' /*case 'FreezePanes'*/: break; case 'frozennosplit' /*case 'FrozenNoSplit'*/: break; case 'splithorizontal' /*case 'SplitHorizontal'*/: case 'splitvertical' /*case 'SplitVertical'*/: break; case 'donotdisplaygridlines' /*case 'DoNotDisplayGridlines'*/: break; case 'activerow' /*case 'ActiveRow'*/: break; case 'activecol' /*case 'ActiveCol'*/: break; case 'toprowbottompane' /*case 'TopRowBottomPane'*/: break; case 'leftcolumnrightpane' /*case 'LeftColumnRightPane'*/: break; case 'unsynced' /*case 'Unsynced'*/: break; case 'print' /*case 'Print'*/: break; case 'printerrors' /*case 'PrintErrors'*/: break; case 'panes' /*case 'Panes'*/: break; case 'scale' /*case 'Scale'*/: break; case 'pane' /*case 'Pane'*/: break; case 'number' /*case 'Number'*/: break; case 'layout' /*case 'Layout'*/: break; case 'pagesetup' /*case 'PageSetup'*/: break; case 'selected' /*case 'Selected'*/: break; case 'protectobjects' /*case 'ProtectObjects'*/: break; case 'enableselection' /*case 'EnableSelection'*/: break; case 'protectscenarios' /*case 'ProtectScenarios'*/: break; case 'validprinterinfo' /*case 'ValidPrinterInfo'*/: break; case 'horizontalresolution' /*case 'HorizontalResolution'*/: break; case 'verticalresolution' /*case 'VerticalResolution'*/: break; case 'numberofcopies' /*case 'NumberofCopies'*/: break; case 'activepane' /*case 'ActivePane'*/: break; case 'toprowvisible' /*case 'TopRowVisible'*/: break; case 'leftcolumnvisible' /*case 'LeftColumnVisible'*/: break; case 'fittopage' /*case 'FitToPage'*/: break; case 'rangeselection' /*case 'RangeSelection'*/: break; case 'papersizeindex' /*case 'PaperSizeIndex'*/: break; case 'pagelayoutzoom' /*case 'PageLayoutZoom'*/: break; case 'pagebreakzoom' /*case 'PageBreakZoom'*/: break; case 'filteron' /*case 'FilterOn'*/: break; case 'fitwidth' /*case 'FitWidth'*/: break; case 'fitheight' /*case 'FitHeight'*/: break; case 'commentslayout' /*case 'CommentsLayout'*/: break; case 'zoom' /*case 'Zoom'*/: break; case 'lefttoright' /*case 'LeftToRight'*/: break; case 'gridlines' /*case 'Gridlines'*/: break; case 'allowsort' /*case 'AllowSort'*/: break; case 'allowfilter' /*case 'AllowFilter'*/: break; case 'allowinsertrows' /*case 'AllowInsertRows'*/: break; case 'allowdeleterows' /*case 'AllowDeleteRows'*/: break; case 'allowinsertcols' /*case 'AllowInsertCols'*/: break; case 'allowdeletecols' /*case 'AllowDeleteCols'*/: break; case 'allowinserthyperlinks' /*case 'AllowInsertHyperlinks'*/: break; case 'allowformatcells' /*case 'AllowFormatCells'*/: break; case 'allowsizecols' /*case 'AllowSizeCols'*/: break; case 'allowsizerows' /*case 'AllowSizeRows'*/: break; case 'nosummaryrowsbelowdetail' /*case 'NoSummaryRowsBelowDetail'*/: if(!cursheet["!outline"]) cursheet["!outline"] = {}; cursheet["!outline"].above = true; break; case 'tabcolorindex' /*case 'TabColorIndex'*/: break; case 'donotdisplayheadings' /*case 'DoNotDisplayHeadings'*/: break; case 'showpagelayoutzoom' /*case 'ShowPageLayoutZoom'*/: break; case 'nosummarycolumnsrightdetail' /*case 'NoSummaryColumnsRightDetail'*/: if(!cursheet["!outline"]) cursheet["!outline"] = {}; cursheet["!outline"].left = true; break; case 'blackandwhite' /*case 'BlackAndWhite'*/: break; case 'donotdisplayzeros' /*case 'DoNotDisplayZeros'*/: break; case 'displaypagebreak' /*case 'DisplayPageBreak'*/: break; case 'rowcolheadings' /*case 'RowColHeadings'*/: break; case 'donotdisplayoutline' /*case 'DoNotDisplayOutline'*/: break; case 'noorientation' /*case 'NoOrientation'*/: break; case 'allowusepivottables' /*case 'AllowUsePivotTables'*/: break; case 'zeroheight' /*case 'ZeroHeight'*/: break; case 'viewablerange' /*case 'ViewableRange'*/: break; case 'selection' /*case 'Selection'*/: break; case 'protectcontents' /*case 'ProtectContents'*/: break; default: seen = false; } break; /* PivotTable */ case 'pivottable' /*case 'PivotTable'*/: case 'pivotcache' /*case 'PivotCache'*/: switch(Rn[3]) { case 'immediateitemsondrop' /*case 'ImmediateItemsOnDrop'*/: break; case 'showpagemultipleitemlabel' /*case 'ShowPageMultipleItemLabel'*/: break; case 'compactrowindent' /*case 'CompactRowIndent'*/: break; case 'location' /*case 'Location'*/: break; case 'pivotfield' /*case 'PivotField'*/: break; case 'orientation' /*case 'Orientation'*/: break; case 'layoutform' /*case 'LayoutForm'*/: break; case 'layoutsubtotallocation' /*case 'LayoutSubtotalLocation'*/: break; case 'layoutcompactrow' /*case 'LayoutCompactRow'*/: break; case 'position' /*case 'Position'*/: break; case 'pivotitem' /*case 'PivotItem'*/: break; case 'datatype' /*case 'DataType'*/: break; case 'datafield' /*case 'DataField'*/: break; case 'sourcename' /*case 'SourceName'*/: break; case 'parentfield' /*case 'ParentField'*/: break; case 'ptlineitems' /*case 'PTLineItems'*/: break; case 'ptlineitem' /*case 'PTLineItem'*/: break; case 'countofsameitems' /*case 'CountOfSameItems'*/: break; case 'item' /*case 'Item'*/: break; case 'itemtype' /*case 'ItemType'*/: break; case 'ptsource' /*case 'PTSource'*/: break; case 'cacheindex' /*case 'CacheIndex'*/: break; case 'consolidationreference' /*case 'ConsolidationReference'*/: break; case 'filename' /*case 'FileName'*/: break; case 'reference' /*case 'Reference'*/: break; case 'nocolumngrand' /*case 'NoColumnGrand'*/: break; case 'norowgrand' /*case 'NoRowGrand'*/: break; case 'blanklineafteritems' /*case 'BlankLineAfterItems'*/: break; case 'hidden' /*case 'Hidden'*/: break; case 'subtotal' /*case 'Subtotal'*/: break; case 'basefield' /*case 'BaseField'*/: break; case 'mapchilditems' /*case 'MapChildItems'*/: break; case 'function' /*case 'Function'*/: break; case 'refreshonfileopen' /*case 'RefreshOnFileOpen'*/: break; case 'printsettitles' /*case 'PrintSetTitles'*/: break; case 'mergelabels' /*case 'MergeLabels'*/: break; case 'defaultversion' /*case 'DefaultVersion'*/: break; case 'refreshname' /*case 'RefreshName'*/: break; case 'refreshdate' /*case 'RefreshDate'*/: break; case 'refreshdatecopy' /*case 'RefreshDateCopy'*/: break; case 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break; case 'versionlastupdate' /*case 'VersionLastUpdate'*/: break; case 'versionupdateablemin' /*case 'VersionUpdateableMin'*/: break; case 'versionrefreshablemin' /*case 'VersionRefreshableMin'*/: break; case 'calculation' /*case 'Calculation'*/: break; default: seen = false; } break; /* PageBreaks */ case 'pagebreaks' /*case 'PageBreaks'*/: switch(Rn[3]) { case 'colbreaks' /*case 'ColBreaks'*/: break; case 'colbreak' /*case 'ColBreak'*/: break; case 'rowbreaks' /*case 'RowBreaks'*/: break; case 'rowbreak' /*case 'RowBreak'*/: break; case 'colstart' /*case 'ColStart'*/: break; case 'colend' /*case 'ColEnd'*/: break; case 'rowend' /*case 'RowEnd'*/: break; default: seen = false; } break; /* AutoFilter */ case 'autofilter' /*case 'AutoFilter'*/: switch(Rn[3]) { case 'autofiltercolumn' /*case 'AutoFilterColumn'*/: break; case 'autofiltercondition' /*case 'AutoFilterCondition'*/: break; case 'autofilterand' /*case 'AutoFilterAnd'*/: break; case 'autofilteror' /*case 'AutoFilterOr'*/: break; default: seen = false; } break; /* QueryTable */ case 'querytable' /*case 'QueryTable'*/: switch(Rn[3]) { case 'id' /*case 'Id'*/: break; case 'autoformatfont' /*case 'AutoFormatFont'*/: break; case 'autoformatpattern' /*case 'AutoFormatPattern'*/: break; case 'querysource' /*case 'QuerySource'*/: break; case 'querytype' /*case 'QueryType'*/: break; case 'enableredirections' /*case 'EnableRedirections'*/: break; case 'refreshedinxl9' /*case 'RefreshedInXl9'*/: break; case 'urlstring' /*case 'URLString'*/: break; case 'htmltables' /*case 'HTMLTables'*/: break; case 'connection' /*case 'Connection'*/: break; case 'commandtext' /*case 'CommandText'*/: break; case 'refreshinfo' /*case 'RefreshInfo'*/: break; case 'notitles' /*case 'NoTitles'*/: break; case 'nextid' /*case 'NextId'*/: break; case 'columninfo' /*case 'ColumnInfo'*/: break; case 'overwritecells' /*case 'OverwriteCells'*/: break; case 'donotpromptforfile' /*case 'DoNotPromptForFile'*/: break; case 'textwizardsettings' /*case 'TextWizardSettings'*/: break; case 'source' /*case 'Source'*/: break; case 'number' /*case 'Number'*/: break; case 'decimal' /*case 'Decimal'*/: break; case 'thousandseparator' /*case 'ThousandSeparator'*/: break; case 'trailingminusnumbers' /*case 'TrailingMinusNumbers'*/: break; case 'formatsettings' /*case 'FormatSettings'*/: break; case 'fieldtype' /*case 'FieldType'*/: break; case 'delimiters' /*case 'Delimiters'*/: break; case 'tab' /*case 'Tab'*/: break; case 'comma' /*case 'Comma'*/: break; case 'autoformatname' /*case 'AutoFormatName'*/: break; case 'versionlastedit' /*case 'VersionLastEdit'*/: break; case 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break; default: seen = false; } break; case 'datavalidation' /*case 'DataValidation'*/: switch(Rn[3]) { case 'range' /*case 'Range'*/: break; case 'type' /*case 'Type'*/: break; case 'min' /*case 'Min'*/: break; case 'max' /*case 'Max'*/: break; case 'sort' /*case 'Sort'*/: break; case 'descending' /*case 'Descending'*/: break; case 'order' /*case 'Order'*/: break; case 'casesensitive' /*case 'CaseSensitive'*/: break; case 'value' /*case 'Value'*/: break; case 'errorstyle' /*case 'ErrorStyle'*/: break; case 'errormessage' /*case 'ErrorMessage'*/: break; case 'errortitle' /*case 'ErrorTitle'*/: break; case 'inputmessage' /*case 'InputMessage'*/: break; case 'inputtitle' /*case 'InputTitle'*/: break; case 'combohide' /*case 'ComboHide'*/: break; case 'inputhide' /*case 'InputHide'*/: break; case 'condition' /*case 'Condition'*/: break; case 'qualifier' /*case 'Qualifier'*/: break; case 'useblank' /*case 'UseBlank'*/: break; case 'value1' /*case 'Value1'*/: break; case 'value2' /*case 'Value2'*/: break; case 'format' /*case 'Format'*/: break; case 'cellrangelist' /*case 'CellRangeList'*/: break; default: seen = false; } break; case 'sorting' /*case 'Sorting'*/: case 'conditionalformatting' /*case 'ConditionalFormatting'*/: switch(Rn[3]) { case 'range' /*case 'Range'*/: break; case 'type' /*case 'Type'*/: break; case 'min' /*case 'Min'*/: break; case 'max' /*case 'Max'*/: break; case 'sort' /*case 'Sort'*/: break; case 'descending' /*case 'Descending'*/: break; case 'order' /*case 'Order'*/: break; case 'casesensitive' /*case 'CaseSensitive'*/: break; case 'value' /*case 'Value'*/: break; case 'errorstyle' /*case 'ErrorStyle'*/: break; case 'errormessage' /*case 'ErrorMessage'*/: break; case 'errortitle' /*case 'ErrorTitle'*/: break; case 'cellrangelist' /*case 'CellRangeList'*/: break; case 'inputmessage' /*case 'InputMessage'*/: break; case 'inputtitle' /*case 'InputTitle'*/: break; case 'combohide' /*case 'ComboHide'*/: break; case 'inputhide' /*case 'InputHide'*/: break; case 'condition' /*case 'Condition'*/: break; case 'qualifier' /*case 'Qualifier'*/: break; case 'useblank' /*case 'UseBlank'*/: break; case 'value1' /*case 'Value1'*/: break; case 'value2' /*case 'Value2'*/: break; case 'format' /*case 'Format'*/: break; default: seen = false; } break; /* MapInfo (schema) */ case 'mapinfo' /*case 'MapInfo'*/: case 'schema' /*case 'Schema'*/: case 'data' /*case 'data'*/: switch(Rn[3]) { case 'map' /*case 'Map'*/: break; case 'entry' /*case 'Entry'*/: break; case 'range' /*case 'Range'*/: break; case 'xpath' /*case 'XPath'*/: break; case 'field' /*case 'Field'*/: break; case 'xsdtype' /*case 'XSDType'*/: break; case 'filteron' /*case 'FilterOn'*/: break; case 'aggregate' /*case 'Aggregate'*/: break; case 'elementtype' /*case 'ElementType'*/: break; case 'attributetype' /*case 'AttributeType'*/: break; /* These are from xsd (XML Schema Definition) */ case 'schema' /*case 'schema'*/: case 'element' /*case 'element'*/: case 'complextype' /*case 'complexType'*/: case 'datatype' /*case 'datatype'*/: case 'all' /*case 'all'*/: case 'attribute' /*case 'attribute'*/: case 'extends' /*case 'extends'*/: break; case 'row' /*case 'row'*/: break; default: seen = false; } break; /* SmartTags (can be anything) */ case 'smarttags' /*case 'SmartTags'*/: break; default: seen = false; break; } if(seen) break; /* CustomDocumentProperties */ if(Rn[3].match(/!\[CDATA/)) break; if(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|"); if(state[state.length-1][0]===/*'CustomDocumentProperties'*/'customdocumentproperties') { if(Rn[0].slice(-2) === "/>") break; else if(Rn[1]==="/") xlml_set_custprop(Custprops, raw_Rn3, cp, str.slice(pidx, Rn.index)); else { cp = Rn; pidx = Rn.index + Rn[0].length; } break; } if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|"); } var out = ({}/*:any*/); if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets; out.SheetNames = sheetnames; out.Workbook = Workbook; out.SSF = dup(table_fmt); out.Props = Props; out.Custprops = Custprops; return out; } function parse_xlml(data/*:RawBytes|string*/, opts)/*:Workbook*/ { fix_read_opts(opts=opts||{}); switch(opts.type||"base64") { case "base64": return parse_xlml_xml(Base64_decode(data), opts); case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts); case "array": return parse_xlml_xml(a2s(data), opts); } /*:: throw new Error("unsupported type " + opts.type); */ } /* TODO */ function write_props_xlml(wb/*:Workbook*/, opts)/*:string*/ { var o/*:Array*/ = []; /* DocumentProperties */ if(wb.Props) o.push(xlml_write_docprops(wb.Props, opts)); /* CustomDocumentProperties */ if(wb.Custprops) o.push(xlml_write_custprops(wb.Props, wb.Custprops, opts)); return o.join(""); } /* TODO */ function write_wb_xlml(/*::wb, opts*/)/*:string*/ { /* OfficeDocumentSettings */ /* ExcelWorkbook */ return ""; } /* TODO */ function write_sty_xlml(wb, opts)/*:string*/ { /* Styles */ var styles/*:Array*/ = ['']; opts.cellXfs.forEach(function(xf, id) { var payload/*:Array*/ = []; payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(table_fmt[xf.numFmtId])})); var o = /*::(*/{"ss:ID": "s" + (21+id)}/*:: :any)*/; styles.push(writextag('Style', payload.join(""), o)); }); return writextag("Styles", styles.join("")); } function write_name_xlml(n) { return writextag("NamedRange", null, {"ss:Name": n.Name, "ss:RefersTo":"=" + a1_to_rc(n.Ref, {r:0,c:0})}); } function write_names_xlml(wb/*::, opts*/)/*:string*/ { if(!((wb||{}).Workbook||{}).Names) return ""; /*:: if(!wb || !wb.Workbook || !wb.Workbook.Names) throw new Error("unreachable"); */ var names/*:Array*/ = wb.Workbook.Names; var out/*:Array*/ = []; for(var i = 0; i < names.length; ++i) { var n = names[i]; if(n.Sheet != null) continue; if(n.Name.match(/^_xlfn\./)) continue; out.push(write_name_xlml(n)); } return writextag("Names", out.join("")); } function write_ws_xlml_names(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*/)/*:string*/ { if(!ws) return ""; if(!((wb||{}).Workbook||{}).Names) return ""; /*:: if(!wb || !wb.Workbook || !wb.Workbook.Names) throw new Error("unreachable"); */ var names/*:Array*/ = wb.Workbook.Names; var out/*:Array*/ = []; for(var i = 0; i < names.length; ++i) { var n = names[i]; if(n.Sheet != idx) continue; /*switch(n.Name) { case "_": continue; }*/ if(n.Name.match(/^_xlfn\./)) continue; out.push(write_name_xlml(n)); } return out.join(""); } /* WorksheetOptions */ function write_ws_xlml_wsopts(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*/)/*:string*/ { if(!ws) return ""; var o/*:Array*/ = []; /* NOTE: spec technically allows any order, but stick with implied order */ /* FitToPage */ /* DoNotDisplayColHeaders */ /* DoNotDisplayRowHeaders */ /* ViewableRange */ /* Selection */ /* GridlineColor */ /* Name */ /* ExcelWorksheetType */ /* IntlMacro */ /* Unsynced */ /* Selected */ /* CodeName */ if(ws['!margins']) { o.push(""); if(ws['!margins'].header) o.push(writextag("Header", null, {'x:Margin':ws['!margins'].header})); if(ws['!margins'].footer) o.push(writextag("Footer", null, {'x:Margin':ws['!margins'].footer})); o.push(writextag("PageMargins", null, { 'x:Bottom': ws['!margins'].bottom || "0.75", 'x:Left': ws['!margins'].left || "0.7", 'x:Right': ws['!margins'].right || "0.7", 'x:Top': ws['!margins'].top || "0.75" })); o.push(""); } /* PageSetup */ /* DisplayPageBreak */ /* TransitionExpressionEvaluation */ /* TransitionFormulaEntry */ /* Print */ /* Zoom */ /* PageLayoutZoom */ /* PageBreakZoom */ /* ShowPageBreakZoom */ /* DefaultRowHeight */ /* DefaultColumnWidth */ /* StandardWidth */ if(wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) { /* Visible */ if(wb.Workbook.Sheets[idx].Hidden) o.push(writextag("Visible", (wb.Workbook.Sheets[idx].Hidden == 1 ? "SheetHidden" : "SheetVeryHidden"), {})); else { /* Selected */ for(var i = 0; i < idx; ++i) if(wb.Workbook.Sheets[i] && !wb.Workbook.Sheets[i].Hidden) break; if(i == idx) o.push(""); } } /* LeftColumnVisible */ if(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push(""); /* GridlineColorIndex */ /* DisplayFormulas */ /* DoNotDisplayGridlines */ /* DoNotDisplayHeadings */ /* DoNotDisplayOutline */ /* ApplyAutomaticOutlineStyles */ /* NoSummaryRowsBelowDetail */ /* NoSummaryColumnsRightDetail */ /* DoNotDisplayZeros */ /* ActiveRow */ /* ActiveColumn */ /* FilterOn */ /* RangeSelection */ /* TopRowVisible */ /* TopRowBottomPane */ /* LeftColumnRightPane */ /* ActivePane */ /* SplitHorizontal */ /* SplitVertical */ /* FreezePanes */ /* FrozenNoSplit */ /* TabColorIndex */ /* Panes */ /* NOTE: Password not supported in XLML Format */ if(ws['!protect']) { o.push(writetag("ProtectContents", "True")); if(ws['!protect'].objects) o.push(writetag("ProtectObjects", "True")); if(ws['!protect'].scenarios) o.push(writetag("ProtectScenarios", "True")); if(ws['!protect'].selectLockedCells != null && !ws['!protect'].selectLockedCells) o.push(writetag("EnableSelection", "NoSelection")); else if(ws['!protect'].selectUnlockedCells != null && !ws['!protect'].selectUnlockedCells) o.push(writetag("EnableSelection", "UnlockedCells")); [ [ "formatCells", "AllowFormatCells" ], [ "formatColumns", "AllowSizeCols" ], [ "formatRows", "AllowSizeRows" ], [ "insertColumns", "AllowInsertCols" ], [ "insertRows", "AllowInsertRows" ], [ "insertHyperlinks", "AllowInsertHyperlinks" ], [ "deleteColumns", "AllowDeleteCols" ], [ "deleteRows", "AllowDeleteRows" ], [ "sort", "AllowSort" ], [ "autoFilter", "AllowFilter" ], [ "pivotTables", "AllowUsePivotTables" ] ].forEach(function(x) { if(ws['!protect'][x[0]]) o.push("<"+x[1]+"/>"); }); } if(o.length == 0) return ""; return writextag("WorksheetOptions", o.join(""), {xmlns:XLMLNS.x}); } function write_ws_xlml_comment(comments/*:Array*/)/*:string*/ { return comments.map(function(c) { // TODO: formatted text var t = xlml_unfixstr(c.t||""); var d =writextag("ss:Data", t, {"xmlns":"http://www.w3.org/TR/REC-html40"}); return writextag("Comment", d, {"ss:Author":c.a}); }).join(""); } function write_ws_xlml_cell(cell, ref/*:string*/, ws, opts, idx/*:number*/, wb, addr)/*:string*/{ if(!cell || (cell.v == undefined && cell.f == undefined)) return ""; var attr = {}; if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); if(cell.F && cell.F.slice(0, ref.length) == ref) { var end = decode_cell(cell.F.slice(ref.length + 1)); attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]"); } if(cell.l && cell.l.Target) { attr["ss:HRef"] = escapexml(cell.l.Target); if(cell.l.Tooltip) attr["x:HRefScreenTip"] = escapexml(cell.l.Tooltip); } if(ws['!merges']) { var marr = ws['!merges']; for(var mi = 0; mi != marr.length; ++mi) { if(marr[mi].s.c != addr.c || marr[mi].s.r != addr.r) continue; if(marr[mi].e.c > marr[mi].s.c) attr['ss:MergeAcross'] = marr[mi].e.c - marr[mi].s.c; if(marr[mi].e.r > marr[mi].s.r) attr['ss:MergeDown'] = marr[mi].e.r - marr[mi].s.r; } } var t = "", p = ""; switch(cell.t) { case 'z': if(!opts.sheetStubs) return ""; break; case 'n': t = 'Number'; p = String(cell.v); break; case 'b': t = 'Boolean'; p = (cell.v ? "1" : "0"); break; case 'e': t = 'Error'; p = BErr[cell.v]; break; case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || table_fmt[14]; break; case 's': t = 'String'; p = escapexlml(cell.v||""); break; } /* TODO: cell style */ var os = get_cell_style(opts.cellXfs, cell, opts); attr["ss:StyleID"] = "s" + (21+os); attr["ss:Index"] = addr.c + 1; var _v = (cell.v != null ? p : ""); var m = cell.t == 'z' ? "" : ('' + _v + ''); if((cell.c||[]).length > 0) m += write_ws_xlml_comment(cell.c); return writextag("Cell", m, attr); } function write_ws_xlml_row(R/*:number*/, row)/*:string*/ { var o = ''; } /* TODO */ function write_ws_xlml_table(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*/)/*:string*/ { if(!ws['!ref']) return ""; var range/*:Range*/ = safe_decode_range(ws['!ref']); var marr/*:Array*/ = ws['!merges'] || [], mi = 0; var o/*:Array*/ = []; if(ws['!cols']) ws['!cols'].forEach(function(n, i) { process_col(n); var w = !!n.width; var p = col_obj_w(i, n); var k/*:any*/ = {"ss:Index":i+1}; if(w) k['ss:Width'] = width2px(p.width); if(n.hidden) k['ss:Hidden']="1"; o.push(writextag("Column",null,k)); }); var dense = Array.isArray(ws); for(var R = range.s.r; R <= range.e.r; ++R) { var row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])]; for(var C = range.s.c; C <= range.e.c; ++C) { var skip = false; for(mi = 0; mi != marr.length; ++mi) { if(marr[mi].s.c > C) continue; if(marr[mi].s.r > R) continue; if(marr[mi].e.c < C) continue; if(marr[mi].e.r < R) continue; if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true; break; } if(skip) continue; var addr = {r:R,c:C}; var ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref]; row.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr)); } row.push(""); if(row.length > 2) o.push(row.join("")); } return o.join(""); } function write_ws_xlml(idx/*:number*/, opts, wb/*:Workbook*/)/*:string*/ { var o/*:Array*/ = []; var s = wb.SheetNames[idx]; var ws = wb.Sheets[s]; var t/*:string*/ = ws ? write_ws_xlml_names(ws, opts, idx, wb) : ""; if(t.length > 0) o.push("" + t + ""); /* Table */ t = ws ? write_ws_xlml_table(ws, opts, idx, wb) : ""; if(t.length > 0) o.push("
" + t + "
"); /* WorksheetOptions */ o.push(write_ws_xlml_wsopts(ws, opts, idx, wb)); return o.join(""); } function write_xlml(wb, opts)/*:string*/ { if(!opts) opts = {}; if(!wb.SSF) wb.SSF = dup(table_fmt); if(wb.SSF) { make_ssf(); SSF_load_table(wb.SSF); // $FlowIgnore opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0; opts.ssf = wb.SSF; opts.cellXfs = []; get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}}); } var d/*:Array*/ = []; d.push(write_props_xlml(wb, opts)); d.push(write_wb_xlml(wb, opts)); d.push(""); d.push(""); for(var i = 0; i < wb.SheetNames.length; ++i) d.push(writextag("Worksheet", write_ws_xlml(i, opts, wb), {"ss:Name":escapexml(wb.SheetNames[i])})); d[2] = write_sty_xlml(wb, opts); d[3] = write_names_xlml(wb, opts); return XML_HEADER + writextag("Workbook", d.join(""), { 'xmlns': XLMLNS.ss, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:ss': XLMLNS.ss, 'xmlns:dt': XLMLNS.dt, 'xmlns:html': XLMLNS.html }); } /* [MS-OLEDS] 2.3.8 CompObjStream */ function parse_compobj(obj/*:CFBEntry*/) { var v = {}; var o = obj.content; /*:: if(o == null) return; */ /* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */ o.l = 28; v.AnsiUserType = o.read_shift(0, "lpstr-ansi"); v.AnsiClipboardFormat = parse_ClipboardFormatOrAnsiString(o); if(o.length - o.l <= 4) return v; var m/*:number*/ = o.read_shift(4); if(m == 0 || m > 40) return v; o.l-=4; v.Reserved1 = o.read_shift(0, "lpstr-ansi"); if(o.length - o.l <= 4) return v; m = o.read_shift(4); if(m !== 0x71b239f4) return v; v.UnicodeClipboardFormat = parse_ClipboardFormatOrUnicodeString(o); m = o.read_shift(4); if(m == 0 || m > 40) return v; o.l-=4; v.Reserved2 = o.read_shift(0, "lpwstr"); } /* Continue logic for: - 2.4.58 Continue 0x003c - 2.4.59 ContinueBigName 0x043c - 2.4.60 ContinueFrt 0x0812 - 2.4.61 ContinueFrt11 0x0875 - 2.4.62 ContinueFrt12 0x087f */ var CONTINUE_RT = [ 0x003c, 0x043c, 0x0812, 0x0875, 0x087f ]; function slurp(RecordType, R, blob, length/*:number*/, opts)/*:any*/ { var l = length; var bufs = []; var d = blob.slice(blob.l,blob.l+l); if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) { case 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002f /* FilePass */: case 0x0195 /* FileLock */: case 0x00e1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */: break; case 0x0085 /* BoundSheet8 */: break; default: opts.enc.insitu(d); } bufs.push(d); blob.l += l; var nextrt = __readUInt16LE(blob,blob.l), next = XLSRecordEnum[nextrt]; var start = 0; while(next != null && CONTINUE_RT.indexOf(nextrt) > -1) { l = __readUInt16LE(blob,blob.l+2); start = blob.l + 4; if(nextrt == 0x0812 /* ContinueFrt */) start += 4; else if(nextrt == 0x0875 || nextrt == 0x087f) { start += 12; } d = blob.slice(start,blob.l+4+l); bufs.push(d); blob.l += 4+l; next = (XLSRecordEnum[nextrt = __readUInt16LE(blob, blob.l)]); } var b = (bconcat(bufs)/*:any*/); prep_blob(b, 0); var ll = 0; b.lens = []; for(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; } if(b.length < length) throw "XLS Record 0x" + RecordType.toString(16) + " Truncated: " + b.length + " < " + length; return R.f(b, b.length, opts); } function safe_format_xf(p/*:any*/, opts/*:ParseOpts*/, date1904/*:?boolean*/) { if(p.t === 'z') return; if(!p.XF) return; var fmtid = 0; try { fmtid = p.z || p.XF.numFmtId || 0; if(opts.cellNF) p.z = table_fmt[fmtid]; } catch(e) { if(opts.WTF) throw e; } if(!opts || opts.cellText !== false) try { if(p.t === 'e') { p.w = p.w || BErr[p.v]; } else if(fmtid === 0 || fmtid == "General") { if(p.t === 'n') { if((p.v|0) === p.v) p.w = p.v.toString(10); else p.w = SSF_general_num(p.v); } else p.w = SSF_general(p.v); } else p.w = SSF_format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF}); } catch(e) { if(opts.WTF) throw e; } if(opts.cellDates && fmtid && p.t == 'n' && fmt_is_date(table_fmt[fmtid] || String(fmtid))) { var _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); } } } function make_cell(val, ixfe, t)/*:Cell*/ { return ({v:val, ixfe:ixfe, t:t}/*:any*/); } // 2.3.2 function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { var wb = ({opts:{}}/*:any*/); var Sheets = {}; if(DENSE != null && options.dense == null) options.dense = DENSE; var out/*:Worksheet*/ = ((options.dense ? [] : {})/*:any*/); var Directory = {}; var range/*:Range*/ = ({}/*:any*/); var last_formula = null; var sst/*:SST*/ = ([]/*:any*/); var cur_sheet = ""; var Preamble = {}; var lastcell, last_cell = "", cc/*:Cell*/, cmnt, rngC, rngR; var sharedf = {}; var arrayf/*:Array<[Range, string]>*/ = []; var temp_val/*:Cell*/; var country; var XFs = []; /* XF records */ var palette/*:Array<[number, number, number]>*/ = []; var Workbook/*:WBWBProps*/ = ({ Sheets:[], WBProps:{date1904:false}, Views:[{}] }/*:any*/), wsprops = {}; var get_rgb = function getrgb(icv/*:number*/)/*:[number, number, number]*/ { if(icv < 8) return XLSIcv[icv]; if(icv < 64) return palette[icv-8] || XLSIcv[icv]; return XLSIcv[icv]; }; var process_cell_style = function pcs(cell, line/*:any*/, options) { var xfd = line.XF.data; if(!xfd || !xfd.patternType || !options || !options.cellStyles) return; line.s = ({}/*:any*/); line.s.patternType = xfd.patternType; var t; if((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; } if((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; } }; var addcell = function addcell(cell/*:any*/, line/*:any*/, options/*:any*/) { if(file_depth > 1) return; if(options.sheetRows && cell.r >= options.sheetRows) return; if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options); delete line.ixfe; delete line.XF; lastcell = cell; last_cell = encode_cell(cell); if(!range || !range.s || !range.e) range = {s:{r:0,c:0},e:{r:0,c:0}}; if(cell.r < range.s.r) range.s.r = cell.r; if(cell.c < range.s.c) range.s.c = cell.c; if(cell.r + 1 > range.e.r) range.e.r = cell.r + 1; if(cell.c + 1 > range.e.c) range.e.c = cell.c + 1; if(options.cellFormula && line.f) { for(var afi = 0; afi < arrayf.length; ++afi) { if(arrayf[afi][0].s.c > cell.c || arrayf[afi][0].s.r > cell.r) continue; if(arrayf[afi][0].e.c < cell.c || arrayf[afi][0].e.r < cell.r) continue; line.F = encode_range(arrayf[afi][0]); if(arrayf[afi][0].s.c != cell.c || arrayf[afi][0].s.r != cell.r) delete line.f; if(line.f) line.f = "" + stringify_formula(arrayf[afi][1], range, cell, supbooks, opts); break; } } { if(options.dense) { if(!out[cell.r]) out[cell.r] = []; out[cell.r][cell.c] = line; } else out[last_cell] = line; } }; var opts = ({ enc: false, // encrypted sbcch: 0, // cch in the preceding SupBook snames: [], // sheetnames sharedf: sharedf, // shared formulae by address arrayf: arrayf, // array formulae array rrtabid: [], // RRTabId lastuser: "", // Last User from WriteAccess biff: 8, // BIFF version codepage: 0, // CP from CodePage record winlocked: 0, // fLockWn from WinProtect cellStyles: !!options && !!options.cellStyles, WTF: !!options && !!options.wtf }/*:any*/); if(options.password) opts.password = options.password; var themes; var merges/*:Array*/ = []; var objects = []; var colinfo/*:Array*/ = [], rowinfo/*:Array*/ = []; var seencol = false; var supbooks = ([]/*:any*/); // 1-indexed, will hold extern names supbooks.SheetNames = opts.snames; supbooks.sharedf = opts.sharedf; supbooks.arrayf = opts.arrayf; supbooks.names = []; supbooks.XTI = []; var last_RT = 0; var file_depth = 0; /* TODO: make a real stack */ var BIFF2Fmt = 0, BIFF2FmtTable/*:Array*/ = []; var FilterDatabases = []; /* TODO: sort out supbooks and process elsewhere */ var last_lbl/*:?DefinedName*/; /* explicit override for some broken writers */ opts.codepage = 1200; set_cp(1200); var seen_codepage = false; while(blob.l < blob.length - 1) { var s = blob.l; var RecordType = blob.read_shift(2); if(RecordType === 0 && last_RT === 0x000a /* EOF */) break; var length = (blob.l === blob.length ? 0 : blob.read_shift(2)); var R = XLSRecordEnum[RecordType]; //console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length); //if(!R) console.log(blob.slice(blob.l, blob.l + length)); if(R && R.f) { if(options.bookSheets) { if(last_RT === 0x0085 /* BoundSheet8 */ && RecordType !== 0x0085 /* R.n !== 'BoundSheet8' */) break; } last_RT = RecordType; if(R.r === 2 || R.r == 12) { var rt = blob.read_shift(2); length -= 2; if(!opts.enc && rt !== RecordType && (((rt&0xFF)<<8)|(rt>>8)) !== RecordType) throw new Error("rt mismatch: " + rt + "!=" + RecordType); if(R.r == 12){ blob.l += 10; length -= 10; } // skip FRT } //console.error(R,blob.l,length,blob.length); var val/*:any*/ = ({}/*:any*/); if(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/; else val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/; /*:: val = (val:any); */ if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue; switch(RecordType) { case 0x0022 /* Date1904 */: /*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break; case 0x0086 /* WriteProtect */: wb.opts.WriteProtect = true; break; case 0x002f /* FilePass */: if(!opts.enc) blob.l = 0; opts.enc = val; if(!options.password) throw new Error("File is password-protected"); if(val.valid == null) throw new Error("Encryption scheme unsupported"); if(!val.valid) throw new Error("Password is incorrect"); break; case 0x005c /* WriteAccess */: opts.lastuser = val; break; case 0x0042 /* CodePage */: var cpval = Number(val); /* overrides based on test cases */ switch(cpval) { case 0x5212: cpval = 1200; break; case 0x8000: cpval = 10000; break; case 0x8001: cpval = 1252; break; } set_cp(opts.codepage = cpval); seen_codepage = true; break; case 0x013d /* RRTabId */: opts.rrtabid = val; break; case 0x0019 /* WinProtect */: opts.winlocked = val; break; case 0x01b7 /* RefreshAll */: wb.opts["RefreshAll"] = val; break; case 0x000c /* CalcCount */: wb.opts["CalcCount"] = val; break; case 0x0010 /* CalcDelta */: wb.opts["CalcDelta"] = val; break; case 0x0011 /* CalcIter */: wb.opts["CalcIter"] = val; break; case 0x000d /* CalcMode */: wb.opts["CalcMode"] = val; break; case 0x000e /* CalcPrecision */: wb.opts["CalcPrecision"] = val; break; case 0x005f /* CalcSaveRecalc */: wb.opts["CalcSaveRecalc"] = val; break; case 0x000f /* CalcRefMode */: opts.CalcRefMode = val; break; // TODO: implement R1C1 case 0x08a3 /* ForceFullCalculation */: wb.opts.FullCalc = val; break; case 0x0081 /* WsBool */: if(val.fDialog) out["!type"] = "dialog"; if(!val.fBelow) (out["!outline"] || (out["!outline"] = {})).above = true; if(!val.fRight) (out["!outline"] || (out["!outline"] = {})).left = true; break; // TODO case 0x00e0 /* XF */: XFs.push(val); break; case 0x01ae /* SupBook */: supbooks.push([val]); supbooks[supbooks.length-1].XTI = []; break; case 0x0023: case 0x0223 /* ExternName */: supbooks[supbooks.length-1].push(val); break; case 0x0018: case 0x0218 /* Lbl */: last_lbl = ({ Name: val.Name, Ref: stringify_formula(val.rgce,range,null,supbooks,opts) }/*:DefinedName*/); if(val.itab > 0) last_lbl.Sheet = val.itab - 1; supbooks.names.push(last_lbl); if(!supbooks[0]) { supbooks[0] = []; supbooks[0].XTI = []; } supbooks[supbooks.length-1].push(val); if(val.Name == "_xlnm._FilterDatabase" && val.itab > 0) if(val.rgce && val.rgce[0] && val.rgce[0][0] && val.rgce[0][0][0] == 'PtgArea3d') FilterDatabases[val.itab - 1] = { ref: encode_range(val.rgce[0][0][1][2]) }; break; case 0x0016 /* ExternCount */: opts.ExternCount = val; break; case 0x0017 /* ExternSheet */: if(supbooks.length == 0) { supbooks[0] = []; supbooks[0].XTI = []; } supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break; case 0x0894 /* NameCmt */: /* TODO: search for correct name */ if(opts.biff < 8) break; if(last_lbl != null) last_lbl.Comment = val[1]; break; case 0x0012 /* Protect */: out["!protect"] = val; break; /* for sheet or book */ case 0x0013 /* Password */: if(val !== 0 && opts.WTF) console.error("Password verifier: " + val); break; case 0x0085 /* BoundSheet8 */: { Directory[val.pos] = val; opts.snames.push(val.name); } break; case 0x000a /* EOF */: { if(--file_depth) break; if(range.e) { if(range.e.r > 0 && range.e.c > 0) { range.e.r--; range.e.c--; out["!ref"] = encode_range(range); if(options.sheetRows && options.sheetRows <= range.e.r) { var tmpri = range.e.r; range.e.r = options.sheetRows - 1; out["!fullref"] = out["!ref"]; out["!ref"] = encode_range(range); range.e.r = tmpri; } range.e.r++; range.e.c++; } if(merges.length > 0) out["!merges"] = merges; if(objects.length > 0) out["!objects"] = objects; if(colinfo.length > 0) out["!cols"] = colinfo; if(rowinfo.length > 0) out["!rows"] = rowinfo; Workbook.Sheets.push(wsprops); } if(cur_sheet === "") Preamble = out; else Sheets[cur_sheet] = out; out = ((options.dense ? [] : {})/*:any*/); } break; case 0x0009: case 0x0209: case 0x0409: case 0x0809 /* BOF */: { if(opts.biff === 8) opts.biff = { /*::[*/0x0009/*::]*/:2, /*::[*/0x0209/*::]*/:3, /*::[*/0x0409/*::]*/:4 }[RecordType] || { /*::[*/0x0200/*::]*/:2, /*::[*/0x0300/*::]*/:3, /*::[*/0x0400/*::]*/:4, /*::[*/0x0500/*::]*/:5, /*::[*/0x0600/*::]*/:8, /*::[*/0x0002/*::]*/:2, /*::[*/0x0007/*::]*/:2 }[val.BIFFVer] || 8; opts.biffguess = val.BIFFVer == 0; if(val.BIFFVer == 0 && val.dt == 0x1000) { opts.biff = 5; seen_codepage = true; set_cp(opts.codepage = 28591); } if(opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16) opts.biff = 2; if(file_depth++) break; out = ((options.dense ? [] : {})/*:any*/); if(opts.biff < 8 && !seen_codepage) { seen_codepage = true; set_cp(opts.codepage = options.codepage || 1252); } if(opts.biff < 5 || val.BIFFVer == 0 && val.dt == 0x1000) { if(cur_sheet === "") cur_sheet = "Sheet1"; range = {s:{r:0,c:0},e:{r:0,c:0}}; /* fake BoundSheet8 */ var fakebs8 = {pos: blob.l - length, name:cur_sheet}; Directory[fakebs8.pos] = fakebs8; opts.snames.push(cur_sheet); } else cur_sheet = (Directory[s] || {name:""}).name; if(val.dt == 0x20) out["!type"] = "chart"; if(val.dt == 0x40) out["!type"] = "macro"; merges = []; objects = []; opts.arrayf = arrayf = []; colinfo = []; rowinfo = []; seencol = false; wsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet }; } break; case 0x0203 /* Number */: case 0x0003 /* BIFF2NUM */: case 0x0002 /* BIFF2INT */: { if(out["!type"] == "chart") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c; temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'}/*:any*/); if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:val.c, r:val.r}, temp_val, options); } break; case 0x0005: case 0x0205 /* BoolErr */: { temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t}/*:any*/); if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:val.c, r:val.r}, temp_val, options); } break; case 0x027e /* RK */: { temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'}/*:any*/); if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:val.c, r:val.r}, temp_val, options); } break; case 0x00bd /* MulRk */: { for(var j = val.c; j <= val.C; ++j) { var ixfe = val.rkrec[j-val.c][0]; temp_val= ({ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'}/*:any*/); if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:j, r:val.r}, temp_val, options); } } break; case 0x0006: case 0x0206: case 0x0406 /* Formula */: { if(val.val == 'String') { last_formula = val; break; } temp_val = make_cell(val.val, val.cell.ixfe, val.tt); temp_val.XF = XFs[temp_val.ixfe]; if(options.cellFormula) { var _f = val.formula; if(_f && _f[0] && _f[0][0] && _f[0][0][0] == 'PtgExp') { var _fr = _f[0][0][1][0], _fc = _f[0][0][1][1]; var _fe = encode_cell({r:_fr, c:_fc}); if(sharedf[_fe]) temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts); else temp_val.F = ((options.dense ? (out[_fr]||[])[_fc]: out[_fe]) || {}).F; } else temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts); } if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell(val.cell, temp_val, options); last_formula = val; } break; case 0x0007: case 0x0207 /* String */: { if(last_formula) { /* technically always true */ last_formula.val = val; temp_val = make_cell(val, last_formula.cell.ixfe, 's'); temp_val.XF = XFs[temp_val.ixfe]; if(options.cellFormula) { temp_val.f = ""+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts); } if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell(last_formula.cell, temp_val, options); last_formula = null; } else throw new Error("String record expects Formula"); } break; case 0x0021: case 0x0221 /* Array */: { arrayf.push(val); var _arraystart = encode_cell(val[0].s); cc = options.dense ? (out[val[0].s.r]||[])[val[0].s.c] : out[_arraystart]; if(options.cellFormula && cc) { if(!last_formula) break; /* technically unreachable */ if(!_arraystart || !cc) break; cc.f = ""+stringify_formula(val[1], range, val[0], supbooks, opts); cc.F = encode_range(val[0]); } } break; case 0x04bc /* ShrFmla */: { if(!options.cellFormula) break; if(last_cell) { /* TODO: capture range */ if(!last_formula) break; /* technically unreachable */ sharedf[encode_cell(last_formula.cell)]= val[0]; cc = options.dense ? (out[last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)]; (cc||{}).f = ""+stringify_formula(val[0], range, lastcell, supbooks, opts); } } break; case 0x00fd /* LabelSst */: temp_val=make_cell(sst[val.isst].t, val.ixfe, 's'); if(sst[val.isst].h) temp_val.h = sst[val.isst].h; temp_val.XF = XFs[temp_val.ixfe]; if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:val.c, r:val.r}, temp_val, options); break; case 0x0201 /* Blank */: if(options.sheetStubs) { temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], t:'z'}/*:any*/); if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:val.c, r:val.r}, temp_val, options); } break; case 0x00be /* MulBlank */: if(options.sheetStubs) { for(var _j = val.c; _j <= val.C; ++_j) { var _ixfe = val.ixfe[_j-val.c]; temp_val= ({ixfe:_ixfe, XF:XFs[_ixfe], t:'z'}/*:any*/); if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:_j, r:val.r}, temp_val, options); } } break; case 0x00d6 /* RString */: case 0x0204 /* Label */: case 0x0004 /* BIFF2STR */: temp_val=make_cell(val.val, val.ixfe, 's'); temp_val.XF = XFs[temp_val.ixfe]; if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F]; safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({c:val.c, r:val.r}, temp_val, options); break; case 0x0000: case 0x0200 /* Dimensions */: { if(file_depth === 1) range = val; /* TODO: stack */ } break; case 0x00fc /* SST */: { sst = val; } break; case 0x041e /* Format */: { /* val = [id, fmt] */ if(opts.biff == 4) { BIFF2FmtTable[BIFF2Fmt++] = val[1]; for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(table_fmt[b4idx] == val[1]) break; if(b4idx >= 163) SSF_load(val[1], BIFF2Fmt + 163); } else SSF_load(val[1], val[0]); } break; case 0x001e /* BIFF2FORMAT */: { BIFF2FmtTable[BIFF2Fmt++] = val; for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(table_fmt[b2idx] == val) break; if(b2idx >= 163) SSF_load(val, BIFF2Fmt + 163); } break; case 0x00e5 /* MergeCells */: merges = merges.concat(val); break; case 0x005d /* Obj */: objects[val.cmo[0]] = opts.lastobj = val; break; case 0x01b6 /* TxO */: opts.lastobj.TxO = val; break; case 0x007f /* ImData */: opts.lastobj.ImData = val; break; case 0x01b8 /* HLink */: { for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR) for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) { cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})]; if(cc) cc.l = val[1]; } } break; case 0x0800 /* HLinkTooltip */: { for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR) for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) { cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})]; if(cc && cc.l) cc.l.Tooltip = val[1]; } } break; case 0x001c /* Note */: { if(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */ cc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])]; var noteobj = objects[val[2]]; if(!cc) { if(options.dense) { if(!out[val[0].r]) out[val[0].r] = []; cc = out[val[0].r][val[0].c] = ({t:"z"}/*:any*/); } else { cc = out[encode_cell(val[0])] = ({t:"z"}/*:any*/); } range.e.r = Math.max(range.e.r, val[0].r); range.s.r = Math.min(range.s.r, val[0].r); range.e.c = Math.max(range.e.c, val[0].c); range.s.c = Math.min(range.s.c, val[0].c); } if(!cc.c) cc.c = []; cmnt = {a:val[1],t:noteobj.TxO.t}; cc.c.push(cmnt); } break; case 0x087d /* XFExt */: update_xfext(XFs[val.ixfe], val.ext); break; case 0x007d /* ColInfo */: { if(!opts.cellStyles) break; while(val.e >= val.s) { colinfo[val.e--] = { width: val.w/256, level: (val.level || 0), hidden: !!(val.flags & 1) }; if(!seencol) { seencol = true; find_mdw_colw(val.w/256); } process_col(colinfo[val.e+1]); } } break; case 0x0208 /* Row */: { var rowobj = {}; if(val.level != null) { rowinfo[val.r] = rowobj; rowobj.level = val.level; } if(val.hidden) { rowinfo[val.r] = rowobj; rowobj.hidden = true; } if(val.hpt) { rowinfo[val.r] = rowobj; rowobj.hpt = val.hpt; rowobj.hpx = pt2px(val.hpt); } } break; case 0x0026 /* LeftMargin */: case 0x0027 /* RightMargin */: case 0x0028 /* TopMargin */: case 0x0029 /* BottomMargin */: if(!out['!margins']) default_margins(out['!margins'] = {}); out['!margins'][({0x26: "left", 0x27:"right", 0x28:"top", 0x29:"bottom"})[RecordType]] = val; break; case 0x00a1 /* Setup */: // TODO if(!out['!margins']) default_margins(out['!margins'] = {}); out['!margins'].header = val.header; out['!margins'].footer = val.footer; break; case 0x023e /* Window2 */: // TODO // $FlowIgnore if(val.RTL) Workbook.Views[0].RTL = true; break; case 0x0092 /* Palette */: palette = val; break; case 0x0896 /* Theme */: themes = val; break; case 0x008c /* Country */: country = val; break; case 0x01ba /* CodeName */: { /*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */ if(!cur_sheet) Workbook.WBProps.CodeName = val || "ThisWorkbook"; else wsprops.CodeName = val || wsprops.name; } break; } } else { if(!R) console.error("Missing Info for XLS Record 0x" + RecordType.toString(16)); blob.l += length; } } wb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;}); if(!options.bookSheets) wb.Sheets=Sheets; if(!wb.SheetNames.length && Preamble["!ref"]) { wb.SheetNames.push("Sheet1"); /*jshint -W069 */ if(wb.Sheets) wb.Sheets["Sheet1"] = Preamble; /*jshint +W069 */ } else wb.Preamble=Preamble; if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; }); wb.Strings = sst; wb.SSF = dup(table_fmt); if(opts.enc) wb.Encryption = opts.enc; if(themes) wb.Themes = themes; wb.Metadata = {}; if(country !== undefined) wb.Metadata.Country = country; if(supbooks.names.length > 0) Workbook.Names = supbooks.names; wb.Workbook = Workbook; return wb; } /* TODO: split props*/ var PSCLSID = { SI: "e0859ff2f94f6810ab9108002b27b3d9", DSI: "02d5cdd59c2e1b10939708002b2cf9ae", UDI: "05d5cdd59c2e1b10939708002b2cf9ae" }; function parse_xls_props(cfb/*:CFBContainer*/, props, o) { /* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */ var DSI = CFB.find(cfb, '/!DocumentSummaryInformation'); if(DSI && DSI.size > 0) try { var DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI, PSCLSID.DSI); for(var d in DocSummary) props[d] = DocSummary[d]; } catch(e) {if(o.WTF) throw e;/* empty */} /* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/ var SI = CFB.find(cfb, '/!SummaryInformation'); if(SI && SI.size > 0) try { var Summary = parse_PropertySetStream(SI, SummaryPIDSI, PSCLSID.SI); for(var s in Summary) if(props[s] == null) props[s] = Summary[s]; } catch(e) {if(o.WTF) throw e;/* empty */} if(props.HeadingPairs && props.TitlesOfParts) { load_props_pairs(props.HeadingPairs, props.TitlesOfParts, props, o); delete props.HeadingPairs; delete props.TitlesOfParts; } } function write_xls_props(wb/*:Workbook*/, cfb/*:CFBContainer*/) { var DSEntries = [], SEntries = [], CEntries = []; var i = 0, Keys; var DocSummaryRE/*:{[key:string]:string}*/ = evert_key(DocSummaryPIDDSI, "n"); var SummaryRE/*:{[key:string]:string}*/ = evert_key(SummaryPIDSI, "n"); if(wb.Props) { Keys = keys(wb.Props); // $FlowIgnore for(i = 0; i < Keys.length; ++i) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Props[Keys[i]]]); } if(wb.Custprops) { Keys = keys(wb.Custprops); // $FlowIgnore for(i = 0; i < Keys.length; ++i) if(!Object.prototype.hasOwnProperty.call((wb.Props||{}), Keys[i])) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Custprops[Keys[i]]]); } var CEntries2 = []; for(i = 0; i < CEntries.length; ++i) { if(XLSPSSkip.indexOf(CEntries[i][0]) > -1 || PseudoPropsPairs.indexOf(CEntries[i][0]) > -1) continue; if(CEntries[i][1] == null) continue; CEntries2.push(CEntries[i]); } if(SEntries.length) CFB.utils.cfb_add(cfb, "/\u0005SummaryInformation", write_PropertySetStream(SEntries, PSCLSID.SI, SummaryRE, SummaryPIDSI)); if(DSEntries.length || CEntries2.length) CFB.utils.cfb_add(cfb, "/\u0005DocumentSummaryInformation", write_PropertySetStream(DSEntries, PSCLSID.DSI, DocSummaryRE, DocSummaryPIDDSI, CEntries2.length ? CEntries2 : null, PSCLSID.UDI)); } function parse_xlscfb(cfb/*:any*/, options/*:?ParseOpts*/)/*:Workbook*/ { if(!options) options = {}; fix_read_opts(options); reset_cp(); if(options.codepage) set_ansi(options.codepage); var CompObj/*:?CFBEntry*/, WB/*:?any*/; if(cfb.FullPaths) { if(CFB.find(cfb, '/encryption')) throw new Error("File is password-protected"); CompObj = CFB.find(cfb, '!CompObj'); WB = CFB.find(cfb, '/Workbook') || CFB.find(cfb, '/Book'); } else { switch(options.type) { case 'base64': cfb = s2a(Base64_decode(cfb)); break; case 'binary': cfb = s2a(cfb); break; case 'buffer': break; case 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break; } prep_blob(cfb, 0); WB = ({content: cfb}/*:any*/); } var /*::CompObjP, */WorkbookP/*:: :Workbook = XLSX.utils.book_new(); */; var _data/*:?any*/; if(CompObj) /*::CompObjP = */parse_compobj(CompObj); if(options.bookProps && !options.bookSheets) WorkbookP = ({}/*:any*/); else/*:: if(cfb instanceof CFBContainer) */ { var T = has_buf ? 'buffer' : 'array'; if(WB && WB.content) WorkbookP = parse_workbook(WB.content, options); /* Quattro Pro 7-8 */ else if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options)); /* Quattro Pro 9 */ else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options)); /* Works 4 for Mac */ else if((_data=CFB.find(cfb, 'MN0')) && _data.content) throw new Error("Unsupported Works 4 for Mac file"); else throw new Error("Cannot find Workbook stream"); if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb); } var props = {}; if(cfb.FullPaths) parse_xls_props(/*::((*/cfb/*:: :any):CFBContainer)*/, props, options); WorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */ if(options.bookFiles) WorkbookP.cfb = cfb; /*WorkbookP.CompObjP = CompObjP; // TODO: storage? */ return WorkbookP; } function write_xlscfb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:CFBContainer*/ { var o = opts || {}; var cfb = CFB.utils.cfb_new({root:"R"}); var wbpath = "/Workbook"; switch(o.bookType || "xls") { case "xls": o.bookType = "biff8"; /* falls through */ case "xla": if(!o.bookType) o.bookType = "xla"; /* falls through */ case "biff8": wbpath = "/Workbook"; o.biff = 8; break; case "biff5": wbpath = "/Book"; o.biff = 5; break; default: throw new Error("invalid type " + o.bookType + " for XLS CFB"); } CFB.utils.cfb_add(cfb, wbpath, write_biff_buf(wb, o)); if(o.biff == 8 && (wb.Props || wb.Custprops)) write_xls_props(wb, cfb); // TODO: SI, DSI, CO if(o.biff == 8 && wb.vbaraw) fill_vba_xls(cfb, CFB.read(wb.vbaraw, {type: typeof wb.vbaraw == "string" ? "binary" : "buffer"})); return cfb; } /* [MS-XLSB] 2.3 Record Enumeration */ var XLSBRecordEnum = { /*::[*/0x0000/*::]*/: { /* n:"BrtRowHdr", */ f:parse_BrtRowHdr }, /*::[*/0x0001/*::]*/: { /* n:"BrtCellBlank", */ f:parse_BrtCellBlank }, /*::[*/0x0002/*::]*/: { /* n:"BrtCellRk", */ f:parse_BrtCellRk }, /*::[*/0x0003/*::]*/: { /* n:"BrtCellError", */ f:parse_BrtCellError }, /*::[*/0x0004/*::]*/: { /* n:"BrtCellBool", */ f:parse_BrtCellBool }, /*::[*/0x0005/*::]*/: { /* n:"BrtCellReal", */ f:parse_BrtCellReal }, /*::[*/0x0006/*::]*/: { /* n:"BrtCellSt", */ f:parse_BrtCellSt }, /*::[*/0x0007/*::]*/: { /* n:"BrtCellIsst", */ f:parse_BrtCellIsst }, /*::[*/0x0008/*::]*/: { /* n:"BrtFmlaString", */ f:parse_BrtFmlaString }, /*::[*/0x0009/*::]*/: { /* n:"BrtFmlaNum", */ f:parse_BrtFmlaNum }, /*::[*/0x000A/*::]*/: { /* n:"BrtFmlaBool", */ f:parse_BrtFmlaBool }, /*::[*/0x000B/*::]*/: { /* n:"BrtFmlaError", */ f:parse_BrtFmlaError }, /*::[*/0x000C/*::]*/: { /* n:"BrtShortBlank", */ f:parse_BrtShortBlank }, /*::[*/0x000D/*::]*/: { /* n:"BrtShortRk", */ f:parse_BrtShortRk }, /*::[*/0x000E/*::]*/: { /* n:"BrtShortError", */ f:parse_BrtShortError }, /*::[*/0x000F/*::]*/: { /* n:"BrtShortBool", */ f:parse_BrtShortBool }, /*::[*/0x0010/*::]*/: { /* n:"BrtShortReal", */ f:parse_BrtShortReal }, /*::[*/0x0011/*::]*/: { /* n:"BrtShortSt", */ f:parse_BrtShortSt }, /*::[*/0x0012/*::]*/: { /* n:"BrtShortIsst", */ f:parse_BrtShortIsst }, /*::[*/0x0013/*::]*/: { /* n:"BrtSSTItem", */ f:parse_RichStr }, /*::[*/0x0014/*::]*/: { /* n:"BrtPCDIMissing" */ }, /*::[*/0x0015/*::]*/: { /* n:"BrtPCDINumber" */ }, /*::[*/0x0016/*::]*/: { /* n:"BrtPCDIBoolean" */ }, /*::[*/0x0017/*::]*/: { /* n:"BrtPCDIError" */ }, /*::[*/0x0018/*::]*/: { /* n:"BrtPCDIString" */ }, /*::[*/0x0019/*::]*/: { /* n:"BrtPCDIDatetime" */ }, /*::[*/0x001A/*::]*/: { /* n:"BrtPCDIIndex" */ }, /*::[*/0x001B/*::]*/: { /* n:"BrtPCDIAMissing" */ }, /*::[*/0x001C/*::]*/: { /* n:"BrtPCDIANumber" */ }, /*::[*/0x001D/*::]*/: { /* n:"BrtPCDIABoolean" */ }, /*::[*/0x001E/*::]*/: { /* n:"BrtPCDIAError" */ }, /*::[*/0x001F/*::]*/: { /* n:"BrtPCDIAString" */ }, /*::[*/0x0020/*::]*/: { /* n:"BrtPCDIADatetime" */ }, /*::[*/0x0021/*::]*/: { /* n:"BrtPCRRecord" */ }, /*::[*/0x0022/*::]*/: { /* n:"BrtPCRRecordDt" */ }, /*::[*/0x0023/*::]*/: { /* n:"BrtFRTBegin", */ T:1 }, /*::[*/0x0024/*::]*/: { /* n:"BrtFRTEnd", */ T:-1 }, /*::[*/0x0025/*::]*/: { /* n:"BrtACBegin", */ T:1 }, /*::[*/0x0026/*::]*/: { /* n:"BrtACEnd", */ T:-1 }, /*::[*/0x0027/*::]*/: { /* n:"BrtName", */ f:parse_BrtName }, /*::[*/0x0028/*::]*/: { /* n:"BrtIndexRowBlock" */ }, /*::[*/0x002A/*::]*/: { /* n:"BrtIndexBlock" */ }, /*::[*/0x002B/*::]*/: { /* n:"BrtFont", */ f:parse_BrtFont }, /*::[*/0x002C/*::]*/: { /* n:"BrtFmt", */ f:parse_BrtFmt }, /*::[*/0x002D/*::]*/: { /* n:"BrtFill", */ f:parse_BrtFill }, /*::[*/0x002E/*::]*/: { /* n:"BrtBorder", */ f:parse_BrtBorder }, /*::[*/0x002F/*::]*/: { /* n:"BrtXF", */ f:parse_BrtXF }, /*::[*/0x0030/*::]*/: { /* n:"BrtStyle" */ }, /*::[*/0x0031/*::]*/: { /* n:"BrtCellMeta", */ f:parse_Int32LE }, /*::[*/0x0032/*::]*/: { /* n:"BrtValueMeta" */ }, /*::[*/0x0033/*::]*/: { /* n:"BrtMdb" */ f:parse_BrtMdb }, /*::[*/0x0034/*::]*/: { /* n:"BrtBeginFmd", */ T:1 }, /*::[*/0x0035/*::]*/: { /* n:"BrtEndFmd", */ T:-1 }, /*::[*/0x0036/*::]*/: { /* n:"BrtBeginMdx", */ T:1 }, /*::[*/0x0037/*::]*/: { /* n:"BrtEndMdx", */ T:-1 }, /*::[*/0x0038/*::]*/: { /* n:"BrtBeginMdxTuple", */ T:1 }, /*::[*/0x0039/*::]*/: { /* n:"BrtEndMdxTuple", */ T:-1 }, /*::[*/0x003A/*::]*/: { /* n:"BrtMdxMbrIstr" */ }, /*::[*/0x003B/*::]*/: { /* n:"BrtStr" */ }, /*::[*/0x003C/*::]*/: { /* n:"BrtColInfo", */ f:parse_ColInfo }, /*::[*/0x003E/*::]*/: { /* n:"BrtCellRString", */ f:parse_BrtCellRString }, /*::[*/0x003F/*::]*/: { /* n:"BrtCalcChainItem$", */ f:parse_BrtCalcChainItem$ }, /*::[*/0x0040/*::]*/: { /* n:"BrtDVal", */ f:parse_BrtDVal }, /*::[*/0x0041/*::]*/: { /* n:"BrtSxvcellNum" */ }, /*::[*/0x0042/*::]*/: { /* n:"BrtSxvcellStr" */ }, /*::[*/0x0043/*::]*/: { /* n:"BrtSxvcellBool" */ }, /*::[*/0x0044/*::]*/: { /* n:"BrtSxvcellErr" */ }, /*::[*/0x0045/*::]*/: { /* n:"BrtSxvcellDate" */ }, /*::[*/0x0046/*::]*/: { /* n:"BrtSxvcellNil" */ }, /*::[*/0x0080/*::]*/: { /* n:"BrtFileVersion" */ }, /*::[*/0x0081/*::]*/: { /* n:"BrtBeginSheet", */ T:1 }, /*::[*/0x0082/*::]*/: { /* n:"BrtEndSheet", */ T:-1 }, /*::[*/0x0083/*::]*/: { /* n:"BrtBeginBook", */ T:1, f:parsenoop, p:0 }, /*::[*/0x0084/*::]*/: { /* n:"BrtEndBook", */ T:-1 }, /*::[*/0x0085/*::]*/: { /* n:"BrtBeginWsViews", */ T:1 }, /*::[*/0x0086/*::]*/: { /* n:"BrtEndWsViews", */ T:-1 }, /*::[*/0x0087/*::]*/: { /* n:"BrtBeginBookViews", */ T:1 }, /*::[*/0x0088/*::]*/: { /* n:"BrtEndBookViews", */ T:-1 }, /*::[*/0x0089/*::]*/: { /* n:"BrtBeginWsView", */ T:1, f:parse_BrtBeginWsView }, /*::[*/0x008A/*::]*/: { /* n:"BrtEndWsView", */ T:-1 }, /*::[*/0x008B/*::]*/: { /* n:"BrtBeginCsViews", */ T:1 }, /*::[*/0x008C/*::]*/: { /* n:"BrtEndCsViews", */ T:-1 }, /*::[*/0x008D/*::]*/: { /* n:"BrtBeginCsView", */ T:1 }, /*::[*/0x008E/*::]*/: { /* n:"BrtEndCsView", */ T:-1 }, /*::[*/0x008F/*::]*/: { /* n:"BrtBeginBundleShs", */ T:1 }, /*::[*/0x0090/*::]*/: { /* n:"BrtEndBundleShs", */ T:-1 }, /*::[*/0x0091/*::]*/: { /* n:"BrtBeginSheetData", */ T:1 }, /*::[*/0x0092/*::]*/: { /* n:"BrtEndSheetData", */ T:-1 }, /*::[*/0x0093/*::]*/: { /* n:"BrtWsProp", */ f:parse_BrtWsProp }, /*::[*/0x0094/*::]*/: { /* n:"BrtWsDim", */ f:parse_BrtWsDim, p:16 }, /*::[*/0x0097/*::]*/: { /* n:"BrtPane", */ f:parse_BrtPane }, /*::[*/0x0098/*::]*/: { /* n:"BrtSel" */ }, /*::[*/0x0099/*::]*/: { /* n:"BrtWbProp", */ f:parse_BrtWbProp }, /*::[*/0x009A/*::]*/: { /* n:"BrtWbFactoid" */ }, /*::[*/0x009B/*::]*/: { /* n:"BrtFileRecover" */ }, /*::[*/0x009C/*::]*/: { /* n:"BrtBundleSh", */ f:parse_BrtBundleSh }, /*::[*/0x009D/*::]*/: { /* n:"BrtCalcProp" */ }, /*::[*/0x009E/*::]*/: { /* n:"BrtBookView" */ }, /*::[*/0x009F/*::]*/: { /* n:"BrtBeginSst", */ T:1, f:parse_BrtBeginSst }, /*::[*/0x00A0/*::]*/: { /* n:"BrtEndSst", */ T:-1 }, /*::[*/0x00A1/*::]*/: { /* n:"BrtBeginAFilter", */ T:1, f:parse_UncheckedRfX }, /*::[*/0x00A2/*::]*/: { /* n:"BrtEndAFilter", */ T:-1 }, /*::[*/0x00A3/*::]*/: { /* n:"BrtBeginFilterColumn", */ T:1 }, /*::[*/0x00A4/*::]*/: { /* n:"BrtEndFilterColumn", */ T:-1 }, /*::[*/0x00A5/*::]*/: { /* n:"BrtBeginFilters", */ T:1 }, /*::[*/0x00A6/*::]*/: { /* n:"BrtEndFilters", */ T:-1 }, /*::[*/0x00A7/*::]*/: { /* n:"BrtFilter" */ }, /*::[*/0x00A8/*::]*/: { /* n:"BrtColorFilter" */ }, /*::[*/0x00A9/*::]*/: { /* n:"BrtIconFilter" */ }, /*::[*/0x00AA/*::]*/: { /* n:"BrtTop10Filter" */ }, /*::[*/0x00AB/*::]*/: { /* n:"BrtDynamicFilter" */ }, /*::[*/0x00AC/*::]*/: { /* n:"BrtBeginCustomFilters", */ T:1 }, /*::[*/0x00AD/*::]*/: { /* n:"BrtEndCustomFilters", */ T:-1 }, /*::[*/0x00AE/*::]*/: { /* n:"BrtCustomFilter" */ }, /*::[*/0x00AF/*::]*/: { /* n:"BrtAFilterDateGroupItem" */ }, /*::[*/0x00B0/*::]*/: { /* n:"BrtMergeCell", */ f:parse_BrtMergeCell }, /*::[*/0x00B1/*::]*/: { /* n:"BrtBeginMergeCells", */ T:1 }, /*::[*/0x00B2/*::]*/: { /* n:"BrtEndMergeCells", */ T:-1 }, /*::[*/0x00B3/*::]*/: { /* n:"BrtBeginPivotCacheDef", */ T:1 }, /*::[*/0x00B4/*::]*/: { /* n:"BrtEndPivotCacheDef", */ T:-1 }, /*::[*/0x00B5/*::]*/: { /* n:"BrtBeginPCDFields", */ T:1 }, /*::[*/0x00B6/*::]*/: { /* n:"BrtEndPCDFields", */ T:-1 }, /*::[*/0x00B7/*::]*/: { /* n:"BrtBeginPCDField", */ T:1 }, /*::[*/0x00B8/*::]*/: { /* n:"BrtEndPCDField", */ T:-1 }, /*::[*/0x00B9/*::]*/: { /* n:"BrtBeginPCDSource", */ T:1 }, /*::[*/0x00BA/*::]*/: { /* n:"BrtEndPCDSource", */ T:-1 }, /*::[*/0x00BB/*::]*/: { /* n:"BrtBeginPCDSRange", */ T:1 }, /*::[*/0x00BC/*::]*/: { /* n:"BrtEndPCDSRange", */ T:-1 }, /*::[*/0x00BD/*::]*/: { /* n:"BrtBeginPCDFAtbl", */ T:1 }, /*::[*/0x00BE/*::]*/: { /* n:"BrtEndPCDFAtbl", */ T:-1 }, /*::[*/0x00BF/*::]*/: { /* n:"BrtBeginPCDIRun", */ T:1 }, /*::[*/0x00C0/*::]*/: { /* n:"BrtEndPCDIRun", */ T:-1 }, /*::[*/0x00C1/*::]*/: { /* n:"BrtBeginPivotCacheRecords", */ T:1 }, /*::[*/0x00C2/*::]*/: { /* n:"BrtEndPivotCacheRecords", */ T:-1 }, /*::[*/0x00C3/*::]*/: { /* n:"BrtBeginPCDHierarchies", */ T:1 }, /*::[*/0x00C4/*::]*/: { /* n:"BrtEndPCDHierarchies", */ T:-1 }, /*::[*/0x00C5/*::]*/: { /* n:"BrtBeginPCDHierarchy", */ T:1 }, /*::[*/0x00C6/*::]*/: { /* n:"BrtEndPCDHierarchy", */ T:-1 }, /*::[*/0x00C7/*::]*/: { /* n:"BrtBeginPCDHFieldsUsage", */ T:1 }, /*::[*/0x00C8/*::]*/: { /* n:"BrtEndPCDHFieldsUsage", */ T:-1 }, /*::[*/0x00C9/*::]*/: { /* n:"BrtBeginExtConnection", */ T:1 }, /*::[*/0x00CA/*::]*/: { /* n:"BrtEndExtConnection", */ T:-1 }, /*::[*/0x00CB/*::]*/: { /* n:"BrtBeginECDbProps", */ T:1 }, /*::[*/0x00CC/*::]*/: { /* n:"BrtEndECDbProps", */ T:-1 }, /*::[*/0x00CD/*::]*/: { /* n:"BrtBeginECOlapProps", */ T:1 }, /*::[*/0x00CE/*::]*/: { /* n:"BrtEndECOlapProps", */ T:-1 }, /*::[*/0x00CF/*::]*/: { /* n:"BrtBeginPCDSConsol", */ T:1 }, /*::[*/0x00D0/*::]*/: { /* n:"BrtEndPCDSConsol", */ T:-1 }, /*::[*/0x00D1/*::]*/: { /* n:"BrtBeginPCDSCPages", */ T:1 }, /*::[*/0x00D2/*::]*/: { /* n:"BrtEndPCDSCPages", */ T:-1 }, /*::[*/0x00D3/*::]*/: { /* n:"BrtBeginPCDSCPage", */ T:1 }, /*::[*/0x00D4/*::]*/: { /* n:"BrtEndPCDSCPage", */ T:-1 }, /*::[*/0x00D5/*::]*/: { /* n:"BrtBeginPCDSCPItem", */ T:1 }, /*::[*/0x00D6/*::]*/: { /* n:"BrtEndPCDSCPItem", */ T:-1 }, /*::[*/0x00D7/*::]*/: { /* n:"BrtBeginPCDSCSets", */ T:1 }, /*::[*/0x00D8/*::]*/: { /* n:"BrtEndPCDSCSets", */ T:-1 }, /*::[*/0x00D9/*::]*/: { /* n:"BrtBeginPCDSCSet", */ T:1 }, /*::[*/0x00DA/*::]*/: { /* n:"BrtEndPCDSCSet", */ T:-1 }, /*::[*/0x00DB/*::]*/: { /* n:"BrtBeginPCDFGroup", */ T:1 }, /*::[*/0x00DC/*::]*/: { /* n:"BrtEndPCDFGroup", */ T:-1 }, /*::[*/0x00DD/*::]*/: { /* n:"BrtBeginPCDFGItems", */ T:1 }, /*::[*/0x00DE/*::]*/: { /* n:"BrtEndPCDFGItems", */ T:-1 }, /*::[*/0x00DF/*::]*/: { /* n:"BrtBeginPCDFGRange", */ T:1 }, /*::[*/0x00E0/*::]*/: { /* n:"BrtEndPCDFGRange", */ T:-1 }, /*::[*/0x00E1/*::]*/: { /* n:"BrtBeginPCDFGDiscrete", */ T:1 }, /*::[*/0x00E2/*::]*/: { /* n:"BrtEndPCDFGDiscrete", */ T:-1 }, /*::[*/0x00E3/*::]*/: { /* n:"BrtBeginPCDSDTupleCache", */ T:1 }, /*::[*/0x00E4/*::]*/: { /* n:"BrtEndPCDSDTupleCache", */ T:-1 }, /*::[*/0x00E5/*::]*/: { /* n:"BrtBeginPCDSDTCEntries", */ T:1 }, /*::[*/0x00E6/*::]*/: { /* n:"BrtEndPCDSDTCEntries", */ T:-1 }, /*::[*/0x00E7/*::]*/: { /* n:"BrtBeginPCDSDTCEMembers", */ T:1 }, /*::[*/0x00E8/*::]*/: { /* n:"BrtEndPCDSDTCEMembers", */ T:-1 }, /*::[*/0x00E9/*::]*/: { /* n:"BrtBeginPCDSDTCEMember", */ T:1 }, /*::[*/0x00EA/*::]*/: { /* n:"BrtEndPCDSDTCEMember", */ T:-1 }, /*::[*/0x00EB/*::]*/: { /* n:"BrtBeginPCDSDTCQueries", */ T:1 }, /*::[*/0x00EC/*::]*/: { /* n:"BrtEndPCDSDTCQueries", */ T:-1 }, /*::[*/0x00ED/*::]*/: { /* n:"BrtBeginPCDSDTCQuery", */ T:1 }, /*::[*/0x00EE/*::]*/: { /* n:"BrtEndPCDSDTCQuery", */ T:-1 }, /*::[*/0x00EF/*::]*/: { /* n:"BrtBeginPCDSDTCSets", */ T:1 }, /*::[*/0x00F0/*::]*/: { /* n:"BrtEndPCDSDTCSets", */ T:-1 }, /*::[*/0x00F1/*::]*/: { /* n:"BrtBeginPCDSDTCSet", */ T:1 }, /*::[*/0x00F2/*::]*/: { /* n:"BrtEndPCDSDTCSet", */ T:-1 }, /*::[*/0x00F3/*::]*/: { /* n:"BrtBeginPCDCalcItems", */ T:1 }, /*::[*/0x00F4/*::]*/: { /* n:"BrtEndPCDCalcItems", */ T:-1 }, /*::[*/0x00F5/*::]*/: { /* n:"BrtBeginPCDCalcItem", */ T:1 }, /*::[*/0x00F6/*::]*/: { /* n:"BrtEndPCDCalcItem", */ T:-1 }, /*::[*/0x00F7/*::]*/: { /* n:"BrtBeginPRule", */ T:1 }, /*::[*/0x00F8/*::]*/: { /* n:"BrtEndPRule", */ T:-1 }, /*::[*/0x00F9/*::]*/: { /* n:"BrtBeginPRFilters", */ T:1 }, /*::[*/0x00FA/*::]*/: { /* n:"BrtEndPRFilters", */ T:-1 }, /*::[*/0x00FB/*::]*/: { /* n:"BrtBeginPRFilter", */ T:1 }, /*::[*/0x00FC/*::]*/: { /* n:"BrtEndPRFilter", */ T:-1 }, /*::[*/0x00FD/*::]*/: { /* n:"BrtBeginPNames", */ T:1 }, /*::[*/0x00FE/*::]*/: { /* n:"BrtEndPNames", */ T:-1 }, /*::[*/0x00FF/*::]*/: { /* n:"BrtBeginPName", */ T:1 }, /*::[*/0x0100/*::]*/: { /* n:"BrtEndPName", */ T:-1 }, /*::[*/0x0101/*::]*/: { /* n:"BrtBeginPNPairs", */ T:1 }, /*::[*/0x0102/*::]*/: { /* n:"BrtEndPNPairs", */ T:-1 }, /*::[*/0x0103/*::]*/: { /* n:"BrtBeginPNPair", */ T:1 }, /*::[*/0x0104/*::]*/: { /* n:"BrtEndPNPair", */ T:-1 }, /*::[*/0x0105/*::]*/: { /* n:"BrtBeginECWebProps", */ T:1 }, /*::[*/0x0106/*::]*/: { /* n:"BrtEndECWebProps", */ T:-1 }, /*::[*/0x0107/*::]*/: { /* n:"BrtBeginEcWpTables", */ T:1 }, /*::[*/0x0108/*::]*/: { /* n:"BrtEndECWPTables", */ T:-1 }, /*::[*/0x0109/*::]*/: { /* n:"BrtBeginECParams", */ T:1 }, /*::[*/0x010A/*::]*/: { /* n:"BrtEndECParams", */ T:-1 }, /*::[*/0x010B/*::]*/: { /* n:"BrtBeginECParam", */ T:1 }, /*::[*/0x010C/*::]*/: { /* n:"BrtEndECParam", */ T:-1 }, /*::[*/0x010D/*::]*/: { /* n:"BrtBeginPCDKPIs", */ T:1 }, /*::[*/0x010E/*::]*/: { /* n:"BrtEndPCDKPIs", */ T:-1 }, /*::[*/0x010F/*::]*/: { /* n:"BrtBeginPCDKPI", */ T:1 }, /*::[*/0x0110/*::]*/: { /* n:"BrtEndPCDKPI", */ T:-1 }, /*::[*/0x0111/*::]*/: { /* n:"BrtBeginDims", */ T:1 }, /*::[*/0x0112/*::]*/: { /* n:"BrtEndDims", */ T:-1 }, /*::[*/0x0113/*::]*/: { /* n:"BrtBeginDim", */ T:1 }, /*::[*/0x0114/*::]*/: { /* n:"BrtEndDim", */ T:-1 }, /*::[*/0x0115/*::]*/: { /* n:"BrtIndexPartEnd" */ }, /*::[*/0x0116/*::]*/: { /* n:"BrtBeginStyleSheet", */ T:1 }, /*::[*/0x0117/*::]*/: { /* n:"BrtEndStyleSheet", */ T:-1 }, /*::[*/0x0118/*::]*/: { /* n:"BrtBeginSXView", */ T:1 }, /*::[*/0x0119/*::]*/: { /* n:"BrtEndSXVI", */ T:-1 }, /*::[*/0x011A/*::]*/: { /* n:"BrtBeginSXVI", */ T:1 }, /*::[*/0x011B/*::]*/: { /* n:"BrtBeginSXVIs", */ T:1 }, /*::[*/0x011C/*::]*/: { /* n:"BrtEndSXVIs", */ T:-1 }, /*::[*/0x011D/*::]*/: { /* n:"BrtBeginSXVD", */ T:1 }, /*::[*/0x011E/*::]*/: { /* n:"BrtEndSXVD", */ T:-1 }, /*::[*/0x011F/*::]*/: { /* n:"BrtBeginSXVDs", */ T:1 }, /*::[*/0x0120/*::]*/: { /* n:"BrtEndSXVDs", */ T:-1 }, /*::[*/0x0121/*::]*/: { /* n:"BrtBeginSXPI", */ T:1 }, /*::[*/0x0122/*::]*/: { /* n:"BrtEndSXPI", */ T:-1 }, /*::[*/0x0123/*::]*/: { /* n:"BrtBeginSXPIs", */ T:1 }, /*::[*/0x0124/*::]*/: { /* n:"BrtEndSXPIs", */ T:-1 }, /*::[*/0x0125/*::]*/: { /* n:"BrtBeginSXDI", */ T:1 }, /*::[*/0x0126/*::]*/: { /* n:"BrtEndSXDI", */ T:-1 }, /*::[*/0x0127/*::]*/: { /* n:"BrtBeginSXDIs", */ T:1 }, /*::[*/0x0128/*::]*/: { /* n:"BrtEndSXDIs", */ T:-1 }, /*::[*/0x0129/*::]*/: { /* n:"BrtBeginSXLI", */ T:1 }, /*::[*/0x012A/*::]*/: { /* n:"BrtEndSXLI", */ T:-1 }, /*::[*/0x012B/*::]*/: { /* n:"BrtBeginSXLIRws", */ T:1 }, /*::[*/0x012C/*::]*/: { /* n:"BrtEndSXLIRws", */ T:-1 }, /*::[*/0x012D/*::]*/: { /* n:"BrtBeginSXLICols", */ T:1 }, /*::[*/0x012E/*::]*/: { /* n:"BrtEndSXLICols", */ T:-1 }, /*::[*/0x012F/*::]*/: { /* n:"BrtBeginSXFormat", */ T:1 }, /*::[*/0x0130/*::]*/: { /* n:"BrtEndSXFormat", */ T:-1 }, /*::[*/0x0131/*::]*/: { /* n:"BrtBeginSXFormats", */ T:1 }, /*::[*/0x0132/*::]*/: { /* n:"BrtEndSxFormats", */ T:-1 }, /*::[*/0x0133/*::]*/: { /* n:"BrtBeginSxSelect", */ T:1 }, /*::[*/0x0134/*::]*/: { /* n:"BrtEndSxSelect", */ T:-1 }, /*::[*/0x0135/*::]*/: { /* n:"BrtBeginISXVDRws", */ T:1 }, /*::[*/0x0136/*::]*/: { /* n:"BrtEndISXVDRws", */ T:-1 }, /*::[*/0x0137/*::]*/: { /* n:"BrtBeginISXVDCols", */ T:1 }, /*::[*/0x0138/*::]*/: { /* n:"BrtEndISXVDCols", */ T:-1 }, /*::[*/0x0139/*::]*/: { /* n:"BrtEndSXLocation", */ T:-1 }, /*::[*/0x013A/*::]*/: { /* n:"BrtBeginSXLocation", */ T:1 }, /*::[*/0x013B/*::]*/: { /* n:"BrtEndSXView", */ T:-1 }, /*::[*/0x013C/*::]*/: { /* n:"BrtBeginSXTHs", */ T:1 }, /*::[*/0x013D/*::]*/: { /* n:"BrtEndSXTHs", */ T:-1 }, /*::[*/0x013E/*::]*/: { /* n:"BrtBeginSXTH", */ T:1 }, /*::[*/0x013F/*::]*/: { /* n:"BrtEndSXTH", */ T:-1 }, /*::[*/0x0140/*::]*/: { /* n:"BrtBeginISXTHRws", */ T:1 }, /*::[*/0x0141/*::]*/: { /* n:"BrtEndISXTHRws", */ T:-1 }, /*::[*/0x0142/*::]*/: { /* n:"BrtBeginISXTHCols", */ T:1 }, /*::[*/0x0143/*::]*/: { /* n:"BrtEndISXTHCols", */ T:-1 }, /*::[*/0x0144/*::]*/: { /* n:"BrtBeginSXTDMPS", */ T:1 }, /*::[*/0x0145/*::]*/: { /* n:"BrtEndSXTDMPs", */ T:-1 }, /*::[*/0x0146/*::]*/: { /* n:"BrtBeginSXTDMP", */ T:1 }, /*::[*/0x0147/*::]*/: { /* n:"BrtEndSXTDMP", */ T:-1 }, /*::[*/0x0148/*::]*/: { /* n:"BrtBeginSXTHItems", */ T:1 }, /*::[*/0x0149/*::]*/: { /* n:"BrtEndSXTHItems", */ T:-1 }, /*::[*/0x014A/*::]*/: { /* n:"BrtBeginSXTHItem", */ T:1 }, /*::[*/0x014B/*::]*/: { /* n:"BrtEndSXTHItem", */ T:-1 }, /*::[*/0x014C/*::]*/: { /* n:"BrtBeginMetadata", */ T:1 }, /*::[*/0x014D/*::]*/: { /* n:"BrtEndMetadata", */ T:-1 }, /*::[*/0x014E/*::]*/: { /* n:"BrtBeginEsmdtinfo", */ T:1 }, /*::[*/0x014F/*::]*/: { /* n:"BrtMdtinfo", */ f:parse_BrtMdtinfo }, /*::[*/0x0150/*::]*/: { /* n:"BrtEndEsmdtinfo", */ T:-1 }, /*::[*/0x0151/*::]*/: { /* n:"BrtBeginEsmdb", */ f:parse_BrtBeginEsmdb, T:1 }, /*::[*/0x0152/*::]*/: { /* n:"BrtEndEsmdb", */ T:-1 }, /*::[*/0x0153/*::]*/: { /* n:"BrtBeginEsfmd", */ T:1 }, /*::[*/0x0154/*::]*/: { /* n:"BrtEndEsfmd", */ T:-1 }, /*::[*/0x0155/*::]*/: { /* n:"BrtBeginSingleCells", */ T:1 }, /*::[*/0x0156/*::]*/: { /* n:"BrtEndSingleCells", */ T:-1 }, /*::[*/0x0157/*::]*/: { /* n:"BrtBeginList", */ T:1 }, /*::[*/0x0158/*::]*/: { /* n:"BrtEndList", */ T:-1 }, /*::[*/0x0159/*::]*/: { /* n:"BrtBeginListCols", */ T:1 }, /*::[*/0x015A/*::]*/: { /* n:"BrtEndListCols", */ T:-1 }, /*::[*/0x015B/*::]*/: { /* n:"BrtBeginListCol", */ T:1 }, /*::[*/0x015C/*::]*/: { /* n:"BrtEndListCol", */ T:-1 }, /*::[*/0x015D/*::]*/: { /* n:"BrtBeginListXmlCPr", */ T:1 }, /*::[*/0x015E/*::]*/: { /* n:"BrtEndListXmlCPr", */ T:-1 }, /*::[*/0x015F/*::]*/: { /* n:"BrtListCCFmla" */ }, /*::[*/0x0160/*::]*/: { /* n:"BrtListTrFmla" */ }, /*::[*/0x0161/*::]*/: { /* n:"BrtBeginExternals", */ T:1 }, /*::[*/0x0162/*::]*/: { /* n:"BrtEndExternals", */ T:-1 }, /*::[*/0x0163/*::]*/: { /* n:"BrtSupBookSrc", */ f:parse_RelID}, /*::[*/0x0165/*::]*/: { /* n:"BrtSupSelf" */ }, /*::[*/0x0166/*::]*/: { /* n:"BrtSupSame" */ }, /*::[*/0x0167/*::]*/: { /* n:"BrtSupTabs" */ }, /*::[*/0x0168/*::]*/: { /* n:"BrtBeginSupBook", */ T:1 }, /*::[*/0x0169/*::]*/: { /* n:"BrtPlaceholderName" */ }, /*::[*/0x016A/*::]*/: { /* n:"BrtExternSheet", */ f:parse_ExternSheet }, /*::[*/0x016B/*::]*/: { /* n:"BrtExternTableStart" */ }, /*::[*/0x016C/*::]*/: { /* n:"BrtExternTableEnd" */ }, /*::[*/0x016E/*::]*/: { /* n:"BrtExternRowHdr" */ }, /*::[*/0x016F/*::]*/: { /* n:"BrtExternCellBlank" */ }, /*::[*/0x0170/*::]*/: { /* n:"BrtExternCellReal" */ }, /*::[*/0x0171/*::]*/: { /* n:"BrtExternCellBool" */ }, /*::[*/0x0172/*::]*/: { /* n:"BrtExternCellError" */ }, /*::[*/0x0173/*::]*/: { /* n:"BrtExternCellString" */ }, /*::[*/0x0174/*::]*/: { /* n:"BrtBeginEsmdx", */ T:1 }, /*::[*/0x0175/*::]*/: { /* n:"BrtEndEsmdx", */ T:-1 }, /*::[*/0x0176/*::]*/: { /* n:"BrtBeginMdxSet", */ T:1 }, /*::[*/0x0177/*::]*/: { /* n:"BrtEndMdxSet", */ T:-1 }, /*::[*/0x0178/*::]*/: { /* n:"BrtBeginMdxMbrProp", */ T:1 }, /*::[*/0x0179/*::]*/: { /* n:"BrtEndMdxMbrProp", */ T:-1 }, /*::[*/0x017A/*::]*/: { /* n:"BrtBeginMdxKPI", */ T:1 }, /*::[*/0x017B/*::]*/: { /* n:"BrtEndMdxKPI", */ T:-1 }, /*::[*/0x017C/*::]*/: { /* n:"BrtBeginEsstr", */ T:1 }, /*::[*/0x017D/*::]*/: { /* n:"BrtEndEsstr", */ T:-1 }, /*::[*/0x017E/*::]*/: { /* n:"BrtBeginPRFItem", */ T:1 }, /*::[*/0x017F/*::]*/: { /* n:"BrtEndPRFItem", */ T:-1 }, /*::[*/0x0180/*::]*/: { /* n:"BrtBeginPivotCacheIDs", */ T:1 }, /*::[*/0x0181/*::]*/: { /* n:"BrtEndPivotCacheIDs", */ T:-1 }, /*::[*/0x0182/*::]*/: { /* n:"BrtBeginPivotCacheID", */ T:1 }, /*::[*/0x0183/*::]*/: { /* n:"BrtEndPivotCacheID", */ T:-1 }, /*::[*/0x0184/*::]*/: { /* n:"BrtBeginISXVIs", */ T:1 }, /*::[*/0x0185/*::]*/: { /* n:"BrtEndISXVIs", */ T:-1 }, /*::[*/0x0186/*::]*/: { /* n:"BrtBeginColInfos", */ T:1 }, /*::[*/0x0187/*::]*/: { /* n:"BrtEndColInfos", */ T:-1 }, /*::[*/0x0188/*::]*/: { /* n:"BrtBeginRwBrk", */ T:1 }, /*::[*/0x0189/*::]*/: { /* n:"BrtEndRwBrk", */ T:-1 }, /*::[*/0x018A/*::]*/: { /* n:"BrtBeginColBrk", */ T:1 }, /*::[*/0x018B/*::]*/: { /* n:"BrtEndColBrk", */ T:-1 }, /*::[*/0x018C/*::]*/: { /* n:"BrtBrk" */ }, /*::[*/0x018D/*::]*/: { /* n:"BrtUserBookView" */ }, /*::[*/0x018E/*::]*/: { /* n:"BrtInfo" */ }, /*::[*/0x018F/*::]*/: { /* n:"BrtCUsr" */ }, /*::[*/0x0190/*::]*/: { /* n:"BrtUsr" */ }, /*::[*/0x0191/*::]*/: { /* n:"BrtBeginUsers", */ T:1 }, /*::[*/0x0193/*::]*/: { /* n:"BrtEOF" */ }, /*::[*/0x0194/*::]*/: { /* n:"BrtUCR" */ }, /*::[*/0x0195/*::]*/: { /* n:"BrtRRInsDel" */ }, /*::[*/0x0196/*::]*/: { /* n:"BrtRREndInsDel" */ }, /*::[*/0x0197/*::]*/: { /* n:"BrtRRMove" */ }, /*::[*/0x0198/*::]*/: { /* n:"BrtRREndMove" */ }, /*::[*/0x0199/*::]*/: { /* n:"BrtRRChgCell" */ }, /*::[*/0x019A/*::]*/: { /* n:"BrtRREndChgCell" */ }, /*::[*/0x019B/*::]*/: { /* n:"BrtRRHeader" */ }, /*::[*/0x019C/*::]*/: { /* n:"BrtRRUserView" */ }, /*::[*/0x019D/*::]*/: { /* n:"BrtRRRenSheet" */ }, /*::[*/0x019E/*::]*/: { /* n:"BrtRRInsertSh" */ }, /*::[*/0x019F/*::]*/: { /* n:"BrtRRDefName" */ }, /*::[*/0x01A0/*::]*/: { /* n:"BrtRRNote" */ }, /*::[*/0x01A1/*::]*/: { /* n:"BrtRRConflict" */ }, /*::[*/0x01A2/*::]*/: { /* n:"BrtRRTQSIF" */ }, /*::[*/0x01A3/*::]*/: { /* n:"BrtRRFormat" */ }, /*::[*/0x01A4/*::]*/: { /* n:"BrtRREndFormat" */ }, /*::[*/0x01A5/*::]*/: { /* n:"BrtRRAutoFmt" */ }, /*::[*/0x01A6/*::]*/: { /* n:"BrtBeginUserShViews", */ T:1 }, /*::[*/0x01A7/*::]*/: { /* n:"BrtBeginUserShView", */ T:1 }, /*::[*/0x01A8/*::]*/: { /* n:"BrtEndUserShView", */ T:-1 }, /*::[*/0x01A9/*::]*/: { /* n:"BrtEndUserShViews", */ T:-1 }, /*::[*/0x01AA/*::]*/: { /* n:"BrtArrFmla", */ f:parse_BrtArrFmla }, /*::[*/0x01AB/*::]*/: { /* n:"BrtShrFmla", */ f:parse_BrtShrFmla }, /*::[*/0x01AC/*::]*/: { /* n:"BrtTable" */ }, /*::[*/0x01AD/*::]*/: { /* n:"BrtBeginExtConnections", */ T:1 }, /*::[*/0x01AE/*::]*/: { /* n:"BrtEndExtConnections", */ T:-1 }, /*::[*/0x01AF/*::]*/: { /* n:"BrtBeginPCDCalcMems", */ T:1 }, /*::[*/0x01B0/*::]*/: { /* n:"BrtEndPCDCalcMems", */ T:-1 }, /*::[*/0x01B1/*::]*/: { /* n:"BrtBeginPCDCalcMem", */ T:1 }, /*::[*/0x01B2/*::]*/: { /* n:"BrtEndPCDCalcMem", */ T:-1 }, /*::[*/0x01B3/*::]*/: { /* n:"BrtBeginPCDHGLevels", */ T:1 }, /*::[*/0x01B4/*::]*/: { /* n:"BrtEndPCDHGLevels", */ T:-1 }, /*::[*/0x01B5/*::]*/: { /* n:"BrtBeginPCDHGLevel", */ T:1 }, /*::[*/0x01B6/*::]*/: { /* n:"BrtEndPCDHGLevel", */ T:-1 }, /*::[*/0x01B7/*::]*/: { /* n:"BrtBeginPCDHGLGroups", */ T:1 }, /*::[*/0x01B8/*::]*/: { /* n:"BrtEndPCDHGLGroups", */ T:-1 }, /*::[*/0x01B9/*::]*/: { /* n:"BrtBeginPCDHGLGroup", */ T:1 }, /*::[*/0x01BA/*::]*/: { /* n:"BrtEndPCDHGLGroup", */ T:-1 }, /*::[*/0x01BB/*::]*/: { /* n:"BrtBeginPCDHGLGMembers", */ T:1 }, /*::[*/0x01BC/*::]*/: { /* n:"BrtEndPCDHGLGMembers", */ T:-1 }, /*::[*/0x01BD/*::]*/: { /* n:"BrtBeginPCDHGLGMember", */ T:1 }, /*::[*/0x01BE/*::]*/: { /* n:"BrtEndPCDHGLGMember", */ T:-1 }, /*::[*/0x01BF/*::]*/: { /* n:"BrtBeginQSI", */ T:1 }, /*::[*/0x01C0/*::]*/: { /* n:"BrtEndQSI", */ T:-1 }, /*::[*/0x01C1/*::]*/: { /* n:"BrtBeginQSIR", */ T:1 }, /*::[*/0x01C2/*::]*/: { /* n:"BrtEndQSIR", */ T:-1 }, /*::[*/0x01C3/*::]*/: { /* n:"BrtBeginDeletedNames", */ T:1 }, /*::[*/0x01C4/*::]*/: { /* n:"BrtEndDeletedNames", */ T:-1 }, /*::[*/0x01C5/*::]*/: { /* n:"BrtBeginDeletedName", */ T:1 }, /*::[*/0x01C6/*::]*/: { /* n:"BrtEndDeletedName", */ T:-1 }, /*::[*/0x01C7/*::]*/: { /* n:"BrtBeginQSIFs", */ T:1 }, /*::[*/0x01C8/*::]*/: { /* n:"BrtEndQSIFs", */ T:-1 }, /*::[*/0x01C9/*::]*/: { /* n:"BrtBeginQSIF", */ T:1 }, /*::[*/0x01CA/*::]*/: { /* n:"BrtEndQSIF", */ T:-1 }, /*::[*/0x01CB/*::]*/: { /* n:"BrtBeginAutoSortScope", */ T:1 }, /*::[*/0x01CC/*::]*/: { /* n:"BrtEndAutoSortScope", */ T:-1 }, /*::[*/0x01CD/*::]*/: { /* n:"BrtBeginConditionalFormatting", */ T:1 }, /*::[*/0x01CE/*::]*/: { /* n:"BrtEndConditionalFormatting", */ T:-1 }, /*::[*/0x01CF/*::]*/: { /* n:"BrtBeginCFRule", */ T:1 }, /*::[*/0x01D0/*::]*/: { /* n:"BrtEndCFRule", */ T:-1 }, /*::[*/0x01D1/*::]*/: { /* n:"BrtBeginIconSet", */ T:1 }, /*::[*/0x01D2/*::]*/: { /* n:"BrtEndIconSet", */ T:-1 }, /*::[*/0x01D3/*::]*/: { /* n:"BrtBeginDatabar", */ T:1 }, /*::[*/0x01D4/*::]*/: { /* n:"BrtEndDatabar", */ T:-1 }, /*::[*/0x01D5/*::]*/: { /* n:"BrtBeginColorScale", */ T:1 }, /*::[*/0x01D6/*::]*/: { /* n:"BrtEndColorScale", */ T:-1 }, /*::[*/0x01D7/*::]*/: { /* n:"BrtCFVO" */ }, /*::[*/0x01D8/*::]*/: { /* n:"BrtExternValueMeta" */ }, /*::[*/0x01D9/*::]*/: { /* n:"BrtBeginColorPalette", */ T:1 }, /*::[*/0x01DA/*::]*/: { /* n:"BrtEndColorPalette", */ T:-1 }, /*::[*/0x01DB/*::]*/: { /* n:"BrtIndexedColor" */ }, /*::[*/0x01DC/*::]*/: { /* n:"BrtMargins", */ f:parse_BrtMargins }, /*::[*/0x01DD/*::]*/: { /* n:"BrtPrintOptions" */ }, /*::[*/0x01DE/*::]*/: { /* n:"BrtPageSetup" */ }, /*::[*/0x01DF/*::]*/: { /* n:"BrtBeginHeaderFooter", */ T:1 }, /*::[*/0x01E0/*::]*/: { /* n:"BrtEndHeaderFooter", */ T:-1 }, /*::[*/0x01E1/*::]*/: { /* n:"BrtBeginSXCrtFormat", */ T:1 }, /*::[*/0x01E2/*::]*/: { /* n:"BrtEndSXCrtFormat", */ T:-1 }, /*::[*/0x01E3/*::]*/: { /* n:"BrtBeginSXCrtFormats", */ T:1 }, /*::[*/0x01E4/*::]*/: { /* n:"BrtEndSXCrtFormats", */ T:-1 }, /*::[*/0x01E5/*::]*/: { /* n:"BrtWsFmtInfo", */ f:parse_BrtWsFmtInfo }, /*::[*/0x01E6/*::]*/: { /* n:"BrtBeginMgs", */ T:1 }, /*::[*/0x01E7/*::]*/: { /* n:"BrtEndMGs", */ T:-1 }, /*::[*/0x01E8/*::]*/: { /* n:"BrtBeginMGMaps", */ T:1 }, /*::[*/0x01E9/*::]*/: { /* n:"BrtEndMGMaps", */ T:-1 }, /*::[*/0x01EA/*::]*/: { /* n:"BrtBeginMG", */ T:1 }, /*::[*/0x01EB/*::]*/: { /* n:"BrtEndMG", */ T:-1 }, /*::[*/0x01EC/*::]*/: { /* n:"BrtBeginMap", */ T:1 }, /*::[*/0x01ED/*::]*/: { /* n:"BrtEndMap", */ T:-1 }, /*::[*/0x01EE/*::]*/: { /* n:"BrtHLink", */ f:parse_BrtHLink }, /*::[*/0x01EF/*::]*/: { /* n:"BrtBeginDCon", */ T:1 }, /*::[*/0x01F0/*::]*/: { /* n:"BrtEndDCon", */ T:-1 }, /*::[*/0x01F1/*::]*/: { /* n:"BrtBeginDRefs", */ T:1 }, /*::[*/0x01F2/*::]*/: { /* n:"BrtEndDRefs", */ T:-1 }, /*::[*/0x01F3/*::]*/: { /* n:"BrtDRef" */ }, /*::[*/0x01F4/*::]*/: { /* n:"BrtBeginScenMan", */ T:1 }, /*::[*/0x01F5/*::]*/: { /* n:"BrtEndScenMan", */ T:-1 }, /*::[*/0x01F6/*::]*/: { /* n:"BrtBeginSct", */ T:1 }, /*::[*/0x01F7/*::]*/: { /* n:"BrtEndSct", */ T:-1 }, /*::[*/0x01F8/*::]*/: { /* n:"BrtSlc" */ }, /*::[*/0x01F9/*::]*/: { /* n:"BrtBeginDXFs", */ T:1 }, /*::[*/0x01FA/*::]*/: { /* n:"BrtEndDXFs", */ T:-1 }, /*::[*/0x01FB/*::]*/: { /* n:"BrtDXF" */ }, /*::[*/0x01FC/*::]*/: { /* n:"BrtBeginTableStyles", */ T:1 }, /*::[*/0x01FD/*::]*/: { /* n:"BrtEndTableStyles", */ T:-1 }, /*::[*/0x01FE/*::]*/: { /* n:"BrtBeginTableStyle", */ T:1 }, /*::[*/0x01FF/*::]*/: { /* n:"BrtEndTableStyle", */ T:-1 }, /*::[*/0x0200/*::]*/: { /* n:"BrtTableStyleElement" */ }, /*::[*/0x0201/*::]*/: { /* n:"BrtTableStyleClient" */ }, /*::[*/0x0202/*::]*/: { /* n:"BrtBeginVolDeps", */ T:1 }, /*::[*/0x0203/*::]*/: { /* n:"BrtEndVolDeps", */ T:-1 }, /*::[*/0x0204/*::]*/: { /* n:"BrtBeginVolType", */ T:1 }, /*::[*/0x0205/*::]*/: { /* n:"BrtEndVolType", */ T:-1 }, /*::[*/0x0206/*::]*/: { /* n:"BrtBeginVolMain", */ T:1 }, /*::[*/0x0207/*::]*/: { /* n:"BrtEndVolMain", */ T:-1 }, /*::[*/0x0208/*::]*/: { /* n:"BrtBeginVolTopic", */ T:1 }, /*::[*/0x0209/*::]*/: { /* n:"BrtEndVolTopic", */ T:-1 }, /*::[*/0x020A/*::]*/: { /* n:"BrtVolSubtopic" */ }, /*::[*/0x020B/*::]*/: { /* n:"BrtVolRef" */ }, /*::[*/0x020C/*::]*/: { /* n:"BrtVolNum" */ }, /*::[*/0x020D/*::]*/: { /* n:"BrtVolErr" */ }, /*::[*/0x020E/*::]*/: { /* n:"BrtVolStr" */ }, /*::[*/0x020F/*::]*/: { /* n:"BrtVolBool" */ }, /*::[*/0x0210/*::]*/: { /* n:"BrtBeginCalcChain$", */ T:1 }, /*::[*/0x0211/*::]*/: { /* n:"BrtEndCalcChain$", */ T:-1 }, /*::[*/0x0212/*::]*/: { /* n:"BrtBeginSortState", */ T:1 }, /*::[*/0x0213/*::]*/: { /* n:"BrtEndSortState", */ T:-1 }, /*::[*/0x0214/*::]*/: { /* n:"BrtBeginSortCond", */ T:1 }, /*::[*/0x0215/*::]*/: { /* n:"BrtEndSortCond", */ T:-1 }, /*::[*/0x0216/*::]*/: { /* n:"BrtBookProtection" */ }, /*::[*/0x0217/*::]*/: { /* n:"BrtSheetProtection" */ }, /*::[*/0x0218/*::]*/: { /* n:"BrtRangeProtection" */ }, /*::[*/0x0219/*::]*/: { /* n:"BrtPhoneticInfo" */ }, /*::[*/0x021A/*::]*/: { /* n:"BrtBeginECTxtWiz", */ T:1 }, /*::[*/0x021B/*::]*/: { /* n:"BrtEndECTxtWiz", */ T:-1 }, /*::[*/0x021C/*::]*/: { /* n:"BrtBeginECTWFldInfoLst", */ T:1 }, /*::[*/0x021D/*::]*/: { /* n:"BrtEndECTWFldInfoLst", */ T:-1 }, /*::[*/0x021E/*::]*/: { /* n:"BrtBeginECTwFldInfo", */ T:1 }, /*::[*/0x0224/*::]*/: { /* n:"BrtFileSharing" */ }, /*::[*/0x0225/*::]*/: { /* n:"BrtOleSize" */ }, /*::[*/0x0226/*::]*/: { /* n:"BrtDrawing", */ f:parse_RelID }, /*::[*/0x0227/*::]*/: { /* n:"BrtLegacyDrawing" */ }, /*::[*/0x0228/*::]*/: { /* n:"BrtLegacyDrawingHF" */ }, /*::[*/0x0229/*::]*/: { /* n:"BrtWebOpt" */ }, /*::[*/0x022A/*::]*/: { /* n:"BrtBeginWebPubItems", */ T:1 }, /*::[*/0x022B/*::]*/: { /* n:"BrtEndWebPubItems", */ T:-1 }, /*::[*/0x022C/*::]*/: { /* n:"BrtBeginWebPubItem", */ T:1 }, /*::[*/0x022D/*::]*/: { /* n:"BrtEndWebPubItem", */ T:-1 }, /*::[*/0x022E/*::]*/: { /* n:"BrtBeginSXCondFmt", */ T:1 }, /*::[*/0x022F/*::]*/: { /* n:"BrtEndSXCondFmt", */ T:-1 }, /*::[*/0x0230/*::]*/: { /* n:"BrtBeginSXCondFmts", */ T:1 }, /*::[*/0x0231/*::]*/: { /* n:"BrtEndSXCondFmts", */ T:-1 }, /*::[*/0x0232/*::]*/: { /* n:"BrtBkHim" */ }, /*::[*/0x0234/*::]*/: { /* n:"BrtColor" */ }, /*::[*/0x0235/*::]*/: { /* n:"BrtBeginIndexedColors", */ T:1 }, /*::[*/0x0236/*::]*/: { /* n:"BrtEndIndexedColors", */ T:-1 }, /*::[*/0x0239/*::]*/: { /* n:"BrtBeginMRUColors", */ T:1 }, /*::[*/0x023A/*::]*/: { /* n:"BrtEndMRUColors", */ T:-1 }, /*::[*/0x023C/*::]*/: { /* n:"BrtMRUColor" */ }, /*::[*/0x023D/*::]*/: { /* n:"BrtBeginDVals", */ T:1 }, /*::[*/0x023E/*::]*/: { /* n:"BrtEndDVals", */ T:-1 }, /*::[*/0x0241/*::]*/: { /* n:"BrtSupNameStart" */ }, /*::[*/0x0242/*::]*/: { /* n:"BrtSupNameValueStart" */ }, /*::[*/0x0243/*::]*/: { /* n:"BrtSupNameValueEnd" */ }, /*::[*/0x0244/*::]*/: { /* n:"BrtSupNameNum" */ }, /*::[*/0x0245/*::]*/: { /* n:"BrtSupNameErr" */ }, /*::[*/0x0246/*::]*/: { /* n:"BrtSupNameSt" */ }, /*::[*/0x0247/*::]*/: { /* n:"BrtSupNameNil" */ }, /*::[*/0x0248/*::]*/: { /* n:"BrtSupNameBool" */ }, /*::[*/0x0249/*::]*/: { /* n:"BrtSupNameFmla" */ }, /*::[*/0x024A/*::]*/: { /* n:"BrtSupNameBits" */ }, /*::[*/0x024B/*::]*/: { /* n:"BrtSupNameEnd" */ }, /*::[*/0x024C/*::]*/: { /* n:"BrtEndSupBook", */ T:-1 }, /*::[*/0x024D/*::]*/: { /* n:"BrtCellSmartTagProperty" */ }, /*::[*/0x024E/*::]*/: { /* n:"BrtBeginCellSmartTag", */ T:1 }, /*::[*/0x024F/*::]*/: { /* n:"BrtEndCellSmartTag", */ T:-1 }, /*::[*/0x0250/*::]*/: { /* n:"BrtBeginCellSmartTags", */ T:1 }, /*::[*/0x0251/*::]*/: { /* n:"BrtEndCellSmartTags", */ T:-1 }, /*::[*/0x0252/*::]*/: { /* n:"BrtBeginSmartTags", */ T:1 }, /*::[*/0x0253/*::]*/: { /* n:"BrtEndSmartTags", */ T:-1 }, /*::[*/0x0254/*::]*/: { /* n:"BrtSmartTagType" */ }, /*::[*/0x0255/*::]*/: { /* n:"BrtBeginSmartTagTypes", */ T:1 }, /*::[*/0x0256/*::]*/: { /* n:"BrtEndSmartTagTypes", */ T:-1 }, /*::[*/0x0257/*::]*/: { /* n:"BrtBeginSXFilters", */ T:1 }, /*::[*/0x0258/*::]*/: { /* n:"BrtEndSXFilters", */ T:-1 }, /*::[*/0x0259/*::]*/: { /* n:"BrtBeginSXFILTER", */ T:1 }, /*::[*/0x025A/*::]*/: { /* n:"BrtEndSXFilter", */ T:-1 }, /*::[*/0x025B/*::]*/: { /* n:"BrtBeginFills", */ T:1 }, /*::[*/0x025C/*::]*/: { /* n:"BrtEndFills", */ T:-1 }, /*::[*/0x025D/*::]*/: { /* n:"BrtBeginCellWatches", */ T:1 }, /*::[*/0x025E/*::]*/: { /* n:"BrtEndCellWatches", */ T:-1 }, /*::[*/0x025F/*::]*/: { /* n:"BrtCellWatch" */ }, /*::[*/0x0260/*::]*/: { /* n:"BrtBeginCRErrs", */ T:1 }, /*::[*/0x0261/*::]*/: { /* n:"BrtEndCRErrs", */ T:-1 }, /*::[*/0x0262/*::]*/: { /* n:"BrtCrashRecErr" */ }, /*::[*/0x0263/*::]*/: { /* n:"BrtBeginFonts", */ T:1 }, /*::[*/0x0264/*::]*/: { /* n:"BrtEndFonts", */ T:-1 }, /*::[*/0x0265/*::]*/: { /* n:"BrtBeginBorders", */ T:1 }, /*::[*/0x0266/*::]*/: { /* n:"BrtEndBorders", */ T:-1 }, /*::[*/0x0267/*::]*/: { /* n:"BrtBeginFmts", */ T:1 }, /*::[*/0x0268/*::]*/: { /* n:"BrtEndFmts", */ T:-1 }, /*::[*/0x0269/*::]*/: { /* n:"BrtBeginCellXFs", */ T:1 }, /*::[*/0x026A/*::]*/: { /* n:"BrtEndCellXFs", */ T:-1 }, /*::[*/0x026B/*::]*/: { /* n:"BrtBeginStyles", */ T:1 }, /*::[*/0x026C/*::]*/: { /* n:"BrtEndStyles", */ T:-1 }, /*::[*/0x0271/*::]*/: { /* n:"BrtBigName" */ }, /*::[*/0x0272/*::]*/: { /* n:"BrtBeginCellStyleXFs", */ T:1 }, /*::[*/0x0273/*::]*/: { /* n:"BrtEndCellStyleXFs", */ T:-1 }, /*::[*/0x0274/*::]*/: { /* n:"BrtBeginComments", */ T:1 }, /*::[*/0x0275/*::]*/: { /* n:"BrtEndComments", */ T:-1 }, /*::[*/0x0276/*::]*/: { /* n:"BrtBeginCommentAuthors", */ T:1 }, /*::[*/0x0277/*::]*/: { /* n:"BrtEndCommentAuthors", */ T:-1 }, /*::[*/0x0278/*::]*/: { /* n:"BrtCommentAuthor", */ f:parse_BrtCommentAuthor }, /*::[*/0x0279/*::]*/: { /* n:"BrtBeginCommentList", */ T:1 }, /*::[*/0x027A/*::]*/: { /* n:"BrtEndCommentList", */ T:-1 }, /*::[*/0x027B/*::]*/: { /* n:"BrtBeginComment", */ T:1, f:parse_BrtBeginComment}, /*::[*/0x027C/*::]*/: { /* n:"BrtEndComment", */ T:-1 }, /*::[*/0x027D/*::]*/: { /* n:"BrtCommentText", */ f:parse_BrtCommentText }, /*::[*/0x027E/*::]*/: { /* n:"BrtBeginOleObjects", */ T:1 }, /*::[*/0x027F/*::]*/: { /* n:"BrtOleObject" */ }, /*::[*/0x0280/*::]*/: { /* n:"BrtEndOleObjects", */ T:-1 }, /*::[*/0x0281/*::]*/: { /* n:"BrtBeginSxrules", */ T:1 }, /*::[*/0x0282/*::]*/: { /* n:"BrtEndSxRules", */ T:-1 }, /*::[*/0x0283/*::]*/: { /* n:"BrtBeginActiveXControls", */ T:1 }, /*::[*/0x0284/*::]*/: { /* n:"BrtActiveX" */ }, /*::[*/0x0285/*::]*/: { /* n:"BrtEndActiveXControls", */ T:-1 }, /*::[*/0x0286/*::]*/: { /* n:"BrtBeginPCDSDTCEMembersSortBy", */ T:1 }, /*::[*/0x0288/*::]*/: { /* n:"BrtBeginCellIgnoreECs", */ T:1 }, /*::[*/0x0289/*::]*/: { /* n:"BrtCellIgnoreEC" */ }, /*::[*/0x028A/*::]*/: { /* n:"BrtEndCellIgnoreECs", */ T:-1 }, /*::[*/0x028B/*::]*/: { /* n:"BrtCsProp", */ f:parse_BrtCsProp }, /*::[*/0x028C/*::]*/: { /* n:"BrtCsPageSetup" */ }, /*::[*/0x028D/*::]*/: { /* n:"BrtBeginUserCsViews", */ T:1 }, /*::[*/0x028E/*::]*/: { /* n:"BrtEndUserCsViews", */ T:-1 }, /*::[*/0x028F/*::]*/: { /* n:"BrtBeginUserCsView", */ T:1 }, /*::[*/0x0290/*::]*/: { /* n:"BrtEndUserCsView", */ T:-1 }, /*::[*/0x0291/*::]*/: { /* n:"BrtBeginPcdSFCIEntries", */ T:1 }, /*::[*/0x0292/*::]*/: { /* n:"BrtEndPCDSFCIEntries", */ T:-1 }, /*::[*/0x0293/*::]*/: { /* n:"BrtPCDSFCIEntry" */ }, /*::[*/0x0294/*::]*/: { /* n:"BrtBeginListParts", */ T:1 }, /*::[*/0x0295/*::]*/: { /* n:"BrtListPart" */ }, /*::[*/0x0296/*::]*/: { /* n:"BrtEndListParts", */ T:-1 }, /*::[*/0x0297/*::]*/: { /* n:"BrtSheetCalcProp" */ }, /*::[*/0x0298/*::]*/: { /* n:"BrtBeginFnGroup", */ T:1 }, /*::[*/0x0299/*::]*/: { /* n:"BrtFnGroup" */ }, /*::[*/0x029A/*::]*/: { /* n:"BrtEndFnGroup", */ T:-1 }, /*::[*/0x029B/*::]*/: { /* n:"BrtSupAddin" */ }, /*::[*/0x029C/*::]*/: { /* n:"BrtSXTDMPOrder" */ }, /*::[*/0x029D/*::]*/: { /* n:"BrtCsProtection" */ }, /*::[*/0x029F/*::]*/: { /* n:"BrtBeginWsSortMap", */ T:1 }, /*::[*/0x02A0/*::]*/: { /* n:"BrtEndWsSortMap", */ T:-1 }, /*::[*/0x02A1/*::]*/: { /* n:"BrtBeginRRSort", */ T:1 }, /*::[*/0x02A2/*::]*/: { /* n:"BrtEndRRSort", */ T:-1 }, /*::[*/0x02A3/*::]*/: { /* n:"BrtRRSortItem" */ }, /*::[*/0x02A4/*::]*/: { /* n:"BrtFileSharingIso" */ }, /*::[*/0x02A5/*::]*/: { /* n:"BrtBookProtectionIso" */ }, /*::[*/0x02A6/*::]*/: { /* n:"BrtSheetProtectionIso" */ }, /*::[*/0x02A7/*::]*/: { /* n:"BrtCsProtectionIso" */ }, /*::[*/0x02A8/*::]*/: { /* n:"BrtRangeProtectionIso" */ }, /*::[*/0x02A9/*::]*/: { /* n:"BrtDValList" */ }, /*::[*/0x0400/*::]*/: { /* n:"BrtRwDescent" */ }, /*::[*/0x0401/*::]*/: { /* n:"BrtKnownFonts" */ }, /*::[*/0x0402/*::]*/: { /* n:"BrtBeginSXTupleSet", */ T:1 }, /*::[*/0x0403/*::]*/: { /* n:"BrtEndSXTupleSet", */ T:-1 }, /*::[*/0x0404/*::]*/: { /* n:"BrtBeginSXTupleSetHeader", */ T:1 }, /*::[*/0x0405/*::]*/: { /* n:"BrtEndSXTupleSetHeader", */ T:-1 }, /*::[*/0x0406/*::]*/: { /* n:"BrtSXTupleSetHeaderItem" */ }, /*::[*/0x0407/*::]*/: { /* n:"BrtBeginSXTupleSetData", */ T:1 }, /*::[*/0x0408/*::]*/: { /* n:"BrtEndSXTupleSetData", */ T:-1 }, /*::[*/0x0409/*::]*/: { /* n:"BrtBeginSXTupleSetRow", */ T:1 }, /*::[*/0x040A/*::]*/: { /* n:"BrtEndSXTupleSetRow", */ T:-1 }, /*::[*/0x040B/*::]*/: { /* n:"BrtSXTupleSetRowItem" */ }, /*::[*/0x040C/*::]*/: { /* n:"BrtNameExt" */ }, /*::[*/0x040D/*::]*/: { /* n:"BrtPCDH14" */ }, /*::[*/0x040E/*::]*/: { /* n:"BrtBeginPCDCalcMem14", */ T:1 }, /*::[*/0x040F/*::]*/: { /* n:"BrtEndPCDCalcMem14", */ T:-1 }, /*::[*/0x0410/*::]*/: { /* n:"BrtSXTH14" */ }, /*::[*/0x0411/*::]*/: { /* n:"BrtBeginSparklineGroup", */ T:1 }, /*::[*/0x0412/*::]*/: { /* n:"BrtEndSparklineGroup", */ T:-1 }, /*::[*/0x0413/*::]*/: { /* n:"BrtSparkline" */ }, /*::[*/0x0414/*::]*/: { /* n:"BrtSXDI14" */ }, /*::[*/0x0415/*::]*/: { /* n:"BrtWsFmtInfoEx14" */ }, /*::[*/0x0416/*::]*/: { /* n:"BrtBeginConditionalFormatting14", */ T:1 }, /*::[*/0x0417/*::]*/: { /* n:"BrtEndConditionalFormatting14", */ T:-1 }, /*::[*/0x0418/*::]*/: { /* n:"BrtBeginCFRule14", */ T:1 }, /*::[*/0x0419/*::]*/: { /* n:"BrtEndCFRule14", */ T:-1 }, /*::[*/0x041A/*::]*/: { /* n:"BrtCFVO14" */ }, /*::[*/0x041B/*::]*/: { /* n:"BrtBeginDatabar14", */ T:1 }, /*::[*/0x041C/*::]*/: { /* n:"BrtBeginIconSet14", */ T:1 }, /*::[*/0x041D/*::]*/: { /* n:"BrtDVal14", */ f: parse_BrtDVal14 }, /*::[*/0x041E/*::]*/: { /* n:"BrtBeginDVals14", */ T:1 }, /*::[*/0x041F/*::]*/: { /* n:"BrtColor14" */ }, /*::[*/0x0420/*::]*/: { /* n:"BrtBeginSparklines", */ T:1 }, /*::[*/0x0421/*::]*/: { /* n:"BrtEndSparklines", */ T:-1 }, /*::[*/0x0422/*::]*/: { /* n:"BrtBeginSparklineGroups", */ T:1 }, /*::[*/0x0423/*::]*/: { /* n:"BrtEndSparklineGroups", */ T:-1 }, /*::[*/0x0425/*::]*/: { /* n:"BrtSXVD14" */ }, /*::[*/0x0426/*::]*/: { /* n:"BrtBeginSXView14", */ T:1 }, /*::[*/0x0427/*::]*/: { /* n:"BrtEndSXView14", */ T:-1 }, /*::[*/0x0428/*::]*/: { /* n:"BrtBeginSXView16", */ T:1 }, /*::[*/0x0429/*::]*/: { /* n:"BrtEndSXView16", */ T:-1 }, /*::[*/0x042A/*::]*/: { /* n:"BrtBeginPCD14", */ T:1 }, /*::[*/0x042B/*::]*/: { /* n:"BrtEndPCD14", */ T:-1 }, /*::[*/0x042C/*::]*/: { /* n:"BrtBeginExtConn14", */ T:1 }, /*::[*/0x042D/*::]*/: { /* n:"BrtEndExtConn14", */ T:-1 }, /*::[*/0x042E/*::]*/: { /* n:"BrtBeginSlicerCacheIDs", */ T:1 }, /*::[*/0x042F/*::]*/: { /* n:"BrtEndSlicerCacheIDs", */ T:-1 }, /*::[*/0x0430/*::]*/: { /* n:"BrtBeginSlicerCacheID", */ T:1 }, /*::[*/0x0431/*::]*/: { /* n:"BrtEndSlicerCacheID", */ T:-1 }, /*::[*/0x0433/*::]*/: { /* n:"BrtBeginSlicerCache", */ T:1 }, /*::[*/0x0434/*::]*/: { /* n:"BrtEndSlicerCache", */ T:-1 }, /*::[*/0x0435/*::]*/: { /* n:"BrtBeginSlicerCacheDef", */ T:1 }, /*::[*/0x0436/*::]*/: { /* n:"BrtEndSlicerCacheDef", */ T:-1 }, /*::[*/0x0437/*::]*/: { /* n:"BrtBeginSlicersEx", */ T:1 }, /*::[*/0x0438/*::]*/: { /* n:"BrtEndSlicersEx", */ T:-1 }, /*::[*/0x0439/*::]*/: { /* n:"BrtBeginSlicerEx", */ T:1 }, /*::[*/0x043A/*::]*/: { /* n:"BrtEndSlicerEx", */ T:-1 }, /*::[*/0x043B/*::]*/: { /* n:"BrtBeginSlicer", */ T:1 }, /*::[*/0x043C/*::]*/: { /* n:"BrtEndSlicer", */ T:-1 }, /*::[*/0x043D/*::]*/: { /* n:"BrtSlicerCachePivotTables" */ }, /*::[*/0x043E/*::]*/: { /* n:"BrtBeginSlicerCacheOlapImpl", */ T:1 }, /*::[*/0x043F/*::]*/: { /* n:"BrtEndSlicerCacheOlapImpl", */ T:-1 }, /*::[*/0x0440/*::]*/: { /* n:"BrtBeginSlicerCacheLevelsData", */ T:1 }, /*::[*/0x0441/*::]*/: { /* n:"BrtEndSlicerCacheLevelsData", */ T:-1 }, /*::[*/0x0442/*::]*/: { /* n:"BrtBeginSlicerCacheLevelData", */ T:1 }, /*::[*/0x0443/*::]*/: { /* n:"BrtEndSlicerCacheLevelData", */ T:-1 }, /*::[*/0x0444/*::]*/: { /* n:"BrtBeginSlicerCacheSiRanges", */ T:1 }, /*::[*/0x0445/*::]*/: { /* n:"BrtEndSlicerCacheSiRanges", */ T:-1 }, /*::[*/0x0446/*::]*/: { /* n:"BrtBeginSlicerCacheSiRange", */ T:1 }, /*::[*/0x0447/*::]*/: { /* n:"BrtEndSlicerCacheSiRange", */ T:-1 }, /*::[*/0x0448/*::]*/: { /* n:"BrtSlicerCacheOlapItem" */ }, /*::[*/0x0449/*::]*/: { /* n:"BrtBeginSlicerCacheSelections", */ T:1 }, /*::[*/0x044A/*::]*/: { /* n:"BrtSlicerCacheSelection" */ }, /*::[*/0x044B/*::]*/: { /* n:"BrtEndSlicerCacheSelections", */ T:-1 }, /*::[*/0x044C/*::]*/: { /* n:"BrtBeginSlicerCacheNative", */ T:1 }, /*::[*/0x044D/*::]*/: { /* n:"BrtEndSlicerCacheNative", */ T:-1 }, /*::[*/0x044E/*::]*/: { /* n:"BrtSlicerCacheNativeItem" */ }, /*::[*/0x044F/*::]*/: { /* n:"BrtRangeProtection14" */ }, /*::[*/0x0450/*::]*/: { /* n:"BrtRangeProtectionIso14" */ }, /*::[*/0x0451/*::]*/: { /* n:"BrtCellIgnoreEC14" */ }, /*::[*/0x0457/*::]*/: { /* n:"BrtList14" */ }, /*::[*/0x0458/*::]*/: { /* n:"BrtCFIcon" */ }, /*::[*/0x0459/*::]*/: { /* n:"BrtBeginSlicerCachesPivotCacheIDs", */ T:1 }, /*::[*/0x045A/*::]*/: { /* n:"BrtEndSlicerCachesPivotCacheIDs", */ T:-1 }, /*::[*/0x045B/*::]*/: { /* n:"BrtBeginSlicers", */ T:1 }, /*::[*/0x045C/*::]*/: { /* n:"BrtEndSlicers", */ T:-1 }, /*::[*/0x045D/*::]*/: { /* n:"BrtWbProp14" */ }, /*::[*/0x045E/*::]*/: { /* n:"BrtBeginSXEdit", */ T:1 }, /*::[*/0x045F/*::]*/: { /* n:"BrtEndSXEdit", */ T:-1 }, /*::[*/0x0460/*::]*/: { /* n:"BrtBeginSXEdits", */ T:1 }, /*::[*/0x0461/*::]*/: { /* n:"BrtEndSXEdits", */ T:-1 }, /*::[*/0x0462/*::]*/: { /* n:"BrtBeginSXChange", */ T:1 }, /*::[*/0x0463/*::]*/: { /* n:"BrtEndSXChange", */ T:-1 }, /*::[*/0x0464/*::]*/: { /* n:"BrtBeginSXChanges", */ T:1 }, /*::[*/0x0465/*::]*/: { /* n:"BrtEndSXChanges", */ T:-1 }, /*::[*/0x0466/*::]*/: { /* n:"BrtSXTupleItems" */ }, /*::[*/0x0468/*::]*/: { /* n:"BrtBeginSlicerStyle", */ T:1 }, /*::[*/0x0469/*::]*/: { /* n:"BrtEndSlicerStyle", */ T:-1 }, /*::[*/0x046A/*::]*/: { /* n:"BrtSlicerStyleElement" */ }, /*::[*/0x046B/*::]*/: { /* n:"BrtBeginStyleSheetExt14", */ T:1 }, /*::[*/0x046C/*::]*/: { /* n:"BrtEndStyleSheetExt14", */ T:-1 }, /*::[*/0x046D/*::]*/: { /* n:"BrtBeginSlicerCachesPivotCacheID", */ T:1 }, /*::[*/0x046E/*::]*/: { /* n:"BrtEndSlicerCachesPivotCacheID", */ T:-1 }, /*::[*/0x046F/*::]*/: { /* n:"BrtBeginConditionalFormattings", */ T:1 }, /*::[*/0x0470/*::]*/: { /* n:"BrtEndConditionalFormattings", */ T:-1 }, /*::[*/0x0471/*::]*/: { /* n:"BrtBeginPCDCalcMemExt", */ T:1 }, /*::[*/0x0472/*::]*/: { /* n:"BrtEndPCDCalcMemExt", */ T:-1 }, /*::[*/0x0473/*::]*/: { /* n:"BrtBeginPCDCalcMemsExt", */ T:1 }, /*::[*/0x0474/*::]*/: { /* n:"BrtEndPCDCalcMemsExt", */ T:-1 }, /*::[*/0x0475/*::]*/: { /* n:"BrtPCDField14" */ }, /*::[*/0x0476/*::]*/: { /* n:"BrtBeginSlicerStyles", */ T:1 }, /*::[*/0x0477/*::]*/: { /* n:"BrtEndSlicerStyles", */ T:-1 }, /*::[*/0x0478/*::]*/: { /* n:"BrtBeginSlicerStyleElements", */ T:1 }, /*::[*/0x0479/*::]*/: { /* n:"BrtEndSlicerStyleElements", */ T:-1 }, /*::[*/0x047A/*::]*/: { /* n:"BrtCFRuleExt" */ }, /*::[*/0x047B/*::]*/: { /* n:"BrtBeginSXCondFmt14", */ T:1 }, /*::[*/0x047C/*::]*/: { /* n:"BrtEndSXCondFmt14", */ T:-1 }, /*::[*/0x047D/*::]*/: { /* n:"BrtBeginSXCondFmts14", */ T:1 }, /*::[*/0x047E/*::]*/: { /* n:"BrtEndSXCondFmts14", */ T:-1 }, /*::[*/0x0480/*::]*/: { /* n:"BrtBeginSortCond14", */ T:1 }, /*::[*/0x0481/*::]*/: { /* n:"BrtEndSortCond14", */ T:-1 }, /*::[*/0x0482/*::]*/: { /* n:"BrtEndDVals14", */ T:-1 }, /*::[*/0x0483/*::]*/: { /* n:"BrtEndIconSet14", */ T:-1 }, /*::[*/0x0484/*::]*/: { /* n:"BrtEndDatabar14", */ T:-1 }, /*::[*/0x0485/*::]*/: { /* n:"BrtBeginColorScale14", */ T:1 }, /*::[*/0x0486/*::]*/: { /* n:"BrtEndColorScale14", */ T:-1 }, /*::[*/0x0487/*::]*/: { /* n:"BrtBeginSxrules14", */ T:1 }, /*::[*/0x0488/*::]*/: { /* n:"BrtEndSxrules14", */ T:-1 }, /*::[*/0x0489/*::]*/: { /* n:"BrtBeginPRule14", */ T:1 }, /*::[*/0x048A/*::]*/: { /* n:"BrtEndPRule14", */ T:-1 }, /*::[*/0x048B/*::]*/: { /* n:"BrtBeginPRFilters14", */ T:1 }, /*::[*/0x048C/*::]*/: { /* n:"BrtEndPRFilters14", */ T:-1 }, /*::[*/0x048D/*::]*/: { /* n:"BrtBeginPRFilter14", */ T:1 }, /*::[*/0x048E/*::]*/: { /* n:"BrtEndPRFilter14", */ T:-1 }, /*::[*/0x048F/*::]*/: { /* n:"BrtBeginPRFItem14", */ T:1 }, /*::[*/0x0490/*::]*/: { /* n:"BrtEndPRFItem14", */ T:-1 }, /*::[*/0x0491/*::]*/: { /* n:"BrtBeginCellIgnoreECs14", */ T:1 }, /*::[*/0x0492/*::]*/: { /* n:"BrtEndCellIgnoreECs14", */ T:-1 }, /*::[*/0x0493/*::]*/: { /* n:"BrtDxf14" */ }, /*::[*/0x0494/*::]*/: { /* n:"BrtBeginDxF14s", */ T:1 }, /*::[*/0x0495/*::]*/: { /* n:"BrtEndDxf14s", */ T:-1 }, /*::[*/0x0499/*::]*/: { /* n:"BrtFilter14" */ }, /*::[*/0x049A/*::]*/: { /* n:"BrtBeginCustomFilters14", */ T:1 }, /*::[*/0x049C/*::]*/: { /* n:"BrtCustomFilter14" */ }, /*::[*/0x049D/*::]*/: { /* n:"BrtIconFilter14" */ }, /*::[*/0x049E/*::]*/: { /* n:"BrtPivotCacheConnectionName" */ }, /*::[*/0x0800/*::]*/: { /* n:"BrtBeginDecoupledPivotCacheIDs", */ T:1 }, /*::[*/0x0801/*::]*/: { /* n:"BrtEndDecoupledPivotCacheIDs", */ T:-1 }, /*::[*/0x0802/*::]*/: { /* n:"BrtDecoupledPivotCacheID" */ }, /*::[*/0x0803/*::]*/: { /* n:"BrtBeginPivotTableRefs", */ T:1 }, /*::[*/0x0804/*::]*/: { /* n:"BrtEndPivotTableRefs", */ T:-1 }, /*::[*/0x0805/*::]*/: { /* n:"BrtPivotTableRef" */ }, /*::[*/0x0806/*::]*/: { /* n:"BrtSlicerCacheBookPivotTables" */ }, /*::[*/0x0807/*::]*/: { /* n:"BrtBeginSxvcells", */ T:1 }, /*::[*/0x0808/*::]*/: { /* n:"BrtEndSxvcells", */ T:-1 }, /*::[*/0x0809/*::]*/: { /* n:"BrtBeginSxRow", */ T:1 }, /*::[*/0x080A/*::]*/: { /* n:"BrtEndSxRow", */ T:-1 }, /*::[*/0x080C/*::]*/: { /* n:"BrtPcdCalcMem15" */ }, /*::[*/0x0813/*::]*/: { /* n:"BrtQsi15" */ }, /*::[*/0x0814/*::]*/: { /* n:"BrtBeginWebExtensions", */ T:1 }, /*::[*/0x0815/*::]*/: { /* n:"BrtEndWebExtensions", */ T:-1 }, /*::[*/0x0816/*::]*/: { /* n:"BrtWebExtension" */ }, /*::[*/0x0817/*::]*/: { /* n:"BrtAbsPath15" */ }, /*::[*/0x0818/*::]*/: { /* n:"BrtBeginPivotTableUISettings", */ T:1 }, /*::[*/0x0819/*::]*/: { /* n:"BrtEndPivotTableUISettings", */ T:-1 }, /*::[*/0x081B/*::]*/: { /* n:"BrtTableSlicerCacheIDs" */ }, /*::[*/0x081C/*::]*/: { /* n:"BrtTableSlicerCacheID" */ }, /*::[*/0x081D/*::]*/: { /* n:"BrtBeginTableSlicerCache", */ T:1 }, /*::[*/0x081E/*::]*/: { /* n:"BrtEndTableSlicerCache", */ T:-1 }, /*::[*/0x081F/*::]*/: { /* n:"BrtSxFilter15" */ }, /*::[*/0x0820/*::]*/: { /* n:"BrtBeginTimelineCachePivotCacheIDs", */ T:1 }, /*::[*/0x0821/*::]*/: { /* n:"BrtEndTimelineCachePivotCacheIDs", */ T:-1 }, /*::[*/0x0822/*::]*/: { /* n:"BrtTimelineCachePivotCacheID" */ }, /*::[*/0x0823/*::]*/: { /* n:"BrtBeginTimelineCacheIDs", */ T:1 }, /*::[*/0x0824/*::]*/: { /* n:"BrtEndTimelineCacheIDs", */ T:-1 }, /*::[*/0x0825/*::]*/: { /* n:"BrtBeginTimelineCacheID", */ T:1 }, /*::[*/0x0826/*::]*/: { /* n:"BrtEndTimelineCacheID", */ T:-1 }, /*::[*/0x0827/*::]*/: { /* n:"BrtBeginTimelinesEx", */ T:1 }, /*::[*/0x0828/*::]*/: { /* n:"BrtEndTimelinesEx", */ T:-1 }, /*::[*/0x0829/*::]*/: { /* n:"BrtBeginTimelineEx", */ T:1 }, /*::[*/0x082A/*::]*/: { /* n:"BrtEndTimelineEx", */ T:-1 }, /*::[*/0x082B/*::]*/: { /* n:"BrtWorkBookPr15" */ }, /*::[*/0x082C/*::]*/: { /* n:"BrtPCDH15" */ }, /*::[*/0x082D/*::]*/: { /* n:"BrtBeginTimelineStyle", */ T:1 }, /*::[*/0x082E/*::]*/: { /* n:"BrtEndTimelineStyle", */ T:-1 }, /*::[*/0x082F/*::]*/: { /* n:"BrtTimelineStyleElement" */ }, /*::[*/0x0830/*::]*/: { /* n:"BrtBeginTimelineStylesheetExt15", */ T:1 }, /*::[*/0x0831/*::]*/: { /* n:"BrtEndTimelineStylesheetExt15", */ T:-1 }, /*::[*/0x0832/*::]*/: { /* n:"BrtBeginTimelineStyles", */ T:1 }, /*::[*/0x0833/*::]*/: { /* n:"BrtEndTimelineStyles", */ T:-1 }, /*::[*/0x0834/*::]*/: { /* n:"BrtBeginTimelineStyleElements", */ T:1 }, /*::[*/0x0835/*::]*/: { /* n:"BrtEndTimelineStyleElements", */ T:-1 }, /*::[*/0x0836/*::]*/: { /* n:"BrtDxf15" */ }, /*::[*/0x0837/*::]*/: { /* n:"BrtBeginDxfs15", */ T:1 }, /*::[*/0x0838/*::]*/: { /* n:"BrtEndDxfs15", */ T:-1 }, /*::[*/0x0839/*::]*/: { /* n:"BrtSlicerCacheHideItemsWithNoData" */ }, /*::[*/0x083A/*::]*/: { /* n:"BrtBeginItemUniqueNames", */ T:1 }, /*::[*/0x083B/*::]*/: { /* n:"BrtEndItemUniqueNames", */ T:-1 }, /*::[*/0x083C/*::]*/: { /* n:"BrtItemUniqueName" */ }, /*::[*/0x083D/*::]*/: { /* n:"BrtBeginExtConn15", */ T:1 }, /*::[*/0x083E/*::]*/: { /* n:"BrtEndExtConn15", */ T:-1 }, /*::[*/0x083F/*::]*/: { /* n:"BrtBeginOledbPr15", */ T:1 }, /*::[*/0x0840/*::]*/: { /* n:"BrtEndOledbPr15", */ T:-1 }, /*::[*/0x0841/*::]*/: { /* n:"BrtBeginDataFeedPr15", */ T:1 }, /*::[*/0x0842/*::]*/: { /* n:"BrtEndDataFeedPr15", */ T:-1 }, /*::[*/0x0843/*::]*/: { /* n:"BrtTextPr15" */ }, /*::[*/0x0844/*::]*/: { /* n:"BrtRangePr15" */ }, /*::[*/0x0845/*::]*/: { /* n:"BrtDbCommand15" */ }, /*::[*/0x0846/*::]*/: { /* n:"BrtBeginDbTables15", */ T:1 }, /*::[*/0x0847/*::]*/: { /* n:"BrtEndDbTables15", */ T:-1 }, /*::[*/0x0848/*::]*/: { /* n:"BrtDbTable15" */ }, /*::[*/0x0849/*::]*/: { /* n:"BrtBeginDataModel", */ T:1 }, /*::[*/0x084A/*::]*/: { /* n:"BrtEndDataModel", */ T:-1 }, /*::[*/0x084B/*::]*/: { /* n:"BrtBeginModelTables", */ T:1 }, /*::[*/0x084C/*::]*/: { /* n:"BrtEndModelTables", */ T:-1 }, /*::[*/0x084D/*::]*/: { /* n:"BrtModelTable" */ }, /*::[*/0x084E/*::]*/: { /* n:"BrtBeginModelRelationships", */ T:1 }, /*::[*/0x084F/*::]*/: { /* n:"BrtEndModelRelationships", */ T:-1 }, /*::[*/0x0850/*::]*/: { /* n:"BrtModelRelationship" */ }, /*::[*/0x0851/*::]*/: { /* n:"BrtBeginECTxtWiz15", */ T:1 }, /*::[*/0x0852/*::]*/: { /* n:"BrtEndECTxtWiz15", */ T:-1 }, /*::[*/0x0853/*::]*/: { /* n:"BrtBeginECTWFldInfoLst15", */ T:1 }, /*::[*/0x0854/*::]*/: { /* n:"BrtEndECTWFldInfoLst15", */ T:-1 }, /*::[*/0x0855/*::]*/: { /* n:"BrtBeginECTWFldInfo15", */ T:1 }, /*::[*/0x0856/*::]*/: { /* n:"BrtFieldListActiveItem" */ }, /*::[*/0x0857/*::]*/: { /* n:"BrtPivotCacheIdVersion" */ }, /*::[*/0x0858/*::]*/: { /* n:"BrtSXDI15" */ }, /*::[*/0x0859/*::]*/: { /* n:"BrtBeginModelTimeGroupings", */ T:1 }, /*::[*/0x085A/*::]*/: { /* n:"BrtEndModelTimeGroupings", */ T:-1 }, /*::[*/0x085B/*::]*/: { /* n:"BrtBeginModelTimeGrouping", */ T:1 }, /*::[*/0x085C/*::]*/: { /* n:"BrtEndModelTimeGrouping", */ T:-1 }, /*::[*/0x085D/*::]*/: { /* n:"BrtModelTimeGroupingCalcCol" */ }, /*::[*/0x0C00/*::]*/: { /* n:"BrtUid" */ }, /*::[*/0x0C01/*::]*/: { /* n:"BrtRevisionPtr" */ }, /*::[*/0x1000/*::]*/: { /* n:"BrtBeginDynamicArrayPr", */ T:1 }, /*::[*/0x1001/*::]*/: { /* n:"BrtEndDynamicArrayPr", */ T:-1 }, /*::[*/0x138A/*::]*/: { /* n:"BrtBeginRichValueBlock", */ T:1 }, /*::[*/0x138B/*::]*/: { /* n:"BrtEndRichValueBlock", */ T:-1 }, /*::[*/0x13D9/*::]*/: { /* n:"BrtBeginRichFilters", */ T:1 }, /*::[*/0x13DA/*::]*/: { /* n:"BrtEndRichFilters", */ T:-1 }, /*::[*/0x13DB/*::]*/: { /* n:"BrtRichFilter" */ }, /*::[*/0x13DC/*::]*/: { /* n:"BrtBeginRichFilterColumn", */ T:1 }, /*::[*/0x13DD/*::]*/: { /* n:"BrtEndRichFilterColumn", */ T:-1 }, /*::[*/0x13DE/*::]*/: { /* n:"BrtBeginCustomRichFilters", */ T:1 }, /*::[*/0x13DF/*::]*/: { /* n:"BrtEndCustomRichFilters", */ T:-1 }, /*::[*/0x13E0/*::]*/: { /* n:"BrtCustomRichFilter" */ }, /*::[*/0x13E1/*::]*/: { /* n:"BrtTop10RichFilter" */ }, /*::[*/0x13E2/*::]*/: { /* n:"BrtDynamicRichFilter" */ }, /*::[*/0x13E4/*::]*/: { /* n:"BrtBeginRichSortCondition", */ T:1 }, /*::[*/0x13E5/*::]*/: { /* n:"BrtEndRichSortCondition", */ T:-1 }, /*::[*/0x13E6/*::]*/: { /* n:"BrtRichFilterDateGroupItem" */ }, /*::[*/0x13E7/*::]*/: { /* n:"BrtBeginCalcFeatures", */ T:1 }, /*::[*/0x13E8/*::]*/: { /* n:"BrtEndCalcFeatures", */ T:-1 }, /*::[*/0x13E9/*::]*/: { /* n:"BrtCalcFeature" */ }, /*::[*/0x13EB/*::]*/: { /* n:"BrtExternalLinksPr" */ }, /*::[*/0xFFFF/*::]*/: { n:"" } }; /* [MS-XLS] 2.3 Record Enumeration (and other sources) */ var XLSRecordEnum = { /* [MS-XLS] 2.3 Record Enumeration 2021-08-17 */ /*::[*/0x0006/*::]*/: { /* n:"Formula", */ f:parse_Formula }, /*::[*/0x000a/*::]*/: { /* n:"EOF", */ f:parsenoop2 }, /*::[*/0x000c/*::]*/: { /* n:"CalcCount", */ f:parseuint16 }, // /*::[*/0x000d/*::]*/: { /* n:"CalcMode", */ f:parseuint16 }, // /*::[*/0x000e/*::]*/: { /* n:"CalcPrecision", */ f:parsebool }, // /*::[*/0x000f/*::]*/: { /* n:"CalcRefMode", */ f:parsebool }, // /*::[*/0x0010/*::]*/: { /* n:"CalcDelta", */ f:parse_Xnum }, // /*::[*/0x0011/*::]*/: { /* n:"CalcIter", */ f:parsebool }, // /*::[*/0x0012/*::]*/: { /* n:"Protect", */ f:parsebool }, /*::[*/0x0013/*::]*/: { /* n:"Password", */ f:parseuint16 }, /*::[*/0x0014/*::]*/: { /* n:"Header", */ f:parse_XLHeaderFooter }, /*::[*/0x0015/*::]*/: { /* n:"Footer", */ f:parse_XLHeaderFooter }, /*::[*/0x0017/*::]*/: { /* n:"ExternSheet", */ f:parse_ExternSheet }, /*::[*/0x0018/*::]*/: { /* n:"Lbl", */ f:parse_Lbl }, /*::[*/0x0019/*::]*/: { /* n:"WinProtect", */ f:parsebool }, /*::[*/0x001a/*::]*/: { /* n:"VerticalPageBreaks", */ }, /*::[*/0x001b/*::]*/: { /* n:"HorizontalPageBreaks", */ }, /*::[*/0x001c/*::]*/: { /* n:"Note", */ f:parse_Note }, /*::[*/0x001d/*::]*/: { /* n:"Selection", */ }, /*::[*/0x0022/*::]*/: { /* n:"Date1904", */ f:parsebool }, /*::[*/0x0023/*::]*/: { /* n:"ExternName", */ f:parse_ExternName }, /*::[*/0x0026/*::]*/: { /* n:"LeftMargin", */ f:parse_Xnum }, // * /*::[*/0x0027/*::]*/: { /* n:"RightMargin", */ f:parse_Xnum }, // * /*::[*/0x0028/*::]*/: { /* n:"TopMargin", */ f:parse_Xnum }, // * /*::[*/0x0029/*::]*/: { /* n:"BottomMargin", */ f:parse_Xnum }, // * /*::[*/0x002a/*::]*/: { /* n:"PrintRowCol", */ f:parsebool }, /*::[*/0x002b/*::]*/: { /* n:"PrintGrid", */ f:parsebool }, /*::[*/0x002f/*::]*/: { /* n:"FilePass", */ f:parse_FilePass }, /*::[*/0x0031/*::]*/: { /* n:"Font", */ f:parse_Font }, /*::[*/0x0033/*::]*/: { /* n:"PrintSize", */ f:parseuint16 }, /*::[*/0x003c/*::]*/: { /* n:"Continue", */ }, /*::[*/0x003d/*::]*/: { /* n:"Window1", */ f:parse_Window1 }, /*::[*/0x0040/*::]*/: { /* n:"Backup", */ f:parsebool }, /*::[*/0x0041/*::]*/: { /* n:"Pane", */ f:parse_Pane }, /*::[*/0x0042/*::]*/: { /* n:"CodePage", */ f:parseuint16 }, /*::[*/0x004d/*::]*/: { /* n:"Pls", */ }, /*::[*/0x0050/*::]*/: { /* n:"DCon", */ }, /*::[*/0x0051/*::]*/: { /* n:"DConRef", */ }, /*::[*/0x0052/*::]*/: { /* n:"DConName", */ }, /*::[*/0x0055/*::]*/: { /* n:"DefColWidth", */ f:parseuint16 }, /*::[*/0x0059/*::]*/: { /* n:"XCT", */ }, /*::[*/0x005a/*::]*/: { /* n:"CRN", */ }, /*::[*/0x005b/*::]*/: { /* n:"FileSharing", */ }, /*::[*/0x005c/*::]*/: { /* n:"WriteAccess", */ f:parse_WriteAccess }, /*::[*/0x005d/*::]*/: { /* n:"Obj", */ f:parse_Obj }, /*::[*/0x005e/*::]*/: { /* n:"Uncalced", */ }, /*::[*/0x005f/*::]*/: { /* n:"CalcSaveRecalc", */ f:parsebool }, // /*::[*/0x0060/*::]*/: { /* n:"Template", */ }, /*::[*/0x0061/*::]*/: { /* n:"Intl", */ }, /*::[*/0x0063/*::]*/: { /* n:"ObjProtect", */ f:parsebool }, /*::[*/0x007d/*::]*/: { /* n:"ColInfo", */ f:parse_ColInfo }, /*::[*/0x0080/*::]*/: { /* n:"Guts", */ f:parse_Guts }, /*::[*/0x0081/*::]*/: { /* n:"WsBool", */ f:parse_WsBool }, /*::[*/0x0082/*::]*/: { /* n:"GridSet", */ f:parseuint16 }, /*::[*/0x0083/*::]*/: { /* n:"HCenter", */ f:parsebool }, /*::[*/0x0084/*::]*/: { /* n:"VCenter", */ f:parsebool }, /*::[*/0x0085/*::]*/: { /* n:"BoundSheet8", */ f:parse_BoundSheet8 }, /*::[*/0x0086/*::]*/: { /* n:"WriteProtect", */ }, /*::[*/0x008c/*::]*/: { /* n:"Country", */ f:parse_Country }, /*::[*/0x008d/*::]*/: { /* n:"HideObj", */ f:parseuint16 }, /*::[*/0x0090/*::]*/: { /* n:"Sort", */ }, /*::[*/0x0092/*::]*/: { /* n:"Palette", */ f:parse_Palette }, /*::[*/0x0097/*::]*/: { /* n:"Sync", */ }, /*::[*/0x0098/*::]*/: { /* n:"LPr", */ }, /*::[*/0x0099/*::]*/: { /* n:"DxGCol", */ }, /*::[*/0x009a/*::]*/: { /* n:"FnGroupName", */ }, /*::[*/0x009b/*::]*/: { /* n:"FilterMode", */ }, /*::[*/0x009c/*::]*/: { /* n:"BuiltInFnGroupCount", */ f:parseuint16 }, /*::[*/0x009d/*::]*/: { /* n:"AutoFilterInfo", */ }, /*::[*/0x009e/*::]*/: { /* n:"AutoFilter", */ }, /*::[*/0x00a0/*::]*/: { /* n:"Scl", */ f:parse_Scl }, /*::[*/0x00a1/*::]*/: { /* n:"Setup", */ f:parse_Setup }, /*::[*/0x00ae/*::]*/: { /* n:"ScenMan", */ }, /*::[*/0x00af/*::]*/: { /* n:"SCENARIO", */ }, /*::[*/0x00b0/*::]*/: { /* n:"SxView", */ }, /*::[*/0x00b1/*::]*/: { /* n:"Sxvd", */ }, /*::[*/0x00b2/*::]*/: { /* n:"SXVI", */ }, /*::[*/0x00b4/*::]*/: { /* n:"SxIvd", */ }, /*::[*/0x00b5/*::]*/: { /* n:"SXLI", */ }, /*::[*/0x00b6/*::]*/: { /* n:"SXPI", */ }, /*::[*/0x00b8/*::]*/: { /* n:"DocRoute", */ }, /*::[*/0x00b9/*::]*/: { /* n:"RecipName", */ }, /*::[*/0x00bd/*::]*/: { /* n:"MulRk", */ f:parse_MulRk }, /*::[*/0x00be/*::]*/: { /* n:"MulBlank", */ f:parse_MulBlank }, /*::[*/0x00c1/*::]*/: { /* n:"Mms", */ f:parsenoop2 }, /*::[*/0x00c5/*::]*/: { /* n:"SXDI", */ }, /*::[*/0x00c6/*::]*/: { /* n:"SXDB", */ }, /*::[*/0x00c7/*::]*/: { /* n:"SXFDB", */ }, /*::[*/0x00c8/*::]*/: { /* n:"SXDBB", */ }, /*::[*/0x00c9/*::]*/: { /* n:"SXNum", */ }, /*::[*/0x00ca/*::]*/: { /* n:"SxBool", */ f:parsebool }, /*::[*/0x00cb/*::]*/: { /* n:"SxErr", */ }, /*::[*/0x00cc/*::]*/: { /* n:"SXInt", */ }, /*::[*/0x00cd/*::]*/: { /* n:"SXString", */ }, /*::[*/0x00ce/*::]*/: { /* n:"SXDtr", */ }, /*::[*/0x00cf/*::]*/: { /* n:"SxNil", */ }, /*::[*/0x00d0/*::]*/: { /* n:"SXTbl", */ }, /*::[*/0x00d1/*::]*/: { /* n:"SXTBRGIITM", */ }, /*::[*/0x00d2/*::]*/: { /* n:"SxTbpg", */ }, /*::[*/0x00d3/*::]*/: { /* n:"ObProj", */ }, /*::[*/0x00d5/*::]*/: { /* n:"SXStreamID", */ }, /*::[*/0x00d7/*::]*/: { /* n:"DBCell", */ }, /*::[*/0x00d8/*::]*/: { /* n:"SXRng", */ }, /*::[*/0x00d9/*::]*/: { /* n:"SxIsxoper", */ }, /*::[*/0x00da/*::]*/: { /* n:"BookBool", */ f:parseuint16 }, /*::[*/0x00dc/*::]*/: { /* n:"DbOrParamQry", */ }, /*::[*/0x00dd/*::]*/: { /* n:"ScenarioProtect", */ f:parsebool }, /*::[*/0x00de/*::]*/: { /* n:"OleObjectSize", */ }, /*::[*/0x00e0/*::]*/: { /* n:"XF", */ f:parse_XF }, /*::[*/0x00e1/*::]*/: { /* n:"InterfaceHdr", */ f:parse_InterfaceHdr }, /*::[*/0x00e2/*::]*/: { /* n:"InterfaceEnd", */ f:parsenoop2 }, /*::[*/0x00e3/*::]*/: { /* n:"SXVS", */ }, /*::[*/0x00e5/*::]*/: { /* n:"MergeCells", */ f:parse_MergeCells }, /*::[*/0x00e9/*::]*/: { /* n:"BkHim", */ }, /*::[*/0x00eb/*::]*/: { /* n:"MsoDrawingGroup", */ }, /*::[*/0x00ec/*::]*/: { /* n:"MsoDrawing", */ }, /*::[*/0x00ed/*::]*/: { /* n:"MsoDrawingSelection", */ }, /*::[*/0x00ef/*::]*/: { /* n:"PhoneticInfo", */ }, /*::[*/0x00f0/*::]*/: { /* n:"SxRule", */ }, /*::[*/0x00f1/*::]*/: { /* n:"SXEx", */ }, /*::[*/0x00f2/*::]*/: { /* n:"SxFilt", */ }, /*::[*/0x00f4/*::]*/: { /* n:"SxDXF", */ }, /*::[*/0x00f5/*::]*/: { /* n:"SxItm", */ }, /*::[*/0x00f6/*::]*/: { /* n:"SxName", */ }, /*::[*/0x00f7/*::]*/: { /* n:"SxSelect", */ }, /*::[*/0x00f8/*::]*/: { /* n:"SXPair", */ }, /*::[*/0x00f9/*::]*/: { /* n:"SxFmla", */ }, /*::[*/0x00fb/*::]*/: { /* n:"SxFormat", */ }, /*::[*/0x00fc/*::]*/: { /* n:"SST", */ f:parse_SST }, /*::[*/0x00fd/*::]*/: { /* n:"LabelSst", */ f:parse_LabelSst }, /*::[*/0x00ff/*::]*/: { /* n:"ExtSST", */ f:parse_ExtSST }, /*::[*/0x0100/*::]*/: { /* n:"SXVDEx", */ }, /*::[*/0x0103/*::]*/: { /* n:"SXFormula", */ }, /*::[*/0x0122/*::]*/: { /* n:"SXDBEx", */ }, /*::[*/0x0137/*::]*/: { /* n:"RRDInsDel", */ }, /*::[*/0x0138/*::]*/: { /* n:"RRDHead", */ }, /*::[*/0x013b/*::]*/: { /* n:"RRDChgCell", */ }, /*::[*/0x013d/*::]*/: { /* n:"RRTabId", */ f:parseuint16a }, /*::[*/0x013e/*::]*/: { /* n:"RRDRenSheet", */ }, /*::[*/0x013f/*::]*/: { /* n:"RRSort", */ }, /*::[*/0x0140/*::]*/: { /* n:"RRDMove", */ }, /*::[*/0x014a/*::]*/: { /* n:"RRFormat", */ }, /*::[*/0x014b/*::]*/: { /* n:"RRAutoFmt", */ }, /*::[*/0x014d/*::]*/: { /* n:"RRInsertSh", */ }, /*::[*/0x014e/*::]*/: { /* n:"RRDMoveBegin", */ }, /*::[*/0x014f/*::]*/: { /* n:"RRDMoveEnd", */ }, /*::[*/0x0150/*::]*/: { /* n:"RRDInsDelBegin", */ }, /*::[*/0x0151/*::]*/: { /* n:"RRDInsDelEnd", */ }, /*::[*/0x0152/*::]*/: { /* n:"RRDConflict", */ }, /*::[*/0x0153/*::]*/: { /* n:"RRDDefName", */ }, /*::[*/0x0154/*::]*/: { /* n:"RRDRstEtxp", */ }, /*::[*/0x015f/*::]*/: { /* n:"LRng", */ }, /*::[*/0x0160/*::]*/: { /* n:"UsesELFs", */ f:parsebool }, /*::[*/0x0161/*::]*/: { /* n:"DSF", */ f:parsenoop2 }, /*::[*/0x0191/*::]*/: { /* n:"CUsr", */ }, /*::[*/0x0192/*::]*/: { /* n:"CbUsr", */ }, /*::[*/0x0193/*::]*/: { /* n:"UsrInfo", */ }, /*::[*/0x0194/*::]*/: { /* n:"UsrExcl", */ }, /*::[*/0x0195/*::]*/: { /* n:"FileLock", */ }, /*::[*/0x0196/*::]*/: { /* n:"RRDInfo", */ }, /*::[*/0x0197/*::]*/: { /* n:"BCUsrs", */ }, /*::[*/0x0198/*::]*/: { /* n:"UsrChk", */ }, /*::[*/0x01a9/*::]*/: { /* n:"UserBView", */ }, /*::[*/0x01aa/*::]*/: { /* n:"UserSViewBegin", */ }, /*::[*/0x01ab/*::]*/: { /* n:"UserSViewEnd", */ }, /*::[*/0x01ac/*::]*/: { /* n:"RRDUserView", */ }, /*::[*/0x01ad/*::]*/: { /* n:"Qsi", */ }, /*::[*/0x01ae/*::]*/: { /* n:"SupBook", */ f:parse_SupBook }, /*::[*/0x01af/*::]*/: { /* n:"Prot4Rev", */ f:parsebool }, /*::[*/0x01b0/*::]*/: { /* n:"CondFmt", */ }, /*::[*/0x01b1/*::]*/: { /* n:"CF", */ }, /*::[*/0x01b2/*::]*/: { /* n:"DVal", */ }, /*::[*/0x01b5/*::]*/: { /* n:"DConBin", */ }, /*::[*/0x01b6/*::]*/: { /* n:"TxO", */ f:parse_TxO }, /*::[*/0x01b7/*::]*/: { /* n:"RefreshAll", */ f:parsebool }, // /*::[*/0x01b8/*::]*/: { /* n:"HLink", */ f:parse_HLink }, /*::[*/0x01b9/*::]*/: { /* n:"Lel", */ }, /*::[*/0x01ba/*::]*/: { /* n:"CodeName", */ f:parse_XLUnicodeString }, /*::[*/0x01bb/*::]*/: { /* n:"SXFDBType", */ }, /*::[*/0x01bc/*::]*/: { /* n:"Prot4RevPass", */ f:parseuint16 }, /*::[*/0x01bd/*::]*/: { /* n:"ObNoMacros", */ }, /*::[*/0x01be/*::]*/: { /* n:"Dv", */ }, /*::[*/0x01c0/*::]*/: { /* n:"Excel9File", */ f:parsenoop2 }, /*::[*/0x01c1/*::]*/: { /* n:"RecalcId", */ f:parse_RecalcId, r:2}, /*::[*/0x01c2/*::]*/: { /* n:"EntExU2", */ f:parsenoop2 }, /*::[*/0x0200/*::]*/: { /* n:"Dimensions", */ f:parse_Dimensions }, /*::[*/0x0201/*::]*/: { /* n:"Blank", */ f:parse_Blank }, /*::[*/0x0203/*::]*/: { /* n:"Number", */ f:parse_Number }, /*::[*/0x0204/*::]*/: { /* n:"Label", */ f:parse_Label }, /*::[*/0x0205/*::]*/: { /* n:"BoolErr", */ f:parse_BoolErr }, /*::[*/0x0207/*::]*/: { /* n:"String", */ f:parse_String }, /*::[*/0x0208/*::]*/: { /* n:"Row", */ f:parse_Row }, /*::[*/0x020b/*::]*/: { /* n:"Index", */ }, /*::[*/0x0221/*::]*/: { /* n:"Array", */ f:parse_Array }, /*::[*/0x0225/*::]*/: { /* n:"DefaultRowHeight", */ f:parse_DefaultRowHeight }, /*::[*/0x0236/*::]*/: { /* n:"Table", */ }, /*::[*/0x023e/*::]*/: { /* n:"Window2", */ f:parse_Window2 }, /*::[*/0x027e/*::]*/: { /* n:"RK", */ f:parse_RK }, /*::[*/0x0293/*::]*/: { /* n:"Style", */ }, /*::[*/0x0418/*::]*/: { /* n:"BigName", */ }, /*::[*/0x041e/*::]*/: { /* n:"Format", */ f:parse_Format }, /*::[*/0x043c/*::]*/: { /* n:"ContinueBigName", */ }, /*::[*/0x04bc/*::]*/: { /* n:"ShrFmla", */ f:parse_ShrFmla }, /*::[*/0x0800/*::]*/: { /* n:"HLinkTooltip", */ f:parse_HLinkTooltip }, /*::[*/0x0801/*::]*/: { /* n:"WebPub", */ }, /*::[*/0x0802/*::]*/: { /* n:"QsiSXTag", */ }, /*::[*/0x0803/*::]*/: { /* n:"DBQueryExt", */ }, /*::[*/0x0804/*::]*/: { /* n:"ExtString", */ }, /*::[*/0x0805/*::]*/: { /* n:"TxtQry", */ }, /*::[*/0x0806/*::]*/: { /* n:"Qsir", */ }, /*::[*/0x0807/*::]*/: { /* n:"Qsif", */ }, /*::[*/0x0808/*::]*/: { /* n:"RRDTQSIF", */ }, /*::[*/0x0809/*::]*/: { /* n:"BOF", */ f:parse_BOF }, /*::[*/0x080a/*::]*/: { /* n:"OleDbConn", */ }, /*::[*/0x080b/*::]*/: { /* n:"WOpt", */ }, /*::[*/0x080c/*::]*/: { /* n:"SXViewEx", */ }, /*::[*/0x080d/*::]*/: { /* n:"SXTH", */ }, /*::[*/0x080e/*::]*/: { /* n:"SXPIEx", */ }, /*::[*/0x080f/*::]*/: { /* n:"SXVDTEx", */ }, /*::[*/0x0810/*::]*/: { /* n:"SXViewEx9", */ }, /*::[*/0x0812/*::]*/: { /* n:"ContinueFrt", */ }, /*::[*/0x0813/*::]*/: { /* n:"RealTimeData", */ }, /*::[*/0x0850/*::]*/: { /* n:"ChartFrtInfo", */ }, /*::[*/0x0851/*::]*/: { /* n:"FrtWrapper", */ }, /*::[*/0x0852/*::]*/: { /* n:"StartBlock", */ }, /*::[*/0x0853/*::]*/: { /* n:"EndBlock", */ }, /*::[*/0x0854/*::]*/: { /* n:"StartObject", */ }, /*::[*/0x0855/*::]*/: { /* n:"EndObject", */ }, /*::[*/0x0856/*::]*/: { /* n:"CatLab", */ }, /*::[*/0x0857/*::]*/: { /* n:"YMult", */ }, /*::[*/0x0858/*::]*/: { /* n:"SXViewLink", */ }, /*::[*/0x0859/*::]*/: { /* n:"PivotChartBits", */ }, /*::[*/0x085a/*::]*/: { /* n:"FrtFontList", */ }, /*::[*/0x0862/*::]*/: { /* n:"SheetExt", */ }, /*::[*/0x0863/*::]*/: { /* n:"BookExt", */ r:12}, /*::[*/0x0864/*::]*/: { /* n:"SXAddl", */ }, /*::[*/0x0865/*::]*/: { /* n:"CrErr", */ }, /*::[*/0x0866/*::]*/: { /* n:"HFPicture", */ }, /*::[*/0x0867/*::]*/: { /* n:"FeatHdr", */ f:parsenoop2 }, /*::[*/0x0868/*::]*/: { /* n:"Feat", */ }, /*::[*/0x086a/*::]*/: { /* n:"DataLabExt", */ }, /*::[*/0x086b/*::]*/: { /* n:"DataLabExtContents", */ }, /*::[*/0x086c/*::]*/: { /* n:"CellWatch", */ }, /*::[*/0x0871/*::]*/: { /* n:"FeatHdr11", */ }, /*::[*/0x0872/*::]*/: { /* n:"Feature11", */ }, /*::[*/0x0874/*::]*/: { /* n:"DropDownObjIds", */ }, /*::[*/0x0875/*::]*/: { /* n:"ContinueFrt11", */ }, /*::[*/0x0876/*::]*/: { /* n:"DConn", */ }, /*::[*/0x0877/*::]*/: { /* n:"List12", */ }, /*::[*/0x0878/*::]*/: { /* n:"Feature12", */ }, /*::[*/0x0879/*::]*/: { /* n:"CondFmt12", */ }, /*::[*/0x087a/*::]*/: { /* n:"CF12", */ }, /*::[*/0x087b/*::]*/: { /* n:"CFEx", */ }, /*::[*/0x087c/*::]*/: { /* n:"XFCRC", */ f:parse_XFCRC, r:12 }, /*::[*/0x087d/*::]*/: { /* n:"XFExt", */ f:parse_XFExt, r:12 }, /*::[*/0x087e/*::]*/: { /* n:"AutoFilter12", */ }, /*::[*/0x087f/*::]*/: { /* n:"ContinueFrt12", */ }, /*::[*/0x0884/*::]*/: { /* n:"MDTInfo", */ }, /*::[*/0x0885/*::]*/: { /* n:"MDXStr", */ }, /*::[*/0x0886/*::]*/: { /* n:"MDXTuple", */ }, /*::[*/0x0887/*::]*/: { /* n:"MDXSet", */ }, /*::[*/0x0888/*::]*/: { /* n:"MDXProp", */ }, /*::[*/0x0889/*::]*/: { /* n:"MDXKPI", */ }, /*::[*/0x088a/*::]*/: { /* n:"MDB", */ }, /*::[*/0x088b/*::]*/: { /* n:"PLV", */ }, /*::[*/0x088c/*::]*/: { /* n:"Compat12", */ f:parsebool, r:12 }, /*::[*/0x088d/*::]*/: { /* n:"DXF", */ }, /*::[*/0x088e/*::]*/: { /* n:"TableStyles", */ r:12 }, /*::[*/0x088f/*::]*/: { /* n:"TableStyle", */ }, /*::[*/0x0890/*::]*/: { /* n:"TableStyleElement", */ }, /*::[*/0x0892/*::]*/: { /* n:"StyleExt", */ }, /*::[*/0x0893/*::]*/: { /* n:"NamePublish", */ }, /*::[*/0x0894/*::]*/: { /* n:"NameCmt", */ f:parse_NameCmt, r:12 }, /*::[*/0x0895/*::]*/: { /* n:"SortData", */ }, /*::[*/0x0896/*::]*/: { /* n:"Theme", */ f:parse_Theme, r:12 }, /*::[*/0x0897/*::]*/: { /* n:"GUIDTypeLib", */ }, /*::[*/0x0898/*::]*/: { /* n:"FnGrp12", */ }, /*::[*/0x0899/*::]*/: { /* n:"NameFnGrp12", */ }, /*::[*/0x089a/*::]*/: { /* n:"MTRSettings", */ f:parse_MTRSettings, r:12 }, /*::[*/0x089b/*::]*/: { /* n:"CompressPictures", */ f:parsenoop2 }, /*::[*/0x089c/*::]*/: { /* n:"HeaderFooter", */ }, /*::[*/0x089d/*::]*/: { /* n:"CrtLayout12", */ }, /*::[*/0x089e/*::]*/: { /* n:"CrtMlFrt", */ }, /*::[*/0x089f/*::]*/: { /* n:"CrtMlFrtContinue", */ }, /*::[*/0x08a3/*::]*/: { /* n:"ForceFullCalculation", */ f:parse_ForceFullCalculation }, /*::[*/0x08a4/*::]*/: { /* n:"ShapePropsStream", */ }, /*::[*/0x08a5/*::]*/: { /* n:"TextPropsStream", */ }, /*::[*/0x08a6/*::]*/: { /* n:"RichTextStream", */ }, /*::[*/0x08a7/*::]*/: { /* n:"CrtLayout12A", */ }, /*::[*/0x1001/*::]*/: { /* n:"Units", */ }, /*::[*/0x1002/*::]*/: { /* n:"Chart", */ }, /*::[*/0x1003/*::]*/: { /* n:"Series", */ }, /*::[*/0x1006/*::]*/: { /* n:"DataFormat", */ }, /*::[*/0x1007/*::]*/: { /* n:"LineFormat", */ }, /*::[*/0x1009/*::]*/: { /* n:"MarkerFormat", */ }, /*::[*/0x100a/*::]*/: { /* n:"AreaFormat", */ }, /*::[*/0x100b/*::]*/: { /* n:"PieFormat", */ }, /*::[*/0x100c/*::]*/: { /* n:"AttachedLabel", */ }, /*::[*/0x100d/*::]*/: { /* n:"SeriesText", */ }, /*::[*/0x1014/*::]*/: { /* n:"ChartFormat", */ }, /*::[*/0x1015/*::]*/: { /* n:"Legend", */ }, /*::[*/0x1016/*::]*/: { /* n:"SeriesList", */ }, /*::[*/0x1017/*::]*/: { /* n:"Bar", */ }, /*::[*/0x1018/*::]*/: { /* n:"Line", */ }, /*::[*/0x1019/*::]*/: { /* n:"Pie", */ }, /*::[*/0x101a/*::]*/: { /* n:"Area", */ }, /*::[*/0x101b/*::]*/: { /* n:"Scatter", */ }, /*::[*/0x101c/*::]*/: { /* n:"CrtLine", */ }, /*::[*/0x101d/*::]*/: { /* n:"Axis", */ }, /*::[*/0x101e/*::]*/: { /* n:"Tick", */ }, /*::[*/0x101f/*::]*/: { /* n:"ValueRange", */ }, /*::[*/0x1020/*::]*/: { /* n:"CatSerRange", */ }, /*::[*/0x1021/*::]*/: { /* n:"AxisLine", */ }, /*::[*/0x1022/*::]*/: { /* n:"CrtLink", */ }, /*::[*/0x1024/*::]*/: { /* n:"DefaultText", */ }, /*::[*/0x1025/*::]*/: { /* n:"Text", */ }, /*::[*/0x1026/*::]*/: { /* n:"FontX", */ f:parseuint16 }, /*::[*/0x1027/*::]*/: { /* n:"ObjectLink", */ }, /*::[*/0x1032/*::]*/: { /* n:"Frame", */ }, /*::[*/0x1033/*::]*/: { /* n:"Begin", */ }, /*::[*/0x1034/*::]*/: { /* n:"End", */ }, /*::[*/0x1035/*::]*/: { /* n:"PlotArea", */ }, /*::[*/0x103a/*::]*/: { /* n:"Chart3d", */ }, /*::[*/0x103c/*::]*/: { /* n:"PicF", */ }, /*::[*/0x103d/*::]*/: { /* n:"DropBar", */ }, /*::[*/0x103e/*::]*/: { /* n:"Radar", */ }, /*::[*/0x103f/*::]*/: { /* n:"Surf", */ }, /*::[*/0x1040/*::]*/: { /* n:"RadarArea", */ }, /*::[*/0x1041/*::]*/: { /* n:"AxisParent", */ }, /*::[*/0x1043/*::]*/: { /* n:"LegendException", */ }, /*::[*/0x1044/*::]*/: { /* n:"ShtProps", */ f:parse_ShtProps }, /*::[*/0x1045/*::]*/: { /* n:"SerToCrt", */ }, /*::[*/0x1046/*::]*/: { /* n:"AxesUsed", */ }, /*::[*/0x1048/*::]*/: { /* n:"SBaseRef", */ }, /*::[*/0x104a/*::]*/: { /* n:"SerParent", */ }, /*::[*/0x104b/*::]*/: { /* n:"SerAuxTrend", */ }, /*::[*/0x104e/*::]*/: { /* n:"IFmtRecord", */ }, /*::[*/0x104f/*::]*/: { /* n:"Pos", */ }, /*::[*/0x1050/*::]*/: { /* n:"AlRuns", */ }, /*::[*/0x1051/*::]*/: { /* n:"BRAI", */ }, /*::[*/0x105b/*::]*/: { /* n:"SerAuxErrBar", */ }, /*::[*/0x105c/*::]*/: { /* n:"ClrtClient", */ f:parse_ClrtClient }, /*::[*/0x105d/*::]*/: { /* n:"SerFmt", */ }, /*::[*/0x105f/*::]*/: { /* n:"Chart3DBarShape", */ }, /*::[*/0x1060/*::]*/: { /* n:"Fbi", */ }, /*::[*/0x1061/*::]*/: { /* n:"BopPop", */ }, /*::[*/0x1062/*::]*/: { /* n:"AxcExt", */ }, /*::[*/0x1063/*::]*/: { /* n:"Dat", */ }, /*::[*/0x1064/*::]*/: { /* n:"PlotGrowth", */ }, /*::[*/0x1065/*::]*/: { /* n:"SIIndex", */ }, /*::[*/0x1066/*::]*/: { /* n:"GelFrame", */ }, /*::[*/0x1067/*::]*/: { /* n:"BopPopCustom", */ }, /*::[*/0x1068/*::]*/: { /* n:"Fbi2", */ }, /*::[*/0x0000/*::]*/: { /* n:"Dimensions", */ f:parse_Dimensions }, /*::[*/0x0001/*::]*/: { /* n:"BIFF2BLANK", */ }, /*::[*/0x0002/*::]*/: { /* n:"BIFF2INT", */ f:parse_BIFF2INT }, /*::[*/0x0003/*::]*/: { /* n:"BIFF2NUM", */ f:parse_BIFF2NUM }, /*::[*/0x0004/*::]*/: { /* n:"BIFF2STR", */ f:parse_BIFF2STR }, /*::[*/0x0005/*::]*/: { /* n:"BoolErr", */ f:parse_BoolErr }, /*::[*/0x0007/*::]*/: { /* n:"String", */ f:parse_BIFF2STRING }, /*::[*/0x0008/*::]*/: { /* n:"BIFF2ROW", */ }, /*::[*/0x0009/*::]*/: { /* n:"BOF", */ f:parse_BOF }, /*::[*/0x000b/*::]*/: { /* n:"Index", */ }, /*::[*/0x0016/*::]*/: { /* n:"ExternCount", */ f:parseuint16 }, /*::[*/0x001e/*::]*/: { /* n:"BIFF2FORMAT", */ f:parse_BIFF2Format }, /*::[*/0x001f/*::]*/: { /* n:"BIFF2FMTCNT", */ }, /* 16-bit cnt of BIFF2FORMAT records */ /*::[*/0x0020/*::]*/: { /* n:"BIFF2COLINFO", */ }, /*::[*/0x0021/*::]*/: { /* n:"Array", */ f:parse_Array }, /*::[*/0x0024/*::]*/: { /* n:"COLWIDTH", */ }, /*::[*/0x0025/*::]*/: { /* n:"DefaultRowHeight", */ f:parse_DefaultRowHeight }, // 0x2c ?? // 0x2d ?? // 0x2e ?? // 0x30 FONTCOUNT: number of fonts /*::[*/0x0032/*::]*/: { /* n:"BIFF2FONTXTRA", */ f:parse_BIFF2FONTXTRA }, // 0x35: INFOOPTS // 0x36: TABLE (BIFF2 only) // 0x37: TABLE2 (BIFF2 only) // 0x38: WNDESK // 0x39 ?? // 0x3a: BEGINPREF // 0x3b: ENDPREF /*::[*/0x003e/*::]*/: { /* n:"BIFF2WINDOW2", */ }, // 0x3f ?? // 0x46: SHOWSCROLL // 0x47: SHOWFORMULA // 0x48: STATUSBAR // 0x49: SHORTMENUS // 0x4A: // 0x4B: // 0x4C: // 0x4E: // 0x4F: // 0x58: TOOLBAR (BIFF3) /* - - - */ /*::[*/0x0034/*::]*/: { /* n:"DDEObjName", */ }, /*::[*/0x0043/*::]*/: { /* n:"BIFF2XF", */ }, /*::[*/0x0044/*::]*/: { /* n:"BIFF2XFINDEX", */ f:parseuint16 }, /*::[*/0x0045/*::]*/: { /* n:"BIFF2FONTCLR", */ }, /*::[*/0x0056/*::]*/: { /* n:"BIFF4FMTCNT", */ }, /* 16-bit cnt, similar to BIFF2 */ /*::[*/0x007e/*::]*/: { /* n:"RK", */ }, /* Not necessarily same as 0x027e */ /*::[*/0x007f/*::]*/: { /* n:"ImData", */ f:parse_ImData }, /*::[*/0x0087/*::]*/: { /* n:"Addin", */ }, /*::[*/0x0088/*::]*/: { /* n:"Edg", */ }, /*::[*/0x0089/*::]*/: { /* n:"Pub", */ }, // 0x8A // 0x8B LH: alternate menu key flag (BIFF3/4) // 0x8E // 0x8F /*::[*/0x0091/*::]*/: { /* n:"Sub", */ }, // 0x93 STYLE /*::[*/0x0094/*::]*/: { /* n:"LHRecord", */ }, /*::[*/0x0095/*::]*/: { /* n:"LHNGraph", */ }, /*::[*/0x0096/*::]*/: { /* n:"Sound", */ }, // 0xA2 FNPROTO: function prototypes (BIFF4) // 0xA3 // 0xA8 /*::[*/0x00a9/*::]*/: { /* n:"CoordList", */ }, /*::[*/0x00ab/*::]*/: { /* n:"GCW", */ }, /*::[*/0x00bc/*::]*/: { /* n:"ShrFmla", */ }, /* Not necessarily same as 0x04bc */ /*::[*/0x00bf/*::]*/: { /* n:"ToolbarHdr", */ }, /*::[*/0x00c0/*::]*/: { /* n:"ToolbarEnd", */ }, /*::[*/0x00c2/*::]*/: { /* n:"AddMenu", */ }, /*::[*/0x00c3/*::]*/: { /* n:"DelMenu", */ }, /*::[*/0x00d6/*::]*/: { /* n:"RString", */ f:parse_RString }, /*::[*/0x00df/*::]*/: { /* n:"UDDesc", */ }, /*::[*/0x00ea/*::]*/: { /* n:"TabIdConf", */ }, /*::[*/0x0162/*::]*/: { /* n:"XL5Modify", */ }, /*::[*/0x01a5/*::]*/: { /* n:"FileSharing2", */ }, /*::[*/0x0206/*::]*/: { /* n:"Formula", */ f:parse_Formula }, /*::[*/0x0209/*::]*/: { /* n:"BOF", */ f:parse_BOF }, /*::[*/0x0218/*::]*/: { /* n:"Lbl", */ f:parse_Lbl }, /*::[*/0x0223/*::]*/: { /* n:"ExternName", */ f:parse_ExternName }, /*::[*/0x0231/*::]*/: { /* n:"Font", */ }, /*::[*/0x0243/*::]*/: { /* n:"BIFF3XF", */ }, /*::[*/0x0406/*::]*/: { /* n:"Formula", */ f:parse_Formula }, /*::[*/0x0409/*::]*/: { /* n:"BOF", */ f:parse_BOF }, /*::[*/0x0443/*::]*/: { /* n:"BIFF4XF", */ }, /*::[*/0x086d/*::]*/: { /* n:"FeatInfo", */ }, /*::[*/0x0873/*::]*/: { /* n:"FeatInfo11", */ }, /*::[*/0x0881/*::]*/: { /* n:"SXAddl12", */ }, /*::[*/0x08c0/*::]*/: { /* n:"AutoWebPub", */ }, /*::[*/0x08c1/*::]*/: { /* n:"ListObj", */ }, /*::[*/0x08c2/*::]*/: { /* n:"ListField", */ }, /*::[*/0x08c3/*::]*/: { /* n:"ListDV", */ }, /*::[*/0x08c4/*::]*/: { /* n:"ListCondFmt", */ }, /*::[*/0x08c5/*::]*/: { /* n:"ListCF", */ }, /*::[*/0x08c6/*::]*/: { /* n:"FMQry", */ }, /*::[*/0x08c7/*::]*/: { /* n:"FMSQry", */ }, /*::[*/0x08c8/*::]*/: { /* n:"PLV", */ }, /*::[*/0x08c9/*::]*/: { /* n:"LnExt", */ }, /*::[*/0x08ca/*::]*/: { /* n:"MkrExt", */ }, /*::[*/0x08cb/*::]*/: { /* n:"CrtCoopt", */ }, /*::[*/0x08d6/*::]*/: { /* n:"FRTArchId$", */ r:12 }, /*::[*/0x7262/*::]*/: {} }; function write_biff_rec(ba/*:BufArray*/, type/*:number*/, payload, length/*:?number*/)/*:void*/ { var t/*:number*/ = type; if(isNaN(t)) return; var len = length || (payload||[]).length || 0; var o = ba.next(4); o.write_shift(2, t); o.write_shift(2, len); if(/*:: len != null &&*/len > 0 && is_buf(payload)) ba.push(payload); } function write_biff_continue(ba/*:BufArray*/, type/*:number*/, payload, length/*:?number*/)/*:void*/ { var len = length || (payload||[]).length || 0; if(len <= 8224) return write_biff_rec(ba, type, payload, len); var t = type; if(isNaN(t)) return; var parts = payload.parts || [], sidx = 0; var i = 0, w = 0; while(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; } var o = ba.next(4); o.write_shift(2, t); o.write_shift(2, w); ba.push(payload.slice(i, i + w)); i += w; while(i < len) { o = ba.next(4); o.write_shift(2, 0x3c); // TODO: figure out correct continue type w = 0; while(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; } o.write_shift(2, w); ba.push(payload.slice(i, i+w)); i+= w; } } function write_BIFF2Cell(out, r/*:number*/, c/*:number*/) { if(!out) out = new_buf(7); out.write_shift(2, r); out.write_shift(2, c); out.write_shift(2, 0); out.write_shift(1, 0); return out; } function write_BIFF2BERR(r/*:number*/, c/*:number*/, val, t/*:?string*/) { var out = new_buf(9); write_BIFF2Cell(out, r, c); write_Bes(val, t || 'b', out); return out; } /* TODO: codepage, large strings */ function write_BIFF2LABEL(r/*:number*/, c/*:number*/, val) { var out = new_buf(8 + 2*val.length); write_BIFF2Cell(out, r, c); out.write_shift(1, val.length); out.write_shift(val.length, val, 'sbcs'); return out.l < out.length ? out.slice(0, out.l) : out; } function write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*//*::, opts*/) { if(cell.v != null) switch(cell.t) { case 'd': case 'n': var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v; if((v == (v|0)) && (v >= 0) && (v < 65536)) write_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v)); else write_biff_rec(ba, 0x0003, write_BIFF2NUM(R,C, v)); return; case 'b': case 'e': write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, cell.v, cell.t)); return; /* TODO: codepage, sst */ case 's': case 'str': write_biff_rec(ba, 0x0004, write_BIFF2LABEL(R, C, (cell.v||"").slice(0,255))); return; } write_biff_rec(ba, 0x0001, write_BIFF2Cell(null, R, C)); } function write_ws_biff2(ba/*:BufArray*/, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) { var dense = Array.isArray(ws); var range = safe_decode_range(ws['!ref'] || "A1"), ref/*:string*/, rr = "", cols/*:Array*/ = []; if(range.e.c > 0xFF || range.e.r > 0x3FFF) { if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384"); range.e.c = Math.min(range.e.c, 0xFF); range.e.r = Math.min(range.e.c, 0x3FFF); ref = encode_range(range); } for(var R = range.s.r; R <= range.e.r; ++R) { rr = encode_row(R); for(var C = range.s.c; C <= range.e.c; ++C) { if(R === range.s.r) cols[C] = encode_col(C); ref = cols[C] + rr; var cell = dense ? (ws[R]||[])[C] : ws[ref]; if(!cell) continue; /* write cell */ write_ws_biff2_cell(ba, cell, R, C, opts); } } } /* Based on test files */ function write_biff2_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { var o = opts || {}; if(DENSE != null && o.dense == null) o.dense = DENSE; var ba = buf_array(); var idx = 0; for(var i=0;i*/ = []; var range = safe_decode_range(ws['!ref'] || "A1"); var MAX_ROWS = b8 ? 65536 : 16384; if(range.e.c > 0xFF || range.e.r >= MAX_ROWS) { if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384"); range.e.c = Math.min(range.e.c, 0xFF); range.e.r = Math.min(range.e.c, MAX_ROWS-1); } write_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts)); /* [Uncalced] Index */ write_biff_rec(ba, 0x000d /* CalcMode */, writeuint16(1)); write_biff_rec(ba, 0x000c /* CalcCount */, writeuint16(100)); write_biff_rec(ba, 0x000f /* CalcRefMode */, writebool(true)); write_biff_rec(ba, 0x0011 /* CalcIter */, writebool(false)); write_biff_rec(ba, 0x0010 /* CalcDelta */, write_Xnum(0.001)); write_biff_rec(ba, 0x005f /* CalcSaveRecalc */, writebool(true)); write_biff_rec(ba, 0x002a /* PrintRowCol */, writebool(false)); write_biff_rec(ba, 0x002b /* PrintGrid */, writebool(false)); write_biff_rec(ba, 0x0082 /* GridSet */, writeuint16(1)); write_biff_rec(ba, 0x0080 /* Guts */, write_Guts([0,0])); /* DefaultRowHeight WsBool [Sync] [LPr] [HorizontalPageBreaks] [VerticalPageBreaks] */ /* Header (string) */ /* Footer (string) */ write_biff_rec(ba, 0x0083 /* HCenter */, writebool(false)); write_biff_rec(ba, 0x0084 /* VCenter */, writebool(false)); /* ... */ if(b8) write_ws_cols_biff8(ba, ws["!cols"]); /* ... */ write_biff_rec(ba, 0x200, write_Dimensions(range, opts)); /* ... */ if(b8) ws['!links'] = []; for(var R = range.s.r; R <= range.e.r; ++R) { rr = encode_row(R); for(var C = range.s.c; C <= range.e.c; ++C) { if(R === range.s.r) cols[C] = encode_col(C); ref = cols[C] + rr; var cell = dense ? (ws[R]||[])[C] : ws[ref]; if(!cell) continue; /* write cell */ write_ws_biff8_cell(ba, cell, R, C, opts); if(b8 && cell.l) ws['!links'].push([ref, cell.l]); } } var cname/*:string*/ = _sheet.CodeName || _sheet.name || s; /* ... */ if(b8) write_biff_rec(ba, 0x023e /* Window2 */, write_Window2((_WB.Views||[])[0])); /* ... */ if(b8 && (ws['!merges']||[]).length) write_biff_rec(ba, 0x00e5 /* MergeCells */, write_MergeCells(ws['!merges'])); /* [LRng] *QUERYTABLE [PHONETICINFO] CONDFMTS */ if(b8) write_ws_biff8_hlinks(ba, ws); /* [DVAL] */ write_biff_rec(ba, 0x01ba /* CodeName */, write_XLUnicodeString(cname, opts)); /* *WebPub *CellWatch [SheetExt] */ if(b8) write_FEAT(ba, ws); /* *FEAT11 *RECORD12 */ write_biff_rec(ba, 0x000a /* EOF */); return ba.end(); } /* [MS-XLS] 2.1.7.20.3 */ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) { var A = buf_array(); var _WB/*:WBWBProps*/ = ((wb||{}).Workbook||{}/*:any*/); var _sheets/*:Array*/ = (_WB.Sheets||[]); var _wb/*:WBProps*/ = /*::((*/_WB.WBProps||{/*::CodeName:"ThisWorkbook"*/}/*:: ):any)*/; var b8 = opts.biff == 8, b5 = opts.biff == 5; write_biff_rec(A, 0x0809, write_BOF(wb, 0x05, opts)); if(opts.bookType == "xla") write_biff_rec(A, 0x0087 /* Addin */); write_biff_rec(A, 0x00e1 /* InterfaceHdr */, b8 ? writeuint16(0x04b0) : null); write_biff_rec(A, 0x00c1 /* Mms */, writezeroes(2)); if(b5) write_biff_rec(A, 0x00bf /* ToolbarHdr */); if(b5) write_biff_rec(A, 0x00c0 /* ToolbarEnd */); write_biff_rec(A, 0x00e2 /* InterfaceEnd */); write_biff_rec(A, 0x005c /* WriteAccess */, write_WriteAccess("SheetJS", opts)); /* [FileSharing] */ write_biff_rec(A, 0x0042 /* CodePage */, writeuint16(b8 ? 0x04b0 : 0x04E4)); /* *2047 Lel */ if(b8) write_biff_rec(A, 0x0161 /* DSF */, writeuint16(0)); if(b8) write_biff_rec(A, 0x01c0 /* Excel9File */); write_biff_rec(A, 0x013d /* RRTabId */, write_RRTabId(wb.SheetNames.length)); if(b8 && wb.vbaraw) write_biff_rec(A, 0x00d3 /* ObProj */); /* [ObNoMacros] */ if(b8 && wb.vbaraw) { var cname/*:string*/ = _wb.CodeName || "ThisWorkbook"; write_biff_rec(A, 0x01ba /* CodeName */, write_XLUnicodeString(cname, opts)); } write_biff_rec(A, 0x009c /* BuiltInFnGroupCount */, writeuint16(0x11)); /* *FnGroupName *FnGrp12 */ /* *Lbl */ /* [OleObjectSize] */ write_biff_rec(A, 0x0019 /* WinProtect */, writebool(false)); write_biff_rec(A, 0x0012 /* Protect */, writebool(false)); write_biff_rec(A, 0x0013 /* Password */, writeuint16(0)); if(b8) write_biff_rec(A, 0x01af /* Prot4Rev */, writebool(false)); if(b8) write_biff_rec(A, 0x01bc /* Prot4RevPass */, writeuint16(0)); write_biff_rec(A, 0x003d /* Window1 */, write_Window1(opts)); write_biff_rec(A, 0x0040 /* Backup */, writebool(false)); write_biff_rec(A, 0x008d /* HideObj */, writeuint16(0)); write_biff_rec(A, 0x0022 /* Date1904 */, writebool(safe1904(wb)=="true")); write_biff_rec(A, 0x000e /* CalcPrecision */, writebool(true)); if(b8) write_biff_rec(A, 0x01b7 /* RefreshAll */, writebool(false)); write_biff_rec(A, 0x00DA /* BookBool */, writeuint16(0)); /* ... */ write_FONTS_biff8(A, wb, opts); write_FMTS_biff8(A, wb.SSF, opts); write_CELLXFS_biff8(A, opts); /* ... */ if(b8) write_biff_rec(A, 0x0160 /* UsesELFs */, writebool(false)); var a = A.end(); var C = buf_array(); /* METADATA [MTRSettings] [ForceFullCalculation] */ if(b8) write_biff_rec(C, 0x008C, write_Country()); /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */ /* BIFF8: [SST *Continue] ExtSST */ if(b8 && opts.Strings) write_biff_continue(C, 0x00FC, write_SST(opts.Strings, opts)); /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */ write_biff_rec(C, 0x000A /* EOF */); var c = C.end(); var B = buf_array(); var blen = 0, j = 0; for(j = 0; j < wb.SheetNames.length; ++j) blen += (b8 ? 12 : 11) + (b8 ? 2 : 1) * wb.SheetNames[j].length; var start = a.length + blen + c.length; for(j = 0; j < wb.SheetNames.length; ++j) { var _sheet/*:WBWSProp*/ = _sheets[j] || ({}/*:any*/); write_biff_rec(B, 0x0085 /* BoundSheet8 */, write_BoundSheet8({pos:start, hs:_sheet.Hidden||0, dt:0, name:wb.SheetNames[j]}, opts)); start += bufs[j].length; } /* 1*BoundSheet8 */ var b = B.end(); if(blen != b.length) throw new Error("BS8 " + blen + " != " + b.length); var out = []; if(a.length) out.push(a); if(b.length) out.push(b); if(c.length) out.push(c); return bconcat(out); } /* [MS-XLS] 2.1.7.20 Workbook Stream */ function write_biff8_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { var o = opts || {}; var bufs = []; if(wb && !wb.SSF) { wb.SSF = dup(table_fmt); } if(wb && wb.SSF) { make_ssf(); SSF_load_table(wb.SSF); // $FlowIgnore o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0; o.ssf = wb.SSF; } o.Strings = /*::((*/[]/*:: :any):SST)*/; o.Strings.Count = 0; o.Strings.Unique = 0; fix_write_opts(o); o.cellXfs = []; get_cell_style(o.cellXfs, {}, {revssf:{"General":0}}); if(!wb.Props) wb.Props = {}; for(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb); bufs.unshift(write_biff8_global(wb, bufs, o)); return bconcat(bufs); } function write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { for(var i = 0; i <= wb.SheetNames.length; ++i) { var ws = wb.Sheets[wb.SheetNames[i]]; if(!ws || !ws["!ref"]) continue; var range = decode_range(ws["!ref"]); if(range.e.c > 255) { // note: 255 is IV if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost."); } } var o = opts || {}; switch(o.biff || 2) { case 8: case 5: return write_biff8_buf(wb, opts); case 4: case 3: case 2: return write_biff2_buf(wb, opts); } throw new Error("invalid type " + o.bookType + " for BIFF"); } /* note: browser DOM element cannot see mso- style attrs, must parse */ function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ { var opts = _opts || {}; if(DENSE != null && opts.dense == null) opts.dense = DENSE; var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); str = str.replace(//g, ""); var mtch/*:any*/ = str.match(/"); var mtch2/*:any*/ = str.match(/<\/table/i); var i/*:number*/ = mtch.index, j/*:number*/ = mtch2 && mtch2.index || str.length; var rows = split_regex(str.slice(i, j), /(:?]*>)/i, ""); var R = -1, C = 0, RS = 0, CS = 0; var range/*:Range*/ = {s:{r:10000000, c:10000000},e:{r:0,c:0}}; var merges/*:Array*/ = []; for(i = 0; i < rows.length; ++i) { var row = rows[i].trim(); var hd = row.slice(0,3).toLowerCase(); if(hd == "/i); for(j = 0; j < cells.length; ++j) { var cell = cells[j].trim(); if(!cell.match(/")) > -1) m = m.slice(cc+1); for(var midx = 0; midx < merges.length; ++midx) { var _merge/*:Range*/ = merges[midx]; if(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; } } var tag = parsexmltag(cell.slice(0, cell.indexOf(">"))); CS = tag.colspan ? +tag.colspan : 1; if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}}); var _t/*:string*/ = tag.t || tag["data-t"] || ""; /* TODO: generate stub cells */ if(!m.length) { C += CS; continue; } m = htmldecode(m); if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R; if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C; if(!m.length) { C += CS; continue; } var o/*:Cell*/ = {t:'s', v:m}; if(opts.raw || !m.trim().length || _t == 's'){} else if(m === 'TRUE') o = {t:'b', v:true}; else if(m === 'FALSE') o = {t:'b', v:false}; else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)}; else if(!isNaN(fuzzydate(m).getDate())) { o = ({t:'d', v:parseDate(m)}/*:any*/); if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/); o.z = opts.dateNF || table_fmt[14]; } if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; } else ws[encode_cell({r:R, c:C})] = o; C += CS; } } ws['!ref'] = encode_range(range); if(merges.length) ws["!merges"] = merges; return ws; } function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HTMLOpts*/)/*:string*/ { var M/*:Array*/ = (ws['!merges'] ||[]); var oo/*:Array*/ = []; for(var C = r.s.c; C <= r.e.c; ++C) { var RS = 0, CS = 0; for(var j = 0; j < M.length; ++j) { if(M[j].s.r > R || M[j].s.c > C) continue; if(M[j].e.r < R || M[j].e.c < C) continue; if(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; } RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break; } if(RS < 0) continue; var coord = encode_cell({r:R,c:C}); var cell = o.dense ? (ws[R]||[])[C] : ws[coord]; /* TODO: html entities */ var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || ""; var sp = ({}/*:any*/); if(RS > 1) sp.rowspan = RS; if(CS > 1) sp.colspan = CS; if(o.editable) w = '' + w + ''; else if(cell) { sp["data-t"] = cell && cell.t || 'z'; if(cell.v != null) sp["data-v"] = cell.v; if(cell.z != null) sp["data-z"] = cell.z; if(cell.l && (cell.l.Target || "#").charAt(0) != "#") w = '' + w + ''; } sp.id = (o.id || "sjs") + "-" + coord; oo.push(writextag('td', w, sp)); } var preamble = ""; return preamble + oo.join("") + ""; } var HTML_BEGIN = 'SheetJS Table Export'; var HTML_END = ''; function html_to_workbook(str/*:string*/, opts)/*:Workbook*/ { var mtch = str.match(/[\s\S]*?<\/table>/gi); if(!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find
"); if(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts); var wb = book_new(); mtch.forEach(function(s, idx) { book_append_sheet(wb, html_to_sheet(s, opts), "Sheet" + (idx+1)); }); return wb; } function make_html_preamble(ws/*:Worksheet*/, R/*:Range*/, o/*:Sheet2HTMLOpts*/)/*:string*/ { var out/*:Array*/ = []; return out.join("") + ''; } function sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*//*, wb:?Workbook*/)/*:string*/ { var o = opts || {}; var header = o.header != null ? o.header : HTML_BEGIN; var footer = o.footer != null ? o.footer : HTML_END; var out/*:Array*/ = [header]; var r = decode_range(ws['!ref']); o.dense = Array.isArray(ws); out.push(make_html_preamble(ws, r, o)); for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o)); out.push("
" + footer); return out.join(""); } function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ { var opts = _opts || {}; if(DENSE != null) opts.dense = DENSE; var or_R = 0, or_C = 0; if(opts.origin != null) { if(typeof opts.origin == 'number') or_R = opts.origin; else { var _origin/*:CellAddress*/ = typeof opts.origin == "string" ? decode_cell(opts.origin) : opts.origin; or_R = _origin.r; or_C = _origin.c; } } var rows/*:HTMLCollection*/ = table.getElementsByTagName('tr'); var sheetRows = Math.min(opts.sheetRows||10000000, rows.length); var range/*:Range*/ = {s:{r:0,c:0},e:{r:or_R,c:or_C}}; if(ws["!ref"]) { var _range/*:Range*/ = decode_range(ws["!ref"]); range.s.r = Math.min(range.s.r, _range.s.r); range.s.c = Math.min(range.s.c, _range.s.c); range.e.r = Math.max(range.e.r, _range.e.r); range.e.c = Math.max(range.e.c, _range.e.c); if(or_R == -1) range.e.r = or_R = _range.e.r + 1; } var merges/*:Array*/ = [], midx = 0; var rowinfo/*:Array*/ = ws["!rows"] || (ws["!rows"] = []); var _R = 0, R = 0, _C = 0, C = 0, RS = 0, CS = 0; if(!ws["!cols"]) ws['!cols'] = []; for(; _R < rows.length && R < sheetRows; ++_R) { var row/*:HTMLTableRowElement*/ = rows[_R]; if (is_dom_element_hidden(row)) { if (opts.display) continue; rowinfo[R] = {hidden: true}; } var elts/*:HTMLCollection*/ = (row.children/*:any*/); for(_C = C = 0; _C < elts.length; ++_C) { var elt/*:HTMLTableCellElement*/ = elts[_C]; if (opts.display && is_dom_element_hidden(elt)) continue; var v/*:?string*/ = elt.hasAttribute('data-v') ? elt.getAttribute('data-v') : elt.hasAttribute('v') ? elt.getAttribute('v') : htmldecode(elt.innerHTML); var z/*:?string*/ = elt.getAttribute('data-z') || elt.getAttribute('z'); for(midx = 0; midx < merges.length; ++midx) { var m/*:Range*/ = merges[midx]; if(m.s.c == C + or_C && m.s.r < R + or_R && R + or_R <= m.e.r) { C = m.e.c+1 - or_C; midx = -1; } } /* TODO: figure out how to extract nonstandard mso- style */ CS = +elt.getAttribute("colspan") || 1; if( ((RS = (+elt.getAttribute("rowspan") || 1)))>1 || CS>1) merges.push({s:{r:R + or_R,c:C + or_C},e:{r:R + or_R + (RS||1) - 1, c:C + or_C + (CS||1) - 1}}); var o/*:Cell*/ = {t:'s', v:v}; var _t/*:string*/ = elt.getAttribute("data-t") || elt.getAttribute("t") || ""; if(v != null) { if(v.length == 0) o.t = _t || 'z'; else if(opts.raw || v.trim().length == 0 || _t == "s"){} else if(v === 'TRUE') o = {t:'b', v:true}; else if(v === 'FALSE') o = {t:'b', v:false}; else if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)}; else if(!isNaN(fuzzydate(v).getDate())) { o = ({t:'d', v:parseDate(v)}/*:any*/); if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/); o.z = opts.dateNF || table_fmt[14]; } } if(o.z === undefined && z != null) o.z = z; /* The first link is used. Links are assumed to be fully specified. * TODO: The right way to process relative links is to make a new */ var l = "", Aelts = elt.getElementsByTagName("A"); if(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti) if(Aelts[Aelti].hasAttribute("href")) { l = Aelts[Aelti].getAttribute("href"); if(l.charAt(0) != "#") break; } if(l && l.charAt(0) != "#") o.l = ({ Target: l }); if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; } else ws[encode_cell({c:C + or_C, r:R + or_R})] = o; if(range.e.c < C + or_C) range.e.c = C + or_C; C += CS; } ++R; } if(merges.length) ws['!merges'] = (ws["!merges"] || []).concat(merges); range.e.r = Math.max(range.e.r, R - 1 + or_R); ws['!ref'] = encode_range(range); if(R >= sheetRows) ws['!fullref'] = encode_range((range.e.r = rows.length-_R+R-1 + or_R,range)); // We can count the real number of rows to parse but we don't to improve the performance return ws; } function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ { var opts = _opts || {}; var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/); return sheet_add_dom(ws, table, _opts); } function table_to_book(table/*:HTMLElement*/, opts/*:?any*/)/*:Workbook*/ { return sheet_to_workbook(parse_dom_table(table, opts), opts); } function is_dom_element_hidden(element/*:HTMLElement*/)/*:boolean*/ { var display/*:string*/ = ''; var get_computed_style/*:?function*/ = get_get_computed_style_function(element); if(get_computed_style) display = get_computed_style(element).getPropertyValue('display'); if(!display) display = element.style && element.style.display; return display === 'none'; } /* global getComputedStyle */ function get_get_computed_style_function(element/*:HTMLElement*/)/*:?function*/ { // The proper getComputedStyle implementation is the one defined in the element window if(element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === 'function') return element.ownerDocument.defaultView.getComputedStyle; // If it is not available, try to get one from the global namespace if(typeof getComputedStyle === 'function') return getComputedStyle; return null; } /* OpenDocument */ function parse_text_p(text/*:string*//*::, tag*/)/*:Array*/ { /* 6.1.2 White Space Characters */ var fixed = text .replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ") .replace(//g," ") .replace(//g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); }) .replace(/]*\/>/g,"\t") .replace(//g,"\n"); var v = unescapexml(fixed.replace(/<[^>]*>/g,"")); return [v]; } var number_formats_ods = { /* ods name: [short ssf fmt, long ssf fmt] */ day: ["d", "dd"], month: ["m", "mm"], year: ["y", "yy"], hours: ["h", "hh"], minutes: ["m", "mm"], seconds: ["s", "ss"], "am-pm": ["A/P", "AM/PM"], "day-of-week": ["ddd", "dddd"], era: ["e", "ee"], /* there is no native representation of LO "Q" format */ quarter: ["\\Qm", "m\\\"th quarter\""] }; function parse_content_xml(d/*:string*/, _opts)/*:Workbook*/ { var opts = _opts || {}; if(DENSE != null && opts.dense == null) opts.dense = DENSE; var str = xlml_normalize(d); var state/*:Array*/ = [], tmp; var tag/*:: = {}*/; var NFtag = {name:""}, NF = "", pidx = 0; var sheetag/*:: = {name:"", '名称':""}*/; var rowtag/*:: = {'行号':""}*/; var Sheets = {}, SheetNames/*:Array*/ = []; var ws = opts.dense ? ([]/*:any*/) : ({}/*:any*/); var Rn, q/*:: :any = ({t:"", v:null, z:null, w:"",c:[],}:any)*/; var ctag = ({value:""}/*:any*/); var textp = "", textpidx = 0, textptag/*:: = {}*/; var textR = []; var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}}; var row_ol = 0; var number_format_map = {}; var merges/*:Array*/ = [], mrange = {}, mR = 0, mC = 0; var rowinfo/*:Array*/ = [], rowpeat = 1, colpeat = 1; var arrayf/*:Array<[Range, string]>*/ = []; var WB = {Names:[]}; var atag = ({}/*:any*/); var _Ref/*:[string, string]*/ = ["", ""]; var comments/*:Array*/ = [], comment/*:Comment*/ = ({}/*:any*/); var creator = "", creatoridx = 0; var isstub = false, intable = false; var i = 0; xlmlregex.lastIndex = 0; str = str.replace(//mg,"").replace(//gm,""); while((Rn = xlmlregex.exec(str))) switch((Rn[3]=Rn[3].replace(/_.*$/,""))) { case 'table': case '工作表': // 9.1.2 if(Rn[1]==='/') { if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range); else ws['!ref'] = "A1:A1"; if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) { ws['!fullref'] = ws['!ref']; range.e.r = opts.sheetRows - 1; ws['!ref'] = encode_range(range); } if(merges.length) ws['!merges'] = merges; if(rowinfo.length) ws["!rows"] = rowinfo; sheetag.name = sheetag['名称'] || sheetag.name; if(typeof JSON !== 'undefined') JSON.stringify(sheetag); SheetNames.push(sheetag.name); Sheets[sheetag.name] = ws; intable = false; } else if(Rn[0].charAt(Rn[0].length-2) !== '/') { sheetag = parsexmltag(Rn[0], false); R = C = -1; range.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0; ws = opts.dense ? ([]/*:any*/) : ({}/*:any*/); merges = []; rowinfo = []; intable = true; } break; case 'table-row-group': // 9.1.9 if(Rn[1] === "/") --row_ol; else ++row_ol; break; case 'table-row': case '行': // 9.1.3 if(Rn[1] === '/') { R+=rowpeat; rowpeat = 1; break; } rowtag = parsexmltag(Rn[0], false); if(rowtag['行号']) R = rowtag['行号'] - 1; else if(R == -1) R = 0; rowpeat = +rowtag['number-rows-repeated'] || 1; /* TODO: remove magic */ if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol}; C = -1; break; case 'covered-table-cell': // 9.1.5 if(Rn[1] !== '/') ++C; if(opts.sheetStubs) { if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; } else ws[encode_cell({r:R,c:C})] = {t:'z'}; } textp = ""; textR = []; break; /* stub */ case 'table-cell': case '数据': if(Rn[0].charAt(Rn[0].length-2) === '/') { ++C; ctag = parsexmltag(Rn[0], false); colpeat = parseInt(ctag['number-columns-repeated']||"1", 10); q = ({t:'z', v:null/*:: , z:null, w:"",c:[]*/}/*:any*/); if(ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula)); if((ctag['数据类型'] || ctag['value-type']) == "string") { q.t = "s"; q.v = unescapexml(ctag['string-value'] || ""); if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = q; } else { ws[encode_cell({r:R,c:C})] = q; } } C+= colpeat-1; } else if(Rn[1]!=='/') { ++C; textp = ""; textpidx = 0; textR = []; colpeat = 1; var rptR = rowpeat ? R + rowpeat - 1 : R; if(C > range.e.c) range.e.c = C; if(C < range.s.c) range.s.c = C; if(R < range.s.r) range.s.r = R; if(rptR > range.e.r) range.e.r = rptR; ctag = parsexmltag(Rn[0], false); comments = []; comment = ({}/*:any*/); q = ({t:ctag['数据类型'] || ctag['value-type'], v:null/*:: , z:null, w:"",c:[]*/}/*:any*/); if(opts.cellFormula) { if(ctag.formula) ctag.formula = unescapexml(ctag.formula); if(ctag['number-matrix-columns-spanned'] && ctag['number-matrix-rows-spanned']) { mR = parseInt(ctag['number-matrix-rows-spanned'],10) || 0; mC = parseInt(ctag['number-matrix-columns-spanned'],10) || 0; mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}}; q.F = encode_range(mrange); arrayf.push([mrange, q.F]); } if(ctag.formula) q.f = ods_to_csf_formula(ctag.formula); else for(i = 0; i < arrayf.length; ++i) if(R >= arrayf[i][0].s.r && R <= arrayf[i][0].e.r) if(C >= arrayf[i][0].s.c && C <= arrayf[i][0].e.c) q.F = arrayf[i][1]; } if(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) { mR = parseInt(ctag['number-rows-spanned'],10) || 0; mC = parseInt(ctag['number-columns-spanned'],10) || 0; mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}}; merges.push(mrange); } /* 19.675.2 table:number-columns-repeated */ if(ctag['number-columns-repeated']) colpeat = parseInt(ctag['number-columns-repeated'], 10); /* 19.385 office:value-type */ switch(q.t) { case 'boolean': q.t = 'b'; q.v = parsexmlbool(ctag['boolean-value']); break; case 'float': q.t = 'n'; q.v = parseFloat(ctag.value); break; case 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break; case 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break; case 'date': q.t = 'd'; q.v = parseDate(ctag['date-value']); if(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v); } q.z = 'm/d/yy'; break; case 'time': q.t = 'n'; q.v = parse_isodur(ctag['time-value'])/86400; if(opts.cellDates) { q.t = 'd'; q.v = numdate(q.v); } q.z = 'HH:MM:SS'; break; case 'number': q.t = 'n'; q.v = parseFloat(ctag['数据数值']); break; default: if(q.t === 'string' || q.t === 'text' || !q.t) { q.t = 's'; if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; } } else throw new Error('Unsupported value type ' + q.t); } } else { isstub = false; if(q.t === 's') { q.v = textp || ''; if(textR.length) q.R = textR; isstub = textpidx == 0; } if(atag.Target) q.l = atag; if(comments.length > 0) { q.c = comments; comments = []; } if(textp && opts.cellText !== false) q.w = textp; if(isstub) { q.t = "z"; delete q.v; } if(!isstub || opts.sheetStubs) { if(!(opts.sheetRows && opts.sheetRows <= R)) { for(var rpt = 0; rpt < rowpeat; ++rpt) { colpeat = parseInt(ctag['number-columns-repeated']||"1", 10); if(opts.dense) { if(!ws[R + rpt]) ws[R + rpt] = []; ws[R + rpt][C] = rpt == 0 ? q : dup(q); while(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q); } else { ws[encode_cell({r:R + rpt,c:C})] = q; while(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q); } if(range.e.c <= C) range.e.c = C; } } } colpeat = parseInt(ctag['number-columns-repeated']||"1", 10); C += colpeat-1; colpeat = 0; q = {/*:: t:"", v:null, z:null, w:"",c:[]*/}; textp = ""; textR = []; } atag = ({}/*:any*/); break; // 9.1.4 /* pure state */ case 'document': // TODO: is the root for FODS case 'document-content': case '电子表格文档': // 3.1.3.2 case 'spreadsheet': case '主体': // 3.7 case 'scripts': // 3.12 case 'styles': // TODO case 'font-face-decls': // 3.14 case 'master-styles': // 3.15.4 -- relevant for FODS if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;} else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]); break; case 'annotation': // 14.1 if(Rn[1]==='/'){ if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp; comment.t = textp; if(textR.length) /*::(*/comment/*:: :any)*/.R = textR; comment.a = creator; comments.push(comment); } else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);} creator = ""; creatoridx = 0; textp = ""; textpidx = 0; textR = []; break; case 'creator': // 4.3.2.7 if(Rn[1]==='/') { creator = str.slice(creatoridx,Rn.index); } else creatoridx = Rn.index + Rn[0].length; break; /* ignore state */ case 'meta': case '元数据': // TODO: FODS/UOF case 'settings': // TODO: case 'config-item-set': // TODO: case 'config-item-map-indexed': // TODO: case 'config-item-map-entry': // TODO: case 'config-item-map-named': // TODO: case 'shapes': // 9.2.8 case 'frame': // 10.4.2 case 'text-box': // 10.4.3 case 'image': // 10.4.4 case 'data-pilot-tables': // 9.6.2 case 'list-style': // 16.30 case 'form': // 13.13 case 'dde-links': // 9.8 case 'event-listeners': // TODO case 'chart': // TODO if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;} else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]); textp = ""; textpidx = 0; textR = []; break; case 'scientific-number': // TODO: break; case 'currency-symbol': // TODO: break; case 'currency-style': // TODO: break; case 'number-style': // 16.27.2 case 'percentage-style': // 16.27.9 case 'date-style': // 16.27.10 case 'time-style': // 16.27.18 if(Rn[1]==='/'){ number_format_map[NFtag.name] = NF; if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp; } else if(Rn[0].charAt(Rn[0].length-2) !== '/') { NF = ""; NFtag = parsexmltag(Rn[0], false); state.push([Rn[3], true]); } break; case 'script': break; // 3.13 case 'libraries': break; // TODO: case 'automatic-styles': break; // 3.15.3 case 'default-style': // TODO: case 'page-layout': break; // TODO: case 'style': // 16.2 break; case 'map': break; // 16.3 case 'font-face': break; // 16.21 case 'paragraph-properties': break; // 17.6 case 'table-properties': break; // 17.15 case 'table-column-properties': break; // 17.16 case 'table-row-properties': break; // 17.17 case 'table-cell-properties': break; // 17.18 case 'number': // 16.27.3 switch(state[state.length-1][0]) { case 'time-style': case 'date-style': tag = parsexmltag(Rn[0], false); NF += number_formats_ods[Rn[3]][tag.style==='long'?1:0]; break; } break; case 'fraction': break; // TODO 16.27.6 case 'day': // 16.27.11 case 'month': // 16.27.12 case 'year': // 16.27.13 case 'era': // 16.27.14 case 'day-of-week': // 16.27.15 case 'week-of-year': // 16.27.16 case 'quarter': // 16.27.17 case 'hours': // 16.27.19 case 'minutes': // 16.27.20 case 'seconds': // 16.27.21 case 'am-pm': // 16.27.22 switch(state[state.length-1][0]) { case 'time-style': case 'date-style': tag = parsexmltag(Rn[0], false); NF += number_formats_ods[Rn[3]][tag.style==='long'?1:0]; break; } break; case 'boolean-style': break; // 16.27.23 case 'boolean': break; // 16.27.24 case 'text-style': break; // 16.27.25 case 'text': // 16.27.26 if(Rn[0].slice(-2) === "/>") break; else if(Rn[1]==="/") switch(state[state.length-1][0]) { case 'number-style': case 'date-style': case 'time-style': NF += str.slice(pidx, Rn.index); break; } else pidx = Rn.index + Rn[0].length; break; case 'named-range': // 9.4.12 tag = parsexmltag(Rn[0], false); _Ref = ods_to_csf_3D(tag['cell-range-address']); var nrange = ({Name:tag.name, Ref:_Ref[0] + '!' + _Ref[1]}/*:any*/); if(intable) nrange.Sheet = SheetNames.length; WB.Names.push(nrange); break; case 'text-content': break; // 16.27.27 case 'text-properties': break; // 16.27.27 case 'embedded-text': break; // 16.27.4 case 'body': case '电子表格': break; // 3.3 16.9.6 19.726.3 case 'forms': break; // 12.25.2 13.2 case 'table-column': break; // 9.1.6 case 'table-header-rows': break; // 9.1.7 case 'table-rows': break; // 9.1.12 /* TODO: outline levels */ case 'table-column-group': break; // 9.1.10 case 'table-header-columns': break; // 9.1.11 case 'table-columns': break; // 9.1.12 case 'null-date': break; // 9.4.2 TODO: date1904 case 'graphic-properties': break; // 17.21 case 'calculation-settings': break; // 9.4.1 case 'named-expressions': break; // 9.4.11 case 'label-range': break; // 9.4.9 case 'label-ranges': break; // 9.4.10 case 'named-expression': break; // 9.4.13 case 'sort': break; // 9.4.19 case 'sort-by': break; // 9.4.20 case 'sort-groups': break; // 9.4.22 case 'tab': break; // 6.1.4 case 'line-break': break; // 6.1.5 case 'span': break; // 6.1.7 case 'p': case '文本串': // 5.1.3 if(['master-styles'].indexOf(state[state.length-1][0]) > -1) break; if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) { var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag); textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0]; } else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; } break; // case 's': break; // case 'database-range': // 9.4.15 if(Rn[1]==='/') break; try { _Ref = ods_to_csf_3D(parsexmltag(Rn[0])['target-range-address']); Sheets[_Ref[0]]['!autofilter'] = { ref:_Ref[1] }; } catch(e) {/* empty */} break; case 'date': break; // <*:date> case 'object': break; // 10.4.6.2 case 'title': case '标题': break; // <*:title> OR case 'desc': break; // <*:desc> case 'binary-data': break; // 10.4.5 TODO: b64 blob /* 9.2 Advanced Tables */ case 'table-source': break; // 9.2.6 case 'scenario': break; // 9.2.6 case 'iteration': break; // 9.4.3 case 'content-validations': break; // 9.4.4 case 'filter': break; // 9.5.2 case 'filter-and': break; // 9.5.3 case 'filter-or': break; // 9.5.4 case 'filter-condition': break; // 9.5.5 case 'list-level-style-bullet': break; // 16.31 case 'page-count': break; // TODO case 'time': break; // TODO /* 9.3 Advanced Table Cells */ case 'cell-range-source': break; // 9.3.1 case 'property': break; // 13.8 case 'a': // 6.1.8 hyperlink if(Rn[1]!== '/') { atag = parsexmltag(Rn[0], false); if(!atag.href) break; atag.Target = unescapexml(atag.href); delete atag.href; if(atag.Target.charAt(0) == "#" && atag.Target.indexOf(".") > -1) { _Ref = ods_to_csf_3D(atag.Target.slice(1)); atag.Target = "#" + _Ref[0] + "!" + _Ref[1]; } else if(atag.Target.match(/^\.\.[\\\/]/)) atag.Target = atag.Target.slice(3); } break; /* non-standard */ case 'table-protection': break; case 'data-pilot-grand-total': break; // ', '', '', '', '', '', '', '' ].join(""); var payload = '' + master_styles + ''; return function wso(/*::wb, opts*/) { return XML_HEADER + payload; }; })(); var write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function() { /* 6.1.2 White Space Characters */ var write_text_p = function(text/*:string*/)/*:string*/ { return escapexml(text) .replace(/ +/g, function($$){return '';}) .replace(/\t/g, "") .replace(/\n/g, "") .replace(/^ /, "").replace(/ $/, ""); }; var null_cell_xml = ' \n'; var covered_cell_xml = ' \n'; var write_ws = function(ws, wb/*:Workbook*/, i/*:number*//*::, opts*/)/*:string*/ { /* Section 9 Tables */ var o/*:Array*/ = []; o.push(' \n'); var R=0,C=0, range = decode_range(ws['!ref']||"A1"); var marr/*:Array*/ = ws['!merges'] || [], mi = 0; var dense = Array.isArray(ws); if(ws["!cols"]) { for(C = 0; C <= range.e.c; ++C) o.push(' \n'); } var H = "", ROWS = ws["!rows"]||[]; for(R = 0; R < range.s.r; ++R) { H = ROWS[R] ? ' table:style-name="ro' + ROWS[R].ods + '"' : ""; o.push(' \n'); } for(; R <= range.e.r; ++R) { H = ROWS[R] ? ' table:style-name="ro' + ROWS[R].ods + '"' : ""; o.push(' \n'); for(C=0; C < range.s.c; ++C) o.push(null_cell_xml); for(; C <= range.e.c; ++C) { var skip = false, ct = {}, textp = ""; for(mi = 0; mi != marr.length; ++mi) { if(marr[mi].s.c > C) continue; if(marr[mi].s.r > R) continue; if(marr[mi].e.c < C) continue; if(marr[mi].e.r < R) continue; if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true; ct['table:number-columns-spanned'] = (marr[mi].e.c - marr[mi].s.c + 1); ct['table:number-rows-spanned'] = (marr[mi].e.r - marr[mi].s.r + 1); break; } if(skip) { o.push(covered_cell_xml); continue; } var ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref]; if(cell && cell.f) { ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f)); if(cell.F) { if(cell.F.slice(0, ref.length) == ref) { var _Fref = decode_range(cell.F); ct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1); ct['table:number-matrix-rows-spanned'] = (_Fref.e.r - _Fref.s.r + 1); } } } if(!cell) { o.push(null_cell_xml); continue; } switch(cell.t) { case 'b': textp = (cell.v ? 'TRUE' : 'FALSE'); ct['office:value-type'] = "boolean"; ct['office:boolean-value'] = (cell.v ? 'true' : 'false'); break; case 'n': textp = (cell.w||String(cell.v||0)); ct['office:value-type'] = "float"; ct['office:value'] = (cell.v||0); break; case 's': case 'str': textp = cell.v == null ? "" : cell.v; ct['office:value-type'] = "string"; break; case 'd': textp = (cell.w||(parseDate(cell.v).toISOString())); ct['office:value-type'] = "date"; ct['office:date-value'] = (parseDate(cell.v).toISOString()); ct['table:style-name'] = "ce1"; break; //case 'e': default: o.push(null_cell_xml); continue; } var text_p = write_text_p(textp); if(cell.l && cell.l.Target) { var _tgt = cell.l.Target; _tgt = _tgt.charAt(0) == "#" ? "#" + csf_to_ods_3D(_tgt.slice(1)) : _tgt; // TODO: choose correct parent path format based on link delimiters if(_tgt.charAt(0) != "#" && !_tgt.match(/^\w+:/)) _tgt = '../' + _tgt; text_p = writextag('text:a', text_p, {'xlink:href': _tgt.replace(/&/g, "&")}); } o.push(' ' + writextag('table:table-cell', writextag('text:p', text_p, {}), ct) + '\n'); } o.push(' \n'); } o.push(' \n'); return o.join(""); }; var write_automatic_styles_ods = function(o/*:Array*/, wb) { o.push(' \n'); o.push(' \n'); o.push(' \n'); o.push(' /\n'); o.push(' \n'); o.push(' /\n'); o.push(' \n'); o.push(' \n'); /* column styles */ var cidx = 0; wb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) { if(!ws) return; if(ws["!cols"]) { for(var C = 0; C < ws["!cols"].length; ++C) if(ws["!cols"][C]) { var colobj = ws["!cols"][C]; if(colobj.width == null && colobj.wpx == null && colobj.wch == null) continue; process_col(colobj); colobj.ods = cidx; var w = ws["!cols"][C].wpx + "px"; o.push(' \n'); o.push(' \n'); o.push(' \n'); ++cidx; } } }); /* row styles */ var ridx = 0; wb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) { if(!ws) return; if(ws["!rows"]) { for(var R = 0; R < ws["!rows"].length; ++R) if(ws["!rows"][R]) { ws["!rows"][R].ods = ridx; var h = ws["!rows"][R].hpx + "px"; o.push(' \n'); o.push(' \n'); o.push(' \n'); ++ridx; } } }); /* table */ o.push(' \n'); o.push(' \n'); o.push(' \n'); /* table cells, text */ o.push(' \n'); /* page-layout */ o.push(' \n'); }; return function wcx(wb, opts) { var o = [XML_HEADER]; /* 3.1.3.2 */ var attr = wxt_helper({ 'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0", 'xmlns:table': "urn:oasis:names:tc:opendocument:xmlns:table:1.0", 'xmlns:style': "urn:oasis:names:tc:opendocument:xmlns:style:1.0", 'xmlns:text': "urn:oasis:names:tc:opendocument:xmlns:text:1.0", 'xmlns:draw': "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", 'xmlns:fo': "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", 'xmlns:xlink': "http://www.w3.org/1999/xlink", 'xmlns:dc': "http://purl.org/dc/elements/1.1/", 'xmlns:meta': "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", 'xmlns:number': "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0", 'xmlns:presentation': "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", 'xmlns:svg': "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", 'xmlns:chart': "urn:oasis:names:tc:opendocument:xmlns:chart:1.0", 'xmlns:dr3d': "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0", 'xmlns:math': "http://www.w3.org/1998/Math/MathML", 'xmlns:form': "urn:oasis:names:tc:opendocument:xmlns:form:1.0", 'xmlns:script': "urn:oasis:names:tc:opendocument:xmlns:script:1.0", 'xmlns:ooo': "http://openoffice.org/2004/office", 'xmlns:ooow': "http://openoffice.org/2004/writer", 'xmlns:oooc': "http://openoffice.org/2004/calc", 'xmlns:dom': "http://www.w3.org/2001/xml-events", 'xmlns:xforms': "http://www.w3.org/2002/xforms", 'xmlns:xsd': "http://www.w3.org/2001/XMLSchema", 'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:sheet': "urn:oasis:names:tc:opendocument:sh33tjs:1.0", 'xmlns:rpt': "http://openoffice.org/2005/report", 'xmlns:of': "urn:oasis:names:tc:opendocument:xmlns:of:1.2", 'xmlns:xhtml': "http://www.w3.org/1999/xhtml", 'xmlns:grddl': "http://www.w3.org/2003/g/data-view#", 'xmlns:tableooo': "http://openoffice.org/2009/table", 'xmlns:drawooo': "http://openoffice.org/2010/draw", 'xmlns:calcext': "urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0", 'xmlns:loext': "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0", 'xmlns:field': "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0", 'xmlns:formx': "urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0", 'xmlns:css3t': "http://www.w3.org/TR/css3-text/", 'office:version': "1.2" }); var fods = wxt_helper({ 'xmlns:config': "urn:oasis:names:tc:opendocument:xmlns:config:1.0", 'office:mimetype': "application/vnd.oasis.opendocument.spreadsheet" }); if(opts.bookType == "fods") { o.push('\n'); o.push(write_meta_ods().replace(/office:document-meta/g, "office:meta")); // TODO: settings (equiv of settings.xml for ODS) } else o.push('\n'); // o.push(' \n'); write_automatic_styles_ods(o, wb); o.push(' \n'); o.push(' \n'); for(var i = 0; i != wb.SheetNames.length; ++i) o.push(write_ws(wb.Sheets[wb.SheetNames[i]], wb, i, opts)); o.push(' \n'); o.push(' \n'); if(opts.bookType == "fods") o.push(''); else o.push(''); return o.join(""); }; })(); function write_ods(wb/*:any*/, opts/*:any*/) { if(opts.bookType == "fods") return write_content_ods(wb, opts); var zip = zip_new(); var f = ""; var manifest/*:Array >*/ = []; var rdf/*:Array<[string, string]>*/ = []; /* Part 3 Section 3.3 MIME Media Type */ f = "mimetype"; zip_add_file(zip, f, "application/vnd.oasis.opendocument.spreadsheet"); /* Part 1 Section 2.2 Documents */ f = "content.xml"; zip_add_file(zip, f, write_content_ods(wb, opts)); manifest.push([f, "text/xml"]); rdf.push([f, "ContentFile"]); /* TODO: these are hard-coded styles to satiate excel */ f = "styles.xml"; zip_add_file(zip, f, write_styles_ods(wb, opts)); manifest.push([f, "text/xml"]); rdf.push([f, "StylesFile"]); /* TODO: this is hard-coded to satiate excel */ f = "meta.xml"; zip_add_file(zip, f, XML_HEADER + write_meta_ods(/*::wb, opts*/)); manifest.push([f, "text/xml"]); rdf.push([f, "MetadataFile"]); /* Part 3 Section 6 Metadata Manifest File */ f = "manifest.rdf"; zip_add_file(zip, f, write_rdf(rdf/*, opts*/)); manifest.push([f, "application/rdf+xml"]); /* Part 3 Section 4 Manifest File */ f = "META-INF/manifest.xml"; zip_add_file(zip, f, write_manifest(manifest/*, opts*/)); return zip; } /*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */ function u8_to_dataview(array) { return new DataView(array.buffer, array.byteOffset, array.byteLength); } function u8str(u8) { return typeof TextDecoder != "undefined" ? new TextDecoder().decode(u8) : utf8read(a2s(u8)); } function stru8(str) { return typeof TextEncoder != "undefined" ? new TextEncoder().encode(str) : s2a(utf8write(str)); } function u8contains(body, search) { outer: for (var L = 0; L <= body.length - search.length; ++L) { for (var j = 0; j < search.length; ++j) if (body[L + j] != search[j]) continue outer; return true; } return false; } function u8concat(u8a) { var len = u8a.reduce(function(acc, x) { return acc + x.length; }, 0); var out = new Uint8Array(len); var off = 0; u8a.forEach(function(u8) { out.set(u8, off); off += u8.length; }); return out; } function popcnt(x) { x -= x >> 1 & 1431655765; x = (x & 858993459) + (x >> 2 & 858993459); return (x + (x >> 4) & 252645135) * 16843009 >>> 24; } function readDecimal128LE(buf, offset) { var exp = (buf[offset + 15] & 127) << 7 | buf[offset + 14] >> 1; var mantissa = buf[offset + 14] & 1; for (var j = offset + 13; j >= offset; --j) mantissa = mantissa * 256 + buf[j]; return (buf[offset + 15] & 128 ? -mantissa : mantissa) * Math.pow(10, exp - 6176); } function writeDecimal128LE(buf, offset, value) { var exp = Math.floor(value == 0 ? 0 : Math.LOG10E * Math.log(Math.abs(value))) + 6176 - 20; var mantissa = value / Math.pow(10, exp - 6176); buf[offset + 15] |= exp >> 7; buf[offset + 14] |= (exp & 127) << 1; for (var i = 0; mantissa >= 1; ++i, mantissa /= 256) buf[offset + i] = mantissa & 255; buf[offset + 15] |= value >= 0 ? 0 : 128; } function parse_varint49(buf, ptr) { var l = ptr ? ptr[0] : 0; var usz = buf[l] & 127; varint: if (buf[l++] >= 128) { usz |= (buf[l] & 127) << 7; if (buf[l++] < 128) break varint; usz |= (buf[l] & 127) << 14; if (buf[l++] < 128) break varint; usz |= (buf[l] & 127) << 21; if (buf[l++] < 128) break varint; usz += (buf[l] & 127) * Math.pow(2, 28); ++l; if (buf[l++] < 128) break varint; usz += (buf[l] & 127) * Math.pow(2, 35); ++l; if (buf[l++] < 128) break varint; usz += (buf[l] & 127) * Math.pow(2, 42); ++l; if (buf[l++] < 128) break varint; } if (ptr) ptr[0] = l; return usz; } function write_varint49(v) { var usz = new Uint8Array(7); usz[0] = v & 127; var L = 1; sz: if (v > 127) { usz[L - 1] |= 128; usz[L] = v >> 7 & 127; ++L; if (v <= 16383) break sz; usz[L - 1] |= 128; usz[L] = v >> 14 & 127; ++L; if (v <= 2097151) break sz; usz[L - 1] |= 128; usz[L] = v >> 21 & 127; ++L; if (v <= 268435455) break sz; usz[L - 1] |= 128; usz[L] = v / 256 >>> 21 & 127; ++L; if (v <= 34359738367) break sz; usz[L - 1] |= 128; usz[L] = v / 65536 >>> 21 & 127; ++L; if (v <= 4398046511103) break sz; usz[L - 1] |= 128; usz[L] = v / 16777216 >>> 21 & 127; ++L; } return usz.slice(0, L); } function varint_to_i32(buf) { var l = 0, i32 = buf[l] & 127; varint: if (buf[l++] >= 128) { i32 |= (buf[l] & 127) << 7; if (buf[l++] < 128) break varint; i32 |= (buf[l] & 127) << 14; if (buf[l++] < 128) break varint; i32 |= (buf[l] & 127) << 21; if (buf[l++] < 128) break varint; i32 |= (buf[l] & 127) << 28; } return i32; } function parse_shallow(buf) { var out = [], ptr = [0]; while (ptr[0] < buf.length) { var off = ptr[0]; var num = parse_varint49(buf, ptr); var type = num & 7; num = Math.floor(num / 8); var len = 0; var res; if (num == 0) break; switch (type) { case 0: { var l = ptr[0]; while (buf[ptr[0]++] >= 128) ; res = buf.slice(l, ptr[0]); } break; case 5: len = 4; res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; case 1: len = 8; res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; case 2: len = parse_varint49(buf, ptr); res = buf.slice(ptr[0], ptr[0] + len); ptr[0] += len; break; case 3: case 4: default: throw new Error("PB Type ".concat(type, " for Field ").concat(num, " at offset ").concat(off)); } var v = { data: res, type: type }; if (out[num] == null) out[num] = [v]; else out[num].push(v); } return out; } function write_shallow(proto) { var out = []; proto.forEach(function(field, idx) { field.forEach(function(item) { if (!item.data) return; out.push(write_varint49(idx * 8 + item.type)); if (item.type == 2) out.push(write_varint49(item.data.length)); out.push(item.data); }); }); return u8concat(out); } function mappa(data, cb) { return (data == null ? void 0 : data.map(function(d) { return cb(d.data); })) || []; } function parse_iwa_file(buf) { var _a; var out = [], ptr = [0]; while (ptr[0] < buf.length) { var len = parse_varint49(buf, ptr); var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len)); ptr[0] += len; var res = { id: varint_to_i32(ai[1][0].data), messages: [] }; ai[2].forEach(function(b) { var mi = parse_shallow(b.data); var fl = varint_to_i32(mi[3][0].data); res.messages.push({ meta: mi, data: buf.slice(ptr[0], ptr[0] + fl) }); ptr[0] += fl; }); if ((_a = ai[3]) == null ? void 0 : _a[0]) res.merge = varint_to_i32(ai[3][0].data) >>> 0 > 0; out.push(res); } return out; } function write_iwa_file(ias) { var bufs = []; ias.forEach(function(ia) { var ai = []; ai[1] = [{ data: write_varint49(ia.id), type: 0 }]; ai[2] = []; if (ia.merge != null) ai[3] = [{ data: write_varint49(+!!ia.merge), type: 0 }]; var midata = []; ia.messages.forEach(function(mi) { midata.push(mi.data); mi.meta[3] = [{ type: 0, data: write_varint49(mi.data.length) }]; ai[2].push({ data: write_shallow(mi.meta), type: 2 }); }); var aipayload = write_shallow(ai); bufs.push(write_varint49(aipayload.length)); bufs.push(aipayload); midata.forEach(function(mid) { return bufs.push(mid); }); }); return u8concat(bufs); } function parse_snappy_chunk(type, buf) { if (type != 0) throw new Error("Unexpected Snappy chunk type ".concat(type)); var ptr = [0]; var usz = parse_varint49(buf, ptr); var chunks = []; while (ptr[0] < buf.length) { var tag = buf[ptr[0]] & 3; if (tag == 0) { var len = buf[ptr[0]++] >> 2; if (len < 60) ++len; else { var c = len - 59; len = buf[ptr[0]]; if (c > 1) len |= buf[ptr[0] + 1] << 8; if (c > 2) len |= buf[ptr[0] + 2] << 16; if (c > 3) len |= buf[ptr[0] + 3] << 24; len >>>= 0; len++; ptr[0] += c; } chunks.push(buf.slice(ptr[0], ptr[0] + len)); ptr[0] += len; continue; } else { var offset = 0, length = 0; if (tag == 1) { length = (buf[ptr[0]] >> 2 & 7) + 4; offset = (buf[ptr[0]++] & 224) << 3; offset |= buf[ptr[0]++]; } else { length = (buf[ptr[0]++] >> 2) + 1; if (tag == 2) { offset = buf[ptr[0]] | buf[ptr[0] + 1] << 8; ptr[0] += 2; } else { offset = (buf[ptr[0]] | buf[ptr[0] + 1] << 8 | buf[ptr[0] + 2] << 16 | buf[ptr[0] + 3] << 24) >>> 0; ptr[0] += 4; } } chunks = [u8concat(chunks)]; if (offset == 0) throw new Error("Invalid offset 0"); if (offset > chunks[0].length) throw new Error("Invalid offset beyond length"); if (length >= offset) { chunks.push(chunks[0].slice(-offset)); length -= offset; while (length >= chunks[chunks.length - 1].length) { chunks.push(chunks[chunks.length - 1]); length -= chunks[chunks.length - 1].length; } } chunks.push(chunks[0].slice(-offset, -offset + length)); } } var o = u8concat(chunks); if (o.length != usz) throw new Error("Unexpected length: ".concat(o.length, " != ").concat(usz)); return o; } function decompress_iwa_file(buf) { var out = []; var l = 0; while (l < buf.length) { var t = buf[l++]; var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16; l += 3; out.push(parse_snappy_chunk(t, buf.slice(l, l + len))); l += len; } if (l !== buf.length) throw new Error("data is not a valid framed stream!"); return u8concat(out); } function compress_iwa_file(buf) { var out = []; var l = 0; while (l < buf.length) { var c = Math.min(buf.length - l, 268435455); var frame = new Uint8Array(4); out.push(frame); var usz = write_varint49(c); var L = usz.length; out.push(usz); if (c <= 60) { L++; out.push(new Uint8Array([c - 1 << 2])); } else if (c <= 256) { L += 2; out.push(new Uint8Array([240, c - 1 & 255])); } else if (c <= 65536) { L += 3; out.push(new Uint8Array([244, c - 1 & 255, c - 1 >> 8 & 255])); } else if (c <= 16777216) { L += 4; out.push(new Uint8Array([248, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255])); } else if (c <= 4294967296) { L += 5; out.push(new Uint8Array([252, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255, c - 1 >>> 24 & 255])); } out.push(buf.slice(l, l + c)); L += c; frame[0] = 0; frame[1] = L & 255; frame[2] = L >> 8 & 255; frame[3] = L >> 16 & 255; l += c; } return u8concat(out); } function parse_old_storage(buf, sst, rsst, v) { var dv = u8_to_dataview(buf); var flags = dv.getUint32(4, true); var data_offset = (v > 1 ? 12 : 8) + popcnt(flags & (v > 1 ? 3470 : 398)) * 4; var ridx = -1, sidx = -1, ieee = NaN, dt = new Date(2001, 0, 1); if (flags & 512) { ridx = dv.getUint32(data_offset, true); data_offset += 4; } data_offset += popcnt(flags & (v > 1 ? 12288 : 4096)) * 4; if (flags & 16) { sidx = dv.getUint32(data_offset, true); data_offset += 4; } if (flags & 32) { ieee = dv.getFloat64(data_offset, true); data_offset += 8; } if (flags & 64) { dt.setTime(dt.getTime() + dv.getFloat64(data_offset, true) * 1e3); data_offset += 8; } var ret; switch (buf[2]) { case 0: break; case 2: ret = { t: "n", v: ieee }; break; case 3: ret = { t: "s", v: sst[sidx] }; break; case 5: ret = { t: "d", v: dt }; break; case 6: ret = { t: "b", v: ieee > 0 }; break; case 7: ret = { t: "n", v: ieee / 86400 }; break; case 8: ret = { t: "e", v: 0 }; break; case 9: { if (ridx > -1) ret = { t: "s", v: rsst[ridx] }; else if (sidx > -1) ret = { t: "s", v: sst[sidx] }; else if (!isNaN(ieee)) ret = { t: "n", v: ieee }; else throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); } break; default: throw new Error("Unsupported cell type ".concat(buf.slice(0, 4))); } return ret; } function parse_new_storage(buf, sst, rsst) { var dv = u8_to_dataview(buf); var flags = dv.getUint32(8, true); var data_offset = 12; var ridx = -1, sidx = -1, d128 = NaN, ieee = NaN, dt = new Date(2001, 0, 1); if (flags & 1) { d128 = readDecimal128LE(buf, data_offset); data_offset += 16; } if (flags & 2) { ieee = dv.getFloat64(data_offset, true); data_offset += 8; } if (flags & 4) { dt.setTime(dt.getTime() + dv.getFloat64(data_offset, true) * 1e3); data_offset += 8; } if (flags & 8) { sidx = dv.getUint32(data_offset, true); data_offset += 4; } if (flags & 16) { ridx = dv.getUint32(data_offset, true); data_offset += 4; } var ret; switch (buf[1]) { case 0: break; case 2: ret = { t: "n", v: d128 }; break; case 3: ret = { t: "s", v: sst[sidx] }; break; case 5: ret = { t: "d", v: dt }; break; case 6: ret = { t: "b", v: ieee > 0 }; break; case 7: ret = { t: "n", v: ieee / 86400 }; break; case 8: ret = { t: "e", v: 0 }; break; case 9: { if (ridx > -1) ret = { t: "s", v: rsst[ridx] }; else throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); } break; case 10: ret = { t: "n", v: d128 }; break; default: throw new Error("Unsupported cell type ".concat(buf[1], " : ").concat(flags & 31, " : ").concat(buf.slice(0, 4))); } return ret; } function write_new_storage(cell, sst) { var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0; out[0] = 5; switch (cell.t) { case "n": out[1] = 2; writeDecimal128LE(out, l, cell.v); flags |= 1; l += 16; break; case "b": out[1] = 6; dv.setFloat64(l, cell.v ? 1 : 0, true); flags |= 2; l += 8; break; case "s": if (sst.indexOf(cell.v) == -1) throw new Error("Value ".concat(cell.v, " missing from SST!")); out[1] = 3; dv.setUint32(l, sst.indexOf(cell.v), true); flags |= 8; l += 4; break; default: throw "unsupported cell type " + cell.t; } dv.setUint32(8, flags, true); return out.slice(0, l); } function write_old_storage(cell, sst) { var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0; out[0] = 3; switch (cell.t) { case "n": out[2] = 2; dv.setFloat64(l, cell.v, true); flags |= 32; l += 8; break; case "b": out[2] = 6; dv.setFloat64(l, cell.v ? 1 : 0, true); flags |= 32; l += 8; break; case "s": if (sst.indexOf(cell.v) == -1) throw new Error("Value ".concat(cell.v, " missing from SST!")); out[2] = 3; dv.setUint32(l, sst.indexOf(cell.v), true); flags |= 16; l += 4; break; default: throw "unsupported cell type " + cell.t; } dv.setUint32(4, flags, true); return out.slice(0, l); } function parse_cell_storage(buf, sst, rsst) { switch (buf[0]) { case 0: case 1: case 2: case 3: return parse_old_storage(buf, sst, rsst, buf[0]); case 5: return parse_new_storage(buf, sst, rsst); default: throw new Error("Unsupported payload version ".concat(buf[0])); } } function parse_TSP_Reference(buf) { var pb = parse_shallow(buf); return parse_varint49(pb[1][0].data); } function write_TSP_Reference(idx) { var out = []; out[1] = [{ type: 0, data: write_varint49(idx) }]; return write_shallow(out); } function parse_TST_TableDataList(M, root) { var pb = parse_shallow(root.data); var type = varint_to_i32(pb[1][0].data); var entries = pb[3]; var data = []; (entries || []).forEach(function(entry) { var le = parse_shallow(entry.data); var key = varint_to_i32(le[1][0].data) >>> 0; switch (type) { case 1: data[key] = u8str(le[3][0].data); break; case 8: { var rt = M[parse_TSP_Reference(le[9][0].data)][0]; var rtp = parse_shallow(rt.data); var rtpref = M[parse_TSP_Reference(rtp[1][0].data)][0]; var mtype = varint_to_i32(rtpref.meta[1][0].data); if (mtype != 2001) throw new Error("2000 unexpected reference to ".concat(mtype)); var tswpsa = parse_shallow(rtpref.data); data[key] = tswpsa[3].map(function(x) { return u8str(x.data); }).join(""); } break; } }); return data; } function parse_TST_TileRowInfo(u8, type) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n; var pb = parse_shallow(u8); var R = varint_to_i32(pb[1][0].data) >>> 0; var cnt = varint_to_i32(pb[2][0].data) >>> 0; var wide_offsets = ((_b = (_a = pb[8]) == null ? void 0 : _a[0]) == null ? void 0 : _b.data) && varint_to_i32(pb[8][0].data) > 0 || false; var used_storage_u8, used_storage; if (((_d = (_c = pb[7]) == null ? void 0 : _c[0]) == null ? void 0 : _d.data) && type != 0) { used_storage_u8 = (_f = (_e = pb[7]) == null ? void 0 : _e[0]) == null ? void 0 : _f.data; used_storage = (_h = (_g = pb[6]) == null ? void 0 : _g[0]) == null ? void 0 : _h.data; } else if (((_j = (_i = pb[4]) == null ? void 0 : _i[0]) == null ? void 0 : _j.data) && type != 1) { used_storage_u8 = (_l = (_k = pb[4]) == null ? void 0 : _k[0]) == null ? void 0 : _l.data; used_storage = (_n = (_m = pb[3]) == null ? void 0 : _m[0]) == null ? void 0 : _n.data; } else throw "NUMBERS Tile missing ".concat(type, " cell storage"); var width = wide_offsets ? 4 : 1; var used_storage_offsets = u8_to_dataview(used_storage_u8); var offsets = []; for (var C = 0; C < used_storage_u8.length / 2; ++C) { var off = used_storage_offsets.getUint16(C * 2, true); if (off < 65535) offsets.push([C, off]); } if (offsets.length != cnt) throw "Expected ".concat(cnt, " cells, found ").concat(offsets.length); var cells = []; for (C = 0; C < offsets.length - 1; ++C) cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C + 1][1] * width); if (offsets.length >= 1) cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width); return { R: R, cells: cells }; } function parse_TST_Tile(M, root) { var _a; var pb = parse_shallow(root.data); var storage = ((_a = pb == null ? void 0 : pb[7]) == null ? void 0 : _a[0]) ? varint_to_i32(pb[7][0].data) >>> 0 > 0 ? 1 : 0 : -1; var ri = mappa(pb[5], function(u8) { return parse_TST_TileRowInfo(u8, storage); }); return { nrows: varint_to_i32(pb[4][0].data) >>> 0, data: ri.reduce(function(acc, x) { if (!acc[x.R]) acc[x.R] = []; x.cells.forEach(function(cell, C) { if (acc[x.R][C]) throw new Error("Duplicate cell r=".concat(x.R, " c=").concat(C)); acc[x.R][C] = cell; }); return acc; }, []) }; } function parse_TST_TableModelArchive(M, root, ws) { var _a; var pb = parse_shallow(root.data); var range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } }; range.e.r = (varint_to_i32(pb[6][0].data) >>> 0) - 1; if (range.e.r < 0) throw new Error("Invalid row varint ".concat(pb[6][0].data)); range.e.c = (varint_to_i32(pb[7][0].data) >>> 0) - 1; if (range.e.c < 0) throw new Error("Invalid col varint ".concat(pb[7][0].data)); ws["!ref"] = encode_range(range); var store = parse_shallow(pb[4][0].data); var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]); var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_TSP_Reference(store[17][0].data)][0]) : []; var tile = parse_shallow(store[3][0].data); var _R = 0; tile[1].forEach(function(t) { var tl = parse_shallow(t.data); var ref = M[parse_TSP_Reference(tl[2][0].data)][0]; var mtype = varint_to_i32(ref.meta[1][0].data); if (mtype != 6002) throw new Error("6001 unexpected reference to ".concat(mtype)); var _tile = parse_TST_Tile(M, ref); _tile.data.forEach(function(row, R) { row.forEach(function(buf, C) { var addr = encode_cell({ r: _R + R, c: C }); var res = parse_cell_storage(buf, sst, rsst); if (res) ws[addr] = res; }); }); _R += _tile.nrows; }); } function parse_TST_TableInfoArchive(M, root) { var pb = parse_shallow(root.data); var out = { "!ref": "A1" }; var tableref = M[parse_TSP_Reference(pb[2][0].data)]; var mtype = varint_to_i32(tableref[0].meta[1][0].data); if (mtype != 6001) throw new Error("6000 unexpected reference to ".concat(mtype)); parse_TST_TableModelArchive(M, tableref[0], out); return out; } function parse_TN_SheetArchive(M, root) { var _a; var pb = parse_shallow(root.data); var out = { name: ((_a = pb[1]) == null ? void 0 : _a[0]) ? u8str(pb[1][0].data) : "", sheets: [] }; var shapeoffs = mappa(pb[2], parse_TSP_Reference); shapeoffs.forEach(function(off) { M[off].forEach(function(m) { var mtype = varint_to_i32(m.meta[1][0].data); if (mtype == 6e3) out.sheets.push(parse_TST_TableInfoArchive(M, m)); }); }); return out; } function parse_TN_DocumentArchive(M, root) { var out = book_new(); var pb = parse_shallow(root.data); var sheetoffs = mappa(pb[1], parse_TSP_Reference); sheetoffs.forEach(function(off) { M[off].forEach(function(m) { var mtype = varint_to_i32(m.meta[1][0].data); if (mtype == 2) { var root2 = parse_TN_SheetArchive(M, m); root2.sheets.forEach(function(sheet, idx) { book_append_sheet(out, sheet, idx == 0 ? root2.name : root2.name + "_" + idx, true); }); } }); }); if (out.SheetNames.length == 0) throw new Error("Empty NUMBERS file"); return out; } function parse_numbers_iwa(cfb) { var _a, _b, _c, _d; var M = {}, indices = []; cfb.FullPaths.forEach(function(p) { if (p.match(/\.iwpv2/)) throw new Error("Unsupported password protection"); }); cfb.FileIndex.forEach(function(s) { if (!s.name.match(/\.iwa$/)) return; var o; try { o = decompress_iwa_file(s.content); } catch (e) { return console.log("?? " + s.content.length + " " + (e.message || e)); } var packets; try { packets = parse_iwa_file(o); } catch (e) { return console.log("## " + (e.message || e)); } packets.forEach(function(packet) { M[packet.id] = packet.messages; indices.push(packet.id); }); }); if (!indices.length) throw new Error("File has no messages"); var docroot = ((_d = (_c = (_b = (_a = M == null ? void 0 : M[1]) == null ? void 0 : _a[0]) == null ? void 0 : _b.meta) == null ? void 0 : _c[1]) == null ? void 0 : _d[0].data) && varint_to_i32(M[1][0].meta[1][0].data) == 1 && M[1][0]; if (!docroot) indices.forEach(function(idx) { M[idx].forEach(function(iwam) { var mtype = varint_to_i32(iwam.meta[1][0].data) >>> 0; if (mtype == 1) { if (!docroot) docroot = iwam; else throw new Error("Document has multiple roots"); } }); }); if (!docroot) throw new Error("Cannot find Document root"); return parse_TN_DocumentArchive(M, docroot); } function write_tile_row(tri, data, SST) { var _a, _b, _c, _d; if (!((_a = tri[6]) == null ? void 0 : _a[0]) || !((_b = tri[7]) == null ? void 0 : _b[0])) throw "Mutation only works on post-BNC storages!"; var wide_offsets = ((_d = (_c = tri[8]) == null ? void 0 : _c[0]) == null ? void 0 : _d.data) && varint_to_i32(tri[8][0].data) > 0 || false; if (wide_offsets) throw "Math only works with normal offsets"; var cnt = 0; var dv = u8_to_dataview(tri[7][0].data), last_offset = 0, cell_storage = []; var _dv = u8_to_dataview(tri[4][0].data), _last_offset = 0, _cell_storage = []; for (var C = 0; C < data.length; ++C) { if (data[C] == null) { dv.setUint16(C * 2, 65535, true); _dv.setUint16(C * 2, 65535); continue; } dv.setUint16(C * 2, last_offset, true); _dv.setUint16(C * 2, _last_offset, true); var celload, _celload; switch (typeof data[C]) { case "string": celload = write_new_storage({ t: "s", v: data[C] }, SST); _celload = write_old_storage({ t: "s", v: data[C] }, SST); break; case "number": celload = write_new_storage({ t: "n", v: data[C] }, SST); _celload = write_old_storage({ t: "n", v: data[C] }, SST); break; case "boolean": celload = write_new_storage({ t: "b", v: data[C] }, SST); _celload = write_old_storage({ t: "b", v: data[C] }, SST); break; default: throw new Error("Unsupported value " + data[C]); } cell_storage.push(celload); last_offset += celload.length; _cell_storage.push(_celload); _last_offset += _celload.length; ++cnt; } tri[2][0].data = write_varint49(cnt); for (; C < tri[7][0].data.length / 2; ++C) { dv.setUint16(C * 2, 65535, true); _dv.setUint16(C * 2, 65535, true); } tri[6][0].data = u8concat(cell_storage); tri[3][0].data = u8concat(_cell_storage); return cnt; } function write_numbers_iwa(wb, opts) { if (!opts || !opts.numbers) throw new Error("Must pass a `numbers` option -- check the README"); var ws = wb.Sheets[wb.SheetNames[0]]; if (wb.SheetNames.length > 1) console.error("The Numbers writer currently writes only the first table"); var range = decode_range(ws["!ref"]); range.s.r = range.s.c = 0; var trunc = false; if (range.e.c > 9) { trunc = true; range.e.c = 9; } if (range.e.r > 49) { trunc = true; range.e.r = 49; } if (trunc) console.error("The Numbers writer is currently limited to ".concat(encode_range(range))); var data = sheet_to_json(ws, { range: range, header: 1 }); var SST = ["~Sh33tJ5~"]; data.forEach(function(row) { return row.forEach(function(cell) { if (typeof cell == "string") SST.push(cell); }); }); var dependents = {}; var indices = []; var cfb = CFB.read(opts.numbers, { type: "base64" }); cfb.FileIndex.map(function(fi, idx) { return [fi, cfb.FullPaths[idx]]; }).forEach(function(row) { var fi = row[0], fp = row[1]; if (fi.type != 2) return; if (!fi.name.match(/\.iwa/)) return; var old_content = fi.content; var raw1 = decompress_iwa_file(old_content); var x2 = parse_iwa_file(raw1); x2.forEach(function(packet2) { indices.push(packet2.id); dependents[packet2.id] = { deps: [], location: fp, type: varint_to_i32(packet2.messages[0].meta[1][0].data) }; }); }); indices.sort(function(x2, y2) { return x2 - y2; }); var indices_varint = indices.filter(function(x2) { return x2 > 1; }).map(function(x2) { return [x2, write_varint49(x2)]; }); cfb.FileIndex.map(function(fi, idx) { return [fi, cfb.FullPaths[idx]]; }).forEach(function(row) { var fi = row[0], fp = row[1]; if (!fi.name.match(/\.iwa/)) return; var x2 = parse_iwa_file(decompress_iwa_file(fi.content)); x2.forEach(function(ia) { ia.messages.forEach(function(m) { indices_varint.forEach(function(ivi) { if (ia.messages.some(function(mess) { return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]); })) { dependents[ivi[0]].deps.push(ia.id); } }); }); }); }); function get_unique_msgid() { for (var i = 927262; i < 2e6; ++i) if (!dependents[i]) return i; throw new Error("Too many messages"); } var entry = CFB.find(cfb, dependents[1].location); var x = parse_iwa_file(decompress_iwa_file(entry.content)); var docroot; for (var xi = 0; xi < x.length; ++xi) { var packet = x[xi]; if (packet.id == 1) docroot = packet; } var sheetrootref = parse_TSP_Reference(parse_shallow(docroot.messages[0].data)[1][0].data); entry = CFB.find(cfb, dependents[sheetrootref].location); x = parse_iwa_file(decompress_iwa_file(entry.content)); for (xi = 0; xi < x.length; ++xi) { packet = x[xi]; if (packet.id == sheetrootref) docroot = packet; } sheetrootref = parse_TSP_Reference(parse_shallow(docroot.messages[0].data)[2][0].data); entry = CFB.find(cfb, dependents[sheetrootref].location); x = parse_iwa_file(decompress_iwa_file(entry.content)); for (xi = 0; xi < x.length; ++xi) { packet = x[xi]; if (packet.id == sheetrootref) docroot = packet; } sheetrootref = parse_TSP_Reference(parse_shallow(docroot.messages[0].data)[2][0].data); entry = CFB.find(cfb, dependents[sheetrootref].location); x = parse_iwa_file(decompress_iwa_file(entry.content)); for (xi = 0; xi < x.length; ++xi) { packet = x[xi]; if (packet.id == sheetrootref) docroot = packet; } var pb = parse_shallow(docroot.messages[0].data); { pb[6][0].data = write_varint49(range.e.r + 1); pb[7][0].data = write_varint49(range.e.c + 1); var cruidsref = parse_TSP_Reference(pb[46][0].data); var oldbucket = CFB.find(cfb, dependents[cruidsref].location); var _x = parse_iwa_file(decompress_iwa_file(oldbucket.content)); { for (var j = 0; j < _x.length; ++j) { if (_x[j].id == cruidsref) break; } if (_x[j].id != cruidsref) throw "Bad ColumnRowUIDMapArchive"; var cruids = parse_shallow(_x[j].messages[0].data); cruids[1] = []; cruids[2] = [], cruids[3] = []; for (var C = 0; C <= range.e.c; ++C) { var uuid = []; uuid[1] = uuid[2] = [{ type: 0, data: write_varint49(C + 420690) }]; cruids[1].push({ type: 2, data: write_shallow(uuid) }); cruids[2].push({ type: 0, data: write_varint49(C) }); cruids[3].push({ type: 0, data: write_varint49(C) }); } cruids[4] = []; cruids[5] = [], cruids[6] = []; for (var R = 0; R <= range.e.r; ++R) { uuid = []; uuid[1] = uuid[2] = [{ type: 0, data: write_varint49(R + 726270) }]; cruids[4].push({ type: 2, data: write_shallow(uuid) }); cruids[5].push({ type: 0, data: write_varint49(R) }); cruids[6].push({ type: 0, data: write_varint49(R) }); } _x[j].messages[0].data = write_shallow(cruids); } oldbucket.content = compress_iwa_file(write_iwa_file(_x)); oldbucket.size = oldbucket.content.length; delete pb[46]; var store = parse_shallow(pb[4][0].data); { store[7][0].data = write_varint49(range.e.r + 1); var row_headers = parse_shallow(store[1][0].data); var row_header_ref = parse_TSP_Reference(row_headers[2][0].data); oldbucket = CFB.find(cfb, dependents[row_header_ref].location); _x = parse_iwa_file(decompress_iwa_file(oldbucket.content)); { if (_x[0].id != row_header_ref) throw "Bad HeaderStorageBucket"; var base_bucket = parse_shallow(_x[0].messages[0].data); for (R = 0; R < data.length; ++R) { var _bucket = parse_shallow(base_bucket[2][0].data); _bucket[1][0].data = write_varint49(R); _bucket[4][0].data = write_varint49(data[R].length); base_bucket[2][R] = { type: base_bucket[2][0].type, data: write_shallow(_bucket) }; } _x[0].messages[0].data = write_shallow(base_bucket); } oldbucket.content = compress_iwa_file(write_iwa_file(_x)); oldbucket.size = oldbucket.content.length; var col_header_ref = parse_TSP_Reference(store[2][0].data); oldbucket = CFB.find(cfb, dependents[col_header_ref].location); _x = parse_iwa_file(decompress_iwa_file(oldbucket.content)); { if (_x[0].id != col_header_ref) throw "Bad HeaderStorageBucket"; base_bucket = parse_shallow(_x[0].messages[0].data); for (C = 0; C <= range.e.c; ++C) { _bucket = parse_shallow(base_bucket[2][0].data); _bucket[1][0].data = write_varint49(C); _bucket[4][0].data = write_varint49(range.e.r + 1); base_bucket[2][C] = { type: base_bucket[2][0].type, data: write_shallow(_bucket) }; } _x[0].messages[0].data = write_shallow(base_bucket); } oldbucket.content = compress_iwa_file(write_iwa_file(_x)); oldbucket.size = oldbucket.content.length; var sstref = parse_TSP_Reference(store[4][0].data); (function() { var sentry = CFB.find(cfb, dependents[sstref].location); var sx = parse_iwa_file(decompress_iwa_file(sentry.content)); var sstroot; for (var sxi = 0; sxi < sx.length; ++sxi) { var packet2 = sx[sxi]; if (packet2.id == sstref) sstroot = packet2; } var sstdata = parse_shallow(sstroot.messages[0].data); { sstdata[3] = []; var newsst = []; SST.forEach(function(str, i) { newsst[1] = [{ type: 0, data: write_varint49(i) }]; newsst[2] = [{ type: 0, data: write_varint49(1) }]; newsst[3] = [{ type: 2, data: stru8(str) }]; sstdata[3].push({ type: 2, data: write_shallow(newsst) }); }); } sstroot.messages[0].data = write_shallow(sstdata); var sy = write_iwa_file(sx); var raw32 = compress_iwa_file(sy); sentry.content = raw32; sentry.size = sentry.content.length; })(); var tile = parse_shallow(store[3][0].data); { var t = tile[1][0]; delete tile[2]; var tl = parse_shallow(t.data); { var tileref = parse_TSP_Reference(tl[2][0].data); (function() { var tentry = CFB.find(cfb, dependents[tileref].location); var tx = parse_iwa_file(decompress_iwa_file(tentry.content)); var tileroot; for (var sxi = 0; sxi < tx.length; ++sxi) { var packet2 = tx[sxi]; if (packet2.id == tileref) tileroot = packet2; } var tiledata = parse_shallow(tileroot.messages[0].data); { delete tiledata[6]; delete tile[7]; var rowload = new Uint8Array(tiledata[5][0].data); tiledata[5] = []; var cnt = 0; for (var R2 = 0; R2 <= range.e.r; ++R2) { var tilerow = parse_shallow(rowload); cnt += write_tile_row(tilerow, data[R2], SST); tilerow[1][0].data = write_varint49(R2); tiledata[5].push({ data: write_shallow(tilerow), type: 2 }); } tiledata[1] = [{ type: 0, data: write_varint49(range.e.c + 1) }]; tiledata[2] = [{ type: 0, data: write_varint49(range.e.r + 1) }]; tiledata[3] = [{ type: 0, data: write_varint49(cnt) }]; tiledata[4] = [{ type: 0, data: write_varint49(range.e.r + 1) }]; } tileroot.messages[0].data = write_shallow(tiledata); var ty = write_iwa_file(tx); var raw32 = compress_iwa_file(ty); tentry.content = raw32; tentry.size = tentry.content.length; })(); } t.data = write_shallow(tl); } store[3][0].data = write_shallow(tile); } pb[4][0].data = write_shallow(store); } docroot.messages[0].data = write_shallow(pb); var y = write_iwa_file(x); var raw3 = compress_iwa_file(y); entry.content = raw3; entry.size = entry.content.length; return cfb; } function fix_opts_func(defaults/*:Array >*/)/*:{(o:any):void}*/ { return function fix_opts(opts) { for(var i = 0; i != defaults.length; ++i) { var d = defaults[i]; if(opts[d[0]] === undefined) opts[d[0]] = d[1]; if(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]); } }; } function fix_read_opts(opts) { fix_opts_func([ ['cellNF', false], /* emit cell number format string as .z */ ['cellHTML', true], /* emit html string as .h */ ['cellFormula', true], /* emit formulae as .f */ ['cellStyles', false], /* emits style/theme as .s */ ['cellText', true], /* emit formatted text as .w */ ['cellDates', false], /* emit date cells with type `d` */ ['sheetStubs', false], /* emit empty cells */ ['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */ ['bookDeps', false], /* parse calculation chains */ ['bookSheets', false], /* only try to get sheet names (no Sheets) */ ['bookProps', false], /* only try to get properties (no Sheets) */ ['bookFiles', false], /* include raw file structure (keys, files, cfb) */ ['bookVBA', false], /* include vba raw data (vbaraw) */ ['password',''], /* password */ ['WTF', false] /* WTF mode (throws errors) */ ])(opts); } function fix_write_opts(opts) { fix_opts_func([ ['cellDates', false], /* write date cells with type `d` */ ['bookSST', false], /* Generate Shared String Table */ ['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */ ['compression', false], /* Use file compression */ ['WTF', false] /* WTF mode (throws errors) */ ])(opts); } function get_sheet_type(n/*:string*/)/*:string*/ { if(RELS.WS.indexOf(n) > -1) return "sheet"; if(RELS.CS && n == RELS.CS) return "chart"; if(RELS.DS && n == RELS.DS) return "dialog"; if(RELS.MS && n == RELS.MS) return "macro"; return (n && n.length) ? n : "sheet"; } function safe_parse_wbrels(wbrels, sheets) { if(!wbrels) return 0; try { wbrels = sheets.map(function pwbr(w) { if(!w.id) w.id = w.strRelID; return [w.name, wbrels['!id'][w.id].Target, get_sheet_type(wbrels['!id'][w.id].Type)]; }); } catch(e) { return null; } return !wbrels || wbrels.length === 0 ? null : wbrels; } function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/*:number*/, sheetRels, sheets, stype/*:string*/, opts, wb, themes, styles) { try { sheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path); var data = getzipdata(zip, path); var _ws; switch(stype) { case 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; case 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); if(!_ws || !_ws['!drawel']) break; var dfile = resolve_path(_ws['!drawel'].Target, path); var drelsp = get_rels_path(dfile); var draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile)); var chartp = resolve_path(draw, dfile); var crelsp = get_rels_path(chartp); _ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws); break; case 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; case 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; default: throw new Error("Unrecognized sheet type " + stype); } sheets[sheet] = _ws; /* scan rels for comments and threaded comments */ var tcomments = []; if(sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function(n) { var dfile = ""; if(sheetRels[sheet][n].Type == RELS.CMNT) { dfile = resolve_path(sheetRels[sheet][n].Target, path); var comments = parse_cmnt(getzipdata(zip, dfile, true), dfile, opts); if(!comments || !comments.length) return; sheet_insert_comments(_ws, comments, false); } if(sheetRels[sheet][n].Type == RELS.TCMNT) { dfile = resolve_path(sheetRels[sheet][n].Target, path); tcomments = tcomments.concat(parse_tcmnt_xml(getzipdata(zip, dfile, true), opts)); } }); if(tcomments && tcomments.length) sheet_insert_comments(_ws, tcomments, true, opts.people || []); } catch(e) { if(opts.WTF) throw e; } } function strip_front_slash(x/*:string*/)/*:string*/ { return x.charAt(0) == '/' ? x.slice(1) : x; } function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ { make_ssf(); opts = opts || {}; fix_read_opts(opts); /* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */ if(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts); /* UOC */ if(safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts); /* Numbers */ if(safegetzipfile(zip, 'Index/Document.iwa')) { if(typeof Uint8Array == "undefined") throw new Error('NUMBERS file parsing requires Uint8Array support'); if(typeof parse_numbers_iwa != "undefined") { if(zip.FileIndex) return parse_numbers_iwa(zip); var _zip = CFB.utils.cfb_new(); zipentries(zip).forEach(function(e) { zip_add_file(_zip, e, getzipbin(zip, e)); }); return parse_numbers_iwa(_zip); } throw new Error('Unsupported NUMBERS file'); } if(!safegetzipfile(zip, '[Content_Types].xml')) { if(safegetzipfile(zip, 'index.xml.gz')) throw new Error('Unsupported NUMBERS 08 file'); if(safegetzipfile(zip, 'index.xml')) throw new Error('Unsupported NUMBERS 09 file'); throw new Error('Unsupported ZIP file'); } var entries = zipentries(zip); var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')/*:?any*/)); var xlsb = false; var sheets, binname; if(dir.workbooks.length === 0) { binname = "xl/workbook.xml"; if(getzipdata(zip,binname, true)) dir.workbooks.push(binname); } if(dir.workbooks.length === 0) { binname = "xl/workbook.bin"; if(!getzipdata(zip,binname,true)) throw new Error("Could not find workbook"); dir.workbooks.push(binname); xlsb = true; } if(dir.workbooks[0].slice(-3) == "bin") xlsb = true; var themes = ({}/*:any*/); var styles = ({}/*:any*/); if(!opts.bookSheets && !opts.bookProps) { strs = []; if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; } if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts); if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts); } /*var externbooks = */dir.links.map(function(link) { try { var rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link); return parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts); } catch(e) {} }); var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts); var props = {}, propdata = ""; if(dir.coreprops.length) { propdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true); if(propdata) props = parse_core_props(propdata); if(dir.extprops.length !== 0) { propdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true); if(propdata) parse_ext_props(propdata, props, opts); } } var custprops = {}; if(!opts.bookSheets || opts.bookProps) { if (dir.custprops.length !== 0) { propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true); if(propdata) custprops = parse_cust_props(propdata, opts); } } var out = ({}/*:any*/); if(opts.bookSheets || opts.bookProps) { if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; }); else if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames; if(opts.bookProps) { out.Props = props; out.Custprops = custprops; } if(opts.bookSheets && typeof sheets !== 'undefined') out.SheetNames = sheets; if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out; } sheets = {}; var deps = {}; if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts); var i=0; var sheetRels = ({}/*:any*/); var path, relsPath; { var wbsheets = wb.Sheets; props.Worksheets = wbsheets.length; props.SheetNames = []; for(var j = 0; j != wbsheets.length; ++j) { props.SheetNames[j] = wbsheets[j].name; } } var wbext = xlsb ? "bin" : "xml"; var wbrelsi = dir.workbooks[0].lastIndexOf("/"); var wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi+1) + "_rels/" + dir.workbooks[0].slice(wbrelsi+1) + ".rels").replace(/^\//,""); if(!safegetzipfile(zip, wbrelsfile)) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels'; var wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile.replace(/_rels.*/, "s5s")); if((dir.metadata || []).length >= 1) { /* TODO: MDX and other types of metadata */ opts.xlmeta = parse_xlmeta(getzipdata(zip, strip_front_slash(dir.metadata[0])),dir.metadata[0],opts); } if((dir.people || []).length >= 1) { opts.people = parse_people_xml(getzipdata(zip, strip_front_slash(dir.people[0])),opts); } if(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets); /* Numbers iOS hack */ var nmode = (getzipdata(zip,"xl/worksheets/sheet.xml",true))?1:0; wsloop: for(i = 0; i != props.Worksheets; ++i) { var stype = "sheet"; if(wbrels && wbrels[i]) { path = 'xl/' + (wbrels[i][1]).replace(/[\/]?xl\//, ""); if(!safegetzipfile(zip, path)) path = wbrels[i][1]; if(!safegetzipfile(zip, path)) path = wbrelsfile.replace(/_rels\/.*$/,"") + wbrels[i][1]; stype = wbrels[i][2]; } else { path = 'xl/worksheets/sheet'+(i+1-nmode)+"." + wbext; path = path.replace(/sheet0\./,"sheet."); } relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels"); if(opts && opts.sheets != null) switch(typeof opts.sheets) { case "number": if(i != opts.sheets) continue wsloop; break; case "string": if(props.SheetNames[i].toLowerCase() != opts.sheets.toLowerCase()) continue wsloop; break; default: if(Array.isArray && Array.isArray(opts.sheets)) { var snjseen = false; for(var snj = 0; snj != opts.sheets.length; ++snj) { if(typeof opts.sheets[snj] == "number" && opts.sheets[snj] == i) snjseen=1; if(typeof opts.sheets[snj] == "string" && opts.sheets[snj].toLowerCase() == props.SheetNames[i].toLowerCase()) snjseen = 1; } if(!snjseen) continue wsloop; } } safe_parse_sheet(zip, path, relsPath, props.SheetNames[i], i, sheetRels, sheets, stype, opts, wb, themes, styles); } out = ({ Directory: dir, Workbook: wb, Props: props, Custprops: custprops, Deps: deps, Sheets: sheets, SheetNames: props.SheetNames, Strings: strs, Styles: styles, Themes: themes, SSF: dup(table_fmt) }/*:any*/); if(opts && opts.bookFiles) { if(zip.files) { out.keys = entries; out.files = zip.files; } else { out.keys = []; out.files = {}; zip.FullPaths.forEach(function(p, idx) { p = p.replace(/^Root Entry[\/]/, ""); out.keys.push(p); out.files[p] = zip.FileIndex[idx]; }); } } if(opts && opts.bookVBA) { if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true); else if(dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin',true); } return out; } /* [MS-OFFCRYPTO] 2.1.1 */ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ { var opts = _opts || {}; var f = 'Workbook', data = CFB.find(cfb, f); try { f = '/!DataSpaces/Version'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); /*var version = */parse_DataSpaceVersionInfo(data.content); /* 2.3.4.1 */ f = '/!DataSpaces/DataSpaceMap'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); var dsm = parse_DataSpaceMap(data.content); if(dsm.length !== 1 || dsm[0].comps.length !== 1 || dsm[0].comps[0].t !== 0 || dsm[0].name !== "StrongEncryptionDataSpace" || dsm[0].comps[0].v !== "EncryptedPackage") throw new Error("ECMA-376 Encrypted file bad " + f); /* 2.3.4.2 */ f = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); var seds = parse_DataSpaceDefinition(data.content); if(seds.length != 1 || seds[0] != "StrongEncryptionTransform") throw new Error("ECMA-376 Encrypted file bad " + f); /* 2.3.4.3 */ f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); /*var hdr = */parse_Primary(data.content); } catch(e) {} f = '/EncryptionInfo'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); var einfo = parse_EncryptionInfo(data.content); /* 2.3.4.4 */ f = '/EncryptedPackage'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); /*global decrypt_agile */ /*:: declare var decrypt_agile:any; */ if(einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || "", opts); /*global decrypt_std76 */ /*:: declare var decrypt_std76:any; */ if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || "", opts); throw new Error("File is password-protected"); } function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { if(opts.bookType == "ods") return write_ods(wb, opts); if(opts.bookType == "numbers") return write_numbers_iwa(wb, opts); if(opts.bookType == "xlsb") return write_zip_xlsxb(wb, opts); return write_zip_xlsx(wb, opts); } /* XLSX and XLSB writing are very similar. Originally they were unified in one export function. This is horrible for tree shaking in the common case (most applications need to export files in one format) so this function supports both formats while write_zip_xlsx only handles XLSX */ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { _shapeid = 1024; if(wb && !wb.SSF) { wb.SSF = dup(table_fmt); } if(wb && wb.SSF) { make_ssf(); SSF_load_table(wb.SSF); // $FlowIgnore opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0; opts.ssf = wb.SSF; } opts.rels = {}; opts.wbrels = {}; opts.Strings = /*::((*/[]/*:: :any):SST)*/; opts.Strings.Count = 0; opts.Strings.Unique = 0; if(browser_has_Map) opts.revStrings = new Map(); else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; } var wbext = opts.bookType == "xlsb" ? "bin" : "xml"; var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1; var ct = new_ct(); fix_write_opts(opts = opts || {}); var zip = zip_new(); var f = "", rId = 0; opts.cellXfs = []; get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}}); if(!wb.Props) wb.Props = {}; f = "docProps/core.xml"; zip_add_file(zip, f, write_core_props(wb.Props, opts)); ct.coreprops.push(f); add_rels(opts.rels, 2, f, RELS.CORE_PROPS); /*::if(!wb.Props) throw "unreachable"; */ f = "docProps/app.xml"; if(wb.Props && wb.Props.SheetNames){/* empty */} else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames; else { var _sn = []; for(var _i = 0; _i < wb.SheetNames.length; ++_i) if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]); wb.Props.SheetNames = _sn; } wb.Props.Worksheets = wb.Props.SheetNames.length; zip_add_file(zip, f, write_ext_props(wb.Props, opts)); ct.extprops.push(f); add_rels(opts.rels, 3, f, RELS.EXT_PROPS); if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) { f = "docProps/custom.xml"; zip_add_file(zip, f, write_cust_props(wb.Custprops, opts)); ct.custprops.push(f); add_rels(opts.rels, 4, f, RELS.CUST_PROPS); } for(rId=1;rId <= wb.SheetNames.length; ++rId) { var wsrels = {'!id':{}}; var ws = wb.Sheets[wb.SheetNames[rId-1]]; var _type = (ws || {})["!type"] || "sheet"; switch(_type) { case "chart": /* falls through */ default: f = "xl/worksheets/sheet" + rId + "." + wbext; zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels)); ct.sheets.push(f); add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]); } if(ws) { var comments = ws['!comments']; var need_vml = false; var cf = ""; if(comments && comments.length > 0) { cf = "xl/comments" + rId + "." + wbext; zip_add_file(zip, cf, write_cmnt(comments, cf, opts)); ct.comments.push(cf); add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT); need_vml = true; } if(ws['!legacy']) { if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); } delete ws['!comments']; delete ws['!legacy']; } if(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels)); } if(opts.Strings != null && opts.Strings.length > 0) { f = "xl/sharedStrings." + wbext; zip_add_file(zip, f, write_sst(opts.Strings, f, opts)); ct.strs.push(f); add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST); } f = "xl/workbook." + wbext; zip_add_file(zip, f, write_wb(wb, f, opts)); ct.workbooks.push(f); add_rels(opts.rels, 1, f, RELS.WB); /* TODO: something more intelligent with themes */ f = "xl/theme/theme1.xml"; zip_add_file(zip, f, write_theme(wb.Themes, opts)); ct.themes.push(f); add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME); /* TODO: something more intelligent with styles */ f = "xl/styles." + wbext; zip_add_file(zip, f, write_sty(wb, f, opts)); ct.styles.push(f); add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY); if(wb.vbaraw && vbafmt) { f = "xl/vbaProject.bin"; zip_add_file(zip, f, wb.vbaraw); ct.vba.push(f); add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA); } f = "xl/metadata." + wbext; zip_add_file(zip, f, write_xlmeta(f)); ct.metadata.push(f); add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA); zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts)); zip_add_file(zip, '_rels/.rels', write_rels(opts.rels)); zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels)); delete opts.revssf; delete opts.ssf; return zip; } function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { _shapeid = 1024; if(wb && !wb.SSF) { wb.SSF = dup(table_fmt); } if(wb && wb.SSF) { make_ssf(); SSF_load_table(wb.SSF); // $FlowIgnore opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0; opts.ssf = wb.SSF; } opts.rels = {}; opts.wbrels = {}; opts.Strings = /*::((*/[]/*:: :any):SST)*/; opts.Strings.Count = 0; opts.Strings.Unique = 0; if(browser_has_Map) opts.revStrings = new Map(); else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; } var wbext = "xml"; var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1; var ct = new_ct(); fix_write_opts(opts = opts || {}); var zip = zip_new(); var f = "", rId = 0; opts.cellXfs = []; get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}}); if(!wb.Props) wb.Props = {}; f = "docProps/core.xml"; zip_add_file(zip, f, write_core_props(wb.Props, opts)); ct.coreprops.push(f); add_rels(opts.rels, 2, f, RELS.CORE_PROPS); /*::if(!wb.Props) throw "unreachable"; */ f = "docProps/app.xml"; if(wb.Props && wb.Props.SheetNames){/* empty */} else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames; else { var _sn = []; for(var _i = 0; _i < wb.SheetNames.length; ++_i) if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]); wb.Props.SheetNames = _sn; } wb.Props.Worksheets = wb.Props.SheetNames.length; zip_add_file(zip, f, write_ext_props(wb.Props, opts)); ct.extprops.push(f); add_rels(opts.rels, 3, f, RELS.EXT_PROPS); if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) { f = "docProps/custom.xml"; zip_add_file(zip, f, write_cust_props(wb.Custprops, opts)); ct.custprops.push(f); add_rels(opts.rels, 4, f, RELS.CUST_PROPS); } var people = ["SheetJ5"]; opts.tcid = 0; for(rId=1;rId <= wb.SheetNames.length; ++rId) { var wsrels = {'!id':{}}; var ws = wb.Sheets[wb.SheetNames[rId-1]]; var _type = (ws || {})["!type"] || "sheet"; switch(_type) { case "chart": /* falls through */ default: f = "xl/worksheets/sheet" + rId + "." + wbext; zip_add_file(zip, f, write_ws_xml(rId-1, opts, wb, wsrels)); ct.sheets.push(f); add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]); } if(ws) { var comments = ws['!comments']; var need_vml = false; var cf = ""; if(comments && comments.length > 0) { var needtc = false; comments.forEach(function(carr) { carr[1].forEach(function(c) { if(c.T == true) needtc = true; }); }); if(needtc) { cf = "xl/threadedComments/threadedComment" + rId + "." + wbext; zip_add_file(zip, cf, write_tcmnt_xml(comments, people, opts)); ct.threadedcomments.push(cf); add_rels(wsrels, -1, "../threadedComments/threadedComment" + rId + "." + wbext, RELS.TCMNT); } cf = "xl/comments" + rId + "." + wbext; zip_add_file(zip, cf, write_comments_xml(comments, opts)); ct.comments.push(cf); add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT); need_vml = true; } if(ws['!legacy']) { if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments'])); } delete ws['!comments']; delete ws['!legacy']; } if(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels)); } if(opts.Strings != null && opts.Strings.length > 0) { f = "xl/sharedStrings." + wbext; zip_add_file(zip, f, write_sst_xml(opts.Strings, opts)); ct.strs.push(f); add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST); } f = "xl/workbook." + wbext; zip_add_file(zip, f, write_wb_xml(wb, opts)); ct.workbooks.push(f); add_rels(opts.rels, 1, f, RELS.WB); /* TODO: something more intelligent with themes */ f = "xl/theme/theme1.xml"; zip_add_file(zip, f, write_theme(wb.Themes, opts)); ct.themes.push(f); add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME); /* TODO: something more intelligent with styles */ f = "xl/styles." + wbext; zip_add_file(zip, f, write_sty_xml(wb, opts)); ct.styles.push(f); add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY); if(wb.vbaraw && vbafmt) { f = "xl/vbaProject.bin"; zip_add_file(zip, f, wb.vbaraw); ct.vba.push(f); add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA); } f = "xl/metadata." + wbext; zip_add_file(zip, f, write_xlmeta_xml()); ct.metadata.push(f); add_rels(opts.wbrels, -1, "metadata." + wbext, RELS.XLMETA); if(people.length > 1) { f = "xl/persons/person.xml"; zip_add_file(zip, f, write_people_xml(people, opts)); ct.people.push(f); add_rels(opts.wbrels, -1, "persons/person.xml", RELS.PEOPLE); } zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts)); zip_add_file(zip, '_rels/.rels', write_rels(opts.rels)); zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels)); delete opts.revssf; delete opts.ssf; return zip; } function firstbyte(f/*:RawData*/,o/*:?TypeOpts*/)/*:Array*/ { var x = ""; switch((o||{}).type || "base64") { case 'buffer': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]]; case 'base64': x = Base64_decode(f.slice(0,12)); break; case 'binary': x = f; break; case 'array': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]]; default: throw new Error("Unrecognized type " + (o && o.type || "undefined")); } return [x.charCodeAt(0), x.charCodeAt(1), x.charCodeAt(2), x.charCodeAt(3), x.charCodeAt(4), x.charCodeAt(5), x.charCodeAt(6), x.charCodeAt(7)]; } function read_cfb(cfb/*:CFBContainer*/, opts/*:?ParseOpts*/)/*:Workbook*/ { if(CFB.find(cfb, "EncryptedPackage")) return parse_xlsxcfb(cfb, opts); return parse_xlscfb(cfb, opts); } function read_zip(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ { var zip, d = data; var o = opts||{}; if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64"; zip = zip_read(d, o); return parse_zip(zip, o); } function read_plaintext(data/*:string*/, o/*:ParseOpts*/)/*:Workbook*/ { var i = 0; main: while(i < data.length) switch(data.charCodeAt(i)) { case 0x0A: case 0x0D: case 0x20: ++i; break; case 0x3C: return parse_xlml(data.slice(i),o); default: break main; } return PRN.to_workbook(data, o); } function read_plaintext_raw(data/*:RawData*/, o/*:ParseOpts*/)/*:Workbook*/ { var str = "", bytes = firstbyte(data, o); switch(o.type) { case 'base64': str = Base64_decode(data); break; case 'binary': str = data; break; case 'buffer': str = data.toString('binary'); break; case 'array': str = cc2str(data); break; default: throw new Error("Unrecognized type " + o.type); } if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str); o.type = "binary"; return read_plaintext(str, o); } function read_utf16(data/*:RawData*/, o/*:ParseOpts*/)/*:Workbook*/ { var d = data; if(o.type == 'base64') d = Base64_decode(d); d = $cptable.utils.decode(1200, d.slice(2), 'str'); o.type = "binary"; return read_plaintext(d, o); } function bstrify(data/*:string*/)/*:string*/ { return !data.match(/[^\x00-\x7F]/) ? data : utf8write(data); } function read_prn(data, d, o, str) { if(str) { o.type = "string"; return PRN.to_workbook(data, o); } return PRN.to_workbook(d, o); } function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ { reset_cp(); var o = opts||{}; if(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = "array", o)); if(typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && !o.type) o.type = typeof Deno !== "undefined" ? "buffer" : "array"; var d = data, n = [0,0,0,0], str = false; if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; } _ssfopts = {}; if(o.dateNF) _ssfopts.dateNF = o.dateNF; if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64"; if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); if(typeof Uint8Array !== 'undefined' && !has_buf) o.type = "array"; } if(o.type == "string") { str = true; o.type = "binary"; o.codepage = 65001; d = bstrify(data); } if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') { // $FlowIgnore var ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo="bar"; // $FlowIgnore if(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);} } switch((n = firstbyte(d, o))[0]) { case 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break; case 0x09: if(n[1] <= 0x08) return parse_xlscfb(d, o); break; case 0x3C: return parse_xlml(d, o); case 0x49: if(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error("TIFF Image File is not a spreadsheet"); if(n[1] === 0x44) return read_wb_ID(d, o); break; case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break; case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str); case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str); case 0xFF: if(n[1] === 0xFE) { return read_utf16(d, o); } else if(n[1] === 0x00 && n[2] === 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o); break; case 0x00: if(n[1] === 0x00) { if(n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o); if(n[2] === 0x00 && (n[3] === 0x08 || n[3] === 0x09)) return WK_.to_workbook(d, o); } break; case 0x03: case 0x83: case 0x8B: case 0x8C: return DBF.to_workbook(d, o); case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break; case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o); case 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error("PNG Image File is not a spreadsheet"); break; } if(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o); return read_prn(data, d, o, str); } function readFileSync(filename/*:string*/, opts/*:?ParseOpts*/)/*:Workbook*/ { var o = opts||{}; o.type = 'file'; return readSync(filename, o); } function write_cfb_ctr(cfb/*:CFBContainer*/, o/*:WriteOpts*/)/*:any*/ { switch(o.type) { case "base64": case "binary": break; case "buffer": case "array": o.type = ""; break; case "file": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : ""})); case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); default: throw new Error("Unrecognized type " + o.type); } return CFB.write(cfb, o); } /*:: declare var encrypt_agile:any; */ function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { var o = dup(opts||{}); var z = write_zip(wb, o); return write_zip_denouement(z, o); } function write_zip_typeXLSX(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { var o = dup(opts||{}); var z = write_zip_xlsx(wb, o); return write_zip_denouement(z, o); } function write_zip_denouement(z/*:any*/, o/*:?WriteOpts*/)/*:any*/ { var oopts = {}; var ftype = has_buf ? "nodebuffer" : (typeof Uint8Array !== "undefined" ? "array" : "string"); if(o.compression) oopts.compression = 'DEFLATE'; if(o.password) oopts.type = ftype; else switch(o.type) { case "base64": oopts.type = "base64"; break; case "binary": oopts.type = "string"; break; case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); case "buffer": case "file": oopts.type = ftype; break; default: throw new Error("Unrecognized type " + o.type); } var out = z.FullPaths ? CFB.write(z, {fileType:"zip", type: /*::(*/{"nodebuffer": "buffer", "string": "binary"}/*:: :any)*/[oopts.type] || oopts.type, compression: !!o.compression}) : z.generate(oopts); if(typeof Deno !== "undefined") { if(typeof out == "string") { if(o.type == "binary" || o.type == "base64") return out; out = new Uint8Array(s2ab(out)); } } /*jshint -W083 */ if(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef /*jshint +W083 */ if(o.type === "file") return write_dl(o.file, out); return o.type == "string" ? utf8read(/*::(*/out/*:: :any)*/) : out; } function write_cfb_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { var o = opts||{}; var cfb/*:CFBContainer*/ = write_xlscfb(wb, o); return write_cfb_ctr(cfb, o); } function write_string_type(out/*:string*/, opts/*:WriteOpts*/, bom/*:?string*/)/*:any*/ { if(!bom) bom = ""; var o = bom + out; switch(opts.type) { case "base64": return Base64_encode(utf8write(o)); case "binary": return utf8write(o); case "string": return out; case "file": return write_dl(opts.file, o, 'utf8'); case "buffer": { if(has_buf) return Buffer_from(o, 'utf8'); else if(typeof TextEncoder !== "undefined") return new TextEncoder().encode(o); else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); }); } } throw new Error("Unrecognized type " + opts.type); } function write_stxt_type(out/*:string*/, opts/*:WriteOpts*/)/*:any*/ { switch(opts.type) { case "base64": return Base64_encode(out); case "binary": return out; case "string": return out; /* override in sheet_to_txt */ case "file": return write_dl(opts.file, out, 'binary'); case "buffer": { if(has_buf) return Buffer_from(out, 'binary'); else return out.split("").map(function(c) { return c.charCodeAt(0); }); } } throw new Error("Unrecognized type " + opts.type); } /* TODO: test consistency */ function write_binary_type(out, opts/*:WriteOpts*/)/*:any*/ { switch(opts.type) { case "string": case "base64": case "binary": var bstr = ""; // $FlowIgnore for(var i = 0; i < out.length; ++i) bstr += String.fromCharCode(out[i]); return opts.type == 'base64' ? Base64_encode(bstr) : opts.type == 'string' ? utf8read(bstr) : bstr; case "file": return write_dl(opts.file, out); case "buffer": return out; default: throw new Error("Unrecognized type " + opts.type); } } function writeSyncXLSX(wb/*:Workbook*/, opts/*:?WriteOpts*/) { reset_cp(); check_wb(wb); var o = dup(opts||{}); if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; } if(o.type == "array") { o.type = "binary"; var out/*:string*/ = (writeSyncXLSX(wb, o)/*:any*/); o.type = "array"; return s2ab(out); } return write_zip_typeXLSX(wb, o); } function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) { reset_cp(); check_wb(wb); var o = dup(opts||{}); if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; } if(o.type == "array") { o.type = "binary"; var out/*:string*/ = (writeSync(wb, o)/*:any*/); o.type = "array"; return s2ab(out); } var idx = 0; if(o.sheet) { if(typeof o.sheet == "number") idx = o.sheet; else idx = wb.SheetNames.indexOf(o.sheet); if(!wb.SheetNames[idx]) throw new Error("Sheet not found: " + o.sheet + " : " + (typeof o.sheet)); } switch(o.bookType || 'xlsb') { case 'xml': case 'xlml': return write_string_type(write_xlml(wb, o), o); case 'slk': case 'sylk': return write_string_type(SYLK.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o); case 'htm': case 'html': return write_string_type(sheet_to_html(wb.Sheets[wb.SheetNames[idx]], o), o); case 'txt': return write_stxt_type(sheet_to_txt(wb.Sheets[wb.SheetNames[idx]], o), o); case 'csv': return write_string_type(sheet_to_csv(wb.Sheets[wb.SheetNames[idx]], o), o, "\ufeff"); case 'dif': return write_string_type(DIF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o); case 'dbf': return write_binary_type(DBF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o); case 'prn': return write_string_type(PRN.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o); case 'rtf': return write_string_type(RTF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o); case 'eth': return write_string_type(ETH.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o); case 'fods': return write_string_type(write_ods(wb, o), o); case 'wk1': return write_binary_type(WK_.sheet_to_wk1(wb.Sheets[wb.SheetNames[idx]], o), o); case 'wk3': return write_binary_type(WK_.book_to_wk3(wb, o), o); case 'biff2': if(!o.biff) o.biff = 2; /* falls through */ case 'biff3': if(!o.biff) o.biff = 3; /* falls through */ case 'biff4': if(!o.biff) o.biff = 4; return write_binary_type(write_biff_buf(wb, o), o); case 'biff5': if(!o.biff) o.biff = 5; /* falls through */ case 'biff8': case 'xla': case 'xls': if(!o.biff) o.biff = 8; return write_cfb_type(wb, o); case 'xlsx': case 'xlsm': case 'xlam': case 'xlsb': case 'numbers': case 'ods': return write_zip_type(wb, o); default: throw new Error ("Unrecognized bookType |" + o.bookType + "|"); } } function resolve_book_type(o/*:WriteFileOpts*/) { if(o.bookType) return; var _BT = { "xls": "biff8", "htm": "html", "slk": "sylk", "socialcalc": "eth", "Sh33tJS": "WTF" }; var ext = o.file.slice(o.file.lastIndexOf(".")).toLowerCase(); if(ext.match(/^\.[a-z]+$/)) o.bookType = ext.slice(1); o.bookType = _BT[o.bookType] || o.bookType; } function writeFileSync(wb/*:Workbook*/, filename/*:string*/, opts/*:?WriteFileOpts*/) { var o = opts||{}; o.type = 'file'; o.file = filename; resolve_book_type(o); return writeSync(wb, o); } function writeFileSyncXLSX(wb/*:Workbook*/, filename/*:string*/, opts/*:?WriteFileOpts*/) { var o = opts||{}; o.type = 'file'; o.file = filename; resolve_book_type(o); return writeSyncXLSX(wb, o); } function writeFileAsync(filename/*:string*/, wb/*:Workbook*/, opts/*:?WriteFileOpts*/, cb/*:?(e?:ErrnoError)=>void*/) { var o = opts||{}; o.type = 'file'; o.file = filename; resolve_book_type(o); o.type = 'buffer'; var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts/*:any*/); return _fs.writeFile(filename, writeSync(wb, o), _cb); } /*:: type MJRObject = { row: any; isempty: boolean; }; */ function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array*/, header/*:number*/, hdr/*:Array*/, dense/*:boolean*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ { var rr = encode_row(R); var defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw"); var isempty = true; var row/*:any*/ = (header === 1) ? [] : {}; if(header !== 1) { if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; } else row.__rowNum__ = R; } if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) { var val = dense ? sheet[R][C] : sheet[cols[C] + rr]; if(val === undefined || val.t === undefined) { if(defval === undefined) continue; if(hdr[C] != null) { row[hdr[C]] = defval; } continue; } var v = val.v; switch(val.t){ case 'z': if(v == null) break; continue; case 'e': v = (v == 0 ? null : void 0); break; case 's': case 'd': case 'b': case 'n': break; default: throw new Error('unrecognized type ' + val.t); } if(hdr[C] != null) { if(v == null) { if(val.t == "e" && v === null) row[hdr[C]] = null; else if(defval !== undefined) row[hdr[C]] = defval; else if(raw && v === null) row[hdr[C]] = null; else continue; } else { row[hdr[C]] = raw && (val.t !== "n" || (val.t === "n" && o.rawNumbers !== false)) ? v : format_cell(val,v,o); } if(v != null) isempty = false; } } return { row: row, isempty: isempty }; } function sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) { if(sheet == null || sheet["!ref"] == null) return []; var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array*/ = [], v=0, vv=""; var r = {s:{r:0,c:0},e:{r:0,c:0}}; var o = opts || {}; var range = o.range != null ? o.range : sheet["!ref"]; if(o.header === 1) header = 1; else if(o.header === "A") header = 2; else if(Array.isArray(o.header)) header = 3; else if(o.header == null) header = 0; switch(typeof range) { case 'string': r = safe_decode_range(range); break; case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break; default: r = range; } if(header > 0) offset = 0; var rr = encode_row(r.s.r); var cols/*:Array*/ = []; var out/*:Array*/ = []; var outi = 0, counter = 0; var dense = Array.isArray(sheet); var R = r.s.r, C = 0; var header_cnt = {}; if(dense && !sheet[R]) sheet[R] = []; var colinfo/*:Array*/ = o.skipHidden && sheet["!cols"] || []; var rowinfo/*:Array*/ = o.skipHidden && sheet["!rows"] || []; for(C = r.s.c; C <= r.e.c; ++C) { if(((colinfo[C]||{}).hidden)) continue; cols[C] = encode_col(C); val = dense ? sheet[R][C] : sheet[cols[C] + rr]; switch(header) { case 1: hdr[C] = C - r.s.c; break; case 2: hdr[C] = cols[C]; break; case 3: hdr[C] = o.header[C - r.s.c]; break; default: if(val == null) val = {w: "__EMPTY", t: "s"}; vv = v = format_cell(val, null, o); counter = header_cnt[v] || 0; if(!counter) header_cnt[v] = 1; else { do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter; header_cnt[vv] = 1; } hdr[C] = vv; } } for (R = r.s.r + offset; R <= r.e.r; ++R) { if ((rowinfo[R]||{}).hidden) continue; var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o); if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row; } out.length = outi; return out; } var qreg = /"/g; function make_csv_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array*/, fs/*:number*/, rs/*:number*/, FS/*:string*/, o/*:Sheet2CSVOpts*/)/*:?string*/ { var isempty = true; var row/*:Array*/ = [], txt = "", rr = encode_row(R); for(var C = r.s.c; C <= r.e.c; ++C) { if (!cols[C]) continue; var val = o.dense ? (sheet[R]||[])[C]: sheet[cols[C] + rr]; if(val == null) txt = ""; else if(val.v != null) { isempty = false; txt = ''+(o.rawNumbers && val.t == "n" ? val.v : format_cell(val, null, o)); for(var i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34 || o.forceQuotes) {txt = "\"" + txt.replace(qreg, '""') + "\""; break; } if(txt == "ID") txt = '"ID"'; } else if(val.f != null && !val.F) { isempty = false; txt = '=' + val.f; if(txt.indexOf(",") >= 0) txt = '"' + txt.replace(qreg, '""') + '"'; } else txt = ""; /* NOTE: Excel CSV does not support array formulae */ row.push(txt); } if(o.blankrows === false && isempty) return null; return row.join(FS); } function sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ { var out/*:Array*/ = []; var o = opts == null ? {} : opts; if(sheet == null || sheet["!ref"] == null) return ""; var r = safe_decode_range(sheet["!ref"]); var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0); var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); var row = "", cols/*:Array*/ = []; o.dense = Array.isArray(sheet); var colinfo/*:Array*/ = o.skipHidden && sheet["!cols"] || []; var rowinfo/*:Array*/ = o.skipHidden && sheet["!rows"] || []; for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C); var w = 0; for(var R = r.s.r; R <= r.e.r; ++R) { if ((rowinfo[R]||{}).hidden) continue; row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o); if(row == null) { continue; } if(o.strip) row = row.replace(endregex,""); if(row || (o.blankrows !== false)) out.push((w++ ? RS : "") + row); } delete o.dense; return out.join(""); } function sheet_to_txt(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) { if(!opts) opts = {}; opts.FS = "\t"; opts.RS = "\n"; var s = sheet_to_csv(sheet, opts); if(typeof $cptable == 'undefined' || opts.type == 'string') return s; var o = $cptable.utils.encode(1200, s, 'str'); return String.fromCharCode(255) + String.fromCharCode(254) + o; } function sheet_to_formulae(sheet/*:Worksheet*/)/*:Array*/ { var y = "", x, val=""; if(sheet == null || sheet["!ref"] == null) return []; var r = safe_decode_range(sheet['!ref']), rr = "", cols/*:Array*/ = [], C; var cmds/*:Array*/ = []; var dense = Array.isArray(sheet); for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); for(var R = r.s.r; R <= r.e.r; ++R) { rr = encode_row(R); for(C = r.s.c; C <= r.e.c; ++C) { y = cols[C] + rr; x = dense ? (sheet[R]||[])[C] : sheet[y]; val = ""; if(x === undefined) continue; else if(x.F != null) { y = x.F; if(!x.f) continue; val = x.f; if(y.indexOf(":") == -1) y = y + ":" + y; } if(x.f != null) val = x.f; else if(x.t == 'z') continue; else if(x.t == 'n' && x.v != null) val = "" + x.v; else if(x.t == 'b') val = x.v ? "TRUE" : "FALSE"; else if(x.w !== undefined) val = "'" + x.w; else if(x.v === undefined) continue; else if(x.t == 's') val = "'" + x.v; else val = ""+x.v; cmds[cmds.length] = y + "=" + val; } } return cmds; } function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array*/, opts)/*:Worksheet*/ { var o = opts || {}; var offset = +!o.skipHeader; var ws/*:Worksheet*/ = _ws || ({}/*:any*/); var _R = 0, _C = 0; if(ws && o.origin != null) { if(typeof o.origin == 'number') _R = o.origin; else { var _origin/*:CellAddress*/ = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin; _R = _origin.r; _C = _origin.c; } } var cell/*:Cell*/; var range/*:Range*/ = ({s: {c:0, r:0}, e: {c:_C, r:_R + js.length - 1 + offset}}/*:any*/); if(ws['!ref']) { var _range = safe_decode_range(ws['!ref']); range.e.c = Math.max(range.e.c, _range.e.c); range.e.r = Math.max(range.e.r, _range.e.r); if(_R == -1) { _R = _range.e.r + 1; range.e.r = _R + js.length - 1 + offset; } } else { if(_R == -1) { _R = 0; range.e.r = js.length - 1 + offset; } } var hdr/*:Array*/ = o.header || [], C = 0; js.forEach(function (JS, R/*:number*/) { keys(JS).forEach(function(k) { if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k; var v = JS[k]; var t = 'z'; var z = ""; var ref = encode_cell({c:_C + C,r:_R + R + offset}); cell = ws_get_cell_stub(ws, ref); if(v && typeof v === 'object' && !(v instanceof Date)){ ws[ref] = v; } else { if(typeof v == 'number') t = 'n'; else if(typeof v == 'boolean') t = 'b'; else if(typeof v == 'string') t = 's'; else if(v instanceof Date) { t = 'd'; if(!o.cellDates) { t = 'n'; v = datenum(v); } z = (o.dateNF || table_fmt[14]); } else if(v === null && o.nullError) { t = 'e'; v = 0; } if(!cell) ws[ref] = cell = ({t:t, v:v}/*:any*/); else { cell.t = t; cell.v = v; delete cell.w; delete cell.R; if(z) cell.z = z; } if(z) cell.z = z; } }); }); range.e.c = Math.max(range.e.c, _C + hdr.length - 1); var __R = encode_row(_R); if(offset) for(C = 0; C < hdr.length; ++C) ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]}; ws['!ref'] = encode_range(range); return ws; } function json_to_sheet(js/*:Array*/, opts)/*:Worksheet*/ { return sheet_add_json(null, js, opts); } /* get cell, creating a stub if necessary */ function ws_get_cell_stub(ws/*:Worksheet*/, R, C/*:?number*/)/*:Cell*/ { /* A1 cell address */ if(typeof R == "string") { /* dense */ if(Array.isArray(ws)) { var RC = decode_cell(R); if(!ws[RC.r]) ws[RC.r] = []; return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'}); } return ws[R] || (ws[R] = {t:'z'}); } /* cell address object */ if(typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R)); /* R and C are 0-based indices */ return ws_get_cell_stub(ws, encode_cell({r:R,c:C||0})); } /* find sheet index for given name / validate index */ function wb_sheet_idx(wb/*:Workbook*/, sh/*:number|string*/) { if(typeof sh == "number") { if(sh >= 0 && wb.SheetNames.length > sh) return sh; throw new Error("Cannot find sheet # " + sh); } else if(typeof sh == "string") { var idx = wb.SheetNames.indexOf(sh); if(idx > -1) return idx; throw new Error("Cannot find sheet name |" + sh + "|"); } else throw new Error("Cannot find sheet |" + sh + "|"); } /* simple blank workbook object */ function book_new()/*:Workbook*/ { return { SheetNames: [], Sheets: {} }; } /* add a worksheet to the end of a given workbook */ function book_append_sheet(wb/*:Workbook*/, ws/*:Worksheet*/, name/*:?string*/, roll/*:?boolean*/)/*:string*/ { var i = 1; if(!name) for(; i <= 0xFFFF; ++i, name = undefined) if(wb.SheetNames.indexOf(name = "Sheet" + i) == -1) break; if(!name || wb.SheetNames.length >= 0xFFFF) throw new Error("Too many worksheets"); if(roll && wb.SheetNames.indexOf(name) >= 0) { var m = name.match(/(^.*?)(\d+)$/); i = m && +m[2] || 0; var root = m && m[1] || name; for(++i; i <= 0xFFFF; ++i) if(wb.SheetNames.indexOf(name = root + i) == -1) break; } check_ws_name(name); if(wb.SheetNames.indexOf(name) >= 0) throw new Error("Worksheet with name |" + name + "| already exists!"); wb.SheetNames.push(name); wb.Sheets[name] = ws; return name; } /* set sheet visibility (visible/hidden/very hidden) */ function book_set_sheet_visibility(wb/*:Workbook*/, sh/*:number|string*/, vis/*:number*/) { if(!wb.Workbook) wb.Workbook = {}; if(!wb.Workbook.Sheets) wb.Workbook.Sheets = []; var idx = wb_sheet_idx(wb, sh); // $FlowIgnore if(!wb.Workbook.Sheets[idx]) wb.Workbook.Sheets[idx] = {}; switch(vis) { case 0: case 1: case 2: break; default: throw new Error("Bad sheet visibility setting " + vis); } // $FlowIgnore wb.Workbook.Sheets[idx].Hidden = vis; } /* set number format */ function cell_set_number_format(cell/*:Cell*/, fmt/*:string|number*/) { cell.z = fmt; return cell; } /* set cell hyperlink */ function cell_set_hyperlink(cell/*:Cell*/, target/*:string*/, tooltip/*:?string*/) { if(!target) { delete cell.l; } else { cell.l = ({ Target: target }/*:Hyperlink*/); if(tooltip) cell.l.Tooltip = tooltip; } return cell; } function cell_set_internal_link(cell/*:Cell*/, range/*:string*/, tooltip/*:?string*/) { return cell_set_hyperlink(cell, "#" + range, tooltip); } /* add to cell comments */ function cell_add_comment(cell/*:Cell*/, text/*:string*/, author/*:?string*/) { if(!cell.c) cell.c = []; cell.c.push({t:text, a:author||"SheetJS"}); } /* set array formula and flush related cells */ function sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dynamic/*:boolean*/) { var rng = typeof range != "string" ? range : safe_decode_range(range); var rngstr = typeof range == "string" ? range : encode_range(range); for(var R = rng.s.r; R <= rng.e.r; ++R) for(var C = rng.s.c; C <= rng.e.c; ++C) { var cell = ws_get_cell_stub(ws, R, C); cell.t = 'n'; cell.F = rngstr; delete cell.v; if(R == rng.s.r && C == rng.s.c) { cell.f = formula; if(dynamic) cell.D = true; } } return ws; } var utils/*:any*/ = { encode_col: encode_col, encode_row: encode_row, encode_cell: encode_cell, encode_range: encode_range, decode_col: decode_col, decode_row: decode_row, split_cell: split_cell, decode_cell: decode_cell, decode_range: decode_range, format_cell: format_cell, sheet_add_aoa: sheet_add_aoa, sheet_add_json: sheet_add_json, sheet_add_dom: sheet_add_dom, aoa_to_sheet: aoa_to_sheet, json_to_sheet: json_to_sheet, table_to_sheet: parse_dom_table, table_to_book: table_to_book, sheet_to_csv: sheet_to_csv, sheet_to_txt: sheet_to_txt, sheet_to_json: sheet_to_json, sheet_to_html: sheet_to_html, sheet_to_formulae: sheet_to_formulae, sheet_to_row_object_array: sheet_to_json, sheet_get_cell: ws_get_cell_stub, book_new: book_new, book_append_sheet: book_append_sheet, book_set_sheet_visibility: book_set_sheet_visibility, cell_set_number_format: cell_set_number_format, cell_set_hyperlink: cell_set_hyperlink, cell_set_internal_link: cell_set_internal_link, cell_add_comment: cell_add_comment, sheet_set_array_formula: sheet_set_array_formula, consts: { SHEET_VISIBLE: 0, SHEET_HIDDEN: 1, SHEET_VERY_HIDDEN: 2 } }; var _Readable; function set_readable(R) { _Readable = R; } function write_csv_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) { var stream = _Readable(); var o = opts == null ? {} : opts; if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; } var r = safe_decode_range(sheet["!ref"]); var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0); var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$"); var row/*:?string*/ = "", cols/*:Array*/ = []; o.dense = Array.isArray(sheet); var colinfo/*:Array*/ = o.skipHidden && sheet["!cols"] || []; var rowinfo/*:Array*/ = o.skipHidden && sheet["!rows"] || []; for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C); var R = r.s.r; var BOM = false, w = 0; stream._read = function() { if(!BOM) { BOM = true; return stream.push("\uFEFF"); } while(R <= r.e.r) { ++R; if ((rowinfo[R-1]||{}).hidden) continue; row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o); if(row != null) { if(o.strip) row = row.replace(endregex,""); if(row || (o.blankrows !== false)) return stream.push((w++ ? RS : "") + row); } } return stream.push(null); }; return stream; } function write_html_stream(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/) { var stream = _Readable(); var o = opts || {}; var header = o.header != null ? o.header : HTML_BEGIN; var footer = o.footer != null ? o.footer : HTML_END; stream.push(header); var r = decode_range(ws['!ref']); o.dense = Array.isArray(ws); stream.push(make_html_preamble(ws, r, o)); var R = r.s.r; var end = false; stream._read = function() { if(R > r.e.r) { if(!end) { end = true; stream.push("" + footer); } return stream.push(null); } while(R <= r.e.r) { stream.push(make_html_row(ws, r, R, o)); ++R; break; } }; return stream; } function write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) { var stream = _Readable({objectMode:true}); if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; } var val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array*/ = [], v=0, vv=""; var r = {s:{r:0,c:0},e:{r:0,c:0}}; var o = opts || {}; var range = o.range != null ? o.range : sheet["!ref"]; if(o.header === 1) header = 1; else if(o.header === "A") header = 2; else if(Array.isArray(o.header)) header = 3; switch(typeof range) { case 'string': r = safe_decode_range(range); break; case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break; default: r = range; } if(header > 0) offset = 0; var rr = encode_row(r.s.r); var cols/*:Array*/ = []; var counter = 0; var dense = Array.isArray(sheet); var R = r.s.r, C = 0; var header_cnt = {}; if(dense && !sheet[R]) sheet[R] = []; var colinfo/*:Array*/ = o.skipHidden && sheet["!cols"] || []; var rowinfo/*:Array*/ = o.skipHidden && sheet["!rows"] || []; for(C = r.s.c; C <= r.e.c; ++C) { if(((colinfo[C]||{}).hidden)) continue; cols[C] = encode_col(C); val = dense ? sheet[R][C] : sheet[cols[C] + rr]; switch(header) { case 1: hdr[C] = C - r.s.c; break; case 2: hdr[C] = cols[C]; break; case 3: hdr[C] = o.header[C - r.s.c]; break; default: if(val == null) val = {w: "__EMPTY", t: "s"}; vv = v = format_cell(val, null, o); counter = header_cnt[v] || 0; if(!counter) header_cnt[v] = 1; else { do { vv = v + "_" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter; header_cnt[vv] = 1; } hdr[C] = vv; } } R = r.s.r + offset; stream._read = function() { while(R <= r.e.r) { if ((rowinfo[R-1]||{}).hidden) continue; var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o); ++R; if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) { stream.push(row.row); return; } } return stream.push(null); }; return stream; } var __stream = { to_json: write_json_stream, to_html: write_html_stream, to_csv: write_csv_stream, set_readable: set_readable }; const version = XLSX.version; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfeGxzeF94bHN4X21qcy52b2x1bnRlZXJhcGkuNTYyODk4NTczYmZhOTVkNGQ3NTcuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELHlDQUF5Qyx5Q0FBeUM7QUFDbEYsd0JBQXdCOztBQUV4Qix1Q0FBdUMsdUJBQXVCO0FBQzlELHNCQUFzQixjQUFjOztBQUVwQyx5REFBeUQsOEJBQThCLGtDQUFrQyxTQUFTLGdDQUFnQzs7QUFFbEs7QUFDQTtBQUNBLGdCQUFnQixzQkFBc0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isc0JBQXNCO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0RBQXdEO0FBQ3hELHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHVCQUF1QjtBQUMzRDtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3VCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QjtBQUNyRCw2QkFBNkIsMEJBQTBCO0FBQ3ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2RUFBNkUsNkJBQTZCLHdDQUF3Qzs7QUFFbEo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxjQUFjLGdCQUFnQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUksU0FBUyxNQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3Qyw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpQ0FBaUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsYUFBYTtBQUNsQywrQkFBK0IsYUFBYTtBQUM1Qyx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsbUJBQW1CO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLGVBQWU7QUFDZixVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsVUFBVTtBQUNwQyxrQkFBa0I7QUFDbEI7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQix3QkFBd0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsRUFBRSxXQUFXLHFCQUFxQixTQUFTO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsMEJBQTBCO0FBQzFCO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsMEJBQTBCO0FBQzFCLGdCQUFnQixlQUFlO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVEQUF1RDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osc0JBQXNCLGtCQUFrQjtBQUN4Qyw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7O0FBRUEsaUNBQWlDO0FBQ2pDLDhCQUE4QjtBQUM5QiwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLFVBQVU7QUFDM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDLCtCQUErQjtBQUMvQjtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLHlCQUF5QixhQUFhLE9BQU87QUFDN0MseUJBQXlCLGFBQWEsT0FBTztBQUM3QztBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQix3QkFBd0IsT0FBTztBQUMvQjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBLHdDQUF3QztBQUN4Qyw2QkFBNkI7O0FBRTdCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkIsdUJBQXVCLGFBQWEsWUFBWSxlQUFlO0FBQy9ELDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWEsb0JBQW9CO0FBQ2pDLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hELHNHQUFzRztBQUN0RztBQUNBLDJDQUEyQztBQUMzQyw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRztBQUNsRyxpR0FBaUc7QUFDakcsbURBQW1EO0FBQ25ELDhDQUE4QyxrQ0FBa0M7QUFDaEY7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLFlBQVk7QUFDWixVQUFVLHdCQUF3QjtBQUNsQzs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxtQ0FBbUM7QUFDekU7QUFDQTtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDLGtCQUFrQixTQUFTLFVBQVUsK0JBQStCLFFBQVE7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsT0FBTztBQUN4RCxxREFBcUQsdUJBQXVCO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDRCQUE0QjtBQUN4QztBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUI7QUFDQTtBQUNBLDhDQUE4QyxtQkFBbUI7QUFDakUsYUFBYSxnQkFBZ0I7QUFDN0I7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsa0NBQWtDO0FBQ2xDLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLE9BQU87QUFDakI7O0FBRUEsbUJBQW1CLG9CQUFvQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQixVQUFVLGlCQUFpQjtBQUMzQjtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBLHlGQUF5RjtBQUN6Rix1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLCtCQUErQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwrQkFBK0IsbUNBQW1DO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsNkNBQTZDO0FBQzFELEVBQUU7QUFDRjtBQUNBLHFDQUFxQywwQkFBMEI7QUFDL0QsK0NBQStDLHdFQUF3RTtBQUN2SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVMsdUJBQXVCO0FBQ2hDO0FBQ0E7QUFDQSw4QkFBOEIsc0JBQXNCLHFCQUFxQiw4QkFBOEIsS0FBSztBQUM1RztBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EsMkNBQTJDLE1BQU07QUFDakQ7QUFDQTtBQUNBO0FBQ0EsYUFBYSxrQkFBa0I7QUFDL0IscUJBQXFCO0FBQ3JCLG1EQUFtRCxpQkFBaUI7QUFDcEU7QUFDQSwwQ0FBMEM7QUFDMUMseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSwrRUFBK0UsZ0NBQWdDO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFFBQVE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLG9EQUFvRDtBQUNwRCxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxxQkFBcUI7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGtCQUFrQjtBQUMvQixtREFBbUQsVUFBVTtBQUM3RDtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xELHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0EseURBQXlEO0FBQ3pELHFCQUFxQjtBQUNyQixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLHFCQUFxQjtBQUNyQixxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGtDQUFrQywwQkFBMEI7QUFDNUQ7QUFDQSxtQ0FBbUMsWUFBWSxHQUFHLFdBQVc7QUFDN0QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTs7QUFFQSwrREFBK0Q7O0FBRS9EO0FBQ0EsYUFBYSxlQUFlLGVBQWU7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHVCQUF1QixTQUFTLEdBQUc7QUFDcEUsNkNBQTZDO0FBQzdDLG9DQUFvQztBQUNwQyxrREFBa0Q7QUFDbEQsMERBQTBELE9BQU8sVUFBVTtBQUMzRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLDZCQUE2QjtBQUM3QixrREFBa0Q7QUFDbEQseURBQXlEO0FBQ3pEO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0Esd0NBQXdDLEtBQUssRUFBRTtBQUMvQztBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25CLG1CQUFtQixHQUFHLE1BQU07QUFDNUI7QUFDQTs7QUFFQSxtQkFBbUIsNkJBQTZCLDZCQUE2QjtBQUM3RSxxQkFBcUIsWUFBWTtBQUNqQyxzQkFBc0IsWUFBWTtBQUNsQyw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHVCQUF1QjtBQUNoQyx1Q0FBdUMsZUFBZSxPQUFPO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixlQUFlLE9BQU87QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkRBQTZEO0FBQzdELCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFlBQVk7QUFDbEM7QUFDQSx1QkFBdUIsWUFBWTtBQUNuQyw4QkFBOEIsUUFBUTtBQUN0QztBQUNBLGlCQUFpQix5QkFBeUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSw0Q0FBNEM7QUFDNUMsNENBQTRDOztBQUU1QztBQUNBO0FBQ0EsU0FBUyx1QkFBdUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0QsZUFBZTtBQUNmO0FBQ0EsNkNBQTZDO0FBQzdDLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RCx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEO0FBQzNELDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFlBQVk7QUFDakMsc0JBQXNCLFlBQVk7QUFDbEMseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQSxvQkFBb0IsV0FBVztBQUMvQixhQUFhLGFBQWEsV0FBVyxjQUFjO0FBQ25EO0FBQ0E7QUFDQSxxQ0FBcUMsWUFBWTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFFBQVE7QUFDaEI7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsdUNBQXVDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZCxPQUFPLGlCQUFpQjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQiwwRUFBMEU7O0FBRXJHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsMEJBQTBCLElBQUksU0FBUyxNQUFNLFVBQVU7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEMsb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQSx3RUFBd0UsY0FBYztBQUN0Riw0QkFBNEIsY0FBYztBQUMxQyxXQUFXLGNBQWM7QUFDekIsMEJBQTBCLGNBQWM7QUFDeEMsMkJBQTJCLGNBQWM7QUFDekMsc0NBQXNDLGNBQWMscUNBQXFDO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QiwrQ0FBK0M7QUFDNUUsc0JBQXNCLGNBQWM7QUFDcEMsV0FBVyxjQUFjO0FBQ3pCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsdUJBQXVCO0FBQzdDLHdCQUF3QixRQUFRO0FBQ2hDLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esd0JBQXdCLE9BQU8sT0FBTyxLQUFLO0FBQzNDO0FBQ0EsY0FBYyxpQkFBaUI7QUFDL0IsbURBQW1EO0FBQ25ELDhFQUE4RTtBQUM5RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLDJCQUEyQjtBQUMzQjtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOERBQThEOztBQUU5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixZQUFZO0FBQ2pDO0FBQ0Esc0JBQXNCLFlBQVk7QUFDbEMsNkJBQTZCLFFBQVE7QUFDckM7QUFDQSxrQ0FBa0MsdUJBQXVCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLGlCQUFpQjs7QUFFakIsa0JBQWtCLElBQUksU0FBUyxNQUFNO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixPQUFPO0FBQ3RDLHFDQUFxQyxPQUFPO0FBQzVDLDZCQUE2QixPQUFPO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLG1CQUFtQixJQUFJLFNBQVMsTUFBTTtBQUN0QyxzQkFBc0Isb0NBQW9DO0FBQzFEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBLHNCQUFzQixlQUFlO0FBQ3JDLHlDQUF5QztBQUN6Qyx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QixrQkFBa0IsSUFBSSxTQUFTLE1BQU07QUFDckMscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsK0JBQStCO0FBQ2hFO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakMsa0JBQWtCO0FBQ2xCO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsOEJBQThCLGNBQWM7QUFDNUM7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsWUFBWTtBQUNyQztBQUNBLDBCQUEwQixnQkFBZ0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDBCQUEwQiwwQkFBMEIsMENBQTBDOztBQUU5RjtBQUNBLGFBQWEsMEJBQTBCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixZQUFZO0FBQ3RDO0FBQ0EsMkJBQTJCLGdCQUFnQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMEJBQTBCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLEdBQUcsUUFBUSxJQUFJO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLFFBQVEsR0FBRyxVQUFVO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGdDQUFnQyw0Q0FBNEM7QUFDNUU7QUFDQSxnREFBZ0Q7QUFDaEQsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxNQUFNOztBQUVOLDBDQUEwQztBQUMxQywwQ0FBMEM7QUFDMUMsbURBQW1EOztBQUVuRDtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsOEJBQThCLDBGQUEwRjtBQUN4SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsWUFBWSxRQUFRLEdBQUcsVUFBVTtBQUNqQywrQkFBK0IsdUJBQXVCO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLGdDQUFnQztBQUNoQywrQkFBK0I7QUFDL0IsZ0NBQWdDO0FBQ2hDLGlDQUFpQztBQUNqQyxrQ0FBa0M7QUFDbEMsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxjQUFjLGlCQUFpQjtBQUN0RSw0Q0FBNEMsY0FBYyxpQkFBaUI7QUFDM0U7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsTUFBTSxLQUFLO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLCtDQUErQyxZQUFZO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixpQkFBaUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLHdCQUF3QjtBQUNsRCwwQkFBMEIsU0FBUztBQUNuQywwQkFBMEIsY0FBYztBQUN4QywwQkFBMEIsZUFBZTtBQUN6QywwQkFBMEIsV0FBVztBQUNyQywwQkFBMEIsVUFBVTtBQUNwQywwQkFBMEIsMEJBQTBCO0FBQ3BELDBCQUEwQixhQUFhO0FBQ3ZDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixZQUFZO0FBQ3RDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixVQUFVO0FBQ3BDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQiw4QkFBOEI7QUFDeEQsMEJBQTBCLDRCQUE0QjtBQUN0RCwwQkFBMEIsMEJBQTBCO0FBQ3BELDBCQUEwQiw4QkFBOEI7QUFDeEQsMEJBQTBCLFdBQVc7QUFDckMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLGFBQWE7QUFDdkMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLGFBQWE7QUFDdkMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLFdBQVc7QUFDckMsMEJBQTBCLGFBQWE7QUFDdkMsMEJBQTBCLGNBQWM7QUFDeEMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLGFBQWE7QUFDdkMsMEJBQTBCLFdBQVc7QUFDckMsMEJBQTBCLFlBQVk7QUFDdEMsMEJBQTBCLGVBQWU7QUFDekMsMEJBQTBCLGlCQUFpQjtBQUMzQywwQkFBMEIsZUFBZTtBQUN6QywwQkFBMEIsWUFBWTtBQUN0QywwQkFBMEIsMkJBQTJCO0FBQ3JELDBCQUEwQixjQUFjO0FBQ3hDLDBCQUEwQixZQUFZO0FBQ3RDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixZQUFZO0FBQ3RDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixVQUFVO0FBQ3BDLDBCQUEwQixjQUFjO0FBQ3hDLDBCQUEwQixZQUFZO0FBQ3RDLDBCQUEwQixZQUFZO0FBQ3RDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixZQUFZO0FBQ3RDLDBCQUEwQixXQUFXO0FBQ3JDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixhQUFhO0FBQ3ZDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixzQ0FBc0M7QUFDaEUsMEJBQTBCLHNDQUFzQztBQUNoRSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQSwwQkFBMEIsU0FBUztBQUNuQywwQkFBMEIsU0FBUztBQUNuQywwQkFBMEIsY0FBYztBQUN4QywwQkFBMEIsYUFBYTtBQUN2QywwQkFBMEIsZUFBZTtBQUN6QywwQkFBMEIsa0JBQWtCO0FBQzVDLDBCQUEwQixpQkFBaUI7QUFDM0MsMEJBQTBCLGlCQUFpQjtBQUMzQywwQkFBMEIsa0JBQWtCO0FBQzVDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixpQkFBaUI7QUFDM0MsMEJBQTBCLGVBQWU7QUFDekMsMEJBQTBCLGdCQUFnQjtBQUMxQywwQkFBMEIsY0FBYztBQUN4QywwQkFBMEIsa0JBQWtCO0FBQzVDLDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQixpQkFBaUI7QUFDM0MsMEJBQTBCLGVBQWU7QUFDekMsMEJBQTBCLGlCQUFpQjtBQUMzQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsYUFBYTtBQUN2QywwQkFBMEIsWUFBWTtBQUN0QywwQkFBMEIsOEJBQThCO0FBQ3hELDBCQUEwQixpQ0FBaUM7QUFDM0QsMEJBQTBCLGlDQUFpQztBQUMzRCwwQkFBMEIsa0NBQWtDO0FBQzVELDBCQUEwQixlQUFlO0FBQ3pDLDBCQUEwQiw4QkFBOEI7QUFDeEQsMEJBQTBCLGlCQUFpQjtBQUMzQywwQkFBMEIsaUJBQWlCO0FBQzNDLDBCQUEwQixpQkFBaUI7QUFDM0MsMEJBQTBCLFNBQVM7QUFDbkMsMEJBQTBCLGFBQWE7QUFDdkMsMEJBQTBCLFdBQVc7QUFDckMsMEJBQTBCLGlCQUFpQjtBQUMzQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsaUNBQWlDO0FBQzNELDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixpQ0FBaUM7QUFDM0QsMEJBQTBCLG1DQUFtQztBQUM3RCwwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsUUFBUTtBQUNsQywwQkFBMEIsc0NBQXNDO0FBQ2hFLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixRQUFRO0FBQ2xDLDBCQUEwQixzQ0FBc0M7QUFDaEUsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEMsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsWUFBWSxhQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQywrREFBK0Q7QUFDL0QsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakIscUJBQXFCLDJCQUEyQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsYUFBYTtBQUMxRjtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0RBQW9EO0FBQ3BELG1FQUFtRTtBQUNuRSxzREFBc0Q7QUFDdEQsb0RBQW9EO0FBQ3BELGdEQUFnRDtBQUNoRDs7QUFFQSxlQUFlLG1CQUFtQjtBQUNsQyxlQUFlLG1CQUFtQjtBQUNsQyxvQkFBb0IsbUJBQW1COztBQUV2QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsK0JBQStCOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHFCQUFxQjtBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixnQkFBZ0IsaUJBQWlCLE9BQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsbUJBQW1CO0FBQ3pDO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0EsK0JBQStCLHNEQUFzRDtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFLDBDQUEwQztBQUMxQywyRUFBMkU7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYLGNBQWM7QUFDZCx5Q0FBeUM7QUFDekMsNkNBQTZDO0FBQzdDO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsY0FBYyxHQUFHO0FBQ25FLG1FQUFtRSw2Q0FBNkM7QUFDaEgsK0RBQStEO0FBQy9EOztBQUVBLHdDQUF3QztBQUN4QztBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsOEJBQThCO0FBQzlCLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxVQUFVO0FBQ3RCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qix1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFFBQVE7QUFDekM7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isc0JBQXNCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWSw4REFBOEQ7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLDZCQUE2QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwrQ0FBK0MsV0FBVztBQUN0RTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0EsMEJBQTBCLElBQUksU0FBUyxNQUFNLHdCQUF3QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsNEJBQTRCLFNBQVM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLHFCQUFxQixZQUFZO0FBQ2pDO0FBQ0Esc0JBQXNCLFlBQVk7QUFDbEM7QUFDQSxrQkFBa0IsWUFBWTtBQUM5Qiw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsTUFBTTtBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQyxrQ0FBa0M7QUFDbEMsa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLGFBQWEsYUFBYTtBQUN4RCw4QkFBOEIsYUFBYSxhQUFhO0FBQ3hELDhCQUE4QixhQUFhLGFBQWE7QUFDeEQsOEJBQThCLGFBQWEsYUFBYTtBQUN4RCw4QkFBOEIsYUFBYSxhQUFhO0FBQ3hELDhCQUE4QixhQUFhLGFBQWE7QUFDeEQ7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLHVCQUF1QjtBQUN2QiwyQkFBMkI7QUFDM0IsMEJBQTBCO0FBQzFCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLGFBQWEsMkRBQTJELDhDQUE4QztBQUMxSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHlCQUF5QjtBQUN6RDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUI7QUFDckIscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSx5QkFBeUI7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFdBQVc7O0FBRS9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBLDJEQUEyRDtBQUMzRCwrQkFBK0I7O0FBRS9CO0FBQ0EsNkRBQTZEO0FBQzdELGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MscURBQXFEO0FBQ3JELHFEQUFxRDtBQUNyRCxNQUFNO0FBQ04sb0NBQW9DOztBQUVwQztBQUNBLGtFQUFrRTtBQUNsRSxzQ0FBc0M7O0FBRXRDO0FBQ0Esb0VBQW9FO0FBQ3BFLHdDQUF3Qzs7QUFFeEM7QUFDQSxrRUFBa0U7QUFDbEUsc0NBQXNDOztBQUV0QztBQUNBLHNFQUFzRTtBQUN0RSwwQ0FBMEM7O0FBRTFDO0FBQ0Esa0VBQWtFO0FBQ2xFLHNDQUFzQzs7QUFFdEM7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQSx3REFBd0Q7QUFDeEQ7O0FBRUE7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHNCQUFzQjtBQUNyRDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQztBQUMxQyw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxjQUFjO0FBQzVCO0FBQ0E7QUFDQSxVQUFVLGNBQWM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixVQUFVO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLHlCQUF5QjtBQUN0RDtBQUNBO0FBQ0Esb0JBQW9CLFdBQVcsK0RBQStELHVDQUF1QztBQUNySSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLHFDQUFxQyxrQkFBa0I7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQSxlQUFlLHdCQUF3QjtBQUN2QztBQUNBO0FBQ0Esb0JBQW9CLFVBQVUsZ0VBQWdFLGlCQUFpQjtBQUMvRztBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsbUNBQW1DLGlCQUFpQjtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGlDQUFpQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EseUNBQXlDLE9BQU87QUFDaEQseUNBQXlDO0FBQ3pDLHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EseUNBQXlDO0FBQ3pDLGdDQUFnQztBQUNoQyxnQ0FBZ0M7QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0Esa0JBQWtCLE9BQU87O0FBRXpCLFFBQVEsUUFBUTtBQUNoQixHQUFHO0FBQ0gsUUFBUSxPQUFPOztBQUVmLFFBQVEsUUFBUSwwQkFBMEI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEI7QUFDQSx5QkFBeUI7QUFDekIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0Esc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esb0JBQW9CLGFBQWE7QUFDakM7QUFDQSxpQkFBaUIsY0FBYzs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLG9CQUFvQixXQUFXO0FBQy9CLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLG9CQUFvQixXQUFXO0FBQy9CLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFFBQVE7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsbUJBQW1CO0FBQzFFLHVEQUF1RCxzQkFBc0I7QUFDN0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qix5REFBeUQ7QUFDckY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9COztBQUVwQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QixpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsK0NBQStDOztBQUUvRixrQkFB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQ0FBc0M7QUFDckQ7QUFDQTtBQUNBLGlCQUFpQiw0Q0FBNEM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLCtDQUErQztBQUNyRSxtQkFBbUIsdUNBQXVDO0FBQzFELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUIscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQiw2QkFBNkI7QUFDN0IseUNBQXlDO0FBQ3pDO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSw4QkFBOEIsdUJBQXVCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQWlCTCIsInNvdXJjZXMiOlsid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3hsc3gveGxzeC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIHhsc3guanMgKEMpIDIwMTMtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqL1xuLyogdmltOiBzZXQgdHM9MjogKi9cbi8qZXhwb3J0ZWQgWExTWCAqL1xuLypnbG9iYWwgcHJvY2VzczpmYWxzZSwgQnVmZmVyOmZhbHNlLCBBcnJheUJ1ZmZlcjpmYWxzZSwgRGF0YVZpZXc6ZmFsc2UsIERlbm86ZmFsc2UgKi9cbnZhciBYTFNYID0ge307XG5YTFNYLnZlcnNpb24gPSAnMC4xOC41JztcbnZhciBjdXJyZW50X2NvZGVwYWdlID0gMTIwMCwgY3VycmVudF9hbnNpID0gMTI1MjtcblxudmFyIFZBTElEX0FOU0kgPSBbIDg3NCwgOTMyLCA5MzYsIDk0OSwgOTUwLCAxMjUwLCAxMjUxLCAxMjUyLCAxMjUzLCAxMjU0LCAxMjU1LCAxMjU2LCAxMjU3LCAxMjU4LCAxMDAwMCBdO1xuLyogRUNNQS0zNzYgUGFydCBJIDE4LjQuMSBjaGFyc2V0IHRvIGNvZGVwYWdlIG1hcHBpbmcgKi9cbnZhciBDUzJDUCA9ICh7XG5cdC8qOjpbKi8wLyo6Ol0qLzogICAgMTI1MiwgLyogQU5TSSAqL1xuXHQvKjo6WyovMS8qOjpdKi86ICAgNjUwMDEsIC8qIERFRkFVTFQgKi9cblx0Lyo6OlsqLzIvKjo6XSovOiAgIDY1MDAxLCAvKiBTWU1CT0wgKi9cblx0Lyo6OlsqLzc3Lyo6Ol0qLzogIDEwMDAwLCAvKiBNQUMgKi9cblx0Lyo6OlsqLzEyOC8qOjpdKi86ICAgOTMyLCAvKiBTSElGVEpJUyAqL1xuXHQvKjo6WyovMTI5Lyo6Ol0qLzogICA5NDksIC8qIEhBTkdVTCAqL1xuXHQvKjo6WyovMTMwLyo6Ol0qLzogIDEzNjEsIC8qIEpPSEFCICovXG5cdC8qOjpbKi8xMzQvKjo6XSovOiAgIDkzNiwgLyogR0IyMzEyICovXG5cdC8qOjpbKi8xMzYvKjo6XSovOiAgIDk1MCwgLyogQ0hJTkVTRUJJRzUgKi9cblx0Lyo6OlsqLzE2MS8qOjpdKi86ICAxMjUzLCAvKiBHUkVFSyAqL1xuXHQvKjo6WyovMTYyLyo6Ol0qLzogIDEyNTQsIC8qIFRVUktJU0ggKi9cblx0Lyo6OlsqLzE2My8qOjpdKi86ICAxMjU4LCAvKiBWSUVUTkFNRVNFICovXG5cdC8qOjpbKi8xNzcvKjo6XSovOiAgMTI1NSwgLyogSEVCUkVXICovXG5cdC8qOjpbKi8xNzgvKjo6XSovOiAgMTI1NiwgLyogQVJBQklDICovXG5cdC8qOjpbKi8xODYvKjo6XSovOiAgMTI1NywgLyogQkFMVElDICovXG5cdC8qOjpbKi8yMDQvKjo6XSovOiAgMTI1MSwgLyogUlVTU0lBTiAqL1xuXHQvKjo6WyovMjIyLyo6Ol0qLzogICA4NzQsIC8qIFRIQUkgKi9cblx0Lyo6OlsqLzIzOC8qOjpdKi86ICAxMjUwLCAvKiBFQVNURVVST1BFICovXG5cdC8qOjpbKi8yNTUvKjo6XSovOiAgMTI1MiwgLyogT0VNICovXG5cdC8qOjpbKi82OS8qOjpdKi86ICAgNjk2OSAgLyogTUlTQyAqL1xufS8qOmFueSovKTtcblxudmFyIHNldF9hbnNpID0gZnVuY3Rpb24oY3AvKjpudW1iZXIqLykgeyBpZihWQUxJRF9BTlNJLmluZGV4T2YoY3ApID09IC0xKSByZXR1cm47IGN1cnJlbnRfYW5zaSA9IENTMkNQWzBdID0gY3A7IH07XG5mdW5jdGlvbiByZXNldF9hbnNpKCkgeyBzZXRfYW5zaSgxMjUyKTsgfVxuXG52YXIgc2V0X2NwID0gZnVuY3Rpb24oY3AvKjpudW1iZXIqLykgeyBjdXJyZW50X2NvZGVwYWdlID0gY3A7IHNldF9hbnNpKGNwKTsgfTtcbmZ1bmN0aW9uIHJlc2V0X2NwKCkgeyBzZXRfY3AoMTIwMCk7IHJlc2V0X2Fuc2koKTsgfVxuXG5mdW5jdGlvbiBjaGFyX2NvZGVzKGRhdGEvKjpzdHJpbmcqLykvKjpBcnJheTxudW1iZXI+Ki8geyB2YXIgby8qOkFycmF5PG51bWJlcj4qLyA9IFtdOyBmb3IodmFyIGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgKytpKSBvW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpOyByZXR1cm4gbzsgfVxuXG5mdW5jdGlvbiB1dGYxNmxlcmVhZChkYXRhLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgby8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgKGRhdGEubGVuZ3RoPj4xKTsgKytpKSBvW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhLmNoYXJDb2RlQXQoMippKSArIChkYXRhLmNoYXJDb2RlQXQoMippKzEpPDw4KSk7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiB1dGYxNmJlcmVhZChkYXRhLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgby8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgKGRhdGEubGVuZ3RoPj4xKTsgKytpKSBvW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhLmNoYXJDb2RlQXQoMippKzEpICsgKGRhdGEuY2hhckNvZGVBdCgyKmkpPDw4KSk7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5cbnZhciBkZWJvbSA9IGZ1bmN0aW9uKGRhdGEvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBjMSA9IGRhdGEuY2hhckNvZGVBdCgwKSwgYzIgPSBkYXRhLmNoYXJDb2RlQXQoMSk7XG5cdGlmKGMxID09IDB4RkYgJiYgYzIgPT0gMHhGRSkgcmV0dXJuIHV0ZjE2bGVyZWFkKGRhdGEuc2xpY2UoMikpO1xuXHRpZihjMSA9PSAweEZFICYmIGMyID09IDB4RkYpIHJldHVybiB1dGYxNmJlcmVhZChkYXRhLnNsaWNlKDIpKTtcblx0aWYoYzEgPT0gMHhGRUZGKSByZXR1cm4gZGF0YS5zbGljZSgxKTtcblx0cmV0dXJuIGRhdGE7XG59O1xuXG52YXIgX2dldGNoYXIgPSBmdW5jdGlvbiBfZ2MxKHgvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpOyB9O1xudmFyIF9nZXRhbnNpID0gZnVuY3Rpb24gX2dhMSh4Lyo6bnVtYmVyKi8pLyo6c3RyaW5nKi8geyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh4KTsgfTtcblxudmFyICRjcHRhYmxlO1xuZnVuY3Rpb24gc2V0X2NwdGFibGUoY3B0YWJsZSkge1xuXHQkY3B0YWJsZSA9IGNwdGFibGU7XG5cdHNldF9jcCA9IGZ1bmN0aW9uKGNwLyo6bnVtYmVyKi8pIHsgY3VycmVudF9jb2RlcGFnZSA9IGNwOyBzZXRfYW5zaShjcCk7IH07XG5cdGRlYm9tID0gZnVuY3Rpb24oZGF0YS8qOnN0cmluZyovKSB7XG5cdFx0aWYoZGF0YS5jaGFyQ29kZUF0KDApID09PSAweEZGICYmIGRhdGEuY2hhckNvZGVBdCgxKSA9PT0gMHhGRSkgeyByZXR1cm4gJGNwdGFibGUudXRpbHMuZGVjb2RlKDEyMDAsIGNoYXJfY29kZXMoZGF0YS5zbGljZSgyKSkpOyB9XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH07XG5cdF9nZXRjaGFyID0gZnVuY3Rpb24gX2djMih4Lyo6bnVtYmVyKi8pLyo6c3RyaW5nKi8ge1xuXHRcdGlmKGN1cnJlbnRfY29kZXBhZ2UgPT09IDEyMDApIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpO1xuXHRcdHJldHVybiAkY3B0YWJsZS51dGlscy5kZWNvZGUoY3VycmVudF9jb2RlcGFnZSwgW3gmMjU1LHg+PjhdKVswXTtcblx0fTtcblx0X2dldGFuc2kgPSBmdW5jdGlvbiBfZ2EyKHgvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7XG5cdFx0cmV0dXJuICRjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2Fuc2ksIFt4XSlbMF07XG5cdH07XG5cdGNwZG9pdCgpO1xufVxuZXhwb3J0IHsgc2V0X2NwdGFibGUgfTtcbnZhciBERU5TRSA9IG51bGw7XG52YXIgRElGX1hMID0gdHJ1ZTtcbnZhciBCYXNlNjRfbWFwID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuZnVuY3Rpb24gQmFzZTY0X2VuY29kZShpbnB1dCkge1xuICB2YXIgbyA9IFwiXCI7XG4gIHZhciBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBlMSA9IDAsIGUyID0gMCwgZTMgPSAwLCBlNCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICBjMSA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbiAgICBlMSA9IGMxID4+IDI7XG4gICAgYzIgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4gICAgZTIgPSAoYzEgJiAzKSA8PCA0IHwgYzIgPj4gNDtcbiAgICBjMyA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbiAgICBlMyA9IChjMiAmIDE1KSA8PCAyIHwgYzMgPj4gNjtcbiAgICBlNCA9IGMzICYgNjM7XG4gICAgaWYgKGlzTmFOKGMyKSkge1xuICAgICAgZTMgPSBlNCA9IDY0O1xuICAgIH0gZWxzZSBpZiAoaXNOYU4oYzMpKSB7XG4gICAgICBlNCA9IDY0O1xuICAgIH1cbiAgICBvICs9IEJhc2U2NF9tYXAuY2hhckF0KGUxKSArIEJhc2U2NF9tYXAuY2hhckF0KGUyKSArIEJhc2U2NF9tYXAuY2hhckF0KGUzKSArIEJhc2U2NF9tYXAuY2hhckF0KGU0KTtcbiAgfVxuICByZXR1cm4gbztcbn1cbmZ1bmN0aW9uIEJhc2U2NF9kZWNvZGUoaW5wdXQpIHtcbiAgdmFyIG8gPSBcIlwiO1xuICB2YXIgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgZTEgPSAwLCBlMiA9IDAsIGUzID0gMCwgZTQgPSAwO1xuICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teXFx3XFwrXFwvXFw9XS9nLCBcIlwiKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICkge1xuICAgIGUxID0gQmFzZTY0X21hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICBlMiA9IEJhc2U2NF9tYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgYzEgPSBlMSA8PCAyIHwgZTIgPj4gNDtcbiAgICBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzEpO1xuICAgIGUzID0gQmFzZTY0X21hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICBjMiA9IChlMiAmIDE1KSA8PCA0IHwgZTMgPj4gMjtcbiAgICBpZiAoZTMgIT09IDY0KSB7XG4gICAgICBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzIpO1xuICAgIH1cbiAgICBlNCA9IEJhc2U2NF9tYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgYzMgPSAoZTMgJiAzKSA8PCA2IHwgZTQ7XG4gICAgaWYgKGU0ICE9PSA2NCkge1xuICAgICAgbyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG87XG59XG52YXIgaGFzX2J1ZiA9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24oKSB7IHJldHVybiB0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgIT09ICd1bmRlZmluZWQnICYmICEhcHJvY2Vzcy52ZXJzaW9ucy5ub2RlOyB9KSgpO1xuXG52YXIgQnVmZmVyX2Zyb20gPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xuXHRpZih0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuXHRcdHZhciBuYmZzID0gIUJ1ZmZlci5mcm9tO1xuXHRcdGlmKCFuYmZzKSB0cnkgeyBCdWZmZXIuZnJvbShcImZvb1wiLCBcInV0ZjhcIik7IH0gY2F0Y2goZSkgeyBuYmZzID0gdHJ1ZTsgfVxuXHRcdHJldHVybiBuYmZzID8gZnVuY3Rpb24oYnVmLCBlbmMpIHsgcmV0dXJuIChlbmMpID8gbmV3IEJ1ZmZlcihidWYsIGVuYykgOiBuZXcgQnVmZmVyKGJ1Zik7IH0gOiBCdWZmZXIuZnJvbS5iaW5kKEJ1ZmZlcik7XG5cdH1cblx0cmV0dXJuIGZ1bmN0aW9uKCkge307XG59KSgpO1xuXG5cbmZ1bmN0aW9uIG5ld19yYXdfYnVmKGxlbi8qOm51bWJlciovKSB7XG5cdC8qIGpzaGludCAtVzA1NiAqL1xuXHRpZihoYXNfYnVmKSByZXR1cm4gQnVmZmVyLmFsbG9jID8gQnVmZmVyLmFsbG9jKGxlbikgOiBuZXcgQnVmZmVyKGxlbik7XG5cdHJldHVybiB0eXBlb2YgVWludDhBcnJheSAhPSBcInVuZGVmaW5lZFwiID8gbmV3IFVpbnQ4QXJyYXkobGVuKSA6IG5ldyBBcnJheShsZW4pO1xuXHQvKiBqc2hpbnQgK1cwNTYgKi9cbn1cblxuZnVuY3Rpb24gbmV3X3Vuc2FmZV9idWYobGVuLyo6bnVtYmVyKi8pIHtcblx0LyoganNoaW50IC1XMDU2ICovXG5cdGlmKGhhc19idWYpIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmUgPyBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKSA6IG5ldyBCdWZmZXIobGVuKTtcblx0cmV0dXJuIHR5cGVvZiBVaW50OEFycmF5ICE9IFwidW5kZWZpbmVkXCIgPyBuZXcgVWludDhBcnJheShsZW4pIDogbmV3IEFycmF5KGxlbik7XG5cdC8qIGpzaGludCArVzA1NiAqL1xufVxuXG52YXIgczJhID0gZnVuY3Rpb24gczJhKHMvKjpzdHJpbmcqLykvKjphbnkqLyB7XG5cdGlmKGhhc19idWYpIHJldHVybiBCdWZmZXJfZnJvbShzLCBcImJpbmFyeVwiKTtcblx0cmV0dXJuIHMuc3BsaXQoXCJcIikubWFwKGZ1bmN0aW9uKHgvKjpzdHJpbmcqLykvKjpudW1iZXIqL3sgcmV0dXJuIHguY2hhckNvZGVBdCgwKSAmIDB4ZmY7IH0pO1xufTtcblxuZnVuY3Rpb24gczJhYihzLyo6c3RyaW5nKi8pLyo6YW55Ki8ge1xuXHRpZih0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gczJhKHMpO1xuXHR2YXIgYnVmID0gbmV3IEFycmF5QnVmZmVyKHMubGVuZ3RoKSwgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG5cdGZvciAodmFyIGk9MDsgaSE9cy5sZW5ndGg7ICsraSkgdmlld1tpXSA9IHMuY2hhckNvZGVBdChpKSAmIDB4RkY7XG5cdHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGEycyhkYXRhLyo6YW55Ki8pLyo6c3RyaW5nKi8ge1xuXHRpZihBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gZGF0YS5tYXAoZnVuY3Rpb24oYykgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjKTsgfSkuam9pbihcIlwiKTtcblx0dmFyIG8vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTsgZm9yKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIG9baV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaV0pOyByZXR1cm4gby5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBhMnUoZGF0YS8qOkFycmF5PG51bWJlcj4qLykvKjpVaW50OEFycmF5Ki8ge1xuXHRpZih0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcpIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkXCIpO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG59XG5cbmZ1bmN0aW9uIGFiMmEoZGF0YS8qOkFycmF5QnVmZmVyfFVpbnQ4QXJyYXkqLykvKjpBcnJheTxudW1iZXI+Ki8ge1xuXHRpZih0eXBlb2YgQXJyYXlCdWZmZXIgPT0gJ3VuZGVmaW5lZCcpIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkXCIpO1xuXHRpZihkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBhYjJhKG5ldyBVaW50OEFycmF5KGRhdGEpKTtcblx0Lyo6OiBpZihkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHRocm93IG5ldyBFcnJvcihcInVucmVhY2hhYmxlXCIpOyAqL1xuXHR2YXIgbyA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSBvW2ldID0gZGF0YVtpXTtcblx0cmV0dXJuIG87XG59XG5cbnZhciBiY29uY2F0ID0gaGFzX2J1ZiA/IGZ1bmN0aW9uKGJ1ZnMpIHsgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmcy5tYXAoZnVuY3Rpb24oYnVmKSB7IHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IGJ1ZiA6IEJ1ZmZlcl9mcm9tKGJ1Zik7IH0pKTsgfSA6IGZ1bmN0aW9uKGJ1ZnMpIHtcblx0aWYodHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHR2YXIgaSA9IDAsIG1heGxlbiA9IDA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYnVmcy5sZW5ndGg7ICsraSkgbWF4bGVuICs9IGJ1ZnNbaV0ubGVuZ3RoO1xuXHRcdHZhciBvID0gbmV3IFVpbnQ4QXJyYXkobWF4bGVuKTtcblx0XHR2YXIgbGVuID0gMDtcblx0XHRmb3IoaSA9IDAsIG1heGxlbiA9IDA7IGkgPCBidWZzLmxlbmd0aDsgbWF4bGVuICs9IGxlbiwgKytpKSB7XG5cdFx0XHRsZW4gPSBidWZzW2ldLmxlbmd0aDtcblx0XHRcdGlmKGJ1ZnNbaV0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSBvLnNldChidWZzW2ldLCBtYXhsZW4pO1xuXHRcdFx0ZWxzZSBpZih0eXBlb2YgYnVmc1tpXSA9PSBcInN0cmluZ1wiKSB7IHRocm93IFwid3RmXCI7IH1cblx0XHRcdGVsc2Ugby5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmc1tpXSksIG1heGxlbik7XG5cdFx0fVxuXHRcdHJldHVybiBvO1xuXHR9XG5cdHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGJ1ZnMubWFwKGZ1bmN0aW9uKGJ1ZikgeyByZXR1cm4gQXJyYXkuaXNBcnJheShidWYpID8gYnVmIDogW10uc2xpY2UuY2FsbChidWYpOyB9KSk7XG59O1xuXG5mdW5jdGlvbiB1dGY4ZGVjb2RlKGNvbnRlbnQvKjpzdHJpbmcqLykge1xuXHR2YXIgb3V0ID0gW10sIHdpZHggPSAwLCBMID0gY29udGVudC5sZW5ndGggKyAyNTA7XG5cdHZhciBvID0gbmV3X3Jhd19idWYoY29udGVudC5sZW5ndGggKyAyNTUpO1xuXHRmb3IodmFyIHJpZHggPSAwOyByaWR4IDwgY29udGVudC5sZW5ndGg7ICsrcmlkeCkge1xuXHRcdHZhciBjID0gY29udGVudC5jaGFyQ29kZUF0KHJpZHgpO1xuXHRcdGlmKGMgPCAweDgwKSBvW3dpZHgrK10gPSBjO1xuXHRcdGVsc2UgaWYoYyA8IDB4ODAwKSB7XG5cdFx0XHRvW3dpZHgrK10gPSAoMTkyfCgoYz4+NikmMzEpKTtcblx0XHRcdG9bd2lkeCsrXSA9ICgxMjh8KGMmNjMpKTtcblx0XHR9IGVsc2UgaWYoYyA+PSAweEQ4MDAgJiYgYyA8IDB4RTAwMCkge1xuXHRcdFx0YyA9IChjJjEwMjMpKzY0O1xuXHRcdFx0dmFyIGQgPSBjb250ZW50LmNoYXJDb2RlQXQoKytyaWR4KSYxMDIzO1xuXHRcdFx0b1t3aWR4KytdID0gKDI0MHwoKGM+PjgpJjcpKTtcblx0XHRcdG9bd2lkeCsrXSA9ICgxMjh8KChjPj4yKSY2MykpO1xuXHRcdFx0b1t3aWR4KytdID0gKDEyOHwoKGQ+PjYpJjE1KXwoKGMmMyk8PDQpKTtcblx0XHRcdG9bd2lkeCsrXSA9ICgxMjh8KGQmNjMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1t3aWR4KytdID0gKDIyNHwoKGM+PjEyKSYxNSkpO1xuXHRcdFx0b1t3aWR4KytdID0gKDEyOHwoKGM+PjYpJjYzKSk7XG5cdFx0XHRvW3dpZHgrK10gPSAoMTI4fChjJjYzKSk7XG5cdFx0fVxuXHRcdGlmKHdpZHggPiBMKSB7XG5cdFx0XHRvdXQucHVzaChvLnNsaWNlKDAsIHdpZHgpKTtcblx0XHRcdHdpZHggPSAwO1xuXHRcdFx0byA9IG5ld19yYXdfYnVmKDY1NTM1KTtcblx0XHRcdEwgPSA2NTUzMDtcblx0XHR9XG5cdH1cblx0b3V0LnB1c2goby5zbGljZSgwLCB3aWR4KSk7XG5cdHJldHVybiBiY29uY2F0KG91dCk7XG59XG5cbnZhciBjaHIwID0gL1xcdTAwMDAvZywgY2hyMSA9IC9bXFx1MDAwMS1cXHUwMDA2XS9nO1xuLyo6OlxuZGVjbGFyZSB0eXBlIEJsb2NrID0gYW55O1xuZGVjbGFyZSB0eXBlIEJ1ZkFycmF5ID0ge1xuXHRuZXdibGsoc3o6bnVtYmVyKTpCbG9jaztcblx0bmV4dChzejpudW1iZXIpOkJsb2NrO1xuXHRlbmQoKTphbnk7XG5cdHB1c2goYnVmOkJsb2NrKTp2b2lkO1xufTtcblxudHlwZSBSZWNvcmRIb3BwZXJDQiA9IHsoZDphbnksIFJuOnN0cmluZywgUlQ6bnVtYmVyKTo/Ym9vbGVhbjt9O1xuXG50eXBlIEV2ZXJ0VHlwZSA9IHtbc3RyaW5nXTpzdHJpbmd9O1xudHlwZSBFdmVydE51bVR5cGUgPSB7W3N0cmluZ106bnVtYmVyfTtcbnR5cGUgRXZlcnRBcnJUeXBlID0ge1tzdHJpbmddOkFycmF5PHN0cmluZz59O1xuXG50eXBlIFN0cmluZ0NvbnYgPSB7KHN0cmluZyk6c3RyaW5nfTtcblxuKi9cbi8qIHNzZi5qcyAoQykgMjAxMy1wcmVzZW50IFNoZWV0SlMgLS0gaHR0cDovL3NoZWV0anMuY29tICovXG4vKmpzaGludCAtVzA0MSAqL1xuZnVuY3Rpb24gX3N0cnJldih4Lyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8geyB2YXIgbyA9IFwiXCIsIGkgPSB4Lmxlbmd0aC0xOyB3aGlsZShpPj0wKSBvICs9IHguY2hhckF0KGktLSk7IHJldHVybiBvOyB9XG5mdW5jdGlvbiBwYWQwKHYvKjphbnkqLyxkLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi97dmFyIHQ9XCJcIit2OyByZXR1cm4gdC5sZW5ndGg+PWQ/dDpmaWxsKCcwJyxkLXQubGVuZ3RoKSt0O31cbmZ1bmN0aW9uIHBhZF8odi8qOmFueSovLGQvKjpudW1iZXIqLykvKjpzdHJpbmcqL3t2YXIgdD1cIlwiK3Y7cmV0dXJuIHQubGVuZ3RoPj1kP3Q6ZmlsbCgnICcsZC10Lmxlbmd0aCkrdDt9XG5mdW5jdGlvbiBycGFkXyh2Lyo6YW55Ki8sZC8qOm51bWJlciovKS8qOnN0cmluZyove3ZhciB0PVwiXCIrdjsgcmV0dXJuIHQubGVuZ3RoPj1kP3Q6dCtmaWxsKCcgJyxkLXQubGVuZ3RoKTt9XG5mdW5jdGlvbiBwYWQwcjEodi8qOmFueSovLGQvKjpudW1iZXIqLykvKjpzdHJpbmcqL3t2YXIgdD1cIlwiK01hdGgucm91bmQodik7IHJldHVybiB0Lmxlbmd0aD49ZD90OmZpbGwoJzAnLGQtdC5sZW5ndGgpK3Q7fVxuZnVuY3Rpb24gcGFkMHIyKHYvKjphbnkqLyxkLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi97dmFyIHQ9XCJcIit2OyByZXR1cm4gdC5sZW5ndGg+PWQ/dDpmaWxsKCcwJyxkLXQubGVuZ3RoKSt0O31cbnZhciBwMl8zMiA9IC8qI19fUFVSRV9fKi9NYXRoLnBvdygyLDMyKTtcbmZ1bmN0aW9uIHBhZDByKHYvKjphbnkqLyxkLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi97aWYodj5wMl8zMnx8djwtcDJfMzIpIHJldHVybiBwYWQwcjEodixkKTsgdmFyIGkgPSBNYXRoLnJvdW5kKHYpOyByZXR1cm4gcGFkMHIyKGksZCk7IH1cbi8qIHllcywgaW4gMjAyMiB0aGlzIGlzIHN0aWxsIGZhc3RlciB0aGFuIHN0cmluZyBjb21wYXJlICovXG5mdW5jdGlvbiBTU0ZfaXNnZW5lcmFsKHMvKjpzdHJpbmcqLywgaS8qOj9udW1iZXIqLykvKjpib29sZWFuKi8geyBpID0gaSB8fCAwOyByZXR1cm4gcy5sZW5ndGggPj0gNyArIGkgJiYgKHMuY2hhckNvZGVBdChpKXwzMikgPT09IDEwMyAmJiAocy5jaGFyQ29kZUF0KGkrMSl8MzIpID09PSAxMDEgJiYgKHMuY2hhckNvZGVBdChpKzIpfDMyKSA9PT0gMTEwICYmIChzLmNoYXJDb2RlQXQoaSszKXwzMikgPT09IDEwMSAmJiAocy5jaGFyQ29kZUF0KGkrNCl8MzIpID09PSAxMTQgJiYgKHMuY2hhckNvZGVBdChpKzUpfDMyKSA9PT0gOTcgJiYgKHMuY2hhckNvZGVBdChpKzYpfDMyKSA9PT0gMTA4OyB9XG52YXIgZGF5cy8qOkFycmF5PEFycmF5PHN0cmluZz4gPiovID0gW1xuXHRbJ1N1bicsICdTdW5kYXknXSxcblx0WydNb24nLCAnTW9uZGF5J10sXG5cdFsnVHVlJywgJ1R1ZXNkYXknXSxcblx0WydXZWQnLCAnV2VkbmVzZGF5J10sXG5cdFsnVGh1JywgJ1RodXJzZGF5J10sXG5cdFsnRnJpJywgJ0ZyaWRheSddLFxuXHRbJ1NhdCcsICdTYXR1cmRheSddXG5dO1xudmFyIG1vbnRocy8qOkFycmF5PEFycmF5PHN0cmluZz4gPiovID0gW1xuXHRbJ0onLCAnSmFuJywgJ0phbnVhcnknXSxcblx0WydGJywgJ0ZlYicsICdGZWJydWFyeSddLFxuXHRbJ00nLCAnTWFyJywgJ01hcmNoJ10sXG5cdFsnQScsICdBcHInLCAnQXByaWwnXSxcblx0WydNJywgJ01heScsICdNYXknXSxcblx0WydKJywgJ0p1bicsICdKdW5lJ10sXG5cdFsnSicsICdKdWwnLCAnSnVseSddLFxuXHRbJ0EnLCAnQXVnJywgJ0F1Z3VzdCddLFxuXHRbJ1MnLCAnU2VwJywgJ1NlcHRlbWJlciddLFxuXHRbJ08nLCAnT2N0JywgJ09jdG9iZXInXSxcblx0WydOJywgJ05vdicsICdOb3ZlbWJlciddLFxuXHRbJ0QnLCAnRGVjJywgJ0RlY2VtYmVyJ11cbl07XG5mdW5jdGlvbiBTU0ZfaW5pdF90YWJsZSh0Lyo6YW55Ki8pIHtcblx0aWYoIXQpIHQgPSB7fTtcblx0dFswXT0gICdHZW5lcmFsJztcblx0dFsxXT0gICcwJztcblx0dFsyXT0gICcwLjAwJztcblx0dFszXT0gICcjLCMjMCc7XG5cdHRbNF09ICAnIywjIzAuMDAnO1xuXHR0WzldPSAgJzAlJztcblx0dFsxMF09ICcwLjAwJSc7XG5cdHRbMTFdPSAnMC4wMEUrMDAnO1xuXHR0WzEyXT0gJyMgPy8/Jztcblx0dFsxM109ICcjID8/Lz8/Jztcblx0dFsxNF09ICdtL2QveXknO1xuXHR0WzE1XT0gJ2QtbW1tLXl5Jztcblx0dFsxNl09ICdkLW1tbSc7XG5cdHRbMTddPSAnbW1tLXl5Jztcblx0dFsxOF09ICdoOm1tIEFNL1BNJztcblx0dFsxOV09ICdoOm1tOnNzIEFNL1BNJztcblx0dFsyMF09ICdoOm1tJztcblx0dFsyMV09ICdoOm1tOnNzJztcblx0dFsyMl09ICdtL2QveXkgaDptbSc7XG5cdHRbMzddPSAnIywjIzAgOygjLCMjMCknO1xuXHR0WzM4XT0gJyMsIyMwIDtbUmVkXSgjLCMjMCknO1xuXHR0WzM5XT0gJyMsIyMwLjAwOygjLCMjMC4wMCknO1xuXHR0WzQwXT0gJyMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSc7XG5cdHRbNDVdPSAnbW06c3MnO1xuXHR0WzQ2XT0gJ1toXTptbTpzcyc7XG5cdHRbNDddPSAnbW1zcy4wJztcblx0dFs0OF09ICcjIzAuMEUrMCc7XG5cdHRbNDldPSAnQCc7XG5cdHRbNTZdPSAnXCLkuIrljYgv5LiL5Y2IIFwiaGhcIuaZglwibW1cIuWIhlwic3NcIuenkiBcIic7XG5cdHJldHVybiB0O1xufVxuLyogcmVwZWF0ZWQgdG8gc2F0aWF0ZSB3ZWJwYWNrICovXG52YXIgdGFibGVfZm10ID0ge1xuXHQwOiAgJ0dlbmVyYWwnLFxuXHQxOiAgJzAnLFxuXHQyOiAgJzAuMDAnLFxuXHQzOiAgJyMsIyMwJyxcblx0NDogICcjLCMjMC4wMCcsXG5cdDk6ICAnMCUnLFxuXHQxMDogJzAuMDAlJyxcblx0MTE6ICcwLjAwRSswMCcsXG5cdDEyOiAnIyA/Lz8nLFxuXHQxMzogJyMgPz8vPz8nLFxuXHQxNDogJ20vZC95eScsXG5cdDE1OiAnZC1tbW0teXknLFxuXHQxNjogJ2QtbW1tJyxcblx0MTc6ICdtbW0teXknLFxuXHQxODogJ2g6bW0gQU0vUE0nLFxuXHQxOTogJ2g6bW06c3MgQU0vUE0nLFxuXHQyMDogJ2g6bW0nLFxuXHQyMTogJ2g6bW06c3MnLFxuXHQyMjogJ20vZC95eSBoOm1tJyxcblx0Mzc6ICcjLCMjMCA7KCMsIyMwKScsXG5cdDM4OiAnIywjIzAgO1tSZWRdKCMsIyMwKScsXG5cdDM5OiAnIywjIzAuMDA7KCMsIyMwLjAwKScsXG5cdDQwOiAnIywjIzAuMDA7W1JlZF0oIywjIzAuMDApJyxcblx0NDU6ICdtbTpzcycsXG5cdDQ2OiAnW2hdOm1tOnNzJyxcblx0NDc6ICdtbXNzLjAnLFxuXHQ0ODogJyMjMC4wRSswJyxcblx0NDk6ICdAJyxcblx0NTY6ICdcIuS4iuWNiC/kuIvljYggXCJoaFwi5pmCXCJtbVwi5YiGXCJzc1wi56eSIFwiJ1xufTtcblxuLyogRGVmYXVsdHMgZGV0ZXJtaW5lZCBieSBzeXN0ZW1hdGljYWxseSB0ZXN0aW5nIGluIEV4Y2VsIDIwMTkgKi9cblxuLyogVGhlc2UgZm9ybWF0cyBhcHBlYXIgdG8gZGVmYXVsdCB0byBvdGhlciBmb3JtYXRzIGluIHRoZSB0YWJsZSAqL1xudmFyIFNTRl9kZWZhdWx0X21hcCA9IHtcblx0NTogIDM3LCA2OiAgMzgsIDc6ICAzOSwgODogIDQwLCAgICAgICAgIC8vICA1IC0+IDM3IC4uLiAgOCAtPiA0MFxuXG5cdDIzOiAgMCwgMjQ6ICAwLCAyNTogIDAsIDI2OiAgMCwgICAgICAgICAvLyAyMyAtPiAgMCAuLi4gMjYgLT4gIDBcblxuXHQyNzogMTQsIDI4OiAxNCwgMjk6IDE0LCAzMDogMTQsIDMxOiAxNCwgLy8gMjcgLT4gMTQgLi4uIDMxIC0+IDE0XG5cblx0NTA6IDE0LCA1MTogMTQsIDUyOiAxNCwgNTM6IDE0LCA1NDogMTQsIC8vIDUwIC0+IDE0IC4uLiA1OCAtPiAxNFxuXHQ1NTogMTQsIDU2OiAxNCwgNTc6IDE0LCA1ODogMTQsXG5cdDU5OiAgMSwgNjA6ICAyLCA2MTogIDMsIDYyOiAgNCwgICAgICAgICAvLyA1OSAtPiAgMSAuLi4gNjIgLT4gIDRcblxuXHQ2NzogIDksIDY4OiAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNjcgLT4gIDkgLi4uIDY4IC0+IDEwXG5cdDY5OiAxMiwgNzA6IDEzLCA3MTogMTQsICAgICAgICAgICAgICAgICAvLyA2OSAtPiAxMiAuLi4gNzEgLT4gMTRcblx0NzI6IDE0LCA3MzogMTUsIDc0OiAxNiwgNzU6IDE3LCAgICAgICAgIC8vIDcyIC0+IDE0IC4uLiA3NSAtPiAxN1xuXHQ3NjogMjAsIDc3OiAyMSwgNzg6IDIyLCAgICAgICAgICAgICAgICAgLy8gNzYgLT4gMjAgLi4uIDc4IC0+IDIyXG5cdDc5OiA0NSwgODA6IDQ2LCA4MTogNDcsICAgICAgICAgICAgICAgICAvLyA3OSAtPiA0NSAuLi4gODEgLT4gNDdcblx0ODI6IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDgyIC0+ICAwIC4uLiA2NTUzNiAtPiAwIChvbWl0dGVkKVxufTtcblxuXG4vKiBUaGVzZSBmb3JtYXRzIHRlY2huaWNhbGx5IHJlZmVyIHRvIEFjY291bnRpbmcgZm9ybWF0cyB3aXRoIG5vIGVxdWl2YWxlbnQgKi9cbnZhciBTU0ZfZGVmYXVsdF9zdHIgPSB7XG5cdC8vICA1IC0tIEN1cnJlbmN5LCAgIDAgZGVjaW1hbCwgYmxhY2sgbmVnYXRpdmVcblx0NTogICdcIiRcIiMsIyMwXyk7XFxcXChcIiRcIiMsIyMwXFxcXCknLFxuXHQ2MzogJ1wiJFwiIywjIzBfKTtcXFxcKFwiJFwiIywjIzBcXFxcKScsXG5cblx0Ly8gIDYgLS0gQ3VycmVuY3ksICAgMCBkZWNpbWFsLCByZWQgICBuZWdhdGl2ZVxuXHQ2OiAgJ1wiJFwiIywjIzBfKTtbUmVkXVxcXFwoXCIkXCIjLCMjMFxcXFwpJyxcblx0NjQ6ICdcIiRcIiMsIyMwXyk7W1JlZF1cXFxcKFwiJFwiIywjIzBcXFxcKScsXG5cblx0Ly8gIDcgLS0gQ3VycmVuY3ksICAgMiBkZWNpbWFsLCBibGFjayBuZWdhdGl2ZVxuXHQ3OiAgJ1wiJFwiIywjIzAuMDBfKTtcXFxcKFwiJFwiIywjIzAuMDBcXFxcKScsXG5cdDY1OiAnXCIkXCIjLCMjMC4wMF8pO1xcXFwoXCIkXCIjLCMjMC4wMFxcXFwpJyxcblxuXHQvLyAgOCAtLSBDdXJyZW5jeSwgICAyIGRlY2ltYWwsIHJlZCAgIG5lZ2F0aXZlXG5cdDg6ICAnXCIkXCIjLCMjMC4wMF8pO1tSZWRdXFxcXChcIiRcIiMsIyMwLjAwXFxcXCknLFxuXHQ2NjogJ1wiJFwiIywjIzAuMDBfKTtbUmVkXVxcXFwoXCIkXCIjLCMjMC4wMFxcXFwpJyxcblxuXHQvLyA0MSAtLSBBY2NvdW50aW5nLCAwIGRlY2ltYWwsIE5vIFN5bWJvbFxuXHQ0MTogJ18oKiAjLCMjMF8pO18oKiBcXFxcKCMsIyMwXFxcXCk7XygqIFwiLVwiXyk7XyhAXyknLFxuXG5cdC8vIDQyIC0tIEFjY291bnRpbmcsIDAgZGVjaW1hbCwgJCAgU3ltYm9sXG5cdDQyOiAnXyhcIiRcIiogIywjIzBfKTtfKFwiJFwiKiBcXFxcKCMsIyMwXFxcXCk7XyhcIiRcIiogXCItXCJfKTtfKEBfKScsXG5cblx0Ly8gNDMgLS0gQWNjb3VudGluZywgMiBkZWNpbWFsLCBObyBTeW1ib2xcblx0NDM6ICdfKCogIywjIzAuMDBfKTtfKCogXFxcXCgjLCMjMC4wMFxcXFwpO18oKiBcIi1cIj8/Xyk7XyhAXyknLFxuXG5cdC8vIDQ0IC0tIEFjY291bnRpbmcsIDIgZGVjaW1hbCwgJCAgU3ltYm9sXG5cdDQ0OiAnXyhcIiRcIiogIywjIzAuMDBfKTtfKFwiJFwiKiBcXFxcKCMsIyMwLjAwXFxcXCk7XyhcIiRcIiogXCItXCI/P18pO18oQF8pJ1xufTtcblxuZnVuY3Rpb24gU1NGX2ZyYWMoeC8qOm51bWJlciovLCBELyo6bnVtYmVyKi8sIG1peGVkLyo6P2Jvb2xlYW4qLykvKjpBcnJheTxudW1iZXI+Ki8ge1xuXHR2YXIgc2duID0geCA8IDAgPyAtMSA6IDE7XG5cdHZhciBCID0geCAqIHNnbjtcblx0dmFyIFBfMiA9IDAsIFBfMSA9IDEsIFAgPSAwO1xuXHR2YXIgUV8yID0gMSwgUV8xID0gMCwgUSA9IDA7XG5cdHZhciBBID0gTWF0aC5mbG9vcihCKTtcblx0d2hpbGUoUV8xIDwgRCkge1xuXHRcdEEgPSBNYXRoLmZsb29yKEIpO1xuXHRcdFAgPSBBICogUF8xICsgUF8yO1xuXHRcdFEgPSBBICogUV8xICsgUV8yO1xuXHRcdGlmKChCIC0gQSkgPCAwLjAwMDAwMDA1KSBicmVhaztcblx0XHRCID0gMSAvIChCIC0gQSk7XG5cdFx0UF8yID0gUF8xOyBQXzEgPSBQO1xuXHRcdFFfMiA9IFFfMTsgUV8xID0gUTtcblx0fVxuXHRpZihRID4gRCkgeyBpZihRXzEgPiBEKSB7IFEgPSBRXzI7IFAgPSBQXzI7IH0gZWxzZSB7IFEgPSBRXzE7IFAgPSBQXzE7IH0gfVxuXHRpZighbWl4ZWQpIHJldHVybiBbMCwgc2duICogUCwgUV07XG5cdHZhciBxID0gTWF0aC5mbG9vcihzZ24gKiBQL1EpO1xuXHRyZXR1cm4gW3EsIHNnbipQIC0gcSpRLCBRXTtcbn1cbmZ1bmN0aW9uIFNTRl9wYXJzZV9kYXRlX2NvZGUodi8qOm51bWJlciovLG9wdHMvKjo/YW55Ki8sYjIvKjo/Ym9vbGVhbiovKSB7XG5cdGlmKHYgPiAyOTU4NDY1IHx8IHYgPCAwKSByZXR1cm4gbnVsbDtcblx0dmFyIGRhdGUgPSAodnwwKSwgdGltZSA9IE1hdGguZmxvb3IoODY0MDAgKiAodiAtIGRhdGUpKSwgZG93PTA7XG5cdHZhciBkb3V0PVtdO1xuXHR2YXIgb3V0PXtEOmRhdGUsIFQ6dGltZSwgdTo4NjQwMCoodi1kYXRlKS10aW1lLHk6MCxtOjAsZDowLEg6MCxNOjAsUzowLHE6MH07XG5cdGlmKE1hdGguYWJzKG91dC51KSA8IDFlLTYpIG91dC51ID0gMDtcblx0aWYob3B0cyAmJiBvcHRzLmRhdGUxOTA0KSBkYXRlICs9IDE0NjI7XG5cdGlmKG91dC51ID4gMC45OTk5KSB7XG5cdFx0b3V0LnUgPSAwO1xuXHRcdGlmKCsrdGltZSA9PSA4NjQwMCkgeyBvdXQuVCA9IHRpbWUgPSAwOyArK2RhdGU7ICsrb3V0LkQ7IH1cblx0fVxuXHRpZihkYXRlID09PSA2MCkge2RvdXQgPSBiMiA/IFsxMzE3LDEwLDI5XSA6IFsxOTAwLDIsMjldOyBkb3c9Mzt9XG5cdGVsc2UgaWYoZGF0ZSA9PT0gMCkge2RvdXQgPSBiMiA/IFsxMzE3LDgsMjldIDogWzE5MDAsMSwwXTsgZG93PTY7fVxuXHRlbHNlIHtcblx0XHRpZihkYXRlID4gNjApIC0tZGF0ZTtcblx0XHQvKiAxID0gSmFuIDEgMTkwMCBpbiBHcmVnb3JpYW4gKi9cblx0XHR2YXIgZCA9IG5ldyBEYXRlKDE5MDAsIDAsIDEpO1xuXHRcdGQuc2V0RGF0ZShkLmdldERhdGUoKSArIGRhdGUgLSAxKTtcblx0XHRkb3V0ID0gW2QuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpKzEsZC5nZXREYXRlKCldO1xuXHRcdGRvdyA9IGQuZ2V0RGF5KCk7XG5cdFx0aWYoZGF0ZSA8IDYwKSBkb3cgPSAoZG93ICsgNikgJSA3O1xuXHRcdGlmKGIyKSBkb3cgPSBTU0ZfZml4X2hpanJpKGQsIGRvdXQpO1xuXHR9XG5cdG91dC55ID0gZG91dFswXTsgb3V0Lm0gPSBkb3V0WzFdOyBvdXQuZCA9IGRvdXRbMl07XG5cdG91dC5TID0gdGltZSAlIDYwOyB0aW1lID0gTWF0aC5mbG9vcih0aW1lIC8gNjApO1xuXHRvdXQuTSA9IHRpbWUgJSA2MDsgdGltZSA9IE1hdGguZmxvb3IodGltZSAvIDYwKTtcblx0b3V0LkggPSB0aW1lO1xuXHRvdXQucSA9IGRvdztcblx0cmV0dXJuIG91dDtcbn1cbnZhciBTU0ZiYXNlZGF0ZSA9IC8qI19fUFVSRV9fKi9uZXcgRGF0ZSgxODk5LCAxMSwgMzEsIDAsIDAsIDApO1xudmFyIFNTRmRudGhyZXNoID0gLyojX19QVVJFX18qL1NTRmJhc2VkYXRlLmdldFRpbWUoKTtcbnZhciBTU0ZiYXNlMTkwNCA9IC8qI19fUFVSRV9fKi9uZXcgRGF0ZSgxOTAwLCAyLCAxLCAwLCAwLCAwKTtcbmZ1bmN0aW9uIGRhdGVudW1fbG9jYWwodi8qOkRhdGUqLywgZGF0ZTE5MDQvKjo/Ym9vbGVhbiovKS8qOm51bWJlciovIHtcblx0dmFyIGVwb2NoID0gLyojX19QVVJFX18qL3YuZ2V0VGltZSgpO1xuXHRpZihkYXRlMTkwNCkgZXBvY2ggLT0gMTQ2MSoyNCo2MCo2MCoxMDAwO1xuXHRlbHNlIGlmKHYgPj0gU1NGYmFzZTE5MDQpIGVwb2NoICs9IDI0KjYwKjYwKjEwMDA7XG5cdHJldHVybiAoZXBvY2ggLSAoU1NGZG50aHJlc2ggKyAoLyojX19QVVJFX18qL3YuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIC8qI19fUFVSRV9fKi9TU0ZiYXNlZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpKSAqIDYwMDAwKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7XG59XG4vKiBFQ01BLTM3NiAxOC44LjMwIG51bUZtdCovXG4vKiBOb3RlOiBgdG9QcmVjaXNpb25gIHVzZXMgc3RhbmRhcmQgZm9ybSB3aGVuIHByZWMgPiBFIGFuZCBFID49IC02ICovXG4vKiBleHBvbmVudCA+PSAtOSBhbmQgPD0gOSAqL1xuZnVuY3Rpb24gU1NGX3N0cmlwX2RlY2ltYWwoby8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0cmV0dXJuIChvLmluZGV4T2YoXCIuXCIpID09IC0xKSA/IG8gOiBvLnJlcGxhY2UoLyg/OlxcLjAqfChcXC5cXGQqWzEtOV0pMCspJC8sIFwiJDFcIik7XG59XG5cbi8qIEdlbmVyYWwgRXhwb25lbnRpYWwgYWx3YXlzIHNob3dzIDIgZGlnaXRzIGV4cCBhbmQgdHJpbXMgdGhlIG1hbnRpc3NhICovXG5mdW5jdGlvbiBTU0Zfbm9ybWFsaXplX2V4cChvLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHRpZihvLmluZGV4T2YoXCJFXCIpID09IC0xKSByZXR1cm4gbztcblx0cmV0dXJuIG8ucmVwbGFjZSgvKD86XFwuMCp8KFxcLlxcZCpbMS05XSkwKylbRWVdLyxcIiQxRVwiKS5yZXBsYWNlKC8oRVsrLV0pKFxcZCkkLyxcIiQxMCQyXCIpO1xufVxuXG4vKiBleHBvbmVudCA+PSAtOSBhbmQgPD0gOSAqL1xuZnVuY3Rpb24gU1NGX3NtYWxsX2V4cCh2Lyo6bnVtYmVyKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgdyA9ICh2PDA/MTI6MTEpO1xuXHR2YXIgbyA9IFNTRl9zdHJpcF9kZWNpbWFsKHYudG9GaXhlZCgxMikpOyBpZihvLmxlbmd0aCA8PSB3KSByZXR1cm4gbztcblx0byA9IHYudG9QcmVjaXNpb24oMTApOyBpZihvLmxlbmd0aCA8PSB3KSByZXR1cm4gbztcblx0cmV0dXJuIHYudG9FeHBvbmVudGlhbCg1KTtcbn1cblxuLyogZXhwb25lbnQgPj0gMTEgb3IgPD0gLTEwIGxpa2VseSBleHBvbmVudGlhbCAqL1xuZnVuY3Rpb24gU1NGX2xhcmdlX2V4cCh2Lyo6bnVtYmVyKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgbyA9IFNTRl9zdHJpcF9kZWNpbWFsKHYudG9GaXhlZCgxMSkpO1xuXHRyZXR1cm4gKG8ubGVuZ3RoID4gKHY8MD8xMjoxMSkgfHwgbyA9PT0gXCIwXCIgfHwgbyA9PT0gXCItMFwiKSA/IHYudG9QcmVjaXNpb24oNikgOiBvO1xufVxuXG5mdW5jdGlvbiBTU0ZfZ2VuZXJhbF9udW0odi8qOm51bWJlciovKS8qOnN0cmluZyovIHtcblx0dmFyIFYgPSBNYXRoLmZsb29yKE1hdGgubG9nKE1hdGguYWJzKHYpKSpNYXRoLkxPRzEwRSksIG87XG5cblx0aWYoViA+PSAtNCAmJiBWIDw9IC0xKSBvID0gdi50b1ByZWNpc2lvbigxMCtWKTtcblx0ZWxzZSBpZihNYXRoLmFicyhWKSA8PSA5KSBvID0gU1NGX3NtYWxsX2V4cCh2KTtcblx0ZWxzZSBpZihWID09PSAxMCkgbyA9IHYudG9GaXhlZCgxMCkuc3Vic3RyKDAsMTIpO1xuXHRlbHNlIG8gPSBTU0ZfbGFyZ2VfZXhwKHYpO1xuXG5cdHJldHVybiBTU0Zfc3RyaXBfZGVjaW1hbChTU0Zfbm9ybWFsaXplX2V4cChvLnRvVXBwZXJDYXNlKCkpKTtcbn1cblxuXG4vKlxuXHRcIkdlbmVyYWxcIiBydWxlczpcblx0LSB0ZXh0IGlzIHBhc3NlZCB0aHJvdWdoIChcIkBcIilcblx0LSBib29sZWFucyBhcmUgcmVuZGVyZWQgYXMgVFJVRS9GQUxTRVxuXHQtIFwidXAgdG8gMTEgY2hhcmFjdGVyc1wiIGRpc3BsYXllZCBmb3IgbnVtYmVyc1xuXHQtIERlZmF1bHQgZGF0ZSBmb3JtYXQgKGNvZGUgMTQpIHVzZWQgZm9yIERhdGVzXG5cblx0VGhlIGxvbmdlc3QgMzItYml0IGludGVnZXIgdGV4dCBpcyBcIi0yMTQ3NDgzNjQ4XCIsIGV4YWN0bHkgMTEgY2hhcnNcblx0VE9ETzogdGVjaG5pY2FsbHkgdGhlIGRpc3BsYXkgZGVwZW5kcyBvbiB0aGUgd2lkdGggb2YgdGhlIGNlbGxcbiovXG5mdW5jdGlvbiBTU0ZfZ2VuZXJhbCh2Lyo6YW55Ki8sIG9wdHMvKjphbnkqLykge1xuXHRzd2l0Y2godHlwZW9mIHYpIHtcblx0XHRjYXNlICdzdHJpbmcnOiByZXR1cm4gdjtcblx0XHRjYXNlICdib29sZWFuJzogcmV0dXJuIHYgPyBcIlRSVUVcIiA6IFwiRkFMU0VcIjtcblx0XHRjYXNlICdudW1iZXInOiByZXR1cm4gKHZ8MCkgPT09IHYgPyB2LnRvU3RyaW5nKDEwKSA6IFNTRl9nZW5lcmFsX251bSh2KTtcblx0XHRjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gXCJcIjtcblx0XHRjYXNlICdvYmplY3QnOlxuXHRcdFx0aWYodiA9PSBudWxsKSByZXR1cm4gXCJcIjtcblx0XHRcdGlmKHYgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gU1NGX2Zvcm1hdCgxNCwgZGF0ZW51bV9sb2NhbCh2LCBvcHRzICYmIG9wdHMuZGF0ZTE5MDQpLCBvcHRzKTtcblx0fVxuXHR0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCB2YWx1ZSBpbiBHZW5lcmFsIGZvcm1hdDogXCIgKyB2KTtcbn1cblxuZnVuY3Rpb24gU1NGX2ZpeF9oaWpyaShkYXRlLyo6RGF0ZSovLCBvLyo6W251bWJlciwgbnVtYmVyLCBudW1iZXJdKi8pIHtcbiAgLyogVE9ETzogcHJvcGVybHkgYWRqdXN0IHkvbS9kIGFuZCAgKi9cbiAgb1swXSAtPSA1ODE7XG4gIHZhciBkb3cgPSBkYXRlLmdldERheSgpO1xuICBpZihkYXRlIDwgNjApIGRvdyA9IChkb3cgKyA2KSAlIDc7XG4gIHJldHVybiBkb3c7XG59XG4vL3ZhciBUSEFJX0RJR0lUUyA9IFwiXFx1MEU1MFxcdTBFNTFcXHUwRTUyXFx1MEU1M1xcdTBFNTRcXHUwRTU1XFx1MEU1NlxcdTBFNTdcXHUwRTU4XFx1MEU1OVwiLnNwbGl0KFwiXCIpO1xuZnVuY3Rpb24gU1NGX3dyaXRlX2RhdGUodHlwZS8qOm51bWJlciovLCBmbXQvKjpzdHJpbmcqLywgdmFsLCBzczAvKjo/bnVtYmVyKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgbz1cIlwiLCBzcz0wLCB0dD0wLCB5ID0gdmFsLnksIG91dCwgb3V0bCA9IDA7XG5cdHN3aXRjaCh0eXBlKSB7XG5cdFx0Y2FzZSA5ODogLyogJ2InIGJ1ZGRoaXN0IHllYXIgKi9cblx0XHRcdHkgPSB2YWwueSArIDU0Mztcblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRjYXNlIDEyMTogLyogJ3knIHllYXIgKi9cblx0XHRzd2l0Y2goZm10Lmxlbmd0aCkge1xuXHRcdFx0Y2FzZSAxOiBjYXNlIDI6IG91dCA9IHkgJSAxMDA7IG91dGwgPSAyOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IG91dCA9IHkgJSAxMDAwMDsgb3V0bCA9IDQ7IGJyZWFrO1xuXHRcdH0gYnJlYWs7XG5cdFx0Y2FzZSAxMDk6IC8qICdtJyBtb250aCAqL1xuXHRcdHN3aXRjaChmbXQubGVuZ3RoKSB7XG5cdFx0XHRjYXNlIDE6IGNhc2UgMjogb3V0ID0gdmFsLm07IG91dGwgPSBmbXQubGVuZ3RoOyBicmVhaztcblx0XHRcdGNhc2UgMzogcmV0dXJuIG1vbnRoc1t2YWwubS0xXVsxXTtcblx0XHRcdGNhc2UgNTogcmV0dXJuIG1vbnRoc1t2YWwubS0xXVswXTtcblx0XHRcdGRlZmF1bHQ6IHJldHVybiBtb250aHNbdmFsLm0tMV1bMl07XG5cdFx0fSBicmVhaztcblx0XHRjYXNlIDEwMDogLyogJ2QnIGRheSAqL1xuXHRcdHN3aXRjaChmbXQubGVuZ3RoKSB7XG5cdFx0XHRjYXNlIDE6IGNhc2UgMjogb3V0ID0gdmFsLmQ7IG91dGwgPSBmbXQubGVuZ3RoOyBicmVhaztcblx0XHRcdGNhc2UgMzogcmV0dXJuIGRheXNbdmFsLnFdWzBdO1xuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIGRheXNbdmFsLnFdWzFdO1xuXHRcdH0gYnJlYWs7XG5cdFx0Y2FzZSAxMDQ6IC8qICdoJyAxMi1ob3VyICovXG5cdFx0c3dpdGNoKGZtdC5sZW5ndGgpIHtcblx0XHRcdGNhc2UgMTogY2FzZSAyOiBvdXQgPSAxKyh2YWwuSCsxMSklMTI7IG91dGwgPSBmbXQubGVuZ3RoOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93ICdiYWQgaG91ciBmb3JtYXQ6ICcgKyBmbXQ7XG5cdFx0fSBicmVhaztcblx0XHRjYXNlIDcyOiAvKiAnSCcgMjQtaG91ciAqL1xuXHRcdHN3aXRjaChmbXQubGVuZ3RoKSB7XG5cdFx0XHRjYXNlIDE6IGNhc2UgMjogb3V0ID0gdmFsLkg7IG91dGwgPSBmbXQubGVuZ3RoOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93ICdiYWQgaG91ciBmb3JtYXQ6ICcgKyBmbXQ7XG5cdFx0fSBicmVhaztcblx0XHRjYXNlIDc3OiAvKiAnTScgbWludXRlcyAqL1xuXHRcdHN3aXRjaChmbXQubGVuZ3RoKSB7XG5cdFx0XHRjYXNlIDE6IGNhc2UgMjogb3V0ID0gdmFsLk07IG91dGwgPSBmbXQubGVuZ3RoOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93ICdiYWQgbWludXRlIGZvcm1hdDogJyArIGZtdDtcblx0XHR9IGJyZWFrO1xuXHRcdGNhc2UgMTE1OiAvKiAncycgc2Vjb25kcyAqL1xuXHRcdFx0aWYoZm10ICE9ICdzJyAmJiBmbXQgIT0gJ3NzJyAmJiBmbXQgIT0gJy4wJyAmJiBmbXQgIT0gJy4wMCcgJiYgZm10ICE9ICcuMDAwJykgdGhyb3cgJ2JhZCBzZWNvbmQgZm9ybWF0OiAnICsgZm10O1xuXHRcdFx0aWYodmFsLnUgPT09IDAgJiYgKGZtdCA9PSBcInNcIiB8fCBmbXQgPT0gXCJzc1wiKSkgcmV0dXJuIHBhZDAodmFsLlMsIGZtdC5sZW5ndGgpO1xuXHRcdFx0Lyo6OmlmKCFzczApIHNzMCA9IDA7ICovXG5cdFx0XHRpZihzczAgPj0gMikgdHQgPSBzczAgPT09IDMgPyAxMDAwIDogMTAwO1xuXHRcdFx0ZWxzZSB0dCA9IHNzMCA9PT0gMSA/IDEwIDogMTtcblx0XHRcdHNzID0gTWF0aC5yb3VuZCgodHQpKih2YWwuUyArIHZhbC51KSk7XG5cdFx0XHRpZihzcyA+PSA2MCp0dCkgc3MgPSAwO1xuXHRcdFx0aWYoZm10ID09PSAncycpIHJldHVybiBzcyA9PT0gMCA/IFwiMFwiIDogXCJcIitzcy90dDtcblx0XHRcdG8gPSBwYWQwKHNzLDIgKyBzczApO1xuXHRcdFx0aWYoZm10ID09PSAnc3MnKSByZXR1cm4gby5zdWJzdHIoMCwyKTtcblx0XHRcdHJldHVybiBcIi5cIiArIG8uc3Vic3RyKDIsZm10Lmxlbmd0aC0xKTtcblx0XHRjYXNlIDkwOiAvKiAnWicgYWJzb2x1dGUgdGltZSAqL1xuXHRcdHN3aXRjaChmbXQpIHtcblx0XHRcdGNhc2UgJ1toXSc6IGNhc2UgJ1toaF0nOiBvdXQgPSB2YWwuRCoyNCt2YWwuSDsgYnJlYWs7XG5cdFx0XHRjYXNlICdbbV0nOiBjYXNlICdbbW1dJzogb3V0ID0gKHZhbC5EKjI0K3ZhbC5IKSo2MCt2YWwuTTsgYnJlYWs7XG5cdFx0XHRjYXNlICdbc10nOiBjYXNlICdbc3NdJzogb3V0ID0gKCh2YWwuRCoyNCt2YWwuSCkqNjArdmFsLk0pKjYwK01hdGgucm91bmQodmFsLlMrdmFsLnUpOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93ICdiYWQgYWJzdGltZSBmb3JtYXQ6ICcgKyBmbXQ7XG5cdFx0fSBvdXRsID0gZm10Lmxlbmd0aCA9PT0gMyA/IDEgOiAyOyBicmVhaztcblx0XHRjYXNlIDEwMTogLyogJ2UnIGVyYSAqL1xuXHRcdFx0b3V0ID0geTsgb3V0bCA9IDE7IGJyZWFrO1xuXHR9XG5cdHZhciBvdXRzdHIgPSBvdXRsID4gMCA/IHBhZDAob3V0LCBvdXRsKSA6IFwiXCI7XG5cdHJldHVybiBvdXRzdHI7XG59XG5cblxuLypqc2hpbnQgLVcwODYgKi9cbi8qanNoaW50ICtXMDg2ICovXG5mdW5jdGlvbiBjb21tYWlmeShzLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgdyA9IDM7XG5cdGlmKHMubGVuZ3RoIDw9IHcpIHJldHVybiBzO1xuXHR2YXIgaiA9IChzLmxlbmd0aCAlIHcpLCBvID0gcy5zdWJzdHIoMCxqKTtcblx0Zm9yKDsgaiE9cy5sZW5ndGg7IGorPXcpIG8rPShvLmxlbmd0aCA+IDAgPyBcIixcIiA6IFwiXCIpICsgcy5zdWJzdHIoaix3KTtcblx0cmV0dXJuIG87XG59XG52YXIgcGN0MSA9IC8lL2c7XG5mdW5jdGlvbiB3cml0ZV9udW1fcGN0KHR5cGUvKjpzdHJpbmcqLywgZm10Lyo6c3RyaW5nKi8sIHZhbC8qOm51bWJlciovKS8qOnN0cmluZyove1xuXHR2YXIgc2ZtdCA9IGZtdC5yZXBsYWNlKHBjdDEsXCJcIiksIG11bCA9IGZtdC5sZW5ndGggLSBzZm10Lmxlbmd0aDtcblx0cmV0dXJuIHdyaXRlX251bSh0eXBlLCBzZm10LCB2YWwgKiBNYXRoLnBvdygxMCwyKm11bCkpICsgZmlsbChcIiVcIixtdWwpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9udW1fY20odHlwZS8qOnN0cmluZyovLCBmbXQvKjpzdHJpbmcqLywgdmFsLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi97XG5cdHZhciBpZHggPSBmbXQubGVuZ3RoIC0gMTtcblx0d2hpbGUoZm10LmNoYXJDb2RlQXQoaWR4LTEpID09PSA0NCkgLS1pZHg7XG5cdHJldHVybiB3cml0ZV9udW0odHlwZSwgZm10LnN1YnN0cigwLGlkeCksIHZhbCAvIE1hdGgucG93KDEwLDMqKGZtdC5sZW5ndGgtaWR4KSkpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9udW1fZXhwKGZtdC8qOnN0cmluZyovLCB2YWwvKjpudW1iZXIqLykvKjpzdHJpbmcqL3tcblx0dmFyIG8vKjpzdHJpbmcqLztcblx0dmFyIGlkeCA9IGZtdC5pbmRleE9mKFwiRVwiKSAtIGZtdC5pbmRleE9mKFwiLlwiKSAtIDE7XG5cdGlmKGZtdC5tYXRjaCgvXiMrMC4wRVxcKzAkLykpIHtcblx0XHRpZih2YWwgPT0gMCkgcmV0dXJuIFwiMC4wRSswXCI7XG5cdFx0ZWxzZSBpZih2YWwgPCAwKSByZXR1cm4gXCItXCIgKyB3cml0ZV9udW1fZXhwKGZtdCwgLXZhbCk7XG5cdFx0dmFyIHBlcmlvZCA9IGZtdC5pbmRleE9mKFwiLlwiKTsgaWYocGVyaW9kID09PSAtMSkgcGVyaW9kPWZtdC5pbmRleE9mKCdFJyk7XG5cdFx0dmFyIGVlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWwpKk1hdGguTE9HMTBFKSVwZXJpb2Q7XG5cdFx0aWYoZWUgPCAwKSBlZSArPSBwZXJpb2Q7XG5cdFx0byA9ICh2YWwvTWF0aC5wb3coMTAsZWUpKS50b1ByZWNpc2lvbihpZHgrMSsocGVyaW9kK2VlKSVwZXJpb2QpO1xuXHRcdGlmKG8uaW5kZXhPZihcImVcIikgPT09IC0xKSB7XG5cdFx0XHR2YXIgZmFrZWUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbCkqTWF0aC5MT0cxMEUpO1xuXHRcdFx0aWYoby5pbmRleE9mKFwiLlwiKSA9PT0gLTEpIG8gPSBvLmNoYXJBdCgwKSArIFwiLlwiICsgby5zdWJzdHIoMSkgKyBcIkUrXCIgKyAoZmFrZWUgLSBvLmxlbmd0aCtlZSk7XG5cdFx0XHRlbHNlIG8gKz0gXCJFK1wiICsgKGZha2VlIC0gZWUpO1xuXHRcdFx0d2hpbGUoby5zdWJzdHIoMCwyKSA9PT0gXCIwLlwiKSB7XG5cdFx0XHRcdG8gPSBvLmNoYXJBdCgwKSArIG8uc3Vic3RyKDIscGVyaW9kKSArIFwiLlwiICsgby5zdWJzdHIoMitwZXJpb2QpO1xuXHRcdFx0XHRvID0gby5yZXBsYWNlKC9eMCsoWzEtOV0pLyxcIiQxXCIpLnJlcGxhY2UoL14wK1xcLi8sXCIwLlwiKTtcblx0XHRcdH1cblx0XHRcdG8gPSBvLnJlcGxhY2UoL1xcKy0vLFwiLVwiKTtcblx0XHR9XG5cdFx0byA9IG8ucmVwbGFjZSgvXihbKy1dPykoXFxkKilcXC4oXFxkKilbRWVdLyxmdW5jdGlvbigkJCwkMSwkMiwkMykgeyByZXR1cm4gJDEgKyAkMiArICQzLnN1YnN0cigwLChwZXJpb2QrZWUpJXBlcmlvZCkgKyBcIi5cIiArICQzLnN1YnN0cihlZSkgKyBcIkVcIjsgfSk7XG5cdH0gZWxzZSBvID0gdmFsLnRvRXhwb25lbnRpYWwoaWR4KTtcblx0aWYoZm10Lm1hdGNoKC9FXFwrMDAkLykgJiYgby5tYXRjaCgvZVsrLV1cXGQkLykpIG8gPSBvLnN1YnN0cigwLG8ubGVuZ3RoLTEpICsgXCIwXCIgKyBvLmNoYXJBdChvLmxlbmd0aC0xKTtcblx0aWYoZm10Lm1hdGNoKC9FXFwtLykgJiYgby5tYXRjaCgvZVxcKy8pKSBvID0gby5yZXBsYWNlKC9lXFwrLyxcImVcIik7XG5cdHJldHVybiBvLnJlcGxhY2UoXCJlXCIsXCJFXCIpO1xufVxudmFyIGZyYWMxID0gLyMgKFxcPyspKCA/KVxcLyggPykoXFxkKykvO1xuZnVuY3Rpb24gd3JpdGVfbnVtX2YxKHIvKjpBcnJheTxzdHJpbmc+Ki8sIGF2YWwvKjpudW1iZXIqLywgc2lnbi8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0dmFyIGRlbiA9IHBhcnNlSW50KHJbNF0sMTApLCByciA9IE1hdGgucm91bmQoYXZhbCAqIGRlbiksIGJhc2UgPSBNYXRoLmZsb29yKHJyL2Rlbik7XG5cdHZhciBteW4gPSAocnIgLSBiYXNlKmRlbiksIG15ZCA9IGRlbjtcblx0cmV0dXJuIHNpZ24gKyAoYmFzZSA9PT0gMCA/IFwiXCIgOiBcIlwiK2Jhc2UpICsgXCIgXCIgKyAobXluID09PSAwID8gZmlsbChcIiBcIiwgclsxXS5sZW5ndGggKyAxICsgcls0XS5sZW5ndGgpIDogcGFkXyhteW4sclsxXS5sZW5ndGgpICsgclsyXSArIFwiL1wiICsgclszXSArIHBhZDAobXlkLHJbNF0ubGVuZ3RoKSk7XG59XG5mdW5jdGlvbiB3cml0ZV9udW1fZjIoci8qOkFycmF5PHN0cmluZz4qLywgYXZhbC8qOm51bWJlciovLCBzaWduLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHRyZXR1cm4gc2lnbiArIChhdmFsID09PSAwID8gXCJcIiA6IFwiXCIrYXZhbCkgKyBmaWxsKFwiIFwiLCByWzFdLmxlbmd0aCArIDIgKyByWzRdLmxlbmd0aCk7XG59XG52YXIgZGVjMSA9IC9eIyowKlxcLihbMCNdKykvO1xudmFyIGNsb3NlcGFyZW4gPSAvXFwpLipbMCNdLztcbnZhciBwaG9uZSA9IC9cXCgjIyNcXCkgIyMjXFxcXD8tIyMjIy87XG5mdW5jdGlvbiBoYXNocShzdHIvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvID0gXCJcIiwgY2M7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gc3RyLmxlbmd0aDsgKytpKSBzd2l0Y2goKGNjPXN0ci5jaGFyQ29kZUF0KGkpKSkge1xuXHRcdGNhc2UgMzU6IGJyZWFrO1xuXHRcdGNhc2UgNjM6IG8rPSBcIiBcIjsgYnJlYWs7XG5cdFx0Y2FzZSA0ODogbys9IFwiMFwiOyBicmVhaztcblx0XHRkZWZhdWx0OiBvKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjYyk7XG5cdH1cblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiBybmQodmFsLyo6bnVtYmVyKi8sIGQvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7IHZhciBkZCA9IE1hdGgucG93KDEwLGQpOyByZXR1cm4gXCJcIisoTWF0aC5yb3VuZCh2YWwgKiBkZCkvZGQpOyB9XG5mdW5jdGlvbiBkZWModmFsLyo6bnVtYmVyKi8sIGQvKjpudW1iZXIqLykvKjpudW1iZXIqLyB7XG5cdHZhciBfZnJhYyA9IHZhbCAtIE1hdGguZmxvb3IodmFsKSwgZGQgPSBNYXRoLnBvdygxMCxkKTtcblx0aWYgKGQgPCAoJycgKyBNYXRoLnJvdW5kKF9mcmFjICogZGQpKS5sZW5ndGgpIHJldHVybiAwO1xuXHRyZXR1cm4gTWF0aC5yb3VuZChfZnJhYyAqIGRkKTtcbn1cbmZ1bmN0aW9uIGNhcnJ5KHZhbC8qOm51bWJlciovLCBkLyo6bnVtYmVyKi8pLyo6bnVtYmVyKi8ge1xuXHRpZiAoZCA8ICgnJyArIE1hdGgucm91bmQoKHZhbC1NYXRoLmZsb29yKHZhbCkpKk1hdGgucG93KDEwLGQpKSkubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5mdW5jdGlvbiBmbHIodmFsLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi8ge1xuXHRpZih2YWwgPCAyMTQ3NDgzNjQ3ICYmIHZhbCA+IC0yMTQ3NDgzNjQ4KSByZXR1cm4gXCJcIisodmFsID49IDAgPyAodmFsfDApIDogKHZhbC0xfDApKTtcblx0cmV0dXJuIFwiXCIrTWF0aC5mbG9vcih2YWwpO1xufVxuZnVuY3Rpb24gd3JpdGVfbnVtX2ZsdCh0eXBlLyo6c3RyaW5nKi8sIGZtdC8qOnN0cmluZyovLCB2YWwvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7XG5cdGlmKHR5cGUuY2hhckNvZGVBdCgwKSA9PT0gNDAgJiYgIWZtdC5tYXRjaChjbG9zZXBhcmVuKSkge1xuXHRcdHZhciBmZm10ID0gZm10LnJlcGxhY2UoL1xcKCAqLyxcIlwiKS5yZXBsYWNlKC8gXFwpLyxcIlwiKS5yZXBsYWNlKC9cXCkvLFwiXCIpO1xuXHRcdGlmKHZhbCA+PSAwKSByZXR1cm4gd3JpdGVfbnVtX2ZsdCgnbicsIGZmbXQsIHZhbCk7XG5cdFx0cmV0dXJuICcoJyArIHdyaXRlX251bV9mbHQoJ24nLCBmZm10LCAtdmFsKSArICcpJztcblx0fVxuXHRpZihmbXQuY2hhckNvZGVBdChmbXQubGVuZ3RoIC0gMSkgPT09IDQ0KSByZXR1cm4gd3JpdGVfbnVtX2NtKHR5cGUsIGZtdCwgdmFsKTtcblx0aWYoZm10LmluZGV4T2YoJyUnKSAhPT0gLTEpIHJldHVybiB3cml0ZV9udW1fcGN0KHR5cGUsIGZtdCwgdmFsKTtcblx0aWYoZm10LmluZGV4T2YoJ0UnKSAhPT0gLTEpIHJldHVybiB3cml0ZV9udW1fZXhwKGZtdCwgdmFsKTtcblx0aWYoZm10LmNoYXJDb2RlQXQoMCkgPT09IDM2KSByZXR1cm4gXCIkXCIrd3JpdGVfbnVtX2ZsdCh0eXBlLGZtdC5zdWJzdHIoZm10LmNoYXJBdCgxKT09JyAnPzI6MSksdmFsKTtcblx0dmFyIG87XG5cdHZhciByLyo6P0FycmF5PHN0cmluZz4qLywgcmksIGZmLCBhdmFsID0gTWF0aC5hYnModmFsKSwgc2lnbiA9IHZhbCA8IDAgPyBcIi1cIiA6IFwiXCI7XG5cdGlmKGZtdC5tYXRjaCgvXjAwKyQvKSkgcmV0dXJuIHNpZ24gKyBwYWQwcihhdmFsLGZtdC5sZW5ndGgpO1xuXHRpZihmbXQubWF0Y2goL15bIz9dKyQvKSkge1xuXHRcdG8gPSBwYWQwcih2YWwsMCk7IGlmKG8gPT09IFwiMFwiKSBvID0gXCJcIjtcblx0XHRyZXR1cm4gby5sZW5ndGggPiBmbXQubGVuZ3RoID8gbyA6IGhhc2hxKGZtdC5zdWJzdHIoMCxmbXQubGVuZ3RoLW8ubGVuZ3RoKSkgKyBvO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKGZyYWMxKSkpIHJldHVybiB3cml0ZV9udW1fZjEociwgYXZhbCwgc2lnbik7XG5cdGlmKGZtdC5tYXRjaCgvXiMrMCskLykpIHJldHVybiBzaWduICsgcGFkMHIoYXZhbCxmbXQubGVuZ3RoIC0gZm10LmluZGV4T2YoXCIwXCIpKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goZGVjMSkpKSB7XG5cdFx0byA9IHJuZCh2YWwsIHJbMV0ubGVuZ3RoKS5yZXBsYWNlKC9eKFteXFwuXSspJC8sXCIkMS5cIitoYXNocShyWzFdKSkucmVwbGFjZSgvXFwuJC8sXCIuXCIraGFzaHEoclsxXSkpLnJlcGxhY2UoL1xcLihcXGQqKSQvLGZ1bmN0aW9uKCQkLCAkMSkgeyByZXR1cm4gXCIuXCIgKyAkMSArIGZpbGwoXCIwXCIsIGhhc2hxKC8qOjooKi9yLyo6Onx8W1wiXCJdKSovWzFdKS5sZW5ndGgtJDEubGVuZ3RoKTsgfSk7XG5cdFx0cmV0dXJuIGZtdC5pbmRleE9mKFwiMC5cIikgIT09IC0xID8gbyA6IG8ucmVwbGFjZSgvXjBcXC4vLFwiLlwiKTtcblx0fVxuXHRmbXQgPSBmbXQucmVwbGFjZSgvXiMrKFswLl0pLywgXCIkMVwiKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goL14oMCopXFwuKCMqKSQvKSkpIHtcblx0XHRyZXR1cm4gc2lnbiArIHJuZChhdmFsLCByWzJdLmxlbmd0aCkucmVwbGFjZSgvXFwuKFxcZCpbMS05XSkwKiQvLFwiLiQxXCIpLnJlcGxhY2UoL14oLT9cXGQqKSQvLFwiJDEuXCIpLnJlcGxhY2UoL14wXFwuLyxyWzFdLmxlbmd0aD9cIjAuXCI6XCIuXCIpO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eI3sxLDN9LCMjMChcXC4/KSQvKSkpIHJldHVybiBzaWduICsgY29tbWFpZnkocGFkMHIoYXZhbCwwKSk7XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eIywjIzBcXC4oWyMwXSowKSQvKSkpIHtcblx0XHRyZXR1cm4gdmFsIDwgMCA/IFwiLVwiICsgd3JpdGVfbnVtX2ZsdCh0eXBlLCBmbXQsIC12YWwpIDogY29tbWFpZnkoXCJcIisoTWF0aC5mbG9vcih2YWwpICsgY2FycnkodmFsLCByWzFdLmxlbmd0aCkpKSArIFwiLlwiICsgcGFkMChkZWModmFsLCByWzFdLmxlbmd0aCksclsxXS5sZW5ndGgpO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eIywjKiwjMC8pKSkgcmV0dXJuIHdyaXRlX251bV9mbHQodHlwZSxmbXQucmVwbGFjZSgvXiMsIyosLyxcIlwiKSx2YWwpO1xuXHRpZigociA9IGZtdC5tYXRjaCgvXihbMCNdKykoXFxcXD8tKFswI10rKSkrJC8pKSkge1xuXHRcdG8gPSBfc3RycmV2KHdyaXRlX251bV9mbHQodHlwZSwgZm10LnJlcGxhY2UoL1tcXFxcLV0vZyxcIlwiKSwgdmFsKSk7XG5cdFx0cmkgPSAwO1xuXHRcdHJldHVybiBfc3RycmV2KF9zdHJyZXYoZm10LnJlcGxhY2UoL1xcXFwvZyxcIlwiKSkucmVwbGFjZSgvWzAjXS9nLGZ1bmN0aW9uKHgpe3JldHVybiByaTxvLmxlbmd0aD9vLmNoYXJBdChyaSsrKTp4PT09JzAnPycwJzpcIlwiO30pKTtcblx0fVxuXHRpZihmbXQubWF0Y2gocGhvbmUpKSB7XG5cdFx0byA9IHdyaXRlX251bV9mbHQodHlwZSwgXCIjIyMjIyMjIyMjXCIsIHZhbCk7XG5cdFx0cmV0dXJuIFwiKFwiICsgby5zdWJzdHIoMCwzKSArIFwiKSBcIiArIG8uc3Vic3RyKDMsIDMpICsgXCItXCIgKyBvLnN1YnN0cig2KTtcblx0fVxuXHR2YXIgb2EgPSBcIlwiO1xuXHRpZigociA9IGZtdC5tYXRjaCgvXihbIzA/XSspKCA/KVxcLyggPykoWyMwP10rKS8pKSkge1xuXHRcdHJpID0gTWF0aC5taW4oLyo6OlN0cmluZygqL3JbNF0vKjo6KSovLmxlbmd0aCw3KTtcblx0XHRmZiA9IFNTRl9mcmFjKGF2YWwsIE1hdGgucG93KDEwLHJpKS0xLCBmYWxzZSk7XG5cdFx0byA9IFwiXCIgKyBzaWduO1xuXHRcdG9hID0gd3JpdGVfbnVtKFwiblwiLCAvKjo6U3RyaW5nKCovclsxXS8qOjopKi8sIGZmWzFdKTtcblx0XHRpZihvYS5jaGFyQXQob2EubGVuZ3RoLTEpID09IFwiIFwiKSBvYSA9IG9hLnN1YnN0cigwLG9hLmxlbmd0aC0xKSArIFwiMFwiO1xuXHRcdG8gKz0gb2EgKyAvKjo6U3RyaW5nKCovclsyXS8qOjopKi8gKyBcIi9cIiArIC8qOjpTdHJpbmcoKi9yWzNdLyo6OikqLztcblx0XHRvYSA9IHJwYWRfKGZmWzJdLHJpKTtcblx0XHRpZihvYS5sZW5ndGggPCByWzRdLmxlbmd0aCkgb2EgPSBoYXNocShyWzRdLnN1YnN0cihyWzRdLmxlbmd0aC1vYS5sZW5ndGgpKSArIG9hO1xuXHRcdG8gKz0gb2E7XG5cdFx0cmV0dXJuIG87XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL14jIChbIzA/XSspKCA/KVxcLyggPykoWyMwP10rKS8pKSkge1xuXHRcdHJpID0gTWF0aC5taW4oTWF0aC5tYXgoclsxXS5sZW5ndGgsIHJbNF0ubGVuZ3RoKSw3KTtcblx0XHRmZiA9IFNTRl9mcmFjKGF2YWwsIE1hdGgucG93KDEwLHJpKS0xLCB0cnVlKTtcblx0XHRyZXR1cm4gc2lnbiArIChmZlswXXx8KGZmWzFdID8gXCJcIiA6IFwiMFwiKSkgKyBcIiBcIiArIChmZlsxXSA/IHBhZF8oZmZbMV0scmkpICsgclsyXSArIFwiL1wiICsgclszXSArIHJwYWRfKGZmWzJdLHJpKTogZmlsbChcIiBcIiwgMipyaSsxICsgclsyXS5sZW5ndGggKyByWzNdLmxlbmd0aCkpO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eWyMwP10rJC8pKSkge1xuXHRcdG8gPSBwYWQwcih2YWwsIDApO1xuXHRcdGlmKGZtdC5sZW5ndGggPD0gby5sZW5ndGgpIHJldHVybiBvO1xuXHRcdHJldHVybiBoYXNocShmbXQuc3Vic3RyKDAsZm10Lmxlbmd0aC1vLmxlbmd0aCkpICsgbztcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaCgvXihbIzA/XSspXFwuKFsjMF0rKSQvKSkpIHtcblx0XHRvID0gXCJcIiArIHZhbC50b0ZpeGVkKE1hdGgubWluKHJbMl0ubGVuZ3RoLDEwKSkucmVwbGFjZSgvKFteMF0pMCskLyxcIiQxXCIpO1xuXHRcdHJpID0gby5pbmRleE9mKFwiLlwiKTtcblx0XHR2YXIgbHJlcyA9IGZtdC5pbmRleE9mKFwiLlwiKSAtIHJpLCBycmVzID0gZm10Lmxlbmd0aCAtIG8ubGVuZ3RoIC0gbHJlcztcblx0XHRyZXR1cm4gaGFzaHEoZm10LnN1YnN0cigwLGxyZXMpICsgbyArIGZtdC5zdWJzdHIoZm10Lmxlbmd0aC1ycmVzKSk7XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL14wMCwwMDBcXC4oWyMwXSowKSQvKSkpIHtcblx0XHRyaSA9IGRlYyh2YWwsIHJbMV0ubGVuZ3RoKTtcblx0XHRyZXR1cm4gdmFsIDwgMCA/IFwiLVwiICsgd3JpdGVfbnVtX2ZsdCh0eXBlLCBmbXQsIC12YWwpIDogY29tbWFpZnkoZmxyKHZhbCkpLnJlcGxhY2UoL15cXGQsXFxkezN9JC8sXCIwJCZcIikucmVwbGFjZSgvXlxcZCokLyxmdW5jdGlvbigkJCkgeyByZXR1cm4gXCIwMCxcIiArICgkJC5sZW5ndGggPCAzID8gcGFkMCgwLDMtJCQubGVuZ3RoKSA6IFwiXCIpICsgJCQ7IH0pICsgXCIuXCIgKyBwYWQwKHJpLHJbMV0ubGVuZ3RoKTtcblx0fVxuXHRzd2l0Y2goZm10KSB7XG5cdFx0Y2FzZSBcIiMjIywjIzAuMDBcIjogcmV0dXJuIHdyaXRlX251bV9mbHQodHlwZSwgXCIjLCMjMC4wMFwiLCB2YWwpO1xuXHRcdGNhc2UgXCIjIyMsIyMjXCI6XG5cdFx0Y2FzZSBcIiMjLCMjI1wiOlxuXHRcdGNhc2UgXCIjLCMjI1wiOiB2YXIgeCA9IGNvbW1haWZ5KHBhZDByKGF2YWwsMCkpOyByZXR1cm4geCAhPT0gXCIwXCIgPyBzaWduICsgeCA6IFwiXCI7XG5cdFx0Y2FzZSBcIiMjIywjIyMuMDBcIjogcmV0dXJuIHdyaXRlX251bV9mbHQodHlwZSwgXCIjIyMsIyMwLjAwXCIsdmFsKS5yZXBsYWNlKC9eMFxcLi8sXCIuXCIpO1xuXHRcdGNhc2UgXCIjLCMjIy4wMFwiOiByZXR1cm4gd3JpdGVfbnVtX2ZsdCh0eXBlLCBcIiMsIyMwLjAwXCIsdmFsKS5yZXBsYWNlKC9eMFxcLi8sXCIuXCIpO1xuXHRcdGRlZmF1bHQ6XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgZm9ybWF0IHxcIiArIGZtdCArIFwifFwiKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX251bV9jbTIodHlwZS8qOnN0cmluZyovLCBmbXQvKjpzdHJpbmcqLywgdmFsLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi97XG5cdHZhciBpZHggPSBmbXQubGVuZ3RoIC0gMTtcblx0d2hpbGUoZm10LmNoYXJDb2RlQXQoaWR4LTEpID09PSA0NCkgLS1pZHg7XG5cdHJldHVybiB3cml0ZV9udW0odHlwZSwgZm10LnN1YnN0cigwLGlkeCksIHZhbCAvIE1hdGgucG93KDEwLDMqKGZtdC5sZW5ndGgtaWR4KSkpO1xufVxuZnVuY3Rpb24gd3JpdGVfbnVtX3BjdDIodHlwZS8qOnN0cmluZyovLCBmbXQvKjpzdHJpbmcqLywgdmFsLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi97XG5cdHZhciBzZm10ID0gZm10LnJlcGxhY2UocGN0MSxcIlwiKSwgbXVsID0gZm10Lmxlbmd0aCAtIHNmbXQubGVuZ3RoO1xuXHRyZXR1cm4gd3JpdGVfbnVtKHR5cGUsIHNmbXQsIHZhbCAqIE1hdGgucG93KDEwLDIqbXVsKSkgKyBmaWxsKFwiJVwiLG11bCk7XG59XG5mdW5jdGlvbiB3cml0ZV9udW1fZXhwMihmbXQvKjpzdHJpbmcqLywgdmFsLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi97XG5cdHZhciBvLyo6c3RyaW5nKi87XG5cdHZhciBpZHggPSBmbXQuaW5kZXhPZihcIkVcIikgLSBmbXQuaW5kZXhPZihcIi5cIikgLSAxO1xuXHRpZihmbXQubWF0Y2goL14jKzAuMEVcXCswJC8pKSB7XG5cdFx0aWYodmFsID09IDApIHJldHVybiBcIjAuMEUrMFwiO1xuXHRcdGVsc2UgaWYodmFsIDwgMCkgcmV0dXJuIFwiLVwiICsgd3JpdGVfbnVtX2V4cDIoZm10LCAtdmFsKTtcblx0XHR2YXIgcGVyaW9kID0gZm10LmluZGV4T2YoXCIuXCIpOyBpZihwZXJpb2QgPT09IC0xKSBwZXJpb2Q9Zm10LmluZGV4T2YoJ0UnKTtcblx0XHR2YXIgZWUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbCkqTWF0aC5MT0cxMEUpJXBlcmlvZDtcblx0XHRpZihlZSA8IDApIGVlICs9IHBlcmlvZDtcblx0XHRvID0gKHZhbC9NYXRoLnBvdygxMCxlZSkpLnRvUHJlY2lzaW9uKGlkeCsxKyhwZXJpb2QrZWUpJXBlcmlvZCk7XG5cdFx0aWYoIW8ubWF0Y2goL1tFZV0vKSkge1xuXHRcdFx0dmFyIGZha2VlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWwpKk1hdGguTE9HMTBFKTtcblx0XHRcdGlmKG8uaW5kZXhPZihcIi5cIikgPT09IC0xKSBvID0gby5jaGFyQXQoMCkgKyBcIi5cIiArIG8uc3Vic3RyKDEpICsgXCJFK1wiICsgKGZha2VlIC0gby5sZW5ndGgrZWUpO1xuXHRcdFx0ZWxzZSBvICs9IFwiRStcIiArIChmYWtlZSAtIGVlKTtcblx0XHRcdG8gPSBvLnJlcGxhY2UoL1xcKy0vLFwiLVwiKTtcblx0XHR9XG5cdFx0byA9IG8ucmVwbGFjZSgvXihbKy1dPykoXFxkKilcXC4oXFxkKilbRWVdLyxmdW5jdGlvbigkJCwkMSwkMiwkMykgeyByZXR1cm4gJDEgKyAkMiArICQzLnN1YnN0cigwLChwZXJpb2QrZWUpJXBlcmlvZCkgKyBcIi5cIiArICQzLnN1YnN0cihlZSkgKyBcIkVcIjsgfSk7XG5cdH0gZWxzZSBvID0gdmFsLnRvRXhwb25lbnRpYWwoaWR4KTtcblx0aWYoZm10Lm1hdGNoKC9FXFwrMDAkLykgJiYgby5tYXRjaCgvZVsrLV1cXGQkLykpIG8gPSBvLnN1YnN0cigwLG8ubGVuZ3RoLTEpICsgXCIwXCIgKyBvLmNoYXJBdChvLmxlbmd0aC0xKTtcblx0aWYoZm10Lm1hdGNoKC9FXFwtLykgJiYgby5tYXRjaCgvZVxcKy8pKSBvID0gby5yZXBsYWNlKC9lXFwrLyxcImVcIik7XG5cdHJldHVybiBvLnJlcGxhY2UoXCJlXCIsXCJFXCIpO1xufVxuZnVuY3Rpb24gd3JpdGVfbnVtX2ludCh0eXBlLyo6c3RyaW5nKi8sIGZtdC8qOnN0cmluZyovLCB2YWwvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7XG5cdGlmKHR5cGUuY2hhckNvZGVBdCgwKSA9PT0gNDAgJiYgIWZtdC5tYXRjaChjbG9zZXBhcmVuKSkge1xuXHRcdHZhciBmZm10ID0gZm10LnJlcGxhY2UoL1xcKCAqLyxcIlwiKS5yZXBsYWNlKC8gXFwpLyxcIlwiKS5yZXBsYWNlKC9cXCkvLFwiXCIpO1xuXHRcdGlmKHZhbCA+PSAwKSByZXR1cm4gd3JpdGVfbnVtX2ludCgnbicsIGZmbXQsIHZhbCk7XG5cdFx0cmV0dXJuICcoJyArIHdyaXRlX251bV9pbnQoJ24nLCBmZm10LCAtdmFsKSArICcpJztcblx0fVxuXHRpZihmbXQuY2hhckNvZGVBdChmbXQubGVuZ3RoIC0gMSkgPT09IDQ0KSByZXR1cm4gd3JpdGVfbnVtX2NtMih0eXBlLCBmbXQsIHZhbCk7XG5cdGlmKGZtdC5pbmRleE9mKCclJykgIT09IC0xKSByZXR1cm4gd3JpdGVfbnVtX3BjdDIodHlwZSwgZm10LCB2YWwpO1xuXHRpZihmbXQuaW5kZXhPZignRScpICE9PSAtMSkgcmV0dXJuIHdyaXRlX251bV9leHAyKGZtdCwgdmFsKTtcblx0aWYoZm10LmNoYXJDb2RlQXQoMCkgPT09IDM2KSByZXR1cm4gXCIkXCIrd3JpdGVfbnVtX2ludCh0eXBlLGZtdC5zdWJzdHIoZm10LmNoYXJBdCgxKT09JyAnPzI6MSksdmFsKTtcblx0dmFyIG87XG5cdHZhciByLyo6P0FycmF5PHN0cmluZz4qLywgcmksIGZmLCBhdmFsID0gTWF0aC5hYnModmFsKSwgc2lnbiA9IHZhbCA8IDAgPyBcIi1cIiA6IFwiXCI7XG5cdGlmKGZtdC5tYXRjaCgvXjAwKyQvKSkgcmV0dXJuIHNpZ24gKyBwYWQwKGF2YWwsZm10Lmxlbmd0aCk7XG5cdGlmKGZtdC5tYXRjaCgvXlsjP10rJC8pKSB7XG5cdFx0byA9IChcIlwiK3ZhbCk7IGlmKHZhbCA9PT0gMCkgbyA9IFwiXCI7XG5cdFx0cmV0dXJuIG8ubGVuZ3RoID4gZm10Lmxlbmd0aCA/IG8gOiBoYXNocShmbXQuc3Vic3RyKDAsZm10Lmxlbmd0aC1vLmxlbmd0aCkpICsgbztcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaChmcmFjMSkpKSByZXR1cm4gd3JpdGVfbnVtX2YyKHIsIGF2YWwsIHNpZ24pO1xuXHRpZihmbXQubWF0Y2goL14jKzArJC8pKSByZXR1cm4gc2lnbiArIHBhZDAoYXZhbCxmbXQubGVuZ3RoIC0gZm10LmluZGV4T2YoXCIwXCIpKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goZGVjMSkpKSB7XG5cdFx0Lyo6OiBpZighQXJyYXkuaXNBcnJheShyKSkgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7ICovXG5cdFx0byA9IChcIlwiK3ZhbCkucmVwbGFjZSgvXihbXlxcLl0rKSQvLFwiJDEuXCIraGFzaHEoclsxXSkpLnJlcGxhY2UoL1xcLiQvLFwiLlwiK2hhc2hxKHJbMV0pKTtcblx0XHRvID0gby5yZXBsYWNlKC9cXC4oXFxkKikkLyxmdW5jdGlvbigkJCwgJDEpIHtcblx0XHQvKjo6IGlmKCFBcnJheS5pc0FycmF5KHIpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRcdHJldHVybiBcIi5cIiArICQxICsgZmlsbChcIjBcIiwgaGFzaHEoclsxXSkubGVuZ3RoLSQxLmxlbmd0aCk7IH0pO1xuXHRcdHJldHVybiBmbXQuaW5kZXhPZihcIjAuXCIpICE9PSAtMSA/IG8gOiBvLnJlcGxhY2UoL14wXFwuLyxcIi5cIik7XG5cdH1cblx0Zm10ID0gZm10LnJlcGxhY2UoL14jKyhbMC5dKS8sIFwiJDFcIik7XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eKDAqKVxcLigjKikkLykpKSB7XG5cdFx0cmV0dXJuIHNpZ24gKyAoXCJcIithdmFsKS5yZXBsYWNlKC9cXC4oXFxkKlsxLTldKTAqJC8sXCIuJDFcIikucmVwbGFjZSgvXigtP1xcZCopJC8sXCIkMS5cIikucmVwbGFjZSgvXjBcXC4vLHJbMV0ubGVuZ3RoP1wiMC5cIjpcIi5cIik7XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL14jezEsM30sIyMwKFxcLj8pJC8pKSkgcmV0dXJuIHNpZ24gKyBjb21tYWlmeSgoXCJcIithdmFsKSk7XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eIywjIzBcXC4oWyMwXSowKSQvKSkpIHtcblx0XHRyZXR1cm4gdmFsIDwgMCA/IFwiLVwiICsgd3JpdGVfbnVtX2ludCh0eXBlLCBmbXQsIC12YWwpIDogY29tbWFpZnkoKFwiXCIrdmFsKSkgKyBcIi5cIiArIGZpbGwoJzAnLHJbMV0ubGVuZ3RoKTtcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaCgvXiMsIyosIzAvKSkpIHJldHVybiB3cml0ZV9udW1faW50KHR5cGUsZm10LnJlcGxhY2UoL14jLCMqLC8sXCJcIiksdmFsKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goL14oWzAjXSspKFxcXFw/LShbMCNdKykpKyQvKSkpIHtcblx0XHRvID0gX3N0cnJldih3cml0ZV9udW1faW50KHR5cGUsIGZtdC5yZXBsYWNlKC9bXFxcXC1dL2csXCJcIiksIHZhbCkpO1xuXHRcdHJpID0gMDtcblx0XHRyZXR1cm4gX3N0cnJldihfc3RycmV2KGZtdC5yZXBsYWNlKC9cXFxcL2csXCJcIikpLnJlcGxhY2UoL1swI10vZyxmdW5jdGlvbih4KXtyZXR1cm4gcmk8by5sZW5ndGg/by5jaGFyQXQocmkrKyk6eD09PScwJz8nMCc6XCJcIjt9KSk7XG5cdH1cblx0aWYoZm10Lm1hdGNoKHBob25lKSkge1xuXHRcdG8gPSB3cml0ZV9udW1faW50KHR5cGUsIFwiIyMjIyMjIyMjI1wiLCB2YWwpO1xuXHRcdHJldHVybiBcIihcIiArIG8uc3Vic3RyKDAsMykgKyBcIikgXCIgKyBvLnN1YnN0cigzLCAzKSArIFwiLVwiICsgby5zdWJzdHIoNik7XG5cdH1cblx0dmFyIG9hID0gXCJcIjtcblx0aWYoKHIgPSBmbXQubWF0Y2goL14oWyMwP10rKSggPylcXC8oID8pKFsjMD9dKykvKSkpIHtcblx0XHRyaSA9IE1hdGgubWluKC8qOjpTdHJpbmcoKi9yWzRdLyo6OikqLy5sZW5ndGgsNyk7XG5cdFx0ZmYgPSBTU0ZfZnJhYyhhdmFsLCBNYXRoLnBvdygxMCxyaSktMSwgZmFsc2UpO1xuXHRcdG8gPSBcIlwiICsgc2lnbjtcblx0XHRvYSA9IHdyaXRlX251bShcIm5cIiwgLyo6OlN0cmluZygqL3JbMV0vKjo6KSovLCBmZlsxXSk7XG5cdFx0aWYob2EuY2hhckF0KG9hLmxlbmd0aC0xKSA9PSBcIiBcIikgb2EgPSBvYS5zdWJzdHIoMCxvYS5sZW5ndGgtMSkgKyBcIjBcIjtcblx0XHRvICs9IG9hICsgLyo6OlN0cmluZygqL3JbMl0vKjo6KSovICsgXCIvXCIgKyAvKjo6U3RyaW5nKCovclszXS8qOjopKi87XG5cdFx0b2EgPSBycGFkXyhmZlsyXSxyaSk7XG5cdFx0aWYob2EubGVuZ3RoIDwgcls0XS5sZW5ndGgpIG9hID0gaGFzaHEocls0XS5zdWJzdHIocls0XS5sZW5ndGgtb2EubGVuZ3RoKSkgKyBvYTtcblx0XHRvICs9IG9hO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eIyAoWyMwP10rKSggPylcXC8oID8pKFsjMD9dKykvKSkpIHtcblx0XHRyaSA9IE1hdGgubWluKE1hdGgubWF4KHJbMV0ubGVuZ3RoLCByWzRdLmxlbmd0aCksNyk7XG5cdFx0ZmYgPSBTU0ZfZnJhYyhhdmFsLCBNYXRoLnBvdygxMCxyaSktMSwgdHJ1ZSk7XG5cdFx0cmV0dXJuIHNpZ24gKyAoZmZbMF18fChmZlsxXSA/IFwiXCIgOiBcIjBcIikpICsgXCIgXCIgKyAoZmZbMV0gPyBwYWRfKGZmWzFdLHJpKSArIHJbMl0gKyBcIi9cIiArIHJbM10gKyBycGFkXyhmZlsyXSxyaSk6IGZpbGwoXCIgXCIsIDIqcmkrMSArIHJbMl0ubGVuZ3RoICsgclszXS5sZW5ndGgpKTtcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaCgvXlsjMD9dKyQvKSkpIHtcblx0XHRvID0gXCJcIiArIHZhbDtcblx0XHRpZihmbXQubGVuZ3RoIDw9IG8ubGVuZ3RoKSByZXR1cm4gbztcblx0XHRyZXR1cm4gaGFzaHEoZm10LnN1YnN0cigwLGZtdC5sZW5ndGgtby5sZW5ndGgpKSArIG87XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL14oWyMwXSspXFwuKFsjMF0rKSQvKSkpIHtcblx0XHRvID0gXCJcIiArIHZhbC50b0ZpeGVkKE1hdGgubWluKHJbMl0ubGVuZ3RoLDEwKSkucmVwbGFjZSgvKFteMF0pMCskLyxcIiQxXCIpO1xuXHRcdHJpID0gby5pbmRleE9mKFwiLlwiKTtcblx0XHR2YXIgbHJlcyA9IGZtdC5pbmRleE9mKFwiLlwiKSAtIHJpLCBycmVzID0gZm10Lmxlbmd0aCAtIG8ubGVuZ3RoIC0gbHJlcztcblx0XHRyZXR1cm4gaGFzaHEoZm10LnN1YnN0cigwLGxyZXMpICsgbyArIGZtdC5zdWJzdHIoZm10Lmxlbmd0aC1ycmVzKSk7XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL14wMCwwMDBcXC4oWyMwXSowKSQvKSkpIHtcblx0XHRyZXR1cm4gdmFsIDwgMCA/IFwiLVwiICsgd3JpdGVfbnVtX2ludCh0eXBlLCBmbXQsIC12YWwpIDogY29tbWFpZnkoXCJcIit2YWwpLnJlcGxhY2UoL15cXGQsXFxkezN9JC8sXCIwJCZcIikucmVwbGFjZSgvXlxcZCokLyxmdW5jdGlvbigkJCkgeyByZXR1cm4gXCIwMCxcIiArICgkJC5sZW5ndGggPCAzID8gcGFkMCgwLDMtJCQubGVuZ3RoKSA6IFwiXCIpICsgJCQ7IH0pICsgXCIuXCIgKyBwYWQwKDAsclsxXS5sZW5ndGgpO1xuXHR9XG5cdHN3aXRjaChmbXQpIHtcblx0XHRjYXNlIFwiIyMjLCMjI1wiOlxuXHRcdGNhc2UgXCIjIywjIyNcIjpcblx0XHRjYXNlIFwiIywjIyNcIjogdmFyIHggPSBjb21tYWlmeShcIlwiK2F2YWwpOyByZXR1cm4geCAhPT0gXCIwXCIgPyBzaWduICsgeCA6IFwiXCI7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGlmKGZtdC5tYXRjaCgvXFwuWzAjP10qJC8pKSByZXR1cm4gd3JpdGVfbnVtX2ludCh0eXBlLCBmbXQuc2xpY2UoMCxmbXQubGFzdEluZGV4T2YoXCIuXCIpKSwgdmFsKSArIGhhc2hxKGZtdC5zbGljZShmbXQubGFzdEluZGV4T2YoXCIuXCIpKSk7XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgZm9ybWF0IHxcIiArIGZtdCArIFwifFwiKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX251bSh0eXBlLyo6c3RyaW5nKi8sIGZtdC8qOnN0cmluZyovLCB2YWwvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7XG5cdHJldHVybiAodmFsfDApID09PSB2YWwgPyB3cml0ZV9udW1faW50KHR5cGUsIGZtdCwgdmFsKSA6IHdyaXRlX251bV9mbHQodHlwZSwgZm10LCB2YWwpO1xufVxuZnVuY3Rpb24gU1NGX3NwbGl0X2ZtdChmbXQvKjpzdHJpbmcqLykvKjpBcnJheTxzdHJpbmc+Ki8ge1xuXHR2YXIgb3V0Lyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdHZhciBpbl9zdHIgPSBmYWxzZS8qLCBjYyovO1xuXHRmb3IodmFyIGkgPSAwLCBqID0gMDsgaSA8IGZtdC5sZW5ndGg7ICsraSkgc3dpdGNoKCgvKmNjPSovZm10LmNoYXJDb2RlQXQoaSkpKSB7XG5cdFx0Y2FzZSAzNDogLyogJ1wiJyAqL1xuXHRcdFx0aW5fc3RyID0gIWluX3N0cjsgYnJlYWs7XG5cdFx0Y2FzZSA5NTogY2FzZSA0MjogY2FzZSA5MjogLyogJ18nICcqJyAnXFxcXCcgKi9cblx0XHRcdCsraTsgYnJlYWs7XG5cdFx0Y2FzZSA1OTogLyogJzsnICovXG5cdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSBmbXQuc3Vic3RyKGosaS1qKTtcblx0XHRcdGogPSBpKzE7XG5cdH1cblx0b3V0W291dC5sZW5ndGhdID0gZm10LnN1YnN0cihqKTtcblx0aWYoaW5fc3RyID09PSB0cnVlKSB0aHJvdyBuZXcgRXJyb3IoXCJGb3JtYXQgfFwiICsgZm10ICsgXCJ8IHVudGVybWluYXRlZCBzdHJpbmcgXCIpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG52YXIgU1NGX2Fic3RpbWUgPSAvXFxbW0hoTW1Tc1xcdTBFMEFcXHUwRTE5XFx1MEUxN10qXFxdLztcbmZ1bmN0aW9uIGZtdF9pc19kYXRlKGZtdC8qOnN0cmluZyovKS8qOmJvb2xlYW4qLyB7XG5cdHZhciBpID0gMCwgLypjYyA9IDAsKi8gYyA9IFwiXCIsIG8gPSBcIlwiO1xuXHR3aGlsZShpIDwgZm10Lmxlbmd0aCkge1xuXHRcdHN3aXRjaCgoYyA9IGZtdC5jaGFyQXQoaSkpKSB7XG5cdFx0XHRjYXNlICdHJzogaWYoU1NGX2lzZ2VuZXJhbChmbXQsIGkpKSBpKz0gNjsgaSsrOyBicmVhaztcblx0XHRcdGNhc2UgJ1wiJzogZm9yKDsoLypjYz0qL2ZtdC5jaGFyQ29kZUF0KCsraSkpICE9PSAzNCAmJiBpIDwgZm10Lmxlbmd0aDspey8qZW1wdHkqL30gKytpOyBicmVhaztcblx0XHRcdGNhc2UgJ1xcXFwnOiBpKz0yOyBicmVhaztcblx0XHRcdGNhc2UgJ18nOiBpKz0yOyBicmVhaztcblx0XHRcdGNhc2UgJ0AnOiArK2k7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnQic6IGNhc2UgJ2InOlxuXHRcdFx0XHRpZihmbXQuY2hhckF0KGkrMSkgPT09IFwiMVwiIHx8IGZtdC5jaGFyQXQoaSsxKSA9PT0gXCIyXCIpIHJldHVybiB0cnVlO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICdNJzogY2FzZSAnRCc6IGNhc2UgJ1knOiBjYXNlICdIJzogY2FzZSAnUyc6IGNhc2UgJ0UnOlxuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICdtJzogY2FzZSAnZCc6IGNhc2UgJ3knOiBjYXNlICdoJzogY2FzZSAncyc6IGNhc2UgJ2UnOiBjYXNlICdnJzogcmV0dXJuIHRydWU7XG5cdFx0XHRjYXNlICdBJzogY2FzZSAnYSc6IGNhc2UgJ+S4iic6XG5cdFx0XHRcdGlmKGZtdC5zdWJzdHIoaSwgMykudG9VcHBlckNhc2UoKSA9PT0gXCJBL1BcIikgcmV0dXJuIHRydWU7XG5cdFx0XHRcdGlmKGZtdC5zdWJzdHIoaSwgNSkudG9VcHBlckNhc2UoKSA9PT0gXCJBTS9QTVwiKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0aWYoZm10LnN1YnN0cihpLCA1KS50b1VwcGVyQ2FzZSgpID09PSBcIuS4iuWNiC/kuIvljYhcIikgcmV0dXJuIHRydWU7XG5cdFx0XHRcdCsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICdbJzpcblx0XHRcdFx0byA9IGM7XG5cdFx0XHRcdHdoaWxlKGZtdC5jaGFyQXQoaSsrKSAhPT0gJ10nICYmIGkgPCBmbXQubGVuZ3RoKSBvICs9IGZtdC5jaGFyQXQoaSk7XG5cdFx0XHRcdGlmKG8ubWF0Y2goU1NGX2Fic3RpbWUpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICcuJzpcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnMCc6IGNhc2UgJyMnOlxuXHRcdFx0XHR3aGlsZShpIDwgZm10Lmxlbmd0aCAmJiAoXCIwIz8uLEUrLSVcIi5pbmRleE9mKGM9Zm10LmNoYXJBdCgrK2kpKSA+IC0xIHx8IChjPT0nXFxcXCcgJiYgZm10LmNoYXJBdChpKzEpID09IFwiLVwiICYmIFwiMCNcIi5pbmRleE9mKGZtdC5jaGFyQXQoaSsyKSk+LTEpKSl7LyogZW1wdHkgKi99XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPyc6IHdoaWxlKGZtdC5jaGFyQXQoKytpKSA9PT0gYyl7LyogZW1wdHkgKi99IGJyZWFrO1xuXHRcdFx0Y2FzZSAnKic6ICsraTsgaWYoZm10LmNoYXJBdChpKSA9PSAnICcgfHwgZm10LmNoYXJBdChpKSA9PSAnKicpICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICcoJzogY2FzZSAnKSc6ICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOlxuXHRcdFx0XHR3aGlsZShpIDwgZm10Lmxlbmd0aCAmJiBcIjAxMjM0NTY3ODlcIi5pbmRleE9mKGZtdC5jaGFyQXQoKytpKSkgPiAtMSl7LyogZW1wdHkgKi99IGJyZWFrO1xuXHRcdFx0Y2FzZSAnICc6ICsraTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiArK2k7IGJyZWFrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGV2YWxfZm10KGZtdC8qOnN0cmluZyovLCB2Lyo6YW55Ki8sIG9wdHMvKjphbnkqLywgZmxlbi8qOm51bWJlciovKSB7XG5cdHZhciBvdXQgPSBbXSwgbyA9IFwiXCIsIGkgPSAwLCBjID0gXCJcIiwgbHN0PSd0JywgZHQsIGosIGNjO1xuXHR2YXIgaHI9J0gnO1xuXHQvKiBUb2tlbml6ZSAqL1xuXHR3aGlsZShpIDwgZm10Lmxlbmd0aCkge1xuXHRcdHN3aXRjaCgoYyA9IGZtdC5jaGFyQXQoaSkpKSB7XG5cdFx0XHRjYXNlICdHJzogLyogR2VuZXJhbCAqL1xuXHRcdFx0XHRpZighU1NGX2lzZ2VuZXJhbChmbXQsIGkpKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCBjaGFyYWN0ZXIgJyArIGMgKyAnIGluICcgK2ZtdCk7XG5cdFx0XHRcdG91dFtvdXQubGVuZ3RoXSA9IHt0OidHJywgdjonR2VuZXJhbCd9OyBpKz03OyBicmVhaztcblx0XHRcdGNhc2UgJ1wiJzogLyogTGl0ZXJhbCB0ZXh0ICovXG5cdFx0XHRcdGZvcihvPVwiXCI7KGNjPWZtdC5jaGFyQ29kZUF0KCsraSkpICE9PSAzNCAmJiBpIDwgZm10Lmxlbmd0aDspIG8gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjYyk7XG5cdFx0XHRcdG91dFtvdXQubGVuZ3RoXSA9IHt0Oid0JywgdjpvfTsgKytpOyBicmVhaztcblx0XHRcdGNhc2UgJ1xcXFwnOiB2YXIgdyA9IGZtdC5jaGFyQXQoKytpKSwgdCA9ICh3ID09PSBcIihcIiB8fCB3ID09PSBcIilcIikgPyB3IDogJ3QnO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDp0LCB2Ond9OyArK2k7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnXyc6IG91dFtvdXQubGVuZ3RoXSA9IHt0Oid0JywgdjpcIiBcIn07IGkrPTI7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnQCc6IC8qIFRleHQgUGxhY2Vob2xkZXIgKi9cblx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J1QnLCB2OnZ9OyArK2k7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnQic6IGNhc2UgJ2InOlxuXHRcdFx0XHRpZihmbXQuY2hhckF0KGkrMSkgPT09IFwiMVwiIHx8IGZtdC5jaGFyQXQoaSsxKSA9PT0gXCIyXCIpIHtcblx0XHRcdFx0XHRpZihkdD09bnVsbCkgeyBkdD1TU0ZfcGFyc2VfZGF0ZV9jb2RlKHYsIG9wdHMsIGZtdC5jaGFyQXQoaSsxKSA9PT0gXCIyXCIpOyBpZihkdD09bnVsbCkgcmV0dXJuIFwiXCI7IH1cblx0XHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDonWCcsIHY6Zm10LnN1YnN0cihpLDIpfTsgbHN0ID0gYzsgaSs9MjsgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnTSc6IGNhc2UgJ0QnOiBjYXNlICdZJzogY2FzZSAnSCc6IGNhc2UgJ1MnOiBjYXNlICdFJzpcblx0XHRcdFx0YyA9IGMudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnbSc6IGNhc2UgJ2QnOiBjYXNlICd5JzogY2FzZSAnaCc6IGNhc2UgJ3MnOiBjYXNlICdlJzogY2FzZSAnZyc6XG5cdFx0XHRcdGlmKHYgPCAwKSByZXR1cm4gXCJcIjtcblx0XHRcdFx0aWYoZHQ9PW51bGwpIHsgZHQ9U1NGX3BhcnNlX2RhdGVfY29kZSh2LCBvcHRzKTsgaWYoZHQ9PW51bGwpIHJldHVybiBcIlwiOyB9XG5cdFx0XHRcdG8gPSBjOyB3aGlsZSgrK2kgPCBmbXQubGVuZ3RoICYmIGZtdC5jaGFyQXQoaSkudG9Mb3dlckNhc2UoKSA9PT0gYykgbys9Yztcblx0XHRcdFx0aWYoYyA9PT0gJ20nICYmIGxzdC50b0xvd2VyQ2FzZSgpID09PSAnaCcpIGMgPSAnTSc7XG5cdFx0XHRcdGlmKGMgPT09ICdoJykgYyA9IGhyO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDpjLCB2Om99OyBsc3QgPSBjOyBicmVhaztcblx0XHRcdGNhc2UgJ0EnOiBjYXNlICdhJzogY2FzZSAn5LiKJzpcblx0XHRcdFx0dmFyIHE9e3Q6YywgdjpjfTtcblx0XHRcdFx0aWYoZHQ9PW51bGwpIGR0PVNTRl9wYXJzZV9kYXRlX2NvZGUodiwgb3B0cyk7XG5cdFx0XHRcdGlmKGZtdC5zdWJzdHIoaSwgMykudG9VcHBlckNhc2UoKSA9PT0gXCJBL1BcIikgeyBpZihkdCE9bnVsbCkgcS52ID0gZHQuSCA+PSAxMiA/IFwiUFwiIDogXCJBXCI7IHEudCA9ICdUJzsgaHI9J2gnO2krPTM7fVxuXHRcdFx0XHRlbHNlIGlmKGZtdC5zdWJzdHIoaSw1KS50b1VwcGVyQ2FzZSgpID09PSBcIkFNL1BNXCIpIHsgaWYoZHQhPW51bGwpIHEudiA9IGR0LkggPj0gMTIgPyBcIlBNXCIgOiBcIkFNXCI7IHEudCA9ICdUJzsgaSs9NTsgaHI9J2gnOyB9XG5cdFx0XHRcdGVsc2UgaWYoZm10LnN1YnN0cihpLDUpLnRvVXBwZXJDYXNlKCkgPT09IFwi5LiK5Y2IL+S4i+WNiFwiKSB7IGlmKGR0IT1udWxsKSBxLnYgPSBkdC5IID49IDEyID8gXCLkuIvljYhcIiA6IFwi5LiK5Y2IXCI7IHEudCA9ICdUJzsgaSs9NTsgaHI9J2gnOyB9XG5cdFx0XHRcdGVsc2UgeyBxLnQgPSBcInRcIjsgKytpOyB9XG5cdFx0XHRcdGlmKGR0PT1udWxsICYmIHEudCA9PT0gJ1QnKSByZXR1cm4gXCJcIjtcblx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0gcTsgbHN0ID0gYzsgYnJlYWs7XG5cdFx0XHRjYXNlICdbJzpcblx0XHRcdFx0byA9IGM7XG5cdFx0XHRcdHdoaWxlKGZtdC5jaGFyQXQoaSsrKSAhPT0gJ10nICYmIGkgPCBmbXQubGVuZ3RoKSBvICs9IGZtdC5jaGFyQXQoaSk7XG5cdFx0XHRcdGlmKG8uc2xpY2UoLTEpICE9PSAnXScpIHRocm93ICd1bnRlcm1pbmF0ZWQgXCJbXCIgYmxvY2s6IHwnICsgbyArICd8Jztcblx0XHRcdFx0aWYoby5tYXRjaChTU0ZfYWJzdGltZSkpIHtcblx0XHRcdFx0XHRpZihkdD09bnVsbCkgeyBkdD1TU0ZfcGFyc2VfZGF0ZV9jb2RlKHYsIG9wdHMpOyBpZihkdD09bnVsbCkgcmV0dXJuIFwiXCI7IH1cblx0XHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDonWicsIHY6by50b0xvd2VyQ2FzZSgpfTtcblx0XHRcdFx0XHRsc3QgPSBvLmNoYXJBdCgxKTtcblx0XHRcdFx0fSBlbHNlIGlmKG8uaW5kZXhPZihcIiRcIikgPiAtMSkge1xuXHRcdFx0XHRcdG8gPSAoby5tYXRjaCgvXFwkKFteLVxcW1xcXV0qKS8pfHxbXSlbMV18fFwiJFwiO1xuXHRcdFx0XHRcdGlmKCFmbXRfaXNfZGF0ZShmbXQpKSBvdXRbb3V0Lmxlbmd0aF0gPSB7dDondCcsdjpvfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdC8qIE51bWJlcnMgKi9cblx0XHRcdGNhc2UgJy4nOlxuXHRcdFx0XHRpZihkdCAhPSBudWxsKSB7XG5cdFx0XHRcdFx0byA9IGM7IHdoaWxlKCsraSA8IGZtdC5sZW5ndGggJiYgKGM9Zm10LmNoYXJBdChpKSkgPT09IFwiMFwiKSBvICs9IGM7XG5cdFx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J3MnLCB2Om99OyBicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICcwJzogY2FzZSAnIyc6XG5cdFx0XHRcdG8gPSBjOyB3aGlsZSgrK2kgPCBmbXQubGVuZ3RoICYmIFwiMCM/LixFKy0lXCIuaW5kZXhPZihjPWZtdC5jaGFyQXQoaSkpID4gLTEpIG8gKz0gYztcblx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J24nLCB2Om99OyBicmVhaztcblx0XHRcdGNhc2UgJz8nOlxuXHRcdFx0XHRvID0gYzsgd2hpbGUoZm10LmNoYXJBdCgrK2kpID09PSBjKSBvKz1jO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDpjLCB2Om99OyBsc3QgPSBjOyBicmVhaztcblx0XHRcdGNhc2UgJyonOiArK2k7IGlmKGZtdC5jaGFyQXQoaSkgPT0gJyAnIHx8IGZtdC5jaGFyQXQoaSkgPT0gJyonKSArK2k7IGJyZWFrOyAvLyAqKlxuXHRcdFx0Y2FzZSAnKCc6IGNhc2UgJyknOiBvdXRbb3V0Lmxlbmd0aF0gPSB7dDooZmxlbj09PTE/J3QnOmMpLCB2OmN9OyArK2k7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5Jzpcblx0XHRcdFx0byA9IGM7IHdoaWxlKGkgPCBmbXQubGVuZ3RoICYmIFwiMDEyMzQ1Njc4OVwiLmluZGV4T2YoZm10LmNoYXJBdCgrK2kpKSA+IC0xKSBvKz1mbXQuY2hhckF0KGkpO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDonRCcsIHY6b307IGJyZWFrO1xuXHRcdFx0Y2FzZSAnICc6IG91dFtvdXQubGVuZ3RoXSA9IHt0OmMsIHY6Y307ICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICckJzogb3V0W291dC5sZW5ndGhdID0ge3Q6J3QnLCB2OickJ307ICsraTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZihcIiwkLSsvKCk6IV4mJ357fTw+PeKCrGFjZmlqa2xvcHFydHV2d3h6UFwiLmluZGV4T2YoYykgPT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCBjaGFyYWN0ZXIgJyArIGMgKyAnIGluICcgKyBmbXQpO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDondCcsIHY6Y307ICsraTsgYnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyogU2NhbiBmb3IgZGF0ZS90aW1lIHBhcnRzICovXG5cdHZhciBidCA9IDAsIHNzMCA9IDAsIHNzbTtcblx0Zm9yKGk9b3V0Lmxlbmd0aC0xLCBsc3Q9J3QnOyBpID49IDA7IC0taSkge1xuXHRcdHN3aXRjaChvdXRbaV0udCkge1xuXHRcdFx0Y2FzZSAnaCc6IGNhc2UgJ0gnOiBvdXRbaV0udCA9IGhyOyBsc3Q9J2gnOyBpZihidCA8IDEpIGJ0ID0gMTsgYnJlYWs7XG5cdFx0XHRjYXNlICdzJzpcblx0XHRcdFx0aWYoKHNzbT1vdXRbaV0udi5tYXRjaCgvXFwuMCskLykpKSBzczA9TWF0aC5tYXgoc3MwLHNzbVswXS5sZW5ndGgtMSk7XG5cdFx0XHRcdGlmKGJ0IDwgMykgYnQgPSAzO1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnZCc6IGNhc2UgJ3knOiBjYXNlICdNJzogY2FzZSAnZSc6IGxzdD1vdXRbaV0udDsgYnJlYWs7XG5cdFx0XHRjYXNlICdtJzogaWYobHN0ID09PSAncycpIHsgb3V0W2ldLnQgPSAnTSc7IGlmKGJ0IDwgMikgYnQgPSAyOyB9IGJyZWFrO1xuXHRcdFx0Y2FzZSAnWCc6IC8qaWYob3V0W2ldLnYgPT09IFwiQjJcIik7Ki9cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdaJzpcblx0XHRcdFx0aWYoYnQgPCAxICYmIG91dFtpXS52Lm1hdGNoKC9bSGhdLykpIGJ0ID0gMTtcblx0XHRcdFx0aWYoYnQgPCAyICYmIG91dFtpXS52Lm1hdGNoKC9bTW1dLykpIGJ0ID0gMjtcblx0XHRcdFx0aWYoYnQgPCAzICYmIG91dFtpXS52Lm1hdGNoKC9bU3NdLykpIGJ0ID0gMztcblx0XHR9XG5cdH1cblx0LyogdGltZSByb3VuZGluZyBkZXBlbmRzIG9uIHByZXNlbmNlIG9mIG1pbnV0ZSAvIHNlY29uZCAvIHVzZWMgZmllbGRzICovXG5cdHN3aXRjaChidCkge1xuXHRcdGNhc2UgMDogYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0Lyo6OmlmKCFkdCkgYnJlYWs7Ki9cblx0XHRcdGlmKGR0LnUgPj0gMC41KSB7IGR0LnUgPSAwOyArK2R0LlM7IH1cblx0XHRcdGlmKGR0LlMgPj0gIDYwKSB7IGR0LlMgPSAwOyArK2R0Lk07IH1cblx0XHRcdGlmKGR0Lk0gPj0gIDYwKSB7IGR0Lk0gPSAwOyArK2R0Lkg7IH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdC8qOjppZighZHQpIGJyZWFrOyovXG5cdFx0XHRpZihkdC51ID49IDAuNSkgeyBkdC51ID0gMDsgKytkdC5TOyB9XG5cdFx0XHRpZihkdC5TID49ICA2MCkgeyBkdC5TID0gMDsgKytkdC5NOyB9XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdC8qIHJlcGxhY2UgZmllbGRzICovXG5cdHZhciBuc3RyID0gXCJcIiwgamo7XG5cdGZvcihpPTA7IGkgPCBvdXQubGVuZ3RoOyArK2kpIHtcblx0XHRzd2l0Y2gob3V0W2ldLnQpIHtcblx0XHRcdGNhc2UgJ3QnOiBjYXNlICdUJzogY2FzZSAnICc6IGNhc2UgJ0QnOiBicmVhaztcblx0XHRcdGNhc2UgJ1gnOiBvdXRbaV0udiA9IFwiXCI7IG91dFtpXS50ID0gXCI7XCI7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnZCc6IGNhc2UgJ20nOiBjYXNlICd5JzogY2FzZSAnaCc6IGNhc2UgJ0gnOiBjYXNlICdNJzogY2FzZSAncyc6IGNhc2UgJ2UnOiBjYXNlICdiJzogY2FzZSAnWic6XG5cdFx0XHRcdC8qOjppZighZHQpIHRocm93IFwidW5yZWFjaGFibGVcIjsgKi9cblx0XHRcdFx0b3V0W2ldLnYgPSBTU0Zfd3JpdGVfZGF0ZShvdXRbaV0udC5jaGFyQ29kZUF0KDApLCBvdXRbaV0udiwgZHQsIHNzMCk7XG5cdFx0XHRcdG91dFtpXS50ID0gJ3QnOyBicmVhaztcblx0XHRcdGNhc2UgJ24nOiBjYXNlICc/Jzpcblx0XHRcdFx0amogPSBpKzE7XG5cdFx0XHRcdHdoaWxlKG91dFtqal0gIT0gbnVsbCAmJiAoXG5cdFx0XHRcdFx0KGM9b3V0W2pqXS50KSA9PT0gXCI/XCIgfHwgYyA9PT0gXCJEXCIgfHxcblx0XHRcdFx0XHQoKGMgPT09IFwiIFwiIHx8IGMgPT09IFwidFwiKSAmJiBvdXRbamorMV0gIT0gbnVsbCAmJiAob3V0W2pqKzFdLnQgPT09ICc/JyB8fCBvdXRbamorMV0udCA9PT0gXCJ0XCIgJiYgb3V0W2pqKzFdLnYgPT09ICcvJykpIHx8XG5cdFx0XHRcdFx0KG91dFtpXS50ID09PSAnKCcgJiYgKGMgPT09ICcgJyB8fCBjID09PSAnbicgfHwgYyA9PT0gJyknKSkgfHxcblx0XHRcdFx0XHQoYyA9PT0gJ3QnICYmIChvdXRbampdLnYgPT09ICcvJyB8fCBvdXRbampdLnYgPT09ICcgJyAmJiBvdXRbamorMV0gIT0gbnVsbCAmJiBvdXRbamorMV0udCA9PSAnPycpKVxuXHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0b3V0W2ldLnYgKz0gb3V0W2pqXS52O1xuXHRcdFx0XHRcdG91dFtqal0gPSB7djpcIlwiLCB0OlwiO1wifTsgKytqajtcblx0XHRcdFx0fVxuXHRcdFx0XHRuc3RyICs9IG91dFtpXS52O1xuXHRcdFx0XHRpID0gamotMTsgYnJlYWs7XG5cdFx0XHRjYXNlICdHJzogb3V0W2ldLnQgPSAndCc7IG91dFtpXS52ID0gU1NGX2dlbmVyYWwodixvcHRzKTsgYnJlYWs7XG5cdFx0fVxuXHR9XG5cdHZhciB2diA9IFwiXCIsIG15diwgb3N0cjtcblx0aWYobnN0ci5sZW5ndGggPiAwKSB7XG5cdFx0aWYobnN0ci5jaGFyQ29kZUF0KDApID09IDQwKSAvKiAnKCcgKi8ge1xuXHRcdFx0bXl2ID0gKHY8MCYmbnN0ci5jaGFyQ29kZUF0KDApID09PSA0NSA/IC12IDogdik7XG5cdFx0XHRvc3RyID0gd3JpdGVfbnVtKCduJywgbnN0ciwgbXl2KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bXl2ID0gKHY8MCAmJiBmbGVuID4gMSA/IC12IDogdik7XG5cdFx0XHRvc3RyID0gd3JpdGVfbnVtKCduJywgbnN0ciwgbXl2KTtcblx0XHRcdGlmKG15diA8IDAgJiYgb3V0WzBdICYmIG91dFswXS50ID09ICd0Jykge1xuXHRcdFx0XHRvc3RyID0gb3N0ci5zdWJzdHIoMSk7XG5cdFx0XHRcdG91dFswXS52ID0gXCItXCIgKyBvdXRbMF0udjtcblx0XHRcdH1cblx0XHR9XG5cdFx0amo9b3N0ci5sZW5ndGgtMTtcblx0XHR2YXIgZGVjcHQgPSBvdXQubGVuZ3RoO1xuXHRcdGZvcihpPTA7IGkgPCBvdXQubGVuZ3RoOyArK2kpIGlmKG91dFtpXSAhPSBudWxsICYmIG91dFtpXS50ICE9ICd0JyAmJiBvdXRbaV0udi5pbmRleE9mKFwiLlwiKSA+IC0xKSB7IGRlY3B0ID0gaTsgYnJlYWs7IH1cblx0XHR2YXIgbGFzdGk9b3V0Lmxlbmd0aDtcblx0XHRpZihkZWNwdCA9PT0gb3V0Lmxlbmd0aCAmJiBvc3RyLmluZGV4T2YoXCJFXCIpID09PSAtMSkge1xuXHRcdFx0Zm9yKGk9b3V0Lmxlbmd0aC0xOyBpPj0gMDstLWkpIHtcblx0XHRcdFx0aWYob3V0W2ldID09IG51bGwgfHwgJ24/Jy5pbmRleE9mKG91dFtpXS50KSA9PT0gLTEpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZihqaj49b3V0W2ldLnYubGVuZ3RoLTEpIHsgamogLT0gb3V0W2ldLnYubGVuZ3RoOyBvdXRbaV0udiA9IG9zdHIuc3Vic3RyKGpqKzEsIG91dFtpXS52Lmxlbmd0aCk7IH1cblx0XHRcdFx0ZWxzZSBpZihqaiA8IDApIG91dFtpXS52ID0gXCJcIjtcblx0XHRcdFx0ZWxzZSB7IG91dFtpXS52ID0gb3N0ci5zdWJzdHIoMCwgamorMSk7IGpqID0gLTE7IH1cblx0XHRcdFx0b3V0W2ldLnQgPSAndCc7XG5cdFx0XHRcdGxhc3RpID0gaTtcblx0XHRcdH1cblx0XHRcdGlmKGpqPj0wICYmIGxhc3RpPG91dC5sZW5ndGgpIG91dFtsYXN0aV0udiA9IG9zdHIuc3Vic3RyKDAsamorMSkgKyBvdXRbbGFzdGldLnY7XG5cdFx0fVxuXHRcdGVsc2UgaWYoZGVjcHQgIT09IG91dC5sZW5ndGggJiYgb3N0ci5pbmRleE9mKFwiRVwiKSA9PT0gLTEpIHtcblx0XHRcdGpqID0gb3N0ci5pbmRleE9mKFwiLlwiKS0xO1xuXHRcdFx0Zm9yKGk9ZGVjcHQ7IGk+PSAwOyAtLWkpIHtcblx0XHRcdFx0aWYob3V0W2ldID09IG51bGwgfHwgJ24/Jy5pbmRleE9mKG91dFtpXS50KSA9PT0gLTEpIGNvbnRpbnVlO1xuXHRcdFx0XHRqPW91dFtpXS52LmluZGV4T2YoXCIuXCIpPi0xJiZpPT09ZGVjcHQ/b3V0W2ldLnYuaW5kZXhPZihcIi5cIiktMTpvdXRbaV0udi5sZW5ndGgtMTtcblx0XHRcdFx0dnYgPSBvdXRbaV0udi5zdWJzdHIoaisxKTtcblx0XHRcdFx0Zm9yKDsgaj49MDsgLS1qKSB7XG5cdFx0XHRcdFx0aWYoamo+PTAgJiYgKG91dFtpXS52LmNoYXJBdChqKSA9PT0gXCIwXCIgfHwgb3V0W2ldLnYuY2hhckF0KGopID09PSBcIiNcIikpIHZ2ID0gb3N0ci5jaGFyQXQoamotLSkgKyB2djtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRbaV0udiA9IHZ2O1xuXHRcdFx0XHRvdXRbaV0udCA9ICd0Jztcblx0XHRcdFx0bGFzdGkgPSBpO1xuXHRcdFx0fVxuXHRcdFx0aWYoamo+PTAgJiYgbGFzdGk8b3V0Lmxlbmd0aCkgb3V0W2xhc3RpXS52ID0gb3N0ci5zdWJzdHIoMCxqaisxKSArIG91dFtsYXN0aV0udjtcblx0XHRcdGpqID0gb3N0ci5pbmRleE9mKFwiLlwiKSsxO1xuXHRcdFx0Zm9yKGk9ZGVjcHQ7IGk8b3V0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdGlmKG91dFtpXSA9PSBudWxsIHx8ICgnbj8oJy5pbmRleE9mKG91dFtpXS50KSA9PT0gLTEgJiYgaSAhPT0gZGVjcHQpKSBjb250aW51ZTtcblx0XHRcdFx0aj1vdXRbaV0udi5pbmRleE9mKFwiLlwiKT4tMSYmaT09PWRlY3B0P291dFtpXS52LmluZGV4T2YoXCIuXCIpKzE6MDtcblx0XHRcdFx0dnYgPSBvdXRbaV0udi5zdWJzdHIoMCxqKTtcblx0XHRcdFx0Zm9yKDsgajxvdXRbaV0udi5sZW5ndGg7ICsraikge1xuXHRcdFx0XHRcdGlmKGpqPG9zdHIubGVuZ3RoKSB2diArPSBvc3RyLmNoYXJBdChqaisrKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRbaV0udiA9IHZ2O1xuXHRcdFx0XHRvdXRbaV0udCA9ICd0Jztcblx0XHRcdFx0bGFzdGkgPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRmb3IoaT0wOyBpPG91dC5sZW5ndGg7ICsraSkgaWYob3V0W2ldICE9IG51bGwgJiYgJ24/Jy5pbmRleE9mKG91dFtpXS50KT4tMSkge1xuXHRcdG15diA9IChmbGVuID4xICYmIHYgPCAwICYmIGk+MCAmJiBvdXRbaS0xXS52ID09PSBcIi1cIiA/IC12OnYpO1xuXHRcdG91dFtpXS52ID0gd3JpdGVfbnVtKG91dFtpXS50LCBvdXRbaV0udiwgbXl2KTtcblx0XHRvdXRbaV0udCA9ICd0Jztcblx0fVxuXHR2YXIgcmV0dmFsID0gXCJcIjtcblx0Zm9yKGk9MDsgaSAhPT0gb3V0Lmxlbmd0aDsgKytpKSBpZihvdXRbaV0gIT0gbnVsbCkgcmV0dmFsICs9IG91dFtpXS52O1xuXHRyZXR1cm4gcmV0dmFsO1xufVxuXG52YXIgY2ZyZWdleDIgPSAvXFxbKD18Pls9XT98PFs+PV0/KSgtP1xcZCsoPzpcXC5cXGQqKT8pXFxdLztcbmZ1bmN0aW9uIGNoa2NvbmQodiwgcnIpIHtcblx0aWYocnIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXHR2YXIgdGhyZXNoID0gcGFyc2VGbG9hdChyclsyXSk7XG5cdHN3aXRjaChyclsxXSkge1xuXHRcdGNhc2UgXCI9XCI6ICBpZih2ID09IHRocmVzaCkgcmV0dXJuIHRydWU7IGJyZWFrO1xuXHRcdGNhc2UgXCI+XCI6ICBpZih2ID4gIHRocmVzaCkgcmV0dXJuIHRydWU7IGJyZWFrO1xuXHRcdGNhc2UgXCI8XCI6ICBpZih2IDwgIHRocmVzaCkgcmV0dXJuIHRydWU7IGJyZWFrO1xuXHRcdGNhc2UgXCI8PlwiOiBpZih2ICE9IHRocmVzaCkgcmV0dXJuIHRydWU7IGJyZWFrO1xuXHRcdGNhc2UgXCI+PVwiOiBpZih2ID49IHRocmVzaCkgcmV0dXJuIHRydWU7IGJyZWFrO1xuXHRcdGNhc2UgXCI8PVwiOiBpZih2IDw9IHRocmVzaCkgcmV0dXJuIHRydWU7IGJyZWFrO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNob29zZV9mbXQoZi8qOnN0cmluZyovLCB2Lyo6YW55Ki8pIHtcblx0dmFyIGZtdCA9IFNTRl9zcGxpdF9mbXQoZik7XG5cdHZhciBsID0gZm10Lmxlbmd0aCwgbGF0ID0gZm10W2wtMV0uaW5kZXhPZihcIkBcIik7XG5cdGlmKGw8NCAmJiBsYXQ+LTEpIC0tbDtcblx0aWYoZm10Lmxlbmd0aCA+IDQpIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBmaW5kIHJpZ2h0IGZvcm1hdCBmb3IgfFwiICsgZm10LmpvaW4oXCJ8XCIpICsgXCJ8XCIpO1xuXHRpZih0eXBlb2YgdiAhPT0gXCJudW1iZXJcIikgcmV0dXJuIFs0LCBmbXQubGVuZ3RoID09PSA0IHx8IGxhdD4tMT9mbXRbZm10Lmxlbmd0aC0xXTpcIkBcIl07XG5cdHN3aXRjaChmbXQubGVuZ3RoKSB7XG5cdFx0Y2FzZSAxOiBmbXQgPSBsYXQ+LTEgPyBbXCJHZW5lcmFsXCIsIFwiR2VuZXJhbFwiLCBcIkdlbmVyYWxcIiwgZm10WzBdXSA6IFtmbXRbMF0sIGZtdFswXSwgZm10WzBdLCBcIkBcIl07IGJyZWFrO1xuXHRcdGNhc2UgMjogZm10ID0gbGF0Pi0xID8gW2ZtdFswXSwgZm10WzBdLCBmbXRbMF0sIGZtdFsxXV0gOiBbZm10WzBdLCBmbXRbMV0sIGZtdFswXSwgXCJAXCJdOyBicmVhaztcblx0XHRjYXNlIDM6IGZtdCA9IGxhdD4tMSA/IFtmbXRbMF0sIGZtdFsxXSwgZm10WzBdLCBmbXRbMl1dIDogW2ZtdFswXSwgZm10WzFdLCBmbXRbMl0sIFwiQFwiXTsgYnJlYWs7XG5cdFx0Y2FzZSA0OiBicmVhaztcblx0fVxuXHR2YXIgZmYgPSB2ID4gMCA/IGZtdFswXSA6IHYgPCAwID8gZm10WzFdIDogZm10WzJdO1xuXHRpZihmbXRbMF0uaW5kZXhPZihcIltcIikgPT09IC0xICYmIGZtdFsxXS5pbmRleE9mKFwiW1wiKSA9PT0gLTEpIHJldHVybiBbbCwgZmZdO1xuXHRpZihmbXRbMF0ubWF0Y2goL1xcW1s9PD5dLykgIT0gbnVsbCB8fCBmbXRbMV0ubWF0Y2goL1xcW1s9PD5dLykgIT0gbnVsbCkge1xuXHRcdHZhciBtMSA9IGZtdFswXS5tYXRjaChjZnJlZ2V4Mik7XG5cdFx0dmFyIG0yID0gZm10WzFdLm1hdGNoKGNmcmVnZXgyKTtcblx0XHRyZXR1cm4gY2hrY29uZCh2LCBtMSkgPyBbbCwgZm10WzBdXSA6IGNoa2NvbmQodiwgbTIpID8gW2wsIGZtdFsxXV0gOiBbbCwgZm10W20xICE9IG51bGwgJiYgbTIgIT0gbnVsbCA/IDIgOiAxXV07XG5cdH1cblx0cmV0dXJuIFtsLCBmZl07XG59XG5mdW5jdGlvbiBTU0ZfZm9ybWF0KGZtdC8qOnN0cmluZ3xudW1iZXIqLyx2Lyo6YW55Ki8sby8qOj9hbnkqLykge1xuXHRpZihvID09IG51bGwpIG8gPSB7fTtcblx0dmFyIHNmbXQgPSBcIlwiO1xuXHRzd2l0Y2godHlwZW9mIGZtdCkge1xuXHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdGlmKGZtdCA9PSBcIm0vZC95eVwiICYmIG8uZGF0ZU5GKSBzZm10ID0gby5kYXRlTkY7XG5cdFx0XHRlbHNlIHNmbXQgPSBmbXQ7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRpZihmbXQgPT0gMTQgJiYgby5kYXRlTkYpIHNmbXQgPSBvLmRhdGVORjtcblx0XHRcdGVsc2Ugc2ZtdCA9IChvLnRhYmxlICE9IG51bGwgPyAoby50YWJsZS8qOmFueSovKSA6IHRhYmxlX2ZtdClbZm10XTtcblx0XHRcdGlmKHNmbXQgPT0gbnVsbCkgc2ZtdCA9IChvLnRhYmxlICYmIG8udGFibGVbU1NGX2RlZmF1bHRfbWFwW2ZtdF1dKSB8fCB0YWJsZV9mbXRbU1NGX2RlZmF1bHRfbWFwW2ZtdF1dO1xuXHRcdFx0aWYoc2ZtdCA9PSBudWxsKSBzZm10ID0gU1NGX2RlZmF1bHRfc3RyW2ZtdF0gfHwgXCJHZW5lcmFsXCI7XG5cdFx0XHRicmVhaztcblx0fVxuXHRpZihTU0ZfaXNnZW5lcmFsKHNmbXQsMCkpIHJldHVybiBTU0ZfZ2VuZXJhbCh2LCBvKTtcblx0aWYodiBpbnN0YW5jZW9mIERhdGUpIHYgPSBkYXRlbnVtX2xvY2FsKHYsIG8uZGF0ZTE5MDQpO1xuXHR2YXIgZiA9IGNob29zZV9mbXQoc2ZtdCwgdik7XG5cdGlmKFNTRl9pc2dlbmVyYWwoZlsxXSkpIHJldHVybiBTU0ZfZ2VuZXJhbCh2LCBvKTtcblx0aWYodiA9PT0gdHJ1ZSkgdiA9IFwiVFJVRVwiOyBlbHNlIGlmKHYgPT09IGZhbHNlKSB2ID0gXCJGQUxTRVwiO1xuXHRlbHNlIGlmKHYgPT09IFwiXCIgfHwgdiA9PSBudWxsKSByZXR1cm4gXCJcIjtcblx0cmV0dXJuIGV2YWxfZm10KGZbMV0sIHYsIG8sIGZbMF0pO1xufVxuZnVuY3Rpb24gU1NGX2xvYWQoZm10Lyo6c3RyaW5nKi8sIGlkeC8qOj9udW1iZXIqLykvKjpudW1iZXIqLyB7XG5cdGlmKHR5cGVvZiBpZHggIT0gJ251bWJlcicpIHtcblx0XHRpZHggPSAraWR4IHx8IC0xO1xuLyo6OmlmKHR5cGVvZiBpZHggIT0gJ251bWJlcicpIHJldHVybiAweDE4ODsgKi9cblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgMHgwMTg4OyArK2kpIHtcbi8qOjppZih0eXBlb2YgaWR4ICE9ICdudW1iZXInKSByZXR1cm4gMHgxODg7ICovXG5cdFx0XHRpZih0YWJsZV9mbXRbaV0gPT0gdW5kZWZpbmVkKSB7IGlmKGlkeCA8IDApIGlkeCA9IGk7IGNvbnRpbnVlOyB9XG5cdFx0XHRpZih0YWJsZV9mbXRbaV0gPT0gZm10KSB7IGlkeCA9IGk7IGJyZWFrOyB9XG5cdFx0fVxuLyo6OmlmKHR5cGVvZiBpZHggIT0gJ251bWJlcicpIHJldHVybiAweDE4ODsgKi9cblx0XHRpZihpZHggPCAwKSBpZHggPSAweDE4Nztcblx0fVxuLyo6OmlmKHR5cGVvZiBpZHggIT0gJ251bWJlcicpIHJldHVybiAweDE4ODsgKi9cblx0dGFibGVfZm10W2lkeF0gPSBmbXQ7XG5cdHJldHVybiBpZHg7XG59XG5mdW5jdGlvbiBTU0ZfbG9hZF90YWJsZSh0YmwvKjpTU0ZUYWJsZSovKS8qOnZvaWQqLyB7XG5cdGZvcih2YXIgaT0wOyBpIT0weDAxODg7ICsraSlcblx0XHRpZih0YmxbaV0gIT09IHVuZGVmaW5lZCkgU1NGX2xvYWQodGJsW2ldLCBpKTtcbn1cblxuZnVuY3Rpb24gbWFrZV9zc2YoKSB7XG5cdHRhYmxlX2ZtdCA9IFNTRl9pbml0X3RhYmxlKCk7XG59XG5cbnZhciBTU0YgPSB7XG5cdGZvcm1hdDogU1NGX2Zvcm1hdCxcblx0bG9hZDogU1NGX2xvYWQsXG5cdF90YWJsZTogdGFibGVfZm10LFxuXHRsb2FkX3RhYmxlOiBTU0ZfbG9hZF90YWJsZSxcblx0cGFyc2VfZGF0ZV9jb2RlOiBTU0ZfcGFyc2VfZGF0ZV9jb2RlLFxuXHRpc19kYXRlOiBmbXRfaXNfZGF0ZSxcblx0Z2V0X3RhYmxlOiBmdW5jdGlvbiBnZXRfdGFibGUoKSB7IHJldHVybiBTU0YuX3RhYmxlID0gdGFibGVfZm10OyB9XG59O1xuXG52YXIgU1NGSW1wbGljaXQvKntbbnVtYmVyXTpzdHJpbmd9Ki8gPSAoe1xuXHRcIjVcIjogJ1wiJFwiIywjIzBfKTtcXFxcKFwiJFwiIywjIzBcXFxcKScsXG5cdFwiNlwiOiAnXCIkXCIjLCMjMF8pO1tSZWRdXFxcXChcIiRcIiMsIyMwXFxcXCknLFxuXHRcIjdcIjogJ1wiJFwiIywjIzAuMDBfKTtcXFxcKFwiJFwiIywjIzAuMDBcXFxcKScsXG5cdFwiOFwiOiAnXCIkXCIjLCMjMC4wMF8pO1tSZWRdXFxcXChcIiRcIiMsIyMwLjAwXFxcXCknLFxuXHRcIjIzXCI6ICdHZW5lcmFsJywgXCIyNFwiOiAnR2VuZXJhbCcsIFwiMjVcIjogJ0dlbmVyYWwnLCBcIjI2XCI6ICdHZW5lcmFsJyxcblx0XCIyN1wiOiAnbS9kL3l5JywgXCIyOFwiOiAnbS9kL3l5JywgXCIyOVwiOiAnbS9kL3l5JywgXCIzMFwiOiAnbS9kL3l5JywgXCIzMVwiOiAnbS9kL3l5Jyxcblx0XCIzMlwiOiAnaDptbTpzcycsIFwiMzNcIjogJ2g6bW06c3MnLCBcIjM0XCI6ICdoOm1tOnNzJywgXCIzNVwiOiAnaDptbTpzcycsXG5cdFwiMzZcIjogJ20vZC95eScsXG5cdFwiNDFcIjogJ18oKiAjLCMjMF8pO18oKiBcXCgjLCMjMFxcKTtfKCogXCItXCJfKTtfKEBfKScsXG5cdFwiNDJcIjogJ18oXCIkXCIqICMsIyMwXyk7XyhcIiRcIiogXFwoIywjIzBcXCk7XyhcIiRcIiogXCItXCJfKTtfKEBfKScsXG5cdFwiNDNcIjogJ18oKiAjLCMjMC4wMF8pO18oKiBcXCgjLCMjMC4wMFxcKTtfKCogXCItXCI/P18pO18oQF8pJyxcblx0XCI0NFwiOiAnXyhcIiRcIiogIywjIzAuMDBfKTtfKFwiJFwiKiBcXCgjLCMjMC4wMFxcKTtfKFwiJFwiKiBcIi1cIj8/Xyk7XyhAXyknLFxuXHRcIjUwXCI6ICdtL2QveXknLCBcIjUxXCI6ICdtL2QveXknLCBcIjUyXCI6ICdtL2QveXknLCBcIjUzXCI6ICdtL2QveXknLCBcIjU0XCI6ICdtL2QveXknLFxuXHRcIjU1XCI6ICdtL2QveXknLCBcIjU2XCI6ICdtL2QveXknLCBcIjU3XCI6ICdtL2QveXknLCBcIjU4XCI6ICdtL2QveXknLFxuXHRcIjU5XCI6ICcwJyxcblx0XCI2MFwiOiAnMC4wMCcsXG5cdFwiNjFcIjogJyMsIyMwJyxcblx0XCI2MlwiOiAnIywjIzAuMDAnLFxuXHRcIjYzXCI6ICdcIiRcIiMsIyMwXyk7XFxcXChcIiRcIiMsIyMwXFxcXCknLFxuXHRcIjY0XCI6ICdcIiRcIiMsIyMwXyk7W1JlZF1cXFxcKFwiJFwiIywjIzBcXFxcKScsXG5cdFwiNjVcIjogJ1wiJFwiIywjIzAuMDBfKTtcXFxcKFwiJFwiIywjIzAuMDBcXFxcKScsXG5cdFwiNjZcIjogJ1wiJFwiIywjIzAuMDBfKTtbUmVkXVxcXFwoXCIkXCIjLCMjMC4wMFxcXFwpJyxcblx0XCI2N1wiOiAnMCUnLFxuXHRcIjY4XCI6ICcwLjAwJScsXG5cdFwiNjlcIjogJyMgPy8/Jyxcblx0XCI3MFwiOiAnIyA/Py8/PycsXG5cdFwiNzFcIjogJ20vZC95eScsXG5cdFwiNzJcIjogJ20vZC95eScsXG5cdFwiNzNcIjogJ2QtbW1tLXl5Jyxcblx0XCI3NFwiOiAnZC1tbW0nLFxuXHRcIjc1XCI6ICdtbW0teXknLFxuXHRcIjc2XCI6ICdoOm1tJyxcblx0XCI3N1wiOiAnaDptbTpzcycsXG5cdFwiNzhcIjogJ20vZC95eSBoOm1tJyxcblx0XCI3OVwiOiAnbW06c3MnLFxuXHRcIjgwXCI6ICdbaF06bW06c3MnLFxuXHRcIjgxXCI6ICdtbXNzLjAnXG59Lyo6YW55Ki8pO1xuXG4vKiBkYXRlTkYgcGFyc2UgVE9ETzogbW92ZSB0byBTU0YgKi9cbnZhciBkYXRlTkZyZWdleCA9IC9bZERdK3xbbU1dK3xbeVllRV0rfFtIaF0rfFtTc10rL2c7XG5mdW5jdGlvbiBkYXRlTkZfcmVnZXgoZGF0ZU5GLyo6c3RyaW5nfG51bWJlciovKS8qOlJlZ0V4cCovIHtcblx0dmFyIGZtdCA9IHR5cGVvZiBkYXRlTkYgPT0gXCJudW1iZXJcIiA/IHRhYmxlX2ZtdFtkYXRlTkZdIDogZGF0ZU5GO1xuXHRmbXQgPSBmbXQucmVwbGFjZShkYXRlTkZyZWdleCwgXCIoXFxcXGQrKVwiKTtcblx0cmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIgKyBmbXQgKyBcIiRcIik7XG59XG5mdW5jdGlvbiBkYXRlTkZfZml4KHN0ci8qOnN0cmluZyovLCBkYXRlTkYvKjpzdHJpbmcqLywgbWF0Y2gvKjpBcnJheTxzdHJpbmc+Ki8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgWSA9IC0xLCBtID0gLTEsIGQgPSAtMSwgSCA9IC0xLCBNID0gLTEsIFMgPSAtMTtcblx0KGRhdGVORi5tYXRjaChkYXRlTkZyZWdleCl8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKG4sIGkpIHtcblx0XHR2YXIgdiA9IHBhcnNlSW50KG1hdGNoW2krMV0sIDEwKTtcblx0XHRzd2l0Y2gobi50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSkge1xuXHRcdFx0Y2FzZSAneSc6IFkgPSB2OyBicmVhazsgY2FzZSAnZCc6IGQgPSB2OyBicmVhaztcblx0XHRcdGNhc2UgJ2gnOiBIID0gdjsgYnJlYWs7IGNhc2UgJ3MnOiBTID0gdjsgYnJlYWs7XG5cdFx0XHRjYXNlICdtJzogaWYoSCA+PSAwKSBNID0gdjsgZWxzZSBtID0gdjsgYnJlYWs7XG5cdFx0fVxuXHR9KTtcblx0aWYoUyA+PSAwICYmIE0gPT0gLTEgJiYgbSA+PSAwKSB7IE0gPSBtOyBtID0gLTE7IH1cblx0dmFyIGRhdGVzdHIgPSAoKFwiXCIgKyAoWT49MD9ZOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkpKS5zbGljZSgtNCkgKyBcIi1cIiArIChcIjAwXCIgKyAobT49MT9tOjEpKS5zbGljZSgtMikgKyBcIi1cIiArIChcIjAwXCIgKyAoZD49MT9kOjEpKS5zbGljZSgtMikpO1xuXHRpZihkYXRlc3RyLmxlbmd0aCA9PSA3KSBkYXRlc3RyID0gXCIwXCIgKyBkYXRlc3RyO1xuXHRpZihkYXRlc3RyLmxlbmd0aCA9PSA4KSBkYXRlc3RyID0gXCIyMFwiICsgZGF0ZXN0cjtcblx0dmFyIHRpbWVzdHIgPSAoKFwiMDBcIiArIChIPj0wP0g6MCkpLnNsaWNlKC0yKSArIFwiOlwiICsgKFwiMDBcIiArIChNPj0wP006MCkpLnNsaWNlKC0yKSArIFwiOlwiICsgKFwiMDBcIiArIChTPj0wP1M6MCkpLnNsaWNlKC0yKSk7XG5cdGlmKEggPT0gLTEgJiYgTSA9PSAtMSAmJiBTID09IC0xKSByZXR1cm4gZGF0ZXN0cjtcblx0aWYoWSA9PSAtMSAmJiBtID09IC0xICYmIGQgPT0gLTEpIHJldHVybiB0aW1lc3RyO1xuXHRyZXR1cm4gZGF0ZXN0ciArIFwiVFwiICsgdGltZXN0cjtcbn1cblxuLyo6OlxuZGVjbGFyZSB2YXIgUmVhZFNoaWZ0OmFueTtcbmRlY2xhcmUgdmFyIENoZWNrRmllbGQ6YW55O1xuZGVjbGFyZSB2YXIgcHJlcF9ibG9iOmFueTtcbmRlY2xhcmUgdmFyIF9fcmVhZFVJbnQzMkxFOmFueTtcbmRlY2xhcmUgdmFyIF9fcmVhZEludDMyTEU6YW55O1xuZGVjbGFyZSB2YXIgX190b0J1ZmZlcjphbnk7XG5kZWNsYXJlIHZhciBfX3V0ZjE2bGU6YW55O1xuZGVjbGFyZSB2YXIgYmNvbmNhdDphbnk7XG5kZWNsYXJlIHZhciBzMmE6YW55O1xuZGVjbGFyZSB2YXIgY2hyMDphbnk7XG5kZWNsYXJlIHZhciBjaHIxOmFueTtcbmRlY2xhcmUgdmFyIGhhc19idWY6Ym9vbGVhbjtcbmRlY2xhcmUgdmFyIG5ld19idWY6YW55O1xuZGVjbGFyZSB2YXIgbmV3X3Jhd19idWY6YW55O1xuZGVjbGFyZSB2YXIgbmV3X3Vuc2FmZV9idWY6YW55O1xuZGVjbGFyZSB2YXIgQnVmZmVyX2Zyb206YW55O1xuKi9cbi8qIGNmYi5qcyAoQykgMjAxMy1wcmVzZW50IFNoZWV0SlMgLS0gaHR0cDovL3NoZWV0anMuY29tICovXG4vKiB2aW06IHNldCB0cz0yOiAqL1xuLypqc2hpbnQgZXFudWxsOnRydWUgKi9cbi8qZXhwb3J0ZWQgQ0ZCICovXG4vKmdsb2JhbCBVaW50OEFycmF5OmZhbHNlLCBVaW50MTZBcnJheTpmYWxzZSAqL1xuXG4vKjo6XG50eXBlIFNlY3RvckVudHJ5ID0ge1xuXHRuYW1lPzpzdHJpbmc7XG5cdG5vZGVzPzpBcnJheTxudW1iZXI+O1xuXHRkYXRhOlJhd0J5dGVzO1xufTtcbnR5cGUgU2VjdG9yTGlzdCA9IHtcblx0W2s6c3RyaW5nfG51bWJlcl06U2VjdG9yRW50cnk7XG5cdG5hbWU6P3N0cmluZztcblx0ZmF0X2FkZHJzOkFycmF5PG51bWJlcj47XG5cdHNzejpudW1iZXI7XG59XG50eXBlIENGQkZpbGVzID0ge1tuOnN0cmluZ106Q0ZCRW50cnl9O1xuKi9cbi8qIGNyYzMyLmpzIChDKSAyMDE0LXByZXNlbnQgU2hlZXRKUyAtLSBodHRwOi8vc2hlZXRqcy5jb20gKi9cbi8qIHZpbTogc2V0IHRzPTI6ICovXG4vKmV4cG9ydGVkIENSQzMyICovXG52YXIgQ1JDMzIgPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xudmFyIENSQzMyID0ge307XG5DUkMzMi52ZXJzaW9uID0gJzEuMi4wJztcbi8qIHNlZSBwZXJmL2NyYzMydGFibGUuanMgKi9cbi8qZ2xvYmFsIEludDMyQXJyYXkgKi9cbmZ1bmN0aW9uIHNpZ25lZF9jcmNfdGFibGUoKS8qOmFueSovIHtcblx0dmFyIGMgPSAwLCB0YWJsZS8qOkFycmF5PG51bWJlcj4qLyA9IG5ldyBBcnJheSgyNTYpO1xuXG5cdGZvcih2YXIgbiA9MDsgbiAhPSAyNTY7ICsrbil7XG5cdFx0YyA9IG47XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0dGFibGVbbl0gPSBjO1xuXHR9XG5cblx0cmV0dXJuIHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IG5ldyBJbnQzMkFycmF5KHRhYmxlKSA6IHRhYmxlO1xufVxuXG52YXIgVDAgPSBzaWduZWRfY3JjX3RhYmxlKCk7XG5mdW5jdGlvbiBzbGljZV9ieV8xNl90YWJsZXMoVCkge1xuXHR2YXIgYyA9IDAsIHYgPSAwLCBuID0gMCwgdGFibGUvKjpBcnJheTxudW1iZXI+Ki8gPSB0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgSW50MzJBcnJheSg0MDk2KSA6IG5ldyBBcnJheSg0MDk2KSA7XG5cblx0Zm9yKG4gPSAwOyBuICE9IDI1NjsgKytuKSB0YWJsZVtuXSA9IFRbbl07XG5cdGZvcihuID0gMDsgbiAhPSAyNTY7ICsrbikge1xuXHRcdHYgPSBUW25dO1xuXHRcdGZvcihjID0gMjU2ICsgbjsgYyA8IDQwOTY7IGMgKz0gMjU2KSB2ID0gdGFibGVbY10gPSAodiA+Pj4gOCkgXiBUW3YgJiAweEZGXTtcblx0fVxuXHR2YXIgb3V0ID0gW107XG5cdGZvcihuID0gMTsgbiAhPSAxNjsgKytuKSBvdXRbbiAtIDFdID0gdHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gdGFibGUuc3ViYXJyYXkobiAqIDI1NiwgbiAqIDI1NiArIDI1NikgOiB0YWJsZS5zbGljZShuICogMjU2LCBuICogMjU2ICsgMjU2KTtcblx0cmV0dXJuIG91dDtcbn1cbnZhciBUVCA9IHNsaWNlX2J5XzE2X3RhYmxlcyhUMCk7XG52YXIgVDEgPSBUVFswXSwgIFQyID0gVFRbMV0sICBUMyA9IFRUWzJdLCAgVDQgPSBUVFszXSwgIFQ1ID0gVFRbNF07XG52YXIgVDYgPSBUVFs1XSwgIFQ3ID0gVFRbNl0sICBUOCA9IFRUWzddLCAgVDkgPSBUVFs4XSwgIFRhID0gVFRbOV07XG52YXIgVGIgPSBUVFsxMF0sIFRjID0gVFRbMTFdLCBUZCA9IFRUWzEyXSwgVGUgPSBUVFsxM10sIFRmID0gVFRbMTRdO1xuZnVuY3Rpb24gY3JjMzJfYnN0cihic3RyLyo6c3RyaW5nKi8sIHNlZWQvKjpudW1iZXIqLykvKjpudW1iZXIqLyB7XG5cdHZhciBDID0gc2VlZC8qOjogPyAwIDogMCAqLyBeIC0xO1xuXHRmb3IodmFyIGkgPSAwLCBMID0gYnN0ci5sZW5ndGg7IGkgPCBMOykgQyA9IChDPj4+OCkgXiBUMFsoQ15ic3RyLmNoYXJDb2RlQXQoaSsrKSkmMHhGRl07XG5cdHJldHVybiB+Qztcbn1cblxuZnVuY3Rpb24gY3JjMzJfYnVmKEIvKjpVaW50OEFycmF5fEFycmF5PG51bWJlcj4qLywgc2VlZC8qOm51bWJlciovKS8qOm51bWJlciovIHtcblx0dmFyIEMgPSBzZWVkLyo6OiA/IDAgOiAwICovIF4gLTEsIEwgPSBCLmxlbmd0aCAtIDE1LCBpID0gMDtcblx0Zm9yKDsgaSA8IEw7KSBDID1cblx0XHRUZltCW2krK10gXiAoQyAmIDI1NSldIF5cblx0XHRUZVtCW2krK10gXiAoKEMgPj4gOCkgJiAyNTUpXSBeXG5cdFx0VGRbQltpKytdIF4gKChDID4+IDE2KSAmIDI1NSldIF5cblx0XHRUY1tCW2krK10gXiAoQyA+Pj4gMjQpXSBeXG5cdFx0VGJbQltpKytdXSBeIFRhW0JbaSsrXV0gXiBUOVtCW2krK11dIF4gVDhbQltpKytdXSBeXG5cdFx0VDdbQltpKytdXSBeIFQ2W0JbaSsrXV0gXiBUNVtCW2krK11dIF4gVDRbQltpKytdXSBeXG5cdFx0VDNbQltpKytdXSBeIFQyW0JbaSsrXV0gXiBUMVtCW2krK11dIF4gVDBbQltpKytdXTtcblx0TCArPSAxNTtcblx0d2hpbGUoaSA8IEwpIEMgPSAoQz4+PjgpIF4gVDBbKENeQltpKytdKSYweEZGXTtcblx0cmV0dXJuIH5DO1xufVxuXG5mdW5jdGlvbiBjcmMzMl9zdHIoc3RyLyo6c3RyaW5nKi8sIHNlZWQvKjpudW1iZXIqLykvKjpudW1iZXIqLyB7XG5cdHZhciBDID0gc2VlZCBeIC0xO1xuXHRmb3IodmFyIGkgPSAwLCBMID0gc3RyLmxlbmd0aCwgYyA9IDAsIGQgPSAwOyBpIDwgTDspIHtcblx0XHRjID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcblx0XHRpZihjIDwgMHg4MCkge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQ15jKSYweEZGXTtcblx0XHR9IGVsc2UgaWYoYyA8IDB4ODAwKSB7XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDE5MnwoKGM+PjYpJjMxKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KGMmNjMpKSkmMHhGRl07XG5cdFx0fSBlbHNlIGlmKGMgPj0gMHhEODAwICYmIGMgPCAweEUwMDApIHtcblx0XHRcdGMgPSAoYyYxMDIzKSs2NDsgZCA9IHN0ci5jaGFyQ29kZUF0KGkrKykmMTAyMztcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMjQwfCgoYz4+OCkmNykpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fCgoYz4+MikmNjMpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoKGQ+PjYpJjE1KXwoKGMmMyk8PDQpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoZCY2MykpKSYweEZGXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgyMjR8KChjPj4xMikmMTUpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoKGM+PjYpJjYzKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KGMmNjMpKSkmMHhGRl07XG5cdFx0fVxuXHR9XG5cdHJldHVybiB+Qztcbn1cbkNSQzMyLnRhYmxlID0gVDA7XG5DUkMzMi5ic3RyID0gY3JjMzJfYnN0cjtcbkNSQzMyLmJ1ZiA9IGNyYzMyX2J1ZjtcbkNSQzMyLnN0ciA9IGNyYzMyX3N0cjtcbnJldHVybiBDUkMzMjtcbn0pKCk7XG4vKiBbTVMtQ0ZCXSB2MjAxNzEyMDEgKi9cbnZhciBDRkIgPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uIF9DRkIoKXtcbnZhciBleHBvcnRzID0ge307XG5leHBvcnRzLnZlcnNpb24gPSAnMS4yLjEnO1xuLyogW01TLUNGQl0gMi42LjQgKi9cbmZ1bmN0aW9uIG5hbWVjbXAobC8qOnN0cmluZyovLCByLyo6c3RyaW5nKi8pLyo6bnVtYmVyKi8ge1xuXHR2YXIgTCA9IGwuc3BsaXQoXCIvXCIpLCBSID0gci5zcGxpdChcIi9cIik7XG5cdGZvcih2YXIgaSA9IDAsIGMgPSAwLCBaID0gTWF0aC5taW4oTC5sZW5ndGgsIFIubGVuZ3RoKTsgaSA8IFo7ICsraSkge1xuXHRcdGlmKChjID0gTFtpXS5sZW5ndGggLSBSW2ldLmxlbmd0aCkpIHJldHVybiBjO1xuXHRcdGlmKExbaV0gIT0gUltpXSkgcmV0dXJuIExbaV0gPCBSW2ldID8gLTEgOiAxO1xuXHR9XG5cdHJldHVybiBMLmxlbmd0aCAtIFIubGVuZ3RoO1xufVxuZnVuY3Rpb24gZGlybmFtZShwLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHRpZihwLmNoYXJBdChwLmxlbmd0aCAtIDEpID09IFwiL1wiKSByZXR1cm4gKHAuc2xpY2UoMCwtMSkuaW5kZXhPZihcIi9cIikgPT09IC0xKSA/IHAgOiBkaXJuYW1lKHAuc2xpY2UoMCwgLTEpKTtcblx0dmFyIGMgPSBwLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0cmV0dXJuIChjID09PSAtMSkgPyBwIDogcC5zbGljZSgwLCBjKzEpO1xufVxuXG5mdW5jdGlvbiBmaWxlbmFtZShwLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHRpZihwLmNoYXJBdChwLmxlbmd0aCAtIDEpID09IFwiL1wiKSByZXR1cm4gZmlsZW5hbWUocC5zbGljZSgwLCAtMSkpO1xuXHR2YXIgYyA9IHAubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRyZXR1cm4gKGMgPT09IC0xKSA/IHAgOiBwLnNsaWNlKGMrMSk7XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogRE9TIERhdGUgZm9ybWF0OlxuICAgaGlnaHxZWVlZWVlZbS5tbW1kZGRkZC5ISEhISE1NTS5NTU1TU1NTU3xsb3dcbiAgIGFkZCAxOTgwIHRvIHN0b3JlZCB5ZWFyXG4gICBzdG9yZWQgc2Vjb25kIHNob3VsZCBiZSBkb3VibGVkXG4qL1xuXG4vKiB3cml0ZSBKUyBkYXRlIHRvIGJ1ZiBhcyBhIERPUyBkYXRlICovXG5mdW5jdGlvbiB3cml0ZV9kb3NfZGF0ZShidWYvKjpDRkJsb2IqLywgZGF0ZS8qOkRhdGV8c3RyaW5nKi8pIHtcblx0aWYodHlwZW9mIGRhdGUgPT09IFwic3RyaW5nXCIpIGRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcblx0dmFyIGhtcy8qOm51bWJlciovID0gZGF0ZS5nZXRIb3VycygpO1xuXHRobXMgPSBobXMgPDwgNiB8IGRhdGUuZ2V0TWludXRlcygpO1xuXHRobXMgPSBobXMgPDwgNSB8IChkYXRlLmdldFNlY29uZHMoKT4+PjEpO1xuXHRidWYud3JpdGVfc2hpZnQoMiwgaG1zKTtcblx0dmFyIHltZC8qOm51bWJlciovID0gKGRhdGUuZ2V0RnVsbFllYXIoKSAtIDE5ODApO1xuXHR5bWQgPSB5bWQgPDwgNCB8IChkYXRlLmdldE1vbnRoKCkrMSk7XG5cdHltZCA9IHltZCA8PCA1IHwgZGF0ZS5nZXREYXRlKCk7XG5cdGJ1Zi53cml0ZV9zaGlmdCgyLCB5bWQpO1xufVxuXG4vKiByZWFkIGZvdXIgYnl0ZXMgZnJvbSBidWYgYW5kIGludGVycHJldCBhcyBhIERPUyBkYXRlICovXG5mdW5jdGlvbiBwYXJzZV9kb3NfZGF0ZShidWYvKjpDRkJsb2IqLykvKjpEYXRlKi8ge1xuXHR2YXIgaG1zID0gYnVmLnJlYWRfc2hpZnQoMikgJiAweEZGRkY7XG5cdHZhciB5bWQgPSBidWYucmVhZF9zaGlmdCgyKSAmIDB4RkZGRjtcblx0dmFyIHZhbCA9IG5ldyBEYXRlKCk7XG5cdHZhciBkID0geW1kICYgMHgxRjsgeW1kID4+Pj0gNTtcblx0dmFyIG0gPSB5bWQgJiAweDBGOyB5bWQgPj4+PSA0O1xuXHR2YWwuc2V0TWlsbGlzZWNvbmRzKDApO1xuXHR2YWwuc2V0RnVsbFllYXIoeW1kICsgMTk4MCk7XG5cdHZhbC5zZXRNb250aChtLTEpO1xuXHR2YWwuc2V0RGF0ZShkKTtcblx0dmFyIFMgPSBobXMgJiAweDFGOyBobXMgPj4+PSA1O1xuXHR2YXIgTSA9IGhtcyAmIDB4M0Y7IGhtcyA+Pj49IDY7XG5cdHZhbC5zZXRIb3VycyhobXMpO1xuXHR2YWwuc2V0TWludXRlcyhNKTtcblx0dmFsLnNldFNlY29uZHMoUzw8MSk7XG5cdHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBwYXJzZV9leHRyYV9maWVsZChibG9iLyo6Q0ZCbG9iKi8pLyo6YW55Ki8ge1xuXHRwcmVwX2Jsb2IoYmxvYiwgMCk7XG5cdHZhciBvID0gLyo6OigqL3t9Lyo6OiA6YW55KSovO1xuXHR2YXIgZmxhZ3MgPSAwO1xuXHR3aGlsZShibG9iLmwgPD0gYmxvYi5sZW5ndGggLSA0KSB7XG5cdFx0dmFyIHR5cGUgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0dmFyIHN6ID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCB0Z3QgPSBibG9iLmwgKyBzejtcblx0XHR2YXIgcCA9IHt9O1xuXHRcdHN3aXRjaCh0eXBlKSB7XG5cdFx0XHQvKiBVTklYLXN0eWxlIFRpbWVzdGFtcHMgKi9cblx0XHRcdGNhc2UgMHg1NDU1OiB7XG5cdFx0XHRcdGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRcdFx0XHRpZihmbGFncyAmIDEpIHAubXRpbWUgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0XHRcdC8qIGZvciBzb21lIHJlYXNvbiwgQ0QgZmxhZyBjb3JyZXNwb25kcyB0byBMRkggKi9cblx0XHRcdFx0aWYoc3ogPiA1KSB7XG5cdFx0XHRcdFx0aWYoZmxhZ3MgJiAyKSBwLmF0aW1lID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdFx0XHRcdGlmKGZsYWdzICYgNCkgcC5jdGltZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihwLm10aW1lKSBwLm10ID0gbmV3IERhdGUocC5tdGltZSoxMDAwKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRibG9iLmwgPSB0Z3Q7XG5cdFx0b1t0eXBlXSA9IHA7XG5cdH1cblx0cmV0dXJuIG87XG59XG52YXIgZnMvKjo6ID0gcmVxdWlyZSgnZnMnKTsgKi87XG5mdW5jdGlvbiBnZXRfZnMoKSB7IHJldHVybiBmcyB8fCAoZnMgPSB7fSk7IH1cbmZ1bmN0aW9uIHBhcnNlKGZpbGUvKjpSYXdCeXRlcyovLCBvcHRpb25zLyo6Q0ZCUmVhZE9wdHMqLykvKjpDRkJDb250YWluZXIqLyB7XG5pZihmaWxlWzBdID09IDB4NTAgJiYgZmlsZVsxXSA9PSAweDRiKSByZXR1cm4gcGFyc2VfemlwKGZpbGUsIG9wdGlvbnMpO1xuaWYoKGZpbGVbMF0gfCAweDIwKSA9PSAweDZkICYmIChmaWxlWzFdfDB4MjApID09IDB4NjkpIHJldHVybiBwYXJzZV9tYWQoZmlsZSwgb3B0aW9ucyk7XG5pZihmaWxlLmxlbmd0aCA8IDUxMikgdGhyb3cgbmV3IEVycm9yKFwiQ0ZCIGZpbGUgc2l6ZSBcIiArIGZpbGUubGVuZ3RoICsgXCIgPCA1MTJcIik7XG52YXIgbXZlciA9IDM7XG52YXIgc3N6ID0gNTEyO1xudmFyIG5tZnMgPSAwOyAvLyBudW1iZXIgb2YgbWluaSBGQVQgc2VjdG9yc1xudmFyIGRpZmF0X3NlY19jbnQgPSAwO1xudmFyIGRpcl9zdGFydCA9IDA7XG52YXIgbWluaWZhdF9zdGFydCA9IDA7XG52YXIgZGlmYXRfc3RhcnQgPSAwO1xuXG52YXIgZmF0X2FkZHJzLyo6QXJyYXk8bnVtYmVyPiovID0gW107IC8vIGxvY2F0aW9ucyBvZiBGQVQgc2VjdG9yc1xuXG4vKiBbTVMtQ0ZCXSAyLjIgQ29tcG91bmQgRmlsZSBIZWFkZXIgKi9cbnZhciBibG9iLyo6Q0ZCbG9iKi8gPSAvKjo6KCovZmlsZS5zbGljZSgwLDUxMikvKjo6IDphbnkpKi87XG5wcmVwX2Jsb2IoYmxvYiwgMCk7XG5cbi8qIG1ham9yIHZlcnNpb24gKi9cbnZhciBtdiA9IGNoZWNrX2dldF9tdmVyKGJsb2IpO1xubXZlciA9IG12WzBdO1xuc3dpdGNoKG12ZXIpIHtcblx0Y2FzZSAzOiBzc3ogPSA1MTI7IGJyZWFrOyBjYXNlIDQ6IHNzeiA9IDQwOTY7IGJyZWFrO1xuXHRjYXNlIDA6IGlmKG12WzFdID09IDApIHJldHVybiBwYXJzZV96aXAoZmlsZSwgb3B0aW9ucyk7XG5cdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiTWFqb3IgVmVyc2lvbjogRXhwZWN0ZWQgMyBvciA0IHNhdyBcIiArIG12ZXIpO1xufVxuXG4vKiByZXByb2Nlc3MgaGVhZGVyICovXG5pZihzc3ogIT09IDUxMikgeyBibG9iID0gLyo6OigqL2ZpbGUuc2xpY2UoMCxzc3opLyo6OiA6YW55KSovOyBwcmVwX2Jsb2IoYmxvYiwgMjggLyogYmxvYi5sICovKTsgfVxuLyogU2F2ZSBoZWFkZXIgZm9yIGZpbmFsIG9iamVjdCAqL1xudmFyIGhlYWRlci8qOlJhd0J5dGVzKi8gPSBmaWxlLnNsaWNlKDAsc3N6KTtcblxuY2hlY2tfc2hpZnRzKGJsb2IsIG12ZXIpO1xuXG4vLyBOdW1iZXIgb2YgRGlyZWN0b3J5IFNlY3RvcnNcbnZhciBkaXJfY250Lyo6bnVtYmVyKi8gPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcbmlmKG12ZXIgPT09IDMgJiYgZGlyX2NudCAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCcjIERpcmVjdG9yeSBTZWN0b3JzOiBFeHBlY3RlZCAwIHNhdyAnICsgZGlyX2NudCk7XG5cbi8vIE51bWJlciBvZiBGQVQgU2VjdG9yc1xuYmxvYi5sICs9IDQ7XG5cbi8vIEZpcnN0IERpcmVjdG9yeSBTZWN0b3IgTG9jYXRpb25cbmRpcl9zdGFydCA9IGJsb2IucmVhZF9zaGlmdCg0LCAnaScpO1xuXG4vLyBUcmFuc2FjdGlvbiBTaWduYXR1cmVcbmJsb2IubCArPSA0O1xuXG4vLyBNaW5pIFN0cmVhbSBDdXRvZmYgU2l6ZVxuYmxvYi5jaGsoJzAwMTAwMDAwJywgJ01pbmkgU3RyZWFtIEN1dG9mZiBTaXplOiAnKTtcblxuLy8gRmlyc3QgTWluaSBGQVQgU2VjdG9yIExvY2F0aW9uXG5taW5pZmF0X3N0YXJ0ID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7XG5cbi8vIE51bWJlciBvZiBNaW5pIEZBVCBTZWN0b3JzXG5ubWZzID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7XG5cbi8vIEZpcnN0IERJRkFUIHNlY3RvciBsb2NhdGlvblxuZGlmYXRfc3RhcnQgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcblxuLy8gTnVtYmVyIG9mIERJRkFUIFNlY3RvcnNcbmRpZmF0X3NlY19jbnQgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcblxuLy8gR3JhYiBGQVQgU2VjdG9yIExvY2F0aW9uc1xuZm9yKHZhciBxID0gLTEsIGogPSAwOyBqIDwgMTA5OyArK2opIHsgLyogMTA5ID0gKDUxMiAtIGJsb2IubCk+Pj4yOyAqL1xuXHRxID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7XG5cdGlmKHE8MCkgYnJlYWs7XG5cdGZhdF9hZGRyc1tqXSA9IHE7XG59XG5cbi8qKiBCcmVhayB0aGUgZmlsZSB1cCBpbnRvIHNlY3RvcnMgKi9cbnZhciBzZWN0b3JzLyo6QXJyYXk8UmF3Qnl0ZXM+Ki8gPSBzZWN0b3JpZnkoZmlsZSwgc3N6KTtcblxuc2xldXRoX2ZhdChkaWZhdF9zdGFydCwgZGlmYXRfc2VjX2NudCwgc2VjdG9ycywgc3N6LCBmYXRfYWRkcnMpO1xuXG4vKiogQ2hhaW5zICovXG52YXIgc2VjdG9yX2xpc3QvKjpTZWN0b3JMaXN0Ki8gPSBtYWtlX3NlY3Rvcl9saXN0KHNlY3RvcnMsIGRpcl9zdGFydCwgZmF0X2FkZHJzLCBzc3opO1xuXG5zZWN0b3JfbGlzdFtkaXJfc3RhcnRdLm5hbWUgPSBcIiFEaXJlY3RvcnlcIjtcbmlmKG5tZnMgPiAwICYmIG1pbmlmYXRfc3RhcnQgIT09IEVORE9GQ0hBSU4pIHNlY3Rvcl9saXN0W21pbmlmYXRfc3RhcnRdLm5hbWUgPSBcIiFNaW5pRkFUXCI7XG5zZWN0b3JfbGlzdFtmYXRfYWRkcnNbMF1dLm5hbWUgPSBcIiFGQVRcIjtcbnNlY3Rvcl9saXN0LmZhdF9hZGRycyA9IGZhdF9hZGRycztcbnNlY3Rvcl9saXN0LnNzeiA9IHNzejtcblxuLyogW01TLUNGQl0gMi42LjEgQ29tcG91bmQgRmlsZSBEaXJlY3RvcnkgRW50cnkgKi9cbnZhciBmaWxlcy8qOkNGQkZpbGVzKi8gPSB7fSwgUGF0aHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXSwgRmlsZUluZGV4Lyo6Q0ZCRmlsZUluZGV4Ki8gPSBbXSwgRnVsbFBhdGhzLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5yZWFkX2RpcmVjdG9yeShkaXJfc3RhcnQsIHNlY3Rvcl9saXN0LCBzZWN0b3JzLCBQYXRocywgbm1mcywgZmlsZXMsIEZpbGVJbmRleCwgbWluaWZhdF9zdGFydCk7XG5cbmJ1aWxkX2Z1bGxfcGF0aHMoRmlsZUluZGV4LCBGdWxsUGF0aHMsIFBhdGhzKTtcblBhdGhzLnNoaWZ0KCk7XG5cbnZhciBvID0ge1xuXHRGaWxlSW5kZXg6IEZpbGVJbmRleCxcblx0RnVsbFBhdGhzOiBGdWxsUGF0aHNcbn07XG5cbi8vICRGbG93SWdub3JlXG5pZihvcHRpb25zICYmIG9wdGlvbnMucmF3KSBvLnJhdyA9IHtoZWFkZXI6IGhlYWRlciwgc2VjdG9yczogc2VjdG9yc307XG5yZXR1cm4gbztcbn0gLy8gcGFyc2VcblxuLyogW01TLUNGQl0gMi4yIENvbXBvdW5kIEZpbGUgSGVhZGVyIC0tIHJlYWQgdXAgdG8gbWFqb3IgdmVyc2lvbiAqL1xuZnVuY3Rpb24gY2hlY2tfZ2V0X212ZXIoYmxvYi8qOkNGQmxvYiovKS8qOltudW1iZXIsIG51bWJlcl0qLyB7XG5cdGlmKGJsb2JbYmxvYi5sXSA9PSAweDUwICYmIGJsb2JbYmxvYi5sICsgMV0gPT0gMHg0YikgcmV0dXJuIFswLCAwXTtcblx0Ly8gaGVhZGVyIHNpZ25hdHVyZSA4XG5cdGJsb2IuY2hrKEhFQURFUl9TSUdOQVRVUkUsICdIZWFkZXIgU2lnbmF0dXJlOiAnKTtcblxuXHQvLyBjbHNpZCAxNlxuXHQvL2Jsb2IuY2hrKEhFQURFUl9DTFNJRCwgJ0NMU0lEOiAnKTtcblx0YmxvYi5sICs9IDE2O1xuXG5cdC8vIG1pbm9yIHZlcnNpb24gMlxuXHR2YXIgbXZlci8qOm51bWJlciovID0gYmxvYi5yZWFkX3NoaWZ0KDIsICd1Jyk7XG5cblx0cmV0dXJuIFtibG9iLnJlYWRfc2hpZnQoMiwndScpLCBtdmVyXTtcbn1cbmZ1bmN0aW9uIGNoZWNrX3NoaWZ0cyhibG9iLyo6Q0ZCbG9iKi8sIG12ZXIvKjpudW1iZXIqLykvKjp2b2lkKi8ge1xuXHR2YXIgc2hpZnQgPSAweDA5O1xuXG5cdC8vIEJ5dGUgT3JkZXJcblx0Ly9ibG9iLmNoaygnZmVmZicsICdCeXRlIE9yZGVyOiAnKTsgLy8gbm90ZTogc29tZSB3cml0ZXJzIHB1dCAweGZmZmZcblx0YmxvYi5sICs9IDI7XG5cblx0Ly8gU2VjdG9yIFNoaWZ0XG5cdHN3aXRjaCgoc2hpZnQgPSBibG9iLnJlYWRfc2hpZnQoMikpKSB7XG5cdFx0Y2FzZSAweDA5OiBpZihtdmVyICE9IDMpIHRocm93IG5ldyBFcnJvcignU2VjdG9yIFNoaWZ0OiBFeHBlY3RlZCA5IHNhdyAnICsgc2hpZnQpOyBicmVhaztcblx0XHRjYXNlIDB4MGM6IGlmKG12ZXIgIT0gNCkgdGhyb3cgbmV3IEVycm9yKCdTZWN0b3IgU2hpZnQ6IEV4cGVjdGVkIDEyIHNhdyAnICsgc2hpZnQpOyBicmVhaztcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1NlY3RvciBTaGlmdDogRXhwZWN0ZWQgOSBvciAxMiBzYXcgJyArIHNoaWZ0KTtcblx0fVxuXG5cdC8vIE1pbmkgU2VjdG9yIFNoaWZ0XG5cdGJsb2IuY2hrKCcwNjAwJywgJ01pbmkgU2VjdG9yIFNoaWZ0OiAnKTtcblxuXHQvLyBSZXNlcnZlZFxuXHRibG9iLmNoaygnMDAwMDAwMDAwMDAwJywgJ1Jlc2VydmVkOiAnKTtcbn1cblxuLyoqIEJyZWFrIHRoZSBmaWxlIHVwIGludG8gc2VjdG9ycyAqL1xuZnVuY3Rpb24gc2VjdG9yaWZ5KGZpbGUvKjpSYXdCeXRlcyovLCBzc3ovKjpudW1iZXIqLykvKjpBcnJheTxSYXdCeXRlcz4qLyB7XG5cdHZhciBuc2VjdG9ycyA9IE1hdGguY2VpbChmaWxlLmxlbmd0aC9zc3opLTE7XG5cdHZhciBzZWN0b3JzLyo6QXJyYXk8UmF3Qnl0ZXM+Ki8gPSBbXTtcblx0Zm9yKHZhciBpPTE7IGkgPCBuc2VjdG9yczsgKytpKSBzZWN0b3JzW2ktMV0gPSBmaWxlLnNsaWNlKGkqc3N6LChpKzEpKnNzeik7XG5cdHNlY3RvcnNbbnNlY3RvcnMtMV0gPSBmaWxlLnNsaWNlKG5zZWN0b3JzKnNzeik7XG5cdHJldHVybiBzZWN0b3JzO1xufVxuXG4vKiBbTVMtQ0ZCXSAyLjYuNCBSZWQtQmxhY2sgVHJlZSAqL1xuZnVuY3Rpb24gYnVpbGRfZnVsbF9wYXRocyhGSS8qOkNGQkZpbGVJbmRleCovLCBGUC8qOkFycmF5PHN0cmluZz4qLywgUGF0aHMvKjpBcnJheTxzdHJpbmc+Ki8pLyo6dm9pZCovIHtcblx0dmFyIGkgPSAwLCBMID0gMCwgUiA9IDAsIEMgPSAwLCBqID0gMCwgcGwgPSBQYXRocy5sZW5ndGg7XG5cdHZhciBkYWQvKjpBcnJheTxudW1iZXI+Ki8gPSBbXSwgcS8qOkFycmF5PG51bWJlcj4qLyA9IFtdO1xuXG5cdGZvcig7IGkgPCBwbDsgKytpKSB7IGRhZFtpXT1xW2ldPWk7IEZQW2ldPVBhdGhzW2ldOyB9XG5cblx0Zm9yKDsgaiA8IHEubGVuZ3RoOyArK2opIHtcblx0XHRpID0gcVtqXTtcblx0XHRMID0gRklbaV0uTDsgUiA9IEZJW2ldLlI7IEMgPSBGSVtpXS5DO1xuXHRcdGlmKGRhZFtpXSA9PT0gaSkge1xuXHRcdFx0aWYoTCAhPT0gLTEgLypOT1NUUkVBTSovICYmIGRhZFtMXSAhPT0gTCkgZGFkW2ldID0gZGFkW0xdO1xuXHRcdFx0aWYoUiAhPT0gLTEgJiYgZGFkW1JdICE9PSBSKSBkYWRbaV0gPSBkYWRbUl07XG5cdFx0fVxuXHRcdGlmKEMgIT09IC0xIC8qTk9TVFJFQU0qLykgZGFkW0NdID0gaTtcblx0XHRpZihMICE9PSAtMSAmJiBpICE9IGRhZFtpXSkgeyBkYWRbTF0gPSBkYWRbaV07IGlmKHEubGFzdEluZGV4T2YoTCkgPCBqKSBxLnB1c2goTCk7IH1cblx0XHRpZihSICE9PSAtMSAmJiBpICE9IGRhZFtpXSkgeyBkYWRbUl0gPSBkYWRbaV07IGlmKHEubGFzdEluZGV4T2YoUikgPCBqKSBxLnB1c2goUik7IH1cblx0fVxuXHRmb3IoaT0xOyBpIDwgcGw7ICsraSkgaWYoZGFkW2ldID09PSBpKSB7XG5cdFx0aWYoUiAhPT0gLTEgLypOT1NUUkVBTSovICYmIGRhZFtSXSAhPT0gUikgZGFkW2ldID0gZGFkW1JdO1xuXHRcdGVsc2UgaWYoTCAhPT0gLTEgJiYgZGFkW0xdICE9PSBMKSBkYWRbaV0gPSBkYWRbTF07XG5cdH1cblxuXHRmb3IoaT0xOyBpIDwgcGw7ICsraSkge1xuXHRcdGlmKEZJW2ldLnR5cGUgPT09IDAgLyogdW5rbm93biAqLykgY29udGludWU7XG5cdFx0aiA9IGk7XG5cdFx0aWYoaiAhPSBkYWRbal0pIGRvIHtcblx0XHRcdGogPSBkYWRbal07XG5cdFx0XHRGUFtpXSA9IEZQW2pdICsgXCIvXCIgKyBGUFtpXTtcblx0XHR9IHdoaWxlIChqICE9PSAwICYmIC0xICE9PSBkYWRbal0gJiYgaiAhPSBkYWRbal0pO1xuXHRcdGRhZFtpXSA9IC0xO1xuXHR9XG5cblx0RlBbMF0gKz0gXCIvXCI7XG5cdGZvcihpPTE7IGkgPCBwbDsgKytpKSB7XG5cdFx0aWYoRklbaV0udHlwZSAhPT0gMiAvKiBzdHJlYW0gKi8pIEZQW2ldICs9IFwiL1wiO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldF9tZmF0X2VudHJ5KGVudHJ5Lyo6Q0ZCRW50cnkqLywgcGF5bG9hZC8qOlJhd0J5dGVzKi8sIG1pbmkvKjo/UmF3Qnl0ZXMqLykvKjpDRkJsb2IqLyB7XG5cdHZhciBzdGFydCA9IGVudHJ5LnN0YXJ0LCBzaXplID0gZW50cnkuc2l6ZTtcblx0Ly9yZXR1cm4gKHBheWxvYWQuc2xpY2Uoc3RhcnQqTVNTWiwgc3RhcnQqTVNTWiArIHNpemUpLyo6YW55Ki8pO1xuXHR2YXIgbyA9IFtdO1xuXHR2YXIgaWR4ID0gc3RhcnQ7XG5cdHdoaWxlKG1pbmkgJiYgc2l6ZSA+IDAgJiYgaWR4ID49IDApIHtcblx0XHRvLnB1c2gocGF5bG9hZC5zbGljZShpZHggKiBNU1NaLCBpZHggKiBNU1NaICsgTVNTWikpO1xuXHRcdHNpemUgLT0gTVNTWjtcblx0XHRpZHggPSBfX3JlYWRJbnQzMkxFKG1pbmksIGlkeCAqIDQpO1xuXHR9XG5cdGlmKG8ubGVuZ3RoID09PSAwKSByZXR1cm4gKG5ld19idWYoMCkvKjphbnkqLyk7XG5cdHJldHVybiAoYmNvbmNhdChvKS5zbGljZSgwLCBlbnRyeS5zaXplKS8qOmFueSovKTtcbn1cblxuLyoqIENoYXNlIGRvd24gdGhlIHJlc3Qgb2YgdGhlIERJRkFUIGNoYWluIHRvIGJ1aWxkIGEgY29tcHJlaGVuc2l2ZSBsaXN0XG4gICAgRElGQVQgY2hhaW5zIGJ5IHN0b3JpbmcgdGhlIG5leHQgc2VjdG9yIG51bWJlciBhcyB0aGUgbGFzdCAzMiBiaXRzICovXG5mdW5jdGlvbiBzbGV1dGhfZmF0KGlkeC8qOm51bWJlciovLCBjbnQvKjpudW1iZXIqLywgc2VjdG9ycy8qOkFycmF5PFJhd0J5dGVzPiovLCBzc3ovKjpudW1iZXIqLywgZmF0X2FkZHJzKS8qOnZvaWQqLyB7XG5cdHZhciBxLyo6bnVtYmVyKi8gPSBFTkRPRkNIQUlOO1xuXHRpZihpZHggPT09IEVORE9GQ0hBSU4pIHtcblx0XHRpZihjbnQgIT09IDApIHRocm93IG5ldyBFcnJvcihcIkRJRkFUIGNoYWluIHNob3J0ZXIgdGhhbiBleHBlY3RlZFwiKTtcblx0fSBlbHNlIGlmKGlkeCAhPT0gLTEgLypGUkVFU0VDVCovKSB7XG5cdFx0dmFyIHNlY3RvciA9IHNlY3RvcnNbaWR4XSwgbSA9IChzc3o+Pj4yKS0xO1xuXHRcdGlmKCFzZWN0b3IpIHJldHVybjtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgbTsgKytpKSB7XG5cdFx0XHRpZigocSA9IF9fcmVhZEludDMyTEUoc2VjdG9yLGkqNCkpID09PSBFTkRPRkNIQUlOKSBicmVhaztcblx0XHRcdGZhdF9hZGRycy5wdXNoKHEpO1xuXHRcdH1cblx0XHRzbGV1dGhfZmF0KF9fcmVhZEludDMyTEUoc2VjdG9yLHNzei00KSxjbnQgLSAxLCBzZWN0b3JzLCBzc3osIGZhdF9hZGRycyk7XG5cdH1cbn1cblxuLyoqIEZvbGxvdyB0aGUgbGlua2VkIGxpc3Qgb2Ygc2VjdG9ycyBmb3IgYSBnaXZlbiBzdGFydGluZyBwb2ludCAqL1xuZnVuY3Rpb24gZ2V0X3NlY3Rvcl9saXN0KHNlY3RvcnMvKjpBcnJheTxSYXdCeXRlcz4qLywgc3RhcnQvKjpudW1iZXIqLywgZmF0X2FkZHJzLyo6QXJyYXk8bnVtYmVyPiovLCBzc3ovKjpudW1iZXIqLywgY2hrZC8qOj9BcnJheTxib29sZWFuPiovKS8qOlNlY3RvckVudHJ5Ki8ge1xuXHR2YXIgYnVmLyo6QXJyYXk8bnVtYmVyPiovID0gW10sIGJ1Zl9jaGFpbi8qOkFycmF5PGFueT4qLyA9IFtdO1xuXHRpZighY2hrZCkgY2hrZCA9IFtdO1xuXHR2YXIgbW9kdWx1cyA9IHNzeiAtIDEsIGogPSAwLCBqaiA9IDA7XG5cdGZvcihqPXN0YXJ0OyBqPj0wOykge1xuXHRcdGNoa2Rbal0gPSB0cnVlO1xuXHRcdGJ1ZltidWYubGVuZ3RoXSA9IGo7XG5cdFx0YnVmX2NoYWluLnB1c2goc2VjdG9yc1tqXSk7XG5cdFx0dmFyIGFkZHIgPSBmYXRfYWRkcnNbTWF0aC5mbG9vcihqKjQvc3N6KV07XG5cdFx0amogPSAoKGoqNCkgJiBtb2R1bHVzKTtcblx0XHRpZihzc3ogPCA0ICsgamopIHRocm93IG5ldyBFcnJvcihcIkZBVCBib3VuZGFyeSBjcm9zc2VkOiBcIiArIGogKyBcIiA0IFwiK3Nzeik7XG5cdFx0aWYoIXNlY3RvcnNbYWRkcl0pIGJyZWFrO1xuXHRcdGogPSBfX3JlYWRJbnQzMkxFKHNlY3RvcnNbYWRkcl0sIGpqKTtcblx0fVxuXHRyZXR1cm4ge25vZGVzOiBidWYsIGRhdGE6X190b0J1ZmZlcihbYnVmX2NoYWluXSl9O1xufVxuXG4vKiogQ2hhc2UgZG93biB0aGUgc2VjdG9yIGxpbmtlZCBsaXN0cyAqL1xuZnVuY3Rpb24gbWFrZV9zZWN0b3JfbGlzdChzZWN0b3JzLyo6QXJyYXk8UmF3Qnl0ZXM+Ki8sIGRpcl9zdGFydC8qOm51bWJlciovLCBmYXRfYWRkcnMvKjpBcnJheTxudW1iZXI+Ki8sIHNzei8qOm51bWJlciovKS8qOlNlY3Rvckxpc3QqLyB7XG5cdHZhciBzbCA9IHNlY3RvcnMubGVuZ3RoLCBzZWN0b3JfbGlzdC8qOlNlY3Rvckxpc3QqLyA9IChbXS8qOmFueSovKTtcblx0dmFyIGNoa2QvKjpBcnJheTxib29sZWFuPiovID0gW10sIGJ1Zi8qOkFycmF5PG51bWJlcj4qLyA9IFtdLCBidWZfY2hhaW4vKjpBcnJheTxSYXdCeXRlcz4qLyA9IFtdO1xuXHR2YXIgbW9kdWx1cyA9IHNzeiAtIDEsIGk9MCwgaj0wLCBrPTAsIGpqPTA7XG5cdGZvcihpPTA7IGkgPCBzbDsgKytpKSB7XG5cdFx0YnVmID0gKFtdLyo6QXJyYXk8bnVtYmVyPiovKTtcblx0XHRrID0gKGkgKyBkaXJfc3RhcnQpOyBpZihrID49IHNsKSBrLT1zbDtcblx0XHRpZihjaGtkW2tdKSBjb250aW51ZTtcblx0XHRidWZfY2hhaW4gPSBbXTtcblx0XHR2YXIgc2VlbiA9IFtdO1xuXHRcdGZvcihqPWs7IGo+PTA7KSB7XG5cdFx0XHRzZWVuW2pdID0gdHJ1ZTtcblx0XHRcdGNoa2Rbal0gPSB0cnVlO1xuXHRcdFx0YnVmW2J1Zi5sZW5ndGhdID0gajtcblx0XHRcdGJ1Zl9jaGFpbi5wdXNoKHNlY3RvcnNbal0pO1xuXHRcdFx0dmFyIGFkZHIvKjpudW1iZXIqLyA9IGZhdF9hZGRyc1tNYXRoLmZsb29yKGoqNC9zc3opXTtcblx0XHRcdGpqID0gKChqKjQpICYgbW9kdWx1cyk7XG5cdFx0XHRpZihzc3ogPCA0ICsgamopIHRocm93IG5ldyBFcnJvcihcIkZBVCBib3VuZGFyeSBjcm9zc2VkOiBcIiArIGogKyBcIiA0IFwiK3Nzeik7XG5cdFx0XHRpZighc2VjdG9yc1thZGRyXSkgYnJlYWs7XG5cdFx0XHRqID0gX19yZWFkSW50MzJMRShzZWN0b3JzW2FkZHJdLCBqaik7XG5cdFx0XHRpZihzZWVuW2pdKSBicmVhaztcblx0XHR9XG5cdFx0c2VjdG9yX2xpc3Rba10gPSAoe25vZGVzOiBidWYsIGRhdGE6X190b0J1ZmZlcihbYnVmX2NoYWluXSl9Lyo6U2VjdG9yRW50cnkqLyk7XG5cdH1cblx0cmV0dXJuIHNlY3Rvcl9saXN0O1xufVxuXG4vKiBbTVMtQ0ZCXSAyLjYuMSBDb21wb3VuZCBGaWxlIERpcmVjdG9yeSBFbnRyeSAqL1xuZnVuY3Rpb24gcmVhZF9kaXJlY3RvcnkoZGlyX3N0YXJ0Lyo6bnVtYmVyKi8sIHNlY3Rvcl9saXN0Lyo6U2VjdG9yTGlzdCovLCBzZWN0b3JzLyo6QXJyYXk8UmF3Qnl0ZXM+Ki8sIFBhdGhzLyo6QXJyYXk8c3RyaW5nPiovLCBubWZzLCBmaWxlcywgRmlsZUluZGV4LCBtaW5pKSB7XG5cdHZhciBtaW5pZmF0X3N0b3JlID0gMCwgcGwgPSAoUGF0aHMubGVuZ3RoPzI6MCk7XG5cdHZhciBzZWN0b3IgPSBzZWN0b3JfbGlzdFtkaXJfc3RhcnRdLmRhdGE7XG5cdHZhciBpID0gMCwgbmFtZWxlbiA9IDAsIG5hbWU7XG5cdGZvcig7IGkgPCBzZWN0b3IubGVuZ3RoOyBpKz0gMTI4KSB7XG5cdFx0dmFyIGJsb2IvKjpDRkJsb2IqLyA9IC8qOjooKi9zZWN0b3Iuc2xpY2UoaSwgaSsxMjgpLyo6OiA6YW55KSovO1xuXHRcdHByZXBfYmxvYihibG9iLCA2NCk7XG5cdFx0bmFtZWxlbiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHRuYW1lID0gX191dGYxNmxlKGJsb2IsMCxuYW1lbGVuLXBsKTtcblx0XHRQYXRocy5wdXNoKG5hbWUpO1xuXHRcdHZhciBvLyo6Q0ZCRW50cnkqLyA9ICh7XG5cdFx0XHRuYW1lOiAgbmFtZSxcblx0XHRcdHR5cGU6ICBibG9iLnJlYWRfc2hpZnQoMSksXG5cdFx0XHRjb2xvcjogYmxvYi5yZWFkX3NoaWZ0KDEpLFxuXHRcdFx0TDogICAgIGJsb2IucmVhZF9zaGlmdCg0LCAnaScpLFxuXHRcdFx0UjogICAgIGJsb2IucmVhZF9zaGlmdCg0LCAnaScpLFxuXHRcdFx0QzogICAgIGJsb2IucmVhZF9zaGlmdCg0LCAnaScpLFxuXHRcdFx0Y2xzaWQ6IGJsb2IucmVhZF9zaGlmdCgxNiksXG5cdFx0XHRzdGF0ZTogYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyksXG5cdFx0XHRzdGFydDogMCxcblx0XHRcdHNpemU6IDBcblx0XHR9KTtcblx0XHR2YXIgY3RpbWUvKjpudW1iZXIqLyA9IGJsb2IucmVhZF9zaGlmdCgyKSArIGJsb2IucmVhZF9zaGlmdCgyKSArIGJsb2IucmVhZF9zaGlmdCgyKSArIGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHRpZihjdGltZSAhPT0gMCkgby5jdCA9IHJlYWRfZGF0ZShibG9iLCBibG9iLmwtOCk7XG5cdFx0dmFyIG10aW1lLyo6bnVtYmVyKi8gPSBibG9iLnJlYWRfc2hpZnQoMikgKyBibG9iLnJlYWRfc2hpZnQoMikgKyBibG9iLnJlYWRfc2hpZnQoMikgKyBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0aWYobXRpbWUgIT09IDApIG8ubXQgPSByZWFkX2RhdGUoYmxvYiwgYmxvYi5sLTgpO1xuXHRcdG8uc3RhcnQgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcblx0XHRvLnNpemUgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcblx0XHRpZihvLnNpemUgPCAwICYmIG8uc3RhcnQgPCAwKSB7IG8uc2l6ZSA9IG8udHlwZSA9IDA7IG8uc3RhcnQgPSBFTkRPRkNIQUlOOyBvLm5hbWUgPSBcIlwiOyB9XG5cdFx0aWYoby50eXBlID09PSA1KSB7IC8qIHJvb3QgKi9cblx0XHRcdG1pbmlmYXRfc3RvcmUgPSBvLnN0YXJ0O1xuXHRcdFx0aWYobm1mcyA+IDAgJiYgbWluaWZhdF9zdG9yZSAhPT0gRU5ET0ZDSEFJTikgc2VjdG9yX2xpc3RbbWluaWZhdF9zdG9yZV0ubmFtZSA9IFwiIVN0cmVhbURhdGFcIjtcblx0XHRcdC8qbWluaWZhdF9zaXplID0gby5zaXplOyovXG5cdFx0fSBlbHNlIGlmKG8uc2l6ZSA+PSA0MDk2IC8qIE1TQ1NaICovKSB7XG5cdFx0XHRvLnN0b3JhZ2UgPSAnZmF0Jztcblx0XHRcdGlmKHNlY3Rvcl9saXN0W28uc3RhcnRdID09PSB1bmRlZmluZWQpIHNlY3Rvcl9saXN0W28uc3RhcnRdID0gZ2V0X3NlY3Rvcl9saXN0KHNlY3RvcnMsIG8uc3RhcnQsIHNlY3Rvcl9saXN0LmZhdF9hZGRycywgc2VjdG9yX2xpc3Quc3N6KTtcblx0XHRcdHNlY3Rvcl9saXN0W28uc3RhcnRdLm5hbWUgPSBvLm5hbWU7XG5cdFx0XHRvLmNvbnRlbnQgPSAoc2VjdG9yX2xpc3Rbby5zdGFydF0uZGF0YS5zbGljZSgwLG8uc2l6ZSkvKjphbnkqLyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG8uc3RvcmFnZSA9ICdtaW5pZmF0Jztcblx0XHRcdGlmKG8uc2l6ZSA8IDApIG8uc2l6ZSA9IDA7XG5cdFx0XHRlbHNlIGlmKG1pbmlmYXRfc3RvcmUgIT09IEVORE9GQ0hBSU4gJiYgby5zdGFydCAhPT0gRU5ET0ZDSEFJTiAmJiBzZWN0b3JfbGlzdFttaW5pZmF0X3N0b3JlXSkge1xuXHRcdFx0XHRvLmNvbnRlbnQgPSBnZXRfbWZhdF9lbnRyeShvLCBzZWN0b3JfbGlzdFttaW5pZmF0X3N0b3JlXS5kYXRhLCAoc2VjdG9yX2xpc3RbbWluaV18fHt9KS5kYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYoby5jb250ZW50KSBwcmVwX2Jsb2Ioby5jb250ZW50LCAwKTtcblx0XHRmaWxlc1tuYW1lXSA9IG87XG5cdFx0RmlsZUluZGV4LnB1c2gobyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVhZF9kYXRlKGJsb2IvKjpSYXdCeXRlc3xDRkJsb2IqLywgb2Zmc2V0Lyo6bnVtYmVyKi8pLyo6RGF0ZSovIHtcblx0cmV0dXJuIG5ldyBEYXRlKCggKCAoX19yZWFkVUludDMyTEUoYmxvYixvZmZzZXQrNCkvMWU3KSpNYXRoLnBvdygyLDMyKStfX3JlYWRVSW50MzJMRShibG9iLG9mZnNldCkvMWU3ICkgLSAxMTY0NDQ3MzYwMCkqMTAwMCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRfZmlsZShmaWxlbmFtZS8qOnN0cmluZyovLCBvcHRpb25zLyo6Q0ZCUmVhZE9wdHMqLykge1xuXHRnZXRfZnMoKTtcblx0cmV0dXJuIHBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSksIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiByZWFkKGJsb2IvKjpSYXdCeXRlc3xzdHJpbmcqLywgb3B0aW9ucy8qOkNGQlJlYWRPcHRzKi8pIHtcblx0dmFyIHR5cGUgPSBvcHRpb25zICYmIG9wdGlvbnMudHlwZTtcblx0aWYoIXR5cGUpIHtcblx0XHRpZihoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihibG9iKSkgdHlwZSA9IFwiYnVmZmVyXCI7XG5cdH1cblx0c3dpdGNoKHR5cGUgfHwgXCJiYXNlNjRcIikge1xuXHRcdGNhc2UgXCJmaWxlXCI6IC8qOjogaWYodHlwZW9mIGJsb2IgIT09ICdzdHJpbmcnKSB0aHJvdyBcIk11c3QgcGFzcyBhIGZpbGVuYW1lIHdoZW4gdHlwZT0nZmlsZSdcIjsgKi9yZXR1cm4gcmVhZF9maWxlKGJsb2IsIG9wdGlvbnMpO1xuXHRcdGNhc2UgXCJiYXNlNjRcIjogLyo6OiBpZih0eXBlb2YgYmxvYiAhPT0gJ3N0cmluZycpIHRocm93IFwiTXVzdCBwYXNzIGEgYmFzZTY0LWVuY29kZWQgYmluYXJ5IHN0cmluZyB3aGVuIHR5cGU9J2ZpbGUnXCI7ICovcmV0dXJuIHBhcnNlKHMyYShCYXNlNjRfZGVjb2RlKGJsb2IpKSwgb3B0aW9ucyk7XG5cdFx0Y2FzZSBcImJpbmFyeVwiOiAvKjo6IGlmKHR5cGVvZiBibG9iICE9PSAnc3RyaW5nJykgdGhyb3cgXCJNdXN0IHBhc3MgYSBiaW5hcnkgc3RyaW5nIHdoZW4gdHlwZT0nZmlsZSdcIjsgKi9yZXR1cm4gcGFyc2UoczJhKGJsb2IpLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gcGFyc2UoLyo6OnR5cGVvZiBibG9iID09ICdzdHJpbmcnID8gbmV3IEJ1ZmZlcihibG9iLCAndXRmLTgnKSA6ICovYmxvYiwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGluaXRfY2ZiKGNmYi8qOkNGQkNvbnRhaW5lciovLCBvcHRzLyo6P2FueSovKS8qOnZvaWQqLyB7XG5cdHZhciBvID0gb3B0cyB8fCB7fSwgcm9vdCA9IG8ucm9vdCB8fCBcIlJvb3QgRW50cnlcIjtcblx0aWYoIWNmYi5GdWxsUGF0aHMpIGNmYi5GdWxsUGF0aHMgPSBbXTtcblx0aWYoIWNmYi5GaWxlSW5kZXgpIGNmYi5GaWxlSW5kZXggPSBbXTtcblx0aWYoY2ZiLkZ1bGxQYXRocy5sZW5ndGggIT09IGNmYi5GaWxlSW5kZXgubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJpbmNvbnNpc3RlbnQgQ0ZCIHN0cnVjdHVyZVwiKTtcblx0aWYoY2ZiLkZ1bGxQYXRocy5sZW5ndGggPT09IDApIHtcblx0XHRjZmIuRnVsbFBhdGhzWzBdID0gcm9vdCArIFwiL1wiO1xuXHRcdGNmYi5GaWxlSW5kZXhbMF0gPSAoeyBuYW1lOiByb290LCB0eXBlOiA1IH0vKjphbnkqLyk7XG5cdH1cblx0aWYoby5DTFNJRCkgY2ZiLkZpbGVJbmRleFswXS5jbHNpZCA9IG8uQ0xTSUQ7XG5cdHNlZWRfY2ZiKGNmYik7XG59XG5mdW5jdGlvbiBzZWVkX2NmYihjZmIvKjpDRkJDb250YWluZXIqLykvKjp2b2lkKi8ge1xuXHR2YXIgbm0gPSBcIlxcdTAwMDFTaDMzdEo1XCI7XG5cdGlmKENGQi5maW5kKGNmYiwgXCIvXCIgKyBubSkpIHJldHVybjtcblx0dmFyIHAgPSBuZXdfYnVmKDQpOyBwWzBdID0gNTU7IHBbMV0gPSBwWzNdID0gNTA7IHBbMl0gPSA1NDtcblx0Y2ZiLkZpbGVJbmRleC5wdXNoKCh7IG5hbWU6IG5tLCB0eXBlOiAyLCBjb250ZW50OnAsIHNpemU6NCwgTDo2OSwgUjo2OSwgQzo2OSB9Lyo6YW55Ki8pKTtcblx0Y2ZiLkZ1bGxQYXRocy5wdXNoKGNmYi5GdWxsUGF0aHNbMF0gKyBubSk7XG5cdHJlYnVpbGRfY2ZiKGNmYik7XG59XG5mdW5jdGlvbiByZWJ1aWxkX2NmYihjZmIvKjpDRkJDb250YWluZXIqLywgZi8qOj9ib29sZWFuKi8pLyo6dm9pZCovIHtcblx0aW5pdF9jZmIoY2ZiKTtcblx0dmFyIGdjID0gZmFsc2UsIHMgPSBmYWxzZTtcblx0Zm9yKHZhciBpID0gY2ZiLkZ1bGxQYXRocy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuXHRcdHZhciBfZmlsZSA9IGNmYi5GaWxlSW5kZXhbaV07XG5cdFx0c3dpdGNoKF9maWxlLnR5cGUpIHtcblx0XHRcdGNhc2UgMDpcblx0XHRcdFx0aWYocykgZ2MgPSB0cnVlO1xuXHRcdFx0XHRlbHNlIHsgY2ZiLkZpbGVJbmRleC5wb3AoKTsgY2ZiLkZ1bGxQYXRocy5wb3AoKTsgfVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTogY2FzZSAyOiBjYXNlIDU6XG5cdFx0XHRcdHMgPSB0cnVlO1xuXHRcdFx0XHRpZihpc05hTihfZmlsZS5SICogX2ZpbGUuTCAqIF9maWxlLkMpKSBnYyA9IHRydWU7XG5cdFx0XHRcdGlmKF9maWxlLlIgPiAtMSAmJiBfZmlsZS5MID4gLTEgJiYgX2ZpbGUuUiA9PSBfZmlsZS5MKSBnYyA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogZ2MgPSB0cnVlOyBicmVhaztcblx0XHR9XG5cdH1cblx0aWYoIWdjICYmICFmKSByZXR1cm47XG5cblx0dmFyIG5vdyA9IG5ldyBEYXRlKDE5ODcsIDEsIDE5KSwgaiA9IDA7XG5cdC8vIFRyYWNrIHdoaWNoIG5hbWVzIGV4aXN0XG5cdHZhciBmdWxsUGF0aHMgPSBPYmplY3QuY3JlYXRlID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXHR2YXIgZGF0YS8qOkFycmF5PFtzdHJpbmcsIENGQkVudHJ5XT4qLyA9IFtdO1xuXHRmb3IoaSA9IDA7IGkgPCBjZmIuRnVsbFBhdGhzLmxlbmd0aDsgKytpKSB7XG5cdFx0ZnVsbFBhdGhzW2NmYi5GdWxsUGF0aHNbaV1dID0gdHJ1ZTtcblx0XHRpZihjZmIuRmlsZUluZGV4W2ldLnR5cGUgPT09IDApIGNvbnRpbnVlO1xuXHRcdGRhdGEucHVzaChbY2ZiLkZ1bGxQYXRoc1tpXSwgY2ZiLkZpbGVJbmRleFtpXV0pO1xuXHR9XG5cdGZvcihpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgZGFkID0gZGlybmFtZShkYXRhW2ldWzBdKTtcblx0XHRzID0gZnVsbFBhdGhzW2RhZF07XG5cdFx0aWYoIXMpIHtcblx0XHRcdGRhdGEucHVzaChbZGFkLCAoe1xuXHRcdFx0XHRuYW1lOiBmaWxlbmFtZShkYWQpLnJlcGxhY2UoXCIvXCIsXCJcIiksXG5cdFx0XHRcdHR5cGU6IDEsXG5cdFx0XHRcdGNsc2lkOiBIRUFERVJfQ0xTSUQsXG5cdFx0XHRcdGN0OiBub3csIG10OiBub3csXG5cdFx0XHRcdGNvbnRlbnQ6IG51bGxcblx0XHRcdH0vKjphbnkqLyldKTtcblx0XHRcdC8vIEFkZCBuYW1lIHRvIHNldFxuXHRcdFx0ZnVsbFBhdGhzW2RhZF0gPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdGRhdGEuc29ydChmdW5jdGlvbih4LHkpIHsgcmV0dXJuIG5hbWVjbXAoeFswXSwgeVswXSk7IH0pO1xuXHRjZmIuRnVsbFBhdGhzID0gW107IGNmYi5GaWxlSW5kZXggPSBbXTtcblx0Zm9yKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkgeyBjZmIuRnVsbFBhdGhzW2ldID0gZGF0YVtpXVswXTsgY2ZiLkZpbGVJbmRleFtpXSA9IGRhdGFbaV1bMV07IH1cblx0Zm9yKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBlbHQgPSBjZmIuRmlsZUluZGV4W2ldO1xuXHRcdHZhciBubSA9IGNmYi5GdWxsUGF0aHNbaV07XG5cblx0XHRlbHQubmFtZSA9ICBmaWxlbmFtZShubSkucmVwbGFjZShcIi9cIixcIlwiKTtcblx0XHRlbHQuTCA9IGVsdC5SID0gZWx0LkMgPSAtKGVsdC5jb2xvciA9IDEpO1xuXHRcdGVsdC5zaXplID0gZWx0LmNvbnRlbnQgPyBlbHQuY29udGVudC5sZW5ndGggOiAwO1xuXHRcdGVsdC5zdGFydCA9IDA7XG5cdFx0ZWx0LmNsc2lkID0gKGVsdC5jbHNpZCB8fCBIRUFERVJfQ0xTSUQpO1xuXHRcdGlmKGkgPT09IDApIHtcblx0XHRcdGVsdC5DID0gZGF0YS5sZW5ndGggPiAxID8gMSA6IC0xO1xuXHRcdFx0ZWx0LnNpemUgPSAwO1xuXHRcdFx0ZWx0LnR5cGUgPSA1O1xuXHRcdH0gZWxzZSBpZihubS5zbGljZSgtMSkgPT0gXCIvXCIpIHtcblx0XHRcdGZvcihqPWkrMTtqIDwgZGF0YS5sZW5ndGg7ICsraikgaWYoZGlybmFtZShjZmIuRnVsbFBhdGhzW2pdKT09bm0pIGJyZWFrO1xuXHRcdFx0ZWx0LkMgPSBqID49IGRhdGEubGVuZ3RoID8gLTEgOiBqO1xuXHRcdFx0Zm9yKGo9aSsxO2ogPCBkYXRhLmxlbmd0aDsgKytqKSBpZihkaXJuYW1lKGNmYi5GdWxsUGF0aHNbal0pPT1kaXJuYW1lKG5tKSkgYnJlYWs7XG5cdFx0XHRlbHQuUiA9IGogPj0gZGF0YS5sZW5ndGggPyAtMSA6IGo7XG5cdFx0XHRlbHQudHlwZSA9IDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmKGRpcm5hbWUoY2ZiLkZ1bGxQYXRoc1tpKzFdfHxcIlwiKSA9PSBkaXJuYW1lKG5tKSkgZWx0LlIgPSBpICsgMTtcblx0XHRcdGVsdC50eXBlID0gMjtcblx0XHR9XG5cdH1cblxufVxuXG5mdW5jdGlvbiBfd3JpdGUoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8sIG9wdGlvbnMvKjpDRkJXcml0ZU9wdHMqLykvKjpSYXdCeXRlc3xzdHJpbmcqLyB7XG5cdHZhciBfb3B0cyA9IG9wdGlvbnMgfHwge307XG5cdC8qIE1BRCBpcyBvcmRlci1zZW5zaXRpdmUsIHNraXAgcmVidWlsZCBhbmQgc29ydCAqL1xuXHRpZihfb3B0cy5maWxlVHlwZSA9PSAnbWFkJykgcmV0dXJuIHdyaXRlX21hZChjZmIsIF9vcHRzKTtcblx0cmVidWlsZF9jZmIoY2ZiKTtcblx0c3dpdGNoKF9vcHRzLmZpbGVUeXBlKSB7XG5cdFx0Y2FzZSAnemlwJzogcmV0dXJuIHdyaXRlX3ppcChjZmIsIF9vcHRzKTtcblx0XHQvL2Nhc2UgJ21hZCc6IHJldHVybiB3cml0ZV9tYWQoY2ZiLCBfb3B0cyk7XG5cdH1cblx0dmFyIEwgPSAoZnVuY3Rpb24oY2ZiLyo6Q0ZCQ29udGFpbmVyKi8pLyo6QXJyYXk8bnVtYmVyPiove1xuXHRcdHZhciBtaW5pX3NpemUgPSAwLCBmYXRfc2l6ZSA9IDA7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGNmYi5GaWxlSW5kZXgubGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhciBmaWxlID0gY2ZiLkZpbGVJbmRleFtpXTtcblx0XHRcdGlmKCFmaWxlLmNvbnRlbnQpIGNvbnRpbnVlO1xuXHRcdFx0Lyo6OiBpZihmaWxlLmNvbnRlbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7ICovXG5cdFx0XHR2YXIgZmxlbiA9IGZpbGUuY29udGVudC5sZW5ndGg7XG5cdFx0XHRpZihmbGVuID4gMCl7XG5cdFx0XHRcdGlmKGZsZW4gPCAweDEwMDApIG1pbmlfc2l6ZSArPSAoZmxlbiArIDB4M0YpID4+IDY7XG5cdFx0XHRcdGVsc2UgZmF0X3NpemUgKz0gKGZsZW4gKyAweDAxRkYpID4+IDk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhciBkaXJfY250ID0gKGNmYi5GdWxsUGF0aHMubGVuZ3RoICszKSA+PiAyO1xuXHRcdHZhciBtaW5pX2NudCA9IChtaW5pX3NpemUgKyA3KSA+PiAzO1xuXHRcdHZhciBtZmF0X2NudCA9IChtaW5pX3NpemUgKyAweDdGKSA+PiA3O1xuXHRcdHZhciBmYXRfYmFzZSA9IG1pbmlfY250ICsgZmF0X3NpemUgKyBkaXJfY250ICsgbWZhdF9jbnQ7XG5cdFx0dmFyIGZhdF9jbnQgPSAoZmF0X2Jhc2UgKyAweDdGKSA+PiA3O1xuXHRcdHZhciBkaWZhdF9jbnQgPSBmYXRfY250IDw9IDEwOSA/IDAgOiBNYXRoLmNlaWwoKGZhdF9jbnQtMTA5KS8weDdGKTtcblx0XHR3aGlsZSgoKGZhdF9iYXNlICsgZmF0X2NudCArIGRpZmF0X2NudCArIDB4N0YpID4+IDcpID4gZmF0X2NudCkgZGlmYXRfY250ID0gKytmYXRfY250IDw9IDEwOSA/IDAgOiBNYXRoLmNlaWwoKGZhdF9jbnQtMTA5KS8weDdGKTtcblx0XHR2YXIgTCA9ICBbMSwgZGlmYXRfY250LCBmYXRfY250LCBtZmF0X2NudCwgZGlyX2NudCwgZmF0X3NpemUsIG1pbmlfc2l6ZSwgMF07XG5cdFx0Y2ZiLkZpbGVJbmRleFswXS5zaXplID0gbWluaV9zaXplIDw8IDY7XG5cdFx0TFs3XSA9IChjZmIuRmlsZUluZGV4WzBdLnN0YXJ0PUxbMF0rTFsxXStMWzJdK0xbM10rTFs0XStMWzVdKSsoKExbNl0rNykgPj4gMyk7XG5cdFx0cmV0dXJuIEw7XG5cdH0pKGNmYik7XG5cdHZhciBvID0gbmV3X2J1ZihMWzddIDw8IDkpO1xuXHR2YXIgaSA9IDAsIFQgPSAwO1xuXHR7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgODsgKytpKSBvLndyaXRlX3NoaWZ0KDEsIEhFQURFUl9TSUdbaV0pO1xuXHRcdGZvcihpID0gMDsgaSA8IDg7ICsraSkgby53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDB4MDAzRSk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAweDAwMDMpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMHhGRkZFKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDB4MDAwOSk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAweDAwMDYpO1xuXHRcdGZvcihpID0gMDsgaSA8IDM7ICsraSkgby53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgTFsyXSk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCBMWzBdICsgTFsxXSArIExbMl0gKyBMWzNdIC0gMSk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDE8PDEyKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIExbM10gPyBMWzBdICsgTFsxXSArIExbMl0gLSAxOiBFTkRPRkNIQUlOKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIExbM10pO1xuXHRcdG8ud3JpdGVfc2hpZnQoLTQsIExbMV0gPyBMWzBdIC0gMTogRU5ET0ZDSEFJTik7XG5cdFx0by53cml0ZV9zaGlmdCg0LCBMWzFdKTtcblx0XHRmb3IoaSA9IDA7IGkgPCAxMDk7ICsraSkgby53cml0ZV9zaGlmdCgtNCwgaSA8IExbMl0gPyBMWzFdICsgaSA6IC0xKTtcblx0fVxuXHRpZihMWzFdKSB7XG5cdFx0Zm9yKFQgPSAwOyBUIDwgTFsxXTsgKytUKSB7XG5cdFx0XHRmb3IoOyBpIDwgMjM2ICsgVCAqIDEyNzsgKytpKSBvLndyaXRlX3NoaWZ0KC00LCBpIDwgTFsyXSA/IExbMV0gKyBpIDogLTEpO1xuXHRcdFx0by53cml0ZV9zaGlmdCgtNCwgVCA9PT0gTFsxXSAtIDEgPyBFTkRPRkNIQUlOIDogVCArIDEpO1xuXHRcdH1cblx0fVxuXHR2YXIgY2hhaW5pdCA9IGZ1bmN0aW9uKHcvKjpudW1iZXIqLykvKjp2b2lkKi8ge1xuXHRcdGZvcihUICs9IHc7IGk8VC0xOyArK2kpIG8ud3JpdGVfc2hpZnQoLTQsIGkrMSk7XG5cdFx0aWYodykgeyArK2k7IG8ud3JpdGVfc2hpZnQoLTQsIEVORE9GQ0hBSU4pOyB9XG5cdH07XG5cdFQgPSBpID0gMDtcblx0Zm9yKFQrPUxbMV07IGk8VDsgKytpKSBvLndyaXRlX3NoaWZ0KC00LCBjb25zdHMuRElGU0VDVCk7XG5cdGZvcihUKz1MWzJdOyBpPFQ7ICsraSkgby53cml0ZV9zaGlmdCgtNCwgY29uc3RzLkZBVFNFQ1QpO1xuXHRjaGFpbml0KExbM10pO1xuXHRjaGFpbml0KExbNF0pO1xuXHR2YXIgai8qOm51bWJlciovID0gMCwgZmxlbi8qOm51bWJlciovID0gMDtcblx0dmFyIGZpbGUvKjpDRkJFbnRyeSovID0gY2ZiLkZpbGVJbmRleFswXTtcblx0Zm9yKDsgaiA8IGNmYi5GaWxlSW5kZXgubGVuZ3RoOyArK2opIHtcblx0XHRmaWxlID0gY2ZiLkZpbGVJbmRleFtqXTtcblx0XHRpZighZmlsZS5jb250ZW50KSBjb250aW51ZTtcblx0XHQvKjo6IGlmKGZpbGUuY29udGVudCA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRmbGVuID0gZmlsZS5jb250ZW50Lmxlbmd0aDtcblx0XHRpZihmbGVuIDwgMHgxMDAwKSBjb250aW51ZTtcblx0XHRmaWxlLnN0YXJ0ID0gVDtcblx0XHRjaGFpbml0KChmbGVuICsgMHgwMUZGKSA+PiA5KTtcblx0fVxuXHRjaGFpbml0KChMWzZdICsgNykgPj4gMyk7XG5cdHdoaWxlKG8ubCAmIDB4MUZGKSBvLndyaXRlX3NoaWZ0KC00LCBjb25zdHMuRU5ET0ZDSEFJTik7XG5cdFQgPSBpID0gMDtcblx0Zm9yKGogPSAwOyBqIDwgY2ZiLkZpbGVJbmRleC5sZW5ndGg7ICsraikge1xuXHRcdGZpbGUgPSBjZmIuRmlsZUluZGV4W2pdO1xuXHRcdGlmKCFmaWxlLmNvbnRlbnQpIGNvbnRpbnVlO1xuXHRcdC8qOjogaWYoZmlsZS5jb250ZW50ID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInVucmVhY2hhYmxlXCIpOyAqL1xuXHRcdGZsZW4gPSBmaWxlLmNvbnRlbnQubGVuZ3RoO1xuXHRcdGlmKCFmbGVuIHx8IGZsZW4gPj0gMHgxMDAwKSBjb250aW51ZTtcblx0XHRmaWxlLnN0YXJ0ID0gVDtcblx0XHRjaGFpbml0KChmbGVuICsgMHgzRikgPj4gNik7XG5cdH1cblx0d2hpbGUoby5sICYgMHgxRkYpIG8ud3JpdGVfc2hpZnQoLTQsIGNvbnN0cy5FTkRPRkNIQUlOKTtcblx0Zm9yKGkgPSAwOyBpIDwgTFs0XTw8MjsgKytpKSB7XG5cdFx0dmFyIG5tID0gY2ZiLkZ1bGxQYXRoc1tpXTtcblx0XHRpZighbm0gfHwgbm0ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRmb3IoaiA9IDA7IGogPCAxNzsgKytqKSBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdFx0Zm9yKGogPSAwOyBqIDwgMzsgKytqKSBvLndyaXRlX3NoaWZ0KDQsIC0xKTtcblx0XHRcdGZvcihqID0gMDsgaiA8IDEyOyArK2opIG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0ZmlsZSA9IGNmYi5GaWxlSW5kZXhbaV07XG5cdFx0aWYoaSA9PT0gMCkgZmlsZS5zdGFydCA9IGZpbGUuc2l6ZSA/IGZpbGUuc3RhcnQgLSAxIDogRU5ET0ZDSEFJTjtcblx0XHR2YXIgX25tLyo6c3RyaW5nKi8gPSAoaSA9PT0gMCAmJiBfb3B0cy5yb290KSB8fCBmaWxlLm5hbWU7XG5cdFx0ZmxlbiA9IDIqKF9ubS5sZW5ndGgrMSk7XG5cdFx0by53cml0ZV9zaGlmdCg2NCwgX25tLCBcInV0ZjE2bGVcIik7XG5cdFx0by53cml0ZV9zaGlmdCgyLCBmbGVuKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIGZpbGUudHlwZSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBmaWxlLmNvbG9yKTtcblx0XHRvLndyaXRlX3NoaWZ0KC00LCBmaWxlLkwpO1xuXHRcdG8ud3JpdGVfc2hpZnQoLTQsIGZpbGUuUik7XG5cdFx0by53cml0ZV9zaGlmdCgtNCwgZmlsZS5DKTtcblx0XHRpZighZmlsZS5jbHNpZCkgZm9yKGogPSAwOyBqIDwgNDsgKytqKSBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdGVsc2Ugby53cml0ZV9zaGlmdCgxNiwgZmlsZS5jbHNpZCwgXCJoZXhcIik7XG5cdFx0by53cml0ZV9zaGlmdCg0LCBmaWxlLnN0YXRlIHx8IDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgMCk7IG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCAwKTsgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIGZpbGUuc3RhcnQpO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgZmlsZS5zaXplKTsgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0fVxuXHRmb3IoaSA9IDE7IGkgPCBjZmIuRmlsZUluZGV4Lmxlbmd0aDsgKytpKSB7XG5cdFx0ZmlsZSA9IGNmYi5GaWxlSW5kZXhbaV07XG5cdFx0Lyo6OiBpZighZmlsZS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRpZihmaWxlLnNpemUgPj0gMHgxMDAwKSB7XG5cdFx0XHRvLmwgPSAoZmlsZS5zdGFydCsxKSA8PCA5O1xuXHRcdFx0aWYgKGhhc19idWYgJiYgQnVmZmVyLmlzQnVmZmVyKGZpbGUuY29udGVudCkpIHtcblx0XHRcdFx0ZmlsZS5jb250ZW50LmNvcHkobywgby5sLCAwLCBmaWxlLnNpemUpO1xuXHRcdFx0XHQvLyBvIGlzIGEgMC1maWxsZWQgQnVmZmVyIHNvIGp1c3Qgc2V0IG5leHQgb2Zmc2V0XG5cdFx0XHRcdG8ubCArPSAoZmlsZS5zaXplICsgNTExKSAmIC01MTI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IoaiA9IDA7IGogPCBmaWxlLnNpemU7ICsraikgby53cml0ZV9zaGlmdCgxLCBmaWxlLmNvbnRlbnRbal0pO1xuXHRcdFx0XHRmb3IoOyBqICYgMHgxRkY7ICsraikgby53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Zm9yKGkgPSAxOyBpIDwgY2ZiLkZpbGVJbmRleC5sZW5ndGg7ICsraSkge1xuXHRcdGZpbGUgPSBjZmIuRmlsZUluZGV4W2ldO1xuXHRcdC8qOjogaWYoIWZpbGUuY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7ICovXG5cdFx0aWYoZmlsZS5zaXplID4gMCAmJiBmaWxlLnNpemUgPCAweDEwMDApIHtcblx0XHRcdGlmIChoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihmaWxlLmNvbnRlbnQpKSB7XG5cdFx0XHRcdGZpbGUuY29udGVudC5jb3B5KG8sIG8ubCwgMCwgZmlsZS5zaXplKTtcblx0XHRcdFx0Ly8gbyBpcyBhIDAtZmlsbGVkIEJ1ZmZlciBzbyBqdXN0IHNldCBuZXh0IG9mZnNldFxuXHRcdFx0XHRvLmwgKz0gKGZpbGUuc2l6ZSArIDYzKSAmIC02NDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvcihqID0gMDsgaiA8IGZpbGUuc2l6ZTsgKytqKSBvLndyaXRlX3NoaWZ0KDEsIGZpbGUuY29udGVudFtqXSk7XG5cdFx0XHRcdGZvcig7IGogJiAweDNGOyArK2opIG8ud3JpdGVfc2hpZnQoMSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmIChoYXNfYnVmKSB7XG5cdFx0by5sID0gby5sZW5ndGg7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gV2hlbiB1c2luZyBCdWZmZXIsIGFscmVhZHkgMC1maWxsZWRcblx0XHR3aGlsZShvLmwgPCBvLmxlbmd0aCkgby53cml0ZV9zaGlmdCgxLCAwKTtcblx0fVxuXHRyZXR1cm4gbztcbn1cbi8qIFtNUy1DRkJdIDIuNi40IChVbmljb2RlIDMuMC4xIGNhc2UgY29udmVyc2lvbikgKi9cbmZ1bmN0aW9uIGZpbmQoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8sIHBhdGgvKjpzdHJpbmcqLykvKjo/Q0ZCRW50cnkqLyB7XG5cdHZhciBVQ0Z1bGxQYXRocy8qOkFycmF5PHN0cmluZz4qLyA9IGNmYi5GdWxsUGF0aHMubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgudG9VcHBlckNhc2UoKTsgfSk7XG5cdHZhciBVQ1BhdGhzLyo6QXJyYXk8c3RyaW5nPiovID0gVUNGdWxsUGF0aHMubWFwKGZ1bmN0aW9uKHgpIHsgdmFyIHkgPSB4LnNwbGl0KFwiL1wiKTsgcmV0dXJuIHlbeS5sZW5ndGggLSAoeC5zbGljZSgtMSkgPT0gXCIvXCIgPyAyIDogMSldOyB9KTtcblx0dmFyIGsvKjpib29sZWFuKi8gPSBmYWxzZTtcblx0aWYocGF0aC5jaGFyQ29kZUF0KDApID09PSA0NyAvKiBcIi9cIiAqLykgeyBrID0gdHJ1ZTsgcGF0aCA9IFVDRnVsbFBhdGhzWzBdLnNsaWNlKDAsIC0xKSArIHBhdGg7IH1cblx0ZWxzZSBrID0gcGF0aC5pbmRleE9mKFwiL1wiKSAhPT0gLTE7XG5cdHZhciBVQ1BhdGgvKjpzdHJpbmcqLyA9IHBhdGgudG9VcHBlckNhc2UoKTtcblx0dmFyIHcvKjpudW1iZXIqLyA9IGsgPT09IHRydWUgPyBVQ0Z1bGxQYXRocy5pbmRleE9mKFVDUGF0aCkgOiBVQ1BhdGhzLmluZGV4T2YoVUNQYXRoKTtcblx0aWYodyAhPT0gLTEpIHJldHVybiBjZmIuRmlsZUluZGV4W3ddO1xuXG5cdHZhciBtID0gIVVDUGF0aC5tYXRjaChjaHIxKTtcblx0VUNQYXRoID0gVUNQYXRoLnJlcGxhY2UoY2hyMCwnJyk7XG5cdGlmKG0pIFVDUGF0aCA9IFVDUGF0aC5yZXBsYWNlKGNocjEsJyEnKTtcblx0Zm9yKHcgPSAwOyB3IDwgVUNGdWxsUGF0aHMubGVuZ3RoOyArK3cpIHtcblx0XHRpZigobSA/IFVDRnVsbFBhdGhzW3ddLnJlcGxhY2UoY2hyMSwnIScpIDogVUNGdWxsUGF0aHNbd10pLnJlcGxhY2UoY2hyMCwnJykgPT0gVUNQYXRoKSByZXR1cm4gY2ZiLkZpbGVJbmRleFt3XTtcblx0XHRpZigobSA/IFVDUGF0aHNbd10ucmVwbGFjZShjaHIxLCchJykgOiBVQ1BhdGhzW3ddKS5yZXBsYWNlKGNocjAsJycpID09IFVDUGF0aCkgcmV0dXJuIGNmYi5GaWxlSW5kZXhbd107XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG4vKiogQ0ZCIENvbnN0YW50cyAqL1xudmFyIE1TU1ogPSA2NDsgLyogTWluaSBTZWN0b3IgU2l6ZSA9IDE8PDYgKi9cbi8vdmFyIE1TQ1NaID0gNDA5NjsgLyogTWluaSBTdHJlYW0gQ3V0b2ZmIFNpemUgKi9cbi8qIDIuMSBDb21wb3VuZCBGaWxlIFNlY3RvciBOdW1iZXJzIGFuZCBUeXBlcyAqL1xudmFyIEVORE9GQ0hBSU4gPSAtMjtcbi8qIDIuMiBDb21wb3VuZCBGaWxlIEhlYWRlciAqL1xudmFyIEhFQURFUl9TSUdOQVRVUkUgPSAnZDBjZjExZTBhMWIxMWFlMSc7XG52YXIgSEVBREVSX1NJRyA9IFsweEQwLCAweENGLCAweDExLCAweEUwLCAweEExLCAweEIxLCAweDFBLCAweEUxXTtcbnZhciBIRUFERVJfQ0xTSUQgPSAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xudmFyIGNvbnN0cyA9IHtcblx0LyogMi4xIENvbXB1bmQgRmlsZSBTZWN0b3IgTnVtYmVycyBhbmQgVHlwZXMgKi9cblx0TUFYUkVHU0VDVDogLTYsXG5cdERJRlNFQ1Q6IC00LFxuXHRGQVRTRUNUOiAtMyxcblx0RU5ET0ZDSEFJTjogRU5ET0ZDSEFJTixcblx0RlJFRVNFQ1Q6IC0xLFxuXHQvKiAyLjIgQ29tcG91bmQgRmlsZSBIZWFkZXIgKi9cblx0SEVBREVSX1NJR05BVFVSRTogSEVBREVSX1NJR05BVFVSRSxcblx0SEVBREVSX01JTk9SX1ZFUlNJT046ICczZTAwJyxcblx0TUFYUkVHU0lEOiAtNixcblx0Tk9TVFJFQU06IC0xLFxuXHRIRUFERVJfQ0xTSUQ6IEhFQURFUl9DTFNJRCxcblx0LyogMi42LjEgQ29tcG91bmQgRmlsZSBEaXJlY3RvcnkgRW50cnkgKi9cblx0RW50cnlUeXBlczogWyd1bmtub3duJywnc3RvcmFnZScsJ3N0cmVhbScsJ2xvY2tieXRlcycsJ3Byb3BlcnR5Jywncm9vdCddXG59O1xuXG5mdW5jdGlvbiB3cml0ZV9maWxlKGNmYi8qOkNGQkNvbnRhaW5lciovLCBmaWxlbmFtZS8qOnN0cmluZyovLCBvcHRpb25zLyo6Q0ZCV3JpdGVPcHRzKi8pLyo6dm9pZCovIHtcblx0Z2V0X2ZzKCk7XG5cdHZhciBvID0gX3dyaXRlKGNmYiwgb3B0aW9ucyk7XG5cdC8qOjogaWYodHlwZW9mIEJ1ZmZlciA9PSAndW5kZWZpbmVkJyB8fCAhQnVmZmVyLmlzQnVmZmVyKG8pIHx8ICEobyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHRocm93IG5ldyBFcnJvcihcInVucmVhY2hhYmxlXCIpOyAqL1xuXHRmcy53cml0ZUZpbGVTeW5jKGZpbGVuYW1lLCBvKTtcbn1cblxuZnVuY3Rpb24gYTJzKG8vKjpSYXdCeXRlcyovKS8qOnN0cmluZyovIHtcblx0dmFyIG91dCA9IG5ldyBBcnJheShvLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBvLmxlbmd0aDsgKytpKSBvdXRbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG9baV0pO1xuXHRyZXR1cm4gb3V0LmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlKGNmYi8qOkNGQkNvbnRhaW5lciovLCBvcHRpb25zLyo6Q0ZCV3JpdGVPcHRzKi8pLyo6UmF3Qnl0ZXN8c3RyaW5nKi8ge1xuXHR2YXIgbyA9IF93cml0ZShjZmIsIG9wdGlvbnMpO1xuXHRzd2l0Y2gob3B0aW9ucyAmJiBvcHRpb25zLnR5cGUgfHwgXCJidWZmZXJcIikge1xuXHRcdGNhc2UgXCJmaWxlXCI6IGdldF9mcygpOyBmcy53cml0ZUZpbGVTeW5jKG9wdGlvbnMuZmlsZW5hbWUsIChvLyo6YW55Ki8pKTsgcmV0dXJuIG87XG5cdFx0Y2FzZSBcImJpbmFyeVwiOiByZXR1cm4gdHlwZW9mIG8gPT0gXCJzdHJpbmdcIiA/IG8gOiBhMnMobyk7XG5cdFx0Y2FzZSBcImJhc2U2NFwiOiByZXR1cm4gQmFzZTY0X2VuY29kZSh0eXBlb2YgbyA9PSBcInN0cmluZ1wiID8gbyA6IGEycyhvKSk7XG5cdFx0Y2FzZSBcImJ1ZmZlclwiOiBpZihoYXNfYnVmKSByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG8pID8gbyA6IEJ1ZmZlcl9mcm9tKG8pO1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgXCJhcnJheVwiOiByZXR1cm4gdHlwZW9mIG8gPT0gXCJzdHJpbmdcIiA/IHMyYShvKSA6IG87XG5cdH1cblx0cmV0dXJuIG87XG59XG4vKiBub2RlIDwgOC4xIHpsaWIgZG9lcyBub3QgZXhwb3NlIGJ5dGVzUmVhZCwgc28gZGVmYXVsdCB0byBwdXJlIEpTICovXG52YXIgX3psaWI7XG5mdW5jdGlvbiB1c2VfemxpYih6bGliKSB7IHRyeSB7XG5cdHZhciBJbmZsYXRlUmF3ID0gemxpYi5JbmZsYXRlUmF3O1xuXHR2YXIgSW5mbFJhdyA9IG5ldyBJbmZsYXRlUmF3KCk7XG5cdEluZmxSYXcuX3Byb2Nlc3NDaHVuayhuZXcgVWludDhBcnJheShbMywgMF0pLCBJbmZsUmF3Ll9maW5pc2hGbHVzaEZsYWcpO1xuXHRpZihJbmZsUmF3LmJ5dGVzUmVhZCkgX3psaWIgPSB6bGliO1xuXHRlbHNlIHRocm93IG5ldyBFcnJvcihcInpsaWIgZG9lcyBub3QgZXhwb3NlIGJ5dGVzUmVhZFwiKTtcbn0gY2F0Y2goZSkge2NvbnNvbGUuZXJyb3IoXCJjYW5ub3QgdXNlIG5hdGl2ZSB6bGliOiBcIiArIChlLm1lc3NhZ2UgfHwgZSkpOyB9IH1cblxuZnVuY3Rpb24gX2luZmxhdGVSYXdTeW5jKHBheWxvYWQsIHVzeikge1xuXHRpZighX3psaWIpIHJldHVybiBfaW5mbGF0ZShwYXlsb2FkLCB1c3opO1xuXHR2YXIgSW5mbGF0ZVJhdyA9IF96bGliLkluZmxhdGVSYXc7XG5cdHZhciBJbmZsUmF3ID0gbmV3IEluZmxhdGVSYXcoKTtcblx0dmFyIG91dCA9IEluZmxSYXcuX3Byb2Nlc3NDaHVuayhwYXlsb2FkLnNsaWNlKHBheWxvYWQubCksIEluZmxSYXcuX2ZpbmlzaEZsdXNoRmxhZyk7XG5cdHBheWxvYWQubCArPSBJbmZsUmF3LmJ5dGVzUmVhZDtcblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gX2RlZmxhdGVSYXdTeW5jKHBheWxvYWQpIHtcblx0cmV0dXJuIF96bGliID8gX3psaWIuZGVmbGF0ZVJhd1N5bmMocGF5bG9hZCkgOiBfZGVmbGF0ZShwYXlsb2FkKTtcbn1cbnZhciBDTEVOX09SREVSID0gWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cbi8qICBMRU5fSUQgPSBbIDI1NywgMjU4LCAyNTksIDI2MCwgMjYxLCAyNjIsIDI2MywgMjY0LCAyNjUsIDI2NiwgMjY3LCAyNjgsIDI2OSwgMjcwLCAyNzEsIDI3MiwgMjczLCAyNzQsIDI3NSwgMjc2LCAyNzcsIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1IF07ICovXG52YXIgTEVOX0xOID0gWyAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTMgLCAxNSwgIDE3LCAgMTksICAyMywgIDI3LCAgMzEsICAzNSwgIDQzLCAgNTEsICA1OSwgIDY3LCAgODMsICA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCBdO1xuXG4vKiAgRFNUX0lEID0gWyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAgMjAsICAgMjEsICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjkgXTsgKi9cbnZhciBEU1RfTE4gPSBbICAxLCAgMiwgIDMsICA0LCAgNSwgIDcsICA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NyBdO1xuXG5mdW5jdGlvbiBiaXRfc3dhcF84KG4pIHsgdmFyIHQgPSAoKCgoKG48PDEpfChuPDwxMSkpICYgMHgyMjExMCkgfCAoKChuPDw1KXwobjw8MTUpKSAmIDB4ODg0NDApKSk7IHJldHVybiAoKHQ+PjE2KSB8ICh0Pj44KSB8dCkmMHhGRjsgfVxuXG52YXIgdXNlX3R5cGVkX2FycmF5cyA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJztcblxudmFyIGJpdHN3YXA4ID0gdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50OEFycmF5KDE8PDgpIDogW107XG5mb3IodmFyIHEgPSAwOyBxIDwgKDE8PDgpOyArK3EpIGJpdHN3YXA4W3FdID0gYml0X3N3YXBfOChxKTtcblxuZnVuY3Rpb24gYml0X3N3YXBfbihuLCBiKSB7XG5cdHZhciByZXYgPSBiaXRzd2FwOFtuICYgMHhGRl07XG5cdGlmKGIgPD0gOCkgcmV0dXJuIHJldiA+Pj4gKDgtYik7XG5cdHJldiA9IChyZXYgPDwgOCkgfCBiaXRzd2FwOFsobj4+OCkmMHhGRl07XG5cdGlmKGIgPD0gMTYpIHJldHVybiByZXYgPj4+ICgxNi1iKTtcblx0cmV2ID0gKHJldiA8PCA4KSB8IGJpdHN3YXA4WyhuPj4xNikmMHhGRl07XG5cdHJldHVybiByZXYgPj4+ICgyNC1iKTtcbn1cblxuLyogaGVscGVycyBmb3IgdW5hbGlnbmVkIGJpdCByZWFkcyAqL1xuZnVuY3Rpb24gcmVhZF9iaXRzXzIoYnVmLCBibCkgeyB2YXIgdyA9IChibCY3KSwgaCA9IChibD4+PjMpOyByZXR1cm4gKChidWZbaF18KHcgPD0gNiA/IDAgOiBidWZbaCsxXTw8OCkpPj4+dykmIDB4MDM7IH1cbmZ1bmN0aW9uIHJlYWRfYml0c18zKGJ1ZiwgYmwpIHsgdmFyIHcgPSAoYmwmNyksIGggPSAoYmw+Pj4zKTsgcmV0dXJuICgoYnVmW2hdfCh3IDw9IDUgPyAwIDogYnVmW2grMV08PDgpKT4+PncpJiAweDA3OyB9XG5mdW5jdGlvbiByZWFkX2JpdHNfNChidWYsIGJsKSB7IHZhciB3ID0gKGJsJjcpLCBoID0gKGJsPj4+Myk7IHJldHVybiAoKGJ1ZltoXXwodyA8PSA0ID8gMCA6IGJ1ZltoKzFdPDw4KSk+Pj53KSYgMHgwRjsgfVxuZnVuY3Rpb24gcmVhZF9iaXRzXzUoYnVmLCBibCkgeyB2YXIgdyA9IChibCY3KSwgaCA9IChibD4+PjMpOyByZXR1cm4gKChidWZbaF18KHcgPD0gMyA/IDAgOiBidWZbaCsxXTw8OCkpPj4+dykmIDB4MUY7IH1cbmZ1bmN0aW9uIHJlYWRfYml0c183KGJ1ZiwgYmwpIHsgdmFyIHcgPSAoYmwmNyksIGggPSAoYmw+Pj4zKTsgcmV0dXJuICgoYnVmW2hdfCh3IDw9IDEgPyAwIDogYnVmW2grMV08PDgpKT4+PncpJiAweDdGOyB9XG5cbi8qIHdvcmtzIHVwIHRvIG4gPSAzICogOCArIDEgPSAyNSAqL1xuZnVuY3Rpb24gcmVhZF9iaXRzX24oYnVmLCBibCwgbikge1xuXHR2YXIgdyA9IChibCY3KSwgaCA9IChibD4+PjMpLCBmID0gKCgxPDxuKS0xKTtcblx0dmFyIHYgPSBidWZbaF0gPj4+IHc7XG5cdGlmKG4gPCA4IC0gdykgcmV0dXJuIHYgJiBmO1xuXHR2IHw9IGJ1ZltoKzFdPDwoOC13KTtcblx0aWYobiA8IDE2IC0gdykgcmV0dXJuIHYgJiBmO1xuXHR2IHw9IGJ1ZltoKzJdPDwoMTYtdyk7XG5cdGlmKG4gPCAyNCAtIHcpIHJldHVybiB2ICYgZjtcblx0diB8PSBidWZbaCszXTw8KDI0LXcpO1xuXHRyZXR1cm4gdiAmIGY7XG59XG5cbi8qIGhlbHBlcnMgZm9yIHVuYWxpZ25lZCBiaXQgd3JpdGVzICovXG5mdW5jdGlvbiB3cml0ZV9iaXRzXzMoYnVmLCBibCwgdikgeyB2YXIgdyA9IGJsICYgNywgaCA9IGJsID4+PiAzO1xuXHRpZih3IDw9IDUpIGJ1ZltoXSB8PSAodiAmIDcpIDw8IHc7XG5cdGVsc2Uge1xuXHRcdGJ1ZltoXSB8PSAodiA8PCB3KSAmIDB4RkY7XG5cdFx0YnVmW2grMV0gPSAodiY3KSA+PiAoOC13KTtcblx0fVxuXHRyZXR1cm4gYmwgKyAzO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9iaXRzXzEoYnVmLCBibCwgdikge1xuXHR2YXIgdyA9IGJsICYgNywgaCA9IGJsID4+PiAzO1xuXHR2ID0gKHYmMSkgPDwgdztcblx0YnVmW2hdIHw9IHY7XG5cdHJldHVybiBibCArIDE7XG59XG5mdW5jdGlvbiB3cml0ZV9iaXRzXzgoYnVmLCBibCwgdikge1xuXHR2YXIgdyA9IGJsICYgNywgaCA9IGJsID4+PiAzO1xuXHR2IDw8PSB3O1xuXHRidWZbaF0gfD0gIHYgJiAweEZGOyB2ID4+Pj0gODtcblx0YnVmW2grMV0gPSB2O1xuXHRyZXR1cm4gYmwgKyA4O1xufVxuZnVuY3Rpb24gd3JpdGVfYml0c18xNihidWYsIGJsLCB2KSB7XG5cdHZhciB3ID0gYmwgJiA3LCBoID0gYmwgPj4+IDM7XG5cdHYgPDw9IHc7XG5cdGJ1ZltoXSB8PSAgdiAmIDB4RkY7IHYgPj4+PSA4O1xuXHRidWZbaCsxXSA9IHYgJiAweEZGO1xuXHRidWZbaCsyXSA9IHYgPj4+IDg7XG5cdHJldHVybiBibCArIDE2O1xufVxuXG4vKiB1bnRpbCBBcnJheUJ1ZmZlciNyZWFsbG9jIGlzIGEgdGhpbmcsIGZha2UgYSByZWFsbG9jICovXG5mdW5jdGlvbiByZWFsbG9jKGIsIHN6Lyo6bnVtYmVyKi8pIHtcblx0dmFyIEwgPSBiLmxlbmd0aCwgTSA9IDIqTCA+IHN6ID8gMipMIDogc3ogKyA1LCBpID0gMDtcblx0aWYoTCA+PSBzeikgcmV0dXJuIGI7XG5cdGlmKGhhc19idWYpIHtcblx0XHR2YXIgbyA9IG5ld191bnNhZmVfYnVmKE0pO1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0aWYoYi5jb3B5KSBiLmNvcHkobyk7XG5cdFx0ZWxzZSBmb3IoOyBpIDwgYi5sZW5ndGg7ICsraSkgb1tpXSA9IGJbaV07XG5cdFx0cmV0dXJuIG87XG5cdH0gZWxzZSBpZih1c2VfdHlwZWRfYXJyYXlzKSB7XG5cdFx0dmFyIGEgPSBuZXcgVWludDhBcnJheShNKTtcblx0XHRpZihhLnNldCkgYS5zZXQoYik7XG5cdFx0ZWxzZSBmb3IoOyBpIDwgTDsgKytpKSBhW2ldID0gYltpXTtcblx0XHRyZXR1cm4gYTtcblx0fVxuXHRiLmxlbmd0aCA9IE07XG5cdHJldHVybiBiO1xufVxuXG4vKiB6ZXJvLWZpbGxlZCBhcnJheXMgZm9yIG9sZGVyIGJyb3dzZXJzICovXG5mdW5jdGlvbiB6ZXJvX2ZpbGxfYXJyYXkobikge1xuXHR2YXIgbyA9IG5ldyBBcnJheShuKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkgb1tpXSA9IDA7XG5cdHJldHVybiBvO1xufVxuXG4vKiBidWlsZCB0cmVlICh1c2VkIGZvciBsaXRlcmFscyBhbmQgbGVuZ3RocykgKi9cbmZ1bmN0aW9uIGJ1aWxkX3RyZWUoY2xlbnMsIGNtYXAsIE1BWC8qOm51bWJlciovKS8qOm51bWJlciovIHtcblx0dmFyIG1heGxlbiA9IDEsIHcgPSAwLCBpID0gMCwgaiA9IDAsIGNjb2RlID0gMCwgTCA9IGNsZW5zLmxlbmd0aDtcblxuXHR2YXIgYmxfY291bnQgID0gdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50MTZBcnJheSgzMikgOiB6ZXJvX2ZpbGxfYXJyYXkoMzIpO1xuXHRmb3IoaSA9IDA7IGkgPCAzMjsgKytpKSBibF9jb3VudFtpXSA9IDA7XG5cblx0Zm9yKGkgPSBMOyBpIDwgTUFYOyArK2kpIGNsZW5zW2ldID0gMDtcblx0TCA9IGNsZW5zLmxlbmd0aDtcblxuXHR2YXIgY3RyZWUgPSB1c2VfdHlwZWRfYXJyYXlzID8gbmV3IFVpbnQxNkFycmF5KEwpIDogemVyb19maWxsX2FycmF5KEwpOyAvLyBbXVxuXG5cdC8qIGJ1aWxkIGNvZGUgdHJlZSAqL1xuXHRmb3IoaSA9IDA7IGkgPCBMOyArK2kpIHtcblx0XHRibF9jb3VudFsodyA9IGNsZW5zW2ldKV0rKztcblx0XHRpZihtYXhsZW4gPCB3KSBtYXhsZW4gPSB3O1xuXHRcdGN0cmVlW2ldID0gMDtcblx0fVxuXHRibF9jb3VudFswXSA9IDA7XG5cdGZvcihpID0gMTsgaSA8PSBtYXhsZW47ICsraSkgYmxfY291bnRbaSsxNl0gPSAoY2NvZGUgPSAoY2NvZGUgKyBibF9jb3VudFtpLTFdKTw8MSk7XG5cdGZvcihpID0gMDsgaSA8IEw7ICsraSkge1xuXHRcdGNjb2RlID0gY2xlbnNbaV07XG5cdFx0aWYoY2NvZGUgIT0gMCkgY3RyZWVbaV0gPSBibF9jb3VudFtjY29kZSsxNl0rKztcblx0fVxuXG5cdC8qIGNtYXBbbWF4bGVuICsgNCBiaXRzXSA9IChvZmYmMTUpICsgKGxpdDw8NCkgcmV2ZXJzZSBtYXBwaW5nICovXG5cdHZhciBjbGVuaSA9IDA7XG5cdGZvcihpID0gMDsgaSA8IEw7ICsraSkge1xuXHRcdGNsZW5pID0gY2xlbnNbaV07XG5cdFx0aWYoY2xlbmkgIT0gMCkge1xuXHRcdFx0Y2NvZGUgPSBiaXRfc3dhcF9uKGN0cmVlW2ldLCBtYXhsZW4pPj4obWF4bGVuLWNsZW5pKTtcblx0XHRcdGZvcihqID0gKDE8PChtYXhsZW4gKyA0IC0gY2xlbmkpKSAtIDE7IGo+PTA7IC0tailcblx0XHRcdFx0Y21hcFtjY29kZXwoajw8Y2xlbmkpXSA9IChjbGVuaSYxNSkgfCAoaTw8NCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXhsZW47XG59XG5cbi8qIEZpeGVkIEh1ZmZtYW4gKi9cbnZhciBmaXhfbG1hcCA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDE2QXJyYXkoNTEyKSA6IHplcm9fZmlsbF9hcnJheSg1MTIpO1xudmFyIGZpeF9kbWFwID0gdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50MTZBcnJheSgzMikgIDogemVyb19maWxsX2FycmF5KDMyKTtcbmlmKCF1c2VfdHlwZWRfYXJyYXlzKSB7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCA1MTI7ICsraSkgZml4X2xtYXBbaV0gPSAwO1xuXHRmb3IoaSA9IDA7IGkgPCAzMjsgKytpKSBmaXhfZG1hcFtpXSA9IDA7XG59XG4oZnVuY3Rpb24oKSB7XG5cdHZhciBkbGVucy8qOkFycmF5PG51bWJlcj4qLyA9IFtdO1xuXHR2YXIgaSA9IDA7XG5cdGZvcig7aTwzMjsgaSsrKSBkbGVucy5wdXNoKDUpO1xuXHRidWlsZF90cmVlKGRsZW5zLCBmaXhfZG1hcCwgMzIpO1xuXG5cdHZhciBjbGVucy8qOkFycmF5PG51bWJlcj4qLyA9IFtdO1xuXHRpID0gMDtcblx0Zm9yKDsgaTw9MTQzOyBpKyspIGNsZW5zLnB1c2goOCk7XG5cdGZvcig7IGk8PTI1NTsgaSsrKSBjbGVucy5wdXNoKDkpO1xuXHRmb3IoOyBpPD0yNzk7IGkrKykgY2xlbnMucHVzaCg3KTtcblx0Zm9yKDsgaTw9Mjg3OyBpKyspIGNsZW5zLnB1c2goOCk7XG5cdGJ1aWxkX3RyZWUoY2xlbnMsIGZpeF9sbWFwLCAyODgpO1xufSkoKTt2YXIgX2RlZmxhdGVSYXcgPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uIF9kZWZsYXRlUmF3SUlGRSgpIHtcblx0dmFyIERTVF9MTl9SRSA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDhBcnJheSgweDgwMDApIDogW107XG5cdHZhciBqID0gMCwgayA9IDA7XG5cdGZvcig7IGogPCBEU1RfTE4ubGVuZ3RoIC0gMTsgKytqKSB7XG5cdFx0Zm9yKDsgayA8IERTVF9MTltqKzFdOyArK2spIERTVF9MTl9SRVtrXSA9IGo7XG5cdH1cblx0Zm9yKDtrIDwgMzI3Njg7ICsraykgRFNUX0xOX1JFW2tdID0gMjk7XG5cblx0dmFyIExFTl9MTl9SRSA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDhBcnJheSgweDEwMykgOiBbXTtcblx0Zm9yKGogPSAwLCBrID0gMDsgaiA8IExFTl9MTi5sZW5ndGggLSAxOyArK2opIHtcblx0XHRmb3IoOyBrIDwgTEVOX0xOW2orMV07ICsraykgTEVOX0xOX1JFW2tdID0gajtcblx0fVxuXG5cdGZ1bmN0aW9uIHdyaXRlX3N0b3JlZChkYXRhLCBvdXQpIHtcblx0XHR2YXIgYm9mZiA9IDA7XG5cdFx0d2hpbGUoYm9mZiA8IGRhdGEubGVuZ3RoKSB7XG5cdFx0XHR2YXIgTCA9IE1hdGgubWluKDB4RkZGRiwgZGF0YS5sZW5ndGggLSBib2ZmKTtcblx0XHRcdHZhciBoID0gYm9mZiArIEwgPT0gZGF0YS5sZW5ndGg7XG5cdFx0XHRvdXQud3JpdGVfc2hpZnQoMSwgK2gpO1xuXHRcdFx0b3V0LndyaXRlX3NoaWZ0KDIsIEwpO1xuXHRcdFx0b3V0LndyaXRlX3NoaWZ0KDIsICh+TCkgJiAweEZGRkYpO1xuXHRcdFx0d2hpbGUoTC0tID4gMCkgb3V0W291dC5sKytdID0gZGF0YVtib2ZmKytdO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0Lmw7XG5cdH1cblxuXHQvKiBGaXhlZCBIdWZmbWFuICovXG5cdGZ1bmN0aW9uIHdyaXRlX2h1ZmZfZml4ZWQoZGF0YSwgb3V0KSB7XG5cdFx0dmFyIGJsID0gMDtcblx0XHR2YXIgYm9mZiA9IDA7XG5cdFx0dmFyIGFkZHJzID0gdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50MTZBcnJheSgweDgwMDApIDogW107XG5cdFx0d2hpbGUoYm9mZiA8IGRhdGEubGVuZ3RoKSB7XG5cdFx0XHR2YXIgTCA9IC8qIGRhdGEubGVuZ3RoIC0gYm9mZjsgKi8gTWF0aC5taW4oMHhGRkZGLCBkYXRhLmxlbmd0aCAtIGJvZmYpO1xuXG5cdFx0XHQvKiB3cml0ZSBhIHN0b3JlZCBibG9jayBmb3Igc2hvcnQgZGF0YSAqL1xuXHRcdFx0aWYoTCA8IDEwKSB7XG5cdFx0XHRcdGJsID0gd3JpdGVfYml0c18zKG91dCwgYmwsICshIShib2ZmICsgTCA9PSBkYXRhLmxlbmd0aCkpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0aWYoYmwgJiA3KSBibCArPSA4IC0gKGJsICYgNyk7XG5cdFx0XHRcdG91dC5sID0gKGJsIC8gOCkgfCAwO1xuXHRcdFx0XHRvdXQud3JpdGVfc2hpZnQoMiwgTCk7XG5cdFx0XHRcdG91dC53cml0ZV9zaGlmdCgyLCAofkwpICYgMHhGRkZGKTtcblx0XHRcdFx0d2hpbGUoTC0tID4gMCkgb3V0W291dC5sKytdID0gZGF0YVtib2ZmKytdO1xuXHRcdFx0XHRibCA9IG91dC5sICogODtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGJsID0gd3JpdGVfYml0c18zKG91dCwgYmwsICshIShib2ZmICsgTCA9PSBkYXRhLmxlbmd0aCkgKyAyKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHR2YXIgaGFzaCA9IDA7XG5cdFx0XHR3aGlsZShMLS0gPiAwKSB7XG5cdFx0XHRcdHZhciBkID0gZGF0YVtib2ZmXTtcblx0XHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSBeIGQpICYgMHg3RkZGO1xuXG5cdFx0XHRcdHZhciBtYXRjaCA9IC0xLCBtbGVuID0gMDtcblxuXHRcdFx0XHRpZigobWF0Y2ggPSBhZGRyc1toYXNoXSkpIHtcblx0XHRcdFx0XHRtYXRjaCB8PSBib2ZmICYgfjB4N0ZGRjtcblx0XHRcdFx0XHRpZihtYXRjaCA+IGJvZmYpIG1hdGNoIC09IDB4ODAwMDtcblx0XHRcdFx0XHRpZihtYXRjaCA8IGJvZmYpIHdoaWxlKGRhdGFbbWF0Y2ggKyBtbGVuXSA9PSBkYXRhW2JvZmYgKyBtbGVuXSAmJiBtbGVuIDwgMjUwKSArK21sZW47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihtbGVuID4gMikge1xuXHRcdFx0XHRcdC8qIENvcHkgVG9rZW4gICovXG5cdFx0XHRcdFx0ZCA9IExFTl9MTl9SRVttbGVuXTtcblx0XHRcdFx0XHRpZihkIDw9IDIyKSBibCA9IHdyaXRlX2JpdHNfOChvdXQsIGJsLCBiaXRzd2FwOFtkKzFdPj4xKSAtIDE7XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHR3cml0ZV9iaXRzXzgob3V0LCBibCwgMyk7XG5cdFx0XHRcdFx0XHRibCArPSA1O1xuXHRcdFx0XHRcdFx0d3JpdGVfYml0c184KG91dCwgYmwsIGJpdHN3YXA4W2QtMjNdPj41KTtcblx0XHRcdFx0XHRcdGJsICs9IDM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhciBsZW5fZWIgPSAoZCA8IDgpID8gMCA6ICgoZCAtIDQpPj4yKTtcblx0XHRcdFx0XHRpZihsZW5fZWIgPiAwKSB7XG5cdFx0XHRcdFx0XHR3cml0ZV9iaXRzXzE2KG91dCwgYmwsIG1sZW4gLSBMRU5fTE5bZF0pO1xuXHRcdFx0XHRcdFx0YmwgKz0gbGVuX2ViO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGQgPSBEU1RfTE5fUkVbYm9mZiAtIG1hdGNoXTtcblx0XHRcdFx0XHRibCA9IHdyaXRlX2JpdHNfOChvdXQsIGJsLCBiaXRzd2FwOFtkXT4+Myk7XG5cdFx0XHRcdFx0YmwgLT0gMztcblxuXHRcdFx0XHRcdHZhciBkc3RfZWIgPSBkIDwgNCA/IDAgOiAoZC0yKT4+MTtcblx0XHRcdFx0XHRpZihkc3RfZWIgPiAwKSB7XG5cdFx0XHRcdFx0XHR3cml0ZV9iaXRzXzE2KG91dCwgYmwsIGJvZmYgLSBtYXRjaCAtIERTVF9MTltkXSk7XG5cdFx0XHRcdFx0XHRibCArPSBkc3RfZWI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZvcih2YXIgcSA9IDA7IHEgPCBtbGVuOyArK3EpIHtcblx0XHRcdFx0XHRcdGFkZHJzW2hhc2hdID0gYm9mZiAmIDB4N0ZGRjtcblx0XHRcdFx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgXiBkYXRhW2JvZmZdKSAmIDB4N0ZGRjtcblx0XHRcdFx0XHRcdCsrYm9mZjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TC09IG1sZW4gLSAxO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qIExpdGVyYWwgVG9rZW4gKi9cblx0XHRcdFx0XHRpZihkIDw9IDE0MykgZCA9IGQgKyA0ODtcblx0XHRcdFx0XHRlbHNlIGJsID0gd3JpdGVfYml0c18xKG91dCwgYmwsIDEpO1xuXHRcdFx0XHRcdGJsID0gd3JpdGVfYml0c184KG91dCwgYmwsIGJpdHN3YXA4W2RdKTtcblx0XHRcdFx0XHRhZGRyc1toYXNoXSA9IGJvZmYgJiAweDdGRkY7XG5cdFx0XHRcdFx0Kytib2ZmO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGJsID0gd3JpdGVfYml0c184KG91dCwgYmwsIDApIC0gMTtcblx0XHR9XG5cdFx0b3V0LmwgPSAoKGJsICsgNykvOCl8MDtcblx0XHRyZXR1cm4gb3V0Lmw7XG5cdH1cblx0cmV0dXJuIGZ1bmN0aW9uIF9kZWZsYXRlUmF3KGRhdGEsIG91dCkge1xuXHRcdGlmKGRhdGEubGVuZ3RoIDwgOCkgcmV0dXJuIHdyaXRlX3N0b3JlZChkYXRhLCBvdXQpO1xuXHRcdHJldHVybiB3cml0ZV9odWZmX2ZpeGVkKGRhdGEsIG91dCk7XG5cdH07XG59KSgpO1xuXG5mdW5jdGlvbiBfZGVmbGF0ZShkYXRhKSB7XG5cdHZhciBidWYgPSBuZXdfYnVmKDUwK01hdGguZmxvb3IoZGF0YS5sZW5ndGgqMS4xKSk7XG5cdHZhciBvZmYgPSBfZGVmbGF0ZVJhdyhkYXRhLCBidWYpO1xuXHRyZXR1cm4gYnVmLnNsaWNlKDAsIG9mZik7XG59XG4vKiBtb2RpZmllZCBpbmZsYXRlIGZ1bmN0aW9uIGFsc28gbW92ZXMgb3JpZ2luYWwgcmVhZCBoZWFkICovXG5cbnZhciBkeW5fbG1hcCA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDE2QXJyYXkoMzI3NjgpIDogemVyb19maWxsX2FycmF5KDMyNzY4KTtcbnZhciBkeW5fZG1hcCA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDE2QXJyYXkoMzI3NjgpIDogemVyb19maWxsX2FycmF5KDMyNzY4KTtcbnZhciBkeW5fY21hcCA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDE2QXJyYXkoMTI4KSAgIDogemVyb19maWxsX2FycmF5KDEyOCk7XG52YXIgZHluX2xlbl8xID0gMSwgZHluX2xlbl8yID0gMTtcblxuLyogNS41LjMgRXhwYW5kaW5nIEh1ZmZtYW4gQ29kZXMgKi9cbmZ1bmN0aW9uIGR5bihkYXRhLCBib2ZmLyo6bnVtYmVyKi8pIHtcblx0Lyogbm9tZW5jbGF0dXJlIGZyb20gUkZDMTk1MSByZWZlcnMgdG8gYml0IHZhbHVlczsgdGhlc2UgYXJlIG9mZnNldCBieSB0aGUgaW1wbGljaXQgY29uc3RhbnQgKi9cblx0dmFyIF9ITElUID0gcmVhZF9iaXRzXzUoZGF0YSwgYm9mZikgKyAyNTc7IGJvZmYgKz0gNTtcblx0dmFyIF9IRElTVCA9IHJlYWRfYml0c181KGRhdGEsIGJvZmYpICsgMTsgYm9mZiArPSA1O1xuXHR2YXIgX0hDTEVOID0gcmVhZF9iaXRzXzQoZGF0YSwgYm9mZikgKyA0OyBib2ZmICs9IDQ7XG5cdHZhciB3ID0gMDtcblxuXHQvKiBncmFiIGFuZCBzdG9yZSBjb2RlIGxlbmd0aHMgKi9cblx0dmFyIGNsZW5zID0gdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50OEFycmF5KDE5KSA6IHplcm9fZmlsbF9hcnJheSgxOSk7XG5cdHZhciBjdHJlZSA9IFsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCBdO1xuXHR2YXIgbWF4bGVuID0gMTtcblx0dmFyIGJsX2NvdW50ID0gIHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDhBcnJheSg4KSA6IHplcm9fZmlsbF9hcnJheSg4KTtcblx0dmFyIG5leHRfY29kZSA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDhBcnJheSg4KSA6IHplcm9fZmlsbF9hcnJheSg4KTtcblx0dmFyIEwgPSBjbGVucy5sZW5ndGg7IC8qIDE5ICovXG5cdGZvcih2YXIgaSA9IDA7IGkgPCBfSENMRU47ICsraSkge1xuXHRcdGNsZW5zW0NMRU5fT1JERVJbaV1dID0gdyA9IHJlYWRfYml0c18zKGRhdGEsIGJvZmYpO1xuXHRcdGlmKG1heGxlbiA8IHcpIG1heGxlbiA9IHc7XG5cdFx0YmxfY291bnRbd10rKztcblx0XHRib2ZmICs9IDM7XG5cdH1cblxuXHQvKiBidWlsZCBjb2RlIHRyZWUgKi9cblx0dmFyIGNjb2RlID0gMDtcblx0YmxfY291bnRbMF0gPSAwO1xuXHRmb3IoaSA9IDE7IGkgPD0gbWF4bGVuOyArK2kpIG5leHRfY29kZVtpXSA9IGNjb2RlID0gKGNjb2RlICsgYmxfY291bnRbaS0xXSk8PDE7XG5cdGZvcihpID0gMDsgaSA8IEw7ICsraSkgaWYoKGNjb2RlID0gY2xlbnNbaV0pICE9IDApIGN0cmVlW2ldID0gbmV4dF9jb2RlW2Njb2RlXSsrO1xuXHQvKiBjbWFwWzcgYml0cyBmcm9tIHN0cmVhbV0gPSAob2ZmJjcpICsgKGxpdDw8MykgKi9cblx0dmFyIGNsZW5pID0gMDtcblx0Zm9yKGkgPSAwOyBpIDwgTDsgKytpKSB7XG5cdFx0Y2xlbmkgPSBjbGVuc1tpXTtcblx0XHRpZihjbGVuaSAhPSAwKSB7XG5cdFx0XHRjY29kZSA9IGJpdHN3YXA4W2N0cmVlW2ldXT4+KDgtY2xlbmkpO1xuXHRcdFx0Zm9yKHZhciBqID0gKDE8PCg3LWNsZW5pKSktMTsgaj49MDsgLS1qKSBkeW5fY21hcFtjY29kZXwoajw8Y2xlbmkpXSA9IChjbGVuaSY3KSB8IChpPDwzKTtcblx0XHR9XG5cdH1cblxuXHQvKiByZWFkIGxpdGVyYWwgYW5kIGRpc3QgY29kZXMgYXQgb25jZSAqL1xuXHR2YXIgaGNvZGVzLyo6QXJyYXk8bnVtYmVyPiovID0gW107XG5cdG1heGxlbiA9IDE7XG5cdGZvcig7IGhjb2Rlcy5sZW5ndGggPCBfSExJVCArIF9IRElTVDspIHtcblx0XHRjY29kZSA9IGR5bl9jbWFwW3JlYWRfYml0c183KGRhdGEsIGJvZmYpXTtcblx0XHRib2ZmICs9IGNjb2RlICYgNztcblx0XHRzd2l0Y2goKGNjb2RlID4+Pj0gMykpIHtcblx0XHRcdGNhc2UgMTY6XG5cdFx0XHRcdHcgPSAzICsgcmVhZF9iaXRzXzIoZGF0YSwgYm9mZik7IGJvZmYgKz0gMjtcblx0XHRcdFx0Y2NvZGUgPSBoY29kZXNbaGNvZGVzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHR3aGlsZSh3LS0gPiAwKSBoY29kZXMucHVzaChjY29kZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAxNzpcblx0XHRcdFx0dyA9IDMgKyByZWFkX2JpdHNfMyhkYXRhLCBib2ZmKTsgYm9mZiArPSAzO1xuXHRcdFx0XHR3aGlsZSh3LS0gPiAwKSBoY29kZXMucHVzaCgwKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDE4OlxuXHRcdFx0XHR3ID0gMTEgKyByZWFkX2JpdHNfNyhkYXRhLCBib2ZmKTsgYm9mZiArPSA3O1xuXHRcdFx0XHR3aGlsZSh3IC0tID4gMCkgaGNvZGVzLnB1c2goMCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aGNvZGVzLnB1c2goY2NvZGUpO1xuXHRcdFx0XHRpZihtYXhsZW4gPCBjY29kZSkgbWF4bGVuID0gY2NvZGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8qIGJ1aWxkIGxpdGVyYWwgLyBsZW5ndGggdHJlZXMgKi9cblx0dmFyIGgxID0gaGNvZGVzLnNsaWNlKDAsIF9ITElUKSwgaDIgPSBoY29kZXMuc2xpY2UoX0hMSVQpO1xuXHRmb3IoaSA9IF9ITElUOyBpIDwgMjg2OyArK2kpIGgxW2ldID0gMDtcblx0Zm9yKGkgPSBfSERJU1Q7IGkgPCAzMDsgKytpKSBoMltpXSA9IDA7XG5cdGR5bl9sZW5fMSA9IGJ1aWxkX3RyZWUoaDEsIGR5bl9sbWFwLCAyODYpO1xuXHRkeW5fbGVuXzIgPSBidWlsZF90cmVlKGgyLCBkeW5fZG1hcCwgMzApO1xuXHRyZXR1cm4gYm9mZjtcbn1cblxuLyogcmV0dXJuIFsgZGF0YSwgYnl0ZXNSZWFkIF0gKi9cbmZ1bmN0aW9uIGluZmxhdGUoZGF0YSwgdXN6Lyo6bnVtYmVyKi8pIHtcblx0Lyogc2hvcnRjaXJjdWl0IGZvciBlbXB0eSBidWZmZXIgWzB4MDMsIDB4MDBdICovXG5cdGlmKGRhdGFbMF0gPT0gMyAmJiAhKGRhdGFbMV0gJiAweDMpKSB7IHJldHVybiBbbmV3X3Jhd19idWYodXN6KSwgMl07IH1cblxuXHQvKiBiaXQgb2Zmc2V0ICovXG5cdHZhciBib2ZmID0gMDtcblxuXHQvKiBoZWFkZXIgaW5jbHVkZXMgZmluYWwgYml0IGFuZCB0eXBlIGJpdHMgKi9cblx0dmFyIGhlYWRlciA9IDA7XG5cblx0dmFyIG91dGJ1ZiA9IG5ld191bnNhZmVfYnVmKHVzeiA/IHVzeiA6ICgxPDwxOCkpO1xuXHR2YXIgd29mZiA9IDA7XG5cdHZhciBPTCA9IG91dGJ1Zi5sZW5ndGg+Pj4wO1xuXHR2YXIgbWF4X2xlbl8xID0gMCwgbWF4X2xlbl8yID0gMDtcblxuXHR3aGlsZSgoaGVhZGVyJjEpID09IDApIHtcblx0XHRoZWFkZXIgPSByZWFkX2JpdHNfMyhkYXRhLCBib2ZmKTsgYm9mZiArPSAzO1xuXHRcdGlmKChoZWFkZXIgPj4+IDEpID09IDApIHtcblx0XHRcdC8qIFN0b3JlZCBibG9jayAqL1xuXHRcdFx0aWYoYm9mZiAmIDcpIGJvZmYgKz0gOCAtIChib2ZmJjcpO1xuXHRcdFx0LyogMiBieXRlcyBzeiwgMiBieXRlcyBiaXQgaW52ZXJzZSAqL1xuXHRcdFx0dmFyIHN6ID0gZGF0YVtib2ZmPj4+M10gfCBkYXRhWyhib2ZmPj4+MykrMV08PDg7XG5cdFx0XHRib2ZmICs9IDMyO1xuXHRcdFx0LyogcHVzaCBzeiBieXRlcyAqL1xuXHRcdFx0aWYoc3ogPiAwKSB7XG5cdFx0XHRcdGlmKCF1c3ogJiYgT0wgPCB3b2ZmICsgc3opIHsgb3V0YnVmID0gcmVhbGxvYyhvdXRidWYsIHdvZmYgKyBzeik7IE9MID0gb3V0YnVmLmxlbmd0aDsgfVxuXHRcdFx0XHR3aGlsZShzei0tID4gMCkgeyBvdXRidWZbd29mZisrXSA9IGRhdGFbYm9mZj4+PjNdOyBib2ZmICs9IDg7IH1cblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH0gZWxzZSBpZigoaGVhZGVyID4+IDEpID09IDEpIHtcblx0XHRcdC8qIEZpeGVkIEh1ZmZtYW4gKi9cblx0XHRcdG1heF9sZW5fMSA9IDk7IG1heF9sZW5fMiA9IDU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIER5bmFtaWMgSHVmZm1hbiAqL1xuXHRcdFx0Ym9mZiA9IGR5bihkYXRhLCBib2ZmKTtcblx0XHRcdG1heF9sZW5fMSA9IGR5bl9sZW5fMTsgbWF4X2xlbl8yID0gZHluX2xlbl8yO1xuXHRcdH1cblx0XHRmb3IoOzspIHsgLy8gd2hpbGUodHJ1ZSkgaXMgYXBwYXJlbnRseSBvdXQgb2Ygdm9ndWUgaW4gbW9kZXJuIEpTIGNpcmNsZXNcblx0XHRcdGlmKCF1c3ogJiYgKE9MIDwgd29mZiArIDMyNzY3KSkgeyBvdXRidWYgPSByZWFsbG9jKG91dGJ1Ziwgd29mZiArIDMyNzY3KTsgT0wgPSBvdXRidWYubGVuZ3RoOyB9XG5cdFx0XHQvKiBpbmdlc3QgY29kZSBhbmQgbW92ZSByZWFkIGhlYWQgKi9cblx0XHRcdHZhciBiaXRzID0gcmVhZF9iaXRzX24oZGF0YSwgYm9mZiwgbWF4X2xlbl8xKTtcblx0XHRcdHZhciBjb2RlID0gKGhlYWRlcj4+PjEpID09IDEgPyBmaXhfbG1hcFtiaXRzXSA6IGR5bl9sbWFwW2JpdHNdO1xuXHRcdFx0Ym9mZiArPSBjb2RlICYgMTU7IGNvZGUgPj4+PSA0O1xuXHRcdFx0LyogMC0yNTUgYXJlIGxpdGVyYWxzLCAyNTYgaXMgZW5kIG9mIGJsb2NrIHRva2VuLCAyNTcrIGFyZSBjb3B5IHRva2VucyAqL1xuXHRcdFx0aWYoKChjb2RlPj4+OCkmMHhGRikgPT09IDApIG91dGJ1Zlt3b2ZmKytdID0gY29kZTtcblx0XHRcdGVsc2UgaWYoY29kZSA9PSAyNTYpIGJyZWFrO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGNvZGUgLT0gMjU3O1xuXHRcdFx0XHR2YXIgbGVuX2ViID0gKGNvZGUgPCA4KSA/IDAgOiAoKGNvZGUtNCk+PjIpOyBpZihsZW5fZWIgPiA1KSBsZW5fZWIgPSAwO1xuXHRcdFx0XHR2YXIgdGd0ID0gd29mZiArIExFTl9MTltjb2RlXTtcblx0XHRcdFx0LyogbGVuZ3RoIGV4dHJhIGJpdHMgKi9cblx0XHRcdFx0aWYobGVuX2ViID4gMCkge1xuXHRcdFx0XHRcdHRndCArPSByZWFkX2JpdHNfbihkYXRhLCBib2ZmLCBsZW5fZWIpO1xuXHRcdFx0XHRcdGJvZmYgKz0gbGVuX2ViO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyogZGlzdCBjb2RlICovXG5cdFx0XHRcdGJpdHMgPSByZWFkX2JpdHNfbihkYXRhLCBib2ZmLCBtYXhfbGVuXzIpO1xuXHRcdFx0XHRjb2RlID0gKGhlYWRlcj4+PjEpID09IDEgPyBmaXhfZG1hcFtiaXRzXSA6IGR5bl9kbWFwW2JpdHNdO1xuXHRcdFx0XHRib2ZmICs9IGNvZGUgJiAxNTsgY29kZSA+Pj49IDQ7XG5cdFx0XHRcdHZhciBkc3RfZWIgPSAoY29kZSA8IDQgPyAwIDogKGNvZGUtMik+PjEpO1xuXHRcdFx0XHR2YXIgZHN0ID0gRFNUX0xOW2NvZGVdO1xuXHRcdFx0XHQvKiBkaXN0IGV4dHJhIGJpdHMgKi9cblx0XHRcdFx0aWYoZHN0X2ViID4gMCkge1xuXHRcdFx0XHRcdGRzdCArPSByZWFkX2JpdHNfbihkYXRhLCBib2ZmLCBkc3RfZWIpO1xuXHRcdFx0XHRcdGJvZmYgKz0gZHN0X2ViO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyogaW4gdGhlIGNvbW1vbiBjYXNlLCBtYW51YWwgYnl0ZSBjb3B5IGlzIGZhc3RlciB0aGFuIFRBIHNldCAvIEJ1ZmZlciBjb3B5ICovXG5cdFx0XHRcdGlmKCF1c3ogJiYgT0wgPCB0Z3QpIHsgb3V0YnVmID0gcmVhbGxvYyhvdXRidWYsIHRndCArIDEwMCk7IE9MID0gb3V0YnVmLmxlbmd0aDsgfVxuXHRcdFx0XHR3aGlsZSh3b2ZmIDwgdGd0KSB7IG91dGJ1Zlt3b2ZmXSA9IG91dGJ1Zlt3b2ZmIC0gZHN0XTsgKyt3b2ZmOyB9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmKHVzeikgcmV0dXJuIFtvdXRidWYsIChib2ZmKzcpPj4+M107XG5cdHJldHVybiBbb3V0YnVmLnNsaWNlKDAsIHdvZmYpLCAoYm9mZis3KT4+PjNdO1xufVxuXG5mdW5jdGlvbiBfaW5mbGF0ZShwYXlsb2FkLCB1c3opIHtcblx0dmFyIGRhdGEgPSBwYXlsb2FkLnNsaWNlKHBheWxvYWQubHx8MCk7XG5cdHZhciBvdXQgPSBpbmZsYXRlKGRhdGEsIHVzeik7XG5cdHBheWxvYWQubCArPSBvdXRbMV07XG5cdHJldHVybiBvdXRbMF07XG59XG5cbmZ1bmN0aW9uIHdhcm5fb3JfdGhyb3cod3JuLCBtc2cpIHtcblx0aWYod3JuKSB7IGlmKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgY29uc29sZS5lcnJvcihtc2cpOyB9XG5cdGVsc2UgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3ppcChmaWxlLyo6UmF3Qnl0ZXMqLywgb3B0aW9ucy8qOkNGQlJlYWRPcHRzKi8pLyo6Q0ZCQ29udGFpbmVyKi8ge1xuXHR2YXIgYmxvYi8qOkNGQmxvYiovID0gLyo6OigqL2ZpbGUvKjo6IDphbnkpKi87XG5cdHByZXBfYmxvYihibG9iLCAwKTtcblxuXHR2YXIgRmlsZUluZGV4Lyo6Q0ZCRmlsZUluZGV4Ki8gPSBbXSwgRnVsbFBhdGhzLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdHZhciBvID0ge1xuXHRcdEZpbGVJbmRleDogRmlsZUluZGV4LFxuXHRcdEZ1bGxQYXRoczogRnVsbFBhdGhzXG5cdH07XG5cdGluaXRfY2ZiKG8sIHsgcm9vdDogb3B0aW9ucy5yb290IH0pO1xuXG5cdC8qIGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5LCBzdGFydCBqdXN0IGFmdGVyIHNpZ25hdHVyZSAqL1xuXHR2YXIgaSA9IGJsb2IubGVuZ3RoIC0gNDtcblx0d2hpbGUoKGJsb2JbaV0gIT0gMHg1MCB8fCBibG9iW2krMV0gIT0gMHg0YiB8fCBibG9iW2krMl0gIT0gMHgwNSB8fCBibG9iW2krM10gIT0gMHgwNikgJiYgaSA+PSAwKSAtLWk7XG5cdGJsb2IubCA9IGkgKyA0O1xuXG5cdC8qIHBhcnNlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqL1xuXHRibG9iLmwgKz0gNDtcblx0dmFyIGZjbnQgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSA2O1xuXHR2YXIgc3RhcnRfY2QgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cblx0LyogcGFyc2UgY2VudHJhbCBkaXJlY3RvcnkgKi9cblx0YmxvYi5sID0gc3RhcnRfY2Q7XG5cblx0Zm9yKGkgPSAwOyBpIDwgZmNudDsgKytpKSB7XG5cdFx0LyogdHJ1c3QgbG9jYWwgZmlsZSBoZWFkZXIgaW5zdGVhZCBvZiBDRCBlbnRyeSAqL1xuXHRcdGJsb2IubCArPSAyMDtcblx0XHR2YXIgY3N6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdHZhciB1c3ogPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0dmFyIG5hbWVsZW4gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0dmFyIGVmc3ogPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0dmFyIGZjc3ogPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0YmxvYi5sICs9IDg7XG5cdFx0dmFyIG9mZnNldCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHR2YXIgRUYgPSBwYXJzZV9leHRyYV9maWVsZCgvKjo6KCovYmxvYi5zbGljZShibG9iLmwrbmFtZWxlbiwgYmxvYi5sK25hbWVsZW4rZWZzeikvKjo6IDphbnkpKi8pO1xuXHRcdGJsb2IubCArPSBuYW1lbGVuICsgZWZzeiArIGZjc3o7XG5cblx0XHR2YXIgTCA9IGJsb2IubDtcblx0XHRibG9iLmwgPSBvZmZzZXQgKyA0O1xuXHRcdHBhcnNlX2xvY2FsX2ZpbGUoYmxvYiwgY3N6LCB1c3osIG8sIEVGKTtcblx0XHRibG9iLmwgPSBMO1xuXHR9XG5cdHJldHVybiBvO1xufVxuXG5cbi8qIGhlYWQgc3RhcnRzIGp1c3QgYWZ0ZXIgbG9jYWwgZmlsZSBoZWFkZXIgc2lnbmF0dXJlICovXG5mdW5jdGlvbiBwYXJzZV9sb2NhbF9maWxlKGJsb2IvKjpDRkJsb2IqLywgY3N6Lyo6bnVtYmVyKi8sIHVzei8qOm51bWJlciovLCBvLyo6Q0ZCQ29udGFpbmVyKi8sIEVGKSB7XG5cdC8qIFtsb2NhbCBmaWxlIGhlYWRlcl0gKi9cblx0YmxvYi5sICs9IDI7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIG1ldGggPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBkYXRlID0gcGFyc2VfZG9zX2RhdGUoYmxvYik7XG5cblx0aWYoZmxhZ3MgJiAweDIwNDEpIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIFpJUCBlbmNyeXB0aW9uXCIpO1xuXHR2YXIgY3JjMzIgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBfY3N6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgX3VzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblxuXHR2YXIgbmFtZWxlbiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGVmc3ogPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cblx0Ly8gVE9ETzogZmxhZ3MgJiAoMTw8MTEpIC8vIFVURjhcblx0dmFyIG5hbWUgPSBcIlwiOyBmb3IodmFyIGkgPSAwOyBpIDwgbmFtZWxlbjsgKytpKSBuYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYmxvYltibG9iLmwrK10pO1xuXHRpZihlZnN6KSB7XG5cdFx0dmFyIGVmID0gcGFyc2VfZXh0cmFfZmllbGQoLyo6OigqL2Jsb2Iuc2xpY2UoYmxvYi5sLCBibG9iLmwgKyBlZnN6KS8qOjogOmFueSkqLyk7XG5cdFx0aWYoKGVmWzB4NTQ1NV18fHt9KS5tdCkgZGF0ZSA9IGVmWzB4NTQ1NV0ubXQ7XG5cdFx0aWYoKChFRnx8e30pWzB4NTQ1NV18fHt9KS5tdCkgZGF0ZSA9IEVGWzB4NTQ1NV0ubXQ7XG5cdH1cblx0YmxvYi5sICs9IGVmc3o7XG5cblx0LyogW2VuY3J5cHRpb24gaGVhZGVyXSAqL1xuXG5cdC8qIFtmaWxlIGRhdGFdICovXG5cdHZhciBkYXRhID0gYmxvYi5zbGljZShibG9iLmwsIGJsb2IubCArIF9jc3opO1xuXHRzd2l0Y2gobWV0aCkge1xuXHRcdGNhc2UgODogZGF0YSA9IF9pbmZsYXRlUmF3U3luYyhibG9iLCBfdXN6KTsgYnJlYWs7XG5cdFx0Y2FzZSAwOiBicmVhazsgLy8gVE9ETzogc2NhbiBmb3IgbWFnaWMgbnVtYmVyXG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgWklQIENvbXByZXNzaW9uIG1ldGhvZCBcIiArIG1ldGgpO1xuXHR9XG5cblx0LyogW2RhdGEgZGVzY3JpcHRvcl0gKi9cblx0dmFyIHdybiA9IGZhbHNlO1xuXHRpZihmbGFncyAmIDgpIHtcblx0XHRjcmMzMiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHRpZihjcmMzMiA9PSAweDA4MDc0YjUwKSB7IGNyYzMyID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyB3cm4gPSB0cnVlOyB9XG5cdFx0X2NzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHRfdXN6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR9XG5cblx0aWYoX2NzeiAhPSBjc3opIHdhcm5fb3JfdGhyb3cod3JuLCBcIkJhZCBjb21wcmVzc2VkIHNpemU6IFwiICsgY3N6ICsgXCIgIT0gXCIgKyBfY3N6KTtcblx0aWYoX3VzeiAhPSB1c3opIHdhcm5fb3JfdGhyb3cod3JuLCBcIkJhZCB1bmNvbXByZXNzZWQgc2l6ZTogXCIgKyB1c3ogKyBcIiAhPSBcIiArIF91c3opO1xuXHQvL3ZhciBfY3JjMzIgPSBDUkMzMi5idWYoZGF0YSwgMCk7XG5cdC8vaWYoKGNyYzMyPj4wKSAhPSAoX2NyYzMyPj4wKSkgd2Fybl9vcl90aHJvdyh3cm4sIFwiQmFkIENSQzMyIGNoZWNrc3VtOiBcIiArIGNyYzMyICsgXCIgIT0gXCIgKyBfY3JjMzIpO1xuXHRjZmJfYWRkKG8sIG5hbWUsIGRhdGEsIHt1bnNhZmU6IHRydWUsIG10OiBkYXRlfSk7XG59XG5mdW5jdGlvbiB3cml0ZV96aXAoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8sIG9wdGlvbnMvKjpDRkJXcml0ZU9wdHMqLykvKjpSYXdCeXRlcyovIHtcblx0dmFyIF9vcHRzID0gb3B0aW9ucyB8fCB7fTtcblx0dmFyIG91dCA9IFtdLCBjZGlycyA9IFtdO1xuXHR2YXIgby8qOkNGQmxvYiovID0gbmV3X2J1ZigxKTtcblx0dmFyIG1ldGhvZCA9IChfb3B0cy5jb21wcmVzc2lvbiA/IDggOiAwKSwgZmxhZ3MgPSAwO1xuXHR2YXIgZGVzYyA9IGZhbHNlO1xuXHRpZihkZXNjKSBmbGFncyB8PSA4O1xuXHR2YXIgaSA9IDAsIGogPSAwO1xuXG5cdHZhciBzdGFydF9jZCA9IDAsIGZjbnQgPSAwO1xuXHR2YXIgcm9vdCA9IGNmYi5GdWxsUGF0aHNbMF0sIGZwID0gcm9vdCwgZmkgPSBjZmIuRmlsZUluZGV4WzBdO1xuXHR2YXIgY3JjcyA9IFtdO1xuXHR2YXIgc3pfY2QgPSAwO1xuXG5cdGZvcihpID0gMTsgaSA8IGNmYi5GdWxsUGF0aHMubGVuZ3RoOyArK2kpIHtcblx0XHRmcCA9IGNmYi5GdWxsUGF0aHNbaV0uc2xpY2Uocm9vdC5sZW5ndGgpOyBmaSA9IGNmYi5GaWxlSW5kZXhbaV07XG5cdFx0aWYoIWZpLnNpemUgfHwgIWZpLmNvbnRlbnQgfHwgZnAgPT0gXCJcXHUwMDAxU2gzM3RKNVwiKSBjb250aW51ZTtcblx0XHR2YXIgc3RhcnQgPSBzdGFydF9jZDtcblxuXHRcdC8qIFRPRE86IENQNDM3IGZpbGVuYW1lICovXG5cdFx0dmFyIG5hbWVidWYgPSBuZXdfYnVmKGZwLmxlbmd0aCk7XG5cdFx0Zm9yKGogPSAwOyBqIDwgZnAubGVuZ3RoOyArK2opIG5hbWVidWYud3JpdGVfc2hpZnQoMSwgZnAuY2hhckNvZGVBdChqKSAmIDB4N0YpO1xuXHRcdG5hbWVidWYgPSBuYW1lYnVmLnNsaWNlKDAsIG5hbWVidWYubCk7XG5cdFx0Y3Jjc1tmY250XSA9IENSQzMyLmJ1ZigvKjo6KCgqL2ZpLmNvbnRlbnQvKjo6fHxbXSk6YW55KSovLCAwKTtcblxuXHRcdHZhciBvdXRidWYgPSBmaS5jb250ZW50Lyo6Onx8W10qLztcblx0XHRpZihtZXRob2QgPT0gOCkgb3V0YnVmID0gX2RlZmxhdGVSYXdTeW5jKG91dGJ1Zik7XG5cblx0XHQvKiBsb2NhbCBmaWxlIGhlYWRlciAqL1xuXHRcdG8gPSBuZXdfYnVmKDMwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDB4MDQwMzRiNTApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMjApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgZmxhZ3MpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgbWV0aG9kKTtcblx0XHQvKiBUT0RPOiBsYXN0IG1vZCBmaWxlIHRpbWUvZGF0ZSAqL1xuXHRcdGlmKGZpLm10KSB3cml0ZV9kb3NfZGF0ZShvLCBmaS5tdCk7XG5cdFx0ZWxzZSBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoLTQsIChmbGFncyAmIDgpID8gMCA6IGNyY3NbZmNudF0pO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgIChmbGFncyAmIDgpID8gMCA6IG91dGJ1Zi5sZW5ndGgpO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgIChmbGFncyAmIDgpID8gMCA6IC8qOjooKi9maS5jb250ZW50Lyo6Onx8W10pKi8ubGVuZ3RoKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIG5hbWVidWYubGVuZ3RoKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXG5cdFx0c3RhcnRfY2QgKz0gby5sZW5ndGg7XG5cdFx0b3V0LnB1c2gobyk7XG5cdFx0c3RhcnRfY2QgKz0gbmFtZWJ1Zi5sZW5ndGg7XG5cdFx0b3V0LnB1c2gobmFtZWJ1Zik7XG5cblx0XHQvKiBUT0RPOiBleHRyYSBmaWVsZHM/ICovXG5cblx0XHQvKiBUT0RPOiBlbmNyeXB0aW9uIGhlYWRlciA/ICovXG5cblx0XHRzdGFydF9jZCArPSBvdXRidWYubGVuZ3RoO1xuXHRcdG91dC5wdXNoKG91dGJ1Zik7XG5cblx0XHQvKiBkYXRhIGRlc2NyaXB0b3IgKi9cblx0XHRpZihmbGFncyAmIDgpIHtcblx0XHRcdG8gPSBuZXdfYnVmKDEyKTtcblx0XHRcdG8ud3JpdGVfc2hpZnQoLTQsIGNyY3NbZmNudF0pO1xuXHRcdFx0by53cml0ZV9zaGlmdCg0LCBvdXRidWYubGVuZ3RoKTtcblx0XHRcdG8ud3JpdGVfc2hpZnQoNCwgLyo6OigqL2ZpLmNvbnRlbnQvKjo6fHxbXSkqLy5sZW5ndGgpO1xuXHRcdFx0c3RhcnRfY2QgKz0gby5sO1xuXHRcdFx0b3V0LnB1c2gobyk7XG5cdFx0fVxuXG5cdFx0LyogY2VudHJhbCBkaXJlY3RvcnkgKi9cblx0XHRvID0gbmV3X2J1Zig0Nik7XG5cdFx0by53cml0ZV9zaGlmdCg0LCAweDAyMDE0YjUwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMjApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgZmxhZ3MpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgbWV0aG9kKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvKiBUT0RPOiBsYXN0IG1vZCBmaWxlIHRpbWUvZGF0ZSAqL1xuXHRcdG8ud3JpdGVfc2hpZnQoLTQsIGNyY3NbZmNudF0pO1xuXG5cdFx0by53cml0ZV9zaGlmdCg0LCBvdXRidWYubGVuZ3RoKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIC8qOjooKi9maS5jb250ZW50Lyo6Onx8W10pKi8ubGVuZ3RoKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIG5hbWVidWYubGVuZ3RoKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCBzdGFydCk7XG5cblx0XHRzel9jZCArPSBvLmw7XG5cdFx0Y2RpcnMucHVzaChvKTtcblx0XHRzel9jZCArPSBuYW1lYnVmLmxlbmd0aDtcblx0XHRjZGlycy5wdXNoKG5hbWVidWYpO1xuXHRcdCsrZmNudDtcblx0fVxuXG5cdC8qIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqL1xuXHRvID0gbmV3X2J1ZigyMik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMHgwNjA1NGI1MCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZmNudCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZmNudCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgc3pfY2QpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIHN0YXJ0X2NkKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblxuXHRyZXR1cm4gYmNvbmNhdCgoW2Jjb25jYXQoKG91dC8qOmFueSovKSksIGJjb25jYXQoY2RpcnMpLCBvXS8qOmFueSovKSk7XG59XG52YXIgQ29udGVudFR5cGVNYXAgPSAoe1xuXHRcImh0bVwiOiBcInRleHQvaHRtbFwiLFxuXHRcInhtbFwiOiBcInRleHQveG1sXCIsXG5cblx0XCJnaWZcIjogXCJpbWFnZS9naWZcIixcblx0XCJqcGdcIjogXCJpbWFnZS9qcGVnXCIsXG5cdFwicG5nXCI6IFwiaW1hZ2UvcG5nXCIsXG5cblx0XCJtc29cIjogXCJhcHBsaWNhdGlvbi94LW1zb1wiLFxuXHRcInRobXhcIjogXCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNldGhlbWVcIixcblx0XCJzaDMzdGo1XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbn0vKjphbnkqLyk7XG5cbmZ1bmN0aW9uIGdldF9jb250ZW50X3R5cGUoZmkvKjpDRkJFbnRyeSovLCBmcC8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0aWYoZmkuY3R5cGUpIHJldHVybiBmaS5jdHlwZTtcblxuXHR2YXIgZXh0ID0gZmkubmFtZSB8fCBcIlwiLCBtID0gZXh0Lm1hdGNoKC9cXC4oW15cXC5dKykkLyk7XG5cdGlmKG0gJiYgQ29udGVudFR5cGVNYXBbbVsxXV0pIHJldHVybiBDb250ZW50VHlwZU1hcFttWzFdXTtcblxuXHRpZihmcCkge1xuXHRcdG0gPSAoZXh0ID0gZnApLm1hdGNoKC9bXFwuXFxcXF0oW15cXC5cXFxcXSkrJC8pO1xuXHRcdGlmKG0gJiYgQ29udGVudFR5cGVNYXBbbVsxXV0pIHJldHVybiBDb250ZW50VHlwZU1hcFttWzFdXTtcblx0fVxuXG5cdHJldHVybiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xufVxuXG4vKiA3NiBjaGFyYWN0ZXIgY2h1bmtzIFRPRE86IGludGVydHdpbmUgZW5jb2RpbmcgKi9cbmZ1bmN0aW9uIHdyaXRlX2Jhc2U2NF83Nihic3RyLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgZGF0YSA9IEJhc2U2NF9lbmNvZGUoYnN0cik7XG5cdHZhciBvID0gW107XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSs9IDc2KSBvLnB1c2goZGF0YS5zbGljZShpLCBpKzc2KSk7XG5cdHJldHVybiBvLmpvaW4oXCJcXHJcXG5cIikgKyBcIlxcclxcblwiO1xufVxuXG4vKlxuUnVsZXMgZm9yIFFQOlxuXHQtIGVzY2FwZSA9IyMgYXBwbGllcyBmb3IgYWxsIG5vbi1kaXNwbGF5IGNoYXJhY3RlcnMgYW5kIGxpdGVyYWwgXCI9XCJcblx0LSBzcGFjZSBvciB0YWIgYXQgZW5kIG9mIGxpbmUgbXVzdCBiZSBlbmNvZGVkXG5cdC0gXFxyXFxuIG5ld2xpbmVzIGNhbiBiZSBwcmVzZXJ2ZWQsIGJ1dCBiYXJlIFxcciBhbmQgXFxuIG11c3QgYmUgZXNjYXBlZFxuXHQtIGxpbmVzIG11c3Qgbm90IGV4Y2VlZCA3NiBjaGFyYWN0ZXJzLCB1c2Ugc29mdCBicmVha3MgPVxcclxcblxuXG5UT0RPOiBTb21lIGZpbGVzIGZyb20gd29yZCBhcHBlYXIgdG8gd3JpdGUgbGluZSBleHRlbnNpb25zIHdpdGggYmFyZSBlcXVhbHM6XG5cbmBgYFxuPHRhYmxlIGNsYXNzPTNETXNvVGFibGVHcmlkIGJvcmRlcj0zRDEgY2VsbHNwYWNpbmc9M0QwIGNlbGxwYWRkaW5nPTNEMCB3aWR0aD1cbj1cIjcwJVwiXG5gYGBcbiovXG5mdW5jdGlvbiB3cml0ZV9xdW90ZWRfcHJpbnRhYmxlKHRleHQvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBlbmNvZGVkID0gdGV4dC5yZXBsYWNlKC9bXFx4MDAtXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUZcXHg3RS1cXHhGRj1dL2csIGZ1bmN0aW9uKGMpIHtcblx0XHR2YXIgdyA9IGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0XHRyZXR1cm4gXCI9XCIgKyAody5sZW5ndGggPT0gMSA/IFwiMFwiICsgdyA6IHcpO1xuXHR9KTtcblxuXHRlbmNvZGVkID0gZW5jb2RlZC5yZXBsYWNlKC8gJC9tZywgXCI9MjBcIikucmVwbGFjZSgvXFx0JC9tZywgXCI9MDlcIik7XG5cblx0aWYoZW5jb2RlZC5jaGFyQXQoMCkgPT0gXCJcXG5cIikgZW5jb2RlZCA9IFwiPTBEXCIgKyBlbmNvZGVkLnNsaWNlKDEpO1xuXHRlbmNvZGVkID0gZW5jb2RlZC5yZXBsYWNlKC9cXHIoPyFcXG4pL21nLCBcIj0wRFwiKS5yZXBsYWNlKC9cXG5cXG4vbWcsIFwiXFxuPTBBXCIpLnJlcGxhY2UoLyhbXlxcclxcbl0pXFxuL21nLCBcIiQxPTBBXCIpO1xuXG5cdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW10sIHNwbGl0ID0gZW5jb2RlZC5zcGxpdChcIlxcclxcblwiKTtcblx0Zm9yKHZhciBzaSA9IDA7IHNpIDwgc3BsaXQubGVuZ3RoOyArK3NpKSB7XG5cdFx0dmFyIHN0ciA9IHNwbGl0W3NpXTtcblx0XHRpZihzdHIubGVuZ3RoID09IDApIHsgby5wdXNoKFwiXCIpOyBjb250aW51ZTsgfVxuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOykge1xuXHRcdFx0dmFyIGVuZCA9IDc2O1xuXHRcdFx0dmFyIHRtcCA9IHN0ci5zbGljZShpLCBpICsgZW5kKTtcblx0XHRcdGlmKHRtcC5jaGFyQXQoZW5kIC0gMSkgPT0gXCI9XCIpIGVuZCAtLTtcblx0XHRcdGVsc2UgaWYodG1wLmNoYXJBdChlbmQgLSAyKSA9PSBcIj1cIikgZW5kIC09IDI7XG5cdFx0XHRlbHNlIGlmKHRtcC5jaGFyQXQoZW5kIC0gMykgPT0gXCI9XCIpIGVuZCAtPSAzO1xuXHRcdFx0dG1wID0gc3RyLnNsaWNlKGksIGkgKyBlbmQpO1xuXHRcdFx0aSArPSBlbmQ7XG5cdFx0XHRpZihpIDwgc3RyLmxlbmd0aCkgdG1wICs9IFwiPVwiO1xuXHRcdFx0by5wdXNoKHRtcCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG8uam9pbihcIlxcclxcblwiKTtcbn1cbmZ1bmN0aW9uIHBhcnNlX3F1b3RlZF9wcmludGFibGUoZGF0YS8qOkFycmF5PHN0cmluZz4qLykvKjpSYXdCeXRlcyovIHtcblx0dmFyIG8gPSBbXTtcblxuXHQvKiB1bmlmeSBsb25nIGxpbmVzICovXG5cdGZvcih2YXIgZGkgPSAwOyBkaSA8IGRhdGEubGVuZ3RoOyArK2RpKSB7XG5cdFx0dmFyIGxpbmUgPSBkYXRhW2RpXTtcblx0XHR3aGlsZShkaSA8PSBkYXRhLmxlbmd0aCAmJiBsaW5lLmNoYXJBdChsaW5lLmxlbmd0aCAtIDEpID09IFwiPVwiKSBsaW5lID0gbGluZS5zbGljZSgwLCBsaW5lLmxlbmd0aCAtIDEpICsgZGF0YVsrK2RpXTtcblx0XHRvLnB1c2gobGluZSk7XG5cdH1cblxuXHQvKiBkZWNvZGUgKi9cblx0Zm9yKHZhciBvaSA9IDA7IG9pIDwgby5sZW5ndGg7ICsrb2kpIG9bb2ldID0gb1tvaV0ucmVwbGFjZSgvWz1dWzAtOUEtRmEtZl17Mn0vZywgZnVuY3Rpb24oJCQpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoJCQuc2xpY2UoMSksIDE2KSk7IH0pO1xuXHRyZXR1cm4gczJhKG8uam9pbihcIlxcclxcblwiKSk7XG59XG5cblxuZnVuY3Rpb24gcGFyc2VfbWltZShjZmIvKjpDRkJDb250YWluZXIqLywgZGF0YS8qOkFycmF5PHN0cmluZz4qLywgcm9vdC8qOnN0cmluZyovKS8qOnZvaWQqLyB7XG5cdHZhciBmbmFtZSA9IFwiXCIsIGN0ZSA9IFwiXCIsIGN0eXBlID0gXCJcIiwgZmRhdGE7XG5cdHZhciBkaSA9IDA7XG5cdGZvcig7ZGkgPCAxMDsgKytkaSkge1xuXHRcdHZhciBsaW5lID0gZGF0YVtkaV07XG5cdFx0aWYoIWxpbmUgfHwgbGluZS5tYXRjaCgvXlxccyokLykpIGJyZWFrO1xuXHRcdHZhciBtID0gbGluZS5tYXRjaCgvXiguKj8pOlxccyooW15cXHNdLiopJC8pO1xuXHRcdGlmKG0pIHN3aXRjaChtWzFdLnRvTG93ZXJDYXNlKCkpIHtcblx0XHRcdGNhc2UgXCJjb250ZW50LWxvY2F0aW9uXCI6IGZuYW1lID0gbVsyXS50cmltKCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcImNvbnRlbnQtdHlwZVwiOiBjdHlwZSA9IG1bMl0udHJpbSgpOyBicmVhaztcblx0XHRcdGNhc2UgXCJjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nXCI6IGN0ZSA9IG1bMl0udHJpbSgpOyBicmVhaztcblx0XHR9XG5cdH1cblx0KytkaTtcblx0c3dpdGNoKGN0ZS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0Y2FzZSAnYmFzZTY0JzogZmRhdGEgPSBzMmEoQmFzZTY0X2RlY29kZShkYXRhLnNsaWNlKGRpKS5qb2luKFwiXCIpKSk7IGJyZWFrO1xuXHRcdGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOiBmZGF0YSA9IHBhcnNlX3F1b3RlZF9wcmludGFibGUoZGF0YS5zbGljZShkaSkpOyBicmVhaztcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIFwiICsgY3RlKTtcblx0fVxuXHR2YXIgZmlsZSA9IGNmYl9hZGQoY2ZiLCBmbmFtZS5zbGljZShyb290Lmxlbmd0aCksIGZkYXRhLCB7dW5zYWZlOiB0cnVlfSk7XG5cdGlmKGN0eXBlKSBmaWxlLmN0eXBlID0gY3R5cGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX21hZChmaWxlLyo6UmF3Qnl0ZXMqLywgb3B0aW9ucy8qOkNGQlJlYWRPcHRzKi8pLyo6Q0ZCQ29udGFpbmVyKi8ge1xuXHRpZihhMnMoZmlsZS5zbGljZSgwLDEzKSkudG9Mb3dlckNhc2UoKSAhPSBcIm1pbWUtdmVyc2lvbjpcIikgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgTUFEIGhlYWRlclwiKTtcblx0dmFyIHJvb3QgPSAob3B0aW9ucyAmJiBvcHRpb25zLnJvb3QgfHwgXCJcIik7XG5cdC8vICRGbG93SWdub3JlXG5cdHZhciBkYXRhID0gKGhhc19idWYgJiYgQnVmZmVyLmlzQnVmZmVyKGZpbGUpID8gZmlsZS50b1N0cmluZyhcImJpbmFyeVwiKSA6IGEycyhmaWxlKSkuc3BsaXQoXCJcXHJcXG5cIik7XG5cdHZhciBkaSA9IDAsIHJvdyA9IFwiXCI7XG5cblx0LyogaWYgcm9vdCBpcyBub3Qgc3BlY2lmaWVkLCBzY2FuIGZvciB0aGUgY29tbW9uIHByZWZpeCAqL1xuXHRmb3IoZGkgPSAwOyBkaSA8IGRhdGEubGVuZ3RoOyArK2RpKSB7XG5cdFx0cm93ID0gZGF0YVtkaV07XG5cdFx0aWYoIS9eQ29udGVudC1Mb2NhdGlvbjovaS50ZXN0KHJvdykpIGNvbnRpbnVlO1xuXHRcdHJvdyA9IHJvdy5zbGljZShyb3cuaW5kZXhPZihcImZpbGVcIikpO1xuXHRcdGlmKCFyb290KSByb290ID0gcm93LnNsaWNlKDAsIHJvdy5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHRpZihyb3cuc2xpY2UoMCwgcm9vdC5sZW5ndGgpID09IHJvb3QpIGNvbnRpbnVlO1xuXHRcdHdoaWxlKHJvb3QubGVuZ3RoID4gMCkge1xuXHRcdFx0cm9vdCA9IHJvb3Quc2xpY2UoMCwgcm9vdC5sZW5ndGggLSAxKTtcblx0XHRcdHJvb3QgPSByb290LnNsaWNlKDAsIHJvb3QubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRpZihyb3cuc2xpY2UoMCxyb290Lmxlbmd0aCkgPT0gcm9vdCkgYnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0dmFyIG1ib3VuZGFyeSA9IChkYXRhWzFdIHx8IFwiXCIpLm1hdGNoKC9ib3VuZGFyeT1cIiguKj8pXCIvKTtcblx0aWYoIW1ib3VuZGFyeSkgdGhyb3cgbmV3IEVycm9yKFwiTUFEIGNhbm5vdCBmaW5kIGJvdW5kYXJ5XCIpO1xuXHR2YXIgYm91bmRhcnkgPSBcIi0tXCIgKyAobWJvdW5kYXJ5WzFdIHx8IFwiXCIpO1xuXG5cdHZhciBGaWxlSW5kZXgvKjpDRkJGaWxlSW5kZXgqLyA9IFtdLCBGdWxsUGF0aHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIG8gPSB7XG5cdFx0RmlsZUluZGV4OiBGaWxlSW5kZXgsXG5cdFx0RnVsbFBhdGhzOiBGdWxsUGF0aHNcblx0fTtcblx0aW5pdF9jZmIobyk7XG5cdHZhciBzdGFydF9kaSwgZmNudCA9IDA7XG5cdGZvcihkaSA9IDA7IGRpIDwgZGF0YS5sZW5ndGg7ICsrZGkpIHtcblx0XHR2YXIgbGluZSA9IGRhdGFbZGldO1xuXHRcdGlmKGxpbmUgIT09IGJvdW5kYXJ5ICYmIGxpbmUgIT09IGJvdW5kYXJ5ICsgXCItLVwiKSBjb250aW51ZTtcblx0XHRpZihmY250KyspIHBhcnNlX21pbWUobywgZGF0YS5zbGljZShzdGFydF9kaSwgZGkpLCByb290KTtcblx0XHRzdGFydF9kaSA9IGRpO1xuXHR9XG5cdHJldHVybiBvO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9tYWQoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8sIG9wdGlvbnMvKjpDRkJXcml0ZU9wdHMqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblx0dmFyIGJvdW5kYXJ5ID0gb3B0cy5ib3VuZGFyeSB8fCBcIlNoZWV0SlNcIjtcblx0Ym91bmRhcnkgPSAnLS0tLS0tPScgKyBib3VuZGFyeTtcblxuXHR2YXIgb3V0ID0gW1xuXHRcdCdNSU1FLVZlcnNpb246IDEuMCcsXG5cdFx0J0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PVwiJyArIGJvdW5kYXJ5LnNsaWNlKDIpICsgJ1wiJyxcblx0XHQnJyxcblx0XHQnJyxcblx0XHQnJ1xuXHRdO1xuXG5cdHZhciByb290ID0gY2ZiLkZ1bGxQYXRoc1swXSwgZnAgPSByb290LCBmaSA9IGNmYi5GaWxlSW5kZXhbMF07XG5cdGZvcih2YXIgaSA9IDE7IGkgPCBjZmIuRnVsbFBhdGhzLmxlbmd0aDsgKytpKSB7XG5cdFx0ZnAgPSBjZmIuRnVsbFBhdGhzW2ldLnNsaWNlKHJvb3QubGVuZ3RoKTtcblx0XHRmaSA9IGNmYi5GaWxlSW5kZXhbaV07XG5cdFx0aWYoIWZpLnNpemUgfHwgIWZpLmNvbnRlbnQgfHwgZnAgPT0gXCJcXHUwMDAxU2gzM3RKNVwiKSBjb250aW51ZTtcblxuXHRcdC8qIE5vcm1hbGl6ZSBmaWxlbmFtZSAqL1xuXHRcdGZwID0gZnAucmVwbGFjZSgvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0UtXFx4RkZdL2csIGZ1bmN0aW9uKGMpIHtcblx0XHRcdHJldHVybiBcIl94XCIgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpICsgXCJfXCI7XG5cdFx0fSkucmVwbGFjZSgvW1xcdTAwODAtXFx1RkZGRl0vZywgZnVuY3Rpb24odSkge1xuXHRcdFx0cmV0dXJuIFwiX3VcIiArIHUuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgKyBcIl9cIjtcblx0XHR9KTtcblxuXHRcdC8qIEV4dHJhY3QgY29udGVudCBhcyBiaW5hcnkgc3RyaW5nICovXG5cdFx0dmFyIGNhID0gZmkuY29udGVudDtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdHZhciBjc3RyID0gaGFzX2J1ZiAmJiBCdWZmZXIuaXNCdWZmZXIoY2EpID8gY2EudG9TdHJpbmcoXCJiaW5hcnlcIikgOiBhMnMoY2EpO1xuXG5cdFx0LyogNC81IG9mIGZpcnN0IDEwMjQgY2hhcnMgYXNjaWkgLT4gcXVvdGVkIHByaW50YWJsZSwgZWxzZSBiYXNlNjQgKi9cblx0XHR2YXIgZGlzcGNudCA9IDAsIEwgPSBNYXRoLm1pbigxMDI0LCBjc3RyLmxlbmd0aCksIGNjID0gMDtcblx0XHRmb3IodmFyIGNzbCA9IDA7IGNzbCA8PSBMOyArK2NzbCkgaWYoKGNjPWNzdHIuY2hhckNvZGVBdChjc2wpKSA+PSAweDIwICYmIGNjIDwgMHg4MCkgKytkaXNwY250O1xuXHRcdHZhciBxcCA9IGRpc3BjbnQgPj0gTCAqIDQgLyA1O1xuXG5cdFx0b3V0LnB1c2goYm91bmRhcnkpO1xuXHRcdG91dC5wdXNoKCdDb250ZW50LUxvY2F0aW9uOiAnICsgKG9wdHMucm9vdCB8fCAnZmlsZTovLy9DOi9TaGVldEpTLycpICsgZnApO1xuXHRcdG91dC5wdXNoKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAnICsgKHFwID8gJ3F1b3RlZC1wcmludGFibGUnIDogJ2Jhc2U2NCcpKTtcblx0XHRvdXQucHVzaCgnQ29udGVudC1UeXBlOiAnICsgZ2V0X2NvbnRlbnRfdHlwZShmaSwgZnApKTtcblx0XHRvdXQucHVzaCgnJyk7XG5cblx0XHRvdXQucHVzaChxcCA/IHdyaXRlX3F1b3RlZF9wcmludGFibGUoY3N0cikgOiB3cml0ZV9iYXNlNjRfNzYoY3N0cikpO1xuXHR9XG5cdG91dC5wdXNoKGJvdW5kYXJ5ICsgJy0tXFxyXFxuJyk7XG5cdHJldHVybiBvdXQuam9pbihcIlxcclxcblwiKTtcbn1cbmZ1bmN0aW9uIGNmYl9uZXcob3B0cy8qOj9hbnkqLykvKjpDRkJDb250YWluZXIqLyB7XG5cdHZhciBvLyo6Q0ZCQ29udGFpbmVyKi8gPSAoe30vKjphbnkqLyk7XG5cdGluaXRfY2ZiKG8sIG9wdHMpO1xuXHRyZXR1cm4gbztcbn1cblxuZnVuY3Rpb24gY2ZiX2FkZChjZmIvKjpDRkJDb250YWluZXIqLywgbmFtZS8qOnN0cmluZyovLCBjb250ZW50Lyo6P1Jhd0J5dGVzKi8sIG9wdHMvKjo/YW55Ki8pLyo6Q0ZCRW50cnkqLyB7XG5cdHZhciB1bnNhZmUgPSBvcHRzICYmIG9wdHMudW5zYWZlO1xuXHRpZighdW5zYWZlKSBpbml0X2NmYihjZmIpO1xuXHR2YXIgZmlsZSA9ICF1bnNhZmUgJiYgQ0ZCLmZpbmQoY2ZiLCBuYW1lKTtcblx0aWYoIWZpbGUpIHtcblx0XHR2YXIgZnBhdGgvKjpzdHJpbmcqLyA9IGNmYi5GdWxsUGF0aHNbMF07XG5cdFx0aWYobmFtZS5zbGljZSgwLCBmcGF0aC5sZW5ndGgpID09IGZwYXRoKSBmcGF0aCA9IG5hbWU7XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZihmcGF0aC5zbGljZSgtMSkgIT0gXCIvXCIpIGZwYXRoICs9IFwiL1wiO1xuXHRcdFx0ZnBhdGggPSAoZnBhdGggKyBuYW1lKS5yZXBsYWNlKFwiLy9cIixcIi9cIik7XG5cdFx0fVxuXHRcdGZpbGUgPSAoe25hbWU6IGZpbGVuYW1lKG5hbWUpLCB0eXBlOiAyfS8qOmFueSovKTtcblx0XHRjZmIuRmlsZUluZGV4LnB1c2goZmlsZSk7XG5cdFx0Y2ZiLkZ1bGxQYXRocy5wdXNoKGZwYXRoKTtcblx0XHRpZighdW5zYWZlKSBDRkIudXRpbHMuY2ZiX2djKGNmYik7XG5cdH1cblx0Lyo6OiBpZighZmlsZSkgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7ICovXG5cdGZpbGUuY29udGVudCA9IChjb250ZW50Lyo6YW55Ki8pO1xuXHRmaWxlLnNpemUgPSBjb250ZW50ID8gY29udGVudC5sZW5ndGggOiAwO1xuXHRpZihvcHRzKSB7XG5cdFx0aWYob3B0cy5DTFNJRCkgZmlsZS5jbHNpZCA9IG9wdHMuQ0xTSUQ7XG5cdFx0aWYob3B0cy5tdCkgZmlsZS5tdCA9IG9wdHMubXQ7XG5cdFx0aWYob3B0cy5jdCkgZmlsZS5jdCA9IG9wdHMuY3Q7XG5cdH1cblx0cmV0dXJuIGZpbGU7XG59XG5cbmZ1bmN0aW9uIGNmYl9kZWwoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8sIG5hbWUvKjpzdHJpbmcqLykvKjpib29sZWFuKi8ge1xuXHRpbml0X2NmYihjZmIpO1xuXHR2YXIgZmlsZSA9IENGQi5maW5kKGNmYiwgbmFtZSk7XG5cdGlmKGZpbGUpIGZvcih2YXIgaiA9IDA7IGogPCBjZmIuRmlsZUluZGV4Lmxlbmd0aDsgKytqKSBpZihjZmIuRmlsZUluZGV4W2pdID09IGZpbGUpIHtcblx0XHRjZmIuRmlsZUluZGV4LnNwbGljZShqLCAxKTtcblx0XHRjZmIuRnVsbFBhdGhzLnNwbGljZShqLCAxKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNmYl9tb3YoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8sIG9sZF9uYW1lLyo6c3RyaW5nKi8sIG5ld19uYW1lLyo6c3RyaW5nKi8pLyo6Ym9vbGVhbiovIHtcblx0aW5pdF9jZmIoY2ZiKTtcblx0dmFyIGZpbGUgPSBDRkIuZmluZChjZmIsIG9sZF9uYW1lKTtcblx0aWYoZmlsZSkgZm9yKHZhciBqID0gMDsgaiA8IGNmYi5GaWxlSW5kZXgubGVuZ3RoOyArK2opIGlmKGNmYi5GaWxlSW5kZXhbal0gPT0gZmlsZSkge1xuXHRcdGNmYi5GaWxlSW5kZXhbal0ubmFtZSA9IGZpbGVuYW1lKG5ld19uYW1lKTtcblx0XHRjZmIuRnVsbFBhdGhzW2pdID0gbmV3X25hbWU7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjZmJfZ2MoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8pLyo6dm9pZCovIHsgcmVidWlsZF9jZmIoY2ZiLCB0cnVlKTsgfVxuXG5leHBvcnRzLmZpbmQgPSBmaW5kO1xuZXhwb3J0cy5yZWFkID0gcmVhZDtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbmV4cG9ydHMud3JpdGUgPSB3cml0ZTtcbmV4cG9ydHMud3JpdGVGaWxlID0gd3JpdGVfZmlsZTtcbmV4cG9ydHMudXRpbHMgPSB7XG5cdGNmYl9uZXc6IGNmYl9uZXcsXG5cdGNmYl9hZGQ6IGNmYl9hZGQsXG5cdGNmYl9kZWw6IGNmYl9kZWwsXG5cdGNmYl9tb3Y6IGNmYl9tb3YsXG5cdGNmYl9nYzogY2ZiX2djLFxuXHRSZWFkU2hpZnQ6IFJlYWRTaGlmdCxcblx0Q2hlY2tGaWVsZDogQ2hlY2tGaWVsZCxcblx0cHJlcF9ibG9iOiBwcmVwX2Jsb2IsXG5cdGJjb25jYXQ6IGJjb25jYXQsXG5cdHVzZV96bGliOiB1c2VfemxpYixcblx0X2RlZmxhdGVSYXc6IF9kZWZsYXRlLFxuXHRfaW5mbGF0ZVJhdzogX2luZmxhdGUsXG5cdGNvbnN0czogY29uc3RzXG59O1xuXG5yZXR1cm4gZXhwb3J0cztcbn0pKCk7XG5cbmxldCBfZnMgPSB2b2lkIDA7XG5mdW5jdGlvbiBzZXRfZnMoZnMpIHsgX2ZzID0gZnM7IH1cbmV4cG9ydCB7IHNldF9mcyB9O1xuXG4vKiBub3JtYWxpemUgZGF0YSBmb3IgYmxvYiBjdG9yICovXG5mdW5jdGlvbiBibG9iaWZ5KGRhdGEpIHtcblx0aWYodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiBzMmFiKGRhdGEpO1xuXHRpZihBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gYTJ1KGRhdGEpO1xuXHRyZXR1cm4gZGF0YTtcbn1cbi8qIHdyaXRlIG9yIGRvd25sb2FkIGZpbGUgKi9cbmZ1bmN0aW9uIHdyaXRlX2RsKGZuYW1lLyo6c3RyaW5nKi8sIHBheWxvYWQvKjphbnkqLywgZW5jLyo6P3N0cmluZyovKSB7XG5cdC8qZ2xvYmFsIElFX1NhdmVGaWxlLCBCbG9iLCBuYXZpZ2F0b3IsIHNhdmVBcywgZG9jdW1lbnQsIEZpbGUsIGNocm9tZSAqL1xuXHRpZih0eXBlb2YgX2ZzICE9PSAndW5kZWZpbmVkJyAmJiBfZnMud3JpdGVGaWxlU3luYykgcmV0dXJuIGVuYyA/IF9mcy53cml0ZUZpbGVTeW5jKGZuYW1lLCBwYXlsb2FkLCBlbmMpIDogX2ZzLndyaXRlRmlsZVN5bmMoZm5hbWUsIHBheWxvYWQpO1xuXHRpZih0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHQvKiBpbiB0aGlzIHNwb3QsIGl0J3Mgc2FmZSB0byBhc3N1bWUgdHlwZWQgYXJyYXlzIGFuZCBUZXh0RW5jb2Rlci9UZXh0RGVjb2RlciBleGlzdCAqL1xuXHRcdGlmKGVuYyAmJiB0eXBlb2YgcGF5bG9hZCA9PSBcInN0cmluZ1wiKSBzd2l0Y2goZW5jKSB7XG5cdFx0XHRjYXNlIFwidXRmOFwiOiBwYXlsb2FkID0gbmV3IFRleHRFbmNvZGVyKGVuYykuZW5jb2RlKHBheWxvYWQpOyBicmVhaztcblx0XHRcdGNhc2UgXCJiaW5hcnlcIjogcGF5bG9hZCA9IHMyYWIocGF5bG9hZCk7IGJyZWFrO1xuXHRcdFx0LyogVE9ETzogYmluYXJ5IGVxdWl2YWxlbnQgKi9cblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGVuY29kaW5nIFwiICsgZW5jKTtcblx0XHR9XG5cdFx0cmV0dXJuIERlbm8ud3JpdGVGaWxlU3luYyhmbmFtZSwgcGF5bG9hZCk7XG5cdH1cblx0dmFyIGRhdGEgPSAoZW5jID09IFwidXRmOFwiKSA/IHV0Zjh3cml0ZShwYXlsb2FkKSA6IHBheWxvYWQ7XG5cdC8qOjogZGVjbGFyZSB2YXIgSUVfU2F2ZUZpbGU6IGFueTsgKi9cblx0aWYodHlwZW9mIElFX1NhdmVGaWxlICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIElFX1NhdmVGaWxlKGRhdGEsIGZuYW1lKTtcblx0aWYodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0dmFyIGJsb2IgPSBuZXcgQmxvYihbYmxvYmlmeShkYXRhKV0sIHt0eXBlOlwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJ9KTtcblx0XHQvKjo6IGRlY2xhcmUgdmFyIG5hdmlnYXRvcjogYW55OyAqL1xuXHRcdGlmKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5tc1NhdmVCbG9iKSByZXR1cm4gbmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZm5hbWUpO1xuXHRcdC8qOjogZGVjbGFyZSB2YXIgc2F2ZUFzOiBhbnk7ICovXG5cdFx0aWYodHlwZW9mIHNhdmVBcyAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBzYXZlQXMoYmxvYiwgZm5hbWUpO1xuXHRcdGlmKHR5cGVvZiBVUkwgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7XG5cdFx0XHR2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblx0XHRcdC8qOjogZGVjbGFyZSB2YXIgY2hyb21lOiBhbnk7ICovXG5cdFx0XHRpZih0eXBlb2YgY2hyb21lID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGNocm9tZS5kb3dubG9hZHN8fHt9KS5kb3dubG9hZCA9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0aWYoVVJMLnJldm9rZU9iamVjdFVSTCAmJiB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcpIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSwgNjAwMDApO1xuXHRcdFx0XHRyZXR1cm4gY2hyb21lLmRvd25sb2Fkcy5kb3dubG9hZCh7IHVybDogdXJsLCBmaWxlbmFtZTogZm5hbWUsIHNhdmVBczogdHJ1ZX0pO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblx0XHRcdGlmKGEuZG93bmxvYWQgIT0gbnVsbCkge1xuXHRcdFx0XHQvKjo6IGlmKGRvY3VtZW50LmJvZHkgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7ICovXG5cdFx0XHRcdGEuZG93bmxvYWQgPSBmbmFtZTsgYS5ocmVmID0gdXJsOyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7XG5cdFx0XHRcdC8qOjogaWYoZG9jdW1lbnQuYm9keSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi8gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcblx0XHRcdFx0aWYoVVJMLnJldm9rZU9iamVjdFVSTCAmJiB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcpIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSwgNjAwMDApO1xuXHRcdFx0XHRyZXR1cm4gdXJsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvLyAkRmxvd0lnbm9yZVxuXHRpZih0eXBlb2YgJCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEZpbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBGb2xkZXIgIT09ICd1bmRlZmluZWQnKSB0cnkgeyAvLyBleHRlbmRzY3JpcHRcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdHZhciBvdXQgPSBGaWxlKGZuYW1lKTsgb3V0Lm9wZW4oXCJ3XCIpOyBvdXQuZW5jb2RpbmcgPSBcImJpbmFyeVwiO1xuXHRcdGlmKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHBheWxvYWQgPSBhMnMocGF5bG9hZCk7XG5cdFx0b3V0LndyaXRlKHBheWxvYWQpOyBvdXQuY2xvc2UoKTsgcmV0dXJuIHBheWxvYWQ7XG5cdH0gY2F0Y2goZSkgeyBpZighZS5tZXNzYWdlIHx8ICFlLm1lc3NhZ2UubWF0Y2goL29uc3RydWN0LykpIHRocm93IGU7IH1cblx0dGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHNhdmUgZmlsZSBcIiArIGZuYW1lKTtcbn1cblxuLyogcmVhZCBiaW5hcnkgZGF0YSBmcm9tIGZpbGUgKi9cbmZ1bmN0aW9uIHJlYWRfYmluYXJ5KHBhdGgvKjpzdHJpbmcqLykge1xuXHRpZih0eXBlb2YgX2ZzICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIF9mcy5yZWFkRmlsZVN5bmMocGF0aCk7XG5cdGlmKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIERlbm8ucmVhZEZpbGVTeW5jKHBhdGgpO1xuXHQvLyAkRmxvd0lnbm9yZVxuXHRpZih0eXBlb2YgJCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEZpbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBGb2xkZXIgIT09ICd1bmRlZmluZWQnKSB0cnkgeyAvLyBleHRlbmRzY3JpcHRcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdHZhciBpbmZpbGUgPSBGaWxlKHBhdGgpOyBpbmZpbGUub3BlbihcInJcIik7IGluZmlsZS5lbmNvZGluZyA9IFwiYmluYXJ5XCI7XG5cdFx0dmFyIGRhdGEgPSBpbmZpbGUucmVhZCgpOyBpbmZpbGUuY2xvc2UoKTtcblx0XHRyZXR1cm4gZGF0YTtcblx0fSBjYXRjaChlKSB7IGlmKCFlLm1lc3NhZ2UgfHwgIWUubWVzc2FnZS5tYXRjaCgvb25zdHJ1Y3QvKSkgdGhyb3cgZTsgfVxuXHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWNjZXNzIGZpbGUgXCIgKyBwYXRoKTtcbn1cbmZ1bmN0aW9uIGtleXMoby8qOmFueSovKS8qOkFycmF5PGFueT4qLyB7XG5cdHZhciBrcyA9IE9iamVjdC5rZXlzKG8pLCBvMiA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwga3MubGVuZ3RoOyArK2kpIGlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrc1tpXSkpIG8yLnB1c2goa3NbaV0pO1xuXHRyZXR1cm4gbzI7XG59XG5cbmZ1bmN0aW9uIGV2ZXJ0X2tleShvYmovKjphbnkqLywga2V5Lyo6c3RyaW5nKi8pLyo6RXZlcnRUeXBlKi8ge1xuXHR2YXIgbyA9IChbXS8qOmFueSovKSwgSyA9IGtleXMob2JqKTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPT0gSy5sZW5ndGg7ICsraSkgaWYob1tvYmpbS1tpXV1ba2V5XV0gPT0gbnVsbCkgb1tvYmpbS1tpXV1ba2V5XV0gPSBLW2ldO1xuXHRyZXR1cm4gbztcbn1cblxuZnVuY3Rpb24gZXZlcnQob2JqLyo6YW55Ki8pLyo6RXZlcnRUeXBlKi8ge1xuXHR2YXIgbyA9IChbXS8qOmFueSovKSwgSyA9IGtleXMob2JqKTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPT0gSy5sZW5ndGg7ICsraSkgb1tvYmpbS1tpXV1dID0gS1tpXTtcblx0cmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIGV2ZXJ0X251bShvYmovKjphbnkqLykvKjpFdmVydE51bVR5cGUqLyB7XG5cdHZhciBvID0gKFtdLyo6YW55Ki8pLCBLID0ga2V5cyhvYmopO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9PSBLLmxlbmd0aDsgKytpKSBvW29ialtLW2ldXV0gPSBwYXJzZUludChLW2ldLDEwKTtcblx0cmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIGV2ZXJ0X2FycihvYmovKjphbnkqLykvKjpFdmVydEFyclR5cGUqLyB7XG5cdHZhciBvLyo6RXZlcnRBcnJUeXBlKi8gPSAoW10vKjphbnkqLyksIEsgPSBrZXlzKG9iaik7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT09IEsubGVuZ3RoOyArK2kpIHtcblx0XHRpZihvW29ialtLW2ldXV0gPT0gbnVsbCkgb1tvYmpbS1tpXV1dID0gW107XG5cdFx0b1tvYmpbS1tpXV1dLnB1c2goS1tpXSk7XG5cdH1cblx0cmV0dXJuIG87XG59XG5cbnZhciBiYXNlZGF0ZSA9IC8qI19fUFVSRV9fKi9uZXcgRGF0ZSgxODk5LCAxMSwgMzAsIDAsIDAsIDApOyAvLyAyMjA5MTYxNjAwMDAwXG5mdW5jdGlvbiBkYXRlbnVtKHYvKjpEYXRlKi8sIGRhdGUxOTA0Lyo6P2Jvb2xlYW4qLykvKjpudW1iZXIqLyB7XG5cdHZhciBlcG9jaCA9IC8qI19fUFVSRV9fKi92LmdldFRpbWUoKTtcblx0aWYoZGF0ZTE5MDQpIGVwb2NoIC09IDE0NjIqMjQqNjAqNjAqMTAwMDtcblx0dmFyIGRudGhyZXNoID0gLyojX19QVVJFX18qL2Jhc2VkYXRlLmdldFRpbWUoKSArICgvKiNfX1BVUkVfXyovdi5nZXRUaW1lem9uZU9mZnNldCgpIC0gLyojX19QVVJFX18qL2Jhc2VkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpICogNjAwMDA7XG5cdHJldHVybiAoZXBvY2ggLSBkbnRocmVzaCkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7XG59XG52YXIgcmVmZGF0ZSA9IC8qI19fUFVSRV9fKi9uZXcgRGF0ZSgpO1xudmFyIGRudGhyZXNoID0gLyojX19QVVJFX18qL2Jhc2VkYXRlLmdldFRpbWUoKSArICgvKiNfX1BVUkVfXyovcmVmZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC0gLyojX19QVVJFX18qL2Jhc2VkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpICogNjAwMDA7XG52YXIgcmVmb2Zmc2V0ID0gLyojX19QVVJFX18qL3JlZmRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbmZ1bmN0aW9uIG51bWRhdGUodi8qOm51bWJlciovKS8qOkRhdGUqLyB7XG5cdHZhciBvdXQgPSBuZXcgRGF0ZSgpO1xuXHRvdXQuc2V0VGltZSh2ICogMjQgKiA2MCAqIDYwICogMTAwMCArIGRudGhyZXNoKTtcblx0aWYgKG91dC5nZXRUaW1lem9uZU9mZnNldCgpICE9PSByZWZvZmZzZXQpIHtcblx0XHRvdXQuc2V0VGltZShvdXQuZ2V0VGltZSgpICsgKG91dC5nZXRUaW1lem9uZU9mZnNldCgpIC0gcmVmb2Zmc2V0KSAqIDYwMDAwKTtcblx0fVxuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBJU08gODYwMSBEdXJhdGlvbiAqL1xuZnVuY3Rpb24gcGFyc2VfaXNvZHVyKHMpIHtcblx0dmFyIHNlYyA9IDAsIG10ID0gMCwgdGltZSA9IGZhbHNlO1xuXHR2YXIgbSA9IHMubWF0Y2goL1AoWzAtOVxcLl0rWSk/KFswLTlcXC5dK00pPyhbMC05XFwuXStEKT9UKFswLTlcXC5dK0gpPyhbMC05XFwuXStNKT8oWzAtOVxcLl0rUyk/Lyk7XG5cdGlmKCFtKSB0aHJvdyBuZXcgRXJyb3IoXCJ8XCIgKyBzICsgXCJ8IGlzIG5vdCBhbiBJU084NjAxIER1cmF0aW9uXCIpO1xuXHRmb3IodmFyIGkgPSAxOyBpICE9IG0ubGVuZ3RoOyArK2kpIHtcblx0XHRpZighbVtpXSkgY29udGludWU7XG5cdFx0bXQgPSAxO1xuXHRcdGlmKGkgPiAzKSB0aW1lID0gdHJ1ZTtcblx0XHRzd2l0Y2gobVtpXS5zbGljZShtW2ldLmxlbmd0aC0xKSkge1xuXHRcdFx0Y2FzZSAnWSc6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIElTTyBEdXJhdGlvbiBGaWVsZDogXCIgKyBtW2ldLnNsaWNlKG1baV0ubGVuZ3RoLTEpKTtcblx0XHRcdGNhc2UgJ0QnOiBtdCAqPSAyNDtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnSCc6IG10ICo9IDYwO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICdNJzpcblx0XHRcdFx0aWYoIXRpbWUpIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIElTTyBEdXJhdGlvbiBGaWVsZDogTVwiKTtcblx0XHRcdFx0ZWxzZSBtdCAqPSA2MDtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnUyc6IGJyZWFrO1xuXHRcdH1cblx0XHRzZWMgKz0gbXQgKiBwYXJzZUludChtW2ldLCAxMCk7XG5cdH1cblx0cmV0dXJuIHNlYztcbn1cblxudmFyIGdvb2RfcGRfZGF0ZV8xID0gLyojX19QVVJFX18qL25ldyBEYXRlKCcyMDE3LTAyLTE5VDE5OjA2OjA5LjAwMFonKTtcbnZhciBnb29kX3BkX2RhdGUgPSAvKiNfX1BVUkVfXyovaXNOYU4oLyojX19QVVJFX18qL2dvb2RfcGRfZGF0ZV8xLmdldEZ1bGxZZWFyKCkpID8gLyojX19QVVJFX18qL25ldyBEYXRlKCcyLzE5LzE3JykgOiBnb29kX3BkX2RhdGVfMTtcbnZhciBnb29kX3BkID0gLyojX19QVVJFX18qL2dvb2RfcGRfZGF0ZS5nZXRGdWxsWWVhcigpID09IDIwMTc7XG4vKiBwYXJzZXMgYSBkYXRlIGFzIGEgbG9jYWwgZGF0ZSAqL1xuZnVuY3Rpb24gcGFyc2VEYXRlKHN0ci8qOnN0cmluZ3xEYXRlKi8sIGZpeGRhdGUvKjo/bnVtYmVyKi8pLyo6RGF0ZSovIHtcblx0dmFyIGQgPSBuZXcgRGF0ZShzdHIpO1xuXHRpZihnb29kX3BkKSB7XG5cdFx0Lyo6OiBpZihmaXhkYXRlID09IG51bGwpIGZpeGRhdGUgPSAwOyAqL1xuXHRcdGlmKGZpeGRhdGUgPiAwKSBkLnNldFRpbWUoZC5nZXRUaW1lKCkgKyBkLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDApO1xuXHRcdGVsc2UgaWYoZml4ZGF0ZSA8IDApIGQuc2V0VGltZShkLmdldFRpbWUoKSAtIGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwICogMTAwMCk7XG5cdFx0cmV0dXJuIGQ7XG5cdH1cblx0aWYoc3RyIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHN0cjtcblx0aWYoZ29vZF9wZF9kYXRlLmdldEZ1bGxZZWFyKCkgPT0gMTkxNyAmJiAhaXNOYU4oZC5nZXRGdWxsWWVhcigpKSkge1xuXHRcdHZhciBzID0gZC5nZXRGdWxsWWVhcigpO1xuXHRcdGlmKHN0ci5pbmRleE9mKFwiXCIgKyBzKSA+IC0xKSByZXR1cm4gZDtcblx0XHRkLnNldEZ1bGxZZWFyKGQuZ2V0RnVsbFllYXIoKSArIDEwMCk7IHJldHVybiBkO1xuXHR9XG5cdHZhciBuID0gc3RyLm1hdGNoKC9cXGQrL2cpfHxbXCIyMDE3XCIsXCIyXCIsXCIxOVwiLFwiMFwiLFwiMFwiLFwiMFwiXTtcblx0dmFyIG91dCA9IG5ldyBEYXRlKCtuWzBdLCArblsxXSAtIDEsICtuWzJdLCAoK25bM118fDApLCAoK25bNF18fDApLCAoK25bNV18fDApKTtcblx0aWYoc3RyLmluZGV4T2YoXCJaXCIpID4gLTEpIG91dCA9IG5ldyBEYXRlKG91dC5nZXRUaW1lKCkgLSBvdXQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwICogMTAwMCk7XG5cdHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGNjMnN0cihhcnIvKjpBcnJheTxudW1iZXI+Ki8sIGRlYm9taXQpLyo6c3RyaW5nKi8ge1xuXHRpZihoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihhcnIpKSB7XG5cdFx0aWYoZGVib21pdCkge1xuXHRcdFx0aWYoYXJyWzBdID09IDB4RkYgJiYgYXJyWzFdID09IDB4RkUpIHJldHVybiB1dGY4d3JpdGUoYXJyLnNsaWNlKDIpLnRvU3RyaW5nKFwidXRmMTZsZVwiKSk7XG5cdFx0XHRpZihhcnJbMV0gPT0gMHhGRSAmJiBhcnJbMl0gPT0gMHhGRikgcmV0dXJuIHV0Zjh3cml0ZSh1dGYxNmJlcmVhZChhcnIuc2xpY2UoMikudG9TdHJpbmcoXCJiaW5hcnlcIikpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFyci50b1N0cmluZyhcImJpbmFyeVwiKTtcblx0fVxuXG5cdGlmKHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gXCJ1bmRlZmluZWRcIikgdHJ5IHtcblx0XHRpZihkZWJvbWl0KSB7XG5cdFx0XHRpZihhcnJbMF0gPT0gMHhGRiAmJiBhcnJbMV0gPT0gMHhGRSkgcmV0dXJuIHV0Zjh3cml0ZShuZXcgVGV4dERlY29kZXIoXCJ1dGYtMTZsZVwiKS5kZWNvZGUoYXJyLnNsaWNlKDIpKSk7XG5cdFx0XHRpZihhcnJbMF0gPT0gMHhGRSAmJiBhcnJbMV0gPT0gMHhGRikgcmV0dXJuIHV0Zjh3cml0ZShuZXcgVGV4dERlY29kZXIoXCJ1dGYtMTZiZVwiKS5kZWNvZGUoYXJyLnNsaWNlKDIpKSk7XG5cdFx0fVxuXHRcdHZhciByZXYgPSB7XG5cdFx0XHRcIlxcdTIwYWNcIjogXCJcXHg4MFwiLCBcIlxcdTIwMWFcIjogXCJcXHg4MlwiLCBcIlxcdTAxOTJcIjogXCJcXHg4M1wiLCBcIlxcdTIwMWVcIjogXCJcXHg4NFwiLFxuXHRcdFx0XCJcXHUyMDI2XCI6IFwiXFx4ODVcIiwgXCJcXHUyMDIwXCI6IFwiXFx4ODZcIiwgXCJcXHUyMDIxXCI6IFwiXFx4ODdcIiwgXCJcXHUwMmM2XCI6IFwiXFx4ODhcIixcblx0XHRcdFwiXFx1MjAzMFwiOiBcIlxceDg5XCIsIFwiXFx1MDE2MFwiOiBcIlxceDhhXCIsIFwiXFx1MjAzOVwiOiBcIlxceDhiXCIsIFwiXFx1MDE1MlwiOiBcIlxceDhjXCIsXG5cdFx0XHRcIlxcdTAxN2RcIjogXCJcXHg4ZVwiLCBcIlxcdTIwMThcIjogXCJcXHg5MVwiLCBcIlxcdTIwMTlcIjogXCJcXHg5MlwiLCBcIlxcdTIwMWNcIjogXCJcXHg5M1wiLFxuXHRcdFx0XCJcXHUyMDFkXCI6IFwiXFx4OTRcIiwgXCJcXHUyMDIyXCI6IFwiXFx4OTVcIiwgXCJcXHUyMDEzXCI6IFwiXFx4OTZcIiwgXCJcXHUyMDE0XCI6IFwiXFx4OTdcIixcblx0XHRcdFwiXFx1MDJkY1wiOiBcIlxceDk4XCIsIFwiXFx1MjEyMlwiOiBcIlxceDk5XCIsIFwiXFx1MDE2MVwiOiBcIlxceDlhXCIsIFwiXFx1MjAzYVwiOiBcIlxceDliXCIsXG5cdFx0XHRcIlxcdTAxNTNcIjogXCJcXHg5Y1wiLCBcIlxcdTAxN2VcIjogXCJcXHg5ZVwiLCBcIlxcdTAxNzhcIjogXCJcXHg5ZlwiXG5cdFx0fTtcblx0XHRpZihBcnJheS5pc0FycmF5KGFycikpIGFyciA9IG5ldyBVaW50OEFycmF5KGFycik7XG5cdFx0cmV0dXJuIG5ldyBUZXh0RGVjb2RlcihcImxhdGluMVwiKS5kZWNvZGUoYXJyKS5yZXBsYWNlKC9b4oKs4oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLFveKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk8W+xbhdL2csIGZ1bmN0aW9uKGMpIHsgcmV0dXJuIHJldltjXSB8fCBjOyB9KTtcblx0fSBjYXRjaChlKSB7fVxuXG5cdHZhciBvID0gW107XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gYXJyLmxlbmd0aDsgKytpKSBvLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhcnJbaV0pKTtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gZHVwKG8vKjphbnkqLykvKjphbnkqLyB7XG5cdGlmKHR5cGVvZiBKU09OICE9ICd1bmRlZmluZWQnICYmICFBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvKSk7XG5cdGlmKHR5cGVvZiBvICE9ICdvYmplY3QnIHx8IG8gPT0gbnVsbCkgcmV0dXJuIG87XG5cdGlmKG8gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUoby5nZXRUaW1lKCkpO1xuXHR2YXIgb3V0ID0ge307XG5cdGZvcih2YXIgayBpbiBvKSBpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIG91dFtrXSA9IGR1cChvW2tdKTtcblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gZmlsbChjLyo6c3RyaW5nKi8sbC8qOm51bWJlciovKS8qOnN0cmluZyovIHsgdmFyIG8gPSBcIlwiOyB3aGlsZShvLmxlbmd0aCA8IGwpIG8rPWM7IHJldHVybiBvOyB9XG5cbi8qIFRPRE86IHN0cmVzcyB0ZXN0ICovXG5mdW5jdGlvbiBmdXp6eW51bShzLyo6c3RyaW5nKi8pLyo6bnVtYmVyKi8ge1xuXHR2YXIgdi8qOm51bWJlciovID0gTnVtYmVyKHMpO1xuXHRpZighaXNOYU4odikpIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiBOYU47XG5cdGlmKCEvXFxkLy50ZXN0KHMpKSByZXR1cm4gdjtcblx0dmFyIHd0ID0gMTtcblx0dmFyIHNzID0gcy5yZXBsYWNlKC8oW1xcZF0pLChbXFxkXSkvZyxcIiQxJDJcIikucmVwbGFjZSgvWyRdL2csXCJcIikucmVwbGFjZSgvWyVdL2csIGZ1bmN0aW9uKCkgeyB3dCAqPSAxMDA7IHJldHVybiBcIlwiO30pO1xuXHRpZighaXNOYU4odiA9IE51bWJlcihzcykpKSByZXR1cm4gdiAvIHd0O1xuXHRzcyA9IHNzLnJlcGxhY2UoL1soXSguKilbKV0vLGZ1bmN0aW9uKCQkLCAkMSkgeyB3dCA9IC13dDsgcmV0dXJuICQxO30pO1xuXHRpZighaXNOYU4odiA9IE51bWJlcihzcykpKSByZXR1cm4gdiAvIHd0O1xuXHRyZXR1cm4gdjtcbn1cbnZhciBsb3dlcl9tb250aHMgPSBbJ2phbnVhcnknLCAnZmVicnVhcnknLCAnbWFyY2gnLCAnYXByaWwnLCAnbWF5JywgJ2p1bmUnLCAnanVseScsICdhdWd1c3QnLCAnc2VwdGVtYmVyJywgJ29jdG9iZXInLCAnbm92ZW1iZXInLCAnZGVjZW1iZXInXTtcbmZ1bmN0aW9uIGZ1enp5ZGF0ZShzLyo6c3RyaW5nKi8pLyo6RGF0ZSovIHtcblx0dmFyIG8gPSBuZXcgRGF0ZShzKSwgbiA9IG5ldyBEYXRlKE5hTik7XG5cdHZhciB5ID0gby5nZXRZZWFyKCksIG0gPSBvLmdldE1vbnRoKCksIGQgPSBvLmdldERhdGUoKTtcblx0aWYoaXNOYU4oZCkpIHJldHVybiBuO1xuXHR2YXIgbG93ZXIgPSBzLnRvTG93ZXJDYXNlKCk7XG5cdGlmKGxvd2VyLm1hdGNoKC9qYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYy8pKSB7XG5cdFx0bG93ZXIgPSBsb3dlci5yZXBsYWNlKC9bXmEtel0vZyxcIlwiKS5yZXBsYWNlKC8oW15hLXpdfF4pW2FwXW0/KFteYS16XXwkKS8sXCJcIik7XG5cdFx0aWYobG93ZXIubGVuZ3RoID4gMyAmJiBsb3dlcl9tb250aHMuaW5kZXhPZihsb3dlcikgPT0gLTEpIHJldHVybiBuO1xuXHR9IGVsc2UgaWYobG93ZXIubWF0Y2goL1thLXpdLykpIHJldHVybiBuO1xuXHRpZih5IDwgMCB8fCB5ID4gODA5OSkgcmV0dXJuIG47XG5cdGlmKChtID4gMCB8fCBkID4gMSkgJiYgeSAhPSAxMDEpIHJldHVybiBvO1xuXHRpZihzLm1hdGNoKC9bXi0wLTk6LFxcL1xcXFxdLykpIHJldHVybiBuO1xuXHRyZXR1cm4gbztcbn1cblxudmFyIHNwbGl0X3JlZ2V4ID0gLyojX19QVVJFX18qLyhmdW5jdGlvbigpIHtcblx0dmFyIHNhZmVfc3BsaXRfcmVnZXggPSBcImFiYWNhYmFcIi5zcGxpdCgvKDo/YikvaSkubGVuZ3RoID09IDU7XG5cdHJldHVybiBmdW5jdGlvbiBzcGxpdF9yZWdleChzdHIvKjpzdHJpbmcqLywgcmUsIGRlZi8qOnN0cmluZyovKS8qOkFycmF5PHN0cmluZz4qLyB7XG5cdFx0aWYoc2FmZV9zcGxpdF9yZWdleCB8fCB0eXBlb2YgcmUgPT0gXCJzdHJpbmdcIikgcmV0dXJuIHN0ci5zcGxpdChyZSk7XG5cdFx0dmFyIHAgPSBzdHIuc3BsaXQocmUpLCBvID0gW3BbMF1dO1xuXHRcdGZvcih2YXIgaSA9IDE7IGkgPCBwLmxlbmd0aDsgKytpKSB7IG8ucHVzaChkZWYpOyBvLnB1c2gocFtpXSk7IH1cblx0XHRyZXR1cm4gbztcblx0fTtcbn0pKCk7XG5mdW5jdGlvbiBnZXRkYXRhc3RyKGRhdGEpLyo6P3N0cmluZyovIHtcblx0aWYoIWRhdGEpIHJldHVybiBudWxsO1xuXHRpZihkYXRhLmNvbnRlbnQgJiYgZGF0YS50eXBlKSByZXR1cm4gY2Myc3RyKGRhdGEuY29udGVudCwgdHJ1ZSk7XG5cdGlmKGRhdGEuZGF0YSkgcmV0dXJuIGRlYm9tKGRhdGEuZGF0YSk7XG5cdGlmKGRhdGEuYXNOb2RlQnVmZmVyICYmIGhhc19idWYpIHJldHVybiBkZWJvbShkYXRhLmFzTm9kZUJ1ZmZlcigpLnRvU3RyaW5nKCdiaW5hcnknKSk7XG5cdGlmKGRhdGEuYXNCaW5hcnkpIHJldHVybiBkZWJvbShkYXRhLmFzQmluYXJ5KCkpO1xuXHRpZihkYXRhLl9kYXRhICYmIGRhdGEuX2RhdGEuZ2V0Q29udGVudCkgcmV0dXJuIGRlYm9tKGNjMnN0cihBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkYXRhLl9kYXRhLmdldENvbnRlbnQoKSwwKSkpO1xuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0ZGF0YWJpbihkYXRhKSB7XG5cdGlmKCFkYXRhKSByZXR1cm4gbnVsbDtcblx0aWYoZGF0YS5kYXRhKSByZXR1cm4gY2hhcl9jb2RlcyhkYXRhLmRhdGEpO1xuXHRpZihkYXRhLmFzTm9kZUJ1ZmZlciAmJiBoYXNfYnVmKSByZXR1cm4gZGF0YS5hc05vZGVCdWZmZXIoKTtcblx0aWYoZGF0YS5fZGF0YSAmJiBkYXRhLl9kYXRhLmdldENvbnRlbnQpIHtcblx0XHR2YXIgbyA9IGRhdGEuX2RhdGEuZ2V0Q29udGVudCgpO1xuXHRcdGlmKHR5cGVvZiBvID09IFwic3RyaW5nXCIpIHJldHVybiBjaGFyX2NvZGVzKG8pO1xuXHRcdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvKTtcblx0fVxuXHRpZihkYXRhLmNvbnRlbnQgJiYgZGF0YS50eXBlKSByZXR1cm4gZGF0YS5jb250ZW50O1xuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0ZGF0YShkYXRhKSB7IHJldHVybiAoZGF0YSAmJiBkYXRhLm5hbWUuc2xpY2UoLTQpID09PSBcIi5iaW5cIikgPyBnZXRkYXRhYmluKGRhdGEpIDogZ2V0ZGF0YXN0cihkYXRhKTsgfVxuXG4vKiBQYXJ0IDIgU2VjdGlvbiAxMC4xLjIgXCJNYXBwaW5nIENvbnRlbnQgVHlwZXNcIiBOYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSAqL1xuLyogT0FTSVMgZG9lcyBub3QgY29tbWVudCBvbiBmaWxlbmFtZSBjYXNlIHNlbnNpdGl2aXR5ICovXG5mdW5jdGlvbiBzYWZlZ2V0emlwZmlsZSh6aXAsIGZpbGUvKjpzdHJpbmcqLykge1xuXHR2YXIgayA9IHppcC5GdWxsUGF0aHMgfHwga2V5cyh6aXAuZmlsZXMpO1xuXHR2YXIgZiA9IGZpbGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXFwvXS9nLCAnXFxcXCcpLCBnID0gZi5yZXBsYWNlKC9cXFxcL2csJ1xcLycpO1xuXHRmb3IodmFyIGk9MDsgaTxrLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIG4gPSBrW2ldLnJlcGxhY2UoL15Sb290IEVudHJ5W1xcL10vLFwiXCIpLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYoZiA9PSBuIHx8IGcgPT0gbikgcmV0dXJuIHppcC5maWxlcyA/IHppcC5maWxlc1trW2ldXSA6IHppcC5GaWxlSW5kZXhbaV07XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldHppcGZpbGUoemlwLCBmaWxlLyo6c3RyaW5nKi8pIHtcblx0dmFyIG8gPSBzYWZlZ2V0emlwZmlsZSh6aXAsIGZpbGUpO1xuXHRpZihvID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGZpbGUgXCIgKyBmaWxlICsgXCIgaW4gemlwXCIpO1xuXHRyZXR1cm4gbztcbn1cblxuZnVuY3Rpb24gZ2V0emlwZGF0YSh6aXAsIGZpbGUvKjpzdHJpbmcqLywgc2FmZS8qOj9ib29sZWFuKi8pLyo6YW55Ki8ge1xuXHRpZighc2FmZSkgcmV0dXJuIGdldGRhdGEoZ2V0emlwZmlsZSh6aXAsIGZpbGUpKTtcblx0aWYoIWZpbGUpIHJldHVybiBudWxsO1xuXHR0cnkgeyByZXR1cm4gZ2V0emlwZGF0YSh6aXAsIGZpbGUpOyB9IGNhdGNoKGUpIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gZ2V0emlwc3RyKHppcCwgZmlsZS8qOnN0cmluZyovLCBzYWZlLyo6P2Jvb2xlYW4qLykvKjo/c3RyaW5nKi8ge1xuXHRpZighc2FmZSkgcmV0dXJuIGdldGRhdGFzdHIoZ2V0emlwZmlsZSh6aXAsIGZpbGUpKTtcblx0aWYoIWZpbGUpIHJldHVybiBudWxsO1xuXHR0cnkgeyByZXR1cm4gZ2V0emlwc3RyKHppcCwgZmlsZSk7IH0gY2F0Y2goZSkgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBnZXR6aXBiaW4oemlwLCBmaWxlLyo6c3RyaW5nKi8sIHNhZmUvKjo/Ym9vbGVhbiovKS8qOmFueSovIHtcblx0aWYoIXNhZmUpIHJldHVybiBnZXRkYXRhYmluKGdldHppcGZpbGUoemlwLCBmaWxlKSk7XG5cdGlmKCFmaWxlKSByZXR1cm4gbnVsbDtcblx0dHJ5IHsgcmV0dXJuIGdldHppcGJpbih6aXAsIGZpbGUpOyB9IGNhdGNoKGUpIHsgcmV0dXJuIG51bGw7IH1cbn1cblxuZnVuY3Rpb24gemlwZW50cmllcyh6aXApIHtcblx0dmFyIGsgPSB6aXAuRnVsbFBhdGhzIHx8IGtleXMoemlwLmZpbGVzKSwgbyA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgay5sZW5ndGg7ICsraSkgaWYoa1tpXS5zbGljZSgtMSkgIT0gJy8nKSBvLnB1c2goa1tpXS5yZXBsYWNlKC9eUm9vdCBFbnRyeVtcXC9dLywgXCJcIikpO1xuXHRyZXR1cm4gby5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIHppcF9hZGRfZmlsZSh6aXAsIHBhdGgsIGNvbnRlbnQpIHtcblx0aWYoemlwLkZ1bGxQYXRocykge1xuXHRcdGlmKHR5cGVvZiBjb250ZW50ID09IFwic3RyaW5nXCIpIHtcblx0XHRcdHZhciByZXM7XG5cdFx0XHRpZihoYXNfYnVmKSByZXMgPSBCdWZmZXJfZnJvbShjb250ZW50KTtcblx0XHRcdC8qIFRPRE86IGludmVzdGlnYXRlIHBlcmZvcm1hbmNlIGluIEVkZ2UgMTMgKi9cblx0XHRcdC8vZWxzZSBpZih0eXBlb2YgVGV4dEVuY29kZXIgIT09IFwidW5kZWZpbmVkXCIpIHJlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjb250ZW50KTtcblx0XHRcdGVsc2UgcmVzID0gdXRmOGRlY29kZShjb250ZW50KTtcblx0XHRcdHJldHVybiBDRkIudXRpbHMuY2ZiX2FkZCh6aXAsIHBhdGgsIHJlcyk7XG5cdFx0fVxuXHRcdENGQi51dGlscy5jZmJfYWRkKHppcCwgcGF0aCwgY29udGVudCk7XG5cdH1cblx0ZWxzZSB6aXAuZmlsZShwYXRoLCBjb250ZW50KTtcbn1cblxuZnVuY3Rpb24gemlwX25ldygpIHsgcmV0dXJuIENGQi51dGlscy5jZmJfbmV3KCk7IH1cblxuZnVuY3Rpb24gemlwX3JlYWQoZCwgbykge1xuXHRzd2l0Y2goby50eXBlKSB7XG5cdFx0Y2FzZSBcImJhc2U2NFwiOiByZXR1cm4gQ0ZCLnJlYWQoZCwgeyB0eXBlOiBcImJhc2U2NFwiIH0pO1xuXHRcdGNhc2UgXCJiaW5hcnlcIjogcmV0dXJuIENGQi5yZWFkKGQsIHsgdHlwZTogXCJiaW5hcnlcIiB9KTtcblx0XHRjYXNlIFwiYnVmZmVyXCI6IGNhc2UgXCJhcnJheVwiOiByZXR1cm4gQ0ZCLnJlYWQoZCwgeyB0eXBlOiBcImJ1ZmZlclwiIH0pO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgby50eXBlKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZV9wYXRoKHBhdGgvKjpzdHJpbmcqLywgYmFzZS8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0aWYocGF0aC5jaGFyQXQoMCkgPT0gXCIvXCIpIHJldHVybiBwYXRoLnNsaWNlKDEpO1xuXHR2YXIgcmVzdWx0ID0gYmFzZS5zcGxpdCgnLycpO1xuXHRpZihiYXNlLnNsaWNlKC0xKSAhPSBcIi9cIikgcmVzdWx0LnBvcCgpOyAvLyBmb2xkZXIgcGF0aFxuXHR2YXIgdGFyZ2V0ID0gcGF0aC5zcGxpdCgnLycpO1xuXHR3aGlsZSAodGFyZ2V0Lmxlbmd0aCAhPT0gMCkge1xuXHRcdHZhciBzdGVwID0gdGFyZ2V0LnNoaWZ0KCk7XG5cdFx0aWYgKHN0ZXAgPT09ICcuLicpIHJlc3VsdC5wb3AoKTtcblx0XHRlbHNlIGlmIChzdGVwICE9PSAnLicpIHJlc3VsdC5wdXNoKHN0ZXApO1xuXHR9XG5cdHJldHVybiByZXN1bHQuam9pbignLycpO1xufVxudmFyIFhNTF9IRUFERVIgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/Plxcclxcbic7XG52YXIgYXR0cmVnZXhnPS8oW15cIlxccz8+XFwvXSspXFxzKj1cXHMqKCg/OlwiKShbXlwiXSopKD86XCIpfCg/OicpKFteJ10qKSg/OicpfChbXidcIj5cXHNdKykpL2c7XG52YXIgdGFncmVnZXgxPS88W1xcL1xcP10/W2EtekEtWjAtOTpfLV0rKD86XFxzK1teXCJcXHM/PlxcL10rXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteJ1wiPlxccz1dKykpKlxccypbXFwvXFw/XT8+L21nLCB0YWdyZWdleDIgPSAvPFtePl0qPi9nO1xudmFyIHRhZ3JlZ2V4ID0gLyojX19QVVJFX18qL1hNTF9IRUFERVIubWF0Y2godGFncmVnZXgxKSA/IHRhZ3JlZ2V4MSA6IHRhZ3JlZ2V4MjtcbnZhciBuc3JlZ2V4PS88XFx3KjovLCBuc3JlZ2V4MiA9IC88KFxcLz8pXFx3KzovO1xuZnVuY3Rpb24gcGFyc2V4bWx0YWcodGFnLyo6c3RyaW5nKi8sIHNraXBfcm9vdC8qOj9ib29sZWFuKi8sIHNraXBfTEMvKjo/Ym9vbGVhbiovKS8qOmFueSovIHtcblx0dmFyIHogPSAoe30vKjphbnkqLyk7XG5cdHZhciBlcSA9IDAsIGMgPSAwO1xuXHRmb3IoOyBlcSAhPT0gdGFnLmxlbmd0aDsgKytlcSkgaWYoKGMgPSB0YWcuY2hhckNvZGVBdChlcSkpID09PSAzMiB8fCBjID09PSAxMCB8fCBjID09PSAxMykgYnJlYWs7XG5cdGlmKCFza2lwX3Jvb3QpIHpbMF0gPSB0YWcuc2xpY2UoMCwgZXEpO1xuXHRpZihlcSA9PT0gdGFnLmxlbmd0aCkgcmV0dXJuIHo7XG5cdHZhciBtID0gdGFnLm1hdGNoKGF0dHJlZ2V4ZyksIGo9MCwgdj1cIlwiLCBpPTAsIHE9XCJcIiwgY2M9XCJcIiwgcXVvdCA9IDE7XG5cdGlmKG0pIGZvcihpID0gMDsgaSAhPSBtLmxlbmd0aDsgKytpKSB7XG5cdFx0Y2MgPSBtW2ldO1xuXHRcdGZvcihjPTA7IGMgIT0gY2MubGVuZ3RoOyArK2MpIGlmKGNjLmNoYXJDb2RlQXQoYykgPT09IDYxKSBicmVhaztcblx0XHRxID0gY2Muc2xpY2UoMCxjKS50cmltKCk7XG5cdFx0d2hpbGUoY2MuY2hhckNvZGVBdChjKzEpID09IDMyKSArK2M7XG5cdFx0cXVvdCA9ICgoZXE9Y2MuY2hhckNvZGVBdChjKzEpKSA9PSAzNCB8fCBlcSA9PSAzOSkgPyAxIDogMDtcblx0XHR2ID0gY2Muc2xpY2UoYysxK3F1b3QsIGNjLmxlbmd0aC1xdW90KTtcblx0XHRmb3Ioaj0wO2ohPXEubGVuZ3RoOysraikgaWYocS5jaGFyQ29kZUF0KGopID09PSA1OCkgYnJlYWs7XG5cdFx0aWYoaj09PXEubGVuZ3RoKSB7XG5cdFx0XHRpZihxLmluZGV4T2YoXCJfXCIpID4gMCkgcSA9IHEuc2xpY2UoMCwgcS5pbmRleE9mKFwiX1wiKSk7IC8vIGZyb20gb2RzXG5cdFx0XHR6W3FdID0gdjtcblx0XHRcdGlmKCFza2lwX0xDKSB6W3EudG9Mb3dlckNhc2UoKV0gPSB2O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHZhciBrID0gKGo9PT01ICYmIHEuc2xpY2UoMCw1KT09PVwieG1sbnNcIj9cInhtbG5zXCI6XCJcIikrcS5zbGljZShqKzEpO1xuXHRcdFx0aWYoeltrXSAmJiBxLnNsaWNlKGotMyxqKSA9PSBcImV4dFwiKSBjb250aW51ZTsgLy8gZnJvbSBvZHNcblx0XHRcdHpba10gPSB2O1xuXHRcdFx0aWYoIXNraXBfTEMpIHpbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB6O1xufVxuZnVuY3Rpb24gc3RyaXBfbnMoeC8qOnN0cmluZyovKS8qOnN0cmluZyovIHsgcmV0dXJuIHgucmVwbGFjZShuc3JlZ2V4MiwgXCI8JDFcIik7IH1cblxudmFyIGVuY29kaW5ncyA9IHtcblx0JyZxdW90Oyc6ICdcIicsXG5cdCcmYXBvczsnOiBcIidcIixcblx0JyZndDsnOiAnPicsXG5cdCcmbHQ7JzogJzwnLFxuXHQnJmFtcDsnOiAnJidcbn07XG52YXIgcmVuY29kaW5nID0gLyojX19QVVJFX18qL2V2ZXJ0KGVuY29kaW5ncyk7XG4vL3ZhciByZW5jc3RyID0gXCImPD4nXFxcIlwiLnNwbGl0KFwiXCIpO1xuXG4vLyBUT0RPOiBDUCByZW1hcCAobmVlZCB0byByZWFkIGZpbGUgdmVyc2lvbiB0byBkZXRlcm1pbmUgT1MpXG52YXIgdW5lc2NhcGV4bWwvKjpTdHJpbmdDb252Ki8gPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xuXHQvKiAyMi40LjIuNCBic3RyIChCYXNpYyBTdHJpbmcpICovXG5cdHZhciBlbmNyZWdleCA9IC8mKD86cXVvdHxhcG9zfGd0fGx0fGFtcHwjeD8oW1xcZGEtZkEtRl0rKSk7L2lnLCBjb2RlcmVnZXggPSAvX3goW1xcZGEtZkEtRl17NH0pXy9pZztcblx0cmV0dXJuIGZ1bmN0aW9uIHVuZXNjYXBleG1sKHRleHQvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdFx0dmFyIHMgPSB0ZXh0ICsgJycsIGkgPSBzLmluZGV4T2YoXCI8IVtDREFUQVtcIik7XG5cdFx0aWYoaSA9PSAtMSkgcmV0dXJuIHMucmVwbGFjZShlbmNyZWdleCwgZnVuY3Rpb24oJCQsICQxKSB7IHJldHVybiBlbmNvZGluZ3NbJCRdfHxTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KCQxLCQkLmluZGV4T2YoXCJ4XCIpPi0xPzE2OjEwKSl8fCQkOyB9KS5yZXBsYWNlKGNvZGVyZWdleCxmdW5jdGlvbihtLGMpIHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChjLDE2KSk7fSk7XG5cdFx0dmFyIGogPSBzLmluZGV4T2YoXCJdXT5cIik7XG5cdFx0cmV0dXJuIHVuZXNjYXBleG1sKHMuc2xpY2UoMCwgaSkpICsgcy5zbGljZShpKzksaikgKyB1bmVzY2FwZXhtbChzLnNsaWNlKGorMykpO1xuXHR9O1xufSkoKTtcblxudmFyIGRlY3JlZ2V4PS9bJjw+J1wiXS9nLCBjaGFyZWdleCA9IC9bXFx1MDAwMC1cXHUwMDA4XFx1MDAwYi1cXHUwMDFmXS9nO1xuZnVuY3Rpb24gZXNjYXBleG1sKHRleHQvKjpzdHJpbmcqLykvKjpzdHJpbmcqL3tcblx0dmFyIHMgPSB0ZXh0ICsgJyc7XG5cdHJldHVybiBzLnJlcGxhY2UoZGVjcmVnZXgsIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHJlbmNvZGluZ1t5XTsgfSkucmVwbGFjZShjaGFyZWdleCxmdW5jdGlvbihzKSB7IHJldHVybiBcIl94XCIgKyAoXCIwMDBcIitzLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCkgKyBcIl9cIjt9KTtcbn1cbmZ1bmN0aW9uIGVzY2FwZXhtbHRhZyh0ZXh0Lyo6c3RyaW5nKi8pLyo6c3RyaW5nKi97IHJldHVybiBlc2NhcGV4bWwodGV4dCkucmVwbGFjZSgvIC9nLFwiX3gwMDIwX1wiKTsgfVxuXG52YXIgaHRtbGNoYXJlZ2V4ID0gL1tcXHUwMDAwLVxcdTAwMWZdL2c7XG5mdW5jdGlvbiBlc2NhcGVodG1sKHRleHQvKjpzdHJpbmcqLykvKjpzdHJpbmcqL3tcblx0dmFyIHMgPSB0ZXh0ICsgJyc7XG5cdHJldHVybiBzLnJlcGxhY2UoZGVjcmVnZXgsIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHJlbmNvZGluZ1t5XTsgfSkucmVwbGFjZSgvXFxuL2csIFwiPGJyLz5cIikucmVwbGFjZShodG1sY2hhcmVnZXgsZnVuY3Rpb24ocykgeyByZXR1cm4gXCImI3hcIiArIChcIjAwMFwiK3MuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KSArIFwiO1wiOyB9KTtcbn1cblxuZnVuY3Rpb24gZXNjYXBleGxtbCh0ZXh0Lyo6c3RyaW5nKi8pLyo6c3RyaW5nKi97XG5cdHZhciBzID0gdGV4dCArICcnO1xuXHRyZXR1cm4gcy5yZXBsYWNlKGRlY3JlZ2V4LCBmdW5jdGlvbih5KSB7IHJldHVybiByZW5jb2RpbmdbeV07IH0pLnJlcGxhY2UoaHRtbGNoYXJlZ2V4LGZ1bmN0aW9uKHMpIHsgcmV0dXJuIFwiJiN4XCIgKyAocy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKSArIFwiO1wiOyB9KTtcbn1cblxuLyogVE9ETzogaGFuZGxlIGNvZGVwYWdlcyAqL1xudmFyIHhsbWxfZml4c3RyLyo6U3RyaW5nQ29udiovID0gLyojX19QVVJFX18qLyhmdW5jdGlvbigpIHtcblx0dmFyIGVudHJlZ2V4ID0gLyYjKFxcZCspOy9nO1xuXHRmdW5jdGlvbiBlbnRyZXBsKCQkLyo6c3RyaW5nKi8sJDEvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KCQxLDEwKSk7IH1cblx0cmV0dXJuIGZ1bmN0aW9uIHhsbWxfZml4c3RyKHN0ci8qOnN0cmluZyovKS8qOnN0cmluZyovIHsgcmV0dXJuIHN0ci5yZXBsYWNlKGVudHJlZ2V4LGVudHJlcGwpOyB9O1xufSkoKTtcbmZ1bmN0aW9uIHhsbWxfdW5maXhzdHIoc3RyLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8geyByZXR1cm4gc3RyLnJlcGxhY2UoLyhcXHJcXG58W1xcclxcbl0pL2csXCJcXCYjMTA7XCIpOyB9XG5cbmZ1bmN0aW9uIHBhcnNleG1sYm9vbCh2YWx1ZS8qOmFueSovKS8qOmJvb2xlYW4qLyB7XG5cdHN3aXRjaCh2YWx1ZSkge1xuXHRcdGNhc2UgMTogY2FzZSB0cnVlOiBjYXNlICcxJzogY2FzZSAndHJ1ZSc6IGNhc2UgJ1RSVUUnOiByZXR1cm4gdHJ1ZTtcblx0XHQvKiBjYXNlICcwJzogY2FzZSAnZmFsc2UnOiBjYXNlICdGQUxTRSc6Ki9cblx0XHRkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXRmOHJlYWRhKG9yaWcvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvdXQgPSBcIlwiLCBpID0gMCwgYyA9IDAsIGQgPSAwLCBlID0gMCwgZiA9IDAsIHcgPSAwO1xuXHR3aGlsZSAoaSA8IG9yaWcubGVuZ3RoKSB7XG5cdFx0YyA9IG9yaWcuY2hhckNvZGVBdChpKyspO1xuXHRcdGlmIChjIDwgMTI4KSB7IG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOyBjb250aW51ZTsgfVxuXHRcdGQgPSBvcmlnLmNoYXJDb2RlQXQoaSsrKTtcblx0XHRpZiAoYz4xOTEgJiYgYzwyMjQpIHsgZiA9ICgoYyAmIDMxKSA8PCA2KTsgZiB8PSAoZCAmIDYzKTsgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZik7IGNvbnRpbnVlOyB9XG5cdFx0ZSA9IG9yaWcuY2hhckNvZGVBdChpKyspO1xuXHRcdGlmIChjIDwgMjQwKSB7IG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDE1KSA8PCAxMikgfCAoKGQgJiA2MykgPDwgNikgfCAoZSAmIDYzKSk7IGNvbnRpbnVlOyB9XG5cdFx0ZiA9IG9yaWcuY2hhckNvZGVBdChpKyspO1xuXHRcdHcgPSAoKChjICYgNykgPDwgMTgpIHwgKChkICYgNjMpIDw8IDEyKSB8ICgoZSAmIDYzKSA8PCA2KSB8IChmICYgNjMpKS02NTUzNjtcblx0XHRvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MDAgKyAoKHc+Pj4xMCkmMTAyMykpO1xuXHRcdG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4REMwMCArICh3JjEwMjMpKTtcblx0fVxuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiB1dGY4cmVhZGIoZGF0YSkge1xuXHR2YXIgb3V0ID0gbmV3X3Jhd19idWYoMipkYXRhLmxlbmd0aCksIHcsIGksIGogPSAxLCBrID0gMCwgd3c9MCwgYztcblx0Zm9yKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrPWopIHtcblx0XHRqID0gMTtcblx0XHRpZigoYz1kYXRhLmNoYXJDb2RlQXQoaSkpIDwgMTI4KSB3ID0gYztcblx0XHRlbHNlIGlmKGMgPCAyMjQpIHsgdyA9IChjJjMxKSo2NCsoZGF0YS5jaGFyQ29kZUF0KGkrMSkmNjMpOyBqPTI7IH1cblx0XHRlbHNlIGlmKGMgPCAyNDApIHsgdz0oYyYxNSkqNDA5NisoZGF0YS5jaGFyQ29kZUF0KGkrMSkmNjMpKjY0KyhkYXRhLmNoYXJDb2RlQXQoaSsyKSY2Myk7IGo9MzsgfVxuXHRcdGVsc2UgeyBqID0gNDtcblx0XHRcdHcgPSAoYyAmIDcpKjI2MjE0NCsoZGF0YS5jaGFyQ29kZUF0KGkrMSkmNjMpKjQwOTYrKGRhdGEuY2hhckNvZGVBdChpKzIpJjYzKSo2NCsoZGF0YS5jaGFyQ29kZUF0KGkrMykmNjMpO1xuXHRcdFx0dyAtPSA2NTUzNjsgd3cgPSAweEQ4MDAgKyAoKHc+Pj4xMCkmMTAyMyk7IHcgPSAweERDMDAgKyAodyYxMDIzKTtcblx0XHR9XG5cdFx0aWYod3cgIT09IDApIHsgb3V0W2srK10gPSB3dyYyNTU7IG91dFtrKytdID0gd3c+Pj44OyB3dyA9IDA7IH1cblx0XHRvdXRbaysrXSA9IHclMjU2OyBvdXRbaysrXSA9IHc+Pj44O1xuXHR9XG5cdHJldHVybiBvdXQuc2xpY2UoMCxrKS50b1N0cmluZygndWNzMicpO1xufVxuXG5mdW5jdGlvbiB1dGY4cmVhZGMoZGF0YSkgeyByZXR1cm4gQnVmZmVyX2Zyb20oZGF0YSwgJ2JpbmFyeScpLnRvU3RyaW5nKCd1dGY4Jyk7IH1cblxudmFyIHV0Zjhjb3JwdXMgPSBcImZvbyBiYXIgYmF6XFx1MDBlMlxcdTAwOThcXHUwMDgzXFx1MDBmMFxcdTAwOWZcXHUwMDhkXFx1MDBhM1wiO1xudmFyIHV0ZjhyZWFkID0gaGFzX2J1ZiAmJiAoLyojX19QVVJFX18qL3V0ZjhyZWFkYyh1dGY4Y29ycHVzKSA9PSAvKiNfX1BVUkVfXyovdXRmOHJlYWRhKHV0Zjhjb3JwdXMpICYmIHV0ZjhyZWFkYyB8fCAvKiNfX1BVUkVfXyovdXRmOHJlYWRiKHV0Zjhjb3JwdXMpID09IC8qI19fUFVSRV9fKi91dGY4cmVhZGEodXRmOGNvcnB1cykgJiYgdXRmOHJlYWRiKSB8fCB1dGY4cmVhZGE7XG5cbnZhciB1dGY4d3JpdGUvKjpTdHJpbmdDb252Ki8gPSBoYXNfYnVmID8gZnVuY3Rpb24oZGF0YSkgeyByZXR1cm4gQnVmZmVyX2Zyb20oZGF0YSwgJ3V0ZjgnKS50b1N0cmluZyhcImJpbmFyeVwiKTsgfSA6IGZ1bmN0aW9uKG9yaWcvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvdXQvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXSwgaSA9IDAsIGMgPSAwLCBkID0gMDtcblx0d2hpbGUoaSA8IG9yaWcubGVuZ3RoKSB7XG5cdFx0YyA9IG9yaWcuY2hhckNvZGVBdChpKyspO1xuXHRcdHN3aXRjaCh0cnVlKSB7XG5cdFx0XHRjYXNlIGMgPCAxMjg6IG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYykpOyBicmVhaztcblx0XHRcdGNhc2UgYyA8IDIwNDg6XG5cdFx0XHRcdG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMTkyICsgKGMgPj4gNikpKTtcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxMjggKyAoYyAmIDYzKSkpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgYyA+PSA1NTI5NiAmJiBjIDwgNTczNDQ6XG5cdFx0XHRcdGMgLT0gNTUyOTY7IGQgPSBvcmlnLmNoYXJDb2RlQXQoaSsrKSAtIDU2MzIwICsgKGM8PDEwKTtcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgyNDAgKyAoKGQgPj4xOCkgJiA3KSkpO1xuXHRcdFx0XHRvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDE0NCArICgoZCA+PjEyKSAmIDYzKSkpO1xuXHRcdFx0XHRvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDEyOCArICgoZCA+PiA2KSAmIDYzKSkpO1xuXHRcdFx0XHRvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDEyOCArIChkICYgNjMpKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgyMjQgKyAoYyA+PiAxMikpKTtcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxMjggKyAoKGMgPj4gNikgJiA2MykpKTtcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxMjggKyAoYyAmIDYzKSkpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0LmpvaW4oXCJcIik7XG59O1xuXG4vLyBtYXRjaGVzIDxmb28+Li4uPC9mb28+IGV4dHJhY3RzIGNvbnRlbnRcbnZhciBtYXRjaHRhZyA9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24oKSB7XG5cdHZhciBtdGNhY2hlLyo6e1trOnN0cmluZ106UmVnRXhwfSovID0gKHt9Lyo6YW55Ki8pO1xuXHRyZXR1cm4gZnVuY3Rpb24gbWF0Y2h0YWcoZi8qOnN0cmluZyovLGcvKjo/c3RyaW5nKi8pLyo6UmVnRXhwKi8ge1xuXHRcdHZhciB0ID0gZitcInxcIisoZ3x8XCJcIik7XG5cdFx0aWYobXRjYWNoZVt0XSkgcmV0dXJuIG10Y2FjaGVbdF07XG5cdFx0cmV0dXJuIChtdGNhY2hlW3RdID0gbmV3IFJlZ0V4cCgnPCg/OlxcXFx3KzopPycrZisnKD86IHhtbDpzcGFjZT1cInByZXNlcnZlXCIpPyg/OltePl0qKT4oW1xcXFxzXFxcXFNdKj8pPC8oPzpcXFxcdys6KT8nK2YrJz4nLCgoZ3x8XCJcIikvKjphbnkqLykpKTtcblx0fTtcbn0pKCk7XG5cbnZhciBodG1sZGVjb2RlLyo6eyhzOnN0cmluZyk6c3RyaW5nfSovID0gLyojX19QVVJFX18qLyhmdW5jdGlvbigpIHtcblx0dmFyIGVudGl0aWVzLyo6QXJyYXk8W1JlZ0V4cCwgc3RyaW5nXT4qLyA9IFtcblx0XHRbJ25ic3AnLCAnICddLCBbJ21pZGRvdCcsICfCtyddLFxuXHRcdFsncXVvdCcsICdcIiddLCBbJ2Fwb3MnLCBcIidcIl0sIFsnZ3QnLCAgICc+J10sIFsnbHQnLCAgICc8J10sIFsnYW1wJywgICcmJ11cblx0XS5tYXAoZnVuY3Rpb24oeC8qOltzdHJpbmcsIHN0cmluZ10qLykgeyByZXR1cm4gW25ldyBSZWdFeHAoJyYnICsgeFswXSArICc7JywgXCJpZ1wiKSwgeFsxXV07IH0pO1xuXHRyZXR1cm4gZnVuY3Rpb24gaHRtbGRlY29kZShzdHIvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdFx0dmFyIG8gPSBzdHJcblx0XHRcdFx0Ly8gUmVtb3ZlIG5ldyBsaW5lcyBhbmQgc3BhY2VzIGZyb20gc3RhcnQgb2YgY29udGVudFxuXHRcdFx0XHQucmVwbGFjZSgvXltcXHRcXG5cXHIgXSsvLCBcIlwiKVxuXHRcdFx0XHQvLyBSZW1vdmUgbmV3IGxpbmVzIGFuZCBzcGFjZXMgZnJvbSBlbmQgb2YgY29udGVudFxuXHRcdFx0XHQucmVwbGFjZSgvW1xcdFxcblxcciBdKyQvLFwiXCIpXG5cdFx0XHRcdC8vIEFkZGVkIGxpbmUgd2hpY2ggcmVtb3ZlcyBhbnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyBhZnRlciBhbmQgYmVmb3JlIGh0bWwgdGFnc1xuXHRcdFx0XHQucmVwbGFjZSgvPlxccysvZyxcIj5cIikucmVwbGFjZSgvXFxzKzwvZyxcIjxcIilcblx0XHRcdFx0Ly8gUmVwbGFjZSByZW1haW5pbmcgbmV3IGxpbmVzIGFuZCBzcGFjZXMgd2l0aCBzcGFjZVxuXHRcdFx0XHQucmVwbGFjZSgvW1xcdFxcblxcciBdKy9nLCBcIiBcIilcblx0XHRcdFx0Ly8gUmVwbGFjZSA8YnI+IHRhZ3Mgd2l0aCBuZXcgbGluZXNcblx0XHRcdFx0LnJlcGxhY2UoLzxcXHMqW2JCXVtyUl1cXHMqXFwvPz4vZyxcIlxcblwiKVxuXHRcdFx0XHQvLyBTdHJpcCBIVE1MIGVsZW1lbnRzXG5cdFx0XHRcdC5yZXBsYWNlKC88W14+XSo+L2csXCJcIik7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgKytpKSBvID0gby5yZXBsYWNlKGVudGl0aWVzW2ldWzBdLCBlbnRpdGllc1tpXVsxXSk7XG5cdFx0cmV0dXJuIG87XG5cdH07XG59KSgpO1xuXG52YXIgdnRyZWdleCA9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24oKXsgdmFyIHZ0X2NhY2hlID0ge307XG5cdHJldHVybiBmdW5jdGlvbiB2dF9yZWdleChidCkge1xuXHRcdGlmKHZ0X2NhY2hlW2J0XSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdnRfY2FjaGVbYnRdO1xuXHRcdHJldHVybiAodnRfY2FjaGVbYnRdID0gbmV3IFJlZ0V4cChcIjwoPzp2dDopP1wiICsgYnQgKyBcIj4oW1xcXFxzXFxcXFNdKj8pPC8oPzp2dDopP1wiICsgYnQgKyBcIj5cIiwgJ2cnKSApO1xufTt9KSgpO1xudmFyIHZ0dnJlZ2V4ID0gLzxcXC8/KD86dnQ6KT92YXJpYW50Pi9nLCB2dG1yZWdleCA9IC88KD86dnQ6KShbXj5dKik+KFtcXHNcXFNdKik8LztcbmZ1bmN0aW9uIHBhcnNlVmVjdG9yKGRhdGEvKjpzdHJpbmcqLywgb3B0cykvKjpBcnJheTx7djpzdHJpbmcsdDpzdHJpbmd9PiovIHtcblx0dmFyIGggPSBwYXJzZXhtbHRhZyhkYXRhKTtcblxuXHR2YXIgbWF0Y2hlcy8qOkFycmF5PHN0cmluZz4qLyA9IGRhdGEubWF0Y2godnRyZWdleChoLmJhc2VUeXBlKSl8fFtdO1xuXHR2YXIgcmVzLyo6QXJyYXk8YW55PiovID0gW107XG5cdGlmKG1hdGNoZXMubGVuZ3RoICE9IGguc2l6ZSkge1xuXHRcdGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmV4cGVjdGVkIHZlY3RvciBsZW5ndGggXCIgKyBtYXRjaGVzLmxlbmd0aCArIFwiICE9IFwiICsgaC5zaXplKTtcblx0XHRyZXR1cm4gcmVzO1xuXHR9XG5cdG1hdGNoZXMuZm9yRWFjaChmdW5jdGlvbih4Lyo6c3RyaW5nKi8pIHtcblx0XHR2YXIgdiA9IHgucmVwbGFjZSh2dHZyZWdleCxcIlwiKS5tYXRjaCh2dG1yZWdleCk7XG5cdFx0aWYodikgcmVzLnB1c2goe3Y6dXRmOHJlYWQodlsyXSksIHQ6dlsxXX0pO1xuXHR9KTtcblx0cmV0dXJuIHJlcztcbn1cblxudmFyIHd0cmVnZXggPSAvKF5cXHN8XFxzJHxcXG4pLztcbmZ1bmN0aW9uIHdyaXRldGFnKGYvKjpzdHJpbmcqLyxnLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8geyByZXR1cm4gJzwnICsgZiArIChnLm1hdGNoKHd0cmVnZXgpPycgeG1sOnNwYWNlPVwicHJlc2VydmVcIicgOiBcIlwiKSArICc+JyArIGcgKyAnPC8nICsgZiArICc+JzsgfVxuXG5mdW5jdGlvbiB3eHRfaGVscGVyKGgpLyo6c3RyaW5nKi8geyByZXR1cm4ga2V5cyhoKS5tYXAoZnVuY3Rpb24oaykgeyByZXR1cm4gXCIgXCIgKyBrICsgJz1cIicgKyBoW2tdICsgJ1wiJzt9KS5qb2luKFwiXCIpOyB9XG5mdW5jdGlvbiB3cml0ZXh0YWcoZi8qOnN0cmluZyovLGcvKjo/c3RyaW5nKi8saCkgeyByZXR1cm4gJzwnICsgZiArICgoaCAhPSBudWxsKSA/IHd4dF9oZWxwZXIoaCkgOiBcIlwiKSArICgoZyAhPSBudWxsKSA/IChnLm1hdGNoKHd0cmVnZXgpPycgeG1sOnNwYWNlPVwicHJlc2VydmVcIicgOiBcIlwiKSArICc+JyArIGcgKyAnPC8nICsgZiA6IFwiL1wiKSArICc+Jzt9XG5cbmZ1bmN0aW9uIHdyaXRlX3czY2R0ZihkLyo6RGF0ZSovLCB0Lyo6P2Jvb2xlYW4qLykvKjpzdHJpbmcqLyB7IHRyeSB7IHJldHVybiBkLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkKi8sXCJcIik7IH0gY2F0Y2goZSkgeyBpZih0KSB0aHJvdyBlOyB9IHJldHVybiBcIlwiOyB9XG5cbmZ1bmN0aW9uIHdyaXRlX3Z0KHMsIHhsc3gvKjo/Ym9vbGVhbiovKS8qOnN0cmluZyovIHtcblx0c3dpdGNoKHR5cGVvZiBzKSB7XG5cdFx0Y2FzZSAnc3RyaW5nJzpcblx0XHRcdHZhciBvID0gd3JpdGV4dGFnKCd2dDpscHdzdHInLCBlc2NhcGV4bWwocykpO1xuXHRcdFx0aWYoeGxzeCkgbyA9IG8ucmVwbGFjZSgvJnF1b3Q7L2csIFwiX3gwMDIyX1wiKTtcblx0XHRcdHJldHVybiBvO1xuXHRcdGNhc2UgJ251bWJlcic6IHJldHVybiB3cml0ZXh0YWcoKHN8MCk9PXM/J3Z0Omk0JzondnQ6cjgnLCBlc2NhcGV4bWwoU3RyaW5nKHMpKSk7XG5cdFx0Y2FzZSAnYm9vbGVhbic6IHJldHVybiB3cml0ZXh0YWcoJ3Z0OmJvb2wnLHM/J3RydWUnOidmYWxzZScpO1xuXHR9XG5cdGlmKHMgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gd3JpdGV4dGFnKCd2dDpmaWxldGltZScsIHdyaXRlX3czY2R0ZihzKSk7XG5cdHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBzZXJpYWxpemUgXCIgKyBzKTtcbn1cblxuZnVuY3Rpb24geGxtbF9ub3JtYWxpemUoZCkvKjpzdHJpbmcqLyB7XG5cdGlmKGhhc19idWYgJiYvKjo6dHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkICE9IG51bGwgJiYgZCBpbnN0YW5jZW9mIEJ1ZmZlciAmJiovIEJ1ZmZlci5pc0J1ZmZlcihkKSkgcmV0dXJuIGQudG9TdHJpbmcoJ3V0ZjgnKTtcblx0aWYodHlwZW9mIGQgPT09ICdzdHJpbmcnKSByZXR1cm4gZDtcblx0LyogZHVrdGFwZSAqL1xuXHRpZih0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiB1dGY4cmVhZChhMnMoYWIyYShkKSkpO1xuXHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgaW5wdXQgZm9ybWF0OiBleHBlY3RlZCBCdWZmZXIgb3Igc3RyaW5nXCIpO1xufVxuLyogVU9TIHVzZXMgQ0pLIGluIHRhZ3MgKi9cbnZhciB4bG1scmVnZXggPSAvPChcXC8/KShbXlxccz8+PCFcXC86XSo6fCkoW15cXHM/PD46XFwvXSspKD86W1xccz86XFwvXVtePl0qKT8+L21nO1xuLy92YXIgeGxtbHJlZ2V4ID0gLzwoXFwvPykoW2EtejAtOV0qOnwpKFxcdyspW14+XSo+L21nO1xuXG52YXIgWE1MTlMgPSAoe1xuXHRDT1JFX1BST1BTOiAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9tZXRhZGF0YS9jb3JlLXByb3BlcnRpZXMnLFxuXHRDVVNUX1BST1BTOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2N1c3RvbS1wcm9wZXJ0aWVzXCIsXG5cdEVYVF9QUk9QUzogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9leHRlbmRlZC1wcm9wZXJ0aWVzXCIsXG5cdENUOiAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzJyxcblx0UkVMUzogJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcycsXG5cdFRDTU5UOiAnaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDE4L3RocmVhZGVkY29tbWVudHMnLFxuXHQnZGMnOiAnaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nLFxuXHQnZGN0ZXJtcyc6ICdodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvJyxcblx0J2RjbWl0eXBlJzogJ2h0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS8nLFxuXHQnbXgnOiAnaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvbWFjL2V4Y2VsLzIwMDgvbWFpbicsXG5cdCdyJzogJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMnLFxuXHQnc2pzJzogJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvc2hlZXRqcy9jb3JlLXByb3BlcnRpZXMnLFxuXHQndnQnOiAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvZG9jUHJvcHNWVHlwZXMnLFxuXHQneHNpJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyxcblx0J3hzZCc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbn0vKjphbnkqLyk7XG5cbnZhciBYTUxOU19tYWluID0gW1xuXHQnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluJyxcblx0J2h0dHA6Ly9wdXJsLm9jbGMub3JnL29veG1sL3NwcmVhZHNoZWV0bWwvbWFpbicsXG5cdCdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9leGNlbC8yMDA2L21haW4nLFxuXHQnaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi8yJ1xuXTtcblxudmFyIFhMTUxOUyA9ICh7XG5cdCdvJzogICAgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZScsXG5cdCd4JzogICAgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOmV4Y2VsJyxcblx0J3NzJzogICAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c3ByZWFkc2hlZXQnLFxuXHQnZHQnOiAgICd1dWlkOkMyRjQxMDEwLTY1QjMtMTFkMS1BMjlGLTAwQUEwMEMxNDg4MicsXG5cdCdtdic6ICAgJ2h0dHA6Ly9tYWNWbWxTY2hlbWFVcmknLFxuXHQndic6ICAgICd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCcsXG5cdCdodG1sJzogJ2h0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAnXG59Lyo6YW55Ki8pO1xuZnVuY3Rpb24gcmVhZF9kb3VibGVfbGUoYi8qOlJhd0J5dGVzfENGQmxvYiovLCBpZHgvKjpudW1iZXIqLykvKjpudW1iZXIqLyB7XG5cdHZhciBzID0gMSAtIDIgKiAoYltpZHggKyA3XSA+Pj4gNyk7XG5cdHZhciBlID0gKChiW2lkeCArIDddICYgMHg3ZikgPDwgNCkgKyAoKGJbaWR4ICsgNl0gPj4+IDQpICYgMHgwZik7XG5cdHZhciBtID0gKGJbaWR4KzZdJjB4MGYpO1xuXHRmb3IodmFyIGkgPSA1OyBpID49IDA7IC0taSkgbSA9IG0gKiAyNTYgKyBiW2lkeCArIGldO1xuXHRpZihlID09IDB4N2ZmKSByZXR1cm4gbSA9PSAwID8gKHMgKiBJbmZpbml0eSkgOiBOYU47XG5cdGlmKGUgPT0gMCkgZSA9IC0xMDIyO1xuXHRlbHNlIHsgZSAtPSAxMDIzOyBtICs9IE1hdGgucG93KDIsNTIpOyB9XG5cdHJldHVybiBzICogTWF0aC5wb3coMiwgZSAtIDUyKSAqIG07XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2RvdWJsZV9sZShiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIHYvKjpudW1iZXIqLywgaWR4Lyo6bnVtYmVyKi8pIHtcblx0dmFyIGJzID0gKCgoKHYgPCAwKSB8fCAoMS92ID09IC1JbmZpbml0eSkpID8gMSA6IDApIDw8IDcpLCBlID0gMCwgbSA9IDA7XG5cdHZhciBhdiA9IGJzID8gKC12KSA6IHY7XG5cdGlmKCFpc0Zpbml0ZShhdikpIHsgZSA9IDB4N2ZmOyBtID0gaXNOYU4odikgPyAweDY5NjkgOiAwOyB9XG5cdGVsc2UgaWYoYXYgPT0gMCkgZSA9IG0gPSAwO1xuXHRlbHNlIHtcblx0XHRlID0gTWF0aC5mbG9vcihNYXRoLmxvZyhhdikgLyBNYXRoLkxOMik7XG5cdFx0bSA9IGF2ICogTWF0aC5wb3coMiwgNTIgLSBlKTtcblx0XHRpZigoZSA8PSAtMTAyMykgJiYgKCFpc0Zpbml0ZShtKSB8fCAobSA8IE1hdGgucG93KDIsNTIpKSkpIHsgZSA9IC0xMDIyOyB9XG5cdFx0ZWxzZSB7IG0gLT0gTWF0aC5wb3coMiw1Mik7IGUrPTEwMjM7IH1cblx0fVxuXHRmb3IodmFyIGkgPSAwOyBpIDw9IDU7ICsraSwgbS89MjU2KSBiW2lkeCArIGldID0gbSAmIDB4ZmY7XG5cdGJbaWR4ICsgNl0gPSAoKGUgJiAweDBmKSA8PCA0KSB8IChtICYgMHhmKTtcblx0YltpZHggKyA3XSA9IChlID4+IDQpIHwgYnM7XG59XG5cbnZhciBfX190b0J1ZmZlciA9IGZ1bmN0aW9uKGJ1ZnMvKjpBcnJheTxBcnJheTxSYXdCeXRlcz4gPiovKS8qOlJhd0J5dGVzKi8geyB2YXIgeD1bXSx3PTEwMjQwOyBmb3IodmFyIGk9MDtpPGJ1ZnNbMF0ubGVuZ3RoOysraSkgaWYoYnVmc1swXVtpXSkgZm9yKHZhciBqPTAsTD1idWZzWzBdW2ldLmxlbmd0aDtqPEw7ais9dykgeC5wdXNoLmFwcGx5KHgsIGJ1ZnNbMF1baV0uc2xpY2UoaixqK3cpKTsgcmV0dXJuIHg7IH07XG52YXIgX190b0J1ZmZlciA9IGhhc19idWYgPyBmdW5jdGlvbihidWZzKSB7IHJldHVybiAoYnVmc1swXS5sZW5ndGggPiAwICYmIEJ1ZmZlci5pc0J1ZmZlcihidWZzWzBdWzBdKSkgPyBCdWZmZXIuY29uY2F0KGJ1ZnNbMF0ubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcih4KSA/IHggOiBCdWZmZXJfZnJvbSh4KTsgfSkpIDogX19fdG9CdWZmZXIoYnVmcyk7fSA6IF9fX3RvQnVmZmVyO1xuXG52YXIgX19fdXRmMTZsZSA9IGZ1bmN0aW9uKGIvKjpSYXdCeXRlc3xDRkJsb2IqLyxzLyo6bnVtYmVyKi8sZS8qOm51bWJlciovKS8qOnN0cmluZyovIHsgdmFyIHNzLyo6QXJyYXk8c3RyaW5nPiovPVtdOyBmb3IodmFyIGk9czsgaTxlOyBpKz0yKSBzcy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoX19yZWFkVUludDE2TEUoYixpKSkpOyByZXR1cm4gc3Muam9pbihcIlwiKS5yZXBsYWNlKGNocjAsJycpOyB9O1xudmFyIF9fdXRmMTZsZSA9IGhhc19idWYgPyBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8scy8qOm51bWJlciovLGUvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7IGlmKCFCdWZmZXIuaXNCdWZmZXIoYikvKjo6IHx8ICEoYiBpbnN0YW5jZW9mIEJ1ZmZlcikqLykgcmV0dXJuIF9fX3V0ZjE2bGUoYixzLGUpOyByZXR1cm4gYi50b1N0cmluZygndXRmMTZsZScscyxlKS5yZXBsYWNlKGNocjAsJycpLyoucmVwbGFjZShjaHIxLCchJykqLzsgfSA6IF9fX3V0ZjE2bGU7XG5cbnZhciBfX19oZXhsaWZ5ID0gZnVuY3Rpb24oYi8qOlJhd0J5dGVzfENGQmxvYiovLHMvKjpudW1iZXIqLyxsLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi8geyB2YXIgc3MvKjpBcnJheTxzdHJpbmc+Ki89W107IGZvcih2YXIgaT1zOyBpPHMrbDsgKytpKSBzcy5wdXNoKChcIjBcIiArIGJbaV0udG9TdHJpbmcoMTYpKS5zbGljZSgtMikpOyByZXR1cm4gc3Muam9pbihcIlwiKTsgfTtcbnZhciBfX2hleGxpZnkgPSBoYXNfYnVmID8gZnVuY3Rpb24oYi8qOlJhd0J5dGVzfENGQmxvYiovLHMvKjpudW1iZXIqLyxsLyo6bnVtYmVyKi8pLyo6c3RyaW5nKi8geyByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGIpLyo6OiAmJiBiIGluc3RhbmNlb2YgQnVmZmVyKi8gPyBiLnRvU3RyaW5nKCdoZXgnLHMscytsKSA6IF9fX2hleGxpZnkoYixzLGwpOyB9IDogX19faGV4bGlmeTtcblxudmFyIF9fX3V0ZjggPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8scy8qOm51bWJlciovLGUvKjpudW1iZXIqLykgeyB2YXIgc3M9W107IGZvcih2YXIgaT1zOyBpPGU7IGkrKykgc3MucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKF9fcmVhZFVJbnQ4KGIsaSkpKTsgcmV0dXJuIHNzLmpvaW4oXCJcIik7IH07XG52YXIgX191dGY4ID0gaGFzX2J1ZiA/IGZ1bmN0aW9uIHV0ZjhfYihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIHMvKjpudW1iZXIqLywgZS8qOm51bWJlciovKSB7IHJldHVybiAoQnVmZmVyLmlzQnVmZmVyKGIpLyo6OiAmJiAoYiBpbnN0YW5jZW9mIEJ1ZmZlcikqLykgPyBiLnRvU3RyaW5nKCd1dGY4JyxzLGUpIDogX19fdXRmOChiLHMsZSk7IH0gOiBfX191dGY4O1xuXG52YXIgX19fbHBzdHIgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8saS8qOm51bWJlciovKSB7IHZhciBsZW4gPSBfX3JlYWRVSW50MzJMRShiLGkpOyByZXR1cm4gbGVuID4gMCA/IF9fdXRmOChiLCBpKzQsaSs0K2xlbi0xKSA6IFwiXCI7fTtcbnZhciBfX2xwc3RyID0gX19fbHBzdHI7XG5cbnZhciBfX19jcHN0ciA9IGZ1bmN0aW9uKGIvKjpSYXdCeXRlc3xDRkJsb2IqLyxpLyo6bnVtYmVyKi8pIHsgdmFyIGxlbiA9IF9fcmVhZFVJbnQzMkxFKGIsaSk7IHJldHVybiBsZW4gPiAwID8gX191dGY4KGIsIGkrNCxpKzQrbGVuLTEpIDogXCJcIjt9O1xudmFyIF9fY3BzdHIgPSBfX19jcHN0cjtcblxudmFyIF9fX2xwd3N0ciA9IGZ1bmN0aW9uKGIvKjpSYXdCeXRlc3xDRkJsb2IqLyxpLyo6bnVtYmVyKi8pIHsgdmFyIGxlbiA9IDIqX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyBfX3V0ZjgoYiwgaSs0LGkrNCtsZW4tMSkgOiBcIlwiO307XG52YXIgX19scHdzdHIgPSBfX19scHdzdHI7XG5cbnZhciBfX19scHA0ID0gZnVuY3Rpb24gbHBwNF8oYi8qOlJhd0J5dGVzfENGQmxvYiovLGkvKjpudW1iZXIqLykgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyBfX3V0ZjE2bGUoYiwgaSs0LGkrNCtsZW4pIDogXCJcIjt9O1xudmFyIF9fbHBwNCA9IF9fX2xwcDQ7XG5cbnZhciBfX184bHBwNCA9IGZ1bmN0aW9uKGIvKjpSYXdCeXRlc3xDRkJsb2IqLyxpLyo6bnVtYmVyKi8pIHsgdmFyIGxlbiA9IF9fcmVhZFVJbnQzMkxFKGIsaSk7IHJldHVybiBsZW4gPiAwID8gX191dGY4KGIsIGkrNCxpKzQrbGVuKSA6IFwiXCI7fTtcbnZhciBfXzhscHA0ID0gX19fOGxwcDQ7XG5cbnZhciBfX19kb3VibGUgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIGlkeC8qOm51bWJlciovKSB7IHJldHVybiByZWFkX2RvdWJsZV9sZShiLCBpZHgpO307XG52YXIgX19kb3VibGUgPSBfX19kb3VibGU7XG5cbnZhciBpc19idWYgPSBmdW5jdGlvbiBpc19idWZfYShhKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGEpIHx8ICh0eXBlb2YgVWludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhIGluc3RhbmNlb2YgVWludDhBcnJheSk7IH07XG5cbmlmKGhhc19idWYvKjo6ICYmIHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKi8pIHtcblx0X19scHN0ciA9IGZ1bmN0aW9uIGxwc3RyX2IoYi8qOlJhd0J5dGVzfENGQmxvYiovLCBpLyo6bnVtYmVyKi8pIHsgaWYoIUJ1ZmZlci5pc0J1ZmZlcihiKS8qOjogfHwgIShiIGluc3RhbmNlb2YgQnVmZmVyKSovKSByZXR1cm4gX19fbHBzdHIoYiwgaSk7IHZhciBsZW4gPSBiLnJlYWRVSW50MzJMRShpKTsgcmV0dXJuIGxlbiA+IDAgPyBiLnRvU3RyaW5nKCd1dGY4JyxpKzQsaSs0K2xlbi0xKSA6IFwiXCI7fTtcblx0X19jcHN0ciA9IGZ1bmN0aW9uIGNwc3RyX2IoYi8qOlJhd0J5dGVzfENGQmxvYiovLCBpLyo6bnVtYmVyKi8pIHsgaWYoIUJ1ZmZlci5pc0J1ZmZlcihiKS8qOjogfHwgIShiIGluc3RhbmNlb2YgQnVmZmVyKSovKSByZXR1cm4gX19fY3BzdHIoYiwgaSk7IHZhciBsZW4gPSBiLnJlYWRVSW50MzJMRShpKTsgcmV0dXJuIGxlbiA+IDAgPyBiLnRvU3RyaW5nKCd1dGY4JyxpKzQsaSs0K2xlbi0xKSA6IFwiXCI7fTtcblx0X19scHdzdHIgPSBmdW5jdGlvbiBscHdzdHJfYihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIGkvKjpudW1iZXIqLykgeyBpZighQnVmZmVyLmlzQnVmZmVyKGIpLyo6OiB8fCAhKGIgaW5zdGFuY2VvZiBCdWZmZXIpKi8pIHJldHVybiBfX19scHdzdHIoYiwgaSk7IHZhciBsZW4gPSAyKmIucmVhZFVJbnQzMkxFKGkpOyByZXR1cm4gYi50b1N0cmluZygndXRmMTZsZScsaSs0LGkrNCtsZW4tMSk7fTtcblx0X19scHA0ID0gZnVuY3Rpb24gbHBwNF9iKGIvKjpSYXdCeXRlc3xDRkJsb2IqLywgaS8qOm51bWJlciovKSB7IGlmKCFCdWZmZXIuaXNCdWZmZXIoYikvKjo6IHx8ICEoYiBpbnN0YW5jZW9mIEJ1ZmZlcikqLykgcmV0dXJuIF9fX2xwcDQoYiwgaSk7IHZhciBsZW4gPSBiLnJlYWRVSW50MzJMRShpKTsgcmV0dXJuIGIudG9TdHJpbmcoJ3V0ZjE2bGUnLGkrNCxpKzQrbGVuKTt9O1xuXHRfXzhscHA0ID0gZnVuY3Rpb24gbHBwNF84YihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIGkvKjpudW1iZXIqLykgeyBpZighQnVmZmVyLmlzQnVmZmVyKGIpLyo6OiB8fCAhKGIgaW5zdGFuY2VvZiBCdWZmZXIpKi8pIHJldHVybiBfX184bHBwNChiLCBpKTsgdmFyIGxlbiA9IGIucmVhZFVJbnQzMkxFKGkpOyByZXR1cm4gYi50b1N0cmluZygndXRmOCcsaSs0LGkrNCtsZW4pO307XG5cdF9fZG91YmxlID0gZnVuY3Rpb24gZG91YmxlXyhiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIGkvKjpudW1iZXIqLykgeyBpZihCdWZmZXIuaXNCdWZmZXIoYikvKjo6JiYgYiBpbnN0YW5jZW9mIEJ1ZmZlciovKSByZXR1cm4gYi5yZWFkRG91YmxlTEUoaSk7IHJldHVybiBfX19kb3VibGUoYixpKTsgfTtcblx0aXNfYnVmID0gZnVuY3Rpb24gaXNfYnVmX2IoYSkgeyByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGEpIHx8IEFycmF5LmlzQXJyYXkoYSkgfHwgKHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiICYmIGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTsgfTtcbn1cblxuLyogZnJvbSBqcy14bHMgKi9cbmZ1bmN0aW9uIGNwZG9pdCgpIHtcblx0X191dGYxNmxlID0gZnVuY3Rpb24oYi8qOlJhd0J5dGVzfENGQmxvYiovLHMvKjpudW1iZXIqLyxlLyo6bnVtYmVyKi8pIHsgcmV0dXJuICRjcHRhYmxlLnV0aWxzLmRlY29kZSgxMjAwLCBiLnNsaWNlKHMsZSkpLnJlcGxhY2UoY2hyMCwgJycpOyB9O1xuXHRfX3V0ZjggPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8scy8qOm51bWJlciovLGUvKjpudW1iZXIqLykgeyByZXR1cm4gJGNwdGFibGUudXRpbHMuZGVjb2RlKDY1MDAxLCBiLnNsaWNlKHMsZSkpOyB9O1xuXHRfX2xwc3RyID0gZnVuY3Rpb24oYi8qOlJhd0J5dGVzfENGQmxvYiovLGkvKjpudW1iZXIqLykgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyAkY3B0YWJsZS51dGlscy5kZWNvZGUoY3VycmVudF9hbnNpLCBiLnNsaWNlKGkrNCwgaSs0K2xlbi0xKSkgOiBcIlwiO307XG5cdF9fY3BzdHIgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8saS8qOm51bWJlciovKSB7IHZhciBsZW4gPSBfX3JlYWRVSW50MzJMRShiLGkpOyByZXR1cm4gbGVuID4gMCA/ICRjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2NvZGVwYWdlLCBiLnNsaWNlKGkrNCwgaSs0K2xlbi0xKSkgOiBcIlwiO307XG5cdF9fbHB3c3RyID0gZnVuY3Rpb24oYi8qOlJhd0J5dGVzfENGQmxvYiovLGkvKjpudW1iZXIqLykgeyB2YXIgbGVuID0gMipfX3JlYWRVSW50MzJMRShiLGkpOyByZXR1cm4gbGVuID4gMCA/ICRjcHRhYmxlLnV0aWxzLmRlY29kZSgxMjAwLCBiLnNsaWNlKGkrNCxpKzQrbGVuLTEpKSA6IFwiXCI7fTtcblx0X19scHA0ID0gZnVuY3Rpb24oYi8qOlJhd0J5dGVzfENGQmxvYiovLGkvKjpudW1iZXIqLykgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyAkY3B0YWJsZS51dGlscy5kZWNvZGUoMTIwMCwgYi5zbGljZShpKzQsaSs0K2xlbikpIDogXCJcIjt9O1xuXHRfXzhscHA0ID0gZnVuY3Rpb24oYi8qOlJhd0J5dGVzfENGQmxvYiovLGkvKjpudW1iZXIqLykgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyAkY3B0YWJsZS51dGlscy5kZWNvZGUoNjUwMDEsIGIuc2xpY2UoaSs0LGkrNCtsZW4pKSA6IFwiXCI7fTtcbn1cbmlmKHR5cGVvZiAkY3B0YWJsZSAhPT0gJ3VuZGVmaW5lZCcpIGNwZG9pdCgpO1xuXG52YXIgX19yZWFkVUludDggPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIGlkeC8qOm51bWJlciovKS8qOm51bWJlciovIHsgcmV0dXJuIGJbaWR4XTsgfTtcbnZhciBfX3JlYWRVSW50MTZMRSA9IGZ1bmN0aW9uKGIvKjpSYXdCeXRlc3xDRkJsb2IqLywgaWR4Lyo6bnVtYmVyKi8pLyo6bnVtYmVyKi8geyByZXR1cm4gKGJbaWR4KzFdKigxPDw4KSkrYltpZHhdOyB9O1xudmFyIF9fcmVhZEludDE2TEUgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIGlkeC8qOm51bWJlciovKS8qOm51bWJlciovIHsgdmFyIHUgPSAoYltpZHgrMV0qKDE8PDgpKStiW2lkeF07IHJldHVybiAodSA8IDB4ODAwMCkgPyB1IDogKCgweGZmZmYgLSB1ICsgMSkgKiAtMSk7IH07XG52YXIgX19yZWFkVUludDMyTEUgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIGlkeC8qOm51bWJlciovKS8qOm51bWJlciovIHsgcmV0dXJuIGJbaWR4KzNdKigxPDwyNCkrKGJbaWR4KzJdPDwxNikrKGJbaWR4KzFdPDw4KStiW2lkeF07IH07XG52YXIgX19yZWFkSW50MzJMRSA9IGZ1bmN0aW9uKGIvKjpSYXdCeXRlc3xDRkJsb2IqLywgaWR4Lyo6bnVtYmVyKi8pLyo6bnVtYmVyKi8geyByZXR1cm4gKGJbaWR4KzNdPDwyNCl8KGJbaWR4KzJdPDwxNil8KGJbaWR4KzFdPDw4KXxiW2lkeF07IH07XG52YXIgX19yZWFkSW50MzJCRSA9IGZ1bmN0aW9uKGIvKjpSYXdCeXRlc3xDRkJsb2IqLywgaWR4Lyo6bnVtYmVyKi8pLyo6bnVtYmVyKi8geyByZXR1cm4gKGJbaWR4XTw8MjQpfChiW2lkeCsxXTw8MTYpfChiW2lkeCsyXTw8OCl8YltpZHgrM107IH07XG5cbmZ1bmN0aW9uIFJlYWRTaGlmdChzaXplLyo6bnVtYmVyKi8sIHQvKjo/c3RyaW5nKi8pLyo6bnVtYmVyfHN0cmluZyovIHtcblx0dmFyIG89XCJcIiwgb0kvKjo6IDpudW1iZXIgPSAwKi8sIG9SLCBvbz1bXSwgdywgdnYsIGksIGxvYztcblx0c3dpdGNoKHQpIHtcblx0XHRjYXNlICdkYmNzJzpcblx0XHRcdGxvYyA9IHRoaXMubDtcblx0XHRcdGlmKGhhc19idWYgJiYgQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSBvID0gdGhpcy5zbGljZSh0aGlzLmwsIHRoaXMubCsyKnNpemUpLnRvU3RyaW5nKFwidXRmMTZsZVwiKTtcblx0XHRcdGVsc2UgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7IG8rPVN0cmluZy5mcm9tQ2hhckNvZGUoX19yZWFkVUludDE2TEUodGhpcywgbG9jKSk7IGxvYys9MjsgfVxuXHRcdFx0c2l6ZSAqPSAyO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICd1dGY4JzogbyA9IF9fdXRmOCh0aGlzLCB0aGlzLmwsIHRoaXMubCArIHNpemUpOyBicmVhaztcblx0XHRjYXNlICd1dGYxNmxlJzogc2l6ZSAqPSAyOyBvID0gX191dGYxNmxlKHRoaXMsIHRoaXMubCwgdGhpcy5sICsgc2l6ZSk7IGJyZWFrO1xuXG5cdFx0Y2FzZSAnd3N0cic6XG5cdFx0XHRpZih0eXBlb2YgJGNwdGFibGUgIT09ICd1bmRlZmluZWQnKSBvID0gJGNwdGFibGUudXRpbHMuZGVjb2RlKGN1cnJlbnRfY29kZXBhZ2UsIHRoaXMuc2xpY2UodGhpcy5sLCB0aGlzLmwrMipzaXplKSk7XG5cdFx0XHRlbHNlIHJldHVybiBSZWFkU2hpZnQuY2FsbCh0aGlzLCBzaXplLCAnZGJjcycpO1xuXHRcdFx0c2l6ZSA9IDIgKiBzaXplOyBicmVhaztcblxuXHRcdC8qIFtNUy1PTEVEU10gMi4xLjQgTGVuZ3RoUHJlZml4ZWRBbnNpU3RyaW5nICovXG5cdFx0Y2FzZSAnbHBzdHItYW5zaSc6IG8gPSBfX2xwc3RyKHRoaXMsIHRoaXMubCk7IHNpemUgPSA0ICsgX19yZWFkVUludDMyTEUodGhpcywgdGhpcy5sKTsgYnJlYWs7XG5cdFx0Y2FzZSAnbHBzdHItY3AnOiBvID0gX19jcHN0cih0aGlzLCB0aGlzLmwpOyBzaXplID0gNCArIF9fcmVhZFVJbnQzMkxFKHRoaXMsIHRoaXMubCk7IGJyZWFrO1xuXHRcdC8qIFtNUy1PTEVEU10gMi4xLjUgTGVuZ3RoUHJlZml4ZWRVbmljb2RlU3RyaW5nICovXG5cdFx0Y2FzZSAnbHB3c3RyJzogbyA9IF9fbHB3c3RyKHRoaXMsIHRoaXMubCk7IHNpemUgPSA0ICsgMiAqIF9fcmVhZFVJbnQzMkxFKHRoaXMsIHRoaXMubCk7IGJyZWFrO1xuXHRcdC8qIFtNUy1PRkZDUllQVE9dIDIuMS4yIExlbmd0aC1QcmVmaXhlZCBQYWRkZWQgVW5pY29kZSBTdHJpbmcgKFVOSUNPREUtTFAtUDQpICovXG5cdFx0Y2FzZSAnbHBwNCc6IHNpemUgPSA0ICsgIF9fcmVhZFVJbnQzMkxFKHRoaXMsIHRoaXMubCk7IG8gPSBfX2xwcDQodGhpcywgdGhpcy5sKTsgaWYoc2l6ZSAmIDB4MDIpIHNpemUgKz0gMjsgYnJlYWs7XG5cdFx0LyogW01TLU9GRkNSWVBUT10gMi4xLjMgTGVuZ3RoLVByZWZpeGVkIFVURi04IFN0cmluZyAoVVRGLTgtTFAtUDQpICovXG5cdFx0Y2FzZSAnOGxwcDQnOiBzaXplID0gNCArICBfX3JlYWRVSW50MzJMRSh0aGlzLCB0aGlzLmwpOyBvID0gX184bHBwNCh0aGlzLCB0aGlzLmwpOyBpZihzaXplICYgMHgwMykgc2l6ZSArPSA0IC0gKHNpemUgJiAweDAzKTsgYnJlYWs7XG5cblx0XHRjYXNlICdjc3RyJzogc2l6ZSA9IDA7IG8gPSBcIlwiO1xuXHRcdFx0d2hpbGUoKHc9X19yZWFkVUludDgodGhpcywgdGhpcy5sICsgc2l6ZSsrKSkhPT0wKSBvby5wdXNoKF9nZXRjaGFyKHcpKTtcblx0XHRcdG8gPSBvby5qb2luKFwiXCIpOyBicmVhaztcblx0XHRjYXNlICdfd3N0cic6IHNpemUgPSAwOyBvID0gXCJcIjtcblx0XHRcdHdoaWxlKCh3PV9fcmVhZFVJbnQxNkxFKHRoaXMsdGhpcy5sICtzaXplKSkhPT0wKXtvby5wdXNoKF9nZXRjaGFyKHcpKTtzaXplKz0yO31cblx0XHRcdHNpemUrPTI7IG8gPSBvby5qb2luKFwiXCIpOyBicmVhaztcblxuXHRcdC8qIHNiY3MgYW5kIGRiY3Mgc3VwcG9ydCBjb250aW51ZSByZWNvcmRzIGluIHRoZSBTU1Qgd2F5IFRPRE8gY29kZXBhZ2VzICovXG5cdFx0Y2FzZSAnZGJjcy1jb250JzogbyA9IFwiXCI7IGxvYyA9IHRoaXMubDtcblx0XHRcdGZvcihpID0gMDsgaSA8IHNpemU7ICsraSkge1xuXHRcdFx0XHRpZih0aGlzLmxlbnMgJiYgdGhpcy5sZW5zLmluZGV4T2YobG9jKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR3ID0gX19yZWFkVUludDgodGhpcywgbG9jKTtcblx0XHRcdFx0XHR0aGlzLmwgPSBsb2MgKyAxO1xuXHRcdFx0XHRcdHZ2ID0gUmVhZFNoaWZ0LmNhbGwodGhpcywgc2l6ZS1pLCB3ID8gJ2RiY3MtY29udCcgOiAnc2Jjcy1jb250Jyk7XG5cdFx0XHRcdFx0cmV0dXJuIG9vLmpvaW4oXCJcIikgKyB2djtcblx0XHRcdFx0fVxuXHRcdFx0XHRvby5wdXNoKF9nZXRjaGFyKF9fcmVhZFVJbnQxNkxFKHRoaXMsIGxvYykpKTtcblx0XHRcdFx0bG9jKz0yO1xuXHRcdFx0fSBvID0gb28uam9pbihcIlwiKTsgc2l6ZSAqPSAyOyBicmVhaztcblxuXHRcdGNhc2UgJ2Nwc3RyJzpcblx0XHRcdGlmKHR5cGVvZiAkY3B0YWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0byA9ICRjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2NvZGVwYWdlLCB0aGlzLnNsaWNlKHRoaXMubCwgdGhpcy5sICsgc2l6ZSkpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAnc2Jjcy1jb250JzogbyA9IFwiXCI7IGxvYyA9IHRoaXMubDtcblx0XHRcdGZvcihpID0gMDsgaSAhPSBzaXplOyArK2kpIHtcblx0XHRcdFx0aWYodGhpcy5sZW5zICYmIHRoaXMubGVucy5pbmRleE9mKGxvYykgIT09IC0xKSB7XG5cdFx0XHRcdFx0dyA9IF9fcmVhZFVJbnQ4KHRoaXMsIGxvYyk7XG5cdFx0XHRcdFx0dGhpcy5sID0gbG9jICsgMTtcblx0XHRcdFx0XHR2diA9IFJlYWRTaGlmdC5jYWxsKHRoaXMsIHNpemUtaSwgdyA/ICdkYmNzLWNvbnQnIDogJ3NiY3MtY29udCcpO1xuXHRcdFx0XHRcdHJldHVybiBvby5qb2luKFwiXCIpICsgdnY7XG5cdFx0XHRcdH1cblx0XHRcdFx0b28ucHVzaChfZ2V0Y2hhcihfX3JlYWRVSW50OCh0aGlzLCBsb2MpKSk7XG5cdFx0XHRcdGxvYys9MTtcblx0XHRcdH0gbyA9IG9vLmpvaW4oXCJcIik7IGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0c3dpdGNoKHNpemUpIHtcblx0XHRjYXNlIDE6IG9JID0gX19yZWFkVUludDgodGhpcywgdGhpcy5sKTsgdGhpcy5sKys7IHJldHVybiBvSTtcblx0XHRjYXNlIDI6IG9JID0gKHQgPT09ICdpJyA/IF9fcmVhZEludDE2TEUgOiBfX3JlYWRVSW50MTZMRSkodGhpcywgdGhpcy5sKTsgdGhpcy5sICs9IDI7IHJldHVybiBvSTtcblx0XHRjYXNlIDQ6IGNhc2UgLTQ6XG5cdFx0XHRpZih0ID09PSAnaScgfHwgKCh0aGlzW3RoaXMubCszXSAmIDB4ODApPT09MCkpIHsgb0kgPSAoKHNpemUgPiAwKSA/IF9fcmVhZEludDMyTEUgOiBfX3JlYWRJbnQzMkJFKSh0aGlzLCB0aGlzLmwpOyB0aGlzLmwgKz0gNDsgcmV0dXJuIG9JOyB9XG5cdFx0XHRlbHNlIHsgb1IgPSBfX3JlYWRVSW50MzJMRSh0aGlzLCB0aGlzLmwpOyB0aGlzLmwgKz0gNDsgfSByZXR1cm4gb1I7XG5cdFx0Y2FzZSA4OiBjYXNlIC04OlxuXHRcdFx0aWYodCA9PT0gJ2YnKSB7XG5cdFx0XHRcdGlmKHNpemUgPT0gOCkgb1IgPSBfX2RvdWJsZSh0aGlzLCB0aGlzLmwpO1xuXHRcdFx0XHRlbHNlIG9SID0gX19kb3VibGUoW3RoaXNbdGhpcy5sKzddLHRoaXNbdGhpcy5sKzZdLHRoaXNbdGhpcy5sKzVdLHRoaXNbdGhpcy5sKzRdLHRoaXNbdGhpcy5sKzNdLHRoaXNbdGhpcy5sKzJdLHRoaXNbdGhpcy5sKzFdLHRoaXNbdGhpcy5sKzBdXSwgMCk7XG5cdFx0XHRcdHRoaXMubCArPSA4OyByZXR1cm4gb1I7XG5cdFx0XHR9IGVsc2Ugc2l6ZSA9IDg7XG5cdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgMTY6IG8gPSBfX2hleGxpZnkodGhpcywgdGhpcy5sLCBzaXplKTsgYnJlYWs7XG5cdH19XG5cdHRoaXMubCs9c2l6ZTsgcmV0dXJuIG87XG59XG5cbnZhciBfX3dyaXRlVUludDMyTEUgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIHZhbC8qOm51bWJlciovLCBpZHgvKjpudW1iZXIqLykvKjp2b2lkKi8geyBiW2lkeF0gPSAodmFsICYgMHhGRik7IGJbaWR4KzFdID0gKCh2YWwgPj4+IDgpICYgMHhGRik7IGJbaWR4KzJdID0gKCh2YWwgPj4+IDE2KSAmIDB4RkYpOyBiW2lkeCszXSA9ICgodmFsID4+PiAyNCkgJiAweEZGKTsgfTtcbnZhciBfX3dyaXRlSW50MzJMRSAgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIHZhbC8qOm51bWJlciovLCBpZHgvKjpudW1iZXIqLykvKjp2b2lkKi8geyBiW2lkeF0gPSAodmFsICYgMHhGRik7IGJbaWR4KzFdID0gKCh2YWwgPj4gOCkgJiAweEZGKTsgYltpZHgrMl0gPSAoKHZhbCA+PiAxNikgJiAweEZGKTsgYltpZHgrM10gPSAoKHZhbCA+PiAyNCkgJiAweEZGKTsgfTtcbnZhciBfX3dyaXRlVUludDE2TEUgPSBmdW5jdGlvbihiLyo6UmF3Qnl0ZXN8Q0ZCbG9iKi8sIHZhbC8qOm51bWJlciovLCBpZHgvKjpudW1iZXIqLykvKjp2b2lkKi8geyBiW2lkeF0gPSAodmFsICYgMHhGRik7IGJbaWR4KzFdID0gKCh2YWwgPj4+IDgpICYgMHhGRik7IH07XG5cbmZ1bmN0aW9uIFdyaXRlU2hpZnQodC8qOm51bWJlciovLCB2YWwvKjpzdHJpbmd8bnVtYmVyKi8sIGYvKjo/c3RyaW5nKi8pLyo6YW55Ki8ge1xuXHR2YXIgc2l6ZSA9IDAsIGkgPSAwO1xuXHRpZihmID09PSAnZGJjcycpIHtcblx0XHQvKjo6IGlmKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRmb3IoaSA9IDA7IGkgIT0gdmFsLmxlbmd0aDsgKytpKSBfX3dyaXRlVUludDE2TEUodGhpcywgdmFsLmNoYXJDb2RlQXQoaSksIHRoaXMubCArIDIgKiBpKTtcblx0XHRzaXplID0gMiAqIHZhbC5sZW5ndGg7XG5cdH0gZWxzZSBpZihmID09PSAnc2JjcycpIHtcblx0XHRpZih0eXBlb2YgJGNwdGFibGUgIT09ICd1bmRlZmluZWQnICYmIGN1cnJlbnRfYW5zaSA9PSA4NzQpIHtcblx0XHRcdC8qIFRPRE86IHVzZSB0YWJsZXMgZGlyZWN0bHksIGRvbid0IGVuY29kZSAqL1xuXHRcdFx0Lyo6OiBpZih0eXBlb2YgdmFsICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRcdGZvcihpID0gMDsgaSAhPSB2YWwubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0dmFyIGNwcGF5bG9hZCA9ICRjcHRhYmxlLnV0aWxzLmVuY29kZShjdXJyZW50X2Fuc2ksIHZhbC5jaGFyQXQoaSkpO1xuXHRcdFx0XHR0aGlzW3RoaXMubCArIGldID0gY3BwYXlsb2FkWzBdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKjo6IGlmKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRcdHZhbCA9IHZhbC5yZXBsYWNlKC9bXlxceDAwLVxceDdGXS9nLCBcIl9cIik7XG5cdFx0XHQvKjo6IGlmKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRcdGZvcihpID0gMDsgaSAhPSB2YWwubGVuZ3RoOyArK2kpIHRoaXNbdGhpcy5sICsgaV0gPSAodmFsLmNoYXJDb2RlQXQoaSkgJiAweEZGKTtcblx0XHR9XG5cdFx0c2l6ZSA9IHZhbC5sZW5ndGg7XG5cdH0gZWxzZSBpZihmID09PSAnaGV4Jykge1xuXHRcdGZvcig7IGkgPCB0OyArK2kpIHtcblx0XHRcdC8qOjogaWYodHlwZW9mIHZhbCAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7ICovXG5cdFx0XHR0aGlzW3RoaXMubCsrXSA9IChwYXJzZUludCh2YWwuc2xpY2UoMippLCAyKmkrMiksIDE2KXx8MCk7XG5cdFx0fSByZXR1cm4gdGhpcztcblx0fSBlbHNlIGlmKGYgPT09ICd1dGYxNmxlJykge1xuXHRcdFx0Lyo6OiBpZih0eXBlb2YgdmFsICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0XHRcdHZhciBlbmQvKjpudW1iZXIqLyA9IE1hdGgubWluKHRoaXMubCArIHQsIHRoaXMubGVuZ3RoKTtcblx0XHRcdGZvcihpID0gMDsgaSA8IE1hdGgubWluKHZhbC5sZW5ndGgsIHQpOyArK2kpIHtcblx0XHRcdFx0dmFyIGNjID0gdmFsLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRcdHRoaXNbdGhpcy5sKytdID0gKGNjICYgMHhmZik7XG5cdFx0XHRcdHRoaXNbdGhpcy5sKytdID0gKGNjID4+IDgpO1xuXHRcdFx0fVxuXHRcdFx0d2hpbGUodGhpcy5sIDwgZW5kKSB0aGlzW3RoaXMubCsrXSA9IDA7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0fSBlbHNlIC8qOjogaWYodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpICovIHN3aXRjaCh0KSB7XG5cdFx0Y2FzZSAgMTogc2l6ZSA9IDE7IHRoaXNbdGhpcy5sXSA9IHZhbCYweEZGOyBicmVhaztcblx0XHRjYXNlICAyOiBzaXplID0gMjsgdGhpc1t0aGlzLmxdID0gdmFsJjB4RkY7IHZhbCA+Pj49IDg7IHRoaXNbdGhpcy5sKzFdID0gdmFsJjB4RkY7IGJyZWFrO1xuXHRcdGNhc2UgIDM6IHNpemUgPSAzOyB0aGlzW3RoaXMubF0gPSB2YWwmMHhGRjsgdmFsID4+Pj0gODsgdGhpc1t0aGlzLmwrMV0gPSB2YWwmMHhGRjsgdmFsID4+Pj0gODsgdGhpc1t0aGlzLmwrMl0gPSB2YWwmMHhGRjsgYnJlYWs7XG5cdFx0Y2FzZSAgNDogc2l6ZSA9IDQ7IF9fd3JpdGVVSW50MzJMRSh0aGlzLCB2YWwsIHRoaXMubCk7IGJyZWFrO1xuXHRcdGNhc2UgIDg6IHNpemUgPSA4OyBpZihmID09PSAnZicpIHsgd3JpdGVfZG91YmxlX2xlKHRoaXMsIHZhbCwgdGhpcy5sKTsgYnJlYWs7IH1cblx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAxNjogYnJlYWs7XG5cdFx0Y2FzZSAtNDogc2l6ZSA9IDQ7IF9fd3JpdGVJbnQzMkxFKHRoaXMsIHZhbCwgdGhpcy5sKTsgYnJlYWs7XG5cdH1cblx0dGhpcy5sICs9IHNpemU7IHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBDaGVja0ZpZWxkKGhleHN0ci8qOnN0cmluZyovLCBmbGQvKjpzdHJpbmcqLykvKjp2b2lkKi8ge1xuXHR2YXIgbSA9IF9faGV4bGlmeSh0aGlzLHRoaXMubCxoZXhzdHIubGVuZ3RoPj4xKTtcblx0aWYobSAhPT0gaGV4c3RyKSB0aHJvdyBuZXcgRXJyb3IoZmxkICsgJ0V4cGVjdGVkICcgKyBoZXhzdHIgKyAnIHNhdyAnICsgbSk7XG5cdHRoaXMubCArPSBoZXhzdHIubGVuZ3RoPj4xO1xufVxuXG5mdW5jdGlvbiBwcmVwX2Jsb2IoYmxvYiwgcG9zLyo6bnVtYmVyKi8pLyo6dm9pZCovIHtcblx0YmxvYi5sID0gcG9zO1xuXHRibG9iLnJlYWRfc2hpZnQgPSAvKjo6KCovUmVhZFNoaWZ0Lyo6OiA6YW55KSovO1xuXHRibG9iLmNoayA9IENoZWNrRmllbGQ7XG5cdGJsb2Iud3JpdGVfc2hpZnQgPSBXcml0ZVNoaWZ0O1xufVxuXG5mdW5jdGlvbiBwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoLyo6OiA6bnVtYmVyLCBvcHRzPzphbnkgKi8pIHsgYmxvYi5sICs9IGxlbmd0aDsgfVxuXG5mdW5jdGlvbiBuZXdfYnVmKHN6Lyo6bnVtYmVyKi8pLyo6QmxvY2sqLyB7XG5cdHZhciBvID0gbmV3X3Jhd19idWYoc3opO1xuXHRwcmVwX2Jsb2IobywgMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjQgUmVjb3JkICovXG5mdW5jdGlvbiByZWNvcmRob3BwZXIoZGF0YSwgY2IvKjpSZWNvcmRIb3BwZXJDQiovLCBvcHRzLyo6P2FueSovKSB7XG5cdGlmKCFkYXRhKSByZXR1cm47XG5cdHZhciB0bXBieXRlLCBjbnRieXRlLCBsZW5ndGg7XG5cdHByZXBfYmxvYihkYXRhLCBkYXRhLmwgfHwgMCk7XG5cdHZhciBMID0gZGF0YS5sZW5ndGgsIFJUID0gMCwgdGd0ID0gMDtcblx0d2hpbGUoZGF0YS5sIDwgTCkge1xuXHRcdFJUID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRcdGlmKFJUICYgMHg4MCkgUlQgPSAoUlQgJiAweDdGKSArICgoZGF0YS5yZWFkX3NoaWZ0KDEpICYgMHg3Rik8PDcpO1xuXHRcdHZhciBSID0gWExTQlJlY29yZEVudW1bUlRdIHx8IFhMU0JSZWNvcmRFbnVtWzB4RkZGRl07XG5cdFx0dG1wYnl0ZSA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0XHRsZW5ndGggPSB0bXBieXRlICYgMHg3Rjtcblx0XHRmb3IoY250Ynl0ZSA9IDE7IGNudGJ5dGUgPDQgJiYgKHRtcGJ5dGUgJiAweDgwKTsgKytjbnRieXRlKSBsZW5ndGggKz0gKCh0bXBieXRlID0gZGF0YS5yZWFkX3NoaWZ0KDEpKSAmIDB4N0YpPDwoNypjbnRieXRlKTtcblx0XHR0Z3QgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdFx0dmFyIGQgPSBSLmYgJiYgUi5mKGRhdGEsIGxlbmd0aCwgb3B0cyk7XG5cdFx0ZGF0YS5sID0gdGd0O1xuXHRcdGlmKGNiKGQsIFIsIFJUKSkgcmV0dXJuO1xuXHR9XG59XG5cbi8qIGNvbnRyb2wgYnVmZmVyIHVzYWdlIGZvciBmaXhlZC1sZW5ndGggYnVmZmVycyAqL1xuZnVuY3Rpb24gYnVmX2FycmF5KCkvKjpCdWZBcnJheSovIHtcblx0dmFyIGJ1ZnMvKjpBcnJheTxCbG9jaz4qLyA9IFtdLCBibGtzeiA9IGhhc19idWYgPyAyNTYgOiAyMDQ4O1xuXHR2YXIgbmV3YmxrID0gZnVuY3Rpb24gYmFfbmV3YmxrKHN6Lyo6bnVtYmVyKi8pLyo6QmxvY2sqLyB7XG5cdFx0dmFyIG8vKjpCbG9jayovID0gKG5ld19idWYoc3opLyo6YW55Ki8pO1xuXHRcdHByZXBfYmxvYihvLCAwKTtcblx0XHRyZXR1cm4gbztcblx0fTtcblxuXHR2YXIgY3VyYnVmLyo6QmxvY2sqLyA9IG5ld2JsayhibGtzeik7XG5cblx0dmFyIGVuZGJ1ZiA9IGZ1bmN0aW9uIGJhX2VuZGJ1ZigpIHtcblx0XHRpZighY3VyYnVmKSByZXR1cm47XG5cdFx0aWYoY3VyYnVmLmxlbmd0aCA+IGN1cmJ1Zi5sKSB7IGN1cmJ1ZiA9IGN1cmJ1Zi5zbGljZSgwLCBjdXJidWYubCk7IGN1cmJ1Zi5sID0gY3VyYnVmLmxlbmd0aDsgfVxuXHRcdGlmKGN1cmJ1Zi5sZW5ndGggPiAwKSBidWZzLnB1c2goY3VyYnVmKTtcblx0XHRjdXJidWYgPSBudWxsO1xuXHR9O1xuXG5cdHZhciBuZXh0ID0gZnVuY3Rpb24gYmFfbmV4dChzei8qOm51bWJlciovKS8qOkJsb2NrKi8ge1xuXHRcdGlmKGN1cmJ1ZiAmJiAoc3ogPCAoY3VyYnVmLmxlbmd0aCAtIGN1cmJ1Zi5sKSkpIHJldHVybiBjdXJidWY7XG5cdFx0ZW5kYnVmKCk7XG5cdFx0cmV0dXJuIChjdXJidWYgPSBuZXdibGsoTWF0aC5tYXgoc3orMSwgYmxrc3opKSk7XG5cdH07XG5cblx0dmFyIGVuZCA9IGZ1bmN0aW9uIGJhX2VuZCgpIHtcblx0XHRlbmRidWYoKTtcblx0XHRyZXR1cm4gYmNvbmNhdChidWZzKTtcblx0fTtcblxuXHR2YXIgcHVzaCA9IGZ1bmN0aW9uIGJhX3B1c2goYnVmKSB7IGVuZGJ1ZigpOyBjdXJidWYgPSBidWY7IGlmKGN1cmJ1Zi5sID09IG51bGwpIGN1cmJ1Zi5sID0gY3VyYnVmLmxlbmd0aDsgbmV4dChibGtzeik7IH07XG5cblx0cmV0dXJuICh7IG5leHQ6bmV4dCwgcHVzaDpwdXNoLCBlbmQ6ZW5kLCBfYnVmczpidWZzIH0vKjphbnkqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3JlY29yZChiYS8qOkJ1ZkFycmF5Ki8sIHR5cGUvKjpudW1iZXIqLywgcGF5bG9hZCwgbGVuZ3RoLyo6P251bWJlciovKSB7XG5cdHZhciB0Lyo6bnVtYmVyKi8gPSArdHlwZSwgbDtcblx0aWYoaXNOYU4odCkpIHJldHVybjsgLy8gVE9ETzogdGhyb3cgc29tZXRoaW5nIGhlcmU/XG5cdGlmKCFsZW5ndGgpIGxlbmd0aCA9IFhMU0JSZWNvcmRFbnVtW3RdLnAgfHwgKHBheWxvYWR8fFtdKS5sZW5ndGggfHwgMDtcblx0bCA9IDEgKyAodCA+PSAweDgwID8gMSA6IDApICsgMS8qICsgbGVuZ3RoKi87XG5cdGlmKGxlbmd0aCA+PSAweDgwKSArK2w7IGlmKGxlbmd0aCA+PSAweDQwMDApICsrbDsgaWYobGVuZ3RoID49IDB4MjAwMDAwKSArK2w7XG5cdHZhciBvID0gYmEubmV4dChsKTtcblx0aWYodCA8PSAweDdGKSBvLndyaXRlX3NoaWZ0KDEsIHQpO1xuXHRlbHNlIHtcblx0XHRvLndyaXRlX3NoaWZ0KDEsICh0ICYgMHg3RikgKyAweDgwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsICh0ID4+IDcpKTtcblx0fVxuXHRmb3IodmFyIGkgPSAwOyBpICE9IDQ7ICsraSkge1xuXHRcdGlmKGxlbmd0aCA+PSAweDgwKSB7IG8ud3JpdGVfc2hpZnQoMSwgKGxlbmd0aCAmIDB4N0YpKzB4ODApOyBsZW5ndGggPj49IDc7IH1cblx0XHRlbHNlIHsgby53cml0ZV9zaGlmdCgxLCBsZW5ndGgpOyBicmVhazsgfVxuXHR9XG5cdGlmKC8qOjogbGVuZ3RoICE9IG51bGwgJiYqL2xlbmd0aCA+IDAgJiYgaXNfYnVmKHBheWxvYWQpKSBiYS5wdXNoKHBheWxvYWQpO1xufVxuLyogWExTIHJhbmdlcyBlbmZvcmNlZCAqL1xuZnVuY3Rpb24gc2hpZnRfY2VsbF94bHMoY2VsbC8qOkNlbGxBZGRyZXNzKi8sIHRndC8qOmFueSovLCBvcHRzLyo6P2FueSovKS8qOkNlbGxBZGRyZXNzKi8ge1xuXHR2YXIgb3V0ID0gZHVwKGNlbGwpO1xuXHRpZih0Z3Qucykge1xuXHRcdGlmKG91dC5jUmVsKSBvdXQuYyArPSB0Z3Qucy5jO1xuXHRcdGlmKG91dC5yUmVsKSBvdXQuciArPSB0Z3Qucy5yO1xuXHR9IGVsc2Uge1xuXHRcdGlmKG91dC5jUmVsKSBvdXQuYyArPSB0Z3QuYztcblx0XHRpZihvdXQuclJlbCkgb3V0LnIgKz0gdGd0LnI7XG5cdH1cblx0aWYoIW9wdHMgfHwgb3B0cy5iaWZmIDwgMTIpIHtcblx0XHR3aGlsZShvdXQuYyA+PSAweDEwMCkgb3V0LmMgLT0gMHgxMDA7XG5cdFx0d2hpbGUob3V0LnIgPj0gMHgxMDAwMCkgb3V0LnIgLT0gMHgxMDAwMDtcblx0fVxuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBzaGlmdF9yYW5nZV94bHMoY2VsbCwgcmFuZ2UsIG9wdHMpIHtcblx0dmFyIG91dCA9IGR1cChjZWxsKTtcblx0b3V0LnMgPSBzaGlmdF9jZWxsX3hscyhvdXQucywgcmFuZ2Uucywgb3B0cyk7XG5cdG91dC5lID0gc2hpZnRfY2VsbF94bHMob3V0LmUsIHJhbmdlLnMsIG9wdHMpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBlbmNvZGVfY2VsbF94bHMoYy8qOkNlbGxBZGRyZXNzKi8sIGJpZmYvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7XG5cdGlmKGMuY1JlbCAmJiBjLmMgPCAwKSB7IGMgPSBkdXAoYyk7IHdoaWxlKGMuYyA8IDApIGMuYyArPSAoYmlmZiA+IDgpID8gMHg0MDAwIDogMHgxMDA7IH1cblx0aWYoYy5yUmVsICYmIGMuciA8IDApIHsgYyA9IGR1cChjKTsgd2hpbGUoYy5yIDwgMCkgYy5yICs9IChiaWZmID4gOCkgPyAweDEwMDAwMCA6ICgoYmlmZiA+IDUpID8gMHgxMDAwMCA6IDB4NDAwMCk7IH1cblx0dmFyIHMgPSBlbmNvZGVfY2VsbChjKTtcblx0aWYoIWMuY1JlbCAmJiBjLmNSZWwgIT0gbnVsbCkgcyA9IGZpeF9jb2wocyk7XG5cdGlmKCFjLnJSZWwgJiYgYy5yUmVsICE9IG51bGwpIHMgPSBmaXhfcm93KHMpO1xuXHRyZXR1cm4gcztcbn1cblxuZnVuY3Rpb24gZW5jb2RlX3JhbmdlX3hscyhyLCBvcHRzKS8qOnN0cmluZyovIHtcblx0aWYoci5zLnIgPT0gMCAmJiAhci5zLnJSZWwpIHtcblx0XHRpZihyLmUuciA9PSAob3B0cy5iaWZmID49IDEyID8gMHhGRkZGRiA6IChvcHRzLmJpZmYgPj0gOCA/IDB4MTAwMDAgOiAweDQwMDApKSAmJiAhci5lLnJSZWwpIHtcblx0XHRcdHJldHVybiAoci5zLmNSZWwgPyBcIlwiIDogXCIkXCIpICsgZW5jb2RlX2NvbChyLnMuYykgKyBcIjpcIiArIChyLmUuY1JlbCA/IFwiXCIgOiBcIiRcIikgKyBlbmNvZGVfY29sKHIuZS5jKTtcblx0XHR9XG5cdH1cblx0aWYoci5zLmMgPT0gMCAmJiAhci5zLmNSZWwpIHtcblx0XHRpZihyLmUuYyA9PSAob3B0cy5iaWZmID49IDEyID8gMHgzRkZGIDogMHhGRikgJiYgIXIuZS5jUmVsKSB7XG5cdFx0XHRyZXR1cm4gKHIucy5yUmVsID8gXCJcIiA6IFwiJFwiKSArIGVuY29kZV9yb3coci5zLnIpICsgXCI6XCIgKyAoci5lLnJSZWwgPyBcIlwiIDogXCIkXCIpICsgZW5jb2RlX3JvdyhyLmUucik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBlbmNvZGVfY2VsbF94bHMoci5zLCBvcHRzLmJpZmYpICsgXCI6XCIgKyBlbmNvZGVfY2VsbF94bHMoci5lLCBvcHRzLmJpZmYpO1xufVxuZnVuY3Rpb24gZGVjb2RlX3Jvdyhyb3dzdHIvKjpzdHJpbmcqLykvKjpudW1iZXIqLyB7IHJldHVybiBwYXJzZUludCh1bmZpeF9yb3cocm93c3RyKSwxMCkgLSAxOyB9XG5mdW5jdGlvbiBlbmNvZGVfcm93KHJvdy8qOm51bWJlciovKS8qOnN0cmluZyovIHsgcmV0dXJuIFwiXCIgKyAocm93ICsgMSk7IH1cbmZ1bmN0aW9uIGZpeF9yb3coY3N0ci8qOnN0cmluZyovKS8qOnN0cmluZyovIHsgcmV0dXJuIGNzdHIucmVwbGFjZSgvKFtBLVpdfF4pKFxcZCspJC8sXCIkMSQkJDJcIik7IH1cbmZ1bmN0aW9uIHVuZml4X3Jvdyhjc3RyLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8geyByZXR1cm4gY3N0ci5yZXBsYWNlKC9cXCQoXFxkKykkLyxcIiQxXCIpOyB9XG5cbmZ1bmN0aW9uIGRlY29kZV9jb2woY29sc3RyLyo6c3RyaW5nKi8pLyo6bnVtYmVyKi8geyB2YXIgYyA9IHVuZml4X2NvbChjb2xzdHIpLCBkID0gMCwgaSA9IDA7IGZvcig7IGkgIT09IGMubGVuZ3RoOyArK2kpIGQgPSAyNipkICsgYy5jaGFyQ29kZUF0KGkpIC0gNjQ7IHJldHVybiBkIC0gMTsgfVxuZnVuY3Rpb24gZW5jb2RlX2NvbChjb2wvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7IGlmKGNvbCA8IDApIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY29sdW1uIFwiICsgY29sKTsgdmFyIHM9XCJcIjsgZm9yKCsrY29sOyBjb2w7IGNvbD1NYXRoLmZsb29yKChjb2wtMSkvMjYpKSBzID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGNvbC0xKSUyNikgKyA2NSkgKyBzOyByZXR1cm4gczsgfVxuZnVuY3Rpb24gZml4X2NvbChjc3RyLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8geyByZXR1cm4gY3N0ci5yZXBsYWNlKC9eKFtBLVpdKS8sXCIkJCQxXCIpOyB9XG5mdW5jdGlvbiB1bmZpeF9jb2woY3N0ci8qOnN0cmluZyovKS8qOnN0cmluZyovIHsgcmV0dXJuIGNzdHIucmVwbGFjZSgvXlxcJChbQS1aXSkvLFwiJDFcIik7IH1cblxuZnVuY3Rpb24gc3BsaXRfY2VsbChjc3RyLyo6c3RyaW5nKi8pLyo6QXJyYXk8c3RyaW5nPiovIHsgcmV0dXJuIGNzdHIucmVwbGFjZSgvKFxcJD9bQS1aXSopKFxcJD9cXGQqKS8sXCIkMSwkMlwiKS5zcGxpdChcIixcIik7IH1cbi8vZnVuY3Rpb24gZGVjb2RlX2NlbGwoY3N0ci8qOnN0cmluZyovKS8qOkNlbGxBZGRyZXNzKi8geyB2YXIgc3BsdCA9IHNwbGl0X2NlbGwoY3N0cik7IHJldHVybiB7IGM6ZGVjb2RlX2NvbChzcGx0WzBdKSwgcjpkZWNvZGVfcm93KHNwbHRbMV0pIH07IH1cbmZ1bmN0aW9uIGRlY29kZV9jZWxsKGNzdHIvKjpzdHJpbmcqLykvKjpDZWxsQWRkcmVzcyovIHtcblx0dmFyIFIgPSAwLCBDID0gMDtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGNzdHIubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgY2MgPSBjc3RyLmNoYXJDb2RlQXQoaSk7XG5cdFx0aWYoY2MgPj0gNDggJiYgY2MgPD0gNTcpIFIgPSAxMCAqIFIgKyAoY2MgLSA0OCk7XG5cdFx0ZWxzZSBpZihjYyA+PSA2NSAmJiBjYyA8PSA5MCkgQyA9IDI2ICogQyArIChjYyAtIDY0KTtcblx0fVxuXHRyZXR1cm4geyBjOiBDIC0gMSwgcjpSIC0gMSB9O1xufVxuLy9mdW5jdGlvbiBlbmNvZGVfY2VsbChjZWxsLyo6Q2VsbEFkZHJlc3MqLykvKjpzdHJpbmcqLyB7IHJldHVybiBlbmNvZGVfY29sKGNlbGwuYykgKyBlbmNvZGVfcm93KGNlbGwucik7IH1cbmZ1bmN0aW9uIGVuY29kZV9jZWxsKGNlbGwvKjpDZWxsQWRkcmVzcyovKS8qOnN0cmluZyovIHtcblx0dmFyIGNvbCA9IGNlbGwuYyArIDE7XG5cdHZhciBzPVwiXCI7XG5cdGZvcig7IGNvbDsgY29sPSgoY29sLTEpLzI2KXwwKSBzID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGNvbC0xKSUyNikgKyA2NSkgKyBzO1xuXHRyZXR1cm4gcyArIChjZWxsLnIgKyAxKTtcbn1cbmZ1bmN0aW9uIGRlY29kZV9yYW5nZShyYW5nZS8qOnN0cmluZyovKS8qOlJhbmdlKi8ge1xuXHR2YXIgaWR4ID0gcmFuZ2UuaW5kZXhPZihcIjpcIik7XG5cdGlmKGlkeCA9PSAtMSkgcmV0dXJuIHsgczogZGVjb2RlX2NlbGwocmFuZ2UpLCBlOiBkZWNvZGVfY2VsbChyYW5nZSkgfTtcblx0cmV0dXJuIHsgczogZGVjb2RlX2NlbGwocmFuZ2Uuc2xpY2UoMCwgaWR4KSksIGU6IGRlY29kZV9jZWxsKHJhbmdlLnNsaWNlKGlkeCArIDEpKSB9O1xufVxuLyojIGlmIG9ubHkgb25lIGFyZywgaXQgaXMgYXNzdW1lZCB0byBiZSBhIFJhbmdlLiAgSWYgMiBhcmdzLCBib3RoIGFyZSBjZWxsIGFkZHJlc3NlcyAqL1xuZnVuY3Rpb24gZW5jb2RlX3JhbmdlKGNzLyo6Q2VsbEFkZHJTcGVjfFJhbmdlKi8sY2UvKjo/Q2VsbEFkZHJTcGVjKi8pLyo6c3RyaW5nKi8ge1xuXHRpZih0eXBlb2YgY2UgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBjZSA9PT0gJ251bWJlcicpIHtcbi8qOjogaWYoIShjcyBpbnN0YW5jZW9mIFJhbmdlKSkgdGhyb3cgXCJ1bnJlYWNoYWJsZVwiOyAqL1xuXHRcdHJldHVybiBlbmNvZGVfcmFuZ2UoY3MucywgY3MuZSk7XG5cdH1cbi8qOjogaWYoKGNzIGluc3RhbmNlb2YgUmFuZ2UpKSB0aHJvdyBcInVucmVhY2hhYmxlXCI7ICovXG5cdGlmKHR5cGVvZiBjcyAhPT0gJ3N0cmluZycpIGNzID0gZW5jb2RlX2NlbGwoKGNzLyo6YW55Ki8pKTtcblx0aWYodHlwZW9mIGNlICE9PSAnc3RyaW5nJykgY2UgPSBlbmNvZGVfY2VsbCgoY2UvKjphbnkqLykpO1xuLyo6OiBpZih0eXBlb2YgY3MgIT09ICdzdHJpbmcnKSB0aHJvdyBcInVucmVhY2hhYmxlXCI7ICovXG4vKjo6IGlmKHR5cGVvZiBjZSAhPT0gJ3N0cmluZycpIHRocm93IFwidW5yZWFjaGFibGVcIjsgKi9cblx0cmV0dXJuIGNzID09IGNlID8gY3MgOiBjcyArIFwiOlwiICsgY2U7XG59XG5cbmZ1bmN0aW9uIHNhZmVfZGVjb2RlX3JhbmdlKHJhbmdlLyo6c3RyaW5nKi8pLyo6UmFuZ2UqLyB7XG5cdHZhciBvID0ge3M6e2M6MCxyOjB9LGU6e2M6MCxyOjB9fTtcblx0dmFyIGlkeCA9IDAsIGkgPSAwLCBjYyA9IDA7XG5cdHZhciBsZW4gPSByYW5nZS5sZW5ndGg7XG5cdGZvcihpZHggPSAwOyBpIDwgbGVuOyArK2kpIHtcblx0XHRpZigoY2M9cmFuZ2UuY2hhckNvZGVBdChpKS02NCkgPCAxIHx8IGNjID4gMjYpIGJyZWFrO1xuXHRcdGlkeCA9IDI2KmlkeCArIGNjO1xuXHR9XG5cdG8ucy5jID0gLS1pZHg7XG5cblx0Zm9yKGlkeCA9IDA7IGkgPCBsZW47ICsraSkge1xuXHRcdGlmKChjYz1yYW5nZS5jaGFyQ29kZUF0KGkpLTQ4KSA8IDAgfHwgY2MgPiA5KSBicmVhaztcblx0XHRpZHggPSAxMCppZHggKyBjYztcblx0fVxuXHRvLnMuciA9IC0taWR4O1xuXG5cdGlmKGkgPT09IGxlbiB8fCBjYyAhPSAxMCkgeyBvLmUuYz1vLnMuYzsgby5lLnI9by5zLnI7IHJldHVybiBvOyB9XG5cdCsraTtcblxuXHRmb3IoaWR4ID0gMDsgaSAhPSBsZW47ICsraSkge1xuXHRcdGlmKChjYz1yYW5nZS5jaGFyQ29kZUF0KGkpLTY0KSA8IDEgfHwgY2MgPiAyNikgYnJlYWs7XG5cdFx0aWR4ID0gMjYqaWR4ICsgY2M7XG5cdH1cblx0by5lLmMgPSAtLWlkeDtcblxuXHRmb3IoaWR4ID0gMDsgaSAhPSBsZW47ICsraSkge1xuXHRcdGlmKChjYz1yYW5nZS5jaGFyQ29kZUF0KGkpLTQ4KSA8IDAgfHwgY2MgPiA5KSBicmVhaztcblx0XHRpZHggPSAxMCppZHggKyBjYztcblx0fVxuXHRvLmUuciA9IC0taWR4O1xuXHRyZXR1cm4gbztcbn1cblxuZnVuY3Rpb24gc2FmZV9mb3JtYXRfY2VsbChjZWxsLyo6Q2VsbCovLCB2Lyo6YW55Ki8pIHtcblx0dmFyIHEgPSAoY2VsbC50ID09ICdkJyAmJiB2IGluc3RhbmNlb2YgRGF0ZSk7XG5cdGlmKGNlbGwueiAhPSBudWxsKSB0cnkgeyByZXR1cm4gKGNlbGwudyA9IFNTRl9mb3JtYXQoY2VsbC56LCBxID8gZGF0ZW51bSh2KSA6IHYpKTsgfSBjYXRjaChlKSB7IH1cblx0dHJ5IHsgcmV0dXJuIChjZWxsLncgPSBTU0ZfZm9ybWF0KChjZWxsLlhGfHx7fSkubnVtRm10SWR8fChxID8gMTQgOiAwKSwgIHEgPyBkYXRlbnVtKHYpIDogdikpOyB9IGNhdGNoKGUpIHsgcmV0dXJuICcnK3Y7IH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0X2NlbGwoY2VsbC8qOkNlbGwqLywgdi8qOmFueSovLCBvLyo6YW55Ki8pIHtcblx0aWYoY2VsbCA9PSBudWxsIHx8IGNlbGwudCA9PSBudWxsIHx8IGNlbGwudCA9PSAneicpIHJldHVybiBcIlwiO1xuXHRpZihjZWxsLncgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNlbGwudztcblx0aWYoY2VsbC50ID09ICdkJyAmJiAhY2VsbC56ICYmIG8gJiYgby5kYXRlTkYpIGNlbGwueiA9IG8uZGF0ZU5GO1xuXHRpZihjZWxsLnQgPT0gXCJlXCIpIHJldHVybiBCRXJyW2NlbGwudl0gfHwgY2VsbC52O1xuXHRpZih2ID09IHVuZGVmaW5lZCkgcmV0dXJuIHNhZmVfZm9ybWF0X2NlbGwoY2VsbCwgY2VsbC52KTtcblx0cmV0dXJuIHNhZmVfZm9ybWF0X2NlbGwoY2VsbCwgdik7XG59XG5cbmZ1bmN0aW9uIHNoZWV0X3RvX3dvcmtib29rKHNoZWV0Lyo6V29ya3NoZWV0Ki8sIG9wdHMpLyo6V29ya2Jvb2sqLyB7XG5cdHZhciBuID0gb3B0cyAmJiBvcHRzLnNoZWV0ID8gb3B0cy5zaGVldCA6IFwiU2hlZXQxXCI7XG5cdHZhciBzaGVldHMgPSB7fTsgc2hlZXRzW25dID0gc2hlZXQ7XG5cdHJldHVybiB7IFNoZWV0TmFtZXM6IFtuXSwgU2hlZXRzOiBzaGVldHMgfTtcbn1cblxuZnVuY3Rpb24gc2hlZXRfYWRkX2FvYShfd3MvKjo/V29ya3NoZWV0Ki8sIGRhdGEvKjpBT0EqLywgb3B0cy8qOj9hbnkqLykvKjpXb3Jrc2hlZXQqLyB7XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0dmFyIGRlbnNlID0gX3dzID8gQXJyYXkuaXNBcnJheShfd3MpIDogby5kZW5zZTtcblx0aWYoREVOU0UgIT0gbnVsbCAmJiBkZW5zZSA9PSBudWxsKSBkZW5zZSA9IERFTlNFO1xuXHR2YXIgd3MvKjpXb3Jrc2hlZXQqLyA9IF93cyB8fCAoZGVuc2UgPyAoW10vKjphbnkqLykgOiAoe30vKjphbnkqLykpO1xuXHR2YXIgX1IgPSAwLCBfQyA9IDA7XG5cdGlmKHdzICYmIG8ub3JpZ2luICE9IG51bGwpIHtcblx0XHRpZih0eXBlb2Ygby5vcmlnaW4gPT0gJ251bWJlcicpIF9SID0gby5vcmlnaW47XG5cdFx0ZWxzZSB7XG5cdFx0XHR2YXIgX29yaWdpbi8qOkNlbGxBZGRyZXNzKi8gPSB0eXBlb2Ygby5vcmlnaW4gPT0gXCJzdHJpbmdcIiA/IGRlY29kZV9jZWxsKG8ub3JpZ2luKSA6IG8ub3JpZ2luO1xuXHRcdFx0X1IgPSBfb3JpZ2luLnI7IF9DID0gX29yaWdpbi5jO1xuXHRcdH1cblx0XHRpZighd3NbXCIhcmVmXCJdKSB3c1tcIiFyZWZcIl0gPSBcIkExOkExXCI7XG5cdH1cblx0dmFyIHJhbmdlLyo6UmFuZ2UqLyA9ICh7czoge2M6MTAwMDAwMDAsIHI6MTAwMDAwMDB9LCBlOiB7YzowLCByOjB9fS8qOmFueSovKTtcblx0aWYod3NbJyFyZWYnXSkge1xuXHRcdHZhciBfcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0XHRyYW5nZS5zLmMgPSBfcmFuZ2Uucy5jO1xuXHRcdHJhbmdlLnMuciA9IF9yYW5nZS5zLnI7XG5cdFx0cmFuZ2UuZS5jID0gTWF0aC5tYXgocmFuZ2UuZS5jLCBfcmFuZ2UuZS5jKTtcblx0XHRyYW5nZS5lLnIgPSBNYXRoLm1heChyYW5nZS5lLnIsIF9yYW5nZS5lLnIpO1xuXHRcdGlmKF9SID09IC0xKSByYW5nZS5lLnIgPSBfUiA9IF9yYW5nZS5lLnIgKyAxO1xuXHR9XG5cdGZvcih2YXIgUiA9IDA7IFIgIT0gZGF0YS5sZW5ndGg7ICsrUikge1xuXHRcdGlmKCFkYXRhW1JdKSBjb250aW51ZTtcblx0XHRpZighQXJyYXkuaXNBcnJheShkYXRhW1JdKSkgdGhyb3cgbmV3IEVycm9yKFwiYW9hX3RvX3NoZWV0IGV4cGVjdHMgYW4gYXJyYXkgb2YgYXJyYXlzXCIpO1xuXHRcdGZvcih2YXIgQyA9IDA7IEMgIT0gZGF0YVtSXS5sZW5ndGg7ICsrQykge1xuXHRcdFx0aWYodHlwZW9mIGRhdGFbUl1bQ10gPT09ICd1bmRlZmluZWQnKSBjb250aW51ZTtcblx0XHRcdHZhciBjZWxsLyo6Q2VsbCovID0gKHt2OiBkYXRhW1JdW0NdIH0vKjphbnkqLyk7XG5cdFx0XHR2YXIgX19SID0gX1IgKyBSLCBfX0MgPSBfQyArIEM7XG5cdFx0XHRpZihyYW5nZS5zLnIgPiBfX1IpIHJhbmdlLnMuciA9IF9fUjtcblx0XHRcdGlmKHJhbmdlLnMuYyA+IF9fQykgcmFuZ2Uucy5jID0gX19DO1xuXHRcdFx0aWYocmFuZ2UuZS5yIDwgX19SKSByYW5nZS5lLnIgPSBfX1I7XG5cdFx0XHRpZihyYW5nZS5lLmMgPCBfX0MpIHJhbmdlLmUuYyA9IF9fQztcblx0XHRcdGlmKGRhdGFbUl1bQ10gJiYgdHlwZW9mIGRhdGFbUl1bQ10gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGFbUl1bQ10pICYmICEoZGF0YVtSXVtDXSBpbnN0YW5jZW9mIERhdGUpKSBjZWxsID0gZGF0YVtSXVtDXTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZihBcnJheS5pc0FycmF5KGNlbGwudikpIHsgY2VsbC5mID0gZGF0YVtSXVtDXVsxXTsgY2VsbC52ID0gY2VsbC52WzBdOyB9XG5cdFx0XHRcdGlmKGNlbGwudiA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmKGNlbGwuZikgY2VsbC50ID0gJ24nO1xuXHRcdFx0XHRcdGVsc2UgaWYoby5udWxsRXJyb3IpIHsgY2VsbC50ID0gJ2UnOyBjZWxsLnYgPSAwOyB9XG5cdFx0XHRcdFx0ZWxzZSBpZighby5zaGVldFN0dWJzKSBjb250aW51ZTtcblx0XHRcdFx0XHRlbHNlIGNlbGwudCA9ICd6Jztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmKHR5cGVvZiBjZWxsLnYgPT09ICdudW1iZXInKSBjZWxsLnQgPSAnbic7XG5cdFx0XHRcdGVsc2UgaWYodHlwZW9mIGNlbGwudiA9PT0gJ2Jvb2xlYW4nKSBjZWxsLnQgPSAnYic7XG5cdFx0XHRcdGVsc2UgaWYoY2VsbC52IGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0XHRcdGNlbGwueiA9IG8uZGF0ZU5GIHx8IHRhYmxlX2ZtdFsxNF07XG5cdFx0XHRcdFx0aWYoby5jZWxsRGF0ZXMpIHsgY2VsbC50ID0gJ2QnOyBjZWxsLncgPSBTU0ZfZm9ybWF0KGNlbGwueiwgZGF0ZW51bShjZWxsLnYpKTsgfVxuXHRcdFx0XHRcdGVsc2UgeyBjZWxsLnQgPSAnbic7IGNlbGwudiA9IGRhdGVudW0oY2VsbC52KTsgY2VsbC53ID0gU1NGX2Zvcm1hdChjZWxsLnosIGNlbGwudik7IH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGNlbGwudCA9ICdzJztcblx0XHRcdH1cblx0XHRcdGlmKGRlbnNlKSB7XG5cdFx0XHRcdGlmKCF3c1tfX1JdKSB3c1tfX1JdID0gW107XG5cdFx0XHRcdGlmKHdzW19fUl1bX19DXSAmJiB3c1tfX1JdW19fQ10ueikgY2VsbC56ID0gd3NbX19SXVtfX0NdLno7XG5cdFx0XHRcdHdzW19fUl1bX19DXSA9IGNlbGw7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgY2VsbF9yZWYgPSBlbmNvZGVfY2VsbCgoe2M6X19DLHI6X19SfS8qOmFueSovKSk7XG5cdFx0XHRcdGlmKHdzW2NlbGxfcmVmXSAmJiB3c1tjZWxsX3JlZl0ueikgY2VsbC56ID0gd3NbY2VsbF9yZWZdLno7XG5cdFx0XHRcdHdzW2NlbGxfcmVmXSA9IGNlbGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmKHJhbmdlLnMuYyA8IDEwMDAwMDAwKSB3c1snIXJlZiddID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0cmV0dXJuIHdzO1xufVxuZnVuY3Rpb24gYW9hX3RvX3NoZWV0KGRhdGEvKjpBT0EqLywgb3B0cy8qOj9hbnkqLykvKjpXb3Jrc2hlZXQqLyB7IHJldHVybiBzaGVldF9hZGRfYW9hKG51bGwsIGRhdGEsIG9wdHMpOyB9XG5cbmZ1bmN0aW9uIHBhcnNlX0ludDMyTEUoZGF0YSkge1xuXHRyZXR1cm4gZGF0YS5yZWFkX3NoaWZ0KDQsICdpJyk7XG59XG5mdW5jdGlvbiB3cml0ZV9VSW50MzJMRSh4Lyo6bnVtYmVyKi8sIG8pIHtcblx0aWYgKCFvKSBvID0gbmV3X2J1Zig0KTtcblx0by53cml0ZV9zaGlmdCg0LCB4KTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuMTY4ICovXG5mdW5jdGlvbiBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YS8qOjosIGxlbmd0aCovKS8qOnN0cmluZyovIHtcblx0dmFyIGNjaENoYXJhY3RlcnMgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBjY2hDaGFyYWN0ZXJzID09PSAwID8gXCJcIiA6IGRhdGEucmVhZF9zaGlmdChjY2hDaGFyYWN0ZXJzLCAnZGJjcycpO1xufVxuZnVuY3Rpb24gd3JpdGVfWExXaWRlU3RyaW5nKGRhdGEvKjpzdHJpbmcqLywgbykge1xuXHR2YXIgX251bGwgPSBmYWxzZTsgaWYgKG8gPT0gbnVsbCkgeyBfbnVsbCA9IHRydWU7IG8gPSBuZXdfYnVmKDQgKyAyICogZGF0YS5sZW5ndGgpOyB9XG5cdG8ud3JpdGVfc2hpZnQoNCwgZGF0YS5sZW5ndGgpO1xuXHRpZiAoZGF0YS5sZW5ndGggPiAwKSBvLndyaXRlX3NoaWZ0KDAsIGRhdGEsICdkYmNzJyk7XG5cdHJldHVybiBfbnVsbCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuOTEgKi9cbi8vZnVuY3Rpb24gcGFyc2VfTFBXaWRlU3RyaW5nKGRhdGEvKjo6LCBsZW5ndGgqLykvKjpzdHJpbmcqLyB7XG4vL1x0dmFyIGNjaENoYXJhY3RlcnMgPSBkYXRhLnJlYWRfc2hpZnQoMik7XG4vL1x0cmV0dXJuIGNjaENoYXJhY3RlcnMgPT09IDAgPyBcIlwiIDogZGF0YS5yZWFkX3NoaWZ0KGNjaENoYXJhY3RlcnMsIFwidXRmMTZsZVwiKTtcbi8vfVxuXG4vKiBbTVMtWExTQl0gMi41LjE0MyAqL1xuZnVuY3Rpb24gcGFyc2VfU3RyUnVuKGRhdGEpIHtcblx0cmV0dXJuIHsgaWNoOiBkYXRhLnJlYWRfc2hpZnQoMiksIGlmbnQ6IGRhdGEucmVhZF9zaGlmdCgyKSB9O1xufVxuZnVuY3Rpb24gd3JpdGVfU3RyUnVuKHJ1biwgbykge1xuXHRpZiAoIW8pIG8gPSBuZXdfYnVmKDQpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHJ1bi5pY2ggfHwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgcnVuLmlmbnQgfHwgMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi41LjEyMSAqL1xuZnVuY3Rpb24gcGFyc2VfUmljaFN0cihkYXRhLCBsZW5ndGgvKjpudW1iZXIqLykvKjpYTFN0cmluZyovIHtcblx0dmFyIHN0YXJ0ID0gZGF0YS5sO1xuXHR2YXIgZmxhZ3MgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBzdHIgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSk7XG5cdHZhciByZ3NTdHJSdW4gPSBbXTtcblx0dmFyIHogPSAoeyB0OiBzdHIsIGg6IHN0ciB9Lyo6YW55Ki8pO1xuXHRpZiAoKGZsYWdzICYgMSkgIT09IDApIHsgLyogZlJpY2hTdHIgKi9cblx0XHQvKiBUT0RPOiBmb3JtYXR0ZWQgc3RyaW5nICovXG5cdFx0dmFyIGR3U2l6ZVN0clJ1biA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSAhPSBkd1NpemVTdHJSdW47ICsraSkgcmdzU3RyUnVuLnB1c2gocGFyc2VfU3RyUnVuKGRhdGEpKTtcblx0XHR6LnIgPSByZ3NTdHJSdW47XG5cdH1cblx0ZWxzZSB6LnIgPSBbeyBpY2g6IDAsIGlmbnQ6IDAgfV07XG5cdC8vaWYoKGZsYWdzICYgMikgIT09IDApIHsgLyogZkV4dFN0ciAqL1xuXHQvL1x0LyogVE9ETzogcGhvbmV0aWMgc3RyaW5nICovXG5cdC8vfVxuXHRkYXRhLmwgPSBzdGFydCArIGxlbmd0aDtcblx0cmV0dXJuIHo7XG59XG5mdW5jdGlvbiB3cml0ZV9SaWNoU3RyKHN0ci8qOlhMU3RyaW5nKi8sIG8vKjo/QmxvY2sqLykvKjpCbG9jayovIHtcblx0LyogVE9ETzogZm9ybWF0dGVkIHN0cmluZyAqL1xuXHR2YXIgX251bGwgPSBmYWxzZTsgaWYgKG8gPT0gbnVsbCkgeyBfbnVsbCA9IHRydWU7IG8gPSBuZXdfYnVmKDE1ICsgNCAqIHN0ci50Lmxlbmd0aCk7IH1cblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKHN0ci50LCBvKTtcblx0cmV0dXJuIF9udWxsID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cbi8qIFtNUy1YTFNCXSAyLjQuMzI4IEJydENvbW1lbnRUZXh0IChSaWNoU3RyIHcvMSBydW4pICovXG52YXIgcGFyc2VfQnJ0Q29tbWVudFRleHQgPSBwYXJzZV9SaWNoU3RyO1xuZnVuY3Rpb24gd3JpdGVfQnJ0Q29tbWVudFRleHQoc3RyLyo6WExTdHJpbmcqLywgby8qOj9CbG9jayovKS8qOkJsb2NrKi8ge1xuXHQvKiBUT0RPOiBmb3JtYXR0ZWQgc3RyaW5nICovXG5cdHZhciBfbnVsbCA9IGZhbHNlOyBpZiAobyA9PSBudWxsKSB7IF9udWxsID0gdHJ1ZTsgbyA9IG5ld19idWYoMjMgKyA0ICogc3RyLnQubGVuZ3RoKTsgfVxuXHRvLndyaXRlX3NoaWZ0KDEsIDEpO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoc3RyLnQsIG8pO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDEpO1xuXHR3cml0ZV9TdHJSdW4oeyBpY2g6IDAsIGlmbnQ6IDAgfSwgbyk7XG5cdHJldHVybiBfbnVsbCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuOSAqL1xuZnVuY3Rpb24gcGFyc2VfWExTQkNlbGwoZGF0YSkvKjphbnkqLyB7XG5cdHZhciBjb2wgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBpU3R5bGVSZWYgPSBkYXRhLnJlYWRfc2hpZnQoMik7XG5cdGlTdHlsZVJlZiArPSBkYXRhLnJlYWRfc2hpZnQoMSkgPDwgMTY7XG5cdGRhdGEubCsrOyAvL3ZhciBmUGhTaG93ID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4geyBjOiBjb2wsIGlTdHlsZVJlZjogaVN0eWxlUmVmIH07XG59XG5mdW5jdGlvbiB3cml0ZV9YTFNCQ2VsbChjZWxsLyo6YW55Ki8sIG8vKjo/QmxvY2sqLykge1xuXHRpZiAobyA9PSBudWxsKSBvID0gbmV3X2J1Zig4KTtcblx0by53cml0ZV9zaGlmdCgtNCwgY2VsbC5jKTtcblx0by53cml0ZV9zaGlmdCgzLCBjZWxsLmlTdHlsZVJlZiB8fCBjZWxsLnMpO1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiBmUGhTaG93ICovXG5cdHJldHVybiBvO1xufVxuXG4vKiBTaG9ydCBYTFNCIENlbGwgZG9lcyBub3QgaW5jbHVkZSBjb2x1bW4gKi9cbmZ1bmN0aW9uIHBhcnNlX1hMU0JTaG9ydENlbGwoZGF0YSkvKjphbnkqLyB7XG5cdHZhciBpU3R5bGVSZWYgPSBkYXRhLnJlYWRfc2hpZnQoMik7XG5cdGlTdHlsZVJlZiArPSBkYXRhLnJlYWRfc2hpZnQoMSkgPDwxNjtcblx0ZGF0YS5sKys7IC8vdmFyIGZQaFNob3cgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiB7IGM6LTEsIGlTdHlsZVJlZjogaVN0eWxlUmVmIH07XG59XG5mdW5jdGlvbiB3cml0ZV9YTFNCU2hvcnRDZWxsKGNlbGwvKjphbnkqLywgby8qOj9CbG9jayovKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoNCk7XG5cdG8ud3JpdGVfc2hpZnQoMywgY2VsbC5pU3R5bGVSZWYgfHwgY2VsbC5zKTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLyogZlBoU2hvdyAqL1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNS4yMSAqL1xudmFyIHBhcnNlX1hMU0JDb2RlTmFtZSA9IHBhcnNlX1hMV2lkZVN0cmluZztcbnZhciB3cml0ZV9YTFNCQ29kZU5hbWUgPSB3cml0ZV9YTFdpZGVTdHJpbmc7XG5cbi8qIFtNUy1YTFNCXSAyLjUuMTY2ICovXG5mdW5jdGlvbiBwYXJzZV9YTE51bGxhYmxlV2lkZVN0cmluZyhkYXRhLyo6OiwgbGVuZ3RoKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgY2NoQ2hhcmFjdGVycyA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0cmV0dXJuIGNjaENoYXJhY3RlcnMgPT09IDAgfHwgY2NoQ2hhcmFjdGVycyA9PT0gMHhGRkZGRkZGRiA/IFwiXCIgOiBkYXRhLnJlYWRfc2hpZnQoY2NoQ2hhcmFjdGVycywgJ2RiY3MnKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1hMTnVsbGFibGVXaWRlU3RyaW5nKGRhdGEvKjpzdHJpbmcqLywgbykge1xuXHR2YXIgX251bGwgPSBmYWxzZTsgaWYgKG8gPT0gbnVsbCkgeyBfbnVsbCA9IHRydWU7IG8gPSBuZXdfYnVmKDEyNyk7IH1cblx0by53cml0ZV9zaGlmdCg0LCBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhLmxlbmd0aCA6IDB4RkZGRkZGRkYpO1xuXHRpZiAoZGF0YS5sZW5ndGggPiAwKSBvLndyaXRlX3NoaWZ0KDAsIGRhdGEsICdkYmNzJyk7XG5cdHJldHVybiBfbnVsbCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuMTY1ICovXG52YXIgcGFyc2VfWExOYW1lV2lkZVN0cmluZyA9IHBhcnNlX1hMV2lkZVN0cmluZztcbi8vdmFyIHdyaXRlX1hMTmFtZVdpZGVTdHJpbmcgPSB3cml0ZV9YTFdpZGVTdHJpbmc7XG5cbi8qIFtNUy1YTFNCXSAyLjUuMTE0ICovXG52YXIgcGFyc2VfUmVsSUQgPSBwYXJzZV9YTE51bGxhYmxlV2lkZVN0cmluZztcbnZhciB3cml0ZV9SZWxJRCA9IHdyaXRlX1hMTnVsbGFibGVXaWRlU3RyaW5nO1xuXG5cbi8qIFtNUy1YTFNdIDIuNS4yMTcgOyBbTVMtWExTQl0gMi41LjEyMiAqL1xuZnVuY3Rpb24gcGFyc2VfUmtOdW1iZXIoZGF0YSkvKjpudW1iZXIqLyB7XG5cdHZhciBiID0gZGF0YS5zbGljZShkYXRhLmwsIGRhdGEubCArIDQpO1xuXHR2YXIgZlgxMDAgPSAoYlswXSAmIDEpLCBmSW50ID0gKGJbMF0gJiAyKTtcblx0ZGF0YS5sICs9IDQ7XG5cdHZhciBSSyA9IGZJbnQgPT09IDAgPyBfX2RvdWJsZShbMCwgMCwgMCwgMCwgKGJbMF0gJiAweEZDKSwgYlsxXSwgYlsyXSwgYlszXV0sIDApIDogX19yZWFkSW50MzJMRShiLCAwKSA+PiAyO1xuXHRyZXR1cm4gZlgxMDAgPyAoUksgLyAxMDApIDogUks7XG59XG5mdW5jdGlvbiB3cml0ZV9Sa051bWJlcihkYXRhLyo6bnVtYmVyKi8sIG8pIHtcblx0aWYgKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoNCk7XG5cdHZhciBmWDEwMCA9IDAsIGZJbnQgPSAwLCBkMTAwID0gZGF0YSAqIDEwMDtcblx0aWYgKChkYXRhID09IChkYXRhIHwgMCkpICYmIChkYXRhID49IC0oMSA8PCAyOSkpICYmIChkYXRhIDwgKDEgPDwgMjkpKSkgeyBmSW50ID0gMTsgfVxuXHRlbHNlIGlmICgoZDEwMCA9PSAoZDEwMCB8IDApKSAmJiAoZDEwMCA+PSAtKDEgPDwgMjkpKSAmJiAoZDEwMCA8ICgxIDw8IDI5KSkpIHsgZkludCA9IDE7IGZYMTAwID0gMTsgfVxuXHRpZiAoZkludCkgby53cml0ZV9zaGlmdCgtNCwgKChmWDEwMCA/IGQxMDAgOiBkYXRhKSA8PCAyKSArIChmWDEwMCArIDIpKTtcblx0ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBSa051bWJlciBcIiArIGRhdGEpOyAvLyBUT0RPXG59XG5cblxuLyogW01TLVhMU0JdIDIuNS4xMTcgUmZYICovXG5mdW5jdGlvbiBwYXJzZV9SZlgoZGF0YSAvKjo6LCBsZW5ndGgqLykvKjpSYW5nZSovIHtcblx0dmFyIGNlbGwvKjpSYW5nZSovID0gKHsgczoge30sIGU6IHt9IH0vKjphbnkqLyk7XG5cdGNlbGwucy5yID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRjZWxsLmUuciA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0Y2VsbC5zLmMgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdGNlbGwuZS5jID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRyZXR1cm4gY2VsbDtcbn1cbmZ1bmN0aW9uIHdyaXRlX1JmWChyLyo6UmFuZ2UqLywgbykge1xuXHRpZiAoIW8pIG8gPSBuZXdfYnVmKDE2KTtcblx0by53cml0ZV9zaGlmdCg0LCByLnMucik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgci5lLnIpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIHIucy5jKTtcblx0by53cml0ZV9zaGlmdCg0LCByLmUuYyk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi41LjE1MyBVbmNoZWNrZWRSZlggKi9cbnZhciBwYXJzZV9VbmNoZWNrZWRSZlggPSBwYXJzZV9SZlg7XG52YXIgd3JpdGVfVW5jaGVja2VkUmZYID0gd3JpdGVfUmZYO1xuXG4vKiBbTVMtWExTQl0gMi41LjE1NSBVbmNoZWNrZWRTcVJmWCAqL1xuLy9mdW5jdGlvbiBwYXJzZV9VbmNoZWNrZWRTcVJmWChkYXRhKSB7XG4vL1x0dmFyIGNudCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcbi8vXHR2YXIgb3V0ID0gW107XG4vL1x0Zm9yKHZhciBpID0gMDsgaSA8IGNudDsgKytpKSB7XG4vL1x0XHR2YXIgcm5nID0gcGFyc2VfVW5jaGVja2VkUmZYKGRhdGEpO1xuLy9cdFx0b3V0LnB1c2goZW5jb2RlX3JhbmdlKHJuZykpO1xuLy9cdH1cbi8vXHRyZXR1cm4gb3V0LmpvaW4oXCIsXCIpO1xuLy99XG4vL2Z1bmN0aW9uIHdyaXRlX1VuY2hlY2tlZFNxUmZYKHNxcmZ4Lyo6c3RyaW5nKi8pIHtcbi8vXHR2YXIgcGFydHMgPSBzcXJmeC5zcGxpdCgvXFxzKixcXHMqLyk7XG4vL1x0dmFyIG8gPSBuZXdfYnVmKDQpOyBvLndyaXRlX3NoaWZ0KDQsIHBhcnRzLmxlbmd0aCk7XG4vL1x0dmFyIG91dCA9IFtvXTtcbi8vXHRwYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uKHJuZykge1xuLy9cdFx0b3V0LnB1c2god3JpdGVfVW5jaGVja2VkUmZYKHNhZmVfZGVjb2RlX3JhbmdlKHJuZykpKTtcbi8vXHR9KTtcbi8vXHRyZXR1cm4gYmNvbmNhdChvdXQpO1xuLy99XG5cbi8qIFtNUy1YTFNdIDIuNS4zNDIgOyBbTVMtWExTQl0gMi41LjE3MSAqL1xuLyogVE9ETzogZXJyb3IgY2hlY2tpbmcsIE5hTiBhbmQgSW5maW5pdHkgdmFsdWVzIGFyZSBub3QgdmFsaWQgWG51bSAqL1xuZnVuY3Rpb24gcGFyc2VfWG51bShkYXRhLyo6OiwgbGVuZ3RoKi8pIHtcblx0aWYoZGF0YS5sZW5ndGggLSBkYXRhLmwgPCA4KSB0aHJvdyBcIlhMUyBYbnVtIEJ1ZmZlciB1bmRlcmZsb3dcIjtcblx0cmV0dXJuIGRhdGEucmVhZF9zaGlmdCg4LCAnZicpO1xufVxuZnVuY3Rpb24gd3JpdGVfWG51bShkYXRhLCBvKSB7IHJldHVybiAobyB8fCBuZXdfYnVmKDgpKS53cml0ZV9zaGlmdCg4LCBkYXRhLCAnZicpOyB9XG5cbi8qIFtNUy1YTFNCXSAyLjQuMzI0IEJydENvbG9yICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDb2xvcihkYXRhLyo6OiwgbGVuZ3RoKi8pIHtcblx0dmFyIG91dCA9IHt9O1xuXHR2YXIgZCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblxuXHQvL3ZhciBmVmFsaWRSR0IgPSBkICYgMTtcblx0dmFyIHhDb2xvclR5cGUgPSBkID4+PiAxO1xuXG5cdHZhciBpbmRleCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIG5UUyA9IGRhdGEucmVhZF9zaGlmdCgyLCAnaScpO1xuXHR2YXIgYlIgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBiRyA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIGJCID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRkYXRhLmwrKzsgLy92YXIgYkFscGhhID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXG5cdHN3aXRjaCAoeENvbG9yVHlwZSkge1xuXHRcdGNhc2UgMDogb3V0LmF1dG8gPSAxOyBicmVhaztcblx0XHRjYXNlIDE6XG5cdFx0XHRvdXQuaW5kZXggPSBpbmRleDtcblx0XHRcdHZhciBpY3YgPSBYTFNJY3ZbaW5kZXhdO1xuXHRcdFx0LyogYXV0b21hdGljIHBzZXVkbyBpbmRleCA4MSAqL1xuXHRcdFx0aWYgKGljdikgb3V0LnJnYiA9IHJnYjJIZXgoaWN2KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdC8qIGlmKCFmVmFsaWRSR0IpIHRocm93IG5ldyBFcnJvcihcImludmFsaWRcIik7ICovXG5cdFx0XHRvdXQucmdiID0gcmdiMkhleChbYlIsIGJHLCBiQl0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOiBvdXQudGhlbWUgPSBpbmRleDsgYnJlYWs7XG5cdH1cblx0aWYgKG5UUyAhPSAwKSBvdXQudGludCA9IG5UUyA+IDAgPyBuVFMgLyAzMjc2NyA6IG5UUyAvIDMyNzY4O1xuXG5cdHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRDb2xvcihjb2xvciwgbykge1xuXHRpZiAoIW8pIG8gPSBuZXdfYnVmKDgpO1xuXHRpZiAoIWNvbG9yIHx8IGNvbG9yLmF1dG8pIHsgby53cml0ZV9zaGlmdCg0LCAwKTsgby53cml0ZV9zaGlmdCg0LCAwKTsgcmV0dXJuIG87IH1cblx0aWYgKGNvbG9yLmluZGV4ICE9IG51bGwpIHtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4MDIpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgY29sb3IuaW5kZXgpO1xuXHR9IGVsc2UgaWYgKGNvbG9yLnRoZW1lICE9IG51bGwpIHtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4MDYpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgY29sb3IudGhlbWUpO1xuXHR9IGVsc2Uge1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgMHgwNSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0fVxuXHR2YXIgblRTID0gY29sb3IudGludCB8fCAwO1xuXHRpZiAoblRTID4gMCkgblRTICo9IDMyNzY3O1xuXHRlbHNlIGlmIChuVFMgPCAwKSBuVFMgKj0gMzI3Njg7XG5cdG8ud3JpdGVfc2hpZnQoMiwgblRTKTtcblx0aWYgKCFjb2xvci5yZ2IgfHwgY29sb3IudGhlbWUgIT0gbnVsbCkge1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHR9IGVsc2Uge1xuXHRcdHZhciByZ2IgPSAoY29sb3IucmdiIHx8ICdGRkZGRkYnKTtcblx0XHRpZiAodHlwZW9mIHJnYiA9PSAnbnVtYmVyJykgcmdiID0gKFwiMDAwMDAwXCIgKyByZ2IudG9TdHJpbmcoMTYpKS5zbGljZSgtNik7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBwYXJzZUludChyZ2Iuc2xpY2UoMCwgMiksIDE2KSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBwYXJzZUludChyZ2Iuc2xpY2UoMiwgNCksIDE2KSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBwYXJzZUludChyZ2Iuc2xpY2UoNCwgNiksIDE2KSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAweEZGKTtcblx0fVxuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNS41MiAqL1xuZnVuY3Rpb24gcGFyc2VfRm9udEZsYWdzKGRhdGEvKjo6LCBsZW5ndGgsIG9wdHMqLykge1xuXHR2YXIgZCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0ZGF0YS5sKys7XG5cdHZhciBvdXQgPSB7XG5cdFx0ZkJvbGQ6IGQgJiAweDAxLFxuXHRcdGZJdGFsaWM6IGQgJiAweDAyLFxuXHRcdGZVbmRlcmxpbmU6IGQgJiAweDA0LFxuXHRcdGZTdHJpa2VvdXQ6IGQgJiAweDA4LFxuXHRcdGZPdXRsaW5lOiBkICYgMHgxMCxcblx0XHRmU2hhZG93OiBkICYgMHgyMCxcblx0XHRmQ29uZGVuc2U6IGQgJiAweDQwLFxuXHRcdGZFeHRlbmQ6IGQgJiAweDgwXG5cdH07XG5cdHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9Gb250RmxhZ3MoZm9udCwgbykge1xuXHRpZiAoIW8pIG8gPSBuZXdfYnVmKDIpO1xuXHR2YXIgZ3JiaXQgPVxuXHRcdChmb250Lml0YWxpYyA/IDB4MDIgOiAwKSB8XG5cdFx0KGZvbnQuc3RyaWtlID8gMHgwOCA6IDApIHxcblx0XHQoZm9udC5vdXRsaW5lID8gMHgxMCA6IDApIHxcblx0XHQoZm9udC5zaGFkb3cgPyAweDIwIDogMCkgfFxuXHRcdChmb250LmNvbmRlbnNlID8gMHg0MCA6IDApIHxcblx0XHQoZm9udC5leHRlbmQgPyAweDgwIDogMCk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgZ3JiaXQpO1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLU9MRURTXSAyLjMuMSBhbmQgMi4zLjIgKi9cbmZ1bmN0aW9uIHBhcnNlX0NsaXBib2FyZEZvcm1hdE9yU3RyaW5nKG8sIHcvKjpudW1iZXIqLykvKjpzdHJpbmcqLyB7XG5cdC8vICRGbG93SWdub3JlXG5cdHZhciBDbGlwRm10ID0geyAyOiBcIkJJVE1BUFwiLCAzOiBcIk1FVEFGSUxFUElDVFwiLCA4OiBcIkRJQlwiLCAxNDogXCJFTkhNRVRBRklMRVwiIH07XG5cdHZhciBtLyo6bnVtYmVyKi8gPSBvLnJlYWRfc2hpZnQoNCk7XG5cdHN3aXRjaCAobSkge1xuXHRcdGNhc2UgMHgwMDAwMDAwMDogcmV0dXJuIFwiXCI7XG5cdFx0Y2FzZSAweGZmZmZmZmZmOiBjYXNlIDB4ZmZmZmZmZmU6IHJldHVybiBDbGlwRm10W28ucmVhZF9zaGlmdCg0KV0gfHwgXCJcIjtcblx0fVxuXHRpZiAobSA+IDB4MTkwKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBDbGlwYm9hcmQ6IFwiICsgbS50b1N0cmluZygxNikpO1xuXHRvLmwgLT0gNDtcblx0cmV0dXJuIG8ucmVhZF9zaGlmdCgwLCB3ID09IDEgPyBcImxwc3RyXCIgOiBcImxwd3N0clwiKTtcbn1cbmZ1bmN0aW9uIHBhcnNlX0NsaXBib2FyZEZvcm1hdE9yQW5zaVN0cmluZyhvKSB7IHJldHVybiBwYXJzZV9DbGlwYm9hcmRGb3JtYXRPclN0cmluZyhvLCAxKTsgfVxuZnVuY3Rpb24gcGFyc2VfQ2xpcGJvYXJkRm9ybWF0T3JVbmljb2RlU3RyaW5nKG8pIHsgcmV0dXJuIHBhcnNlX0NsaXBib2FyZEZvcm1hdE9yU3RyaW5nKG8sIDIpOyB9XG5cbi8qIFtNUy1PTEVQU10gMi4yIFByb3BlcnR5VHlwZSAqL1xuLy8gTm90ZTogc29tZSB0cmVlIHNoYWtlcnMgY2Fubm90IGhhbmRsZSBWVF9WRUNUT1IgfCAkQ09OU1QsIGhlbmNlIGV4dHJhIHZhcnNcbi8vdmFyIFZUX0VNUFRZICAgID0gMHgwMDAwO1xuLy92YXIgVlRfTlVMTCAgICAgPSAweDAwMDE7XG52YXIgVlRfSTIgICAgICAgPSAweDAwMDI7XG52YXIgVlRfSTQgICAgICAgPSAweDAwMDM7XG4vL3ZhciBWVF9SNCAgICAgICA9IDB4MDAwNDtcbi8vdmFyIFZUX1I4ICAgICAgID0gMHgwMDA1O1xuLy92YXIgVlRfQ1kgICAgICAgPSAweDAwMDY7XG4vL3ZhciBWVF9EQVRFICAgICA9IDB4MDAwNztcbi8vdmFyIFZUX0JTVFIgICAgID0gMHgwMDA4O1xuLy92YXIgVlRfRVJST1IgICAgPSAweDAwMEE7XG52YXIgVlRfQk9PTCAgICAgPSAweDAwMEI7XG52YXIgVlRfVkFSSUFOVCAgPSAweDAwMEM7XG4vL3ZhciBWVF9ERUNJTUFMICA9IDB4MDAwRTtcbi8vdmFyIFZUX0kxICAgICAgID0gMHgwMDEwO1xuLy92YXIgVlRfVUkxICAgICAgPSAweDAwMTE7XG4vL3ZhciBWVF9VSTIgICAgICA9IDB4MDAxMjtcbnZhciBWVF9VSTQgICAgICA9IDB4MDAxMztcbi8vdmFyIFZUX0k4ICAgICAgID0gMHgwMDE0O1xuLy92YXIgVlRfVUk4ICAgICAgPSAweDAwMTU7XG4vL3ZhciBWVF9JTlQgICAgICA9IDB4MDAxNjtcbi8vdmFyIFZUX1VJTlQgICAgID0gMHgwMDE3O1xudmFyIFZUX0xQU1RSICAgID0gMHgwMDFFO1xuLy92YXIgVlRfTFBXU1RSICAgPSAweDAwMUY7XG52YXIgVlRfRklMRVRJTUUgPSAweDAwNDA7XG52YXIgVlRfQkxPQiAgICAgPSAweDAwNDE7XG4vL3ZhciBWVF9TVFJFQU0gICA9IDB4MDA0Mjtcbi8vdmFyIFZUX1NUT1JBR0UgID0gMHgwMDQzO1xuLy92YXIgVlRfU1RSRUFNRURfT2JqZWN0ICA9IDB4MDA0NDtcbi8vdmFyIFZUX1NUT1JFRF9PYmplY3QgICAgPSAweDAwNDU7XG4vL3ZhciBWVF9CTE9CX09iamVjdCAgICAgID0gMHgwMDQ2O1xudmFyIFZUX0NGICAgICAgID0gMHgwMDQ3O1xuLy92YXIgVlRfQ0xTSUQgICAgPSAweDAwNDg7XG4vL3ZhciBWVF9WRVJTSU9ORURfU1RSRUFNID0gMHgwMDQ5O1xudmFyIFZUX1ZFQ1RPUiAgID0gMHgxMDAwO1xudmFyIFZUX1ZFQ1RPUl9WQVJJQU5UID0gMHgxMDBDO1xudmFyIFZUX1ZFQ1RPUl9MUFNUUiAgID0gMHgxMDFFO1xuLy92YXIgVlRfQVJSQVkgICAgPSAweDIwMDA7XG5cbnZhciBWVF9TVFJJTkcgICA9IDB4MDA1MDsgLy8gMi4zLjMuMS4xMSBWdFN0cmluZ1xudmFyIFZUX1VTVFIgICAgID0gMHgwMDUxOyAvLyAyLjMuMy4xLjEyIFZ0VW5hbGlnbmVkU3RyaW5nXG52YXIgVlRfQ1VTVE9NICAgPSBbVlRfU1RSSU5HLCBWVF9VU1RSXTtcblxuLyogW01TLU9TSEFSRURdIDIuMy4zLjIuMi4xIERvY3VtZW50IFN1bW1hcnkgSW5mb3JtYXRpb24gUElERFNJICovXG52YXIgRG9jU3VtbWFyeVBJRERTSSA9IHtcblx0Lyo6OlsqLzB4MDEvKjo6XSovOiB7IG46ICdDb2RlUGFnZScsIHQ6IFZUX0kyIH0sXG5cdC8qOjpbKi8weDAyLyo6Ol0qLzogeyBuOiAnQ2F0ZWdvcnknLCB0OiBWVF9TVFJJTkcgfSxcblx0Lyo6OlsqLzB4MDMvKjo6XSovOiB7IG46ICdQcmVzZW50YXRpb25Gb3JtYXQnLCB0OiBWVF9TVFJJTkcgfSxcblx0Lyo6OlsqLzB4MDQvKjo6XSovOiB7IG46ICdCeXRlQ291bnQnLCB0OiBWVF9JNCB9LFxuXHQvKjo6WyovMHgwNS8qOjpdKi86IHsgbjogJ0xpbmVDb3VudCcsIHQ6IFZUX0k0IH0sXG5cdC8qOjpbKi8weDA2Lyo6Ol0qLzogeyBuOiAnUGFyYWdyYXBoQ291bnQnLCB0OiBWVF9JNCB9LFxuXHQvKjo6WyovMHgwNy8qOjpdKi86IHsgbjogJ1NsaWRlQ291bnQnLCB0OiBWVF9JNCB9LFxuXHQvKjo6WyovMHgwOC8qOjpdKi86IHsgbjogJ05vdGVDb3VudCcsIHQ6IFZUX0k0IH0sXG5cdC8qOjpbKi8weDA5Lyo6Ol0qLzogeyBuOiAnSGlkZGVuQ291bnQnLCB0OiBWVF9JNCB9LFxuXHQvKjo6WyovMHgwYS8qOjpdKi86IHsgbjogJ011bHRpbWVkaWFDbGlwQ291bnQnLCB0OiBWVF9JNCB9LFxuXHQvKjo6WyovMHgwYi8qOjpdKi86IHsgbjogJ1NjYWxlQ3JvcCcsIHQ6IFZUX0JPT0wgfSxcblx0Lyo6OlsqLzB4MGMvKjo6XSovOiB7IG46ICdIZWFkaW5nUGFpcnMnLCB0OiBWVF9WRUNUT1JfVkFSSUFOVCAvKiBWVF9WRUNUT1IgfCBWVF9WQVJJQU5UICovIH0sXG5cdC8qOjpbKi8weDBkLyo6Ol0qLzogeyBuOiAnVGl0bGVzT2ZQYXJ0cycsIHQ6IFZUX1ZFQ1RPUl9MUFNUUiAvKiBWVF9WRUNUT1IgfCBWVF9MUFNUUiAqLyB9LFxuXHQvKjo6WyovMHgwZS8qOjpdKi86IHsgbjogJ01hbmFnZXInLCB0OiBWVF9TVFJJTkcgfSxcblx0Lyo6OlsqLzB4MGYvKjo6XSovOiB7IG46ICdDb21wYW55JywgdDogVlRfU1RSSU5HIH0sXG5cdC8qOjpbKi8weDEwLyo6Ol0qLzogeyBuOiAnTGlua3NVcFRvRGF0ZScsIHQ6IFZUX0JPT0wgfSxcblx0Lyo6OlsqLzB4MTEvKjo6XSovOiB7IG46ICdDaGFyYWN0ZXJDb3VudCcsIHQ6IFZUX0k0IH0sXG5cdC8qOjpbKi8weDEzLyo6Ol0qLzogeyBuOiAnU2hhcmVkRG9jJywgdDogVlRfQk9PTCB9LFxuXHQvKjo6WyovMHgxNi8qOjpdKi86IHsgbjogJ0h5cGVybGlua3NDaGFuZ2VkJywgdDogVlRfQk9PTCB9LFxuXHQvKjo6WyovMHgxNy8qOjpdKi86IHsgbjogJ0FwcFZlcnNpb24nLCB0OiBWVF9JNCwgcDogJ3ZlcnNpb24nIH0sXG5cdC8qOjpbKi8weDE4Lyo6Ol0qLzogeyBuOiAnRGlnU2lnJywgdDogVlRfQkxPQiB9LFxuXHQvKjo6WyovMHgxQS8qOjpdKi86IHsgbjogJ0NvbnRlbnRUeXBlJywgdDogVlRfU1RSSU5HIH0sXG5cdC8qOjpbKi8weDFCLyo6Ol0qLzogeyBuOiAnQ29udGVudFN0YXR1cycsIHQ6IFZUX1NUUklORyB9LFxuXHQvKjo6WyovMHgxQy8qOjpdKi86IHsgbjogJ0xhbmd1YWdlJywgdDogVlRfU1RSSU5HIH0sXG5cdC8qOjpbKi8weDFELyo6Ol0qLzogeyBuOiAnVmVyc2lvbicsIHQ6IFZUX1NUUklORyB9LFxuXHQvKjo6WyovMHhGRi8qOjpdKi86IHt9LFxuXHQvKiBbTVMtT0xFUFNdIDIuMTggKi9cblx0Lyo6OlsqLzB4ODAwMDAwMDAvKjo6XSovOiB7IG46ICdMb2NhbGUnLCB0OiBWVF9VSTQgfSxcblx0Lyo6OlsqLzB4ODAwMDAwMDMvKjo6XSovOiB7IG46ICdCZWhhdmlvcicsIHQ6IFZUX1VJNCB9LFxuXHQvKjo6WyovMHg3MjYyNzI2Mi8qOjpdKi86IHt9XG59O1xuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMi4xLjEgU3VtbWFyeSBJbmZvcm1hdGlvbiBQcm9wZXJ0eSBTZXQgUElEU0kgKi9cbnZhciBTdW1tYXJ5UElEU0kgPSB7XG5cdC8qOjpbKi8weDAxLyo6Ol0qLzogeyBuOiAnQ29kZVBhZ2UnLCB0OiBWVF9JMiB9LFxuXHQvKjo6WyovMHgwMi8qOjpdKi86IHsgbjogJ1RpdGxlJywgdDogVlRfU1RSSU5HIH0sXG5cdC8qOjpbKi8weDAzLyo6Ol0qLzogeyBuOiAnU3ViamVjdCcsIHQ6IFZUX1NUUklORyB9LFxuXHQvKjo6WyovMHgwNC8qOjpdKi86IHsgbjogJ0F1dGhvcicsIHQ6IFZUX1NUUklORyB9LFxuXHQvKjo6WyovMHgwNS8qOjpdKi86IHsgbjogJ0tleXdvcmRzJywgdDogVlRfU1RSSU5HIH0sXG5cdC8qOjpbKi8weDA2Lyo6Ol0qLzogeyBuOiAnQ29tbWVudHMnLCB0OiBWVF9TVFJJTkcgfSxcblx0Lyo6OlsqLzB4MDcvKjo6XSovOiB7IG46ICdUZW1wbGF0ZScsIHQ6IFZUX1NUUklORyB9LFxuXHQvKjo6WyovMHgwOC8qOjpdKi86IHsgbjogJ0xhc3RBdXRob3InLCB0OiBWVF9TVFJJTkcgfSxcblx0Lyo6OlsqLzB4MDkvKjo6XSovOiB7IG46ICdSZXZOdW1iZXInLCB0OiBWVF9TVFJJTkcgfSxcblx0Lyo6OlsqLzB4MEEvKjo6XSovOiB7IG46ICdFZGl0VGltZScsIHQ6IFZUX0ZJTEVUSU1FIH0sXG5cdC8qOjpbKi8weDBCLyo6Ol0qLzogeyBuOiAnTGFzdFByaW50ZWQnLCB0OiBWVF9GSUxFVElNRSB9LFxuXHQvKjo6WyovMHgwQy8qOjpdKi86IHsgbjogJ0NyZWF0ZWREYXRlJywgdDogVlRfRklMRVRJTUUgfSxcblx0Lyo6OlsqLzB4MEQvKjo6XSovOiB7IG46ICdNb2RpZmllZERhdGUnLCB0OiBWVF9GSUxFVElNRSB9LFxuXHQvKjo6WyovMHgwRS8qOjpdKi86IHsgbjogJ1BhZ2VDb3VudCcsIHQ6IFZUX0k0IH0sXG5cdC8qOjpbKi8weDBGLyo6Ol0qLzogeyBuOiAnV29yZENvdW50JywgdDogVlRfSTQgfSxcblx0Lyo6OlsqLzB4MTAvKjo6XSovOiB7IG46ICdDaGFyQ291bnQnLCB0OiBWVF9JNCB9LFxuXHQvKjo6WyovMHgxMS8qOjpdKi86IHsgbjogJ1RodW1ibmFpbCcsIHQ6IFZUX0NGIH0sXG5cdC8qOjpbKi8weDEyLyo6Ol0qLzogeyBuOiAnQXBwbGljYXRpb24nLCB0OiBWVF9TVFJJTkcgfSxcblx0Lyo6OlsqLzB4MTMvKjo6XSovOiB7IG46ICdEb2NTZWN1cml0eScsIHQ6IFZUX0k0IH0sXG5cdC8qOjpbKi8weEZGLyo6Ol0qLzoge30sXG5cdC8qIFtNUy1PTEVQU10gMi4xOCAqL1xuXHQvKjo6WyovMHg4MDAwMDAwMC8qOjpdKi86IHsgbjogJ0xvY2FsZScsIHQ6IFZUX1VJNCB9LFxuXHQvKjo6WyovMHg4MDAwMDAwMy8qOjpdKi86IHsgbjogJ0JlaGF2aW9yJywgdDogVlRfVUk0IH0sXG5cdC8qOjpbKi8weDcyNjI3MjYyLyo6Ol0qLzoge31cbn07XG5cbi8qIFtNUy1YTFNdIDIuNC42MyBDb3VudHJ5L1JlZ2lvbiBjb2RlcyAqL1xudmFyIENvdW50cnlFbnVtID0ge1xuXHQvKjo6WyovMHgwMDAxLyo6Ol0qLzogXCJVU1wiLCAvLyBVbml0ZWQgU3RhdGVzXG5cdC8qOjpbKi8weDAwMDIvKjo6XSovOiBcIkNBXCIsIC8vIENhbmFkYVxuXHQvKjo6WyovMHgwMDAzLyo6Ol0qLzogXCJcIiwgLy8gTGF0aW4gQW1lcmljYSAoZXhjZXB0IEJyYXppbClcblx0Lyo6OlsqLzB4MDAwNy8qOjpdKi86IFwiUlVcIiwgLy8gUnVzc2lhXG5cdC8qOjpbKi8weDAwMTQvKjo6XSovOiBcIkVHXCIsIC8vIEVneXB0XG5cdC8qOjpbKi8weDAwMUUvKjo6XSovOiBcIkdSXCIsIC8vIEdyZWVjZVxuXHQvKjo6WyovMHgwMDFGLyo6Ol0qLzogXCJOTFwiLCAvLyBOZXRoZXJsYW5kc1xuXHQvKjo6WyovMHgwMDIwLyo6Ol0qLzogXCJCRVwiLCAvLyBCZWxnaXVtXG5cdC8qOjpbKi8weDAwMjEvKjo6XSovOiBcIkZSXCIsIC8vIEZyYW5jZVxuXHQvKjo6WyovMHgwMDIyLyo6Ol0qLzogXCJFU1wiLCAvLyBTcGFpblxuXHQvKjo6WyovMHgwMDI0Lyo6Ol0qLzogXCJIVVwiLCAvLyBIdW5nYXJ5XG5cdC8qOjpbKi8weDAwMjcvKjo6XSovOiBcIklUXCIsIC8vIEl0YWx5XG5cdC8qOjpbKi8weDAwMjkvKjo6XSovOiBcIkNIXCIsIC8vIFN3aXR6ZXJsYW5kXG5cdC8qOjpbKi8weDAwMkIvKjo6XSovOiBcIkFUXCIsIC8vIEF1c3RyaWFcblx0Lyo6OlsqLzB4MDAyQy8qOjpdKi86IFwiR0JcIiwgLy8gVW5pdGVkIEtpbmdkb21cblx0Lyo6OlsqLzB4MDAyRC8qOjpdKi86IFwiREtcIiwgLy8gRGVubWFya1xuXHQvKjo6WyovMHgwMDJFLyo6Ol0qLzogXCJTRVwiLCAvLyBTd2VkZW5cblx0Lyo6OlsqLzB4MDAyRi8qOjpdKi86IFwiTk9cIiwgLy8gTm9yd2F5XG5cdC8qOjpbKi8weDAwMzAvKjo6XSovOiBcIlBMXCIsIC8vIFBvbGFuZFxuXHQvKjo6WyovMHgwMDMxLyo6Ol0qLzogXCJERVwiLCAvLyBHZXJtYW55XG5cdC8qOjpbKi8weDAwMzQvKjo6XSovOiBcIk1YXCIsIC8vIE1leGljb1xuXHQvKjo6WyovMHgwMDM3Lyo6Ol0qLzogXCJCUlwiLCAvLyBCcmF6aWxcblx0Lyo6OlsqLzB4MDAzZC8qOjpdKi86IFwiQVVcIiwgLy8gQXVzdHJhbGlhXG5cdC8qOjpbKi8weDAwNDAvKjo6XSovOiBcIk5aXCIsIC8vIE5ldyBaZWFsYW5kXG5cdC8qOjpbKi8weDAwNDIvKjo6XSovOiBcIlRIXCIsIC8vIFRoYWlsYW5kXG5cdC8qOjpbKi8weDAwNTEvKjo6XSovOiBcIkpQXCIsIC8vIEphcGFuXG5cdC8qOjpbKi8weDAwNTIvKjo6XSovOiBcIktSXCIsIC8vIEtvcmVhXG5cdC8qOjpbKi8weDAwNTQvKjo6XSovOiBcIlZOXCIsIC8vIFZpZXQgTmFtXG5cdC8qOjpbKi8weDAwNTYvKjo6XSovOiBcIkNOXCIsIC8vIENoaW5hXG5cdC8qOjpbKi8weDAwNUEvKjo6XSovOiBcIlRSXCIsIC8vIFR1cmtleVxuXHQvKjo6WyovMHgwMDY5Lyo6Ol0qLzogXCJKU1wiLCAvLyBSYW1hc3RhblxuXHQvKjo6WyovMHgwMEQ1Lyo6Ol0qLzogXCJEWlwiLCAvLyBBbGdlcmlhXG5cdC8qOjpbKi8weDAwRDgvKjo6XSovOiBcIk1BXCIsIC8vIE1vcm9jY29cblx0Lyo6OlsqLzB4MDBEQS8qOjpdKi86IFwiTFlcIiwgLy8gTGlieWFcblx0Lyo6OlsqLzB4MDE1Ri8qOjpdKi86IFwiUFRcIiwgLy8gUG9ydHVnYWxcblx0Lyo6OlsqLzB4MDE2Mi8qOjpdKi86IFwiSVNcIiwgLy8gSWNlbGFuZFxuXHQvKjo6WyovMHgwMTY2Lyo6Ol0qLzogXCJGSVwiLCAvLyBGaW5sYW5kXG5cdC8qOjpbKi8weDAxQTQvKjo6XSovOiBcIkNaXCIsIC8vIEN6ZWNoIFJlcHVibGljXG5cdC8qOjpbKi8weDAzNzYvKjo6XSovOiBcIlRXXCIsIC8vIFRhaXdhblxuXHQvKjo6WyovMHgwM0MxLyo6Ol0qLzogXCJMQlwiLCAvLyBMZWJhbm9uXG5cdC8qOjpbKi8weDAzQzIvKjo6XSovOiBcIkpPXCIsIC8vIEpvcmRhblxuXHQvKjo6WyovMHgwM0MzLyo6Ol0qLzogXCJTWVwiLCAvLyBTeXJpYVxuXHQvKjo6WyovMHgwM0M0Lyo6Ol0qLzogXCJJUVwiLCAvLyBJcmFxXG5cdC8qOjpbKi8weDAzQzUvKjo6XSovOiBcIktXXCIsIC8vIEt1d2FpdFxuXHQvKjo6WyovMHgwM0M2Lyo6Ol0qLzogXCJTQVwiLCAvLyBTYXVkaSBBcmFiaWFcblx0Lyo6OlsqLzB4MDNDQi8qOjpdKi86IFwiQUVcIiwgLy8gVW5pdGVkIEFyYWIgRW1pcmF0ZXNcblx0Lyo6OlsqLzB4MDNDQy8qOjpdKi86IFwiSUxcIiwgLy8gSXNyYWVsXG5cdC8qOjpbKi8weDAzQ0UvKjo6XSovOiBcIlFBXCIsIC8vIFFhdGFyXG5cdC8qOjpbKi8weDAzRDUvKjo6XSovOiBcIklSXCIsIC8vIElyYW5cblx0Lyo6OlsqLzB4RkZGRi8qOjpdKi86IFwiVVNcIiAgLy8gVW5pdGVkIFN0YXRlc1xufTtcblxuLyogW01TLVhMU10gMi41LjEyNyAqL1xudmFyIFhMU0ZpbGxQYXR0ZXJuID0gW1xuXHRudWxsLFxuXHQnc29saWQnLFxuXHQnbWVkaXVtR3JheScsXG5cdCdkYXJrR3JheScsXG5cdCdsaWdodEdyYXknLFxuXHQnZGFya0hvcml6b250YWwnLFxuXHQnZGFya1ZlcnRpY2FsJyxcblx0J2RhcmtEb3duJyxcblx0J2RhcmtVcCcsXG5cdCdkYXJrR3JpZCcsXG5cdCdkYXJrVHJlbGxpcycsXG5cdCdsaWdodEhvcml6b250YWwnLFxuXHQnbGlnaHRWZXJ0aWNhbCcsXG5cdCdsaWdodERvd24nLFxuXHQnbGlnaHRVcCcsXG5cdCdsaWdodEdyaWQnLFxuXHQnbGlnaHRUcmVsbGlzJyxcblx0J2dyYXkxMjUnLFxuXHQnZ3JheTA2MjUnXG5dO1xuXG5mdW5jdGlvbiByZ2JpZnkoYXJyLyo6QXJyYXk8bnVtYmVyPiovKS8qOkFycmF5PFtudW1iZXIsIG51bWJlciwgbnVtYmVyXT4qLyB7IHJldHVybiBhcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIFsoeD4+MTYpJjI1NSwoeD4+OCkmMjU1LHgmMjU1XTsgfSk7IH1cblxuLyogW01TLVhMU10gMi41LjE2MSAqL1xuLyogW01TLVhMU0JdIDIuNS43NSBJY3YgKi9cbnZhciBfWExTSWN2ID0gLyojX19QVVJFX18qLyByZ2JpZnkoW1xuXHQvKiBDb2xvciBDb25zdGFudHMgKi9cblx0MHgwMDAwMDAsXG5cdDB4RkZGRkZGLFxuXHQweEZGMDAwMCxcblx0MHgwMEZGMDAsXG5cdDB4MDAwMEZGLFxuXHQweEZGRkYwMCxcblx0MHhGRjAwRkYsXG5cdDB4MDBGRkZGLFxuXG5cdC8qIE92ZXJyaWRhYmxlIERlZmF1bHRzICovXG5cdDB4MDAwMDAwLFxuXHQweEZGRkZGRixcblx0MHhGRjAwMDAsXG5cdDB4MDBGRjAwLFxuXHQweDAwMDBGRixcblx0MHhGRkZGMDAsXG5cdDB4RkYwMEZGLFxuXHQweDAwRkZGRixcblxuXHQweDgwMDAwMCxcblx0MHgwMDgwMDAsXG5cdDB4MDAwMDgwLFxuXHQweDgwODAwMCxcblx0MHg4MDAwODAsXG5cdDB4MDA4MDgwLFxuXHQweEMwQzBDMCxcblx0MHg4MDgwODAsXG5cdDB4OTk5OUZGLFxuXHQweDk5MzM2Nixcblx0MHhGRkZGQ0MsXG5cdDB4Q0NGRkZGLFxuXHQweDY2MDA2Nixcblx0MHhGRjgwODAsXG5cdDB4MDA2NkNDLFxuXHQweENDQ0NGRixcblxuXHQweDAwMDA4MCxcblx0MHhGRjAwRkYsXG5cdDB4RkZGRjAwLFxuXHQweDAwRkZGRixcblx0MHg4MDAwODAsXG5cdDB4ODAwMDAwLFxuXHQweDAwODA4MCxcblx0MHgwMDAwRkYsXG5cdDB4MDBDQ0ZGLFxuXHQweENDRkZGRixcblx0MHhDQ0ZGQ0MsXG5cdDB4RkZGRjk5LFxuXHQweDk5Q0NGRixcblx0MHhGRjk5Q0MsXG5cdDB4Q0M5OUZGLFxuXHQweEZGQ0M5OSxcblxuXHQweDMzNjZGRixcblx0MHgzM0NDQ0MsXG5cdDB4OTlDQzAwLFxuXHQweEZGQ0MwMCxcblx0MHhGRjk5MDAsXG5cdDB4RkY2NjAwLFxuXHQweDY2NjY5OSxcblx0MHg5Njk2OTYsXG5cdDB4MDAzMzY2LFxuXHQweDMzOTk2Nixcblx0MHgwMDMzMDAsXG5cdDB4MzMzMzAwLFxuXHQweDk5MzMwMCxcblx0MHg5OTMzNjYsXG5cdDB4MzMzMzk5LFxuXHQweDMzMzMzMyxcblxuXHQvKiBPdGhlciBlbnRyaWVzIHRvIGFwcGVhc2UgQklGRjgvMTIgKi9cblx0MHhGRkZGRkYsIC8qIDB4NDAgaWN2Rm9yZWdyb3VuZCA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0MSBpY3ZCYWNrZ3JvdW5kID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDQyIGljdkZyYW1lID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDQzIGljdjNEID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDQ0IGljdjNEVGV4dCA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0NSBpY3YzREhpbGl0ZSA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0NiBpY3YzRFNoYWRvdyA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0NyBpY3ZIaWxpdGUgPz8gKi9cblx0MHgwMDAwMDAsIC8qIDB4NDggaWN2Q3RsVGV4dCA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0OSBpY3ZDdGxTY3JsID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDRBIGljdkN0bEludiA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0QiBpY3ZDdGxCb2R5ID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDRDIGljdkN0bEZyYW1lID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDREIGljdkN0bEZvcmUgPz8gKi9cblx0MHgwMDAwMDAsIC8qIDB4NEUgaWN2Q3RsQmFjayA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0RiBpY3ZDdGxOZXV0cmFsICovXG5cdDB4MDAwMDAwLCAvKiAweDUwIGljdkluZm9CayA/PyAqL1xuXHQweDAwMDAwMCAvKiAweDUxIGljdkluZm9UZXh0ID8/ICovXG5dKTtcbnZhciBYTFNJY3YgPSAvKiNfX1BVUkVfXyovZHVwKF9YTFNJY3YpO1xuXG4vKiBbTVMtWExTQl0gMi41Ljk3LjIgKi9cbnZhciBCRXJyID0ge1xuXHQvKjo6WyovMHgwMC8qOjpdKi86IFwiI05VTEwhXCIsXG5cdC8qOjpbKi8weDA3Lyo6Ol0qLzogXCIjRElWLzAhXCIsXG5cdC8qOjpbKi8weDBGLyo6Ol0qLzogXCIjVkFMVUUhXCIsXG5cdC8qOjpbKi8weDE3Lyo6Ol0qLzogXCIjUkVGIVwiLFxuXHQvKjo6WyovMHgxRC8qOjpdKi86IFwiI05BTUU/XCIsXG5cdC8qOjpbKi8weDI0Lyo6Ol0qLzogXCIjTlVNIVwiLFxuXHQvKjo6WyovMHgyQS8qOjpdKi86IFwiI04vQVwiLFxuXHQvKjo6WyovMHgyQi8qOjpdKi86IFwiI0dFVFRJTkdfREFUQVwiLFxuXHQvKjo6WyovMHhGRi8qOjpdKi86IFwiI1dURj9cIlxufTtcbi8vdmFyIFJCRXJyID0gZXZlcnRfbnVtKEJFcnIpO1xudmFyIFJCRXJyID0ge1xuXHRcIiNOVUxMIVwiOiAgICAgICAgMHgwMCxcblx0XCIjRElWLzAhXCI6ICAgICAgIDB4MDcsXG5cdFwiI1ZBTFVFIVwiOiAgICAgICAweDBGLFxuXHRcIiNSRUYhXCI6ICAgICAgICAgMHgxNyxcblx0XCIjTkFNRT9cIjogICAgICAgIDB4MUQsXG5cdFwiI05VTSFcIjogICAgICAgICAweDI0LFxuXHRcIiNOL0FcIjogICAgICAgICAgMHgyQSxcblx0XCIjR0VUVElOR19EQVRBXCI6IDB4MkIsXG5cdFwiI1dURj9cIjogICAgICAgICAweEZGXG59O1xuXG4vKiBQYXJ0cyBlbnVtZXJhdGVkIGluIE9QQyBzcGVjLCBNUy1YTFNCIGFuZCBNUy1YTFNYICovXG4vKiAxMi4zIFBhcnQgU3VtbWFyeSA8U3ByZWFkc2hlZXRNTD4gKi9cbi8qIDE0LjIgUGFydCBTdW1tYXJ5IDxEcmF3aW5nTUw+ICovXG4vKiBbTVMtWExTWF0gMi4xIFBhcnQgRW51bWVyYXRpb25zIDsgW01TLVhMU0JdIDIuMS43IFBhcnQgRW51bWVyYXRpb24gKi9cbnZhciBjdDJ0eXBlLyp7W3N0cmluZ106c3RyaW5nfSovID0gKHtcblx0LyogV29ya2Jvb2sgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbFwiOiBcIndvcmtib29rc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb0VuYWJsZWQubWFpbit4bWxcIjogXCJ3b3JrYm9va3NcIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQuYmluYXJ5Lm1hY3JvRW5hYmxlZC5tYWluXCI6IFwid29ya2Jvb2tzXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvRW5hYmxlZC5tYWluK3htbFwiOiBcIndvcmtib29rc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlLm1haW4reG1sXCI6IFwid29ya2Jvb2tzXCIsXG5cblx0LyogV29ya3NoZWV0ICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwud29ya3NoZWV0K3htbFwiOiBcInNoZWV0c1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC53b3Jrc2hlZXRcIjogXCJzaGVldHNcIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYmluSW5kZXhXc1wiOiBcIlRPRE9cIiwgLyogQmluYXJ5IEluZGV4ICovXG5cblx0LyogQ2hhcnRzaGVldCAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNoYXJ0c2hlZXQreG1sXCI6IFwiY2hhcnRzXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmNoYXJ0c2hlZXRcIjogXCJjaGFydHNcIixcblxuXHQvKiBNYWNyb3NoZWV0ICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLm1hY3Jvc2hlZXQreG1sXCI6IFwibWFjcm9zXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLm1hY3Jvc2hlZXRcIjogXCJtYWNyb3NcIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuaW50bG1hY3Jvc2hlZXRcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmJpbkluZGV4TXNcIjogXCJUT0RPXCIsIC8qIEJpbmFyeSBJbmRleCAqL1xuXG5cdC8qIERpYWxvZ3NoZWV0ICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuZGlhbG9nc2hlZXQreG1sXCI6IFwiZGlhbG9nc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5kaWFsb2dzaGVldFwiOiBcImRpYWxvZ3NcIixcblxuXHQvKiBTaGFyZWQgU3RyaW5ncyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoYXJlZFN0cmluZ3MreG1sXCI6IFwic3Ryc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGFyZWRTdHJpbmdzXCI6IFwic3Ryc1wiLFxuXG5cdC8qIFN0eWxlcyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWxcIjogXCJzdHlsZXNcIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc3R5bGVzXCI6IFwic3R5bGVzXCIsXG5cblx0LyogRmlsZSBQcm9wZXJ0aWVzICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UuY29yZS1wcm9wZXJ0aWVzK3htbFwiOiBcImNvcmVwcm9wc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b20tcHJvcGVydGllcyt4bWxcIjogXCJjdXN0cHJvcHNcIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZXh0ZW5kZWQtcHJvcGVydGllcyt4bWxcIjogXCJleHRwcm9wc1wiLFxuXG5cdC8qIEN1c3RvbSBEYXRhIFByb3BlcnRpZXMgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuY3VzdG9tWG1sUHJvcGVydGllcyt4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuY3VzdG9tUHJvcGVydHlcIjogXCJUT0RPXCIsXG5cblx0LyogQ29tbWVudHMgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb21tZW50cyt4bWxcIjogXCJjb21tZW50c1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jb21tZW50c1wiOiBcImNvbW1lbnRzXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRocmVhZGVkY29tbWVudHMreG1sXCI6IFwidGhyZWFkZWRjb21tZW50c1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5wZXJzb24reG1sXCI6IFwicGVvcGxlXCIsXG5cblx0LyogTWV0YWRhdGEgKFN0b2NrL0dlb2dyYXBoeSBhbmQgRHluYW1pYyBBcnJheSkgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldE1ldGFkYXRhK3htbFwiOiBcIm1ldGFkYXRhXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0TWV0YWRhdGFcIjogXCJtZXRhZGF0YVwiLFxuXG5cdC8qIFBpdm90VGFibGUgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwucGl2b3RUYWJsZVwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdFRhYmxlK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBDaGFydCBPYmplY3RzICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5jaGFydCt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogQ2hhcnQgQ29sb3JzICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5jaGFydGNvbG9yc3R5bGUreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIENoYXJ0IFN0eWxlICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5jaGFydHN0eWxlK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBDaGFydCBBZHZhbmNlZCAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UuY2hhcnRleCt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogQ2FsY3VsYXRpb24gQ2hhaW4gKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuY2FsY0NoYWluXCI6IFwiY2FsY2NoYWluc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNhbGNDaGFpbit4bWxcIjogXCJjYWxjY2hhaW5zXCIsXG5cblx0LyogUHJpbnRlciBTZXR0aW5ncyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnByaW50ZXJTZXR0aW5nc1wiOiBcIlRPRE9cIixcblxuXHQvKiBBY3RpdmVYICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5hY3RpdmVYXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UuYWN0aXZlWCt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogQ3VzdG9tIFRvb2xiYXJzICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmF0dGFjaGVkVG9vbGJhcnNcIjogXCJUT0RPXCIsXG5cblx0LyogRXh0ZXJuYWwgRGF0YSBDb25uZWN0aW9ucyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jb25uZWN0aW9uc1wiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb25uZWN0aW9ucyt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogRXh0ZXJuYWwgTGlua3MgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuZXh0ZXJuYWxMaW5rXCI6IFwibGlua3NcIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5leHRlcm5hbExpbmsreG1sXCI6IFwibGlua3NcIixcblxuXHQvKiBQaXZvdENhY2hlICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnBpdm90Q2FjaGVEZWZpbml0aW9uXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5waXZvdENhY2hlUmVjb3Jkc1wiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdENhY2hlRGVmaW5pdGlvbit4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucGl2b3RDYWNoZVJlY29yZHMreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFF1ZXJ5IFRhYmxlICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnF1ZXJ5VGFibGVcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucXVlcnlUYWJsZSt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogU2hhcmVkIFdvcmtib29rICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnVzZXJOYW1lc1wiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwucmV2aXNpb25IZWFkZXJzXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5yZXZpc2lvbkxvZ1wiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5yZXZpc2lvbkhlYWRlcnMreG1sXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnJldmlzaW9uTG9nK3htbFwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC51c2VyTmFtZXMreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFNpbmdsZSBDZWxsIFRhYmxlICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRhYmxlU2luZ2xlQ2VsbHNcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGFibGVTaW5nbGVDZWxscyt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogU2xpY2VyICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNsaWNlclwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2xpY2VyQ2FjaGVcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNsaWNlcit4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNsaWNlckNhY2hlK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBTb3J0IE1hcCAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC53c1NvcnRNYXBcIjogXCJUT0RPXCIsXG5cblx0LyogVGFibGUgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGFibGVcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGFibGUreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFRoZW1lcyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC50aGVtZSt4bWxcIjogXCJ0aGVtZXNcIixcblxuXHQvKiBUaGVtZSBPdmVycmlkZSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC50aGVtZU92ZXJyaWRlK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBUaW1lbGluZSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5UaW1lbGluZSt4bWxcIjogXCJUT0RPXCIsIC8qIHZlcmlmeSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5UaW1lbGluZUNhY2hlK3htbFwiOiBcIlRPRE9cIiwgLyogdmVyaWZ5ICovXG5cblx0LyogVkJBICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS52YmFQcm9qZWN0XCI6IFwidmJhXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS52YmFQcm9qZWN0U2lnbmF0dXJlXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFZvbGF0aWxlIERlcGVuZGVuY2llcyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2Uudm9sYXRpbGVEZXBlbmRlbmNpZXNcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudm9sYXRpbGVEZXBlbmRlbmNpZXMreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIENvbnRyb2wgUHJvcGVydGllcyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jb250cm9scHJvcGVydGllcyt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogRGF0YSBNb2RlbCAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5tb2RlbCtkYXRhXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFN1cnZleSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5TdXJ2ZXkreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIERyYXdpbmcgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZyt4bWxcIjogXCJkcmF3aW5nc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuY2hhcnRzaGFwZXMreG1sXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbUNvbG9ycyt4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtRGF0YSt4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtTGF5b3V0K3htbFwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmRpYWdyYW1TdHlsZSt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogVk1MICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmdcIjogXCJUT0RPXCIsXG5cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbFwiOiBcInJlbHNcIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQub2xlT2JqZWN0XCI6IFwiVE9ET1wiLFxuXG5cdC8qIEltYWdlICovXG5cdFwiaW1hZ2UvcG5nXCI6IFwiVE9ET1wiLFxuXG5cdFwic2hlZXRcIjogXCJqc1wiXG59Lyo6YW55Ki8pO1xuXG52YXIgQ1RfTElTVCA9IHtcblx0XHR3b3JrYm9va3M6IHtcblx0XHRcdHhsc3g6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWxcIixcblx0XHRcdHhsc206IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvRW5hYmxlZC5tYWluK3htbFwiLFxuXHRcdFx0eGxzYjogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQuYmluYXJ5Lm1hY3JvRW5hYmxlZC5tYWluXCIsXG5cdFx0XHR4bGFtOiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5hZGRpbi5tYWNyb0VuYWJsZWQubWFpbit4bWxcIixcblx0XHRcdHhsdHg6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUubWFpbit4bWxcIlxuXHRcdH0sXG5cdFx0c3RyczogeyAvKiBTaGFyZWQgU3RyaW5ncyAqL1xuXHRcdFx0eGxzeDogXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbFwiLFxuXHRcdFx0eGxzYjogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hhcmVkU3RyaW5nc1wiXG5cdFx0fSxcblx0XHRjb21tZW50czogeyAvKiBDb21tZW50cyAqL1xuXHRcdFx0eGxzeDogXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb21tZW50cyt4bWxcIixcblx0XHRcdHhsc2I6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmNvbW1lbnRzXCJcblx0XHR9LFxuXHRcdHNoZWV0czogeyAvKiBXb3Jrc2hlZXQgKi9cblx0XHRcdHhsc3g6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwud29ya3NoZWV0K3htbFwiLFxuXHRcdFx0eGxzYjogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwud29ya3NoZWV0XCJcblx0XHR9LFxuXHRcdGNoYXJ0czogeyAvKiBDaGFydHNoZWV0ICovXG5cdFx0XHR4bHN4OiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNoYXJ0c2hlZXQreG1sXCIsXG5cdFx0XHR4bHNiOiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jaGFydHNoZWV0XCJcblx0XHR9LFxuXHRcdGRpYWxvZ3M6IHsgLyogRGlhbG9nc2hlZXQgKi9cblx0XHRcdHhsc3g6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuZGlhbG9nc2hlZXQreG1sXCIsXG5cdFx0XHR4bHNiOiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5kaWFsb2dzaGVldFwiXG5cdFx0fSxcblx0XHRtYWNyb3M6IHsgLyogTWFjcm9zaGVldCAoRXhjZWwgNC4wIE1hY3JvcykgKi9cblx0XHRcdHhsc3g6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLm1hY3Jvc2hlZXQreG1sXCIsXG5cdFx0XHR4bHNiOiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5tYWNyb3NoZWV0XCJcblx0XHR9LFxuXHRcdG1ldGFkYXRhOiB7IC8qIE1ldGFkYXRhIChTdG9jay9HZW9ncmFwaHkgYW5kIER5bmFtaWMgQXJyYXkpICovXG5cdFx0XHR4bHN4OiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0TWV0YWRhdGEreG1sXCIsXG5cdFx0XHR4bHNiOiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldE1ldGFkYXRhXCJcblx0XHR9LFxuXHRcdHN0eWxlczogeyAvKiBTdHlsZXMgKi9cblx0XHRcdHhsc3g6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc3R5bGVzK3htbFwiLFxuXHRcdFx0eGxzYjogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc3R5bGVzXCJcblx0XHR9XG59O1xuXG5mdW5jdGlvbiBuZXdfY3QoKS8qOmFueSovIHtcblx0cmV0dXJuICh7XG5cdFx0d29ya2Jvb2tzOltdLCBzaGVldHM6W10sIGNoYXJ0czpbXSwgZGlhbG9nczpbXSwgbWFjcm9zOltdLFxuXHRcdHJlbHM6W10sIHN0cnM6W10sIGNvbW1lbnRzOltdLCB0aHJlYWRlZGNvbW1lbnRzOltdLCBsaW5rczpbXSxcblx0XHRjb3JlcHJvcHM6W10sIGV4dHByb3BzOltdLCBjdXN0cHJvcHM6W10sIHRoZW1lczpbXSwgc3R5bGVzOltdLFxuXHRcdGNhbGNjaGFpbnM6W10sIHZiYTogW10sIGRyYXdpbmdzOiBbXSwgbWV0YWRhdGE6IFtdLCBwZW9wbGU6W10sXG5cdFx0VE9ETzpbXSwgeG1sbnM6IFwiXCIgfS8qOmFueSovKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3QoZGF0YS8qOj9zdHJpbmcqLykge1xuXHR2YXIgY3QgPSBuZXdfY3QoKTtcblx0aWYoIWRhdGEgfHwgIWRhdGEubWF0Y2gpIHJldHVybiBjdDtcblx0dmFyIGN0ZXh0ID0ge307XG5cdChkYXRhLm1hdGNoKHRhZ3JlZ2V4KXx8W10pLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdHZhciB5ID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHlbMF0ucmVwbGFjZShuc3JlZ2V4LFwiPFwiKSkge1xuXHRcdFx0Y2FzZSAnPD94bWwnOiBicmVhaztcblx0XHRcdGNhc2UgJzxUeXBlcyc6IGN0LnhtbG5zID0geVsneG1sbnMnICsgKHlbMF0ubWF0Y2goLzwoXFx3Kyk6Lyl8fFtcIlwiLFwiXCJdKVsxXSBdOyBicmVhaztcblx0XHRcdGNhc2UgJzxEZWZhdWx0JzogY3RleHRbeS5FeHRlbnNpb25dID0geS5Db250ZW50VHlwZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8T3ZlcnJpZGUnOlxuXHRcdFx0XHRpZihjdFtjdDJ0eXBlW3kuQ29udGVudFR5cGVdXSAhPT0gdW5kZWZpbmVkKSBjdFtjdDJ0eXBlW3kuQ29udGVudFR5cGVdXS5wdXNoKHkuUGFydE5hbWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0pO1xuXHRpZihjdC54bWxucyAhPT0gWE1MTlMuQ1QpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gTmFtZXNwYWNlOiBcIiArIGN0LnhtbG5zKTtcblx0Y3QuY2FsY2NoYWluID0gY3QuY2FsY2NoYWlucy5sZW5ndGggPiAwID8gY3QuY2FsY2NoYWluc1swXSA6IFwiXCI7XG5cdGN0LnNzdCA9IGN0LnN0cnMubGVuZ3RoID4gMCA/IGN0LnN0cnNbMF0gOiBcIlwiO1xuXHRjdC5zdHlsZSA9IGN0LnN0eWxlcy5sZW5ndGggPiAwID8gY3Quc3R5bGVzWzBdIDogXCJcIjtcblx0Y3QuZGVmYXVsdHMgPSBjdGV4dDtcblx0ZGVsZXRlIGN0LmNhbGNjaGFpbnM7XG5cdHJldHVybiBjdDtcbn1cblxuZnVuY3Rpb24gd3JpdGVfY3QoY3QsIG9wdHMpLyo6c3RyaW5nKi8ge1xuXHR2YXIgdHlwZTJjdC8qe1tzdHJpbmddOkFycmF5PHN0cmluZz59Ki8gPSBldmVydF9hcnIoY3QydHlwZSk7XG5cblx0dmFyIG8vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXSwgdjtcblx0b1tvLmxlbmd0aF0gPSAoWE1MX0hFQURFUik7XG5cdG9bby5sZW5ndGhdID0gd3JpdGV4dGFnKCdUeXBlcycsIG51bGwsIHtcblx0XHQneG1sbnMnOiBYTUxOUy5DVCxcblx0XHQneG1sbnM6eHNkJzogWE1MTlMueHNkLFxuXHRcdCd4bWxuczp4c2knOiBYTUxOUy54c2lcblx0fSk7XG5cblx0byA9IG8uY29uY2F0KFtcblx0XHRbJ3htbCcsICdhcHBsaWNhdGlvbi94bWwnXSxcblx0XHRbJ2JpbicsICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQuYmluYXJ5Lm1hY3JvRW5hYmxlZC5tYWluJ10sXG5cdFx0Wyd2bWwnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmcnXSxcblx0XHRbJ2RhdGEnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50Lm1vZGVsK2RhdGEnXSxcblx0XHQvKiBmcm9tIHRlc3QgZmlsZXMgKi9cblx0XHRbJ2JtcCcsICdpbWFnZS9ibXAnXSxcblx0XHRbJ3BuZycsICdpbWFnZS9wbmcnXSxcblx0XHRbJ2dpZicsICdpbWFnZS9naWYnXSxcblx0XHRbJ2VtZicsICdpbWFnZS94LWVtZiddLFxuXHRcdFsnd21mJywgJ2ltYWdlL3gtd21mJ10sXG5cdFx0WydqcGcnLCAnaW1hZ2UvanBlZyddLCBbJ2pwZWcnLCAnaW1hZ2UvanBlZyddLFxuXHRcdFsndGlmJywgJ2ltYWdlL3RpZmYnXSwgWyd0aWZmJywgJ2ltYWdlL3RpZmYnXSxcblx0XHRbJ3BkZicsICdhcHBsaWNhdGlvbi9wZGYnXSxcblx0XHRbJ3JlbHMnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwnXVxuXHRdLm1hcChmdW5jdGlvbih4KSB7XG5cdFx0cmV0dXJuIHdyaXRleHRhZygnRGVmYXVsdCcsIG51bGwsIHsnRXh0ZW5zaW9uJzp4WzBdLCAnQ29udGVudFR5cGUnOiB4WzFdfSk7XG5cdH0pKTtcblxuXHQvKiBvbmx5IHdyaXRlIGZpcnN0IGluc3RhbmNlICovXG5cdHZhciBmMSA9IGZ1bmN0aW9uKHcpIHtcblx0XHRpZihjdFt3XSAmJiBjdFt3XS5sZW5ndGggPiAwKSB7XG5cdFx0XHR2ID0gY3Rbd11bMF07XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ092ZXJyaWRlJywgbnVsbCwge1xuXHRcdFx0XHQnUGFydE5hbWUnOiAodlswXSA9PSAnLycgPyBcIlwiOlwiL1wiKSArIHYsXG5cdFx0XHRcdCdDb250ZW50VHlwZSc6IENUX0xJU1Rbd11bb3B0cy5ib29rVHlwZV0gfHwgQ1RfTElTVFt3XVsneGxzeCddXG5cdFx0XHR9KSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIGJvb2sgdHlwZS1zcGVjaWZpYyAqL1xuXHR2YXIgZjIgPSBmdW5jdGlvbih3KSB7XG5cdFx0KGN0W3ddfHxbXSkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ092ZXJyaWRlJywgbnVsbCwge1xuXHRcdFx0XHQnUGFydE5hbWUnOiAodlswXSA9PSAnLycgPyBcIlwiOlwiL1wiKSArIHYsXG5cdFx0XHRcdCdDb250ZW50VHlwZSc6IENUX0xJU1Rbd11bb3B0cy5ib29rVHlwZV0gfHwgQ1RfTElTVFt3XVsneGxzeCddXG5cdFx0XHR9KSk7XG5cdFx0fSk7XG5cdH07XG5cblx0Lyogc3RhbmRhcmQgdHlwZSAqL1xuXHR2YXIgZjMgPSBmdW5jdGlvbih0KSB7XG5cdFx0KGN0W3RdfHxbXSkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ092ZXJyaWRlJywgbnVsbCwge1xuXHRcdFx0XHQnUGFydE5hbWUnOiAodlswXSA9PSAnLycgPyBcIlwiOlwiL1wiKSArIHYsXG5cdFx0XHRcdCdDb250ZW50VHlwZSc6IHR5cGUyY3RbdF1bMF1cblx0XHRcdH0pKTtcblx0XHR9KTtcblx0fTtcblxuXHRmMSgnd29ya2Jvb2tzJyk7XG5cdGYyKCdzaGVldHMnKTtcblx0ZjIoJ2NoYXJ0cycpO1xuXHRmMygndGhlbWVzJyk7XG5cdFsnc3RycycsICdzdHlsZXMnXS5mb3JFYWNoKGYxKTtcblx0Wydjb3JlcHJvcHMnLCAnZXh0cHJvcHMnLCAnY3VzdHByb3BzJ10uZm9yRWFjaChmMyk7XG5cdGYzKCd2YmEnKTtcblx0ZjMoJ2NvbW1lbnRzJyk7XG5cdGYzKCd0aHJlYWRlZGNvbW1lbnRzJyk7XG5cdGYzKCdkcmF3aW5ncycpO1xuXHRmMignbWV0YWRhdGEnKTtcblx0ZjMoJ3Blb3BsZScpO1xuXHRpZihvLmxlbmd0aD4yKXsgb1tvLmxlbmd0aF0gPSAoJzwvVHlwZXM+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIDkuMyBSZWxhdGlvbnNoaXBzICovXG52YXIgUkVMUyA9ICh7XG5cdFdCOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnRcIixcblx0U0hFRVQ6IFwiaHR0cDovL3NoZWV0anMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudFwiLFxuXHRITElOSzogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2h5cGVybGlua1wiLFxuXHRWTUw6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy92bWxEcmF3aW5nXCIsXG5cdFhQQVRIOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvZXh0ZXJuYWxMaW5rUGF0aFwiLFxuXHRYTUlTUzogXCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMveGxFeHRlcm5hbExpbmtQYXRoL3hsUGF0aE1pc3NpbmdcIixcblx0WExJTks6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9leHRlcm5hbExpbmtcIixcblx0Q1hNTDogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbVhtbFwiLFxuXHRDWE1MUDogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbVhtbFByb3BzXCIsXG5cdENNTlQ6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jb21tZW50c1wiLFxuXHRDT1JFX1BST1BTOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcy9tZXRhZGF0YS9jb3JlLXByb3BlcnRpZXNcIixcblx0RVhUX1BST1BTOiAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9leHRlbmRlZC1wcm9wZXJ0aWVzJyxcblx0Q1VTVF9QUk9QUzogJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY3VzdG9tLXByb3BlcnRpZXMnLFxuXHRTU1Q6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zaGFyZWRTdHJpbmdzXCIsXG5cdFNUWTogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3N0eWxlc1wiLFxuXHRUSEVNRTogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3RoZW1lXCIsXG5cdENIQVJUOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY2hhcnRcIixcblx0Q0hBUlRFWDogXCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDE0L3JlbGF0aW9uc2hpcHMvY2hhcnRFeFwiLFxuXHRDUzogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2NoYXJ0c2hlZXRcIixcblx0V1M6IFtcblx0XHRcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0XCIsXG5cdFx0XCJodHRwOi8vcHVybC5vY2xjLm9yZy9vb3htbC9vZmZpY2VEb2N1bWVudC9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldFwiXG5cdF0sXG5cdERTOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvZGlhbG9nc2hlZXRcIixcblx0TVM6IFwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNi9yZWxhdGlvbnNoaXBzL3hsTWFjcm9zaGVldFwiLFxuXHRJTUc6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9pbWFnZVwiLFxuXHREUkFXOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvZHJhd2luZ1wiLFxuXHRYTE1FVEE6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zaGVldE1ldGFkYXRhXCIsXG5cdFRDTU5UOiBcImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMTcvMTAvcmVsYXRpb25zaGlwcy90aHJlYWRlZENvbW1lbnRcIixcblx0UEVPUExFOiBcImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMTcvMTAvcmVsYXRpb25zaGlwcy9wZXJzb25cIixcblx0VkJBOiBcImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYvcmVsYXRpb25zaGlwcy92YmFQcm9qZWN0XCJcbn0vKjphbnkqLyk7XG5cblxuLyogOS4zLjMgUmVwcmVzZW50aW5nIFJlbGF0aW9uc2hpcHMgKi9cbmZ1bmN0aW9uIGdldF9yZWxzX3BhdGgoZmlsZS8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0dmFyIG4gPSBmaWxlLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0cmV0dXJuIGZpbGUuc2xpY2UoMCxuKzEpICsgJ19yZWxzLycgKyBmaWxlLnNsaWNlKG4rMSkgKyBcIi5yZWxzXCI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3JlbHMoZGF0YS8qOj9zdHJpbmcqLywgY3VycmVudEZpbGVQYXRoLyo6c3RyaW5nKi8pIHtcblx0dmFyIHJlbHMgPSB7XCIhaWRcIjp7fX07XG5cdGlmICghZGF0YSkgcmV0dXJuIHJlbHM7XG5cdGlmIChjdXJyZW50RmlsZVBhdGguY2hhckF0KDApICE9PSAnLycpIHtcblx0XHRjdXJyZW50RmlsZVBhdGggPSAnLycrY3VycmVudEZpbGVQYXRoO1xuXHR9XG5cdHZhciBoYXNoID0ge307XG5cblx0KGRhdGEubWF0Y2godGFncmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyh4KTtcblx0XHQvKiA5LjMuMi4yIE9QQ19SZWxhdGlvbnNoaXBzICovXG5cdFx0aWYgKHlbMF0gPT09ICc8UmVsYXRpb25zaGlwJykge1xuXHRcdFx0dmFyIHJlbCA9IHt9OyByZWwuVHlwZSA9IHkuVHlwZTsgcmVsLlRhcmdldCA9IHkuVGFyZ2V0OyByZWwuSWQgPSB5LklkOyBpZih5LlRhcmdldE1vZGUpIHJlbC5UYXJnZXRNb2RlID0geS5UYXJnZXRNb2RlO1xuXHRcdFx0dmFyIGNhbm9uaWN0YXJnZXQgPSB5LlRhcmdldE1vZGUgPT09ICdFeHRlcm5hbCcgPyB5LlRhcmdldCA6IHJlc29sdmVfcGF0aCh5LlRhcmdldCwgY3VycmVudEZpbGVQYXRoKTtcblx0XHRcdHJlbHNbY2Fub25pY3RhcmdldF0gPSByZWw7XG5cdFx0XHRoYXNoW3kuSWRdID0gcmVsO1xuXHRcdH1cblx0fSk7XG5cdHJlbHNbXCIhaWRcIl0gPSBoYXNoO1xuXHRyZXR1cm4gcmVscztcbn1cblxuXG4vKiBUT0RPICovXG5mdW5jdGlvbiB3cml0ZV9yZWxzKHJlbHMpLyo6c3RyaW5nKi8ge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSLCB3cml0ZXh0YWcoJ1JlbGF0aW9uc2hpcHMnLCBudWxsLCB7XG5cdFx0Ly8neG1sbnM6bnMwJzogWE1MTlMuUkVMUyxcblx0XHQneG1sbnMnOiBYTUxOUy5SRUxTXG5cdH0pXTtcblx0a2V5cyhyZWxzWychaWQnXSkuZm9yRWFjaChmdW5jdGlvbihyaWQpIHtcblx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ1JlbGF0aW9uc2hpcCcsIG51bGwsIHJlbHNbJyFpZCddW3JpZF0pKTtcblx0fSk7XG5cdGlmKG8ubGVuZ3RoPjIpeyBvW28ubGVuZ3RoXSA9ICgnPC9SZWxhdGlvbnNoaXBzPicpOyBvWzFdPW9bMV0ucmVwbGFjZShcIi8+XCIsXCI+XCIpOyB9XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGFkZF9yZWxzKHJlbHMsIHJJZC8qOm51bWJlciovLCBmLCB0eXBlLCByZWxvYmosIHRhcmdldG1vZGUvKjo/c3RyaW5nKi8pLyo6bnVtYmVyKi8ge1xuXHRpZighcmVsb2JqKSByZWxvYmogPSB7fTtcblx0aWYoIXJlbHNbJyFpZCddKSByZWxzWychaWQnXSA9IHt9O1xuXHRpZighcmVsc1snIWlkeCddKSByZWxzWychaWR4J10gPSAxO1xuXHRpZihySWQgPCAwKSBmb3IocklkID0gcmVsc1snIWlkeCddOyByZWxzWychaWQnXVsncklkJyArIHJJZF07ICsrcklkKXsvKiBlbXB0eSAqL31cblx0cmVsc1snIWlkeCddID0gcklkICsgMTtcblx0cmVsb2JqLklkID0gJ3JJZCcgKyBySWQ7XG5cdHJlbG9iai5UeXBlID0gdHlwZTtcblx0cmVsb2JqLlRhcmdldCA9IGY7XG5cdGlmKHRhcmdldG1vZGUpIHJlbG9iai5UYXJnZXRNb2RlID0gdGFyZ2V0bW9kZTtcblx0ZWxzZSBpZihbUkVMUy5ITElOSywgUkVMUy5YUEFUSCwgUkVMUy5YTUlTU10uaW5kZXhPZihyZWxvYmouVHlwZSkgPiAtMSkgcmVsb2JqLlRhcmdldE1vZGUgPSBcIkV4dGVybmFsXCI7XG5cdGlmKHJlbHNbJyFpZCddW3JlbG9iai5JZF0pIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZXdyaXRlIHJJZCBcIiArIHJJZCk7XG5cdHJlbHNbJyFpZCddW3JlbG9iai5JZF0gPSByZWxvYmo7XG5cdHJlbHNbKCcvJyArIHJlbG9iai5UYXJnZXQpLnJlcGxhY2UoXCIvL1wiLFwiL1wiKV0gPSByZWxvYmo7XG5cdHJldHVybiBySWQ7XG59XG4vKiBPcGVuIERvY3VtZW50IEZvcm1hdCBmb3IgT2ZmaWNlIEFwcGxpY2F0aW9ucyAoT3BlbkRvY3VtZW50KSBWZXJzaW9uIDEuMiAqL1xuLyogUGFydCAzIFNlY3Rpb24gNCBNYW5pZmVzdCBGaWxlICovXG52YXIgQ1RfT0RTID0gXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0XCI7XG5mdW5jdGlvbiBwYXJzZV9tYW5pZmVzdChkLCBvcHRzKSB7XG5cdHZhciBzdHIgPSB4bG1sX25vcm1hbGl6ZShkKTtcblx0dmFyIFJuO1xuXHR2YXIgRkV0YWc7XG5cdHdoaWxlKChSbiA9IHhsbWxyZWdleC5leGVjKHN0cikpKSBzd2l0Y2goUm5bM10pIHtcblx0XHRjYXNlICdtYW5pZmVzdCc6IGJyZWFrOyAvLyA0LjIgPG1hbmlmZXN0Om1hbmlmZXN0PlxuXHRcdGNhc2UgJ2ZpbGUtZW50cnknOiAvLyA0LjMgPG1hbmlmZXN0OmZpbGUtZW50cnk+XG5cdFx0XHRGRXRhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRpZihGRXRhZy5wYXRoID09ICcvJyAmJiBGRXRhZy50eXBlICE9PSBDVF9PRFMpIHRocm93IG5ldyBFcnJvcihcIlRoaXMgT3BlbkRvY3VtZW50IGlzIG5vdCBhIHNwcmVhZHNoZWV0XCIpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnZW5jcnlwdGlvbi1kYXRhJzogLy8gNC40IDxtYW5pZmVzdDplbmNyeXB0aW9uLWRhdGE+XG5cdFx0Y2FzZSAnYWxnb3JpdGhtJzogLy8gNC41IDxtYW5pZmVzdDphbGdvcml0aG0+XG5cdFx0Y2FzZSAnc3RhcnQta2V5LWdlbmVyYXRpb24nOiAvLyA0LjYgPG1hbmlmZXN0OnN0YXJ0LWtleS1nZW5lcmF0aW9uPlxuXHRcdGNhc2UgJ2tleS1kZXJpdmF0aW9uJzogLy8gNC43IDxtYW5pZmVzdDprZXktZGVyaXZhdGlvbj5cblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIE9EUyBFbmNyeXB0aW9uXCIpO1xuXHRcdGRlZmF1bHQ6IGlmKG9wdHMgJiYgb3B0cy5XVEYpIHRocm93IFJuO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHdyaXRlX21hbmlmZXN0KG1hbmlmZXN0Lyo6QXJyYXk8QXJyYXk8c3RyaW5nPiA+Ki8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSXTtcblx0by5wdXNoKCc8bWFuaWZlc3Q6bWFuaWZlc3QgeG1sbnM6bWFuaWZlc3Q9XCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm1hbmlmZXN0OjEuMFwiIG1hbmlmZXN0OnZlcnNpb249XCIxLjJcIj5cXG4nKTtcblx0by5wdXNoKCcgIDxtYW5pZmVzdDpmaWxlLWVudHJ5IG1hbmlmZXN0OmZ1bGwtcGF0aD1cIi9cIiBtYW5pZmVzdDp2ZXJzaW9uPVwiMS4yXCIgbWFuaWZlc3Q6bWVkaWEtdHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXRcIi8+XFxuJyk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBtYW5pZmVzdC5sZW5ndGg7ICsraSkgby5wdXNoKCcgIDxtYW5pZmVzdDpmaWxlLWVudHJ5IG1hbmlmZXN0OmZ1bGwtcGF0aD1cIicgKyBtYW5pZmVzdFtpXVswXSArICdcIiBtYW5pZmVzdDptZWRpYS10eXBlPVwiJyArIG1hbmlmZXN0W2ldWzFdICsgJ1wiLz5cXG4nKTtcblx0by5wdXNoKCc8L21hbmlmZXN0Om1hbmlmZXN0PicpO1xuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuXG4vKiBQYXJ0IDMgU2VjdGlvbiA2IE1ldGFkYXRhIE1hbmlmZXN0IEZpbGUgKi9cbmZ1bmN0aW9uIHdyaXRlX3JkZl90eXBlKGZpbGUvKjpzdHJpbmcqLywgcmVzLyo6c3RyaW5nKi8sIHRhZy8qOj9zdHJpbmcqLykge1xuXHRyZXR1cm4gW1xuXHRcdCcgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PVwiJyArIGZpbGUgKyAnXCI+XFxuJyxcblx0XHQnICAgIDxyZGY6dHlwZSByZGY6cmVzb3VyY2U9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9vZmZpY2UvMS4yL21ldGEvJyArICh0YWcgfHwgXCJvZGZcIikgKyAnIycgKyByZXMgKyAnXCIvPlxcbicsXG5cdFx0JyAgPC9yZGY6RGVzY3JpcHRpb24+XFxuJ1xuXHRdLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiB3cml0ZV9yZGZfaGFzKGJhc2UvKjpzdHJpbmcqLywgZmlsZS8qOnN0cmluZyovKSB7XG5cdHJldHVybiBbXG5cdFx0JyAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCInICsgYmFzZSArICdcIj5cXG4nLFxuXHRcdCcgICAgPG5zMDpoYXNQYXJ0IHhtbG5zOm5zMD1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL29mZmljZS8xLjIvbWV0YS9wa2cjXCIgcmRmOnJlc291cmNlPVwiJyArIGZpbGUgKyAnXCIvPlxcbicsXG5cdFx0JyAgPC9yZGY6RGVzY3JpcHRpb24+XFxuJ1xuXHRdLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiB3cml0ZV9yZGYocmRmKSB7XG5cdHZhciBvID0gW1hNTF9IRUFERVJdO1xuXHRvLnB1c2goJzxyZGY6UkRGIHhtbG5zOnJkZj1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyNcIj5cXG4nKTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSByZGYubGVuZ3RoOyArK2kpIHtcblx0XHRvLnB1c2god3JpdGVfcmRmX3R5cGUocmRmW2ldWzBdLCByZGZbaV1bMV0pKTtcblx0XHRvLnB1c2god3JpdGVfcmRmX2hhcyhcIlwiLHJkZltpXVswXSkpO1xuXHR9XG5cdG8ucHVzaCh3cml0ZV9yZGZfdHlwZShcIlwiLFwiRG9jdW1lbnRcIiwgXCJwa2dcIikpO1xuXHRvLnB1c2goJzwvcmRmOlJERj4nKTtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIFRPRE86IHB1bGwgcHJvcGVydGllcyAqL1xuZnVuY3Rpb24gd3JpdGVfbWV0YV9vZHMoLyo6OiB3YjogV29ya2Jvb2ssIG9wdHM6IGFueSovKS8qOnN0cmluZyovIHtcblx0cmV0dXJuICc8b2ZmaWNlOmRvY3VtZW50LW1ldGEgeG1sbnM6b2ZmaWNlPVwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpvZmZpY2U6MS4wXCIgeG1sbnM6bWV0YT1cInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6bWV0YToxLjBcIiB4bWxuczpkYz1cImh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgb2ZmaWNlOnZlcnNpb249XCIxLjJcIj48b2ZmaWNlOm1ldGE+PG1ldGE6Z2VuZXJhdG9yPlNoZWV0JyArICdKUyAnICsgWExTWC52ZXJzaW9uICsgJzwvbWV0YTpnZW5lcmF0b3I+PC9vZmZpY2U6bWV0YT48L29mZmljZTpkb2N1bWVudC1tZXRhPic7XG59XG5cbi8qIEVDTUEtMzc2IFBhcnQgSUkgMTEuMSBDb3JlIFByb3BlcnRpZXMgUGFydCAqL1xuLyogW01TLU9TSEFSRURdIDIuMy4zLjIuWzEtMl0uMSAoUElEU0kvUElERFNJKSAqL1xudmFyIENPUkVfUFJPUFMvKjpBcnJheTxBcnJheTxzdHJpbmc+ID4qLyA9IFtcblx0W1wiY3A6Y2F0ZWdvcnlcIiwgXCJDYXRlZ29yeVwiXSxcblx0W1wiY3A6Y29udGVudFN0YXR1c1wiLCBcIkNvbnRlbnRTdGF0dXNcIl0sXG5cdFtcImNwOmtleXdvcmRzXCIsIFwiS2V5d29yZHNcIl0sXG5cdFtcImNwOmxhc3RNb2RpZmllZEJ5XCIsIFwiTGFzdEF1dGhvclwiXSxcblx0W1wiY3A6bGFzdFByaW50ZWRcIiwgXCJMYXN0UHJpbnRlZFwiXSxcblx0W1wiY3A6cmV2aXNpb25cIiwgXCJSZXZOdW1iZXJcIl0sXG5cdFtcImNwOnZlcnNpb25cIiwgXCJWZXJzaW9uXCJdLFxuXHRbXCJkYzpjcmVhdG9yXCIsIFwiQXV0aG9yXCJdLFxuXHRbXCJkYzpkZXNjcmlwdGlvblwiLCBcIkNvbW1lbnRzXCJdLFxuXHRbXCJkYzppZGVudGlmaWVyXCIsIFwiSWRlbnRpZmllclwiXSxcblx0W1wiZGM6bGFuZ3VhZ2VcIiwgXCJMYW5ndWFnZVwiXSxcblx0W1wiZGM6c3ViamVjdFwiLCBcIlN1YmplY3RcIl0sXG5cdFtcImRjOnRpdGxlXCIsIFwiVGl0bGVcIl0sXG5cdFtcImRjdGVybXM6Y3JlYXRlZFwiLCBcIkNyZWF0ZWREYXRlXCIsICdkYXRlJ10sXG5cdFtcImRjdGVybXM6bW9kaWZpZWRcIiwgXCJNb2RpZmllZERhdGVcIiwgJ2RhdGUnXVxuXTtcblxudmFyIENPUkVfUFJPUFNfUkVHRVgvKjpBcnJheTxSZWdFeHA+Ki8gPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xuXHR2YXIgciA9IG5ldyBBcnJheShDT1JFX1BST1BTLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBDT1JFX1BST1BTLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIGYgPSBDT1JFX1BST1BTW2ldO1xuXHRcdHZhciBnID0gXCIoPzpcIisgZlswXS5zbGljZSgwLGZbMF0uaW5kZXhPZihcIjpcIikpICtcIjopXCIrIGZbMF0uc2xpY2UoZlswXS5pbmRleE9mKFwiOlwiKSsxKTtcblx0XHRyW2ldID0gbmV3IFJlZ0V4cChcIjxcIiArIGcgKyBcIltePl0qPihbXFxcXHNcXFxcU10qPyk8XFwvXCIgKyBnICsgXCI+XCIpO1xuXHR9XG5cdHJldHVybiByO1xufSkoKTtcblxuZnVuY3Rpb24gcGFyc2VfY29yZV9wcm9wcyhkYXRhKSB7XG5cdHZhciBwID0ge307XG5cdGRhdGEgPSB1dGY4cmVhZChkYXRhKTtcblxuXHRmb3IodmFyIGkgPSAwOyBpIDwgQ09SRV9QUk9QUy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBmID0gQ09SRV9QUk9QU1tpXSwgY3VyID0gZGF0YS5tYXRjaChDT1JFX1BST1BTX1JFR0VYW2ldKTtcblx0XHRpZihjdXIgIT0gbnVsbCAmJiBjdXIubGVuZ3RoID4gMCkgcFtmWzFdXSA9IHVuZXNjYXBleG1sKGN1clsxXSk7XG5cdFx0aWYoZlsyXSA9PT0gJ2RhdGUnICYmIHBbZlsxXV0pIHBbZlsxXV0gPSBwYXJzZURhdGUocFtmWzFdXSk7XG5cdH1cblxuXHRyZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gY3BfZG9pdChmLCBnLCBoLCBvLCBwKSB7XG5cdGlmKHBbZl0gIT0gbnVsbCB8fCBnID09IG51bGwgfHwgZyA9PT0gXCJcIikgcmV0dXJuO1xuXHRwW2ZdID0gZztcblx0ZyA9IGVzY2FwZXhtbChnKTtcblx0b1tvLmxlbmd0aF0gPSAoaCA/IHdyaXRleHRhZyhmLGcsaCkgOiB3cml0ZXRhZyhmLGcpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfY29yZV9wcm9wcyhjcCwgX29wdHMpIHtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0dmFyIG8gPSBbWE1MX0hFQURFUiwgd3JpdGV4dGFnKCdjcDpjb3JlUHJvcGVydGllcycsIG51bGwsIHtcblx0XHQvLyd4bWxucyc6IFhNTE5TLkNPUkVfUFJPUFMsXG5cdFx0J3htbG5zOmNwJzogWE1MTlMuQ09SRV9QUk9QUyxcblx0XHQneG1sbnM6ZGMnOiBYTUxOUy5kYyxcblx0XHQneG1sbnM6ZGN0ZXJtcyc6IFhNTE5TLmRjdGVybXMsXG5cdFx0J3htbG5zOmRjbWl0eXBlJzogWE1MTlMuZGNtaXR5cGUsXG5cdFx0J3htbG5zOnhzaSc6IFhNTE5TLnhzaVxuXHR9KV0sIHAgPSB7fTtcblx0aWYoIWNwICYmICFvcHRzLlByb3BzKSByZXR1cm4gby5qb2luKFwiXCIpO1xuXG5cdGlmKGNwKSB7XG5cdFx0aWYoY3AuQ3JlYXRlZERhdGUgIT0gbnVsbCkgY3BfZG9pdChcImRjdGVybXM6Y3JlYXRlZFwiLCB0eXBlb2YgY3AuQ3JlYXRlZERhdGUgPT09IFwic3RyaW5nXCIgPyBjcC5DcmVhdGVkRGF0ZSA6IHdyaXRlX3czY2R0ZihjcC5DcmVhdGVkRGF0ZSwgb3B0cy5XVEYpLCB7XCJ4c2k6dHlwZVwiOlwiZGN0ZXJtczpXM0NEVEZcIn0sIG8sIHApO1xuXHRcdGlmKGNwLk1vZGlmaWVkRGF0ZSAhPSBudWxsKSBjcF9kb2l0KFwiZGN0ZXJtczptb2RpZmllZFwiLCB0eXBlb2YgY3AuTW9kaWZpZWREYXRlID09PSBcInN0cmluZ1wiID8gY3AuTW9kaWZpZWREYXRlIDogd3JpdGVfdzNjZHRmKGNwLk1vZGlmaWVkRGF0ZSwgb3B0cy5XVEYpLCB7XCJ4c2k6dHlwZVwiOlwiZGN0ZXJtczpXM0NEVEZcIn0sIG8sIHApO1xuXHR9XG5cblx0Zm9yKHZhciBpID0gMDsgaSAhPSBDT1JFX1BST1BTLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIGYgPSBDT1JFX1BST1BTW2ldO1xuXHRcdHZhciB2ID0gb3B0cy5Qcm9wcyAmJiBvcHRzLlByb3BzW2ZbMV1dICE9IG51bGwgPyBvcHRzLlByb3BzW2ZbMV1dIDogY3AgPyBjcFtmWzFdXSA6IG51bGw7XG5cdFx0aWYodiA9PT0gdHJ1ZSkgdiA9IFwiMVwiO1xuXHRcdGVsc2UgaWYodiA9PT0gZmFsc2UpIHYgPSBcIjBcIjtcblx0XHRlbHNlIGlmKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpIHYgPSBTdHJpbmcodik7XG5cdFx0aWYodiAhPSBudWxsKSBjcF9kb2l0KGZbMF0sIHYsIG51bGwsIG8sIHApO1xuXHR9XG5cdGlmKG8ubGVuZ3RoPjIpeyBvW28ubGVuZ3RoXSA9ICgnPC9jcDpjb3JlUHJvcGVydGllcz4nKTsgb1sxXT1vWzFdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogMTUuMi4xMi4zIEV4dGVuZGVkIEZpbGUgUHJvcGVydGllcyBQYXJ0ICovXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMi5bMS0yXS4xIChQSURTSS9QSUREU0kpICovXG52YXIgRVhUX1BST1BTLyo6QXJyYXk8QXJyYXk8c3RyaW5nPiA+Ki8gPSBbXG5cdFtcIkFwcGxpY2F0aW9uXCIsIFwiQXBwbGljYXRpb25cIiwgXCJzdHJpbmdcIl0sXG5cdFtcIkFwcFZlcnNpb25cIiwgXCJBcHBWZXJzaW9uXCIsIFwic3RyaW5nXCJdLFxuXHRbXCJDb21wYW55XCIsIFwiQ29tcGFueVwiLCBcInN0cmluZ1wiXSxcblx0W1wiRG9jU2VjdXJpdHlcIiwgXCJEb2NTZWN1cml0eVwiLCBcInN0cmluZ1wiXSxcblx0W1wiTWFuYWdlclwiLCBcIk1hbmFnZXJcIiwgXCJzdHJpbmdcIl0sXG5cdFtcIkh5cGVybGlua3NDaGFuZ2VkXCIsIFwiSHlwZXJsaW5rc0NoYW5nZWRcIiwgXCJib29sXCJdLFxuXHRbXCJTaGFyZWREb2NcIiwgXCJTaGFyZWREb2NcIiwgXCJib29sXCJdLFxuXHRbXCJMaW5rc1VwVG9EYXRlXCIsIFwiTGlua3NVcFRvRGF0ZVwiLCBcImJvb2xcIl0sXG5cdFtcIlNjYWxlQ3JvcFwiLCBcIlNjYWxlQ3JvcFwiLCBcImJvb2xcIl0sXG5cdFtcIkhlYWRpbmdQYWlyc1wiLCBcIkhlYWRpbmdQYWlyc1wiLCBcInJhd1wiXSxcblx0W1wiVGl0bGVzT2ZQYXJ0c1wiLCBcIlRpdGxlc09mUGFydHNcIiwgXCJyYXdcIl1cbl07XG5cbnZhciBQc2V1ZG9Qcm9wc1BhaXJzID0gW1xuXHRcIldvcmtzaGVldHNcIiwgIFwiU2hlZXROYW1lc1wiLFxuXHRcIk5hbWVkUmFuZ2VzXCIsIFwiRGVmaW5lZE5hbWVzXCIsXG5cdFwiQ2hhcnRzaGVldHNcIiwgXCJDaGFydE5hbWVzXCJcbl07XG5mdW5jdGlvbiBsb2FkX3Byb3BzX3BhaXJzKEhQLyo6c3RyaW5nfEFycmF5PEFycmF5PGFueT4+Ki8sIFRPUCwgcHJvcHMsIG9wdHMpIHtcblx0dmFyIHYgPSBbXTtcblx0aWYodHlwZW9mIEhQID09IFwic3RyaW5nXCIpIHYgPSBwYXJzZVZlY3RvcihIUCwgb3B0cyk7XG5cdGVsc2UgZm9yKHZhciBqID0gMDsgaiA8IEhQLmxlbmd0aDsgKytqKSB2ID0gdi5jb25jYXQoSFBbal0ubWFwKGZ1bmN0aW9uKGhwKSB7IHJldHVybiB7djpocH07IH0pKTtcblx0dmFyIHBhcnRzID0gKHR5cGVvZiBUT1AgPT0gXCJzdHJpbmdcIikgPyBwYXJzZVZlY3RvcihUT1AsIG9wdHMpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC52OyB9KSA6IFRPUDtcblx0dmFyIGlkeCA9IDAsIGxlbiA9IDA7XG5cdGlmKHBhcnRzLmxlbmd0aCA+IDApIGZvcih2YXIgaSA9IDA7IGkgIT09IHYubGVuZ3RoOyBpICs9IDIpIHtcblx0XHRsZW4gPSArKHZbaSsxXS52KTtcblx0XHRzd2l0Y2godltpXS52KSB7XG5cdFx0XHRjYXNlIFwiV29ya3NoZWV0c1wiOlxuXHRcdFx0Y2FzZSBcIuW3peS9nOihqFwiOlxuXHRcdFx0Y2FzZSBcItCb0LjRgdGC0YtcIjpcblx0XHRcdGNhc2UgXCLYo9mI2LHYp9mCINin2YTYudmF2YRcIjpcblx0XHRcdGNhc2UgXCLjg6/jg7zjgq/jgrfjg7zjg4hcIjpcblx0XHRcdGNhc2UgXCLXktec15nXldeg15XXqiDXoteR15XXk9eUXCI6XG5cdFx0XHRjYXNlIFwiQXJiZWl0c2Jsw6R0dGVyXCI6XG5cdFx0XHRjYXNlIFwiw4dhbMSxxZ9tYSBTYXlmYWxhcsSxXCI6XG5cdFx0XHRjYXNlIFwiRmV1aWxsZXMgZGUgY2FsY3VsXCI6XG5cdFx0XHRjYXNlIFwiRm9nbGkgZGkgbGF2b3JvXCI6XG5cdFx0XHRjYXNlIFwiRm9saGFzIGRlIGPDoWxjdWxvXCI6XG5cdFx0XHRjYXNlIFwiUGxhbmlsaGFzXCI6XG5cdFx0XHRjYXNlIFwiUmVnbmVhcmtcIjpcblx0XHRcdGNhc2UgXCJIb2phcyBkZSBjw6FsY3Vsb1wiOlxuXHRcdFx0Y2FzZSBcIldlcmtibGFkZW5cIjpcblx0XHRcdFx0cHJvcHMuV29ya3NoZWV0cyA9IGxlbjtcblx0XHRcdFx0cHJvcHMuU2hlZXROYW1lcyA9IHBhcnRzLnNsaWNlKGlkeCwgaWR4ICsgbGVuKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJOYW1lZCBSYW5nZXNcIjpcblx0XHRcdGNhc2UgXCJSYW5nb3MgY29uIG5vbWJyZVwiOlxuXHRcdFx0Y2FzZSBcIuWQjeWJjeS7mOOBjeS4gOimp1wiOlxuXHRcdFx0Y2FzZSBcIkJlbmFubnRlIEJlcmVpY2hlXCI6XG5cdFx0XHRjYXNlIFwiTmF2bmdpdm5lIG9tcsOlZGVyXCI6XG5cdFx0XHRcdHByb3BzLk5hbWVkUmFuZ2VzID0gbGVuO1xuXHRcdFx0XHRwcm9wcy5EZWZpbmVkTmFtZXMgPSBwYXJ0cy5zbGljZShpZHgsIGlkeCArIGxlbik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiQ2hhcnRzXCI6XG5cdFx0XHRjYXNlIFwiRGlhZ3JhbW1lXCI6XG5cdFx0XHRcdHByb3BzLkNoYXJ0c2hlZXRzID0gbGVuO1xuXHRcdFx0XHRwcm9wcy5DaGFydE5hbWVzID0gcGFydHMuc2xpY2UoaWR4LCBpZHggKyBsZW4pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWR4ICs9IGxlbjtcblx0fVxufVxuXG5mdW5jdGlvbiBwYXJzZV9leHRfcHJvcHMoZGF0YSwgcCwgb3B0cykge1xuXHR2YXIgcSA9IHt9OyBpZighcCkgcCA9IHt9O1xuXHRkYXRhID0gdXRmOHJlYWQoZGF0YSk7XG5cblx0RVhUX1BST1BTLmZvckVhY2goZnVuY3Rpb24oZikge1xuXHRcdHZhciB4bWwgPSAoZGF0YS5tYXRjaChtYXRjaHRhZyhmWzBdKSl8fFtdKVsxXTtcblx0XHRzd2l0Y2goZlsyXSkge1xuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOiBpZih4bWwpIHBbZlsxXV0gPSB1bmVzY2FwZXhtbCh4bWwpOyBicmVhaztcblx0XHRcdGNhc2UgXCJib29sXCI6IHBbZlsxXV0gPSB4bWwgPT09IFwidHJ1ZVwiOyBicmVhaztcblx0XHRcdGNhc2UgXCJyYXdcIjpcblx0XHRcdFx0dmFyIGN1ciA9IGRhdGEubWF0Y2gobmV3IFJlZ0V4cChcIjxcIiArIGZbMF0gKyBcIltePl0qPihbXFxcXHNcXFxcU10qPyk8XFwvXCIgKyBmWzBdICsgXCI+XCIpKTtcblx0XHRcdFx0aWYoY3VyICYmIGN1ci5sZW5ndGggPiAwKSBxW2ZbMV1dID0gY3VyWzFdO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0pO1xuXG5cdGlmKHEuSGVhZGluZ1BhaXJzICYmIHEuVGl0bGVzT2ZQYXJ0cykgbG9hZF9wcm9wc19wYWlycyhxLkhlYWRpbmdQYWlycywgcS5UaXRsZXNPZlBhcnRzLCBwLCBvcHRzKTtcblxuXHRyZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gd3JpdGVfZXh0X3Byb3BzKGNwLyo6Oiwgb3B0cyovKS8qOnN0cmluZyovIHtcblx0dmFyIG8vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXSwgVyA9IHdyaXRleHRhZztcblx0aWYoIWNwKSBjcCA9IHt9O1xuXHRjcC5BcHBsaWNhdGlvbiA9IFwiU2hlZXRKU1wiO1xuXHRvW28ubGVuZ3RoXSA9IChYTUxfSEVBREVSKTtcblx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdQcm9wZXJ0aWVzJywgbnVsbCwge1xuXHRcdCd4bWxucyc6IFhNTE5TLkVYVF9QUk9QUyxcblx0XHQneG1sbnM6dnQnOiBYTUxOUy52dFxuXHR9KSk7XG5cblx0RVhUX1BST1BTLmZvckVhY2goZnVuY3Rpb24oZikge1xuXHRcdGlmKGNwW2ZbMV1dID09PSB1bmRlZmluZWQpIHJldHVybjtcblx0XHR2YXIgdjtcblx0XHRzd2l0Y2goZlsyXSkge1xuXHRcdFx0Y2FzZSAnc3RyaW5nJzogdiA9IGVzY2FwZXhtbChTdHJpbmcoY3BbZlsxXV0pKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdib29sJzogdiA9IGNwW2ZbMV1dID8gJ3RydWUnIDogJ2ZhbHNlJzsgYnJlYWs7XG5cdFx0fVxuXHRcdGlmKHYgIT09IHVuZGVmaW5lZCkgb1tvLmxlbmd0aF0gPSAoVyhmWzBdLCB2KSk7XG5cdH0pO1xuXG5cdC8qIFRPRE86IEhlYWRpbmdQYWlycywgVGl0bGVzT2ZQYXJ0cyAqL1xuXHRvW28ubGVuZ3RoXSA9IChXKCdIZWFkaW5nUGFpcnMnLCBXKCd2dDp2ZWN0b3InLCBXKCd2dDp2YXJpYW50JywgJzx2dDpscHN0cj5Xb3Jrc2hlZXRzPC92dDpscHN0cj4nKStXKCd2dDp2YXJpYW50JywgVygndnQ6aTQnLCBTdHJpbmcoY3AuV29ya3NoZWV0cykpKSwge3NpemU6MiwgYmFzZVR5cGU6XCJ2YXJpYW50XCJ9KSkpO1xuXHRvW28ubGVuZ3RoXSA9IChXKCdUaXRsZXNPZlBhcnRzJywgVygndnQ6dmVjdG9yJywgY3AuU2hlZXROYW1lcy5tYXAoZnVuY3Rpb24ocykgeyByZXR1cm4gXCI8dnQ6bHBzdHI+XCIgKyBlc2NhcGV4bWwocykgKyBcIjwvdnQ6bHBzdHI+XCI7IH0pLmpvaW4oXCJcIiksIHtzaXplOiBjcC5Xb3Jrc2hlZXRzLCBiYXNlVHlwZTpcImxwc3RyXCJ9KSkpO1xuXHRpZihvLmxlbmd0aD4yKXsgb1tvLmxlbmd0aF0gPSAoJzwvUHJvcGVydGllcz4nKTsgb1sxXT1vWzFdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogMTUuMi4xMi4yIEN1c3RvbSBGaWxlIFByb3BlcnRpZXMgUGFydCAqL1xudmFyIGN1c3RyZWdleCA9IC88W14+XSs+W148XSovZztcbmZ1bmN0aW9uIHBhcnNlX2N1c3RfcHJvcHMoZGF0YS8qOnN0cmluZyovLCBvcHRzKSB7XG5cdHZhciBwID0ge30sIG5hbWUgPSBcIlwiO1xuXHR2YXIgbSA9IGRhdGEubWF0Y2goY3VzdHJlZ2V4KTtcblx0aWYobSkgZm9yKHZhciBpID0gMDsgaSAhPSBtLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHggPSBtW2ldLCB5ID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHlbMF0pIHtcblx0XHRcdGNhc2UgJzw/eG1sJzogYnJlYWs7XG5cdFx0XHRjYXNlICc8UHJvcGVydGllcyc6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHByb3BlcnR5JzogbmFtZSA9IHVuZXNjYXBleG1sKHkubmFtZSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9wcm9wZXJ0eT4nOiBuYW1lID0gbnVsbDsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiBpZiAoeC5pbmRleE9mKCc8dnQ6JykgPT09IDApIHtcblx0XHRcdFx0dmFyIHRva3MgPSB4LnNwbGl0KCc+Jyk7XG5cdFx0XHRcdHZhciB0eXBlID0gdG9rc1swXS5zbGljZSg0KSwgdGV4dCA9IHRva3NbMV07XG5cdFx0XHRcdC8qIDIyLjQuMi4zMiAoQ1RfVmFyaWFudCkuIE9taXQgdGhlIGJpbmFyeSB0eXBlcyBmcm9tIDIyLjQgKFZhcmlhbnQgVHlwZXMpICovXG5cdFx0XHRcdHN3aXRjaCh0eXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSAnbHBzdHInOiBjYXNlICdic3RyJzogY2FzZSAnbHB3c3RyJzpcblx0XHRcdFx0XHRcdHBbbmFtZV0gPSB1bmVzY2FwZXhtbCh0ZXh0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHBhcnNleG1sYm9vbCh0ZXh0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2kxJzogY2FzZSAnaTInOiBjYXNlICdpNCc6IGNhc2UgJ2k4JzogY2FzZSAnaW50JzogY2FzZSAndWludCc6XG5cdFx0XHRcdFx0XHRwW25hbWVdID0gcGFyc2VJbnQodGV4dCwgMTApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncjQnOiBjYXNlICdyOCc6IGNhc2UgJ2RlY2ltYWwnOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHBhcnNlRmxvYXQodGV4dCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaWxldGltZSc6IGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHBhcnNlRGF0ZSh0ZXh0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2N5JzogY2FzZSAnZXJyb3InOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHVuZXNjYXBleG1sKHRleHQpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGlmKHR5cGUuc2xpY2UoLTEpID09ICcvJykgYnJlYWs7XG5cdFx0XHRcdFx0XHRpZihvcHRzLldURiAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIGNvbnNvbGUud2FybignVW5leHBlY3RlZCcsIHgsIHR5cGUsIHRva3MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYoeC5zbGljZSgwLDIpID09PSBcIjwvXCIpIHsvKiBlbXB0eSAqL1xuXHRcdFx0fSBlbHNlIGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoeCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9jdXN0X3Byb3BzKGNwLyo6Oiwgb3B0cyovKS8qOnN0cmluZyovIHtcblx0dmFyIG8gPSBbWE1MX0hFQURFUiwgd3JpdGV4dGFnKCdQcm9wZXJ0aWVzJywgbnVsbCwge1xuXHRcdCd4bWxucyc6IFhNTE5TLkNVU1RfUFJPUFMsXG5cdFx0J3htbG5zOnZ0JzogWE1MTlMudnRcblx0fSldO1xuXHRpZighY3ApIHJldHVybiBvLmpvaW4oXCJcIik7XG5cdHZhciBwaWQgPSAxO1xuXHRrZXlzKGNwKS5mb3JFYWNoKGZ1bmN0aW9uIGN1c3Rwcm9wKGspIHsgKytwaWQ7XG5cdFx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdwcm9wZXJ0eScsIHdyaXRlX3Z0KGNwW2tdLCB0cnVlKSwge1xuXHRcdFx0J2ZtdGlkJzogJ3tENUNERDUwNS0yRTlDLTEwMUItOTM5Ny0wODAwMkIyQ0Y5QUV9Jyxcblx0XHRcdCdwaWQnOiBwaWQsXG5cdFx0XHQnbmFtZSc6IGVzY2FwZXhtbChrKVxuXHRcdH0pKTtcblx0fSk7XG5cdGlmKG8ubGVuZ3RoPjIpeyBvW28ubGVuZ3RoXSA9ICc8L1Byb3BlcnRpZXM+Jzsgb1sxXT1vWzFdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogQ29tbW9uIE5hbWUgLT4gWExNTCBOYW1lICovXG52YXIgWExNTERvY1Byb3BzTWFwID0ge1xuXHRUaXRsZTogJ1RpdGxlJyxcblx0U3ViamVjdDogJ1N1YmplY3QnLFxuXHRBdXRob3I6ICdBdXRob3InLFxuXHRLZXl3b3JkczogJ0tleXdvcmRzJyxcblx0Q29tbWVudHM6ICdEZXNjcmlwdGlvbicsXG5cdExhc3RBdXRob3I6ICdMYXN0QXV0aG9yJyxcblx0UmV2TnVtYmVyOiAnUmV2aXNpb24nLFxuXHRBcHBsaWNhdGlvbjogJ0FwcE5hbWUnLFxuXHQvKiBUb3RhbFRpbWU6ICdUb3RhbFRpbWUnLCAqL1xuXHRMYXN0UHJpbnRlZDogJ0xhc3RQcmludGVkJyxcblx0Q3JlYXRlZERhdGU6ICdDcmVhdGVkJyxcblx0TW9kaWZpZWREYXRlOiAnTGFzdFNhdmVkJyxcblx0LyogUGFnZXMgKi9cblx0LyogV29yZHMgKi9cblx0LyogQ2hhcmFjdGVycyAqL1xuXHRDYXRlZ29yeTogJ0NhdGVnb3J5Jyxcblx0LyogUHJlc2VudGF0aW9uRm9ybWF0ICovXG5cdE1hbmFnZXI6ICdNYW5hZ2VyJyxcblx0Q29tcGFueTogJ0NvbXBhbnknLFxuXHQvKiBHdWlkICovXG5cdC8qIEh5cGVybGlua0Jhc2UgKi9cblx0LyogQnl0ZXMgKi9cblx0LyogTGluZXMgKi9cblx0LyogUGFyYWdyYXBocyAqL1xuXHQvKiBDaGFyYWN0ZXJzV2l0aFNwYWNlcyAqL1xuXHRBcHBWZXJzaW9uOiAnVmVyc2lvbicsXG5cblx0Q29udGVudFN0YXR1czogJ0NvbnRlbnRTdGF0dXMnLCAvKiBOT1RFOiBtaXNzaW5nIGZyb20gc2NoZW1hICovXG5cdElkZW50aWZpZXI6ICdJZGVudGlmaWVyJywgLyogTk9URTogbWlzc2luZyBmcm9tIHNjaGVtYSAqL1xuXHRMYW5ndWFnZTogJ0xhbmd1YWdlJyAvKiBOT1RFOiBtaXNzaW5nIGZyb20gc2NoZW1hICovXG59O1xudmFyIGV2ZXJ0X1hMTUxEUE07XG5cbmZ1bmN0aW9uIHhsbWxfc2V0X3Byb3AoUHJvcHMsIHRhZy8qOnN0cmluZyovLCB2YWwpIHtcblx0aWYoIWV2ZXJ0X1hMTUxEUE0pIGV2ZXJ0X1hMTUxEUE0gPSBldmVydChYTE1MRG9jUHJvcHNNYXApO1xuXHR0YWcgPSBldmVydF9YTE1MRFBNW3RhZ10gfHwgdGFnO1xuXHRQcm9wc1t0YWddID0gdmFsO1xufVxuXG5mdW5jdGlvbiB4bG1sX3dyaXRlX2RvY3Byb3BzKFByb3BzLCBvcHRzKSB7XG5cdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdGtleXMoWExNTERvY1Byb3BzTWFwKS5tYXAoZnVuY3Rpb24obSkge1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBDT1JFX1BST1BTLmxlbmd0aDsgKytpKSBpZihDT1JFX1BST1BTW2ldWzFdID09IG0pIHJldHVybiBDT1JFX1BST1BTW2ldO1xuXHRcdGZvcihpID0gMDsgaSA8IEVYVF9QUk9QUy5sZW5ndGg7ICsraSkgaWYoRVhUX1BST1BTW2ldWzFdID09IG0pIHJldHVybiBFWFRfUFJPUFNbaV07XG5cdFx0dGhyb3cgbTtcblx0fSkuZm9yRWFjaChmdW5jdGlvbihwKSB7XG5cdFx0aWYoUHJvcHNbcFsxXV0gPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHZhciBtID0gb3B0cyAmJiBvcHRzLlByb3BzICYmIG9wdHMuUHJvcHNbcFsxXV0gIT0gbnVsbCA/IG9wdHMuUHJvcHNbcFsxXV0gOiBQcm9wc1twWzFdXTtcblx0XHRzd2l0Y2gocFsyXSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6IG0gPSBuZXcgRGF0ZShtKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLlxcZCpaLyxcIlpcIik7IGJyZWFrO1xuXHRcdH1cblx0XHRpZih0eXBlb2YgbSA9PSAnbnVtYmVyJykgbSA9IFN0cmluZyhtKTtcblx0XHRlbHNlIGlmKG0gPT09IHRydWUgfHwgbSA9PT0gZmFsc2UpIHsgbSA9IG0gPyBcIjFcIiA6IFwiMFwiOyB9XG5cdFx0ZWxzZSBpZihtIGluc3RhbmNlb2YgRGF0ZSkgbSA9IG5ldyBEYXRlKG0pLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkKlovLFwiXCIpO1xuXHRcdG8ucHVzaCh3cml0ZXRhZyhYTE1MRG9jUHJvcHNNYXBbcFsxXV0gfHwgcFsxXSwgbSkpO1xuXHR9KTtcblx0cmV0dXJuIHdyaXRleHRhZygnRG9jdW1lbnRQcm9wZXJ0aWVzJywgby5qb2luKFwiXCIpLCB7eG1sbnM6WExNTE5TLm8gfSk7XG59XG5mdW5jdGlvbiB4bG1sX3dyaXRlX2N1c3Rwcm9wcyhQcm9wcywgQ3VzdHByb3BzLyo6Oiwgb3B0cyovKSB7XG5cdHZhciBCTEFDS0xJU1QgPSBbXCJXb3Jrc2hlZXRzXCIsXCJTaGVldE5hbWVzXCJdO1xuXHR2YXIgVCA9ICdDdXN0b21Eb2N1bWVudFByb3BlcnRpZXMnO1xuXHR2YXIgby8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHRpZihQcm9wcykga2V5cyhQcm9wcykuZm9yRWFjaChmdW5jdGlvbihrKSB7XG5cdFx0Lyo6OiBpZighUHJvcHMpIHJldHVybjsgKi9cblx0XHRpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFByb3BzLCBrKSkgcmV0dXJuO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBDT1JFX1BST1BTLmxlbmd0aDsgKytpKSBpZihrID09IENPUkVfUFJPUFNbaV1bMV0pIHJldHVybjtcblx0XHRmb3IoaSA9IDA7IGkgPCBFWFRfUFJPUFMubGVuZ3RoOyArK2kpIGlmKGsgPT0gRVhUX1BST1BTW2ldWzFdKSByZXR1cm47XG5cdFx0Zm9yKGkgPSAwOyBpIDwgQkxBQ0tMSVNULmxlbmd0aDsgKytpKSBpZihrID09IEJMQUNLTElTVFtpXSkgcmV0dXJuO1xuXG5cdFx0dmFyIG0gPSBQcm9wc1trXTtcblx0XHR2YXIgdCA9IFwic3RyaW5nXCI7XG5cdFx0aWYodHlwZW9mIG0gPT0gJ251bWJlcicpIHsgdCA9IFwiZmxvYXRcIjsgbSA9IFN0cmluZyhtKTsgfVxuXHRcdGVsc2UgaWYobSA9PT0gdHJ1ZSB8fCBtID09PSBmYWxzZSkgeyB0ID0gXCJib29sZWFuXCI7IG0gPSBtID8gXCIxXCIgOiBcIjBcIjsgfVxuXHRcdGVsc2UgbSA9IFN0cmluZyhtKTtcblx0XHRvLnB1c2god3JpdGV4dGFnKGVzY2FwZXhtbHRhZyhrKSwgbSwge1wiZHQ6ZHRcIjp0fSkpO1xuXHR9KTtcblx0aWYoQ3VzdHByb3BzKSBrZXlzKEN1c3Rwcm9wcykuZm9yRWFjaChmdW5jdGlvbihrKSB7XG5cdFx0Lyo6OiBpZighQ3VzdHByb3BzKSByZXR1cm47ICovXG5cdFx0aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChDdXN0cHJvcHMsIGspKSByZXR1cm47XG5cdFx0aWYoUHJvcHMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFByb3BzLCBrKSkgcmV0dXJuO1xuXHRcdHZhciBtID0gQ3VzdHByb3BzW2tdO1xuXHRcdHZhciB0ID0gXCJzdHJpbmdcIjtcblx0XHRpZih0eXBlb2YgbSA9PSAnbnVtYmVyJykgeyB0ID0gXCJmbG9hdFwiOyBtID0gU3RyaW5nKG0pOyB9XG5cdFx0ZWxzZSBpZihtID09PSB0cnVlIHx8IG0gPT09IGZhbHNlKSB7IHQgPSBcImJvb2xlYW5cIjsgbSA9IG0gPyBcIjFcIiA6IFwiMFwiOyB9XG5cdFx0ZWxzZSBpZihtIGluc3RhbmNlb2YgRGF0ZSkgeyB0ID0gXCJkYXRlVGltZS50elwiOyBtID0gbS50b0lTT1N0cmluZygpOyB9XG5cdFx0ZWxzZSBtID0gU3RyaW5nKG0pO1xuXHRcdG8ucHVzaCh3cml0ZXh0YWcoZXNjYXBleG1sdGFnKGspLCBtLCB7XCJkdDpkdFwiOnR9KSk7XG5cdH0pO1xuXHRyZXR1cm4gJzwnICsgVCArICcgeG1sbnM9XCInICsgWExNTE5TLm8gKyAnXCI+JyArIG8uam9pbihcIlwiKSArICc8LycgKyBUICsgJz4nO1xufVxuLyogW01TLURUWVBdIDIuMy4zIEZJTEVUSU1FICovXG4vKiBbTVMtT0xFRFNdIDIuMS4zIEZJTEVUSU1FIChQYWNrZXQgVmVyc2lvbikgKi9cbi8qIFtNUy1PTEVQU10gMi44IEZJTEVUSU1FIChQYWNrZXQgVmVyc2lvbikgKi9cbmZ1bmN0aW9uIHBhcnNlX0ZJTEVUSU1FKGJsb2IpIHtcblx0dmFyIGR3TG93RGF0ZVRpbWUgPSBibG9iLnJlYWRfc2hpZnQoNCksIGR3SGlnaERhdGVUaW1lID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRyZXR1cm4gbmV3IERhdGUoKChkd0hpZ2hEYXRlVGltZS8xZTcqTWF0aC5wb3coMiwzMikgKyBkd0xvd0RhdGVUaW1lLzFlNykgLSAxMTY0NDQ3MzYwMCkqMTAwMCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cXC4wMDAvLFwiXCIpO1xufVxuZnVuY3Rpb24gd3JpdGVfRklMRVRJTUUodGltZS8qOnN0cmluZ3xEYXRlKi8pIHtcblx0dmFyIGRhdGUgPSAodHlwZW9mIHRpbWUgPT0gXCJzdHJpbmdcIikgPyBuZXcgRGF0ZShEYXRlLnBhcnNlKHRpbWUpKSA6IHRpbWU7XG5cdHZhciB0ID0gZGF0ZS5nZXRUaW1lKCkgLyAxMDAwICsgMTE2NDQ0NzM2MDA7XG5cdHZhciBsID0gdCAlIE1hdGgucG93KDIsMzIpLCBoID0gKHQgLSBsKSAvIE1hdGgucG93KDIsMzIpO1xuXHRsICo9IDFlNzsgaCAqPSAxZTc7XG5cdHZhciB3ID0gKGwgLyBNYXRoLnBvdygyLDMyKSkgfCAwO1xuXHRpZih3ID4gMCkgeyBsID0gbCAlIE1hdGgucG93KDIsMzIpOyBoICs9IHc7IH1cblx0dmFyIG8gPSBuZXdfYnVmKDgpOyBvLndyaXRlX3NoaWZ0KDQsIGwpOyBvLndyaXRlX3NoaWZ0KDQsIGgpOyByZXR1cm4gbztcbn1cblxuLyogW01TLU9TSEFSRURdIDIuMy4zLjEuNCBMcHN0ciAqL1xuZnVuY3Rpb24gcGFyc2VfbHBzdHIoYmxvYiwgdHlwZSwgcGFkLyo6P251bWJlciovKSB7XG5cdHZhciBzdGFydCA9IGJsb2IubDtcblx0dmFyIHN0ciA9IGJsb2IucmVhZF9zaGlmdCgwLCAnbHBzdHItY3AnKTtcblx0aWYocGFkKSB3aGlsZSgoYmxvYi5sIC0gc3RhcnQpICYgMykgKytibG9iLmw7XG5cdHJldHVybiBzdHI7XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjYgTHB3c3RyICovXG5mdW5jdGlvbiBwYXJzZV9scHdzdHIoYmxvYiwgdHlwZSwgcGFkKSB7XG5cdHZhciBzdHIgPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwd3N0cicpO1xuXHRpZihwYWQpIGJsb2IubCArPSAoNCAtICgoc3RyLmxlbmd0aCsxKSAmIDMpKSAmIDM7XG5cdHJldHVybiBzdHI7XG59XG5cblxuLyogW01TLU9TSEFSRURdIDIuMy4zLjEuMTEgVnRTdHJpbmcgKi9cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjEyIFZ0VW5hbGlnbmVkU3RyaW5nICovXG5mdW5jdGlvbiBwYXJzZV9WdFN0cmluZ0Jhc2UoYmxvYiwgc3RyaW5nVHlwZSwgcGFkKSB7XG5cdGlmKHN0cmluZ1R5cGUgPT09IDB4MUYgLypWVF9MUFdTVFIqLykgcmV0dXJuIHBhcnNlX2xwd3N0cihibG9iKTtcblx0cmV0dXJuIHBhcnNlX2xwc3RyKGJsb2IsIHN0cmluZ1R5cGUsIHBhZCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX1Z0U3RyaW5nKGJsb2IsIHQvKjpudW1iZXIqLywgcGFkLyo6P2Jvb2xlYW4qLykgeyByZXR1cm4gcGFyc2VfVnRTdHJpbmdCYXNlKGJsb2IsIHQsIHBhZCA9PT0gZmFsc2UgPyAwOiA0KTsgfVxuZnVuY3Rpb24gcGFyc2VfVnRVbmFsaWduZWRTdHJpbmcoYmxvYiwgdC8qOm51bWJlciovKSB7IGlmKCF0KSB0aHJvdyBuZXcgRXJyb3IoXCJWdFVuYWxpZ25lZFN0cmluZyBtdXN0IGhhdmUgcG9zaXRpdmUgbGVuZ3RoXCIpOyByZXR1cm4gcGFyc2VfVnRTdHJpbmdCYXNlKGJsb2IsIHQsIDApOyB9XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjcgVnRWZWNMcHdzdHJWYWx1ZSAqL1xuZnVuY3Rpb24gcGFyc2VfVnRWZWNMcHdzdHJWYWx1ZShibG9iKS8qOkFycmF5PHN0cmluZz4qLyB7XG5cdHZhciBsZW5ndGggPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciByZXQvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkge1xuXHRcdHZhciBzdGFydCA9IGJsb2IubDtcblx0XHRyZXRbaV0gPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwd3N0cicpLnJlcGxhY2UoY2hyMCwnJyk7XG5cdFx0aWYoKGJsb2IubCAtIHN0YXJ0KSAmIDB4MDIpIGJsb2IubCArPSAyO1xuXHR9XG5cdHJldHVybiByZXQ7XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjkgVnRWZWNVbmFsaWduZWRMcHN0clZhbHVlICovXG5mdW5jdGlvbiBwYXJzZV9WdFZlY1VuYWxpZ25lZExwc3RyVmFsdWUoYmxvYikvKjpBcnJheTxzdHJpbmc+Ki8ge1xuXHR2YXIgbGVuZ3RoID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgcmV0Lyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHJldFtpXSA9IGJsb2IucmVhZF9zaGlmdCgwLCAnbHBzdHItY3AnKS5yZXBsYWNlKGNocjAsJycpO1xuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjEzIFZ0SGVhZGluZ1BhaXIgKi9cbmZ1bmN0aW9uIHBhcnNlX1Z0SGVhZGluZ1BhaXIoYmxvYikge1xuXHR2YXIgc3RhcnQgPSBibG9iLmw7XG5cdHZhciBoZWFkaW5nU3RyaW5nID0gcGFyc2VfVHlwZWRQcm9wZXJ0eVZhbHVlKGJsb2IsIFZUX1VTVFIpO1xuXHRpZihibG9iW2Jsb2IubF0gPT0gMHgwMCAmJiBibG9iW2Jsb2IubCsxXSA9PSAweDAwICYmICgoYmxvYi5sIC0gc3RhcnQpICYgMHgwMikpIGJsb2IubCArPSAyO1xuXHR2YXIgaGVhZGVyUGFydHMgPSBwYXJzZV9UeXBlZFByb3BlcnR5VmFsdWUoYmxvYiwgVlRfSTQpO1xuXHRyZXR1cm4gW2hlYWRpbmdTdHJpbmcsIGhlYWRlclBhcnRzXTtcbn1cblxuLyogW01TLU9TSEFSRURdIDIuMy4zLjEuMTQgVnRWZWNIZWFkaW5nUGFpclZhbHVlICovXG5mdW5jdGlvbiBwYXJzZV9WdFZlY0hlYWRpbmdQYWlyVmFsdWUoYmxvYikge1xuXHR2YXIgY0VsZW1lbnRzID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgb3V0ID0gW107XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBjRWxlbWVudHMgLyAyOyArK2kpIG91dC5wdXNoKHBhcnNlX1Z0SGVhZGluZ1BhaXIoYmxvYikpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtT0xFUFNdIDIuMTguMSBEaWN0aW9uYXJ5ICh1c2VzIDIuMTcsIDIuMTYpICovXG5mdW5jdGlvbiBwYXJzZV9kaWN0aW9uYXJ5KGJsb2IsQ29kZVBhZ2UpIHtcblx0dmFyIGNudCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIGRpY3QvKjp7W251bWJlcl06c3RyaW5nfSovID0gKHt9Lyo6YW55Ki8pO1xuXHRmb3IodmFyIGogPSAwOyBqICE9IGNudDsgKytqKSB7XG5cdFx0dmFyIHBpZCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHR2YXIgbGVuID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdGRpY3RbcGlkXSA9IGJsb2IucmVhZF9zaGlmdChsZW4sIChDb2RlUGFnZSA9PT0gMHg0QjAgPyd1dGYxNmxlJzondXRmOCcpKS5yZXBsYWNlKGNocjAsJycpLnJlcGxhY2UoY2hyMSwnIScpO1xuXHRcdGlmKENvZGVQYWdlID09PSAweDRCMCAmJiAobGVuICUgMikpIGJsb2IubCArPSAyO1xuXHR9XG5cdGlmKGJsb2IubCAmIDMpIGJsb2IubCA9IChibG9iLmw+PjIrMSk8PDI7XG5cdHJldHVybiBkaWN0O1xufVxuXG4vKiBbTVMtT0xFUFNdIDIuOSBCTE9CICovXG5mdW5jdGlvbiBwYXJzZV9CTE9CKGJsb2IpIHtcblx0dmFyIHNpemUgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBieXRlcyA9IGJsb2Iuc2xpY2UoYmxvYi5sLGJsb2IubCtzaXplKTtcblx0YmxvYi5sICs9IHNpemU7XG5cdGlmKChzaXplICYgMykgPiAwKSBibG9iLmwgKz0gKDQgLSAoc2l6ZSAmIDMpKSAmIDM7XG5cdHJldHVybiBieXRlcztcbn1cblxuLyogW01TLU9MRVBTXSAyLjExIENsaXBib2FyZERhdGEgKi9cbmZ1bmN0aW9uIHBhcnNlX0NsaXBib2FyZERhdGEoYmxvYikge1xuXHQvLyBUT0RPXG5cdHZhciBvID0ge307XG5cdG8uU2l6ZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0Ly9vLkZvcm1hdCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0YmxvYi5sICs9IG8uU2l6ZSArIDMgLSAoby5TaXplIC0gMSkgJSA0O1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLU9MRVBTXSAyLjE1IFR5cGVkUHJvcGVydHlWYWx1ZSAqL1xuZnVuY3Rpb24gcGFyc2VfVHlwZWRQcm9wZXJ0eVZhbHVlKGJsb2IsIHR5cGUvKjpudW1iZXIqLywgX29wdHMpLyo6YW55Ki8ge1xuXHR2YXIgdCA9IGJsb2IucmVhZF9zaGlmdCgyKSwgcmV0LCBvcHRzID0gX29wdHN8fHt9O1xuXHRibG9iLmwgKz0gMjtcblx0aWYodHlwZSAhPT0gVlRfVkFSSUFOVClcblx0aWYodCAhPT0gdHlwZSAmJiBWVF9DVVNUT00uaW5kZXhPZih0eXBlKT09PS0xICYmICEoKHR5cGUgJiAweEZGRkUpID09IDB4MTAxRSAmJiAodCAmIDB4RkZGRSkgPT0gMHgxMDFFKSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0eXBlICcgKyB0eXBlICsgJyBzYXcgJyArIHQpO1xuXHRzd2l0Y2godHlwZSA9PT0gVlRfVkFSSUFOVCA/IHQgOiB0eXBlKSB7XG5cdFx0Y2FzZSAweDAyIC8qVlRfSTIqLzogcmV0ID0gYmxvYi5yZWFkX3NoaWZ0KDIsICdpJyk7IGlmKCFvcHRzLnJhdykgYmxvYi5sICs9IDI7IHJldHVybiByZXQ7XG5cdFx0Y2FzZSAweDAzIC8qVlRfSTQqLzogcmV0ID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7IHJldHVybiByZXQ7XG5cdFx0Y2FzZSAweDBCIC8qVlRfQk9PTCovOiByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDQpICE9PSAweDA7XG5cdFx0Y2FzZSAweDEzIC8qVlRfVUk0Ki86IHJldCA9IGJsb2IucmVhZF9zaGlmdCg0KTsgcmV0dXJuIHJldDtcblx0XHRjYXNlIDB4MUUgLypWVF9MUFNUUiovOiByZXR1cm4gcGFyc2VfbHBzdHIoYmxvYiwgdCwgNCkucmVwbGFjZShjaHIwLCcnKTtcblx0XHRjYXNlIDB4MUYgLypWVF9MUFdTVFIqLzogcmV0dXJuIHBhcnNlX2xwd3N0cihibG9iKTtcblx0XHRjYXNlIDB4NDAgLypWVF9GSUxFVElNRSovOiByZXR1cm4gcGFyc2VfRklMRVRJTUUoYmxvYik7XG5cdFx0Y2FzZSAweDQxIC8qVlRfQkxPQiovOiByZXR1cm4gcGFyc2VfQkxPQihibG9iKTtcblx0XHRjYXNlIDB4NDcgLypWVF9DRiovOiByZXR1cm4gcGFyc2VfQ2xpcGJvYXJkRGF0YShibG9iKTtcblx0XHRjYXNlIDB4NTAgLypWVF9TVFJJTkcqLzogcmV0dXJuIHBhcnNlX1Z0U3RyaW5nKGJsb2IsIHQsICFvcHRzLnJhdykucmVwbGFjZShjaHIwLCcnKTtcblx0XHRjYXNlIDB4NTEgLypWVF9VU1RSKi86IHJldHVybiBwYXJzZV9WdFVuYWxpZ25lZFN0cmluZyhibG9iLCB0LyosIDQqLykucmVwbGFjZShjaHIwLCcnKTtcblx0XHRjYXNlIDB4MTAwQyAvKlZUX1ZFQ1RPUnxWVF9WQVJJQU5UKi86IHJldHVybiBwYXJzZV9WdFZlY0hlYWRpbmdQYWlyVmFsdWUoYmxvYik7XG5cdFx0Y2FzZSAweDEwMUUgLypWVF9WRUNUT1J8VlRfTFBTVFIqLzpcblx0XHRjYXNlIDB4MTAxRiAvKlZUX1ZFQ1RPUnxWVF9MUFdTVFIqLzpcblx0XHRcdHJldHVybiB0ID09IDB4MTAxRiA/IHBhcnNlX1Z0VmVjTHB3c3RyVmFsdWUoYmxvYikgOiBwYXJzZV9WdFZlY1VuYWxpZ25lZExwc3RyVmFsdWUoYmxvYik7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVHlwZWRQcm9wZXJ0eVZhbHVlIHVucmVjb2duaXplZCB0eXBlIFwiICsgdHlwZSArIFwiIFwiICsgdCk7XG5cdH1cbn1cbmZ1bmN0aW9uIHdyaXRlX1R5cGVkUHJvcGVydHlWYWx1ZSh0eXBlLyo6bnVtYmVyKi8sIHZhbHVlKSB7XG5cdHZhciBvID0gbmV3X2J1Zig0KSwgcCA9IG5ld19idWYoNCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgdHlwZSA9PSAweDUwID8gMHgxRiA6IHR5cGUpO1xuXHRzd2l0Y2godHlwZSkge1xuXHRcdGNhc2UgMHgwMyAvKlZUX0k0Ki86IHAud3JpdGVfc2hpZnQoLTQsIHZhbHVlKTsgYnJlYWs7XG5cdFx0Y2FzZSAweDA1IC8qVlRfSTQqLzogcCA9IG5ld19idWYoOCk7IHAud3JpdGVfc2hpZnQoOCwgdmFsdWUsICdmJyk7IGJyZWFrO1xuXHRcdGNhc2UgMHgwQiAvKlZUX0JPT0wqLzogcC53cml0ZV9zaGlmdCg0LCB2YWx1ZSA/IDB4MDEgOiAweDAwKTsgYnJlYWs7XG5cdFx0Y2FzZSAweDQwIC8qVlRfRklMRVRJTUUqLzogLyo6OiBpZih0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB0aHJvdyBcInVucmVhY2hhYmxlXCI7ICovIHAgPSB3cml0ZV9GSUxFVElNRSh2YWx1ZSk7IGJyZWFrO1xuXHRcdGNhc2UgMHgxRiAvKlZUX0xQV1NUUiovOlxuXHRcdGNhc2UgMHg1MCAvKlZUX1NUUklORyovOlxuXHRcdFx0Lyo6OiBpZih0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHRocm93IFwidW5yZWFjaGFibGVcIjsgKi9cblx0XHRcdHAgPSBuZXdfYnVmKDQgKyAyICogKHZhbHVlLmxlbmd0aCArIDEpICsgKHZhbHVlLmxlbmd0aCAlIDIgPyAwIDogMikpO1xuXHRcdFx0cC53cml0ZV9zaGlmdCg0LCB2YWx1ZS5sZW5ndGggKyAxKTtcblx0XHRcdHAud3JpdGVfc2hpZnQoMCwgdmFsdWUsIFwiZGJjc1wiKTtcblx0XHRcdHdoaWxlKHAubCAhPSBwLmxlbmd0aCkgcC53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlR5cGVkUHJvcGVydHlWYWx1ZSB1bnJlY29nbml6ZWQgdHlwZSBcIiArIHR5cGUgKyBcIiBcIiArIHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gYmNvbmNhdChbbywgcF0pO1xufVxuXG4vKiBbTVMtT0xFUFNdIDIuMjAgUHJvcGVydHlTZXQgKi9cbmZ1bmN0aW9uIHBhcnNlX1Byb3BlcnR5U2V0KGJsb2IsIFBJRFNJKSB7XG5cdHZhciBzdGFydF9hZGRyID0gYmxvYi5sO1xuXHR2YXIgc2l6ZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIE51bVByb3BzID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgUHJvcHMgPSBbXSwgaSA9IDA7XG5cdHZhciBDb2RlUGFnZSA9IDA7XG5cdHZhciBEaWN0aW9uYXJ5ID0gLTEsIERpY3RPYmovKjp7W251bWJlcl06c3RyaW5nfSovID0gKHt9Lyo6YW55Ki8pO1xuXHRmb3IoaSA9IDA7IGkgIT0gTnVtUHJvcHM7ICsraSkge1xuXHRcdHZhciBQcm9wSUQgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0dmFyIE9mZnNldCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHRQcm9wc1tpXSA9IFtQcm9wSUQsIE9mZnNldCArIHN0YXJ0X2FkZHJdO1xuXHR9XG5cdFByb3BzLnNvcnQoZnVuY3Rpb24oeCx5KSB7IHJldHVybiB4WzFdIC0geVsxXTsgfSk7XG5cdHZhciBQcm9wSCA9IHt9O1xuXHRmb3IoaSA9IDA7IGkgIT0gTnVtUHJvcHM7ICsraSkge1xuXHRcdGlmKGJsb2IubCAhPT0gUHJvcHNbaV1bMV0pIHtcblx0XHRcdHZhciBmYWlsID0gdHJ1ZTtcblx0XHRcdGlmKGk+MCAmJiBQSURTSSkgc3dpdGNoKFBJRFNJW1Byb3BzW2ktMV1bMF1dLnQpIHtcblx0XHRcdFx0Y2FzZSAweDAyIC8qVlRfSTIqLzogaWYoYmxvYi5sKzIgPT09IFByb3BzW2ldWzFdKSB7IGJsb2IubCs9MjsgZmFpbCA9IGZhbHNlOyB9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4NTAgLypWVF9TVFJJTkcqLzogaWYoYmxvYi5sIDw9IFByb3BzW2ldWzFdKSB7IGJsb2IubD1Qcm9wc1tpXVsxXTsgZmFpbCA9IGZhbHNlOyB9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MTAwQyAvKlZUX1ZFQ1RPUnxWVF9WQVJJQU5UKi86IGlmKGJsb2IubCA8PSBQcm9wc1tpXVsxXSkgeyBibG9iLmw9UHJvcHNbaV1bMV07IGZhaWwgPSBmYWxzZTsgfSBicmVhaztcblx0XHRcdH1cblx0XHRcdGlmKCghUElEU0l8fGk9PTApICYmIGJsb2IubCA8PSBQcm9wc1tpXVsxXSkgeyBmYWlsPWZhbHNlOyBibG9iLmwgPSBQcm9wc1tpXVsxXTsgfVxuXHRcdFx0aWYoZmFpbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhZCBFcnJvcjogRXhwZWN0ZWQgYWRkcmVzcyBcIiArIFByb3BzW2ldWzFdICsgJyBhdCAnICsgYmxvYi5sICsgJyA6JyArIGkpO1xuXHRcdH1cblx0XHRpZihQSURTSSkge1xuXHRcdFx0dmFyIHBpZGRzaSA9IFBJRFNJW1Byb3BzW2ldWzBdXTtcblx0XHRcdFByb3BIW3BpZGRzaS5uXSA9IHBhcnNlX1R5cGVkUHJvcGVydHlWYWx1ZShibG9iLCBwaWRkc2kudCwge3Jhdzp0cnVlfSk7XG5cdFx0XHRpZihwaWRkc2kucCA9PT0gJ3ZlcnNpb24nKSBQcm9wSFtwaWRkc2kubl0gPSBTdHJpbmcoUHJvcEhbcGlkZHNpLm5dID4+IDE2KSArIFwiLlwiICsgKFwiMDAwMFwiICsgU3RyaW5nKFByb3BIW3BpZGRzaS5uXSAmIDB4RkZGRikpLnNsaWNlKC00KTtcblx0XHRcdGlmKHBpZGRzaS5uID09IFwiQ29kZVBhZ2VcIikgc3dpdGNoKFByb3BIW3BpZGRzaS5uXSkge1xuXHRcdFx0XHRjYXNlIDA6IFByb3BIW3BpZGRzaS5uXSA9IDEyNTI7XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlIDg3NDpcblx0XHRcdFx0Y2FzZSA5MzI6XG5cdFx0XHRcdGNhc2UgOTM2OlxuXHRcdFx0XHRjYXNlIDk0OTpcblx0XHRcdFx0Y2FzZSA5NTA6XG5cdFx0XHRcdGNhc2UgMTI1MDpcblx0XHRcdFx0Y2FzZSAxMjUxOlxuXHRcdFx0XHRjYXNlIDEyNTM6XG5cdFx0XHRcdGNhc2UgMTI1NDpcblx0XHRcdFx0Y2FzZSAxMjU1OlxuXHRcdFx0XHRjYXNlIDEyNTY6XG5cdFx0XHRcdGNhc2UgMTI1Nzpcblx0XHRcdFx0Y2FzZSAxMjU4OlxuXHRcdFx0XHRjYXNlIDEwMDAwOlxuXHRcdFx0XHRjYXNlIDEyMDA6XG5cdFx0XHRcdGNhc2UgMTIwMTpcblx0XHRcdFx0Y2FzZSAxMjUyOlxuXHRcdFx0XHRjYXNlIDY1MDAwOiBjYXNlIC01MzY6XG5cdFx0XHRcdGNhc2UgNjUwMDE6IGNhc2UgLTUzNTpcblx0XHRcdFx0XHRzZXRfY3AoQ29kZVBhZ2UgPSAoUHJvcEhbcGlkZHNpLm5dPj4+MCkgJiAweEZGRkYpOyBicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgQ29kZVBhZ2U6IFwiICsgUHJvcEhbcGlkZHNpLm5dKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYoUHJvcHNbaV1bMF0gPT09IDB4MSkge1xuXHRcdFx0XHRDb2RlUGFnZSA9IFByb3BILkNvZGVQYWdlID0gKHBhcnNlX1R5cGVkUHJvcGVydHlWYWx1ZShibG9iLCBWVF9JMikvKjpudW1iZXIqLyk7XG5cdFx0XHRcdHNldF9jcChDb2RlUGFnZSk7XG5cdFx0XHRcdGlmKERpY3Rpb25hcnkgIT09IC0xKSB7XG5cdFx0XHRcdFx0dmFyIG9sZHBvcyA9IGJsb2IubDtcblx0XHRcdFx0XHRibG9iLmwgPSBQcm9wc1tEaWN0aW9uYXJ5XVsxXTtcblx0XHRcdFx0XHREaWN0T2JqID0gcGFyc2VfZGljdGlvbmFyeShibG9iLENvZGVQYWdlKTtcblx0XHRcdFx0XHRibG9iLmwgPSBvbGRwb3M7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZihQcm9wc1tpXVswXSA9PT0gMCkge1xuXHRcdFx0XHRpZihDb2RlUGFnZSA9PT0gMCkgeyBEaWN0aW9uYXJ5ID0gaTsgYmxvYi5sID0gUHJvcHNbaSsxXVsxXTsgY29udGludWU7IH1cblx0XHRcdFx0RGljdE9iaiA9IHBhcnNlX2RpY3Rpb25hcnkoYmxvYixDb2RlUGFnZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgbmFtZSA9IERpY3RPYmpbUHJvcHNbaV1bMF1dO1xuXHRcdFx0XHR2YXIgdmFsO1xuXHRcdFx0XHQvKiBbTVMtT1NIQVJFRF0gMi4zLjMuMi4zLjEuMiArIFBST1BWQVJJQU5UICovXG5cdFx0XHRcdHN3aXRjaChibG9iW2Jsb2IubF0pIHtcblx0XHRcdFx0XHRjYXNlIDB4NDEgLypWVF9CTE9CKi86IGJsb2IubCArPSA0OyB2YWwgPSBwYXJzZV9CTE9CKGJsb2IpOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIDB4MUUgLypWVF9MUFNUUiovOiBibG9iLmwgKz0gNDsgdmFsID0gcGFyc2VfVnRTdHJpbmcoYmxvYiwgYmxvYltibG9iLmwtNF0pLnJlcGxhY2UoL1xcdTAwMDArJC8sXCJcIik7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgMHgxRiAvKlZUX0xQV1NUUiovOiBibG9iLmwgKz0gNDsgdmFsID0gcGFyc2VfVnRTdHJpbmcoYmxvYiwgYmxvYltibG9iLmwtNF0pLnJlcGxhY2UoL1xcdTAwMDArJC8sXCJcIik7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgMHgwMyAvKlZUX0k0Ki86IGJsb2IubCArPSA0OyB2YWwgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAweDEzIC8qVlRfVUk0Ki86IGJsb2IubCArPSA0OyB2YWwgPSBibG9iLnJlYWRfc2hpZnQoNCk7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgMHgwNSAvKlZUX1I4Ki86IGJsb2IubCArPSA0OyB2YWwgPSBibG9iLnJlYWRfc2hpZnQoOCwgJ2YnKTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAweDBCIC8qVlRfQk9PTCovOiBibG9iLmwgKz0gNDsgdmFsID0gcGFyc2Vib29sKGJsb2IsIDQpOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIDB4NDAgLypWVF9GSUxFVElNRSovOiBibG9iLmwgKz0gNDsgdmFsID0gcGFyc2VEYXRlKHBhcnNlX0ZJTEVUSU1FKGJsb2IpKTsgYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwidW5wYXJzZWQgdmFsdWU6IFwiICsgYmxvYltibG9iLmxdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRQcm9wSFtuYW1lXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0YmxvYi5sID0gc3RhcnRfYWRkciArIHNpemU7IC8qIHN0ZXAgYWhlYWQgdG8gc2tpcCBwYWRkaW5nICovXG5cdHJldHVybiBQcm9wSDtcbn1cbnZhciBYTFNQU1NraXAgPSBbIFwiQ29kZVBhZ2VcIiwgXCJUaHVtYm5haWxcIiwgXCJfUElEX0xJTktCQVNFXCIsIFwiX1BJRF9ITElOS1NcIiwgXCJTeXN0ZW1JZGVudGlmaWVyXCIsIFwiRk1USURcIiBdOyAvLy5jb25jYXQoUHNldWRvUHJvcHNQYWlycyk7XG5mdW5jdGlvbiBndWVzc19wcm9wZXJ0eV90eXBlKHZhbC8qOmFueSovKS8qOm51bWJlciovIHtcblx0c3dpdGNoKHR5cGVvZiB2YWwpIHtcblx0XHRjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMHgwQjtcblx0XHRjYXNlIFwibnVtYmVyXCI6IHJldHVybiAoKHZhbHwwKT09dmFsKSA/IDB4MDMgOiAweDA1O1xuXHRcdGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDB4MUY7XG5cdFx0Y2FzZSBcIm9iamVjdFwiOiBpZih2YWwgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gMHg0MDsgYnJlYWs7XG5cdH1cblx0cmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gd3JpdGVfUHJvcGVydHlTZXQoZW50cmllcywgUkUsIFBJRFNJKSB7XG5cdHZhciBoZHIgPSBuZXdfYnVmKDgpLCBwaWFvID0gW10sIHByb3AgPSBbXTtcblx0dmFyIHN6ID0gOCwgaSA9IDA7XG5cblx0dmFyIHByID0gbmV3X2J1Zig4KSwgcGlvID0gbmV3X2J1Zig4KTtcblx0cHIud3JpdGVfc2hpZnQoNCwgMHgwMDAyKTtcblx0cHIud3JpdGVfc2hpZnQoNCwgMHgwNEIwKTtcblx0cGlvLndyaXRlX3NoaWZ0KDQsIDB4MDAwMSk7XG5cdHByb3AucHVzaChwcik7IHBpYW8ucHVzaChwaW8pO1xuXHRzeiArPSA4ICsgcHIubGVuZ3RoO1xuXG5cdGlmKCFSRSkge1xuXHRcdHBpbyA9IG5ld19idWYoOCk7XG5cdFx0cGlvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdHBpYW8udW5zaGlmdChwaW8pO1xuXG5cdFx0dmFyIGJ1ZnMgPSBbbmV3X2J1Zig0KV07XG5cdFx0YnVmc1swXS53cml0ZV9zaGlmdCg0LCBlbnRyaWVzLmxlbmd0aCk7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0dmFyIHZhbHVlID0gZW50cmllc1tpXVswXTtcblx0XHRcdHByID0gbmV3X2J1Zig0ICsgNCArIDIgKiAodmFsdWUubGVuZ3RoICsgMSkgKyAodmFsdWUubGVuZ3RoICUgMiA/IDAgOiAyKSk7XG5cdFx0XHRwci53cml0ZV9zaGlmdCg0LCBpKzIpO1xuXHRcdFx0cHIud3JpdGVfc2hpZnQoNCwgdmFsdWUubGVuZ3RoICsgMSk7XG5cdFx0XHRwci53cml0ZV9zaGlmdCgwLCB2YWx1ZSwgXCJkYmNzXCIpO1xuXHRcdFx0d2hpbGUocHIubCAhPSBwci5sZW5ndGgpIHByLndyaXRlX3NoaWZ0KDEsIDApO1xuXHRcdFx0YnVmcy5wdXNoKHByKTtcblx0XHR9XG5cdFx0cHIgPSBiY29uY2F0KGJ1ZnMpO1xuXHRcdHByb3AudW5zaGlmdChwcik7XG5cdFx0c3ogKz0gOCArIHByLmxlbmd0aDtcblx0fVxuXG5cdGZvcihpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHtcblx0XHRpZihSRSAmJiAhUkVbZW50cmllc1tpXVswXV0pIGNvbnRpbnVlO1xuXHRcdGlmKFhMU1BTU2tpcC5pbmRleE9mKGVudHJpZXNbaV1bMF0pID4gLTEgfHwgUHNldWRvUHJvcHNQYWlycy5pbmRleE9mKGVudHJpZXNbaV1bMF0pID4gLTEpIGNvbnRpbnVlO1xuXHRcdGlmKGVudHJpZXNbaV1bMV0gPT0gbnVsbCkgY29udGludWU7XG5cblx0XHR2YXIgdmFsID0gZW50cmllc1tpXVsxXSwgaWR4ID0gMDtcblx0XHRpZihSRSkge1xuXHRcdFx0aWR4ID0gK1JFW2VudHJpZXNbaV1bMF1dO1xuXHRcdFx0dmFyIHBpbmZvID0gKFBJRFNJLyo6OiB8fCB7fSovKVtpZHhdLyo6OiB8fCB7fSAqLztcblx0XHRcdGlmKHBpbmZvLnAgPT0gXCJ2ZXJzaW9uXCIgJiYgdHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdC8qOjogaWYodHlwZW9mIHZhbCAhPT0gXCJzdHJpbmdcIikgdGhyb3cgXCJ1bnJlYWNoYWJsZVwiOyAqL1xuXHRcdFx0XHR2YXIgYXJyID0gdmFsLnNwbGl0KFwiLlwiKTtcblx0XHRcdFx0dmFsID0gKCgrYXJyWzBdKTw8MTYpICsgKCgrYXJyWzFdKXx8MCk7XG5cdFx0XHR9XG5cdFx0XHRwciA9IHdyaXRlX1R5cGVkUHJvcGVydHlWYWx1ZShwaW5mby50LCB2YWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgVCA9IGd1ZXNzX3Byb3BlcnR5X3R5cGUodmFsKTtcblx0XHRcdGlmKFQgPT0gLTEpIHsgVCA9IDB4MUY7IHZhbCA9IFN0cmluZyh2YWwpOyB9XG5cdFx0XHRwciA9IHdyaXRlX1R5cGVkUHJvcGVydHlWYWx1ZShULCB2YWwpO1xuXHRcdH1cblx0XHRwcm9wLnB1c2gocHIpO1xuXG5cdFx0cGlvID0gbmV3X2J1Zig4KTtcblx0XHRwaW8ud3JpdGVfc2hpZnQoNCwgIVJFID8gMitpIDogaWR4KTtcblx0XHRwaWFvLnB1c2gocGlvKTtcblxuXHRcdHN6ICs9IDggKyBwci5sZW5ndGg7XG5cdH1cblxuXHR2YXIgdyA9IDggKiAocHJvcC5sZW5ndGggKyAxKTtcblx0Zm9yKGkgPSAwOyBpIDwgcHJvcC5sZW5ndGg7ICsraSkgeyBwaWFvW2ldLndyaXRlX3NoaWZ0KDQsIHcpOyB3ICs9IHByb3BbaV0ubGVuZ3RoOyB9XG5cdGhkci53cml0ZV9zaGlmdCg0LCBzeik7XG5cdGhkci53cml0ZV9zaGlmdCg0LCBwcm9wLmxlbmd0aCk7XG5cdHJldHVybiBiY29uY2F0KFtoZHJdLmNvbmNhdChwaWFvKS5jb25jYXQocHJvcCkpO1xufVxuXG4vKiBbTVMtT0xFUFNdIDIuMjEgUHJvcGVydHlTZXRTdHJlYW0gKi9cbmZ1bmN0aW9uIHBhcnNlX1Byb3BlcnR5U2V0U3RyZWFtKGZpbGUsIFBJRFNJLCBjbHNpZCkge1xuXHR2YXIgYmxvYiA9IGZpbGUuY29udGVudDtcblx0aWYoIWJsb2IpIHJldHVybiAoe30vKjphbnkqLyk7XG5cdHByZXBfYmxvYihibG9iLCAwKTtcblxuXHR2YXIgTnVtU2V0cywgRk1USUQwLCBGTVRJRDEsIE9mZnNldDAsIE9mZnNldDEgPSAwO1xuXHRibG9iLmNoaygnZmVmZicsICdCeXRlIE9yZGVyOiAnKTtcblxuXHQvKnZhciB2ZXJzID0gKi9ibG9iLnJlYWRfc2hpZnQoMik7IC8vIFRPRE86IGNoZWNrIHZlcnNpb25cblx0dmFyIFN5c3RlbUlkZW50aWZpZXIgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBDTFNJRCA9IGJsb2IucmVhZF9zaGlmdCgxNik7XG5cdGlmKENMU0lEICE9PSBDRkIudXRpbHMuY29uc3RzLkhFQURFUl9DTFNJRCAmJiBDTFNJRCAhPT0gY2xzaWQpIHRocm93IG5ldyBFcnJvcihcIkJhZCBQcm9wZXJ0eVNldCBDTFNJRCBcIiArIENMU0lEKTtcblx0TnVtU2V0cyA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0aWYoTnVtU2V0cyAhPT0gMSAmJiBOdW1TZXRzICE9PSAyKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgI1NldHM6IFwiICsgTnVtU2V0cyk7XG5cdEZNVElEMCA9IGJsb2IucmVhZF9zaGlmdCgxNik7IE9mZnNldDAgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cblx0aWYoTnVtU2V0cyA9PT0gMSAmJiBPZmZzZXQwICE9PSBibG9iLmwpIHRocm93IG5ldyBFcnJvcihcIkxlbmd0aCBtaXNtYXRjaDogXCIgKyBPZmZzZXQwICsgXCIgIT09IFwiICsgYmxvYi5sKTtcblx0ZWxzZSBpZihOdW1TZXRzID09PSAyKSB7IEZNVElEMSA9IGJsb2IucmVhZF9zaGlmdCgxNik7IE9mZnNldDEgPSBibG9iLnJlYWRfc2hpZnQoNCk7IH1cblx0dmFyIFBTZXQwID0gcGFyc2VfUHJvcGVydHlTZXQoYmxvYiwgUElEU0kpO1xuXG5cdHZhciBydmFsID0gKHsgU3lzdGVtSWRlbnRpZmllcjogU3lzdGVtSWRlbnRpZmllciB9Lyo6YW55Ki8pO1xuXHRmb3IodmFyIHkgaW4gUFNldDApIHJ2YWxbeV0gPSBQU2V0MFt5XTtcblx0Ly9ydmFsLmJsb2IgPSBibG9iO1xuXHRydmFsLkZNVElEID0gRk1USUQwO1xuXHQvL3J2YWwuUFNldDAgPSBQU2V0MDtcblx0aWYoTnVtU2V0cyA9PT0gMSkgcmV0dXJuIHJ2YWw7XG5cdGlmKE9mZnNldDEgLSBibG9iLmwgPT0gMikgYmxvYi5sICs9IDI7XG5cdGlmKGJsb2IubCAhPT0gT2Zmc2V0MSkgdGhyb3cgbmV3IEVycm9yKFwiTGVuZ3RoIG1pc21hdGNoIDI6IFwiICsgYmxvYi5sICsgXCIgIT09IFwiICsgT2Zmc2V0MSk7XG5cdHZhciBQU2V0MTtcblx0dHJ5IHsgUFNldDEgPSBwYXJzZV9Qcm9wZXJ0eVNldChibG9iLCBudWxsKTsgfSBjYXRjaChlKSB7LyogZW1wdHkgKi99XG5cdGZvcih5IGluIFBTZXQxKSBydmFsW3ldID0gUFNldDFbeV07XG5cdHJ2YWwuRk1USUQgPSBbRk1USUQwLCBGTVRJRDFdOyAvLyBUT0RPOiB2ZXJpZnkgRk1USUQwLzFcblx0cmV0dXJuIHJ2YWw7XG59XG5mdW5jdGlvbiB3cml0ZV9Qcm9wZXJ0eVNldFN0cmVhbShlbnRyaWVzLCBjbHNpZCwgUkUsIFBJRFNJLyo6e1trZXk6c3RyaW5nfG51bWJlcl06YW55fSovLCBlbnRyaWVzMi8qOj9hbnkqLywgY2xzaWQyLyo6P2FueSovKSB7XG5cdHZhciBoZHIgPSBuZXdfYnVmKGVudHJpZXMyID8gNjggOiA0OCk7XG5cdHZhciBidWZzID0gW2hkcl07XG5cdGhkci53cml0ZV9zaGlmdCgyLCAweEZGRkUpO1xuXHRoZHIud3JpdGVfc2hpZnQoMiwgMHgwMDAwKTsgLyogVE9ETzogdHlwZSAxIHByb3BzICovXG5cdGhkci53cml0ZV9zaGlmdCg0LCAweDMyMzYzMjM3KTtcblx0aGRyLndyaXRlX3NoaWZ0KDE2LCBDRkIudXRpbHMuY29uc3RzLkhFQURFUl9DTFNJRCwgXCJoZXhcIik7XG5cdGhkci53cml0ZV9zaGlmdCg0LCAoZW50cmllczIgPyAyIDogMSkpO1xuXHRoZHIud3JpdGVfc2hpZnQoMTYsIGNsc2lkLCBcImhleFwiKTtcblx0aGRyLndyaXRlX3NoaWZ0KDQsIChlbnRyaWVzMiA/IDY4IDogNDgpKTtcblx0dmFyIHBzMCA9IHdyaXRlX1Byb3BlcnR5U2V0KGVudHJpZXMsIFJFLCBQSURTSSk7XG5cdGJ1ZnMucHVzaChwczApO1xuXG5cdGlmKGVudHJpZXMyKSB7XG5cdFx0dmFyIHBzMSA9IHdyaXRlX1Byb3BlcnR5U2V0KGVudHJpZXMyLCBudWxsLCBudWxsKTtcblx0XHRoZHIud3JpdGVfc2hpZnQoMTYsIGNsc2lkMiwgXCJoZXhcIik7XG5cdFx0aGRyLndyaXRlX3NoaWZ0KDQsIDY4ICsgcHMwLmxlbmd0aCk7XG5cdFx0YnVmcy5wdXNoKHBzMSk7XG5cdH1cblx0cmV0dXJuIGJjb25jYXQoYnVmcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlbm9vcDIoYmxvYiwgbGVuZ3RoKSB7IGJsb2IucmVhZF9zaGlmdChsZW5ndGgpOyByZXR1cm4gbnVsbDsgfVxuZnVuY3Rpb24gd3JpdGV6ZXJvZXMobiwgbykgeyBpZighbykgbz1uZXdfYnVmKG4pOyBmb3IodmFyIGo9MDsgajxuOyArK2opIG8ud3JpdGVfc2hpZnQoMSwgMCk7IHJldHVybiBvOyB9XG5cbmZ1bmN0aW9uIHBhcnNsdXJwKGJsb2IsIGxlbmd0aCwgY2IpIHtcblx0dmFyIGFyciA9IFtdLCB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHdoaWxlKGJsb2IubCA8IHRhcmdldCkgYXJyLnB1c2goY2IoYmxvYiwgdGFyZ2V0IC0gYmxvYi5sKSk7XG5cdGlmKHRhcmdldCAhPT0gYmxvYi5sKSB0aHJvdyBuZXcgRXJyb3IoXCJTbHVycCBlcnJvclwiKTtcblx0cmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gcGFyc2Vib29sKGJsb2IsIGxlbmd0aC8qOm51bWJlciovKSB7IHJldHVybiBibG9iLnJlYWRfc2hpZnQobGVuZ3RoKSA9PT0gMHgxOyB9XG5mdW5jdGlvbiB3cml0ZWJvb2wodi8qOmFueSovLCBvKSB7IGlmKCFvKSBvPW5ld19idWYoMik7IG8ud3JpdGVfc2hpZnQoMiwgKyEhdik7IHJldHVybiBvOyB9XG5cbmZ1bmN0aW9uIHBhcnNldWludDE2KGJsb2IvKjo6LCBsZW5ndGg6P251bWJlciwgb3B0czo/YW55Ki8pIHsgcmV0dXJuIGJsb2IucmVhZF9zaGlmdCgyLCAndScpOyB9XG5mdW5jdGlvbiB3cml0ZXVpbnQxNih2Lyo6bnVtYmVyKi8sIG8pIHsgaWYoIW8pIG89bmV3X2J1ZigyKTsgby53cml0ZV9zaGlmdCgyLCB2KTsgcmV0dXJuIG87IH1cbmZ1bmN0aW9uIHBhcnNldWludDE2YShibG9iLCBsZW5ndGgvKjo6IDo/bnVtYmVyLCBvcHRzOj9hbnkqLykgeyByZXR1cm4gcGFyc2x1cnAoYmxvYixsZW5ndGgscGFyc2V1aW50MTYpO31cblxuLyogLS0tIDIuNSBTdHJ1Y3R1cmVzIC0tLSAqL1xuXG4vKiBbTVMtWExTXSAyLjUuMTAgQmVzIChib29sZWFuIG9yIGVycm9yKSAqL1xuZnVuY3Rpb24gcGFyc2VfQmVzKGJsb2IvKjo6LCBsZW5ndGgqLykge1xuXHR2YXIgdiA9IGJsb2IucmVhZF9zaGlmdCgxKSwgdCA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0cmV0dXJuIHQgPT09IDB4MDEgPyB2IDogdiA9PT0gMHgwMTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0Jlcyh2LCB0Lyo6c3RyaW5nKi8sIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDIpO1xuXHRvLndyaXRlX3NoaWZ0KDEsICgodCA9PSAnZScpID8gK3YgOiArISF2KSk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgKCh0ID09ICdlJykgPyAxIDogMCkpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi41LjI0MCBTaG9ydFhMVW5pY29kZVN0cmluZyAqL1xuZnVuY3Rpb24gcGFyc2VfU2hvcnRYTFVuaWNvZGVTdHJpbmcoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBjY2ggPSBibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPj0gMTIgPyAyIDogMSk7XG5cdHZhciBlbmNvZGluZyA9ICdzYmNzLWNvbnQnO1xuXHR2YXIgY3AgPSBjdXJyZW50X2NvZGVwYWdlO1xuXHRpZihvcHRzICYmIG9wdHMuYmlmZiA+PSA4KSBjdXJyZW50X2NvZGVwYWdlID0gMTIwMDtcblx0aWYoIW9wdHMgfHwgb3B0cy5iaWZmID09IDggKSB7XG5cdFx0dmFyIGZIaWdoQnl0ZSA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0XHRpZihmSGlnaEJ5dGUpIHsgZW5jb2RpbmcgPSAnZGJjcy1jb250JzsgfVxuXHR9IGVsc2UgaWYob3B0cy5iaWZmID09IDEyKSB7XG5cdFx0ZW5jb2RpbmcgPSAnd3N0cic7XG5cdH1cblx0aWYob3B0cy5iaWZmID49IDIgJiYgb3B0cy5iaWZmIDw9IDUpIGVuY29kaW5nID0gJ2Nwc3RyJztcblx0dmFyIG8gPSBjY2ggPyBibG9iLnJlYWRfc2hpZnQoY2NoLCBlbmNvZGluZykgOiBcIlwiO1xuXHRjdXJyZW50X2NvZGVwYWdlID0gY3A7XG5cdHJldHVybiBvO1xufVxuXG4vKiAyLjUuMjkzIFhMVW5pY29kZVJpY2hFeHRlbmRlZFN0cmluZyAqL1xuZnVuY3Rpb24gcGFyc2VfWExVbmljb2RlUmljaEV4dGVuZGVkU3RyaW5nKGJsb2IpIHtcblx0dmFyIGNwID0gY3VycmVudF9jb2RlcGFnZTtcblx0Y3VycmVudF9jb2RlcGFnZSA9IDEyMDA7XG5cdHZhciBjY2ggPSBibG9iLnJlYWRfc2hpZnQoMiksIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHR2YXIgLypmSGlnaEJ5dGUgPSBmbGFncyAmIDB4MSwqLyBmRXh0U3QgPSBmbGFncyAmIDB4NCwgZlJpY2hTdCA9IGZsYWdzICYgMHg4O1xuXHR2YXIgd2lkdGggPSAxICsgKGZsYWdzICYgMHgxKTsgLy8gMHgwIC0+IHV0ZjgsIDB4MSAtPiBkYmNzXG5cdHZhciBjUnVuID0gMCwgY2JFeHRSc3Q7XG5cdHZhciB6ID0ge307XG5cdGlmKGZSaWNoU3QpIGNSdW4gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGlmKGZFeHRTdCkgY2JFeHRSc3QgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBlbmNvZGluZyA9IHdpZHRoID09IDIgPyAnZGJjcy1jb250JyA6ICdzYmNzLWNvbnQnO1xuXHR2YXIgbXNnID0gY2NoID09PSAwID8gXCJcIiA6IGJsb2IucmVhZF9zaGlmdChjY2gsIGVuY29kaW5nKTtcblx0aWYoZlJpY2hTdCkgYmxvYi5sICs9IDQgKiBjUnVuOyAvL1RPRE86IHBhcnNlIHRoaXNcblx0aWYoZkV4dFN0KSBibG9iLmwgKz0gY2JFeHRSc3Q7IC8vVE9ETzogcGFyc2UgdGhpc1xuXHR6LnQgPSBtc2c7XG5cdGlmKCFmUmljaFN0KSB7IHoucmF3ID0gXCI8dD5cIiArIHoudCArIFwiPC90PlwiOyB6LnIgPSB6LnQ7IH1cblx0Y3VycmVudF9jb2RlcGFnZSA9IGNwO1xuXHRyZXR1cm4gejtcbn1cbmZ1bmN0aW9uIHdyaXRlX1hMVW5pY29kZVJpY2hFeHRlbmRlZFN0cmluZyh4bHN0ci8qOjogOlhMU3RyaW5nLCBvcHRzKi8pIHtcblx0dmFyIHN0ciA9ICh4bHN0ci50fHxcIlwiKSwgbmZtdHMgPSAxO1xuXG5cdHZhciBoZHIgPSBuZXdfYnVmKDMgKyAobmZtdHMgPiAxID8gMiA6IDApKTtcblx0aGRyLndyaXRlX3NoaWZ0KDIsIHN0ci5sZW5ndGgpO1xuXHRoZHIud3JpdGVfc2hpZnQoMSwgKG5mbXRzID4gMSA/IDB4MDggOiAweDAwKSB8IDB4MDEpO1xuXHRpZihuZm10cyA+IDEpIGhkci53cml0ZV9zaGlmdCgyLCBuZm10cyk7XG5cblx0dmFyIG90ZXh0ID0gbmV3X2J1ZigyICogc3RyLmxlbmd0aCk7XG5cdG90ZXh0LndyaXRlX3NoaWZ0KDIgKiBzdHIubGVuZ3RoLCBzdHIsICd1dGYxNmxlJyk7XG5cblx0dmFyIG91dCA9IFtoZHIsIG90ZXh0XTtcblxuXHRyZXR1cm4gYmNvbmNhdChvdXQpO1xufVxuXG4vKiAyLjUuMjk2IFhMVW5pY29kZVN0cmluZ05vQ2NoICovXG5mdW5jdGlvbiBwYXJzZV9YTFVuaWNvZGVTdHJpbmdOb0NjaChibG9iLCBjY2gsIG9wdHMpIHtcblx0dmFyIHJldHZhbDtcblx0aWYob3B0cykge1xuXHRcdGlmKG9wdHMuYmlmZiA+PSAyICYmIG9wdHMuYmlmZiA8PSA1KSByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KGNjaCwgJ2Nwc3RyJyk7XG5cdFx0aWYob3B0cy5iaWZmID49IDEyKSByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KGNjaCwgJ2RiY3MtY29udCcpO1xuXHR9XG5cdHZhciBmSGlnaEJ5dGUgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdGlmKGZIaWdoQnl0ZT09PTApIHsgcmV0dmFsID0gYmxvYi5yZWFkX3NoaWZ0KGNjaCwgJ3NiY3MtY29udCcpOyB9XG5cdGVsc2UgeyByZXR2YWwgPSBibG9iLnJlYWRfc2hpZnQoY2NoLCAnZGJjcy1jb250Jyk7IH1cblx0cmV0dXJuIHJldHZhbDtcbn1cblxuLyogMi41LjI5NCBYTFVuaWNvZGVTdHJpbmcgKi9cbmZ1bmN0aW9uIHBhcnNlX1hMVW5pY29kZVN0cmluZyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGNjaCA9IGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMSA6IDIpO1xuXHRpZihjY2ggPT09IDApIHsgYmxvYi5sKys7IHJldHVybiBcIlwiOyB9XG5cdHJldHVybiBwYXJzZV9YTFVuaWNvZGVTdHJpbmdOb0NjaChibG9iLCBjY2gsIG9wdHMpO1xufVxuLyogQklGRjUgb3ZlcnJpZGUgKi9cbmZ1bmN0aW9uIHBhcnNlX1hMVW5pY29kZVN0cmluZzIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGlmKG9wdHMuYmlmZiA+IDUpIHJldHVybiBwYXJzZV9YTFVuaWNvZGVTdHJpbmcoYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0dmFyIGNjaCA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0aWYoY2NoID09PSAwKSB7IGJsb2IubCsrOyByZXR1cm4gXCJcIjsgfVxuXHRyZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KGNjaCwgKG9wdHMuYmlmZiA8PSA0IHx8ICFibG9iLmxlbnMgKSA/ICdjcHN0cicgOiAnc2Jjcy1jb250Jyk7XG59XG4vKiBUT0RPOiBCSUZGNSBhbmQgbG93ZXIsIGNvZGVwYWdlIGF3YXJlbmVzcyAqL1xuZnVuY3Rpb24gd3JpdGVfWExVbmljb2RlU3RyaW5nKHN0ciwgb3B0cywgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMyArIDIgKiBzdHIubGVuZ3RoKTtcblx0by53cml0ZV9zaGlmdCgyLCBzdHIubGVuZ3RoKTtcblx0by53cml0ZV9zaGlmdCgxLCAxKTtcblx0by53cml0ZV9zaGlmdCgzMSwgc3RyLCAndXRmMTZsZScpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi41LjYxIENvbnRyb2xJbmZvICovXG5mdW5jdGlvbiBwYXJzZV9Db250cm9sSW5mbyhibG9iLyo6OiwgbGVuZ3RoLCBvcHRzKi8pIHtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRibG9iLmwrKztcblx0dmFyIGFjY2VsID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjtcblx0cmV0dXJuIFtmbGFncywgYWNjZWxdO1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjcuNiBVUkxNb25pa2VyIFRPRE86IGZsYWdzICovXG5mdW5jdGlvbiBwYXJzZV9VUkxNb25pa2VyKGJsb2IvKjo6LCBsZW5ndGgsIG9wdHMqLykge1xuXHR2YXIgbGVuID0gYmxvYi5yZWFkX3NoaWZ0KDQpLCBzdGFydCA9IGJsb2IubDtcblx0dmFyIGV4dHJhID0gZmFsc2U7XG5cdGlmKGxlbiA+IDI0KSB7XG5cdFx0LyogbG9vayBhaGVhZCAqL1xuXHRcdGJsb2IubCArPSBsZW4gLSAyNDtcblx0XHRpZihibG9iLnJlYWRfc2hpZnQoMTYpID09PSBcIjc5NTg4MWY0M2IxZDdmNDhhZjJjODI1ZGM0ODUyNzYzXCIpIGV4dHJhID0gdHJ1ZTtcblx0XHRibG9iLmwgPSBzdGFydDtcblx0fVxuXHR2YXIgdXJsID0gYmxvYi5yZWFkX3NoaWZ0KChleHRyYT9sZW4tMjQ6bGVuKT4+MSwgJ3V0ZjE2bGUnKS5yZXBsYWNlKGNocjAsXCJcIik7XG5cdGlmKGV4dHJhKSBibG9iLmwgKz0gMjQ7XG5cdHJldHVybiB1cmw7XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuNy44IEZpbGVNb25pa2VyIFRPRE86IGFsbCBmaWVsZHMgKi9cbmZ1bmN0aW9uIHBhcnNlX0ZpbGVNb25pa2VyKGJsb2IvKjo6LCBsZW5ndGgqLykge1xuXHR2YXIgY0FudGkgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBwcmVhbWJsZSA9IFwiXCI7IHdoaWxlKGNBbnRpLS0gPiAwKSBwcmVhbWJsZSArPSBcIi4uL1wiO1xuXHR2YXIgYW5zaVBhdGggPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwc3RyLWFuc2knKTtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGVuZFNlcnZlciA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0aWYoYmxvYi5yZWFkX3NoaWZ0KDIpICE9IDB4REVBRCkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIEZpbGVNb25pa2VyXCIpO1xuXHR2YXIgc3ogPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdGlmKHN6ID09PSAwKSByZXR1cm4gcHJlYW1ibGUgKyBhbnNpUGF0aC5yZXBsYWNlKC9cXFxcL2csXCIvXCIpO1xuXHR2YXIgYnl0ZXMgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdGlmKGJsb2IucmVhZF9zaGlmdCgyKSAhPSAzKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgRmlsZU1vbmlrZXJcIik7XG5cdHZhciB1bmljb2RlUGF0aCA9IGJsb2IucmVhZF9zaGlmdChieXRlcz4+MSwgJ3V0ZjE2bGUnKS5yZXBsYWNlKGNocjAsXCJcIik7XG5cdHJldHVybiBwcmVhbWJsZSArIHVuaWNvZGVQYXRoO1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjcuMiBIeXBlcmxpbmtNb25pa2VyIFRPRE86IGFsbCB0aGUgbW9uaWtlcnMgKi9cbmZ1bmN0aW9uIHBhcnNlX0h5cGVybGlua01vbmlrZXIoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBjbHNpZCA9IGJsb2IucmVhZF9zaGlmdCgxNik7IGxlbmd0aCAtPSAxNjtcblx0c3dpdGNoKGNsc2lkKSB7XG5cdFx0Y2FzZSBcImUwYzllYTc5ZjliYWNlMTE4YzgyMDBhYTAwNGJhOTBiXCI6IHJldHVybiBwYXJzZV9VUkxNb25pa2VyKGJsb2IsIGxlbmd0aCk7XG5cdFx0Y2FzZSBcIjAzMDMwMDAwMDAwMDAwMDBjMDAwMDAwMDAwMDAwMDQ2XCI6IHJldHVybiBwYXJzZV9GaWxlTW9uaWtlcihibG9iLCBsZW5ndGgpO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIE1vbmlrZXIgXCIgKyBjbHNpZCk7XG5cdH1cbn1cblxuLyogW01TLU9TSEFSRURdIDIuMy43LjkgSHlwZXJsaW5rU3RyaW5nICovXG5mdW5jdGlvbiBwYXJzZV9IeXBlcmxpbmtTdHJpbmcoYmxvYi8qOjosIGxlbmd0aCovKSB7XG5cdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBvID0gbGVuID4gMCA/IGJsb2IucmVhZF9zaGlmdChsZW4sICd1dGYxNmxlJykucmVwbGFjZShjaHIwLCBcIlwiKSA6IFwiXCI7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gd3JpdGVfSHlwZXJsaW5rU3RyaW5nKHN0ci8qOnN0cmluZyovLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1Zig2ICsgc3RyLmxlbmd0aCAqIDIpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDEgKyBzdHIubGVuZ3RoKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgby53cml0ZV9zaGlmdCgyLCBzdHIuY2hhckNvZGVBdChpKSk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjcuMSBIeXBlcmxpbmsgT2JqZWN0ICovXG5mdW5jdGlvbiBwYXJzZV9IeXBlcmxpbmsoYmxvYiwgbGVuZ3RoKS8qOkh5cGVybGluayovIHtcblx0dmFyIGVuZCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIHNWZXIgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdGlmKHNWZXIgIT09IDIpIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBzdHJlYW1WZXJzaW9uOiBcIiArIHNWZXIpO1xuXHR2YXIgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyO1xuXHR2YXIgZGlzcGxheU5hbWUsIHRhcmdldEZyYW1lTmFtZSwgbW9uaWtlciwgb2xlTW9uaWtlciwgTG9jPVwiXCIsIGd1aWQsIGZpbGVUaW1lO1xuXHRpZihmbGFncyAmIDB4MDAxMCkgZGlzcGxheU5hbWUgPSBwYXJzZV9IeXBlcmxpbmtTdHJpbmcoYmxvYiwgZW5kIC0gYmxvYi5sKTtcblx0aWYoZmxhZ3MgJiAweDAwODApIHRhcmdldEZyYW1lTmFtZSA9IHBhcnNlX0h5cGVybGlua1N0cmluZyhibG9iLCBlbmQgLSBibG9iLmwpO1xuXHRpZigoZmxhZ3MgJiAweDAxMDEpID09PSAweDAxMDEpIG1vbmlrZXIgPSBwYXJzZV9IeXBlcmxpbmtTdHJpbmcoYmxvYiwgZW5kIC0gYmxvYi5sKTtcblx0aWYoKGZsYWdzICYgMHgwMTAxKSA9PT0gMHgwMDAxKSBvbGVNb25pa2VyID0gcGFyc2VfSHlwZXJsaW5rTW9uaWtlcihibG9iLCBlbmQgLSBibG9iLmwpO1xuXHRpZihmbGFncyAmIDB4MDAwOCkgTG9jID0gcGFyc2VfSHlwZXJsaW5rU3RyaW5nKGJsb2IsIGVuZCAtIGJsb2IubCk7XG5cdGlmKGZsYWdzICYgMHgwMDIwKSBndWlkID0gYmxvYi5yZWFkX3NoaWZ0KDE2KTtcblx0aWYoZmxhZ3MgJiAweDAwNDApIGZpbGVUaW1lID0gcGFyc2VfRklMRVRJTUUoYmxvYi8qLCA4Ki8pO1xuXHRibG9iLmwgPSBlbmQ7XG5cdHZhciB0YXJnZXQgPSB0YXJnZXRGcmFtZU5hbWV8fG1vbmlrZXJ8fG9sZU1vbmlrZXJ8fFwiXCI7XG5cdGlmKHRhcmdldCAmJiBMb2MpIHRhcmdldCs9XCIjXCIrTG9jO1xuXHRpZighdGFyZ2V0KSB0YXJnZXQgPSBcIiNcIiArIExvYztcblx0aWYoKGZsYWdzICYgMHgwMDAyKSAmJiB0YXJnZXQuY2hhckF0KDApID09IFwiL1wiICYmIHRhcmdldC5jaGFyQXQoMSkgIT0gXCIvXCIpIHRhcmdldCA9IFwiZmlsZTovL1wiICsgdGFyZ2V0O1xuXHR2YXIgb3V0ID0gKHtUYXJnZXQ6dGFyZ2V0fS8qOmFueSovKTtcblx0aWYoZ3VpZCkgb3V0Lmd1aWQgPSBndWlkO1xuXHRpZihmaWxlVGltZSkgb3V0LnRpbWUgPSBmaWxlVGltZTtcblx0aWYoZGlzcGxheU5hbWUpIG91dC5Ub29sdGlwID0gZGlzcGxheU5hbWU7XG5cdHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9IeXBlcmxpbmsoaGwpIHtcblx0dmFyIG91dCA9IG5ld19idWYoNTEyKSwgaSA9IDA7XG5cdHZhciBUYXJnZXQgPSBobC5UYXJnZXQ7XG5cdGlmKFRhcmdldC5zbGljZSgwLDcpID09IFwiZmlsZTovL1wiKSBUYXJnZXQgPSBUYXJnZXQuc2xpY2UoNyk7XG5cdHZhciBoYXNoaWR4ID0gVGFyZ2V0LmluZGV4T2YoXCIjXCIpO1xuXHR2YXIgRiA9IGhhc2hpZHggPiAtMSA/IDB4MWYgOiAweDE3O1xuXHRzd2l0Y2goVGFyZ2V0LmNoYXJBdCgwKSkgeyBjYXNlIFwiI1wiOiBGPTB4MWM7IGJyZWFrOyBjYXNlIFwiLlwiOiBGJj1+MjsgYnJlYWs7IH1cblx0b3V0LndyaXRlX3NoaWZ0KDQsMik7IG91dC53cml0ZV9zaGlmdCg0LCBGKTtcblx0dmFyIGRhdGEgPSBbOCw2ODE1ODI3LDY2MTkyMzcsNDg0OTc4MCw4M107IGZvcihpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIG91dC53cml0ZV9zaGlmdCg0LCBkYXRhW2ldKTtcblx0aWYoRiA9PSAweDFDKSB7XG5cdFx0VGFyZ2V0ID0gVGFyZ2V0LnNsaWNlKDEpO1xuXHRcdHdyaXRlX0h5cGVybGlua1N0cmluZyhUYXJnZXQsIG91dCk7XG5cdH0gZWxzZSBpZihGICYgMHgwMikge1xuXHRcdGRhdGEgPSBcImUwIGM5IGVhIDc5IGY5IGJhIGNlIDExIDhjIDgyIDAwIGFhIDAwIDRiIGE5IDBiXCIuc3BsaXQoXCIgXCIpO1xuXHRcdGZvcihpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIG91dC53cml0ZV9zaGlmdCgxLCBwYXJzZUludChkYXRhW2ldLCAxNikpO1xuXHRcdHZhciBQcmV0YXJnZXQgPSBoYXNoaWR4ID4gLTEgPyBUYXJnZXQuc2xpY2UoMCwgaGFzaGlkeCkgOiBUYXJnZXQ7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDQsIDIqKFByZXRhcmdldC5sZW5ndGggKyAxKSk7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgUHJldGFyZ2V0Lmxlbmd0aDsgKytpKSBvdXQud3JpdGVfc2hpZnQoMiwgUHJldGFyZ2V0LmNoYXJDb2RlQXQoaSkpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRpZihGICYgMHgwOCkgd3JpdGVfSHlwZXJsaW5rU3RyaW5nKGhhc2hpZHggPiAtMSA/IFRhcmdldC5zbGljZShoYXNoaWR4KzEpOiBcIlwiLCBvdXQpO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGEgPSBcIjAzIDAzIDAwIDAwIDAwIDAwIDAwIDAwIGMwIDAwIDAwIDAwIDAwIDAwIDAwIDQ2XCIuc3BsaXQoXCIgXCIpO1xuXHRcdGZvcihpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIG91dC53cml0ZV9zaGlmdCgxLCBwYXJzZUludChkYXRhW2ldLCAxNikpO1xuXHRcdHZhciBQID0gMDtcblx0XHR3aGlsZShUYXJnZXQuc2xpY2UoUCozLFAqMyszKT09XCIuLi9cInx8VGFyZ2V0LnNsaWNlKFAqMyxQKjMrMyk9PVwiLi5cXFxcXCIpICsrUDtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgUCk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDQsIFRhcmdldC5sZW5ndGggLSAzICogUCArIDEpO1xuXHRcdGZvcihpID0gMDsgaSA8IFRhcmdldC5sZW5ndGggLSAzICogUDsgKytpKSBvdXQud3JpdGVfc2hpZnQoMSwgVGFyZ2V0LmNoYXJDb2RlQXQoaSArIDMgKiBQKSAmIDB4RkYpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgMHhGRkZGKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgMHhERUFEKTtcblx0XHRmb3IoaSA9IDA7IGkgPCA2OyArK2kpIG91dC53cml0ZV9zaGlmdCg0LCAwKTtcblx0fVxuXHRyZXR1cm4gb3V0LnNsaWNlKDAsIG91dC5sKTtcbn1cblxuLyogMi41LjE3OCBMb25nUkdCQSAqL1xuZnVuY3Rpb24gcGFyc2VfTG9uZ1JHQkEoYmxvYi8qOjosIGxlbmd0aCovKSB7IHZhciByID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCBnID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCBiID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCBhID0gYmxvYi5yZWFkX3NoaWZ0KDEpOyByZXR1cm4gW3IsZyxiLGFdOyB9XG5cbi8qIDIuNS4xNzcgTG9uZ1JHQiAqL1xuZnVuY3Rpb24gcGFyc2VfTG9uZ1JHQihibG9iLCBsZW5ndGgpIHsgdmFyIHggPSBwYXJzZV9Mb25nUkdCQShibG9iLCBsZW5ndGgpOyB4WzNdID0gMDsgcmV0dXJuIHg7IH1cblxuXG4vKiBbTVMtWExTXSAyLjUuMTkgKi9cbmZ1bmN0aW9uIHBhcnNlX1hMU0NlbGwoYmxvYi8qOjosIGxlbmd0aCovKS8qOkNlbGwqLyB7XG5cdHZhciBydyA9IGJsb2IucmVhZF9zaGlmdCgyKTsgLy8gMC1pbmRleGVkXG5cdHZhciBjb2wgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBpeGZlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4gKHtyOnJ3LCBjOmNvbCwgaXhmZTppeGZlfS8qOmFueSovKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1hMU0NlbGwoUi8qOm51bWJlciovLCBDLyo6bnVtYmVyKi8sIGl4ZmUvKjo/bnVtYmVyKi8sIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDYpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIFIpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIEMpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIGl4ZmV8fDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi41LjEzNCAqL1xuZnVuY3Rpb24gcGFyc2VfZnJ0SGVhZGVyKGJsb2IpIHtcblx0dmFyIHJ0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMik7IC8vIFRPRE86IHBhcnNlIHRoZXNlIGZsYWdzXG5cdGJsb2IubCArPSA4O1xuXHRyZXR1cm4ge3R5cGU6IHJ0LCBmbGFnczogZmxhZ3N9O1xufVxuXG5cblxuZnVuY3Rpb24gcGFyc2VfT3B0WExVbmljb2RlU3RyaW5nKGJsb2IsIGxlbmd0aCwgb3B0cykgeyByZXR1cm4gbGVuZ3RoID09PSAwID8gXCJcIiA6IHBhcnNlX1hMVW5pY29kZVN0cmluZzIoYmxvYiwgbGVuZ3RoLCBvcHRzKTsgfVxuXG4vKiBbTVMtWExTXSAyLjUuMzQ0ICovXG5mdW5jdGlvbiBwYXJzZV9YVEkoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB3ID0gb3B0cy5iaWZmID4gOCA/IDQgOiAyO1xuXHR2YXIgaVN1cEJvb2sgPSBibG9iLnJlYWRfc2hpZnQodyksIGl0YWJGaXJzdCA9IGJsb2IucmVhZF9zaGlmdCh3LCdpJyksIGl0YWJMYXN0ID0gYmxvYi5yZWFkX3NoaWZ0KHcsJ2knKTtcblx0cmV0dXJuIFtpU3VwQm9vaywgaXRhYkZpcnN0LCBpdGFiTGFzdF07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4yMTggKi9cbmZ1bmN0aW9uIHBhcnNlX1JrUmVjKGJsb2IpIHtcblx0dmFyIGl4ZmUgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBSSyA9IHBhcnNlX1JrTnVtYmVyKGJsb2IpO1xuXHRyZXR1cm4gW2l4ZmUsIFJLXTtcbn1cblxuLyogW01TLVhMU10gMi41LjEgKi9cbmZ1bmN0aW9uIHBhcnNlX0FkZGluVWRmKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRibG9iLmwgKz0gNDsgbGVuZ3RoIC09IDQ7XG5cdHZhciBsID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgdWRmTmFtZSA9IHBhcnNlX1Nob3J0WExVbmljb2RlU3RyaW5nKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdHZhciBjYiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0bCAtPSBibG9iLmw7XG5cdGlmKGNiICE9PSBsKSB0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgQWRkaW5VZGY6IHBhZGRpbmcgPSBcIiArIGwgKyBcIiAhPSBcIiArIGNiKTtcblx0YmxvYi5sICs9IGNiO1xuXHRyZXR1cm4gdWRmTmFtZTtcbn1cblxuLyogW01TLVhMU10gMi41LjIwOSBUT0RPOiBDaGVjayBzaXplcyAqL1xuZnVuY3Rpb24gcGFyc2VfUmVmOFUoYmxvYi8qOjosIGxlbmd0aCovKSB7XG5cdHZhciByd0ZpcnN0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgcndMYXN0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgY29sRmlyc3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjb2xMYXN0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4ge3M6e2M6Y29sRmlyc3QsIHI6cndGaXJzdH0sIGU6e2M6Y29sTGFzdCxyOnJ3TGFzdH19O1xufVxuZnVuY3Rpb24gd3JpdGVfUmVmOFUoci8qOlJhbmdlKi8sIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDgpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHIucy5yKTtcblx0by53cml0ZV9zaGlmdCgyLCByLmUucik7XG5cdG8ud3JpdGVfc2hpZnQoMiwgci5zLmMpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHIuZS5jKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4yMTEgKi9cbmZ1bmN0aW9uIHBhcnNlX1JlZlUoYmxvYi8qOjosIGxlbmd0aCovKSB7XG5cdHZhciByd0ZpcnN0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgcndMYXN0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgY29sRmlyc3QgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBjb2xMYXN0ID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4ge3M6e2M6Y29sRmlyc3QsIHI6cndGaXJzdH0sIGU6e2M6Y29sTGFzdCxyOnJ3TGFzdH19O1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMjA3ICovXG52YXIgcGFyc2VfUmVmID0gcGFyc2VfUmVmVTtcblxuLyogW01TLVhMU10gMi41LjE0MyAqL1xuZnVuY3Rpb24gcGFyc2VfRnRDbW8oYmxvYi8qOjosIGxlbmd0aCovKSB7XG5cdGJsb2IubCArPSA0O1xuXHR2YXIgb3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBpZCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwrPTEyO1xuXHRyZXR1cm4gW2lkLCBvdCwgZmxhZ3NdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTQ5ICovXG5mdW5jdGlvbiBwYXJzZV9GdE50cyhibG9iKSB7XG5cdHZhciBvdXQgPSB7fTtcblx0YmxvYi5sICs9IDQ7XG5cdGJsb2IubCArPSAxNjsgLy8gR1VJRCBUT0RPXG5cdG91dC5mU2hhcmVkTm90ZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDQ7XG5cdHJldHVybiBvdXQ7XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xNDIgKi9cbmZ1bmN0aW9uIHBhcnNlX0Z0Q2YoYmxvYikge1xuXHR2YXIgb3V0ID0ge307XG5cdGJsb2IubCArPSA0O1xuXHRibG9iLmNmID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTQwIC0gMi41LjE1NCBhbmQgZnJpZW5kcyAqL1xuZnVuY3Rpb24gcGFyc2VfRnRTa2lwKGJsb2IpIHsgYmxvYi5sICs9IDI7IGJsb2IubCArPSBibG9iLnJlYWRfc2hpZnQoMik7IH1cbnZhciBGdFRhYiA9IHtcblx0Lyo6OlsqLzB4MDAvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRFbmQgKi9cblx0Lyo6OlsqLzB4MDQvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRNYWNybyAqL1xuXHQvKjo6WyovMHgwNS8qOjpdKi86IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdEJ1dHRvbiAqL1xuXHQvKjo6WyovMHgwNi8qOjpdKi86IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdEdtbyAqL1xuXHQvKjo6WyovMHgwNy8qOjpdKi86IHBhcnNlX0Z0Q2YsICAgICAgICAvKiBGdENmICovXG5cdC8qOjpbKi8weDA4Lyo6Ol0qLzogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0UGlvR3JiaXQgKi9cblx0Lyo6OlsqLzB4MDkvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRQaWN0Rm1sYSAqL1xuXHQvKjo6WyovMHgwQS8qOjpdKi86IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdENibHMgKi9cblx0Lyo6OlsqLzB4MEIvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRSYm8gKi9cblx0Lyo6OlsqLzB4MEMvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRTYnMgKi9cblx0Lyo6OlsqLzB4MEQvKjo6XSovOiBwYXJzZV9GdE50cywgICAgICAgLyogRnROdHMgKi9cblx0Lyo6OlsqLzB4MEUvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRTYnNGbWxhICovXG5cdC8qOjpbKi8weDBGLyo6Ol0qLzogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0R2JvRGF0YSAqL1xuXHQvKjo6WyovMHgxMC8qOjpdKi86IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdEVkb0RhdGEgKi9cblx0Lyo6OlsqLzB4MTEvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRSYm9EYXRhICovXG5cdC8qOjpbKi8weDEyLyo6Ol0qLzogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0Q2Jsc0RhdGEgKi9cblx0Lyo6OlsqLzB4MTMvKjo6XSovOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRMYnNEYXRhICovXG5cdC8qOjpbKi8weDE0Lyo6Ol0qLzogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0Q2Jsc0ZtbGEgKi9cblx0Lyo6OlsqLzB4MTUvKjo6XSovOiBwYXJzZV9GdENtb1xufTtcbmZ1bmN0aW9uIHBhcnNlX0Z0QXJyYXkoYmxvYiwgbGVuZ3RoLyo6Oiwgb3QqLykge1xuXHR2YXIgdGd0ID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgZnRzID0gW107XG5cdHdoaWxlKGJsb2IubCA8IHRndCkge1xuXHRcdHZhciBmdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHRibG9iLmwtPTI7XG5cdFx0dHJ5IHtcblx0XHRcdGZ0cy5wdXNoKEZ0VGFiW2Z0XShibG9iLCB0Z3QgLSBibG9iLmwpKTtcblx0XHR9IGNhdGNoKGUpIHsgYmxvYi5sID0gdGd0OyByZXR1cm4gZnRzOyB9XG5cdH1cblx0aWYoYmxvYi5sICE9IHRndCkgYmxvYi5sID0gdGd0OyAvL3Rocm93IG5ldyBFcnJvcihcImJhZCBPYmplY3QgRnQtc2VxdWVuY2VcIik7XG5cdHJldHVybiBmdHM7XG59XG5cbi8qIC0tLSAyLjQgUmVjb3JkcyAtLS0gKi9cblxuLyogW01TLVhMU10gMi40LjIxICovXG5mdW5jdGlvbiBwYXJzZV9CT0YoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBvID0ge0JJRkZWZXI6MCwgZHQ6MH07XG5cdG8uQklGRlZlciA9IGJsb2IucmVhZF9zaGlmdCgyKTsgbGVuZ3RoIC09IDI7XG5cdGlmKGxlbmd0aCA+PSAyKSB7IG8uZHQgPSBibG9iLnJlYWRfc2hpZnQoMik7IGJsb2IubCAtPSAyOyB9XG5cdHN3aXRjaChvLkJJRkZWZXIpIHtcblx0XHRjYXNlIDB4MDYwMDogLyogQklGRjggKi9cblx0XHRjYXNlIDB4MDUwMDogLyogQklGRjUgKi9cblx0XHRjYXNlIDB4MDQwMDogLyogQklGRjQgKi9cblx0XHRjYXNlIDB4MDMwMDogLyogQklGRjMgKi9cblx0XHRjYXNlIDB4MDIwMDogLyogQklGRjIgKi9cblx0XHRjYXNlIDB4MDAwMjogY2FzZSAweDAwMDc6IC8qIEJJRkYyICovXG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OiBpZihsZW5ndGggPiA2KSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIEJJRkYgVmVyIFwiICsgby5CSUZGVmVyKTtcblx0fVxuXG5cdGJsb2IucmVhZF9zaGlmdChsZW5ndGgpO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX0JPRih3Yi8qOldvcmtib29rKi8sIHQvKjpudW1iZXIqLywgbykge1xuXHR2YXIgaCA9IDB4MDYwMCwgdyA9IDE2O1xuXHRzd2l0Y2goby5ib29rVHlwZSkge1xuXHRcdGNhc2UgJ2JpZmY4JzogYnJlYWs7XG5cdFx0Y2FzZSAnYmlmZjUnOiBoID0gMHgwNTAwOyB3ID0gODsgYnJlYWs7XG5cdFx0Y2FzZSAnYmlmZjQnOiBoID0gMHgwMDA0OyB3ID0gNjsgYnJlYWs7XG5cdFx0Y2FzZSAnYmlmZjMnOiBoID0gMHgwMDAzOyB3ID0gNjsgYnJlYWs7XG5cdFx0Y2FzZSAnYmlmZjInOiBoID0gMHgwMDAyOyB3ID0gNDsgYnJlYWs7XG5cdFx0Y2FzZSAneGxhJzogYnJlYWs7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgQklGRiB2ZXJzaW9uXCIpO1xuXHR9XG5cdHZhciBvdXQgPSBuZXdfYnVmKHcpO1xuXHRvdXQud3JpdGVfc2hpZnQoMiwgaCk7XG5cdG91dC53cml0ZV9zaGlmdCgyLCB0KTtcblx0aWYodyA+IDQpIG91dC53cml0ZV9zaGlmdCgyLCAweDcyNjIpO1xuXHRpZih3ID4gNikgb3V0LndyaXRlX3NoaWZ0KDIsIDB4MDdDRCk7XG5cdGlmKHcgPiA4KSB7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIDB4QzAwOSk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIDB4MDAwMSk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIDB4MDcwNik7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIDB4MDAwMCk7XG5cdH1cblx0cmV0dXJuIG91dDtcbn1cblxuXG4vKiBbTVMtWExTXSAyLjQuMTQ2ICovXG5mdW5jdGlvbiBwYXJzZV9JbnRlcmZhY2VIZHIoYmxvYiwgbGVuZ3RoKSB7XG5cdGlmKGxlbmd0aCA9PT0gMCkgcmV0dXJuIDB4MDRiMDtcblx0aWYoKGJsb2IucmVhZF9zaGlmdCgyKSkhPT0weDA0YjApey8qIGVtcHR5ICovfVxuXHRyZXR1cm4gMHgwNGIwO1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNC4zNDkgKi9cbmZ1bmN0aW9uIHBhcnNlX1dyaXRlQWNjZXNzKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzLmVuYykgeyBibG9iLmwgKz0gbGVuZ3RoOyByZXR1cm4gXCJcIjsgfVxuXHR2YXIgbCA9IGJsb2IubDtcblx0Ly8gVE9ETzogbWFrZSBzdXJlIFhMVW5pY29kZVN0cmluZyBkb2VzbnQgb3ZlcnJ1blxuXHR2YXIgVXNlck5hbWUgPSBwYXJzZV9YTFVuaWNvZGVTdHJpbmcyKGJsb2IsIDAsIG9wdHMpO1xuXHRibG9iLnJlYWRfc2hpZnQobGVuZ3RoICsgbCAtIGJsb2IubCk7XG5cdHJldHVybiBVc2VyTmFtZTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1dyaXRlQWNjZXNzKHMvKjpzdHJpbmcqLywgb3B0cykge1xuXHR2YXIgYjggPSAhb3B0cyB8fCBvcHRzLmJpZmYgPT0gODtcblx0dmFyIG8gPSBuZXdfYnVmKGI4ID8gMTEyIDogNTQpO1xuXHRvLndyaXRlX3NoaWZ0KG9wdHMuYmlmZiA9PSA4ID8gMiA6IDEsIDcpO1xuXHRpZihiOCkgby53cml0ZV9zaGlmdCgxLCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAweDMzMzM2ODUzKTtcblx0by53cml0ZV9zaGlmdCg0LCAoMHgwMDUzNEE3NCB8IChiOCA/IDAgOiAweDIwMDAwMDAwKSkpO1xuXHR3aGlsZShvLmwgPCBvLmxlbmd0aCkgby53cml0ZV9zaGlmdCgxLCAoYjggPyAwIDogMzIpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4zNTEgKi9cbmZ1bmN0aW9uIHBhcnNlX1dzQm9vbChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGZsYWdzID0gb3B0cyAmJiBvcHRzLmJpZmYgPT0gOCB8fCBsZW5ndGggPT0gMiA/IGJsb2IucmVhZF9zaGlmdCgyKSA6IChibG9iLmwgKz0gbGVuZ3RoLCAwKTtcblx0cmV0dXJuIHsgZkRpYWxvZzogZmxhZ3MgJiAweDEwLCBmQmVsb3c6IGZsYWdzICYgMHg0MCwgZlJpZ2h0OiBmbGFncyAmIDB4ODAgfTtcbn1cblxuLyogW01TLVhMU10gMi40LjI4ICovXG5mdW5jdGlvbiBwYXJzZV9Cb3VuZFNoZWV0OChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHBvcyA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIGhpZGRlbiA9IGJsb2IucmVhZF9zaGlmdCgxKSAmIDB4MDM7XG5cdHZhciBkdCA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0c3dpdGNoKGR0KSB7XG5cdFx0Y2FzZSAwOiBkdCA9ICdXb3Jrc2hlZXQnOyBicmVhaztcblx0XHRjYXNlIDE6IGR0ID0gJ01hY3Jvc2hlZXQnOyBicmVhaztcblx0XHRjYXNlIDI6IGR0ID0gJ0NoYXJ0c2hlZXQnOyBicmVhaztcblx0XHRjYXNlIDY6IGR0ID0gJ1ZCQU1vZHVsZSc7IGJyZWFrO1xuXHR9XG5cdHZhciBuYW1lID0gcGFyc2VfU2hvcnRYTFVuaWNvZGVTdHJpbmcoYmxvYiwgMCwgb3B0cyk7XG5cdGlmKG5hbWUubGVuZ3RoID09PSAwKSBuYW1lID0gXCJTaGVldDFcIjtcblx0cmV0dXJuIHsgcG9zOnBvcywgaHM6aGlkZGVuLCBkdDpkdCwgbmFtZTpuYW1lIH07XG59XG5mdW5jdGlvbiB3cml0ZV9Cb3VuZFNoZWV0OChkYXRhLCBvcHRzKSB7XG5cdHZhciB3ID0gKCFvcHRzIHx8IG9wdHMuYmlmZiA+PSA4ID8gMiA6IDEpO1xuXHR2YXIgbyA9IG5ld19idWYoOCArIHcgKiBkYXRhLm5hbWUubGVuZ3RoKTtcblx0by53cml0ZV9zaGlmdCg0LCBkYXRhLnBvcyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgZGF0YS5ocyB8fCAwKTtcblx0by53cml0ZV9zaGlmdCgxLCBkYXRhLmR0KTtcblx0by53cml0ZV9zaGlmdCgxLCBkYXRhLm5hbWUubGVuZ3RoKTtcblx0aWYob3B0cy5iaWZmID49IDgpIG8ud3JpdGVfc2hpZnQoMSwgMSk7XG5cdG8ud3JpdGVfc2hpZnQodyAqIGRhdGEubmFtZS5sZW5ndGgsIGRhdGEubmFtZSwgb3B0cy5iaWZmIDwgOCA/ICdzYmNzJyA6ICd1dGYxNmxlJyk7XG5cdHZhciBvdXQgPSBvLnNsaWNlKDAsIG8ubCk7XG5cdG91dC5sID0gby5sOyByZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMjY1IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1NTVChibG9iLCBsZW5ndGgpLyo6U1NUKi8ge1xuXHR2YXIgZW5kID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgY250ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgdWNudCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIHN0cnMvKjpTU1QqLyA9IChbXS8qOmFueSovKTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSB1Y250ICYmIGJsb2IubCA8IGVuZDsgKytpKSB7XG5cdFx0c3Rycy5wdXNoKHBhcnNlX1hMVW5pY29kZVJpY2hFeHRlbmRlZFN0cmluZyhibG9iKSk7XG5cdH1cblx0c3Rycy5Db3VudCA9IGNudDsgc3Rycy5VbmlxdWUgPSB1Y250O1xuXHRyZXR1cm4gc3Rycztcbn1cbmZ1bmN0aW9uIHdyaXRlX1NTVChzc3QsIG9wdHMpIHtcblx0dmFyIGhlYWRlciA9IG5ld19idWYoOCk7XG5cdGhlYWRlci53cml0ZV9zaGlmdCg0LCBzc3QuQ291bnQpO1xuXHRoZWFkZXIud3JpdGVfc2hpZnQoNCwgc3N0LlVuaXF1ZSk7XG5cdHZhciBzdHJzID0gW107XG5cdGZvcih2YXIgaiA9IDA7IGogPCBzc3QubGVuZ3RoOyArK2opIHN0cnNbal0gPSB3cml0ZV9YTFVuaWNvZGVSaWNoRXh0ZW5kZWRTdHJpbmcoc3N0W2pdLCBvcHRzKTtcblx0dmFyIG8gPSBiY29uY2F0KFtoZWFkZXJdLmNvbmNhdChzdHJzKSk7XG5cdC8qOjooKi9vLyo6OiA6YW55KSovLnBhcnRzID0gW2hlYWRlci5sZW5ndGhdLmNvbmNhdChzdHJzLm1hcChmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci5sZW5ndGg7IH0pKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xMDcgKi9cbmZ1bmN0aW9uIHBhcnNlX0V4dFNTVChibG9iLCBsZW5ndGgpIHtcblx0dmFyIGV4dHNzdCA9IHt9O1xuXHRleHRzc3QuZHNzdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IGxlbmd0aC0yO1xuXHRyZXR1cm4gZXh0c3N0O1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNC4yMjEgVE9ETzogY2hlY2sgQklGRjItNCAqL1xuZnVuY3Rpb24gcGFyc2VfUm93KGJsb2IpIHtcblx0dmFyIHogPSAoe30vKjphbnkqLyk7XG5cdHouciA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0ei5jID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR6LmNudCA9IGJsb2IucmVhZF9zaGlmdCgyKSAtIHouYztcblx0dmFyIG1peVJ3ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gNDsgLy8gcmVzZXJ2ZWQoMiksIHVudXNlZCgyKVxuXHR2YXIgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMSk7IC8vIHZhcmlvdXMgZmxhZ3Ncblx0YmxvYi5sICs9IDM7IC8vIHJlc2VydmVkKDgpLCBpeGZlKDEyKSwgZmxhZ3MoNClcblx0aWYoZmxhZ3MgJiAweDA3KSB6LmxldmVsID0gZmxhZ3MgJiAweDA3O1xuXHQvLyBjb2xsYXBzZWQ6IGZsYWdzICYgMHgxMFxuXHRpZihmbGFncyAmIDB4MjApIHouaGlkZGVuID0gdHJ1ZTtcblx0aWYoZmxhZ3MgJiAweDQwKSB6LmhwdCA9IG1peVJ3IC8gMjA7XG5cdHJldHVybiB6O1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNC4xMjUgKi9cbmZ1bmN0aW9uIHBhcnNlX0ZvcmNlRnVsbENhbGN1bGF0aW9uKGJsb2IpIHtcblx0dmFyIGhlYWRlciA9IHBhcnNlX2ZydEhlYWRlcihibG9iKTtcblx0aWYoaGVhZGVyLnR5cGUgIT0gMHgwOEEzKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEZ1dHVyZSBSZWNvcmQgXCIgKyBoZWFkZXIudHlwZSk7XG5cdHZhciBmdWxsY2FsYyA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0cmV0dXJuIGZ1bGxjYWxjICE9PSAweDA7XG59XG5cblxuXG5cblxuLyogW01TLVhMU10gMi40LjIxNSBydCAqL1xuZnVuY3Rpb24gcGFyc2VfUmVjYWxjSWQoYmxvYikge1xuXHRibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiBibG9iLnJlYWRfc2hpZnQoNCk7XG59XG5cbi8qIFtNUy1YTFNdIDIuNC44NyAqL1xuZnVuY3Rpb24gcGFyc2VfRGVmYXVsdFJvd0hlaWdodChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGYgPSAwO1xuXHRpZighKG9wdHMgJiYgb3B0cy5iaWZmID09IDIpKSB7XG5cdFx0ZiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0fVxuXHR2YXIgbWl5UncgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGlmKChvcHRzICYmIG9wdHMuYmlmZiA9PSAyKSkge1xuXHRcdGYgPSAxIC0gKG1peVJ3ID4+IDE1KTsgbWl5UncgJj0gMHg3ZmZmO1xuXHR9XG5cdHZhciBmbCA9IHtVbnN5bmNlZDpmJjEsRHlaZXJvOihmJjIpPj4xLEV4QXNjOihmJjQpPj4yLEV4RHNjOihmJjgpPj4zfTtcblx0cmV0dXJuIFtmbCwgbWl5UnddO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMzQ1IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1dpbmRvdzEoYmxvYikge1xuXHR2YXIgeFduID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCB5V24gPSBibG9iLnJlYWRfc2hpZnQoMiksIGR4V24gPSBibG9iLnJlYWRfc2hpZnQoMiksIGR5V24gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKSwgaVRhYkN1ciA9IGJsb2IucmVhZF9zaGlmdCgyKSwgaVRhYkZpcnN0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgY3RhYlNlbCA9IGJsb2IucmVhZF9zaGlmdCgyKSwgd1RhYlJhdGlvID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4geyBQb3M6IFt4V24sIHlXbl0sIERpbTogW2R4V24sIGR5V25dLCBGbGFnczogZmxhZ3MsIEN1clRhYjogaVRhYkN1cixcblx0XHRGaXJzdFRhYjogaVRhYkZpcnN0LCBTZWxlY3RlZDogY3RhYlNlbCwgVGFiUmF0aW86IHdUYWJSYXRpbyB9O1xufVxuZnVuY3Rpb24gd3JpdGVfV2luZG93MSgvKjo6b3B0cyovKSB7XG5cdHZhciBvID0gbmV3X2J1ZigxOCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMHg3MjYwKTtcblx0by53cml0ZV9zaGlmdCgyLCAweDQ0YzApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDB4MzgpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDEpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDB4MDFmNCk7XG5cdHJldHVybiBvO1xufVxuLyogW01TLVhMU10gMi40LjM0NiBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9XaW5kb3cyKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzICYmIG9wdHMuYmlmZiA+PSAyICYmIG9wdHMuYmlmZiA8IDUpIHJldHVybiB7fTtcblx0dmFyIGYgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiB7IFJUTDogZiAmIDB4NDAgfTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1dpbmRvdzIodmlldykge1xuXHR2YXIgbyA9IG5ld19idWYoMTgpLCBmID0gMHg2YjY7XG5cdGlmKHZpZXcgJiYgdmlldy5SVEwpIGYgfD0gMHg0MDtcblx0by53cml0ZV9zaGlmdCgyLCBmKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCA2NCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTg5IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1BhbmUoLypibG9iLCBsZW5ndGgsIG9wdHMqLykge1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTIyIFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0ZvbnQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBvLyo6YW55Ki8gPSB7XG5cdFx0ZHlIZWlnaHQ6IGJsb2IucmVhZF9zaGlmdCgyKSxcblx0XHRmbDogYmxvYi5yZWFkX3NoaWZ0KDIpXG5cdH07XG5cdHN3aXRjaCgob3B0cyAmJiBvcHRzLmJpZmYpIHx8IDgpIHtcblx0XHRjYXNlIDI6IGJyZWFrO1xuXHRcdGNhc2UgMzogY2FzZSA0OiBibG9iLmwgKz0gMjsgYnJlYWs7XG5cdFx0ZGVmYXVsdDogYmxvYi5sICs9IDEwOyBicmVhaztcblx0fVxuXHRvLm5hbWUgPSBwYXJzZV9TaG9ydFhMVW5pY29kZVN0cmluZyhibG9iLCAwLCBvcHRzKTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiB3cml0ZV9Gb250KGRhdGEsIG9wdHMpIHtcblx0dmFyIG5hbWUgPSBkYXRhLm5hbWUgfHwgXCJBcmlhbFwiO1xuXHR2YXIgYjUgPSAob3B0cyAmJiAob3B0cy5iaWZmID09IDUpKSwgdyA9IChiNSA/ICgxNSArIG5hbWUubGVuZ3RoKSA6ICgxNiArIDIgKiBuYW1lLmxlbmd0aCkpO1xuXHR2YXIgbyA9IG5ld19idWYodyk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgKGRhdGEuc3ogfHwgMTIpICogMjApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDQwMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgbmFtZS5sZW5ndGgpO1xuXHRpZighYjUpIG8ud3JpdGVfc2hpZnQoMSwgMSk7XG5cdG8ud3JpdGVfc2hpZnQoKGI1ID8gMSA6IDIpICogbmFtZS5sZW5ndGgsIG5hbWUsIChiNSA/IFwic2Jjc1wiIDogXCJ1dGYxNmxlXCIpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xNDkgKi9cbmZ1bmN0aW9uIHBhcnNlX0xhYmVsU3N0KGJsb2IpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNDZWxsKGJsb2IpO1xuXHRjZWxsLmlzc3QgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBjZWxsO1xufVxuZnVuY3Rpb24gd3JpdGVfTGFiZWxTc3QoUi8qOm51bWJlciovLCBDLyo6bnVtYmVyKi8sIHYvKjpudW1iZXIqLywgb3MvKjpudW1iZXIqLyAvKjo6LCBvcHRzKi8pIHtcblx0dmFyIG8gPSBuZXdfYnVmKDEwKTtcblx0d3JpdGVfWExTQ2VsbChSLCBDLCBvcywgbyk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgdik7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTQ4ICovXG5mdW5jdGlvbiBwYXJzZV9MYWJlbChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmZ3Vlc3MgJiYgb3B0cy5iaWZmID09IDIpIG9wdHMuYmlmZiA9IDU7XG5cdHZhciB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0aWYob3B0cy5iaWZmID09IDIpIGJsb2IubCsrO1xuXHR2YXIgc3RyID0gcGFyc2VfWExVbmljb2RlU3RyaW5nKGJsb2IsIHRhcmdldCAtIGJsb2IubCwgb3B0cyk7XG5cdGNlbGwudmFsID0gc3RyO1xuXHRyZXR1cm4gY2VsbDtcbn1cbmZ1bmN0aW9uIHdyaXRlX0xhYmVsKFIvKjpudW1iZXIqLywgQy8qOm51bWJlciovLCB2Lyo6c3RyaW5nKi8sIG9zLyo6bnVtYmVyKi8sIG9wdHMpIHtcblx0dmFyIGI4ID0gIW9wdHMgfHwgb3B0cy5iaWZmID09IDg7XG5cdHZhciBvID0gbmV3X2J1Zig2ICsgMiArICgrYjgpICsgKDEgKyBiOCkgKiB2Lmxlbmd0aCk7XG5cdHdyaXRlX1hMU0NlbGwoUiwgQywgb3MsIG8pO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHYubGVuZ3RoKTtcblx0aWYoYjgpIG8ud3JpdGVfc2hpZnQoMSwgMSk7XG5cdG8ud3JpdGVfc2hpZnQoKDEgKyBiOCkgKiB2Lmxlbmd0aCwgdiwgYjggPyAndXRmMTZsZScgOiAnc2JjcycpO1xuXHRyZXR1cm4gbztcbn1cblxuXG4vKiBbTVMtWExTXSAyLjQuMTI2IE51bWJlciBGb3JtYXRzICovXG5mdW5jdGlvbiBwYXJzZV9Gb3JtYXQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBudW1GbXRJZCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGZtdHN0ciA9IHBhcnNlX1hMVW5pY29kZVN0cmluZzIoYmxvYiwgMCwgb3B0cyk7XG5cdHJldHVybiBbbnVtRm10SWQsIGZtdHN0cl07XG59XG5mdW5jdGlvbiB3cml0ZV9Gb3JtYXQoaS8qOm51bWJlciovLCBmLyo6c3RyaW5nKi8sIG9wdHMsIG8pIHtcblx0dmFyIGI1ID0gKG9wdHMgJiYgKG9wdHMuYmlmZiA9PSA1KSk7XG5cdGlmKCFvKSBvID0gbmV3X2J1ZihiNSA/ICgzICsgZi5sZW5ndGgpIDogKDUgKyAyICogZi5sZW5ndGgpKTtcblx0by53cml0ZV9zaGlmdCgyLCBpKTtcblx0by53cml0ZV9zaGlmdCgoYjUgPyAxIDogMiksIGYubGVuZ3RoKTtcblx0aWYoIWI1KSBvLndyaXRlX3NoaWZ0KDEsIDEpO1xuXHRvLndyaXRlX3NoaWZ0KChiNSA/IDEgOiAyKSAqIGYubGVuZ3RoLCBmLCAoYjUgPyAnc2JjcycgOiAndXRmMTZsZScpKTtcblx0dmFyIG91dCA9IChvLmxlbmd0aCA+IG8ubCkgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xuXHRpZihvdXQubCA9PSBudWxsKSBvdXQubCA9IG91dC5sZW5ndGg7XG5cdHJldHVybiBvdXQ7XG59XG52YXIgcGFyc2VfQklGRjJGb3JtYXQgPSBwYXJzZV9YTFVuaWNvZGVTdHJpbmcyO1xuXG4vKiBbTVMtWExTXSAyLjQuOTAgKi9cbmZ1bmN0aW9uIHBhcnNlX0RpbWVuc2lvbnMoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciB3ID0gb3B0cy5iaWZmID09IDggfHwgIW9wdHMuYmlmZiA/IDQgOiAyO1xuXHR2YXIgciA9IGJsb2IucmVhZF9zaGlmdCh3KSwgUiA9IGJsb2IucmVhZF9zaGlmdCh3KTtcblx0dmFyIGMgPSBibG9iLnJlYWRfc2hpZnQoMiksIEMgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCA9IGVuZDtcblx0cmV0dXJuIHtzOiB7cjpyLCBjOmN9LCBlOiB7cjpSLCBjOkN9fTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0RpbWVuc2lvbnMocmFuZ2UsIG9wdHMpIHtcblx0dmFyIHcgPSBvcHRzLmJpZmYgPT0gOCB8fCAhb3B0cy5iaWZmID8gNCA6IDI7XG5cdHZhciBvID0gbmV3X2J1ZigyKncgKyA2KTtcblx0by53cml0ZV9zaGlmdCh3LCByYW5nZS5zLnIpO1xuXHRvLndyaXRlX3NoaWZ0KHcsIHJhbmdlLmUuciArIDEpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHJhbmdlLnMuYyk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgcmFuZ2UuZS5jICsgMSk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMjIwICovXG5mdW5jdGlvbiBwYXJzZV9SSyhibG9iKSB7XG5cdHZhciBydyA9IGJsb2IucmVhZF9zaGlmdCgyKSwgY29sID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgcmtyZWMgPSBwYXJzZV9Sa1JlYyhibG9iKTtcblx0cmV0dXJuIHtyOnJ3LCBjOmNvbCwgaXhmZTpya3JlY1swXSwgcmtudW06cmtyZWNbMV19O1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTc1ICovXG5mdW5jdGlvbiBwYXJzZV9NdWxSayhibG9iLCBsZW5ndGgpIHtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aCAtIDI7XG5cdHZhciBydyA9IGJsb2IucmVhZF9zaGlmdCgyKSwgY29sID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgcmtyZWNzID0gW107XG5cdHdoaWxlKGJsb2IubCA8IHRhcmdldCkgcmtyZWNzLnB1c2gocGFyc2VfUmtSZWMoYmxvYikpO1xuXHRpZihibG9iLmwgIT09IHRhcmdldCkgdGhyb3cgbmV3IEVycm9yKFwiTXVsUksgcmVhZCBlcnJvclwiKTtcblx0dmFyIGxhc3Rjb2wgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGlmKHJrcmVjcy5sZW5ndGggIT0gbGFzdGNvbCAtIGNvbCArIDEpIHRocm93IG5ldyBFcnJvcihcIk11bFJLIGxlbmd0aCBtaXNtYXRjaFwiKTtcblx0cmV0dXJuIHtyOnJ3LCBjOmNvbCwgQzpsYXN0Y29sLCBya3JlYzpya3JlY3N9O1xufVxuLyogW01TLVhMU10gMi40LjE3NCAqL1xuZnVuY3Rpb24gcGFyc2VfTXVsQmxhbmsoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGggLSAyO1xuXHR2YXIgcncgPSBibG9iLnJlYWRfc2hpZnQoMiksIGNvbCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGl4ZmVzID0gW107XG5cdHdoaWxlKGJsb2IubCA8IHRhcmdldCkgaXhmZXMucHVzaChibG9iLnJlYWRfc2hpZnQoMikpO1xuXHRpZihibG9iLmwgIT09IHRhcmdldCkgdGhyb3cgbmV3IEVycm9yKFwiTXVsQmxhbmsgcmVhZCBlcnJvclwiKTtcblx0dmFyIGxhc3Rjb2wgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGlmKGl4ZmVzLmxlbmd0aCAhPSBsYXN0Y29sIC0gY29sICsgMSkgdGhyb3cgbmV3IEVycm9yKFwiTXVsQmxhbmsgbGVuZ3RoIG1pc21hdGNoXCIpO1xuXHRyZXR1cm4ge3I6cncsIGM6Y29sLCBDOmxhc3Rjb2wsIGl4ZmU6aXhmZXN9O1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMjAgMi41LjI0OSBUT0RPOiBpbnRlcnByZXQgdmFsdWVzIGhlcmUgKi9cbmZ1bmN0aW9uIHBhcnNlX0NlbGxTdHlsZVhGKGJsb2IsIGxlbmd0aCwgc3R5bGUsIG9wdHMpIHtcblx0dmFyIG8gPSB7fTtcblx0dmFyIGEgPSBibG9iLnJlYWRfc2hpZnQoNCksIGIgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBjID0gYmxvYi5yZWFkX3NoaWZ0KDQpLCBkID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRvLnBhdHRlcm5UeXBlID0gWExTRmlsbFBhdHRlcm5bYyA+PiAyNl07XG5cblx0aWYoIW9wdHMuY2VsbFN0eWxlcykgcmV0dXJuIG87XG5cdG8uYWxjID0gYSAmIDB4MDc7XG5cdG8uZldyYXAgPSAoYSA+PiAzKSAmIDB4MDE7XG5cdG8uYWxjViA9IChhID4+IDQpICYgMHgwNztcblx0by5mSnVzdExhc3QgPSAoYSA+PiA3KSAmIDB4MDE7XG5cdG8udHJvdCA9IChhID4+IDgpICYgMHhGRjtcblx0by5jSW5kZW50ID0gKGEgPj4gMTYpICYgMHgwRjtcblx0by5mU2hyaW5rVG9GaXQgPSAoYSA+PiAyMCkgJiAweDAxO1xuXHRvLmlSZWFkT3JkZXIgPSAoYSA+PiAyMikgJiAweDAyO1xuXHRvLmZBdHJOdW0gPSAoYSA+PiAyNikgJiAweDAxO1xuXHRvLmZBdHJGbnQgPSAoYSA+PiAyNykgJiAweDAxO1xuXHRvLmZBdHJBbGMgPSAoYSA+PiAyOCkgJiAweDAxO1xuXHRvLmZBdHJCZHIgPSAoYSA+PiAyOSkgJiAweDAxO1xuXHRvLmZBdHJQYXQgPSAoYSA+PiAzMCkgJiAweDAxO1xuXHRvLmZBdHJQcm90ID0gKGEgPj4gMzEpICYgMHgwMTtcblxuXHRvLmRnTGVmdCA9IGIgJiAweDBGO1xuXHRvLmRnUmlnaHQgPSAoYiA+PiA0KSAmIDB4MEY7XG5cdG8uZGdUb3AgPSAoYiA+PiA4KSAmIDB4MEY7XG5cdG8uZGdCb3R0b20gPSAoYiA+PiAxMikgJiAweDBGO1xuXHRvLmljdkxlZnQgPSAoYiA+PiAxNikgJiAweDdGO1xuXHRvLmljdlJpZ2h0ID0gKGIgPj4gMjMpICYgMHg3Rjtcblx0by5ncmJpdERpYWcgPSAoYiA+PiAzMCkgJiAweDAzO1xuXG5cdG8uaWN2VG9wID0gYyAmIDB4N0Y7XG5cdG8uaWN2Qm90dG9tID0gKGMgPj4gNykgJiAweDdGO1xuXHRvLmljdkRpYWcgPSAoYyA+PiAxNCkgJiAweDdGO1xuXHRvLmRnRGlhZyA9IChjID4+IDIxKSAmIDB4MEY7XG5cblx0by5pY3ZGb3JlID0gZCAmIDB4N0Y7XG5cdG8uaWN2QmFjayA9IChkID4+IDcpICYgMHg3Rjtcblx0by5mc3hCdXR0b24gPSAoZCA+PiAxNCkgJiAweDAxO1xuXHRyZXR1cm4gbztcbn1cbi8vZnVuY3Rpb24gcGFyc2VfQ2VsbFhGKGJsb2IsIGxlbmd0aCwgb3B0cykge3JldHVybiBwYXJzZV9DZWxsU3R5bGVYRihibG9iLGxlbmd0aCwwLCBvcHRzKTt9XG4vL2Z1bmN0aW9uIHBhcnNlX1N0eWxlWEYoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7cmV0dXJuIHBhcnNlX0NlbGxTdHlsZVhGKGJsb2IsbGVuZ3RoLDEsIG9wdHMpO31cblxuLyogW01TLVhMU10gMi40LjM1MyBUT0RPOiBhY3R1YWxseSBkbyB0aGlzIHJpZ2h0ICovXG5mdW5jdGlvbiBwYXJzZV9YRihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIG8gPSB7fTtcblx0by5pZm50ID0gYmxvYi5yZWFkX3NoaWZ0KDIpOyBvLm51bUZtdElkID0gYmxvYi5yZWFkX3NoaWZ0KDIpOyBvLmZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRvLmZTdHlsZSA9IChvLmZsYWdzID4+IDIpICYgMHgwMTtcblx0bGVuZ3RoIC09IDY7XG5cdG8uZGF0YSA9IHBhcnNlX0NlbGxTdHlsZVhGKGJsb2IsIGxlbmd0aCwgby5mU3R5bGUsIG9wdHMpO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX1hGKGRhdGEsIGl4ZmVQLCBvcHRzLCBvKSB7XG5cdHZhciBiNSA9IChvcHRzICYmIChvcHRzLmJpZmYgPT0gNSkpO1xuXHRpZighbykgbyA9IG5ld19idWYoYjUgPyAxNiA6IDIwKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0aWYoZGF0YS5zdHlsZSkge1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgKGRhdGEubnVtRm10SWR8fDApKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDB4RkZGNCk7XG5cdH0gZWxzZSB7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAoZGF0YS5udW1GbXRJZHx8MCkpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgKGl4ZmVQPDw0KSk7XG5cdH1cblx0dmFyIGYgPSAwO1xuXHRpZihkYXRhLm51bUZtdElkID4gMCAmJiBiNSkgZiB8PSAweDA0MDA7XG5cdG8ud3JpdGVfc2hpZnQoNCwgZik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdGlmKCFiNSkgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xMzQgKi9cbmZ1bmN0aW9uIHBhcnNlX0d1dHMoYmxvYikge1xuXHRibG9iLmwgKz0gNDtcblx0dmFyIG91dCA9IFtibG9iLnJlYWRfc2hpZnQoMiksIGJsb2IucmVhZF9zaGlmdCgyKV07XG5cdGlmKG91dFswXSAhPT0gMCkgb3V0WzBdLS07XG5cdGlmKG91dFsxXSAhPT0gMCkgb3V0WzFdLS07XG5cdGlmKG91dFswXSA+IDcgfHwgb3V0WzFdID4gNykgdGhyb3cgbmV3IEVycm9yKFwiQmFkIEd1dHRlcnM6IFwiICsgb3V0LmpvaW4oXCJ8XCIpKTtcblx0cmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHdyaXRlX0d1dHMoZ3V0cy8qOkFycmF5PG51bWJlcj4qLykge1xuXHR2YXIgbyA9IG5ld19idWYoOCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZ3V0c1swXSA/IGd1dHNbMF0gKyAxIDogMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZ3V0c1sxXSA/IGd1dHNbMV0gKyAxIDogMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMjQgKi9cbmZ1bmN0aW9uIHBhcnNlX0Jvb2xFcnIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0aWYob3B0cy5iaWZmID09IDIgfHwgbGVuZ3RoID09IDkpICsrYmxvYi5sO1xuXHR2YXIgdmFsID0gcGFyc2VfQmVzKGJsb2IsIDIpO1xuXHRjZWxsLnZhbCA9IHZhbDtcblx0Y2VsbC50ID0gKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IGZhbHNlKSA/ICdiJyA6ICdlJztcblx0cmV0dXJuIGNlbGw7XG59XG5mdW5jdGlvbiB3cml0ZV9Cb29sRXJyKFIvKjpudW1iZXIqLywgQy8qOm51bWJlciovLCB2LCBvcy8qOm51bWJlciovLCBvcHRzLCB0Lyo6c3RyaW5nKi8pIHtcblx0dmFyIG8gPSBuZXdfYnVmKDgpO1xuXHR3cml0ZV9YTFNDZWxsKFIsIEMsIG9zLCBvKTtcblx0d3JpdGVfQmVzKHYsIHQsIG8pO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjE4MCBOdW1iZXIgKi9cbmZ1bmN0aW9uIHBhcnNlX051bWJlcihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmZ3Vlc3MgJiYgb3B0cy5iaWZmID09IDIpIG9wdHMuYmlmZiA9IDU7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0dmFyIHhudW0gPSBwYXJzZV9YbnVtKGJsb2IsIDgpO1xuXHRjZWxsLnZhbCA9IHhudW07XG5cdHJldHVybiBjZWxsO1xufVxuZnVuY3Rpb24gd3JpdGVfTnVtYmVyKFIvKjpudW1iZXIqLywgQy8qOm51bWJlciovLCB2LCBvcy8qOjogOm51bWJlciwgb3B0cyovKSB7XG5cdHZhciBvID0gbmV3X2J1ZigxNCk7XG5cdHdyaXRlX1hMU0NlbGwoUiwgQywgb3MsIG8pO1xuXHR3cml0ZV9YbnVtKHYsIG8pO1xuXHRyZXR1cm4gbztcbn1cblxudmFyIHBhcnNlX1hMSGVhZGVyRm9vdGVyID0gcGFyc2VfT3B0WExVbmljb2RlU3RyaW5nOyAvLyBUT0RPOiBwYXJzZSAyLjQuMTM2XG5cbi8qIFtNUy1YTFNdIDIuNC4yNzEgKi9cbmZ1bmN0aW9uIHBhcnNlX1N1cEJvb2soYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBjdGFiID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgY2NoID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRvcHRzLnNiY2NoID0gY2NoO1xuXHRpZihjY2ggPT0gMHgwNDAxIHx8IGNjaCA9PSAweDNBMDEpIHJldHVybiBbY2NoLCBjdGFiXTtcblx0aWYoY2NoIDwgMHgwMSB8fCBjY2ggPjB4ZmYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgU3VwQm9vayB0eXBlOiBcIitjY2gpO1xuXHR2YXIgdmlydFBhdGggPSBwYXJzZV9YTFVuaWNvZGVTdHJpbmdOb0NjaChibG9iLCBjY2gpO1xuXHQvKiBUT0RPOiAyLjUuMjc3IFZpcnR1YWwgUGF0aCAqL1xuXHR2YXIgcmdzdCA9IFtdO1xuXHR3aGlsZShlbmQgPiBibG9iLmwpIHJnc3QucHVzaChwYXJzZV9YTFVuaWNvZGVTdHJpbmcoYmxvYikpO1xuXHRyZXR1cm4gW2NjaCwgY3RhYiwgdmlydFBhdGgsIHJnc3RdO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTA1IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0V4dGVybk5hbWUoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGJvZHk7XG5cdHZhciBvID0gKHtcblx0XHRmQnVpbHRJbjogZmxhZ3MgJiAweDAxLFxuXHRcdGZXYW50QWR2aXNlOiAoZmxhZ3MgPj4+IDEpICYgMHgwMSxcblx0XHRmV2FudFBpY3Q6IChmbGFncyA+Pj4gMikgJiAweDAxLFxuXHRcdGZPbGU6IChmbGFncyA+Pj4gMykgJiAweDAxLFxuXHRcdGZPbGVMaW5rOiAoZmxhZ3MgPj4+IDQpICYgMHgwMSxcblx0XHRjZjogKGZsYWdzID4+PiA1KSAmIDB4M0ZGLFxuXHRcdGZJY29uOiBmbGFncyA+Pj4gMTUgJiAweDAxXG5cdH0vKjphbnkqLyk7XG5cdGlmKG9wdHMuc2JjY2ggPT09IDB4M0EwMSkgYm9keSA9IHBhcnNlX0FkZGluVWRmKGJsb2IsIGxlbmd0aC0yLCBvcHRzKTtcblx0Ly9lbHNlIHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIFN1cEJvb2sgY2NoOiBcIiArIG9wdHMuc2JjY2gpO1xuXHRvLmJvZHkgPSBib2R5IHx8IGJsb2IucmVhZF9zaGlmdChsZW5ndGgtMik7XG5cdGlmKHR5cGVvZiBib2R5ID09PSBcInN0cmluZ1wiKSBvLk5hbWUgPSBib2R5O1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjE1MCBUT0RPICovXG52YXIgWExTTGJsQnVpbHRJbiA9IFtcblx0XCJfeGxubS5Db25zb2xpZGF0ZV9BcmVhXCIsXG5cdFwiX3hsbm0uQXV0b19PcGVuXCIsXG5cdFwiX3hsbm0uQXV0b19DbG9zZVwiLFxuXHRcIl94bG5tLkV4dHJhY3RcIixcblx0XCJfeGxubS5EYXRhYmFzZVwiLFxuXHRcIl94bG5tLkNyaXRlcmlhXCIsXG5cdFwiX3hsbm0uUHJpbnRfQXJlYVwiLFxuXHRcIl94bG5tLlByaW50X1RpdGxlc1wiLFxuXHRcIl94bG5tLlJlY29yZGVyXCIsXG5cdFwiX3hsbm0uRGF0YV9Gb3JtXCIsXG5cdFwiX3hsbm0uQXV0b19BY3RpdmF0ZVwiLFxuXHRcIl94bG5tLkF1dG9fRGVhY3RpdmF0ZVwiLFxuXHRcIl94bG5tLlNoZWV0X1RpdGxlXCIsXG5cdFwiX3hsbm0uX0ZpbHRlckRhdGFiYXNlXCJcbl07XG5mdW5jdGlvbiBwYXJzZV9MYmwoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGNoS2V5ID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHR2YXIgY2NoID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHR2YXIgY2NlID0gYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAxIDogMik7XG5cdHZhciBpdGFiID0gMDtcblx0aWYoIW9wdHMgfHwgb3B0cy5iaWZmID49IDUpIHtcblx0XHRpZihvcHRzLmJpZmYgIT0gNSkgYmxvYi5sICs9IDI7XG5cdFx0aXRhYiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHRpZihvcHRzLmJpZmYgPT0gNSkgYmxvYi5sICs9IDI7XG5cdFx0YmxvYi5sICs9IDQ7XG5cdH1cblx0dmFyIG5hbWUgPSBwYXJzZV9YTFVuaWNvZGVTdHJpbmdOb0NjaChibG9iLCBjY2gsIG9wdHMpO1xuXHRpZihmbGFncyAmIDB4MjApIG5hbWUgPSBYTFNMYmxCdWlsdEluW25hbWUuY2hhckNvZGVBdCgwKV07XG5cdHZhciBucGZsZW4gPSB0YXJnZXQgLSBibG9iLmw7IGlmKG9wdHMgJiYgb3B0cy5iaWZmID09IDIpIC0tbnBmbGVuO1xuXHQvKmpzaGludCAtVzAxOCAqL1xuXHR2YXIgcmdjZSA9ICh0YXJnZXQgPT0gYmxvYi5sIHx8IGNjZSA9PT0gMCB8fCAhKG5wZmxlbiA+IDApKSA/IFtdIDogcGFyc2VfTmFtZVBhcnNlZEZvcm11bGEoYmxvYiwgbnBmbGVuLCBvcHRzLCBjY2UpO1xuXHQvKmpzaGludCArVzAxOCAqL1xuXHRyZXR1cm4ge1xuXHRcdGNoS2V5OiBjaEtleSxcblx0XHROYW1lOiBuYW1lLFxuXHRcdGl0YWI6IGl0YWIsXG5cdFx0cmdjZTogcmdjZVxuXHR9O1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTA2IFRPRE86IHZlcmlmeSBmaWxlbmFtZSBlbmNvZGluZyAqL1xuZnVuY3Rpb24gcGFyc2VfRXh0ZXJuU2hlZXQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGlmKG9wdHMuYmlmZiA8IDgpIHJldHVybiBwYXJzZV9CSUZGNUV4dGVyblNoZWV0KGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdHZhciBvID0gW10sIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aCwgbGVuID0gYmxvYi5yZWFkX3NoaWZ0KG9wdHMuYmlmZiA+IDggPyA0IDogMik7XG5cdHdoaWxlKGxlbi0tICE9PSAwKSBvLnB1c2gocGFyc2VfWFRJKGJsb2IsIG9wdHMuYmlmZiA+IDggPyAxMiA6IDYsIG9wdHMpKTtcblx0XHQvLyBbaVN1cEJvb2ssIGl0YWJGaXJzdCwgaXRhYkxhc3RdO1xuXHRpZihibG9iLmwgIT0gdGFyZ2V0KSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgRXh0ZXJuU2hlZXQ6IFwiICsgYmxvYi5sICsgXCIgIT0gXCIgKyB0YXJnZXQpO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHBhcnNlX0JJRkY1RXh0ZXJuU2hlZXQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGlmKGJsb2JbYmxvYi5sICsgMV0gPT0gMHgwMykgYmxvYltibG9iLmxdKys7XG5cdHZhciBvID0gcGFyc2VfU2hvcnRYTFVuaWNvZGVTdHJpbmcoYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0cmV0dXJuIG8uY2hhckNvZGVBdCgwKSA9PSAweDAzID8gby5zbGljZSgxKSA6IG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xNzYgVE9ETzogY2hlY2sgb2xkZXIgYmlmZiAqL1xuZnVuY3Rpb24gcGFyc2VfTmFtZUNtdChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmIDwgOCkgeyBibG9iLmwgKz0gbGVuZ3RoOyByZXR1cm47IH1cblx0dmFyIGNjaE5hbWUgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjY2hDb21tZW50ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgbmFtZSA9IHBhcnNlX1hMVW5pY29kZVN0cmluZ05vQ2NoKGJsb2IsIGNjaE5hbWUsIG9wdHMpO1xuXHR2YXIgY29tbWVudCA9IHBhcnNlX1hMVW5pY29kZVN0cmluZ05vQ2NoKGJsb2IsIGNjaENvbW1lbnQsIG9wdHMpO1xuXHRyZXR1cm4gW25hbWUsIGNvbW1lbnRdO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMjYwICovXG5mdW5jdGlvbiBwYXJzZV9TaHJGbWxhKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgcmVmID0gcGFyc2VfUmVmVShibG9iLCA2KTtcblx0YmxvYi5sKys7XG5cdHZhciBjVXNlID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRsZW5ndGggLT0gODtcblx0cmV0dXJuIFtwYXJzZV9TaGFyZWRQYXJzZWRGb3JtdWxhKGJsb2IsIGxlbmd0aCwgb3B0cyksIGNVc2UsIHJlZl07XG59XG5cbi8qIFtNUy1YTFNdIDIuNC40IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0FycmF5KGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgcmVmID0gcGFyc2VfUmVmKGJsb2IsIDYpO1xuXHQvKiBUT0RPOiBmQWx3YXlzQ2FsYyAqL1xuXHRzd2l0Y2gob3B0cy5iaWZmKSB7XG5cdFx0Y2FzZSAyOiBibG9iLmwgKys7IGxlbmd0aCAtPSA3OyBicmVhaztcblx0XHRjYXNlIDM6IGNhc2UgNDogYmxvYi5sICs9IDI7IGxlbmd0aCAtPSA4OyBicmVhaztcblx0XHRkZWZhdWx0OiBibG9iLmwgKz0gNjsgbGVuZ3RoIC09IDEyO1xuXHR9XG5cdHJldHVybiBbcmVmLCBwYXJzZV9BcnJheVBhcnNlZEZvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzLCByZWYpXTtcbn1cblxuLyogW01TLVhMU10gMi40LjE3MyAqL1xuZnVuY3Rpb24gcGFyc2VfTVRSU2V0dGluZ3MoYmxvYikge1xuXHR2YXIgZk1UUkVuYWJsZWQgPSBibG9iLnJlYWRfc2hpZnQoNCkgIT09IDB4MDA7XG5cdHZhciBmVXNlclNldFRocmVhZENvdW50ID0gYmxvYi5yZWFkX3NoaWZ0KDQpICE9PSAweDAwO1xuXHR2YXIgY1VzZXJUaHJlYWRDb3VudCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0cmV0dXJuIFtmTVRSRW5hYmxlZCwgZlVzZXJTZXRUaHJlYWRDb3VudCwgY1VzZXJUaHJlYWRDb3VudF07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xODYgVE9ETzogQklGRjUgKi9cbmZ1bmN0aW9uIHBhcnNlX05vdGVTaChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmIDwgOCkgcmV0dXJuO1xuXHR2YXIgcm93ID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCBjb2wgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKSwgaWRPYmogPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBzdEF1dGhvciA9IHBhcnNlX1hMVW5pY29kZVN0cmluZzIoYmxvYiwgMCwgb3B0cyk7XG5cdGlmKG9wdHMuYmlmZiA8IDgpIGJsb2IucmVhZF9zaGlmdCgxKTtcblx0cmV0dXJuIFt7cjpyb3csYzpjb2x9LCBzdEF1dGhvciwgaWRPYmosIGZsYWdzXTtcbn1cblxuLyogW01TLVhMU10gMi40LjE3OSAqL1xuZnVuY3Rpb24gcGFyc2VfTm90ZShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0LyogVE9ETzogU3VwcG9ydCByZXZpc2lvbnMgKi9cblx0cmV0dXJuIHBhcnNlX05vdGVTaChibG9iLCBsZW5ndGgsIG9wdHMpO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTY4ICovXG5mdW5jdGlvbiBwYXJzZV9NZXJnZUNlbGxzKGJsb2IsIGxlbmd0aCkvKjpBcnJheTxSYW5nZT4qLyB7XG5cdHZhciBtZXJnZXMvKjpBcnJheTxSYW5nZT4qLyA9IFtdO1xuXHR2YXIgY21jcyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0d2hpbGUgKGNtY3MtLSkgbWVyZ2VzLnB1c2gocGFyc2VfUmVmOFUoYmxvYixsZW5ndGgpKTtcblx0cmV0dXJuIG1lcmdlcztcbn1cbmZ1bmN0aW9uIHdyaXRlX01lcmdlQ2VsbHMobWVyZ2VzLyo6QXJyYXk8UmFuZ2U+Ki8pIHtcblx0dmFyIG8gPSBuZXdfYnVmKDIgKyBtZXJnZXMubGVuZ3RoICogOCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgbWVyZ2VzLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBtZXJnZXMubGVuZ3RoOyArK2kpIHdyaXRlX1JlZjhVKG1lcmdlc1tpXSwgbyk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTgxIFRPRE86IHBhcnNlIGFsbCB0aGUgdGhpbmdzISAqL1xuZnVuY3Rpb24gcGFyc2VfT2JqKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzICYmIG9wdHMuYmlmZiA8IDgpIHJldHVybiBwYXJzZV9CSUZGNU9iaihibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHR2YXIgY21vID0gcGFyc2VfRnRDbW8oYmxvYiwgMjIpOyAvLyBpZCwgb3QsIGZsYWdzXG5cdHZhciBmdHMgPSBwYXJzZV9GdEFycmF5KGJsb2IsIGxlbmd0aC0yMiwgY21vWzFdKTtcblx0cmV0dXJuIHsgY21vOiBjbW8sIGZ0OmZ0cyB9O1xufVxuLyogZnJvbSBvbGRlciBzcGVjICovXG52YXIgcGFyc2VfQklGRjVPVCA9IHtcbjB4MDg6IGZ1bmN0aW9uKGJsb2IsIGxlbmd0aCkge1xuXHR2YXIgdGd0ID0gYmxvYi5sICsgbGVuZ3RoO1xuXHRibG9iLmwgKz0gMTA7IC8vIHRvZG9cblx0dmFyIGNmID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gNDtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGNiUGljdEZtbGEgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyO1xuXHRibG9iLmwgKz0gMjsgLy92YXIgZ3JiaXQgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSA0O1xuXHR2YXIgY2NoTmFtZSA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0YmxvYi5sICs9IGNjaE5hbWU7IC8vIFRPRE86IHN0TmFtZVxuXHRibG9iLmwgPSB0Z3Q7IC8vIFRPRE86IGZtbGFcblx0cmV0dXJuIHsgZm10OmNmIH07XG59XG59O1xuXG5mdW5jdGlvbiBwYXJzZV9CSUZGNU9iaihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0YmxvYi5sICs9IDQ7IC8vdmFyIGNudCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIG90ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgaWQgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBncmJpdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGNvbEwgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciBkeEwgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciByd1QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciBkeVQgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciBjb2xSID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjsgLy92YXIgZHhSID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjsgLy92YXIgcndCID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjsgLy92YXIgZHlCID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjsgLy92YXIgY2JNYWNybyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDY7XG5cdGxlbmd0aCAtPSAzNjtcblx0dmFyIGZ0cyA9IFtdO1xuXHRmdHMucHVzaCgocGFyc2VfQklGRjVPVFtvdF18fHBhcnNlbm9vcCkoYmxvYiwgbGVuZ3RoLCBvcHRzKSk7XG5cdHJldHVybiB7IGNtbzogW2lkLCBvdCwgZ3JiaXRdLCBmdDpmdHMgfTtcbn1cblxuLyogW01TLVhMU10gMi40LjMyOSBUT0RPOiBwYXJzZSBwcm9wZXJseSAqL1xuZnVuY3Rpb24gcGFyc2VfVHhPKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgcyA9IGJsb2IubDtcblx0dmFyIHRleHRzID0gXCJcIjtcbnRyeSB7XG5cdGJsb2IubCArPSA0O1xuXHR2YXIgb3QgPSAob3B0cy5sYXN0b2JqfHx7Y21vOlswLDBdfSkuY21vWzFdO1xuXHR2YXIgY29udHJvbEluZm87IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblx0aWYoWzAsNSw3LDExLDEyLDE0XS5pbmRleE9mKG90KSA9PSAtMSkgYmxvYi5sICs9IDY7XG5cdGVsc2UgY29udHJvbEluZm8gPSBwYXJzZV9Db250cm9sSW5mbyhibG9iLCA2LCBvcHRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXHR2YXIgY2NoVGV4dCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0Lyp2YXIgY2JSdW5zID0gKi9ibG9iLnJlYWRfc2hpZnQoMik7XG5cdC8qdmFyIGlmbnRFbXB0eSA9ICovcGFyc2V1aW50MTYoYmxvYiwgMik7XG5cdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSBsZW47XG5cdC8vdmFyIGZtbGEgPSBwYXJzZV9PYmpGbWxhKGJsb2IsIHMgKyBsZW5ndGggLSBibG9iLmwpO1xuXG5cdGZvcih2YXIgaSA9IDE7IGkgPCBibG9iLmxlbnMubGVuZ3RoLTE7ICsraSkge1xuXHRcdGlmKGJsb2IubC1zICE9IGJsb2IubGVuc1tpXSkgdGhyb3cgbmV3IEVycm9yKFwiVHhPOiBiYWQgY29udGludWUgcmVjb3JkXCIpO1xuXHRcdHZhciBoZHIgPSBibG9iW2Jsb2IubF07XG5cdFx0dmFyIHQgPSBwYXJzZV9YTFVuaWNvZGVTdHJpbmdOb0NjaChibG9iLCBibG9iLmxlbnNbaSsxXS1ibG9iLmxlbnNbaV0tMSk7XG5cdFx0dGV4dHMgKz0gdDtcblx0XHRpZih0ZXh0cy5sZW5ndGggPj0gKGhkciA/IGNjaFRleHQgOiAyKmNjaFRleHQpKSBicmVhaztcblx0fVxuXHRpZih0ZXh0cy5sZW5ndGggIT09IGNjaFRleHQgJiYgdGV4dHMubGVuZ3RoICE9PSBjY2hUZXh0KjIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjY2hUZXh0OiBcIiArIGNjaFRleHQgKyBcIiAhPSBcIiArIHRleHRzLmxlbmd0aCk7XG5cdH1cblxuXHRibG9iLmwgPSBzICsgbGVuZ3RoO1xuXHQvKiBbTVMtWExTXSAyLjUuMjcyIFR4T1J1bnMgKi9cbi8vXHR2YXIgcmdUeG9SdW5zID0gW107XG4vL1x0Zm9yKHZhciBqID0gMDsgaiAhPSBjYlJ1bnMvOC0xOyArK2opIGJsb2IubCArPSA4O1xuLy9cdHZhciBjY2hUZXh0MiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcbi8vXHRpZihjY2hUZXh0MiAhPT0gY2NoVGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiVHhPTGFzdFJ1biBtaXNtYXRjaDogXCIgKyBjY2hUZXh0MiArIFwiIFwiICsgY2NoVGV4dCk7XG4vL1x0YmxvYi5sICs9IDY7XG4vL1x0aWYocyArIGxlbmd0aCAhPSBibG9iLmwpIHRocm93IG5ldyBFcnJvcihcIlR4TyBcIiArIChzICsgbGVuZ3RoKSArIFwiLCBhdCBcIiArIGJsb2IubCk7XG5cdHJldHVybiB7IHQ6IHRleHRzIH07XG59IGNhdGNoKGUpIHsgYmxvYi5sID0gcyArIGxlbmd0aDsgcmV0dXJuIHsgdDogdGV4dHMgfTsgfVxufVxuXG4vKiBbTVMtWExTXSAyLjQuMTQwICovXG5mdW5jdGlvbiBwYXJzZV9ITGluayhibG9iLCBsZW5ndGgpIHtcblx0dmFyIHJlZiA9IHBhcnNlX1JlZjhVKGJsb2IsIDgpO1xuXHRibG9iLmwgKz0gMTY7IC8qIENMU0lEICovXG5cdHZhciBobGluayA9IHBhcnNlX0h5cGVybGluayhibG9iLCBsZW5ndGgtMjQpO1xuXHRyZXR1cm4gW3JlZiwgaGxpbmtdO1xufVxuZnVuY3Rpb24gd3JpdGVfSExpbmsoaGwpIHtcblx0dmFyIE8gPSBuZXdfYnVmKDI0KTtcblx0dmFyIHJlZiA9IGRlY29kZV9jZWxsKGhsWzBdKTtcblx0Ty53cml0ZV9zaGlmdCgyLCByZWYucik7IE8ud3JpdGVfc2hpZnQoMiwgcmVmLnIpO1xuXHRPLndyaXRlX3NoaWZ0KDIsIHJlZi5jKTsgTy53cml0ZV9zaGlmdCgyLCByZWYuYyk7XG5cdHZhciBjbHNpZCA9IFwiZDAgYzkgZWEgNzkgZjkgYmEgY2UgMTEgOGMgODIgMDAgYWEgMDAgNGIgYTkgMGJcIi5zcGxpdChcIiBcIik7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBPLndyaXRlX3NoaWZ0KDEsIHBhcnNlSW50KGNsc2lkW2ldLCAxNikpO1xuXHRyZXR1cm4gYmNvbmNhdChbTywgd3JpdGVfSHlwZXJsaW5rKGhsWzFdKV0pO1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNC4xNDEgKi9cbmZ1bmN0aW9uIHBhcnNlX0hMaW5rVG9vbHRpcChibG9iLCBsZW5ndGgpIHtcblx0YmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgcmVmID0gcGFyc2VfUmVmOFUoYmxvYiwgOCk7XG5cdHZhciB3elRvb2x0aXAgPSBibG9iLnJlYWRfc2hpZnQoKGxlbmd0aC0xMCkvMiwgJ2RiY3MtY29udCcpO1xuXHR3elRvb2x0aXAgPSB3elRvb2x0aXAucmVwbGFjZShjaHIwLFwiXCIpO1xuXHRyZXR1cm4gW3JlZiwgd3pUb29sdGlwXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0hMaW5rVG9vbHRpcChobCkge1xuXHR2YXIgVFQgPSBobFsxXS5Ub29sdGlwO1xuXHR2YXIgTyA9IG5ld19idWYoMTAgKyAyICogKFRULmxlbmd0aCArIDEpKTtcblx0Ty53cml0ZV9zaGlmdCgyLCAweDA4MDApO1xuXHR2YXIgcmVmID0gZGVjb2RlX2NlbGwoaGxbMF0pO1xuXHRPLndyaXRlX3NoaWZ0KDIsIHJlZi5yKTsgTy53cml0ZV9zaGlmdCgyLCByZWYucik7XG5cdE8ud3JpdGVfc2hpZnQoMiwgcmVmLmMpOyBPLndyaXRlX3NoaWZ0KDIsIHJlZi5jKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IFRULmxlbmd0aDsgKytpKSBPLndyaXRlX3NoaWZ0KDIsIFRULmNoYXJDb2RlQXQoaSkpO1xuXHRPLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRyZXR1cm4gTztcbn1cblxuLyogW01TLVhMU10gMi40LjYzICovXG5mdW5jdGlvbiBwYXJzZV9Db3VudHJ5KGJsb2IpLyo6W3N0cmluZ3xudW1iZXIsIHN0cmluZ3xudW1iZXJdKi8ge1xuXHR2YXIgbyA9IFswLDBdLCBkO1xuXHRkID0gYmxvYi5yZWFkX3NoaWZ0KDIpOyBvWzBdID0gQ291bnRyeUVudW1bZF0gfHwgZDtcblx0ZCA9IGJsb2IucmVhZF9zaGlmdCgyKTsgb1sxXSA9IENvdW50cnlFbnVtW2RdIHx8IGQ7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gd3JpdGVfQ291bnRyeShvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1Zig0KTtcblx0by53cml0ZV9zaGlmdCgyLCAweDAxKTtcblx0by53cml0ZV9zaGlmdCgyLCAweDAxKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC41MCBDbHJ0Q2xpZW50ICovXG5mdW5jdGlvbiBwYXJzZV9DbHJ0Q2xpZW50KGJsb2IpIHtcblx0dmFyIGNjdiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIG8gPSBbXTtcblx0d2hpbGUoY2N2LS0+MCkgby5wdXNoKHBhcnNlX0xvbmdSR0IoYmxvYiwgOCkpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjE4OCAqL1xuZnVuY3Rpb24gcGFyc2VfUGFsZXR0ZShibG9iKSB7XG5cdHZhciBjY3YgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBvID0gW107XG5cdHdoaWxlKGNjdi0tPjApIG8ucHVzaChwYXJzZV9Mb25nUkdCKGJsb2IsIDgpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4zNTQgKi9cbmZ1bmN0aW9uIHBhcnNlX1hGQ1JDKGJsb2IpIHtcblx0YmxvYi5sICs9IDI7XG5cdHZhciBvID0ge2N4ZnM6MCwgY3JjOjB9O1xuXHRvLmN4ZnMgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdG8uY3JjID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjUzIFRPRE86IHBhcnNlIGZsYWdzICovXG4vKiBbTVMtWExTQl0gMi40LjMyMyBUT0RPOiBwYXJzZSBmbGFncyAqL1xuZnVuY3Rpb24gcGFyc2VfQ29sSW5mbyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYoIW9wdHMuY2VsbFN0eWxlcykgcmV0dXJuIHBhcnNlbm9vcChibG9iLCBsZW5ndGgpO1xuXHR2YXIgdyA9IG9wdHMgJiYgb3B0cy5iaWZmID49IDEyID8gNCA6IDI7XG5cdHZhciBjb2xGaXJzdCA9IGJsb2IucmVhZF9zaGlmdCh3KTtcblx0dmFyIGNvbExhc3QgPSBibG9iLnJlYWRfc2hpZnQodyk7XG5cdHZhciBjb2xkeCA9IGJsb2IucmVhZF9zaGlmdCh3KTtcblx0dmFyIGl4ZmUgPSBibG9iLnJlYWRfc2hpZnQodyk7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0aWYodyA9PSAyKSBibG9iLmwgKz0gMjtcblx0dmFyIG8gPSAoe3M6Y29sRmlyc3QsIGU6Y29sTGFzdCwgdzpjb2xkeCwgaXhmZTppeGZlLCBmbGFnczpmbGFnc30vKjphbnkqLyk7XG5cdGlmKG9wdHMuYmlmZiA+PSA1IHx8ICFvcHRzLmJpZmYpIG8ubGV2ZWwgPSAoZmxhZ3MgPj4gOCkgJiAweDc7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gd3JpdGVfQ29sSW5mbyhjb2wsIGlkeCkge1xuXHR2YXIgbyA9IG5ld19idWYoMTIpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIGlkeCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgaWR4KTtcblx0by53cml0ZV9zaGlmdCgyLCBjb2wud2lkdGggKiAyNTYpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHR2YXIgZiA9IDA7XG5cdGlmKGNvbC5oaWRkZW4pIGYgfD0gMTtcblx0by53cml0ZV9zaGlmdCgxLCBmKTtcblx0ZiA9IGNvbC5sZXZlbCB8fCAwO1xuXHRvLndyaXRlX3NoaWZ0KDEsIGYpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjI1NyAqL1xuZnVuY3Rpb24gcGFyc2VfU2V0dXAoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBvID0ge307XG5cdGlmKGxlbmd0aCA8IDMyKSByZXR1cm4gbztcblx0YmxvYi5sICs9IDE2O1xuXHRvLmhlYWRlciA9IHBhcnNlX1hudW0oYmxvYiwgOCk7XG5cdG8uZm9vdGVyID0gcGFyc2VfWG51bShibG9iLCA4KTtcblx0YmxvYi5sICs9IDI7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMjYxICovXG5mdW5jdGlvbiBwYXJzZV9TaHRQcm9wcyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGRlZiA9IHthcmVhOmZhbHNlfTtcblx0aWYob3B0cy5iaWZmICE9IDUpIHsgYmxvYi5sICs9IGxlbmd0aDsgcmV0dXJuIGRlZjsgfVxuXHR2YXIgZCA9IGJsb2IucmVhZF9zaGlmdCgxKTsgYmxvYi5sICs9IDM7XG5cdGlmKChkICYgMHgxMCkpIGRlZi5hcmVhID0gdHJ1ZTtcblx0cmV0dXJuIGRlZjtcbn1cblxuLyogW01TLVhMU10gMi40LjI0MSAqL1xuZnVuY3Rpb24gd3JpdGVfUlJUYWJJZChuLyo6bnVtYmVyKi8pIHtcblx0dmFyIG91dCA9IG5ld19idWYoMiAqIG4pO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBvdXQud3JpdGVfc2hpZnQoMiwgaSsxKTtcblx0cmV0dXJuIG91dDtcbn1cblxudmFyIHBhcnNlX0JsYW5rID0gcGFyc2VfWExTQ2VsbDsgLyogW01TLVhMU10gMi40LjIwIEp1c3QgdGhlIGNlbGwgKi9cbnZhciBwYXJzZV9TY2wgPSBwYXJzZXVpbnQxNmE7IC8qIFtNUy1YTFNdIDIuNC4yNDcgbnVtLCBkZW4gKi9cbnZhciBwYXJzZV9TdHJpbmcgPSBwYXJzZV9YTFVuaWNvZGVTdHJpbmc7IC8qIFtNUy1YTFNdIDIuNC4yNjggKi9cblxuLyogLS0tIFNwZWNpZmljIHRvIHZlcnNpb25zIGJlZm9yZSBCSUZGOCAtLS0gKi9cbmZ1bmN0aW9uIHBhcnNlX0ltRGF0YShibG9iKSB7XG5cdHZhciBjZiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGVudiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGxjYiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIG8gPSB7Zm10OmNmLCBlbnY6ZW52LCBsZW46bGNiLCBkYXRhOmJsb2Iuc2xpY2UoYmxvYi5sLGJsb2IubCtsY2IpfTtcblx0YmxvYi5sICs9IGxjYjtcblx0cmV0dXJuIG87XG59XG5cbi8qIEJJRkYyXz8/PyB3aGVyZSA/Pz8gaXMgdGhlIG5hbWUgZnJvbSBbWExTXSAqL1xuZnVuY3Rpb24gcGFyc2VfQklGRjJTVFIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGlmKG9wdHMuYmlmZmd1ZXNzICYmIG9wdHMuYmlmZiA9PSA1KSBvcHRzLmJpZmYgPSAyO1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0NlbGwoYmxvYiwgNik7XG5cdCsrYmxvYi5sO1xuXHR2YXIgc3RyID0gcGFyc2VfWExVbmljb2RlU3RyaW5nMihibG9iLCBsZW5ndGgtNywgb3B0cyk7XG5cdGNlbGwudCA9ICdzdHInO1xuXHRjZWxsLnZhbCA9IHN0cjtcblx0cmV0dXJuIGNlbGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX0JJRkYyTlVNKGJsb2IvKjo6LCBsZW5ndGgqLykge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0NlbGwoYmxvYiwgNik7XG5cdCsrYmxvYi5sO1xuXHR2YXIgbnVtID0gcGFyc2VfWG51bShibG9iLCA4KTtcblx0Y2VsbC50ID0gJ24nO1xuXHRjZWxsLnZhbCA9IG51bTtcblx0cmV0dXJuIGNlbGw7XG59XG5mdW5jdGlvbiB3cml0ZV9CSUZGMk5VTShyLyo6bnVtYmVyKi8sIGMvKjpudW1iZXIqLywgdmFsLyo6bnVtYmVyKi8pIHtcblx0dmFyIG91dCA9IG5ld19idWYoMTUpO1xuXHR3cml0ZV9CSUZGMkNlbGwob3V0LCByLCBjKTtcblx0b3V0LndyaXRlX3NoaWZ0KDgsIHZhbCwgJ2YnKTtcblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gcGFyc2VfQklGRjJJTlQoYmxvYikge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0NlbGwoYmxvYiwgNik7XG5cdCsrYmxvYi5sO1xuXHR2YXIgbnVtID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRjZWxsLnQgPSAnbic7XG5cdGNlbGwudmFsID0gbnVtO1xuXHRyZXR1cm4gY2VsbDtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JJRkYySU5UKHIvKjpudW1iZXIqLywgYy8qOm51bWJlciovLCB2YWwvKjpudW1iZXIqLykge1xuXHR2YXIgb3V0ID0gbmV3X2J1Zig5KTtcblx0d3JpdGVfQklGRjJDZWxsKG91dCwgciwgYyk7XG5cdG91dC53cml0ZV9zaGlmdCgyLCB2YWwpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwYXJzZV9CSUZGMlNUUklORyhibG9iKSB7XG5cdHZhciBjY2ggPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdGlmKGNjaCA9PT0gMCkgeyBibG9iLmwrKzsgcmV0dXJuIFwiXCI7IH1cblx0cmV0dXJuIGJsb2IucmVhZF9zaGlmdChjY2gsICdzYmNzLWNvbnQnKTtcbn1cblxuLyogVE9ETzogY29udmVydCB0byBCSUZGOCBmb250IHN0cnVjdCAqL1xuZnVuY3Rpb24gcGFyc2VfQklGRjJGT05UWFRSQShibG9iLCBsZW5ndGgpIHtcblx0YmxvYi5sICs9IDY7IC8vIHVua25vd25cblx0YmxvYi5sICs9IDI7IC8vIGZvbnQgd2VpZ2h0IFwiYmxzXCJcblx0YmxvYi5sICs9IDE7IC8vIGNoYXJzZXRcblx0YmxvYi5sICs9IDM7IC8vIHVua25vd25cblx0YmxvYi5sICs9IDE7IC8vIGZvbnQgZmFtaWx5XG5cdGJsb2IubCArPSBsZW5ndGggLSAxMztcbn1cblxuLyogVE9ETzogcGFyc2UgcmljaCB0ZXh0IHJ1bnMgKi9cbmZ1bmN0aW9uIHBhcnNlX1JTdHJpbmcoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0dmFyIGNjaCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIHN0ciA9IHBhcnNlX1hMVW5pY29kZVN0cmluZ05vQ2NoKGJsb2IsIGNjaCwgb3B0cyk7XG5cdGJsb2IubCA9IGVuZDtcblx0Y2VsbC50ID0gJ3N0cic7XG5cdGNlbGwudmFsID0gc3RyO1xuXHRyZXR1cm4gY2VsbDtcbn1cbi8qIGZyb20ganMtaGFyYiAoQykgMjAxNC1wcmVzZW50ICBTaGVldEpTICovXG52YXIgREJGX1NVUFBPUlRFRF9WRVJTSU9OUyA9IFsweDAyLCAweDAzLCAweDMwLCAweDMxLCAweDgzLCAweDhCLCAweDhDLCAweEY1XTtcbnZhciBEQkYgPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xudmFyIGRiZl9jb2RlcGFnZV9tYXAgPSB7XG5cdC8qIENvZGUgUGFnZXMgU3VwcG9ydGVkIGJ5IFZpc3VhbCBGb3hQcm8gKi9cblx0Lyo6OlsqLzB4MDEvKjo6XSovOiAgIDQzNywgICAgICAgICAgIC8qOjpbKi8weDAyLyo6Ol0qLzogICA4NTAsXG5cdC8qOjpbKi8weDAzLyo6Ol0qLzogIDEyNTIsICAgICAgICAgICAvKjo6WyovMHgwNC8qOjpdKi86IDEwMDAwLFxuXHQvKjo6WyovMHg2NC8qOjpdKi86ICAgODUyLCAgICAgICAgICAgLyo6OlsqLzB4NjUvKjo6XSovOiAgIDg2Nixcblx0Lyo6OlsqLzB4NjYvKjo6XSovOiAgIDg2NSwgICAgICAgICAgIC8qOjpbKi8weDY3Lyo6Ol0qLzogICA4NjEsXG5cdC8qOjpbKi8weDY4Lyo6Ol0qLzogICA4OTUsICAgICAgICAgICAvKjo6WyovMHg2OS8qOjpdKi86ICAgNjIwLFxuXHQvKjo6WyovMHg2QS8qOjpdKi86ICAgNzM3LCAgICAgICAgICAgLyo6OlsqLzB4NkIvKjo6XSovOiAgIDg1Nyxcblx0Lyo6OlsqLzB4NzgvKjo6XSovOiAgIDk1MCwgICAgICAgICAgIC8qOjpbKi8weDc5Lyo6Ol0qLzogICA5NDksXG5cdC8qOjpbKi8weDdBLyo6Ol0qLzogICA5MzYsICAgICAgICAgICAvKjo6WyovMHg3Qi8qOjpdKi86ICAgOTMyLFxuXHQvKjo6WyovMHg3Qy8qOjpdKi86ICAgODc0LCAgICAgICAgICAgLyo6OlsqLzB4N0QvKjo6XSovOiAgMTI1NSxcblx0Lyo6OlsqLzB4N0UvKjo6XSovOiAgMTI1NiwgICAgICAgICAgIC8qOjpbKi8weDk2Lyo6Ol0qLzogMTAwMDcsXG5cdC8qOjpbKi8weDk3Lyo6Ol0qLzogMTAwMjksICAgICAgICAgICAvKjo6WyovMHg5OC8qOjpdKi86IDEwMDA2LFxuXHQvKjo6WyovMHhDOC8qOjpdKi86ICAxMjUwLCAgICAgICAgICAgLyo6OlsqLzB4QzkvKjo6XSovOiAgMTI1MSxcblx0Lyo6OlsqLzB4Q0EvKjo6XSovOiAgMTI1NCwgICAgICAgICAgIC8qOjpbKi8weENCLyo6Ol0qLzogIDEyNTMsXG5cblx0Lyogc2hhcGVmaWxlIERCRiBleHRlbnNpb24gKi9cblx0Lyo6OlsqLzB4MDAvKjo6XSovOiAyMDEyNywgICAgICAgICAgIC8qOjpbKi8weDA4Lyo6Ol0qLzogICA4NjUsXG5cdC8qOjpbKi8weDA5Lyo6Ol0qLzogICA0MzcsICAgICAgICAgICAvKjo6WyovMHgwQS8qOjpdKi86ICAgODUwLFxuXHQvKjo6WyovMHgwQi8qOjpdKi86ICAgNDM3LCAgICAgICAgICAgLyo6OlsqLzB4MEQvKjo6XSovOiAgIDQzNyxcblx0Lyo6OlsqLzB4MEUvKjo6XSovOiAgIDg1MCwgICAgICAgICAgIC8qOjpbKi8weDBGLyo6Ol0qLzogICA0MzcsXG5cdC8qOjpbKi8weDEwLyo6Ol0qLzogICA4NTAsICAgICAgICAgICAvKjo6WyovMHgxMS8qOjpdKi86ICAgNDM3LFxuXHQvKjo6WyovMHgxMi8qOjpdKi86ICAgODUwLCAgICAgICAgICAgLyo6OlsqLzB4MTMvKjo6XSovOiAgIDkzMixcblx0Lyo6OlsqLzB4MTQvKjo6XSovOiAgIDg1MCwgICAgICAgICAgIC8qOjpbKi8weDE1Lyo6Ol0qLzogICA0MzcsXG5cdC8qOjpbKi8weDE2Lyo6Ol0qLzogICA4NTAsICAgICAgICAgICAvKjo6WyovMHgxNy8qOjpdKi86ICAgODY1LFxuXHQvKjo6WyovMHgxOC8qOjpdKi86ICAgNDM3LCAgICAgICAgICAgLyo6OlsqLzB4MTkvKjo6XSovOiAgIDQzNyxcblx0Lyo6OlsqLzB4MUEvKjo6XSovOiAgIDg1MCwgICAgICAgICAgIC8qOjpbKi8weDFCLyo6Ol0qLzogICA0MzcsXG5cdC8qOjpbKi8weDFDLyo6Ol0qLzogICA4NjMsICAgICAgICAgICAvKjo6WyovMHgxRC8qOjpdKi86ICAgODUwLFxuXHQvKjo6WyovMHgxRi8qOjpdKi86ICAgODUyLCAgICAgICAgICAgLyo6OlsqLzB4MjIvKjo6XSovOiAgIDg1Mixcblx0Lyo6OlsqLzB4MjMvKjo6XSovOiAgIDg1MiwgICAgICAgICAgIC8qOjpbKi8weDI0Lyo6Ol0qLzogICA4NjAsXG5cdC8qOjpbKi8weDI1Lyo6Ol0qLzogICA4NTAsICAgICAgICAgICAvKjo6WyovMHgyNi8qOjpdKi86ICAgODY2LFxuXHQvKjo6WyovMHgzNy8qOjpdKi86ICAgODUwLCAgICAgICAgICAgLyo6OlsqLzB4NDAvKjo6XSovOiAgIDg1Mixcblx0Lyo6OlsqLzB4NEQvKjo6XSovOiAgIDkzNiwgICAgICAgICAgIC8qOjpbKi8weDRFLyo6Ol0qLzogICA5NDksXG5cdC8qOjpbKi8weDRGLyo6Ol0qLzogICA5NTAsICAgICAgICAgICAvKjo6WyovMHg1MC8qOjpdKi86ICAgODc0LFxuXHQvKjo6WyovMHg1Ny8qOjpdKi86ICAxMjUyLCAgICAgICAgICAgLyo6OlsqLzB4NTgvKjo6XSovOiAgMTI1Mixcblx0Lyo6OlsqLzB4NTkvKjo6XSovOiAgMTI1MiwgICAgICAgICAgIC8qOjpbKi8weDZDLyo6Ol0qLzogICA4NjMsXG5cdC8qOjpbKi8weDg2Lyo6Ol0qLzogICA3MzcsICAgICAgICAgICAvKjo6WyovMHg4Ny8qOjpdKi86ICAgODUyLFxuXHQvKjo6WyovMHg4OC8qOjpdKi86ICAgODU3LCAgICAgICAgICAgLyo6OlsqLzB4Q0MvKjo6XSovOiAgMTI1NyxcblxuXHQvKjo6WyovMHhGRi8qOjpdKi86IDE2OTY5XG59O1xudmFyIGRiZl9yZXZlcnNlX21hcCA9IGV2ZXJ0KHtcblx0Lyo6OlsqLzB4MDEvKjo6XSovOiAgIDQzNywgICAgICAgICAgIC8qOjpbKi8weDAyLyo6Ol0qLzogICA4NTAsXG5cdC8qOjpbKi8weDAzLyo6Ol0qLzogIDEyNTIsICAgICAgICAgICAvKjo6WyovMHgwNC8qOjpdKi86IDEwMDAwLFxuXHQvKjo6WyovMHg2NC8qOjpdKi86ICAgODUyLCAgICAgICAgICAgLyo6OlsqLzB4NjUvKjo6XSovOiAgIDg2Nixcblx0Lyo6OlsqLzB4NjYvKjo6XSovOiAgIDg2NSwgICAgICAgICAgIC8qOjpbKi8weDY3Lyo6Ol0qLzogICA4NjEsXG5cdC8qOjpbKi8weDY4Lyo6Ol0qLzogICA4OTUsICAgICAgICAgICAvKjo6WyovMHg2OS8qOjpdKi86ICAgNjIwLFxuXHQvKjo6WyovMHg2QS8qOjpdKi86ICAgNzM3LCAgICAgICAgICAgLyo6OlsqLzB4NkIvKjo6XSovOiAgIDg1Nyxcblx0Lyo6OlsqLzB4NzgvKjo6XSovOiAgIDk1MCwgICAgICAgICAgIC8qOjpbKi8weDc5Lyo6Ol0qLzogICA5NDksXG5cdC8qOjpbKi8weDdBLyo6Ol0qLzogICA5MzYsICAgICAgICAgICAvKjo6WyovMHg3Qi8qOjpdKi86ICAgOTMyLFxuXHQvKjo6WyovMHg3Qy8qOjpdKi86ICAgODc0LCAgICAgICAgICAgLyo6OlsqLzB4N0QvKjo6XSovOiAgMTI1NSxcblx0Lyo6OlsqLzB4N0UvKjo6XSovOiAgMTI1NiwgICAgICAgICAgIC8qOjpbKi8weDk2Lyo6Ol0qLzogMTAwMDcsXG5cdC8qOjpbKi8weDk3Lyo6Ol0qLzogMTAwMjksICAgICAgICAgICAvKjo6WyovMHg5OC8qOjpdKi86IDEwMDA2LFxuXHQvKjo6WyovMHhDOC8qOjpdKi86ICAxMjUwLCAgICAgICAgICAgLyo6OlsqLzB4QzkvKjo6XSovOiAgMTI1MSxcblx0Lyo6OlsqLzB4Q0EvKjo6XSovOiAgMTI1NCwgICAgICAgICAgIC8qOjpbKi8weENCLyo6Ol0qLzogIDEyNTMsXG5cdC8qOjpbKi8weDAwLyo6Ol0qLzogMjAxMjdcbn0pO1xuLyogVE9ETzogZmluZCBhbiBhY3R1YWwgc3BlY2lmaWNhdGlvbiAqL1xuZnVuY3Rpb24gZGJmX3RvX2FvYShidWYsIG9wdHMpLyo6QU9BKi8ge1xuXHR2YXIgb3V0Lyo6QU9BKi8gPSBbXTtcblx0dmFyIGQvKjpCbG9jayovID0gKG5ld19yYXdfYnVmKDEpLyo6YW55Ki8pO1xuXHRzd2l0Y2gob3B0cy50eXBlKSB7XG5cdFx0Y2FzZSAnYmFzZTY0JzogZCA9IHMyYShCYXNlNjRfZGVjb2RlKGJ1ZikpOyBicmVhaztcblx0XHRjYXNlICdiaW5hcnknOiBkID0gczJhKGJ1Zik7IGJyZWFrO1xuXHRcdGNhc2UgJ2J1ZmZlcic6XG5cdFx0Y2FzZSAnYXJyYXknOiBkID0gYnVmOyBicmVhaztcblx0fVxuXHRwcmVwX2Jsb2IoZCwgMCk7XG5cblx0LyogaGVhZGVyICovXG5cdHZhciBmdCA9IGQucmVhZF9zaGlmdCgxKTtcblx0dmFyIG1lbW8gPSAhIShmdCAmIDB4ODgpO1xuXHR2YXIgdmZwID0gZmFsc2UsIGw3ID0gZmFsc2U7XG5cdHN3aXRjaChmdCkge1xuXHRcdGNhc2UgMHgwMjogYnJlYWs7IC8vIGRCQVNFIElJXG5cdFx0Y2FzZSAweDAzOiBicmVhazsgLy8gZEJBU0UgSUlJXG5cdFx0Y2FzZSAweDMwOiB2ZnAgPSB0cnVlOyBtZW1vID0gdHJ1ZTsgYnJlYWs7IC8vIFZGUFxuXHRcdGNhc2UgMHgzMTogdmZwID0gdHJ1ZTsgbWVtbyA9IHRydWU7IGJyZWFrOyAvLyBWRlAgd2l0aCBhdXRvaW5jcmVtZW50XG5cdFx0Ly8gMHg0MyBkQkFTRSBJViBTUUwgdGFibGUgZmlsZXNcblx0XHQvLyAweDYzIGRCQVNFIElWIFNRTCBzeXN0ZW0gZmlsZXNcblx0XHRjYXNlIDB4ODM6IGJyZWFrOyAvLyBkQkFTRSBJSUkgd2l0aCBtZW1vXG5cdFx0Y2FzZSAweDhCOiBicmVhazsgLy8gZEJBU0UgSVYgd2l0aCBtZW1vXG5cdFx0Y2FzZSAweDhDOiBsNyA9IHRydWU7IGJyZWFrOyAvLyBkQkFTRSBMZXZlbCA3IHdpdGggbWVtb1xuXHRcdC8vIGNhc2UgMHhDQiBkQkFTRSBJViBTUUwgdGFibGUgZmlsZXMgd2l0aCBtZW1vXG5cdFx0Y2FzZSAweEY1OiBicmVhazsgLy8gRm94UHJvIDIueCB3aXRoIG1lbW9cblx0XHQvLyBjYXNlIDB4RkIgRm94QkFTRVxuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIkRCRiBVbnN1cHBvcnRlZCBWZXJzaW9uOiBcIiArIGZ0LnRvU3RyaW5nKDE2KSk7XG5cdH1cblxuXHR2YXIgbnJvdyA9IDAsIGZwb3MgPSAweDAyMDk7XG5cdGlmKGZ0ID09IDB4MDIpIG5yb3cgPSBkLnJlYWRfc2hpZnQoMik7XG5cdGQubCArPSAzOyAvLyBkQkFTRSBJSSBzdG9yZXMgRERNTVlZIGRhdGUsIG90aGVycyB1c2UgWVlNTUREXG5cdGlmKGZ0ICE9IDB4MDIpIG5yb3cgPSBkLnJlYWRfc2hpZnQoNCk7XG5cdGlmKG5yb3cgPiAxMDQ4NTc2KSBucm93ID0gMWU2O1xuXG5cdGlmKGZ0ICE9IDB4MDIpIGZwb3MgPSBkLnJlYWRfc2hpZnQoMik7IC8vIGhlYWRlciBsZW5ndGhcblx0dmFyIHJsZW4gPSBkLnJlYWRfc2hpZnQoMik7IC8vIHJlY29yZCBsZW5ndGhcblxuXHR2YXIgLypmbGFncyA9IDAsKi8gY3VycmVudF9jcCA9IG9wdHMuY29kZXBhZ2UgfHwgMTI1Mjtcblx0aWYoZnQgIT0gMHgwMikgeyAvLyAyMCByZXNlcnZlZCBieXRlc1xuXHRcdGQubCs9MTY7XG5cdFx0LypmbGFncyA9ICovZC5yZWFkX3NoaWZ0KDEpO1xuXHRcdC8vaWYobWVtbyAmJiAoKGZsYWdzICYgMHgwMikgPT09IDApKSB0aHJvdyBuZXcgRXJyb3IoXCJEQkYgRmxhZ3MgXCIgKyBmbGFncy50b1N0cmluZygxNikgKyBcIiBmdCBcIiArIGZ0LnRvU3RyaW5nKDE2KSk7XG5cblx0XHQvKiBjb2RlcGFnZSBwcmVzZW50IGluIEZveFBybyBhbmQgZEJBU0UgTGV2ZWwgNyAqL1xuXHRcdGlmKGRbZC5sXSAhPT0gMCkgY3VycmVudF9jcCA9IGRiZl9jb2RlcGFnZV9tYXBbZFtkLmxdXTtcblx0XHRkLmwrPTE7XG5cblx0XHRkLmwrPTI7XG5cdH1cblx0aWYobDcpIGQubCArPSAzNjsgLy8gTGV2ZWwgNzogMzIgYnl0ZSBcIkxhbmd1YWdlIGRyaXZlciBuYW1lXCIsIDQgYnl0ZSByZXNlcnZlZFxuXG4vKjo6IHR5cGUgREJGRmllbGQgPSB7IG5hbWU6c3RyaW5nOyBsZW46bnVtYmVyOyB0eXBlOnN0cmluZzsgfSAqL1xuXHR2YXIgZmllbGRzLyo6QXJyYXk8REJGRmllbGQ+Ki8gPSBbXSwgZmllbGQvKjpEQkZGaWVsZCovID0gKHt9Lyo6YW55Ki8pO1xuXHR2YXIgaGVuZCA9IE1hdGgubWluKGQubGVuZ3RoLCAoZnQgPT0gMHgwMiA/IDB4MjA5IDogKGZwb3MgLSAxMCAtICh2ZnAgPyAyNjQgOiAwKSkpKTtcblx0dmFyIHd3ID0gbDcgPyAzMiA6IDExO1xuXHR3aGlsZShkLmwgPCBoZW5kICYmIGRbZC5sXSAhPSAweDBkKSB7XG5cdFx0ZmllbGQgPSAoe30vKjphbnkqLyk7XG5cdFx0ZmllbGQubmFtZSA9ICRjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2NwLCBkLnNsaWNlKGQubCwgZC5sK3d3KSkucmVwbGFjZSgvW1xcdTAwMDBcXHJcXG5dLiokL2csXCJcIik7XG5cdFx0ZC5sICs9IHd3O1xuXHRcdGZpZWxkLnR5cGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGQucmVhZF9zaGlmdCgxKSk7XG5cdFx0aWYoZnQgIT0gMHgwMiAmJiAhbDcpIGZpZWxkLm9mZnNldCA9IGQucmVhZF9zaGlmdCg0KTtcblx0XHRmaWVsZC5sZW4gPSBkLnJlYWRfc2hpZnQoMSk7XG5cdFx0aWYoZnQgPT0gMHgwMikgZmllbGQub2Zmc2V0ID0gZC5yZWFkX3NoaWZ0KDIpO1xuXHRcdGZpZWxkLmRlYyA9IGQucmVhZF9zaGlmdCgxKTtcblx0XHRpZihmaWVsZC5uYW1lLmxlbmd0aCkgZmllbGRzLnB1c2goZmllbGQpO1xuXHRcdGlmKGZ0ICE9IDB4MDIpIGQubCArPSBsNyA/IDEzIDogMTQ7XG5cdFx0c3dpdGNoKGZpZWxkLnR5cGUpIHtcblx0XHRcdGNhc2UgJ0InOiAvLyBEb3VibGUgKFZGUCkgLyBCaW5hcnkgKGRCQVNFIEw3KVxuXHRcdFx0XHRpZigoIXZmcCB8fCBmaWVsZC5sZW4gIT0gOCkgJiYgb3B0cy5XVEYpIGNvbnNvbGUubG9nKCdTa2lwcGluZyAnICsgZmllbGQubmFtZSArICc6JyArIGZpZWxkLnR5cGUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ0cnOiAvLyBHZW5lcmFsIChGb3hQcm8gYW5kIGRCQVNFIEw3KVxuXHRcdFx0Y2FzZSAnUCc6IC8vIFBpY3R1cmUgKEZveFBybyBhbmQgZEJBU0UgTDcpXG5cdFx0XHRcdGlmKG9wdHMuV1RGKSBjb25zb2xlLmxvZygnU2tpcHBpbmcgJyArIGZpZWxkLm5hbWUgKyAnOicgKyBmaWVsZC50eXBlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICcrJzogLy8gQXV0b2luY3JlbWVudCAoZEJBU0UgTDcgb25seSlcblx0XHRcdGNhc2UgJzAnOiAvLyBfTnVsbEZsYWdzIChWRlAgb25seSlcblx0XHRcdGNhc2UgJ0AnOiAvLyBUaW1lc3RhbXAgKGRCQVNFIEw3IG9ubHkpXG5cdFx0XHRjYXNlICdDJzogLy8gQ2hhcmFjdGVyIChkQkFTRSBJSSlcblx0XHRcdGNhc2UgJ0QnOiAvLyBEYXRlIChkQkFTRSBJSUkpXG5cdFx0XHRjYXNlICdGJzogLy8gRmxvYXQgKGRCQVNFIElWKVxuXHRcdFx0Y2FzZSAnSSc6IC8vIExvbmcgKFZGUCBhbmQgZEJBU0UgTDcpXG5cdFx0XHRjYXNlICdMJzogLy8gTG9naWNhbCAoZEJBU0UgSUkpXG5cdFx0XHRjYXNlICdNJzogLy8gTWVtbyAoZEJBU0UgSUlJKVxuXHRcdFx0Y2FzZSAnTic6IC8vIE51bWJlciAoZEJBU0UgSUkpXG5cdFx0XHRjYXNlICdPJzogLy8gRG91YmxlIChkQkFTRSBMNyBvbmx5KVxuXHRcdFx0Y2FzZSAnVCc6IC8vIERhdGV0aW1lIChWRlAgb25seSlcblx0XHRcdGNhc2UgJ1knOiAvLyBDdXJyZW5jeSAoVkZQIG9ubHkpXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIEZpZWxkIFR5cGU6ICcgKyBmaWVsZC50eXBlKTtcblx0XHR9XG5cdH1cblxuXHRpZihkW2QubF0gIT09IDB4MEQpIGQubCA9IGZwb3MtMTtcblx0aWYoZC5yZWFkX3NoaWZ0KDEpICE9PSAweDBEKSB0aHJvdyBuZXcgRXJyb3IoXCJEQkYgVGVybWluYXRvciBub3QgZm91bmQgXCIgKyBkLmwgKyBcIiBcIiArIGRbZC5sXSk7XG5cdGQubCA9IGZwb3M7XG5cblx0LyogZGF0YSAqL1xuXHR2YXIgUiA9IDAsIEMgPSAwO1xuXHRvdXRbMF0gPSBbXTtcblx0Zm9yKEMgPSAwOyBDICE9IGZpZWxkcy5sZW5ndGg7ICsrQykgb3V0WzBdW0NdID0gZmllbGRzW0NdLm5hbWU7XG5cdHdoaWxlKG5yb3ctLSA+IDApIHtcblx0XHRpZihkW2QubF0gPT09IDB4MkEpIHtcblx0XHRcdC8vIFRPRE86IHJlY29yZCBtYXJrZWQgYXMgZGVsZXRlZCAtLSBjcmVhdGUgYSBoaWRkZW4gcm93P1xuXHRcdFx0ZC5sKz1ybGVuO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdCsrZC5sO1xuXHRcdG91dFsrK1JdID0gW107IEMgPSAwO1xuXHRcdGZvcihDID0gMDsgQyAhPSBmaWVsZHMubGVuZ3RoOyArK0MpIHtcblx0XHRcdHZhciBkZCA9IGQuc2xpY2UoZC5sLCBkLmwrZmllbGRzW0NdLmxlbik7IGQubCs9ZmllbGRzW0NdLmxlbjtcblx0XHRcdHByZXBfYmxvYihkZCwgMCk7XG5cdFx0XHR2YXIgcyA9ICRjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2NwLCBkZCk7XG5cdFx0XHRzd2l0Y2goZmllbGRzW0NdLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSAnQyc6XG5cdFx0XHRcdFx0Ly8gTk9URTogaXQgaXMgY29udmVudGlvbmFsIHRvIHdyaXRlICcgIC8gIC8gICcgZm9yIGVtcHR5IGRhdGVzXG5cdFx0XHRcdFx0aWYocy50cmltKCkubGVuZ3RoKSBvdXRbUl1bQ10gPSBzLnJlcGxhY2UoL1xccyskLyxcIlwiKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRCc6XG5cdFx0XHRcdFx0aWYocy5sZW5ndGggPT09IDgpIG91dFtSXVtDXSA9IG5ldyBEYXRlKCtzLnNsaWNlKDAsNCksICtzLnNsaWNlKDQsNiktMSwgK3Muc2xpY2UoNiw4KSk7XG5cdFx0XHRcdFx0ZWxzZSBvdXRbUl1bQ10gPSBzO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdGJzogb3V0W1JdW0NdID0gcGFyc2VGbG9hdChzLnRyaW0oKSk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICcrJzogY2FzZSAnSSc6IG91dFtSXVtDXSA9IGw3ID8gZGQucmVhZF9zaGlmdCgtNCwgJ2knKSBeIDB4ODAwMDAwMDAgOiBkZC5yZWFkX3NoaWZ0KDQsICdpJyk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdMJzogc3dpdGNoKHMudHJpbSgpLnRvVXBwZXJDYXNlKCkpIHtcblx0XHRcdFx0XHRjYXNlICdZJzogY2FzZSAnVCc6IG91dFtSXVtDXSA9IHRydWU7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ04nOiBjYXNlICdGJzogb3V0W1JdW0NdID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJyc6IGNhc2UgJz8nOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJEQkYgVW5yZWNvZ25pemVkIEw6fFwiICsgcyArIFwifFwiKTtcblx0XHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdNJzogLyogVE9ETzogaGFuZGxlIG1lbW8gZmlsZXMgKi9cblx0XHRcdFx0XHRpZighbWVtbykgdGhyb3cgbmV3IEVycm9yKFwiREJGIFVuZXhwZWN0ZWQgTUVNTyBmb3IgdHlwZSBcIiArIGZ0LnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRcdFx0b3V0W1JdW0NdID0gXCIjI01FTU8jI1wiICsgKGw3ID8gcGFyc2VJbnQocy50cmltKCksIDEwKTogZGQucmVhZF9zaGlmdCg0KSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ04nOlxuXHRcdFx0XHRcdHMgPSBzLnJlcGxhY2UoL1xcdTAwMDAvZyxcIlwiKS50cmltKCk7XG5cdFx0XHRcdFx0Ly8gTk9URTogZEJBU0UgSUkgaW50ZXJwcmV0cyBcIiAgLiAgXCIgYXMgMFxuXHRcdFx0XHRcdGlmKHMgJiYgcyAhPSBcIi5cIikgb3V0W1JdW0NdID0gK3MgfHwgMDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0AnOlxuXHRcdFx0XHRcdC8vIE5PVEU6IGRCQVNFIHNwZWNzIGFwcGVhciB0byBiZSBpbmNvcnJlY3Rcblx0XHRcdFx0XHRvdXRbUl1bQ10gPSBuZXcgRGF0ZShkZC5yZWFkX3NoaWZ0KC04LCAnZicpIC0gMHgzODgzMTc1MzM0MDApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdUJzogb3V0W1JdW0NdID0gbmV3IERhdGUoKGRkLnJlYWRfc2hpZnQoNCkgLSAweDI1M0Q4QykgKiAweDUyNjVDMDAgKyBkZC5yZWFkX3NoaWZ0KDQpKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1knOiBvdXRbUl1bQ10gPSBkZC5yZWFkX3NoaWZ0KDQsJ2knKS8xZTQgKyAoZGQucmVhZF9zaGlmdCg0LCAnaScpLzFlNCkqTWF0aC5wb3coMiwzMik7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdPJzogb3V0W1JdW0NdID0gLWRkLnJlYWRfc2hpZnQoLTgsICdmJyk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdCJzogaWYodmZwICYmIGZpZWxkc1tDXS5sZW4gPT0gOCkgeyBvdXRbUl1bQ10gPSBkZC5yZWFkX3NoaWZ0KDgsJ2YnKTsgYnJlYWs7IH1cblx0XHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdGNhc2UgJ0cnOiBjYXNlICdQJzogZGQubCArPSBmaWVsZHNbQ10ubGVuOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnMCc6XG5cdFx0XHRcdFx0aWYoZmllbGRzW0NdLm5hbWUgPT09ICdfTnVsbEZsYWdzJykgYnJlYWs7XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJEQkYgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlIFwiICsgZmllbGRzW0NdLnR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRpZihmdCAhPSAweDAyKSBpZihkLmwgPCBkLmxlbmd0aCAmJiBkW2QubCsrXSAhPSAweDFBKSB0aHJvdyBuZXcgRXJyb3IoXCJEQkYgRU9GIE1hcmtlciBtaXNzaW5nIFwiICsgKGQubC0xKSArIFwiIG9mIFwiICsgZC5sZW5ndGggKyBcIiBcIiArIGRbZC5sLTFdLnRvU3RyaW5nKDE2KSk7XG5cdGlmKG9wdHMgJiYgb3B0cy5zaGVldFJvd3MpIG91dCA9IG91dC5zbGljZSgwLCBvcHRzLnNoZWV0Um93cyk7XG5cdG9wdHMuREJGID0gZmllbGRzO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBkYmZfdG9fc2hlZXQoYnVmLCBvcHRzKS8qOldvcmtzaGVldCovIHtcblx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHRpZighby5kYXRlTkYpIG8uZGF0ZU5GID0gXCJ5eXl5bW1kZFwiO1xuXHR2YXIgd3MgPSBhb2FfdG9fc2hlZXQoZGJmX3RvX2FvYShidWYsIG8pLCBvKTtcblx0d3NbXCIhY29sc1wiXSA9IG8uREJGLm1hcChmdW5jdGlvbihmaWVsZCkgeyByZXR1cm4ge1xuXHRcdHdjaDogZmllbGQubGVuLFxuXHRcdERCRjogZmllbGRcblx0fTt9KTtcblx0ZGVsZXRlIG8uREJGO1xuXHRyZXR1cm4gd3M7XG59XG5cbmZ1bmN0aW9uIGRiZl90b193b3JrYm9vayhidWYsIG9wdHMpLyo6V29ya2Jvb2sqLyB7XG5cdHRyeSB7IHJldHVybiBzaGVldF90b193b3JrYm9vayhkYmZfdG9fc2hlZXQoYnVmLCBvcHRzKSwgb3B0cyk7IH1cblx0Y2F0Y2goZSkgeyBpZihvcHRzICYmIG9wdHMuV1RGKSB0aHJvdyBlOyB9XG5cdHJldHVybiAoe1NoZWV0TmFtZXM6W10sU2hlZXRzOnt9fSk7XG59XG5cbnZhciBfUkxFTiA9IHsgJ0InOiA4LCAnQyc6IDI1MCwgJ0wnOiAxLCAnRCc6IDgsICc/JzogMCwgJyc6IDAgfTtcbmZ1bmN0aW9uIHNoZWV0X3RvX2RiZih3cy8qOldvcmtzaGVldCovLCBvcHRzLyo6V3JpdGVPcHRzKi8pIHtcblx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHRpZigrby5jb2RlcGFnZSA+PSAwKSBzZXRfY3AoK28uY29kZXBhZ2UpO1xuXHRpZihvLnR5cGUgPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHdyaXRlIERCRiB0byBKUyBzdHJpbmdcIik7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR2YXIgYW9hLyo6QU9BKi8gPSBzaGVldF90b19qc29uKHdzLCB7aGVhZGVyOjEsIHJhdzp0cnVlLCBjZWxsRGF0ZXM6dHJ1ZX0pO1xuXHR2YXIgaGVhZGVycyA9IGFvYVswXSwgZGF0YSA9IGFvYS5zbGljZSgxKSwgY29scyA9IHdzW1wiIWNvbHNcIl0gfHwgW107XG5cdHZhciBpID0gMCwgaiA9IDAsIGhjbnQgPSAwLCBybGVuID0gMTtcblx0Zm9yKGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7ICsraSkge1xuXHRcdGlmKCgoY29sc1tpXXx8e30pLkRCRnx8e30pLm5hbWUpIHsgaGVhZGVyc1tpXSA9IGNvbHNbaV0uREJGLm5hbWU7ICsraGNudDsgY29udGludWU7IH1cblx0XHRpZihoZWFkZXJzW2ldID09IG51bGwpIGNvbnRpbnVlO1xuXHRcdCsraGNudDtcblx0XHRpZih0eXBlb2YgaGVhZGVyc1tpXSA9PT0gJ251bWJlcicpIGhlYWRlcnNbaV0gPSBoZWFkZXJzW2ldLnRvU3RyaW5nKDEwKTtcblx0XHRpZih0eXBlb2YgaGVhZGVyc1tpXSAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFcnJvcihcIkRCRiBJbnZhbGlkIGNvbHVtbiBuYW1lIFwiICsgaGVhZGVyc1tpXSArIFwiIHxcIiArICh0eXBlb2YgaGVhZGVyc1tpXSkgKyBcInxcIik7XG5cdFx0aWYoaGVhZGVycy5pbmRleE9mKGhlYWRlcnNbaV0pICE9PSBpKSBmb3Ioaj0wOyBqPDEwMjQ7KytqKVxuXHRcdFx0aWYoaGVhZGVycy5pbmRleE9mKGhlYWRlcnNbaV0gKyBcIl9cIiArIGopID09IC0xKSB7IGhlYWRlcnNbaV0gKz0gXCJfXCIgKyBqOyBicmVhazsgfVxuXHR9XG5cdHZhciByYW5nZSA9IHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pO1xuXHR2YXIgY29sdHlwZXMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIGNvbHdpZHRocy8qOkFycmF5PG51bWJlcj4qLyA9IFtdO1xuXHR2YXIgY29sZGVjaW1hbHMvKjpBcnJheTxudW1iZXI+Ki8gPSBbXTtcblx0Zm9yKGkgPSAwOyBpIDw9IHJhbmdlLmUuYyAtIHJhbmdlLnMuYzsgKytpKSB7XG5cdFx0dmFyIGd1ZXNzID0gJycsIF9ndWVzcyA9ICcnLCBtYXhsZW4gPSAwO1xuXHRcdHZhciBjb2wvKjpBcnJheTxhbnk+Ki8gPSBbXTtcblx0XHRmb3Ioaj0wOyBqIDwgZGF0YS5sZW5ndGg7ICsraikge1xuXHRcdFx0aWYoZGF0YVtqXVtpXSAhPSBudWxsKSBjb2wucHVzaChkYXRhW2pdW2ldKTtcblx0XHR9XG5cdFx0aWYoY29sLmxlbmd0aCA9PSAwIHx8IGhlYWRlcnNbaV0gPT0gbnVsbCkgeyBjb2x0eXBlc1tpXSA9ICc/JzsgY29udGludWU7IH1cblx0XHRmb3IoaiA9IDA7IGogPCBjb2wubGVuZ3RoOyArK2opIHtcblx0XHRcdHN3aXRjaCh0eXBlb2YgY29sW2pdKSB7XG5cdFx0XHRcdC8qIFRPRE86IGNoZWNrIGlmIEwyIGNvbXBhdCBpcyBkZXNpcmVkICovXG5cdFx0XHRcdGNhc2UgJ251bWJlcic6IF9ndWVzcyA9ICdCJzsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3N0cmluZyc6IF9ndWVzcyA9ICdDJzsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Jvb2xlYW4nOiBfZ3Vlc3MgPSAnTCc7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdvYmplY3QnOiBfZ3Vlc3MgPSBjb2xbal0gaW5zdGFuY2VvZiBEYXRlID8gJ0QnIDogJ0MnOyBicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogX2d1ZXNzID0gJ0MnO1xuXHRcdFx0fVxuXHRcdFx0bWF4bGVuID0gTWF0aC5tYXgobWF4bGVuLCBTdHJpbmcoY29sW2pdKS5sZW5ndGgpO1xuXHRcdFx0Z3Vlc3MgPSBndWVzcyAmJiBndWVzcyAhPSBfZ3Vlc3MgPyAnQycgOiBfZ3Vlc3M7XG5cdFx0XHQvL2lmKGd1ZXNzID09ICdDJykgYnJlYWs7XG5cdFx0fVxuXHRcdGlmKG1heGxlbiA+IDI1MCkgbWF4bGVuID0gMjUwO1xuXHRcdF9ndWVzcyA9ICgoY29sc1tpXXx8e30pLkRCRnx8e30pLnR5cGU7XG5cdFx0LyogVE9ETzogbW9yZSBmaW5lIGdyYWluZWQgY29udHJvbCBvdmVyIERCRiB0eXBlIHJlc29sdXRpb24gKi9cblx0XHRpZihfZ3Vlc3MgPT0gJ0MnKSB7XG5cdFx0XHRpZihjb2xzW2ldLkRCRi5sZW4gPiBtYXhsZW4pIG1heGxlbiA9IGNvbHNbaV0uREJGLmxlbjtcblx0XHR9XG5cdFx0aWYoZ3Vlc3MgPT0gJ0InICYmIF9ndWVzcyA9PSAnTicpIHtcblx0XHRcdGd1ZXNzID0gJ04nO1xuXHRcdFx0Y29sZGVjaW1hbHNbaV0gPSBjb2xzW2ldLkRCRi5kZWM7XG5cdFx0XHRtYXhsZW4gPSBjb2xzW2ldLkRCRi5sZW47XG5cdFx0fVxuXHRcdGNvbHdpZHRoc1tpXSA9IGd1ZXNzID09ICdDJyB8fCBfZ3Vlc3MgPT0gJ04nID8gbWF4bGVuIDogKF9STEVOW2d1ZXNzXSB8fCAwKTtcblx0XHRybGVuICs9IGNvbHdpZHRoc1tpXTtcblx0XHRjb2x0eXBlc1tpXSA9IGd1ZXNzO1xuXHR9XG5cblx0dmFyIGggPSBiYS5uZXh0KDMyKTtcblx0aC53cml0ZV9zaGlmdCg0LCAweDEzMDIxMTMwKTtcblx0aC53cml0ZV9zaGlmdCg0LCBkYXRhLmxlbmd0aCk7XG5cdGgud3JpdGVfc2hpZnQoMiwgMjk2ICsgMzIgKiBoY250KTtcblx0aC53cml0ZV9zaGlmdCgyLCBybGVuKTtcblx0Zm9yKGk9MDsgaSA8IDQ7ICsraSkgaC53cml0ZV9zaGlmdCg0LCAwKTtcblx0aC53cml0ZV9zaGlmdCg0LCAweDAwMDAwMDAwIHwgKCgrZGJmX3JldmVyc2VfbWFwWy8qOjpTdHJpbmcoKi9jdXJyZW50X2Fuc2kvKjo6KSovXSB8fCAweDAzKTw8OCkpO1xuXG5cdGZvcihpID0gMCwgaiA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgKytpKSB7XG5cdFx0aWYoaGVhZGVyc1tpXSA9PSBudWxsKSBjb250aW51ZTtcblx0XHR2YXIgaGYgPSBiYS5uZXh0KDMyKTtcblx0XHR2YXIgX2YgPSAoaGVhZGVyc1tpXS5zbGljZSgtMTApICsgXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXCIpLnNsaWNlKDAsIDExKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCBfZiwgXCJzYmNzXCIpO1xuXHRcdGhmLndyaXRlX3NoaWZ0KDEsIGNvbHR5cGVzW2ldID09ICc/JyA/ICdDJyA6IGNvbHR5cGVzW2ldLCBcInNiY3NcIik7XG5cdFx0aGYud3JpdGVfc2hpZnQoNCwgaik7XG5cdFx0aGYud3JpdGVfc2hpZnQoMSwgY29sd2lkdGhzW2ldIHx8IF9STEVOW2NvbHR5cGVzW2ldXSB8fCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCBjb2xkZWNpbWFsc1tpXSB8fCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCAweDAyKTtcblx0XHRoZi53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRqICs9IChjb2x3aWR0aHNbaV0gfHwgX1JMRU5bY29sdHlwZXNbaV1dIHx8IDApO1xuXHR9XG5cblx0dmFyIGhiID0gYmEubmV4dCgyNjQpO1xuXHRoYi53cml0ZV9zaGlmdCg0LCAweDAwMDAwMDBEKTtcblx0Zm9yKGk9MDsgaSA8IDY1OysraSkgaGIud3JpdGVfc2hpZnQoNCwgMHgwMDAwMDAwMCk7XG5cdGZvcihpPTA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHJvdXQgPSBiYS5uZXh0KHJsZW4pO1xuXHRcdHJvdXQud3JpdGVfc2hpZnQoMSwgMCk7XG5cdFx0Zm9yKGo9MDsgajxoZWFkZXJzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRpZihoZWFkZXJzW2pdID09IG51bGwpIGNvbnRpbnVlO1xuXHRcdFx0c3dpdGNoKGNvbHR5cGVzW2pdKSB7XG5cdFx0XHRcdGNhc2UgJ0wnOiByb3V0LndyaXRlX3NoaWZ0KDEsIGRhdGFbaV1bal0gPT0gbnVsbCA/IDB4M0YgOiBkYXRhW2ldW2pdID8gMHg1NCA6IDB4NDYpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnQic6IHJvdXQud3JpdGVfc2hpZnQoOCwgZGF0YVtpXVtqXXx8MCwgJ2YnKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ04nOlxuXHRcdFx0XHRcdHZhciBfbiA9IFwiMFwiO1xuXHRcdFx0XHRcdGlmKHR5cGVvZiBkYXRhW2ldW2pdID09IFwibnVtYmVyXCIpIF9uID0gZGF0YVtpXVtqXS50b0ZpeGVkKGNvbGRlY2ltYWxzW2pdfHwwKTtcblx0XHRcdFx0XHRmb3IoaGNudD0wOyBoY250IDwgY29sd2lkdGhzW2pdLV9uLmxlbmd0aDsgKytoY250KSByb3V0LndyaXRlX3NoaWZ0KDEsIDB4MjApO1xuXHRcdFx0XHRcdHJvdXQud3JpdGVfc2hpZnQoMSwgX24sIFwic2Jjc1wiKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRCc6XG5cdFx0XHRcdFx0aWYoIWRhdGFbaV1bal0pIHJvdXQud3JpdGVfc2hpZnQoOCwgXCIwMDAwMDAwMFwiLCBcInNiY3NcIik7XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRyb3V0LndyaXRlX3NoaWZ0KDQsIChcIjAwMDBcIitkYXRhW2ldW2pdLmdldEZ1bGxZZWFyKCkpLnNsaWNlKC00KSwgXCJzYmNzXCIpO1xuXHRcdFx0XHRcdFx0cm91dC53cml0ZV9zaGlmdCgyLCAoXCIwMFwiKyhkYXRhW2ldW2pdLmdldE1vbnRoKCkrMSkpLnNsaWNlKC0yKSwgXCJzYmNzXCIpO1xuXHRcdFx0XHRcdFx0cm91dC53cml0ZV9zaGlmdCgyLCAoXCIwMFwiK2RhdGFbaV1bal0uZ2V0RGF0ZSgpKS5zbGljZSgtMiksIFwic2Jjc1wiKTtcblx0XHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdDJzpcblx0XHRcdFx0XHR2YXIgX3MgPSBTdHJpbmcoZGF0YVtpXVtqXSAhPSBudWxsID8gZGF0YVtpXVtqXSA6IFwiXCIpLnNsaWNlKDAsIGNvbHdpZHRoc1tqXSk7XG5cdFx0XHRcdFx0cm91dC53cml0ZV9zaGlmdCgxLCBfcywgXCJzYmNzXCIpO1xuXHRcdFx0XHRcdGZvcihoY250PTA7IGhjbnQgPCBjb2x3aWR0aHNbal0tX3MubGVuZ3RoOyArK2hjbnQpIHJvdXQud3JpdGVfc2hpZnQoMSwgMHgyMCk7IGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBkYXRhXG5cdH1cblx0YmEubmV4dCgxKS53cml0ZV9zaGlmdCgxLCAweDFBKTtcblx0cmV0dXJuIGJhLmVuZCgpO1xufVxuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBkYmZfdG9fd29ya2Jvb2ssXG5cdFx0dG9fc2hlZXQ6IGRiZl90b19zaGVldCxcblx0XHRmcm9tX3NoZWV0OiBzaGVldF90b19kYmZcblx0fTtcbn0pKCk7XG5cbnZhciBTWUxLID0gLyojX19QVVJFX18qLyhmdW5jdGlvbigpIHtcblx0LyogVE9ETzogc3RyZXNzIHRlc3Qgc2VxdWVuY2VzICovXG5cdHZhciBzeWxrX2VzY2FwZXMgPSAoe1xuXHRcdEFBOifDgCcsIEJBOifDgScsIENBOifDgicsIERBOjE5NSwgSEE6J8OEJywgSkE6MTk3LFxuXHRcdEFFOifDiCcsIEJFOifDiScsIENFOifDiicsICAgICAgICAgSEU6J8OLJyxcblx0XHRBSTonw4wnLCBCSTonw40nLCBDSTonw44nLCAgICAgICAgIEhJOifDjycsXG5cdFx0QU86J8OSJywgQk86J8OTJywgQ086J8OUJywgRE86MjEzLCBITzonw5YnLFxuXHRcdEFVOifDmScsIEJVOifDmicsIENVOifDmycsICAgICAgICAgSFU6J8OcJyxcblx0XHRBYTonw6AnLCBCYTonw6EnLCBDYTonw6InLCBEYToyMjcsIEhhOifDpCcsIEphOjIyOSxcblx0XHRBZTonw6gnLCBCZTonw6knLCBDZTonw6onLCAgICAgICAgIEhlOifDqycsXG5cdFx0QWk6J8OsJywgQmk6J8OtJywgQ2k6J8OuJywgICAgICAgICBIaTonw68nLFxuXHRcdEFvOifDsicsIEJvOifDsycsIENvOifDtCcsIERvOjI0NSwgSG86J8O2Jyxcblx0XHRBdTonw7knLCBCdTonw7onLCBDdTonw7snLCAgICAgICAgIEh1OifDvCcsXG5cdFx0S0M6J8OHJywgS2M6J8OnJywgcTonw6YnLCAgejonxZMnLCAgYTonw4YnLCAgajonxZInLFxuXHRcdEROOjIwOSwgRG46MjQxLCBIeToyNTUsXG5cdFx0UzoxNjksICBjOjE3MCwgIFI6MTc0LCAgXCJCIFwiOjE4MCxcblx0XHQvKjo6WyovMC8qOjpdKi86MTc2LCAgICAvKjo6WyovMS8qOjpdKi86MTc3LCAgLyo6OlsqLzIvKjo6XSovOjE3OCxcblx0XHQvKjo6WyovMy8qOjpdKi86MTc5LCAgICAvKjo6WyovNS8qOjpdKi86MTgxLCAgLyo6OlsqLzYvKjo6XSovOjE4Mixcblx0XHQvKjo6WyovNy8qOjpdKi86MTgzLCAgICBROjE4NSwgIGs6MTg2LCAgYjoyMDgsICBpOjIxNiwgIGw6MjIyLCAgczoyNDAsICB5OjI0OCxcblx0XHRcIiFcIjoxNjEsICdcIic6MTYyLCBcIiNcIjoxNjMsIFwiKFwiOjE2NCwgXCIlXCI6MTY1LCBcIidcIjoxNjcsIFwiSCBcIjoxNjgsXG5cdFx0XCIrXCI6MTcxLCBcIjtcIjoxODcsIFwiPFwiOjE4OCwgXCI9XCI6MTg5LCBcIj5cIjoxOTAsIFwiP1wiOjE5MSwgXCJ7XCI6MjIzXG5cdH0vKjphbnkqLyk7XG5cdHZhciBzeWxrX2NoYXJfcmVnZXggPSBuZXcgUmVnRXhwKFwiXFx1MDAxQk4oXCIgKyBrZXlzKHN5bGtfZXNjYXBlcykuam9pbihcInxcIikucmVwbGFjZSgvXFx8XFx8XFx8LywgXCJ8XFxcXHx8XCIpLnJlcGxhY2UoLyhbPygpK10pL2csXCJcXFxcJDFcIikgKyBcInxcXFxcfClcIiwgXCJnbVwiKTtcblx0dmFyIHN5bGtfY2hhcl9mbiA9IGZ1bmN0aW9uKF8sICQxKXsgdmFyIG8gPSBzeWxrX2VzY2FwZXNbJDFdOyByZXR1cm4gdHlwZW9mIG8gPT0gXCJudW1iZXJcIiA/IF9nZXRhbnNpKG8pIDogbzsgfTtcblx0dmFyIGRlY29kZV9zeWxrX2NoYXIgPSBmdW5jdGlvbigkJCwgJDEsICQyKSB7IHZhciBuZXdjYyA9ICgoJDEuY2hhckNvZGVBdCgwKSAtIDB4MjApPDw0KSB8ICgkMi5jaGFyQ29kZUF0KDApIC0gMHgzMCk7IHJldHVybiBuZXdjYyA9PSA1OSA/ICQkIDogX2dldGFuc2kobmV3Y2MpOyB9O1xuXHRzeWxrX2VzY2FwZXNbXCJ8XCJdID0gMjU0O1xuXHQvKiBUT0RPOiBmaW5kIGFuIGFjdHVhbCBzcGVjaWZpY2F0aW9uICovXG5cdGZ1bmN0aW9uIHN5bGtfdG9fYW9hKGQvKjpSYXdEYXRhKi8sIG9wdHMpLyo6W0FPQSwgV29ya3NoZWV0XSovIHtcblx0XHRzd2l0Y2gob3B0cy50eXBlKSB7XG5cdFx0XHRjYXNlICdiYXNlNjQnOiByZXR1cm4gc3lsa190b19hb2Ffc3RyKEJhc2U2NF9kZWNvZGUoZCksIG9wdHMpO1xuXHRcdFx0Y2FzZSAnYmluYXJ5JzogcmV0dXJuIHN5bGtfdG9fYW9hX3N0cihkLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2J1ZmZlcic6IHJldHVybiBzeWxrX3RvX2FvYV9zdHIoaGFzX2J1ZiAmJiBCdWZmZXIuaXNCdWZmZXIoZCkgPyBkLnRvU3RyaW5nKCdiaW5hcnknKSA6IGEycyhkKSwgb3B0cyk7XG5cdFx0XHRjYXNlICdhcnJheSc6IHJldHVybiBzeWxrX3RvX2FvYV9zdHIoY2Myc3RyKGQpLCBvcHRzKTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHR5cGUgXCIgKyBvcHRzLnR5cGUpO1xuXHR9XG5cdGZ1bmN0aW9uIHN5bGtfdG9fYW9hX3N0cihzdHIvKjpzdHJpbmcqLywgb3B0cykvKjpbQU9BLCBXb3Jrc2hlZXRdKi8ge1xuXHRcdHZhciByZWNvcmRzID0gc3RyLnNwbGl0KC9bXFxuXFxyXSsvKSwgUiA9IC0xLCBDID0gLTEsIHJpID0gMCwgcmogPSAwLCBhcnIvKjpBT0EqLyA9IFtdO1xuXHRcdHZhciBmb3JtYXRzLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdFx0dmFyIG5leHRfY2VsbF9mb3JtYXQvKjpzdHJpbmd8bnVsbCovID0gbnVsbDtcblx0XHR2YXIgc2h0ID0ge30sIHJvd2luZm8vKjpBcnJheTxSb3dJbmZvPiovID0gW10sIGNvbGluZm8vKjpBcnJheTxDb2xJbmZvPiovID0gW10sIGN3Lyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdFx0dmFyIE12YWwgPSAwLCBqO1xuXHRcdGlmKCtvcHRzLmNvZGVwYWdlID49IDApIHNldF9jcCgrb3B0cy5jb2RlcGFnZSk7XG5cdFx0Zm9yICg7IHJpICE9PSByZWNvcmRzLmxlbmd0aDsgKytyaSkge1xuXHRcdFx0TXZhbCA9IDA7XG5cdFx0XHR2YXIgcnN0cj1yZWNvcmRzW3JpXS50cmltKCkucmVwbGFjZSgvXFx4MUIoW1xceDIwLVxceDJGXSkoW1xceDMwLVxceDNGXSkvZywgZGVjb2RlX3N5bGtfY2hhcikucmVwbGFjZShzeWxrX2NoYXJfcmVnZXgsIHN5bGtfY2hhcl9mbik7XG5cdFx0XHR2YXIgcmVjb3JkPXJzdHIucmVwbGFjZSgvOzsvZywgXCJcXHUwMDAwXCIpLnNwbGl0KFwiO1wiKS5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4geC5yZXBsYWNlKC9cXHUwMDAwL2csIFwiO1wiKTsgfSk7XG5cdFx0XHR2YXIgUlQ9cmVjb3JkWzBdLCB2YWw7XG5cdFx0XHRpZihyc3RyLmxlbmd0aCA+IDApIHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAnSUQnOiBicmVhazsgLyogaGVhZGVyICovXG5cdFx0XHRjYXNlICdFJzogYnJlYWs7IC8qIEVPRiAqL1xuXHRcdFx0Y2FzZSAnQic6IGJyZWFrOyAvKiBkaW1lbnNpb25zICovXG5cdFx0XHRjYXNlICdPJzogYnJlYWs7IC8qIG9wdGlvbnM/ICovXG5cdFx0XHRjYXNlICdXJzogYnJlYWs7IC8qIHdpbmRvdz8gKi9cblx0XHRcdGNhc2UgJ1AnOlxuXHRcdFx0XHRpZihyZWNvcmRbMV0uY2hhckF0KDApID09ICdQJylcblx0XHRcdFx0XHRmb3JtYXRzLnB1c2gocnN0ci5zbGljZSgzKS5yZXBsYWNlKC87Oy9nLCBcIjtcIikpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ0MnOlxuXHRcdFx0dmFyIENfc2Vlbl9LID0gZmFsc2UsIENfc2Vlbl9YID0gZmFsc2UsIENfc2Vlbl9TID0gZmFsc2UsIENfc2Vlbl9FID0gZmFsc2UsIF9SID0gLTEsIF9DID0gLTE7XG5cdFx0XHRmb3Iocmo9MTsgcmo8cmVjb3JkLmxlbmd0aDsgKytyaikgc3dpdGNoKHJlY29yZFtyal0uY2hhckF0KDApKSB7XG5cdFx0XHRcdGNhc2UgJ0EnOiBicmVhazsgLy8gVE9ETzogY29tbWVudFxuXHRcdFx0XHRjYXNlICdYJzogQyA9IHBhcnNlSW50KHJlY29yZFtyal0uc2xpY2UoMSkpLTE7IENfc2Vlbl9YID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1knOlxuXHRcdFx0XHRcdFIgPSBwYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKS0xOyBpZighQ19zZWVuX1gpIEMgPSAwO1xuXHRcdFx0XHRcdGZvcihqID0gYXJyLmxlbmd0aDsgaiA8PSBSOyArK2opIGFycltqXSA9IFtdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdLJzpcblx0XHRcdFx0XHR2YWwgPSByZWNvcmRbcmpdLnNsaWNlKDEpO1xuXHRcdFx0XHRcdGlmKHZhbC5jaGFyQXQoMCkgPT09ICdcIicpIHZhbCA9IHZhbC5zbGljZSgxLHZhbC5sZW5ndGggLSAxKTtcblx0XHRcdFx0XHRlbHNlIGlmKHZhbCA9PT0gJ1RSVUUnKSB2YWwgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgaWYodmFsID09PSAnRkFMU0UnKSB2YWwgPSBmYWxzZTtcblx0XHRcdFx0XHRlbHNlIGlmKCFpc05hTihmdXp6eW51bSh2YWwpKSkge1xuXHRcdFx0XHRcdFx0dmFsID0gZnV6enludW0odmFsKTtcblx0XHRcdFx0XHRcdGlmKG5leHRfY2VsbF9mb3JtYXQgIT09IG51bGwgJiYgZm10X2lzX2RhdGUobmV4dF9jZWxsX2Zvcm1hdCkpIHZhbCA9IG51bWRhdGUodmFsKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoIWlzTmFOKGZ1enp5ZGF0ZSh2YWwpLmdldERhdGUoKSkpIHtcblx0XHRcdFx0XHRcdHZhbCA9IHBhcnNlRGF0ZSh2YWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZih0eXBlb2YgJGNwdGFibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiAmJiAoKG9wdHN8fHt9KS50eXBlICE9IFwic3RyaW5nXCIpICYmIChvcHRzfHx7fSkuY29kZXBhZ2UpIHZhbCA9ICRjcHRhYmxlLnV0aWxzLmRlY29kZShvcHRzLmNvZGVwYWdlLCB2YWwpO1xuXHRcdFx0XHRcdENfc2Vlbl9LID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRSc6XG5cdFx0XHRcdFx0Q19zZWVuX0UgPSB0cnVlO1xuXHRcdFx0XHRcdHZhciBmb3JtdWxhID0gcmNfdG9fYTEocmVjb3JkW3JqXS5zbGljZSgxKSwge3I6UixjOkN9KTtcblx0XHRcdFx0XHRhcnJbUl1bQ10gPSBbYXJyW1JdW0NdLCBmb3JtdWxhXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnUyc6XG5cdFx0XHRcdFx0Q19zZWVuX1MgPSB0cnVlO1xuXHRcdFx0XHRcdGFycltSXVtDXSA9IFthcnJbUl1bQ10sIFwiUzVTXCJdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdHJzogYnJlYWs7IC8vIHVua25vd25cblx0XHRcdFx0Y2FzZSAnUic6IF9SID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSktMTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0MnOiBfQyA9IHBhcnNlSW50KHJlY29yZFtyal0uc2xpY2UoMSkpLTE7IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBpZihvcHRzICYmIG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJTWUxLIGJhZCByZWNvcmQgXCIgKyByc3RyKTtcblx0XHRcdH1cblx0XHRcdGlmKENfc2Vlbl9LKSB7XG5cdFx0XHRcdGlmKGFycltSXVtDXSAmJiBhcnJbUl1bQ10ubGVuZ3RoID09IDIpIGFycltSXVtDXVswXSA9IHZhbDtcblx0XHRcdFx0ZWxzZSBhcnJbUl1bQ10gPSB2YWw7XG5cdFx0XHRcdG5leHRfY2VsbF9mb3JtYXQgPSBudWxsO1xuXHRcdFx0fVxuXHRcdFx0aWYoQ19zZWVuX1MpIHtcblx0XHRcdFx0aWYoQ19zZWVuX0UpIHRocm93IG5ldyBFcnJvcihcIlNZTEsgc2hhcmVkIGZvcm11bGEgY2Fubm90IGhhdmUgb3duIGZvcm11bGFcIik7XG5cdFx0XHRcdHZhciBzaHJiYXNlID0gX1IgPiAtMSAmJiBhcnJbX1JdW19DXTtcblx0XHRcdFx0aWYoIXNocmJhc2UgfHwgIXNocmJhc2VbMV0pIHRocm93IG5ldyBFcnJvcihcIlNZTEsgc2hhcmVkIGZvcm11bGEgY2Fubm90IGZpbmQgYmFzZVwiKTtcblx0XHRcdFx0YXJyW1JdW0NdWzFdID0gc2hpZnRfZm9ybXVsYV9zdHIoc2hyYmFzZVsxXSwge3I6IFIgLSBfUiwgYzogQyAtIF9DfSk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ0YnOlxuXHRcdFx0dmFyIEZfc2VlbiA9IDA7XG5cdFx0XHRmb3Iocmo9MTsgcmo8cmVjb3JkLmxlbmd0aDsgKytyaikgc3dpdGNoKHJlY29yZFtyal0uY2hhckF0KDApKSB7XG5cdFx0XHRcdGNhc2UgJ1gnOiBDID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSktMTsgKytGX3NlZW47IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdZJzpcblx0XHRcdFx0XHRSID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSktMTsgLypDID0gMDsqL1xuXHRcdFx0XHRcdGZvcihqID0gYXJyLmxlbmd0aDsgaiA8PSBSOyArK2opIGFycltqXSA9IFtdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdNJzogTXZhbCA9IHBhcnNlSW50KHJlY29yZFtyal0uc2xpY2UoMSkpIC8gMjA7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdGJzogYnJlYWs7IC8qID8/PyAqL1xuXHRcdFx0XHRjYXNlICdHJzogYnJlYWs7IC8qIGhpZGUgZ3JpZCAqL1xuXHRcdFx0XHRjYXNlICdQJzpcblx0XHRcdFx0XHRuZXh0X2NlbGxfZm9ybWF0ID0gZm9ybWF0c1twYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKV07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1MnOiBicmVhazsgLyogY2VsbCBzdHlsZSAqL1xuXHRcdFx0XHRjYXNlICdEJzogYnJlYWs7IC8qIGNvbHVtbiAqL1xuXHRcdFx0XHRjYXNlICdOJzogYnJlYWs7IC8qIGZvbnQgKi9cblx0XHRcdFx0Y2FzZSAnVyc6XG5cdFx0XHRcdFx0Y3cgPSByZWNvcmRbcmpdLnNsaWNlKDEpLnNwbGl0KFwiIFwiKTtcblx0XHRcdFx0XHRmb3IoaiA9IHBhcnNlSW50KGN3WzBdLCAxMCk7IGogPD0gcGFyc2VJbnQoY3dbMV0sIDEwKTsgKytqKSB7XG5cdFx0XHRcdFx0XHRNdmFsID0gcGFyc2VJbnQoY3dbMl0sIDEwKTtcblx0XHRcdFx0XHRcdGNvbGluZm9bai0xXSA9IE12YWwgPT09IDAgPyB7aGlkZGVuOnRydWV9OiB7d2NoOk12YWx9OyBwcm9jZXNzX2NvbChjb2xpbmZvW2otMV0pO1xuXHRcdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0MnOiAvKiBkZWZhdWx0IGNvbHVtbiBmb3JtYXQgKi9cblx0XHRcdFx0XHRDID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSktMTtcblx0XHRcdFx0XHRpZighY29saW5mb1tDXSkgY29saW5mb1tDXSA9IHt9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdSJzogLyogcm93IHByb3BlcnRpZXMgKi9cblx0XHRcdFx0XHRSID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSktMTtcblx0XHRcdFx0XHRpZighcm93aW5mb1tSXSkgcm93aW5mb1tSXSA9IHt9O1xuXHRcdFx0XHRcdGlmKE12YWwgPiAwKSB7IHJvd2luZm9bUl0uaHB0ID0gTXZhbDsgcm93aW5mb1tSXS5ocHggPSBwdDJweChNdmFsKTsgfVxuXHRcdFx0XHRcdGVsc2UgaWYoTXZhbCA9PT0gMCkgcm93aW5mb1tSXS5oaWRkZW4gPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBpZihvcHRzICYmIG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJTWUxLIGJhZCByZWNvcmQgXCIgKyByc3RyKTtcblx0XHRcdH1cblx0XHRcdGlmKEZfc2VlbiA8IDEpIG5leHRfY2VsbF9mb3JtYXQgPSBudWxsOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMgJiYgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlNZTEsgYmFkIHJlY29yZCBcIiArIHJzdHIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihyb3dpbmZvLmxlbmd0aCA+IDApIHNodFsnIXJvd3MnXSA9IHJvd2luZm87XG5cdFx0aWYoY29saW5mby5sZW5ndGggPiAwKSBzaHRbJyFjb2xzJ10gPSBjb2xpbmZvO1xuXHRcdGlmKG9wdHMgJiYgb3B0cy5zaGVldFJvd3MpIGFyciA9IGFyci5zbGljZSgwLCBvcHRzLnNoZWV0Um93cyk7XG5cdFx0cmV0dXJuIFthcnIsIHNodF07XG5cdH1cblxuXHRmdW5jdGlvbiBzeWxrX3RvX3NoZWV0KGQvKjpSYXdEYXRhKi8sIG9wdHMpLyo6V29ya3NoZWV0Ki8ge1xuXHRcdHZhciBhb2FzaHQgPSBzeWxrX3RvX2FvYShkLCBvcHRzKTtcblx0XHR2YXIgYW9hID0gYW9hc2h0WzBdLCB3cyA9IGFvYXNodFsxXTtcblx0XHR2YXIgbyA9IGFvYV90b19zaGVldChhb2EsIG9wdHMpO1xuXHRcdGtleXMod3MpLmZvckVhY2goZnVuY3Rpb24oaykgeyBvW2tdID0gd3Nba107IH0pO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3lsa190b193b3JrYm9vayhkLyo6UmF3RGF0YSovLCBvcHRzKS8qOldvcmtib29rKi8geyByZXR1cm4gc2hlZXRfdG9fd29ya2Jvb2soc3lsa190b19zaGVldChkLCBvcHRzKSwgb3B0cyk7IH1cblxuXHRmdW5jdGlvbiB3cml0ZV93c19jZWxsX3N5bGsoY2VsbC8qOkNlbGwqLywgd3MvKjpXb3Jrc2hlZXQqLywgUi8qOm51bWJlciovLCBDLyo6bnVtYmVyKi8vKjo6LCBvcHRzKi8pLyo6c3RyaW5nKi8ge1xuXHRcdHZhciBvID0gXCJDO1lcIiArIChSKzEpICsgXCI7WFwiICsgKEMrMSkgKyBcIjtLXCI7XG5cdFx0c3dpdGNoKGNlbGwudCkge1xuXHRcdFx0Y2FzZSAnbic6XG5cdFx0XHRcdG8gKz0gKGNlbGwudnx8MCk7XG5cdFx0XHRcdGlmKGNlbGwuZiAmJiAhY2VsbC5GKSBvICs9IFwiO0VcIiArIGExX3RvX3JjKGNlbGwuZiwge3I6UiwgYzpDfSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYic6IG8gKz0gY2VsbC52ID8gXCJUUlVFXCIgOiBcIkZBTFNFXCI7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnZSc6IG8gKz0gY2VsbC53IHx8IGNlbGwudjsgYnJlYWs7XG5cdFx0XHRjYXNlICdkJzogbyArPSAnXCInICsgKGNlbGwudyB8fCBjZWxsLnYpICsgJ1wiJzsgYnJlYWs7XG5cdFx0XHRjYXNlICdzJzogbyArPSAnXCInICsgY2VsbC52LnJlcGxhY2UoL1wiL2csXCJcIikucmVwbGFjZSgvOy9nLCBcIjs7XCIpICsgJ1wiJzsgYnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVfd3NfY29sc19zeWxrKG91dCwgY29scykge1xuXHRcdGNvbHMuZm9yRWFjaChmdW5jdGlvbihjb2wsIGkpIHtcblx0XHRcdHZhciByZWMgPSBcIkY7V1wiICsgKGkrMSkgKyBcIiBcIiArIChpKzEpICsgXCIgXCI7XG5cdFx0XHRpZihjb2wuaGlkZGVuKSByZWMgKz0gXCIwXCI7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYodHlwZW9mIGNvbC53aWR0aCA9PSAnbnVtYmVyJyAmJiAhY29sLndweCkgY29sLndweCA9IHdpZHRoMnB4KGNvbC53aWR0aCk7XG5cdFx0XHRcdGlmKHR5cGVvZiBjb2wud3B4ID09ICdudW1iZXInICYmICFjb2wud2NoKSBjb2wud2NoID0gcHgyY2hhcihjb2wud3B4KTtcblx0XHRcdFx0aWYodHlwZW9mIGNvbC53Y2ggPT0gJ251bWJlcicpIHJlYyArPSBNYXRoLnJvdW5kKGNvbC53Y2gpO1xuXHRcdFx0fVxuXHRcdFx0aWYocmVjLmNoYXJBdChyZWMubGVuZ3RoIC0gMSkgIT0gXCIgXCIpIG91dC5wdXNoKHJlYyk7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB3cml0ZV93c19yb3dzX3N5bGsob3V0Lyo6QXJyYXk8c3RyaW5nPiovLCByb3dzLyo6QXJyYXk8Um93SW5mbz4qLykge1xuXHRcdHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3csIGkpIHtcblx0XHRcdHZhciByZWMgPSBcIkY7XCI7XG5cdFx0XHRpZihyb3cuaGlkZGVuKSByZWMgKz0gXCJNMDtcIjtcblx0XHRcdGVsc2UgaWYocm93LmhwdCkgcmVjICs9IFwiTVwiICsgMjAgKiByb3cuaHB0ICsgXCI7XCI7XG5cdFx0XHRlbHNlIGlmKHJvdy5ocHgpIHJlYyArPSBcIk1cIiArIDIwICogcHgycHQocm93LmhweCkgKyBcIjtcIjtcblx0XHRcdGlmKHJlYy5sZW5ndGggPiAyKSBvdXQucHVzaChyZWMgKyBcIlJcIiArIChpKzEpKTtcblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNoZWV0X3RvX3N5bGsod3MvKjpXb3Jrc2hlZXQqLywgb3B0cy8qOj9hbnkqLykvKjpzdHJpbmcqLyB7XG5cdFx0dmFyIHByZWFtYmxlLyo6QXJyYXk8c3RyaW5nPiovID0gW1wiSUQ7UFdYTDtOO0VcIl0sIG8vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0XHR2YXIgciA9IHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pLCBjZWxsLyo6Q2VsbCovO1xuXHRcdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHRcdHZhciBSUyA9IFwiXFxyXFxuXCI7XG5cblx0XHRwcmVhbWJsZS5wdXNoKFwiUDtQR2VuZXJhbFwiKTtcblx0XHRwcmVhbWJsZS5wdXNoKFwiRjtQMDtERzBHODtNMjU1XCIpO1xuXHRcdGlmKHdzWychY29scyddKSB3cml0ZV93c19jb2xzX3N5bGsocHJlYW1ibGUsIHdzWychY29scyddKTtcblx0XHRpZih3c1snIXJvd3MnXSkgd3JpdGVfd3Nfcm93c19zeWxrKHByZWFtYmxlLCB3c1snIXJvd3MnXSk7XG5cblx0XHRwcmVhbWJsZS5wdXNoKFwiQjtZXCIgKyAoci5lLnIgLSByLnMuciArIDEpICsgXCI7WFwiICsgKHIuZS5jIC0gci5zLmMgKyAxKSArIFwiO0RcIiArIFtyLnMuYyxyLnMucixyLmUuYyxyLmUucl0uam9pbihcIiBcIikpO1xuXHRcdGZvcih2YXIgUiA9IHIucy5yOyBSIDw9IHIuZS5yOyArK1IpIHtcblx0XHRcdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRcdFx0dmFyIGNvb3JkID0gZW5jb2RlX2NlbGwoe3I6UixjOkN9KTtcblx0XHRcdFx0Y2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ106IHdzW2Nvb3JkXTtcblx0XHRcdFx0aWYoIWNlbGwgfHwgKGNlbGwudiA9PSBudWxsICYmICghY2VsbC5mIHx8IGNlbGwuRikpKSBjb250aW51ZTtcblx0XHRcdFx0by5wdXNoKHdyaXRlX3dzX2NlbGxfc3lsayhjZWxsLCB3cywgUiwgQywgb3B0cykpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlYW1ibGUuam9pbihSUykgKyBSUyArIG8uam9pbihSUykgKyBSUyArIFwiRVwiICsgUlM7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBzeWxrX3RvX3dvcmtib29rLFxuXHRcdHRvX3NoZWV0OiBzeWxrX3RvX3NoZWV0LFxuXHRcdGZyb21fc2hlZXQ6IHNoZWV0X3RvX3N5bGtcblx0fTtcbn0pKCk7XG5cbnZhciBESUYgPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xuXHRmdW5jdGlvbiBkaWZfdG9fYW9hKGQvKjpSYXdEYXRhKi8sIG9wdHMpLyo6QU9BKi8ge1xuXHRcdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jhc2U2NCc6IHJldHVybiBkaWZfdG9fYW9hX3N0cihCYXNlNjRfZGVjb2RlKGQpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2JpbmFyeSc6IHJldHVybiBkaWZfdG9fYW9hX3N0cihkLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2J1ZmZlcic6IHJldHVybiBkaWZfdG9fYW9hX3N0cihoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihkKSA/IGQudG9TdHJpbmcoJ2JpbmFyeScpIDogYTJzKGQpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2FycmF5JzogcmV0dXJuIGRpZl90b19hb2Ffc3RyKGNjMnN0cihkKSwgb3B0cyk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcblx0fVxuXHRmdW5jdGlvbiBkaWZfdG9fYW9hX3N0cihzdHIvKjpzdHJpbmcqLywgb3B0cykvKjpBT0EqLyB7XG5cdFx0dmFyIHJlY29yZHMgPSBzdHIuc3BsaXQoJ1xcbicpLCBSID0gLTEsIEMgPSAtMSwgcmkgPSAwLCBhcnIvKjpBT0EqLyA9IFtdO1xuXHRcdGZvciAoOyByaSAhPT0gcmVjb3Jkcy5sZW5ndGg7ICsrcmkpIHtcblx0XHRcdGlmIChyZWNvcmRzW3JpXS50cmltKCkgPT09ICdCT1QnKSB7IGFyclsrK1JdID0gW107IEMgPSAwOyBjb250aW51ZTsgfVxuXHRcdFx0aWYgKFIgPCAwKSBjb250aW51ZTtcblx0XHRcdHZhciBtZXRhZGF0YSA9IHJlY29yZHNbcmldLnRyaW0oKS5zcGxpdChcIixcIik7XG5cdFx0XHR2YXIgdHlwZSA9IG1ldGFkYXRhWzBdLCB2YWx1ZSA9IG1ldGFkYXRhWzFdO1xuXHRcdFx0KytyaTtcblx0XHRcdHZhciBkYXRhID0gcmVjb3Jkc1tyaV0gfHwgXCJcIjtcblx0XHRcdHdoaWxlKCgoZGF0YS5tYXRjaCgvW1wiXS9nKXx8W10pLmxlbmd0aCAmIDEpICYmIHJpIDwgcmVjb3Jkcy5sZW5ndGggLSAxKSBkYXRhICs9IFwiXFxuXCIgKyByZWNvcmRzWysrcmldO1xuXHRcdFx0ZGF0YSA9IGRhdGEudHJpbSgpO1xuXHRcdFx0c3dpdGNoICgrdHlwZSkge1xuXHRcdFx0XHRjYXNlIC0xOlxuXHRcdFx0XHRcdGlmIChkYXRhID09PSAnQk9UJykgeyBhcnJbKytSXSA9IFtdOyBDID0gMDsgY29udGludWU7IH1cblx0XHRcdFx0XHRlbHNlIGlmIChkYXRhICE9PSAnRU9EJykgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIERJRiBzcGVjaWFsIGNvbW1hbmQgXCIgKyBkYXRhKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRcdGlmKGRhdGEgPT09ICdUUlVFJykgYXJyW1JdW0NdID0gdHJ1ZTtcblx0XHRcdFx0XHRlbHNlIGlmKGRhdGEgPT09ICdGQUxTRScpIGFycltSXVtDXSA9IGZhbHNlO1xuXHRcdFx0XHRcdGVsc2UgaWYoIWlzTmFOKGZ1enp5bnVtKHZhbHVlKSkpIGFycltSXVtDXSA9IGZ1enp5bnVtKHZhbHVlKTtcblx0XHRcdFx0XHRlbHNlIGlmKCFpc05hTihmdXp6eWRhdGUodmFsdWUpLmdldERhdGUoKSkpIGFycltSXVtDXSA9IHBhcnNlRGF0ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0ZWxzZSBhcnJbUl1bQ10gPSB2YWx1ZTtcblx0XHRcdFx0XHQrK0M7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0ZGF0YSA9IGRhdGEuc2xpY2UoMSxkYXRhLmxlbmd0aC0xKTtcblx0XHRcdFx0XHRkYXRhID0gZGF0YS5yZXBsYWNlKC9cIlwiL2csICdcIicpO1xuXHRcdFx0XHRcdGlmKERJRl9YTCAmJiBkYXRhICYmIGRhdGEubWF0Y2goL149XCIuKlwiJC8pKSBkYXRhID0gZGF0YS5zbGljZSgyLCAtMSk7XG5cdFx0XHRcdFx0YXJyW1JdW0MrK10gPSBkYXRhICE9PSAnJyA/IGRhdGEgOiBudWxsO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRhdGEgPT09ICdFT0QnKSBicmVhaztcblx0XHR9XG5cdFx0aWYob3B0cyAmJiBvcHRzLnNoZWV0Um93cykgYXJyID0gYXJyLnNsaWNlKDAsIG9wdHMuc2hlZXRSb3dzKTtcblx0XHRyZXR1cm4gYXJyO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGlmX3RvX3NoZWV0KHN0ci8qOnN0cmluZyovLCBvcHRzKS8qOldvcmtzaGVldCovIHsgcmV0dXJuIGFvYV90b19zaGVldChkaWZfdG9fYW9hKHN0ciwgb3B0cyksIG9wdHMpOyB9XG5cdGZ1bmN0aW9uIGRpZl90b193b3JrYm9vayhzdHIvKjpzdHJpbmcqLywgb3B0cykvKjpXb3JrYm9vayovIHsgcmV0dXJuIHNoZWV0X3RvX3dvcmtib29rKGRpZl90b19zaGVldChzdHIsIG9wdHMpLCBvcHRzKTsgfVxuXG5cdHZhciBzaGVldF90b19kaWYgPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwdXNoX2ZpZWxkID0gZnVuY3Rpb24gcGYoby8qOkFycmF5PHN0cmluZz4qLywgdG9waWMvKjpzdHJpbmcqLywgdi8qOm51bWJlciovLCBuLyo6bnVtYmVyKi8sIHMvKjpzdHJpbmcqLykge1xuXHRcdFx0by5wdXNoKHRvcGljKTtcblx0XHRcdG8ucHVzaCh2ICsgXCIsXCIgKyBuKTtcblx0XHRcdG8ucHVzaCgnXCInICsgcy5yZXBsYWNlKC9cIi9nLCdcIlwiJykgKyAnXCInKTtcblx0XHR9O1xuXHRcdHZhciBwdXNoX3ZhbHVlID0gZnVuY3Rpb24gcG8oby8qOkFycmF5PHN0cmluZz4qLywgdHlwZS8qOm51bWJlciovLCB2Lyo6YW55Ki8sIHMvKjpzdHJpbmcqLykge1xuXHRcdFx0by5wdXNoKHR5cGUgKyBcIixcIiArIHYpO1xuXHRcdFx0by5wdXNoKHR5cGUgPT0gMSA/ICdcIicgKyBzLnJlcGxhY2UoL1wiL2csJ1wiXCInKSArICdcIicgOiBzKTtcblx0XHR9O1xuXHRcdHJldHVybiBmdW5jdGlvbiBzaGVldF90b19kaWYod3MvKjpXb3Jrc2hlZXQqLy8qOjosIG9wdHM6P2FueSovKS8qOnN0cmluZyovIHtcblx0XHRcdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdFx0XHR2YXIgciA9IHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pLCBjZWxsLyo6Q2VsbCovO1xuXHRcdFx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdFx0XHRwdXNoX2ZpZWxkKG8sIFwiVEFCTEVcIiwgMCwgMSwgXCJzaGVldGpzXCIpO1xuXHRcdFx0cHVzaF9maWVsZChvLCBcIlZFQ1RPUlNcIiwgMCwgci5lLnIgLSByLnMuciArIDEsXCJcIik7XG5cdFx0XHRwdXNoX2ZpZWxkKG8sIFwiVFVQTEVTXCIsIDAsIHIuZS5jIC0gci5zLmMgKyAxLFwiXCIpO1xuXHRcdFx0cHVzaF9maWVsZChvLCBcIkRBVEFcIiwgMCwgMCxcIlwiKTtcblx0XHRcdGZvcih2YXIgUiA9IHIucy5yOyBSIDw9IHIuZS5yOyArK1IpIHtcblx0XHRcdFx0cHVzaF92YWx1ZShvLCAtMSwgMCwgXCJCT1RcIik7XG5cdFx0XHRcdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRcdFx0XHR2YXIgY29vcmQgPSBlbmNvZGVfY2VsbCh7cjpSLGM6Q30pO1xuXHRcdFx0XHRcdGNlbGwgPSBkZW5zZSA/ICh3c1tSXXx8W10pW0NdIDogd3NbY29vcmRdO1xuXHRcdFx0XHRcdGlmKCFjZWxsKSB7IHB1c2hfdmFsdWUobywgMSwgMCwgXCJcIik7IGNvbnRpbnVlO31cblx0XHRcdFx0XHRzd2l0Y2goY2VsbC50KSB7XG5cdFx0XHRcdFx0XHRjYXNlICduJzpcblx0XHRcdFx0XHRcdFx0dmFyIHZhbCA9IERJRl9YTCA/IGNlbGwudyA6IGNlbGwudjtcblx0XHRcdFx0XHRcdFx0aWYoIXZhbCAmJiBjZWxsLnYgIT0gbnVsbCkgdmFsID0gY2VsbC52O1xuXHRcdFx0XHRcdFx0XHRpZih2YWwgPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmKERJRl9YTCAmJiBjZWxsLmYgJiYgIWNlbGwuRikgcHVzaF92YWx1ZShvLCAxLCAwLCBcIj1cIiArIGNlbGwuZik7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSBwdXNoX3ZhbHVlKG8sIDEsIDAsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2UgcHVzaF92YWx1ZShvLCAwLCB2YWwsIFwiVlwiKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdiJzpcblx0XHRcdFx0XHRcdFx0cHVzaF92YWx1ZShvLCAwLCBjZWxsLnYgPyAxIDogMCwgY2VsbC52ID8gXCJUUlVFXCIgOiBcIkZBTFNFXCIpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3MnOlxuXHRcdFx0XHRcdFx0XHRwdXNoX3ZhbHVlKG8sIDEsIDAsICghRElGX1hMIHx8IGlzTmFOKGNlbGwudikpID8gY2VsbC52IDogJz1cIicgKyBjZWxsLnYgKyAnXCInKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0XHRcdFx0aWYoIWNlbGwudykgY2VsbC53ID0gU1NGX2Zvcm1hdChjZWxsLnogfHwgdGFibGVfZm10WzE0XSwgZGF0ZW51bShwYXJzZURhdGUoY2VsbC52KSkpO1xuXHRcdFx0XHRcdFx0XHRpZihESUZfWEwpIHB1c2hfdmFsdWUobywgMCwgY2VsbC53LCBcIlZcIik7XG5cdFx0XHRcdFx0XHRcdGVsc2UgcHVzaF92YWx1ZShvLCAxLCAwLCBjZWxsLncpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6IHB1c2hfdmFsdWUobywgMSwgMCwgXCJcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwdXNoX3ZhbHVlKG8sIC0xLCAwLCBcIkVPRFwiKTtcblx0XHRcdHZhciBSUyA9IFwiXFxyXFxuXCI7XG5cdFx0XHR2YXIgb28gPSBvLmpvaW4oUlMpO1xuXHRcdFx0Ly93aGlsZSgob28ubGVuZ3RoICYgMHg3RikgIT0gMCkgb28gKz0gXCJcXDBcIjtcblx0XHRcdHJldHVybiBvbztcblx0XHR9O1xuXHR9KSgpO1xuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBkaWZfdG9fd29ya2Jvb2ssXG5cdFx0dG9fc2hlZXQ6IGRpZl90b19zaGVldCxcblx0XHRmcm9tX3NoZWV0OiBzaGVldF90b19kaWZcblx0fTtcbn0pKCk7XG5cbnZhciBFVEggPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xuXHRmdW5jdGlvbiBkZWNvZGUocy8qOnN0cmluZyovKS8qOnN0cmluZyovIHsgcmV0dXJuIHMucmVwbGFjZSgvXFxcXGIvZyxcIlxcXFxcIikucmVwbGFjZSgvXFxcXGMvZyxcIjpcIikucmVwbGFjZSgvXFxcXG4vZyxcIlxcblwiKTsgfVxuXHRmdW5jdGlvbiBlbmNvZGUocy8qOnN0cmluZyovKS8qOnN0cmluZyovIHsgcmV0dXJuIHMucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxiXCIpLnJlcGxhY2UoLzovZywgXCJcXFxcY1wiKS5yZXBsYWNlKC9cXG4vZyxcIlxcXFxuXCIpOyB9XG5cblx0ZnVuY3Rpb24gZXRoX3RvX2FvYShzdHIvKjpzdHJpbmcqLywgb3B0cykvKjpBT0EqLyB7XG5cdFx0dmFyIHJlY29yZHMgPSBzdHIuc3BsaXQoJ1xcbicpLCBSID0gLTEsIEMgPSAtMSwgcmkgPSAwLCBhcnIvKjpBT0EqLyA9IFtdO1xuXHRcdGZvciAoOyByaSAhPT0gcmVjb3Jkcy5sZW5ndGg7ICsrcmkpIHtcblx0XHRcdHZhciByZWNvcmQgPSByZWNvcmRzW3JpXS50cmltKCkuc3BsaXQoXCI6XCIpO1xuXHRcdFx0aWYocmVjb3JkWzBdICE9PSAnY2VsbCcpIGNvbnRpbnVlO1xuXHRcdFx0dmFyIGFkZHIgPSBkZWNvZGVfY2VsbChyZWNvcmRbMV0pO1xuXHRcdFx0aWYoYXJyLmxlbmd0aCA8PSBhZGRyLnIpIGZvcihSID0gYXJyLmxlbmd0aDsgUiA8PSBhZGRyLnI7ICsrUikgaWYoIWFycltSXSkgYXJyW1JdID0gW107XG5cdFx0XHRSID0gYWRkci5yOyBDID0gYWRkci5jO1xuXHRcdFx0c3dpdGNoKHJlY29yZFsyXSkge1xuXHRcdFx0XHRjYXNlICd0JzogYXJyW1JdW0NdID0gZGVjb2RlKHJlY29yZFszXSk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICd2JzogYXJyW1JdW0NdID0gK3JlY29yZFszXTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3Z0Zic6IHZhciBfZiA9IHJlY29yZFtyZWNvcmQubGVuZ3RoIC0gMV07XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlICd2dGMnOlxuXHRcdFx0XHRcdHN3aXRjaChyZWNvcmRbM10pIHtcblx0XHRcdFx0XHRcdGNhc2UgJ25sJzogYXJyW1JdW0NdID0gK3JlY29yZFs0XSA/IHRydWUgOiBmYWxzZTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OiBhcnJbUl1bQ10gPSArcmVjb3JkWzRdOyBicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYocmVjb3JkWzJdID09ICd2dGYnKSBhcnJbUl1bQ10gPSBbYXJyW1JdW0NdLCBfZl07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKG9wdHMgJiYgb3B0cy5zaGVldFJvd3MpIGFyciA9IGFyci5zbGljZSgwLCBvcHRzLnNoZWV0Um93cyk7XG5cdFx0cmV0dXJuIGFycjtcblx0fVxuXG5cdGZ1bmN0aW9uIGV0aF90b19zaGVldChkLyo6c3RyaW5nKi8sIG9wdHMpLyo6V29ya3NoZWV0Ki8geyByZXR1cm4gYW9hX3RvX3NoZWV0KGV0aF90b19hb2EoZCwgb3B0cyksIG9wdHMpOyB9XG5cdGZ1bmN0aW9uIGV0aF90b193b3JrYm9vayhkLyo6c3RyaW5nKi8sIG9wdHMpLyo6V29ya2Jvb2sqLyB7IHJldHVybiBzaGVldF90b193b3JrYm9vayhldGhfdG9fc2hlZXQoZCwgb3B0cyksIG9wdHMpOyB9XG5cblx0dmFyIGhlYWRlciA9IFtcblx0XHRcInNvY2lhbGNhbGM6dmVyc2lvbjoxLjVcIixcblx0XHRcIk1JTUUtVmVyc2lvbjogMS4wXCIsXG5cdFx0XCJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9U29jaWFsQ2FsY1NwcmVhZHNoZWV0Q29udHJvbFNhdmVcIlxuXHRdLmpvaW4oXCJcXG5cIik7XG5cblx0dmFyIHNlcCA9IFtcblx0XHRcIi0tU29jaWFsQ2FsY1NwcmVhZHNoZWV0Q29udHJvbFNhdmVcIixcblx0XHRcIkNvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFwiXG5cdF0uam9pbihcIlxcblwiKSArIFwiXFxuXCI7XG5cblx0LyogVE9ETzogdGhlIG90aGVyIHBhcnRzICovXG5cdHZhciBtZXRhID0gW1xuXHRcdFwiIyBTb2NpYWxDYWxjIFNwcmVhZHNoZWV0IENvbnRyb2wgU2F2ZVwiLFxuXHRcdFwicGFydDpzaGVldFwiXG5cdF0uam9pbihcIlxcblwiKTtcblxuXHR2YXIgZW5kID0gXCItLVNvY2lhbENhbGNTcHJlYWRzaGVldENvbnRyb2xTYXZlLS1cIjtcblxuXHRmdW5jdGlvbiBzaGVldF90b19ldGhfZGF0YSh3cy8qOldvcmtzaGVldCovKS8qOnN0cmluZyovIHtcblx0XHRpZighd3MgfHwgIXdzWychcmVmJ10pIHJldHVybiBcIlwiO1xuXHRcdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW10sIG9vLyo6QXJyYXk8c3RyaW5nPiovID0gW10sIGNlbGwsIGNvb3JkID0gXCJcIjtcblx0XHR2YXIgciA9IGRlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0XHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0XHRmb3IodmFyIFIgPSByLnMucjsgUiA8PSByLmUucjsgKytSKSB7XG5cdFx0XHRmb3IodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0XHRcdGNvb3JkID0gZW5jb2RlX2NlbGwoe3I6UixjOkN9KTtcblx0XHRcdFx0Y2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tjb29yZF07XG5cdFx0XHRcdGlmKCFjZWxsIHx8IGNlbGwudiA9PSBudWxsIHx8IGNlbGwudCA9PT0gJ3onKSBjb250aW51ZTtcblx0XHRcdFx0b28gPSBbXCJjZWxsXCIsIGNvb3JkLCAndCddO1xuXHRcdFx0XHRzd2l0Y2goY2VsbC50KSB7XG5cdFx0XHRcdFx0Y2FzZSAncyc6IGNhc2UgJ3N0cic6IG9vLnB1c2goZW5jb2RlKGNlbGwudikpOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICduJzpcblx0XHRcdFx0XHRcdGlmKCFjZWxsLmYpIHsgb29bMl09J3YnOyBvb1szXT1jZWxsLnY7IH1cblx0XHRcdFx0XHRcdGVsc2UgeyBvb1syXT0ndnRmJzsgb29bM109J24nOyBvb1s0XT1jZWxsLnY7IG9vWzVdPWVuY29kZShjZWxsLmYpOyB9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdiJzpcblx0XHRcdFx0XHRcdG9vWzJdID0gJ3Z0JysoY2VsbC5mPydmJzonYycpOyBvb1szXT0nbmwnOyBvb1s0XT1jZWxsLnY/XCIxXCI6XCIwXCI7XG5cdFx0XHRcdFx0XHRvb1s1XSA9IGVuY29kZShjZWxsLmZ8fChjZWxsLnY/J1RSVUUnOidGQUxTRScpKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2QnOlxuXHRcdFx0XHRcdFx0dmFyIHQgPSBkYXRlbnVtKHBhcnNlRGF0ZShjZWxsLnYpKTtcblx0XHRcdFx0XHRcdG9vWzJdID0gJ3Z0Yyc7IG9vWzNdID0gJ25kJzsgb29bNF0gPSBcIlwiK3Q7XG5cdFx0XHRcdFx0XHRvb1s1XSA9IGNlbGwudyB8fCBTU0ZfZm9ybWF0KGNlbGwueiB8fCB0YWJsZV9mbXRbMTRdLCB0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2UnOiBjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvLnB1c2gob28uam9pbihcIjpcIikpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRvLnB1c2goXCJzaGVldDpjOlwiICsgKHIuZS5jLXIucy5jKzEpICsgXCI6cjpcIiArIChyLmUuci1yLnMucisxKSArIFwiOnR2ZjoxXCIpO1xuXHRcdG8ucHVzaChcInZhbHVlZm9ybWF0OjE6dGV4dC13aWtpXCIpO1xuXHRcdC8vby5wdXNoKFwiY29waWVkZnJvbTpcIiArIHdzWychcmVmJ10pOyAvLyBjbGlwYm9hcmQgb25seVxuXHRcdHJldHVybiBvLmpvaW4oXCJcXG5cIik7XG5cdH1cblxuXHRmdW5jdGlvbiBzaGVldF90b19ldGgod3MvKjpXb3Jrc2hlZXQqLy8qOjosIG9wdHM6P2FueSovKS8qOnN0cmluZyovIHtcblx0XHRyZXR1cm4gW2hlYWRlciwgc2VwLCBtZXRhLCBzZXAsIHNoZWV0X3RvX2V0aF9kYXRhKHdzKSwgZW5kXS5qb2luKFwiXFxuXCIpO1xuXHRcdC8vIHJldHVybiBbXCJ2ZXJzaW9uOjEuNVwiLCBzaGVldF90b19ldGhfZGF0YSh3cyldLmpvaW4oXCJcXG5cIik7IC8vIGNsaXBib2FyZCBmb3JtXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBldGhfdG9fd29ya2Jvb2ssXG5cdFx0dG9fc2hlZXQ6IGV0aF90b19zaGVldCxcblx0XHRmcm9tX3NoZWV0OiBzaGVldF90b19ldGhcblx0fTtcbn0pKCk7XG5cbnZhciBQUk4gPSAvKiNfX1BVUkVfXyovKGZ1bmN0aW9uKCkge1xuXHRmdW5jdGlvbiBzZXRfdGV4dF9hcnIoZGF0YS8qOnN0cmluZyovLCBhcnIvKjpBT0EqLywgUi8qOm51bWJlciovLCBDLyo6bnVtYmVyKi8sIG8vKjphbnkqLykge1xuXHRcdGlmKG8ucmF3KSBhcnJbUl1bQ10gPSBkYXRhO1xuXHRcdGVsc2UgaWYoZGF0YSA9PT0gXCJcIil7LyogZW1wdHkgKi99XG5cdFx0ZWxzZSBpZihkYXRhID09PSAnVFJVRScpIGFycltSXVtDXSA9IHRydWU7XG5cdFx0ZWxzZSBpZihkYXRhID09PSAnRkFMU0UnKSBhcnJbUl1bQ10gPSBmYWxzZTtcblx0XHRlbHNlIGlmKCFpc05hTihmdXp6eW51bShkYXRhKSkpIGFycltSXVtDXSA9IGZ1enp5bnVtKGRhdGEpO1xuXHRcdGVsc2UgaWYoIWlzTmFOKGZ1enp5ZGF0ZShkYXRhKS5nZXREYXRlKCkpKSBhcnJbUl1bQ10gPSBwYXJzZURhdGUoZGF0YSk7XG5cdFx0ZWxzZSBhcnJbUl1bQ10gPSBkYXRhO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJuX3RvX2FvYV9zdHIoZi8qOnN0cmluZyovLCBvcHRzKS8qOkFPQSovIHtcblx0XHR2YXIgbyA9IG9wdHMgfHwge307XG5cdFx0dmFyIGFyci8qOkFPQSovID0gKFtdLyo6YW55Ki8pO1xuXHRcdGlmKCFmIHx8IGYubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyO1xuXHRcdHZhciBsaW5lcyA9IGYuc3BsaXQoL1tcXHJcXG5dLyk7XG5cdFx0dmFyIEwgPSBsaW5lcy5sZW5ndGggLSAxO1xuXHRcdHdoaWxlKEwgPj0gMCAmJiBsaW5lc1tMXS5sZW5ndGggPT09IDApIC0tTDtcblx0XHR2YXIgc3RhcnQgPSAxMCwgaWR4ID0gMDtcblx0XHR2YXIgUiA9IDA7XG5cdFx0Zm9yKDsgUiA8PSBMOyArK1IpIHtcblx0XHRcdGlkeCA9IGxpbmVzW1JdLmluZGV4T2YoXCIgXCIpO1xuXHRcdFx0aWYoaWR4ID09IC0xKSBpZHggPSBsaW5lc1tSXS5sZW5ndGg7IGVsc2UgaWR4Kys7XG5cdFx0XHRzdGFydCA9IE1hdGgubWF4KHN0YXJ0LCBpZHgpO1xuXHRcdH1cblx0XHRmb3IoUiA9IDA7IFIgPD0gTDsgKytSKSB7XG5cdFx0XHRhcnJbUl0gPSBbXTtcblx0XHRcdC8qIFRPRE86IGNvbmZpcm0gdGhhdCB3aWR0aHMgYXJlIGFsd2F5cyAxMCAqL1xuXHRcdFx0dmFyIEMgPSAwO1xuXHRcdFx0c2V0X3RleHRfYXJyKGxpbmVzW1JdLnNsaWNlKDAsIHN0YXJ0KS50cmltKCksIGFyciwgUiwgQywgbyk7XG5cdFx0XHRmb3IoQyA9IDE7IEMgPD0gKGxpbmVzW1JdLmxlbmd0aCAtIHN0YXJ0KS8xMCArIDE7ICsrQylcblx0XHRcdFx0c2V0X3RleHRfYXJyKGxpbmVzW1JdLnNsaWNlKHN0YXJ0KyhDLTEpKjEwLHN0YXJ0K0MqMTApLnRyaW0oKSxhcnIsUixDLG8pO1xuXHRcdH1cblx0XHRpZihvLnNoZWV0Um93cykgYXJyID0gYXJyLnNsaWNlKDAsIG8uc2hlZXRSb3dzKTtcblx0XHRyZXR1cm4gYXJyO1xuXHR9XG5cblx0Ly8gTGlzdCBvZiBhY2NlcHRlZCBDU1Ygc2VwYXJhdG9yc1xuXHR2YXIgZ3Vlc3Nfc2VwcyA9IHtcblx0XHQvKjo6WyovMHgyQy8qOjpdKi86ICcsJyxcblx0XHQvKjo6WyovMHgwOS8qOjpdKi86IFwiXFx0XCIsXG5cdFx0Lyo6OlsqLzB4M0IvKjo6XSovOiAnOycsXG5cdFx0Lyo6OlsqLzB4N0MvKjo6XSovOiAnfCdcblx0fTtcblxuXHQvLyBDU1Ygc2VwYXJhdG9yIHdlaWdodHMgdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVxdWFsIG51bWJlcnNcblx0dmFyIGd1ZXNzX3NlcF93ZWlnaHRzID0ge1xuXHRcdC8qOjpbKi8weDJDLyo6Ol0qLzogMyxcblx0XHQvKjo6WyovMHgwOS8qOjpdKi86IDIsXG5cdFx0Lyo6OlsqLzB4M0IvKjo6XSovOiAxLFxuXHRcdC8qOjpbKi8weDdDLyo6Ol0qLzogMFxuXHR9O1xuXG5cdGZ1bmN0aW9uIGd1ZXNzX3NlcChzdHIpIHtcblx0XHR2YXIgY250ID0ge30sIGluc3RyID0gZmFsc2UsIGVuZCA9IDAsIGNjID0gMDtcblx0XHRmb3IoO2VuZCA8IHN0ci5sZW5ndGg7KytlbmQpIHtcblx0XHRcdGlmKChjYz1zdHIuY2hhckNvZGVBdChlbmQpKSA9PSAweDIyKSBpbnN0ciA9ICFpbnN0cjtcblx0XHRcdGVsc2UgaWYoIWluc3RyICYmIGNjIGluIGd1ZXNzX3NlcHMpIGNudFtjY10gPSAoY250W2NjXXx8MCkrMTtcblx0XHR9XG5cblx0XHRjYyA9IFtdO1xuXHRcdGZvcihlbmQgaW4gY250KSBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjbnQsIGVuZCkgKSB7XG5cdFx0XHRjYy5wdXNoKFsgY250W2VuZF0sIGVuZCBdKTtcblx0XHR9XG5cblx0XHRpZiAoICFjYy5sZW5ndGggKSB7XG5cdFx0XHRjbnQgPSBndWVzc19zZXBfd2VpZ2h0cztcblx0XHRcdGZvcihlbmQgaW4gY250KSBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjbnQsIGVuZCkgKSB7XG5cdFx0XHRcdGNjLnB1c2goWyBjbnRbZW5kXSwgZW5kIF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNjLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYVswXSAtIGJbMF0gfHwgZ3Vlc3Nfc2VwX3dlaWdodHNbYVsxXV0gLSBndWVzc19zZXBfd2VpZ2h0c1tiWzFdXTsgfSk7XG5cblx0XHRyZXR1cm4gZ3Vlc3Nfc2Vwc1tjYy5wb3AoKVsxXV0gfHwgMHgyQztcblx0fVxuXG5cdGZ1bmN0aW9uIGRzdl90b19zaGVldF9zdHIoc3RyLyo6c3RyaW5nKi8sIG9wdHMpLyo6V29ya3NoZWV0Ki8ge1xuXHRcdHZhciBvID0gb3B0cyB8fCB7fTtcblx0XHR2YXIgc2VwID0gXCJcIjtcblx0XHRpZihERU5TRSAhPSBudWxsICYmIG8uZGVuc2UgPT0gbnVsbCkgby5kZW5zZSA9IERFTlNFO1xuXHRcdHZhciB3cy8qOldvcmtzaGVldCovID0gby5kZW5zZSA/IChbXS8qOmFueSovKSA6ICh7fS8qOmFueSovKTtcblx0XHR2YXIgcmFuZ2UvKjpSYW5nZSovID0gKHtzOiB7YzowLCByOjB9LCBlOiB7YzowLCByOjB9fS8qOmFueSovKTtcblxuXHRcdGlmKHN0ci5zbGljZSgwLDQpID09IFwic2VwPVwiKSB7XG5cdFx0XHQvLyBJZiB0aGUgbGluZSBlbmRzIGluIFxcclxcblxuXHRcdFx0aWYoc3RyLmNoYXJDb2RlQXQoNSkgPT0gMTMgJiYgc3RyLmNoYXJDb2RlQXQoNikgPT0gMTAgKSB7XG5cdFx0XHRcdHNlcCA9IHN0ci5jaGFyQXQoNCk7IHN0ciA9IHN0ci5zbGljZSg3KTtcblx0XHRcdH1cblx0XHRcdC8vIElmIGxpbmUgZW5kcyBpbiBcXHIgT1IgXFxuXG5cdFx0XHRlbHNlIGlmKHN0ci5jaGFyQ29kZUF0KDUpID09IDEzIHx8IHN0ci5jaGFyQ29kZUF0KDUpID09IDEwICkge1xuXHRcdFx0XHRzZXAgPSBzdHIuY2hhckF0KDQpOyBzdHIgPSBzdHIuc2xpY2UoNik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHNlcCA9IGd1ZXNzX3NlcChzdHIuc2xpY2UoMCwxMDI0KSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYobyAmJiBvLkZTKSBzZXAgPSBvLkZTO1xuXHRcdGVsc2Ugc2VwID0gZ3Vlc3Nfc2VwKHN0ci5zbGljZSgwLDEwMjQpKTtcblx0XHR2YXIgUiA9IDAsIEMgPSAwLCB2ID0gMDtcblx0XHR2YXIgc3RhcnQgPSAwLCBlbmQgPSAwLCBzZXBjYyA9IHNlcC5jaGFyQ29kZUF0KDApLCBpbnN0ciA9IGZhbHNlLCBjYz0wLCBzdGFydGNjPXN0ci5jaGFyQ29kZUF0KDApO1xuXHRcdHN0ciA9IHN0ci5yZXBsYWNlKC9cXHJcXG4vbWcsIFwiXFxuXCIpO1xuXHRcdHZhciBfcmUvKjo/UmVnRXhwKi8gPSBvLmRhdGVORiAhPSBudWxsID8gZGF0ZU5GX3JlZ2V4KG8uZGF0ZU5GKSA6IG51bGw7XG5cdFx0ZnVuY3Rpb24gZmluaXNoX2NlbGwoKSB7XG5cdFx0XHR2YXIgcyA9IHN0ci5zbGljZShzdGFydCwgZW5kKTtcblx0XHRcdHZhciBjZWxsID0gKHt9Lyo6YW55Ki8pO1xuXHRcdFx0aWYocy5jaGFyQXQoMCkgPT0gJ1wiJyAmJiBzLmNoYXJBdChzLmxlbmd0aCAtIDEpID09ICdcIicpIHMgPSBzLnNsaWNlKDEsLTEpLnJlcGxhY2UoL1wiXCIvZywnXCInKTtcblx0XHRcdGlmKHMubGVuZ3RoID09PSAwKSBjZWxsLnQgPSAneic7XG5cdFx0XHRlbHNlIGlmKG8ucmF3KSB7IGNlbGwudCA9ICdzJzsgY2VsbC52ID0gczsgfVxuXHRcdFx0ZWxzZSBpZihzLnRyaW0oKS5sZW5ndGggPT09IDApIHsgY2VsbC50ID0gJ3MnOyBjZWxsLnYgPSBzOyB9XG5cdFx0XHRlbHNlIGlmKHMuY2hhckNvZGVBdCgwKSA9PSAweDNEKSB7XG5cdFx0XHRcdGlmKHMuY2hhckNvZGVBdCgxKSA9PSAweDIyICYmIHMuY2hhckNvZGVBdChzLmxlbmd0aCAtIDEpID09IDB4MjIpIHsgY2VsbC50ID0gJ3MnOyBjZWxsLnYgPSBzLnNsaWNlKDIsLTEpLnJlcGxhY2UoL1wiXCIvZywnXCInKTsgfVxuXHRcdFx0XHRlbHNlIGlmKGZ1enp5Zm1sYShzKSkgeyBjZWxsLnQgPSAnbic7IGNlbGwuZiA9IHMuc2xpY2UoMSk7IH1cblx0XHRcdFx0ZWxzZSB7IGNlbGwudCA9ICdzJzsgY2VsbC52ID0gczsgfSB9XG5cdFx0XHRlbHNlIGlmKHMgPT0gXCJUUlVFXCIpIHsgY2VsbC50ID0gJ2InOyBjZWxsLnYgPSB0cnVlOyB9XG5cdFx0XHRlbHNlIGlmKHMgPT0gXCJGQUxTRVwiKSB7IGNlbGwudCA9ICdiJzsgY2VsbC52ID0gZmFsc2U7IH1cblx0XHRcdGVsc2UgaWYoIWlzTmFOKHYgPSBmdXp6eW51bShzKSkpIHsgY2VsbC50ID0gJ24nOyBpZihvLmNlbGxUZXh0ICE9PSBmYWxzZSkgY2VsbC53ID0gczsgY2VsbC52ID0gdjsgfVxuXHRcdFx0ZWxzZSBpZighaXNOYU4oZnV6enlkYXRlKHMpLmdldERhdGUoKSkgfHwgX3JlICYmIHMubWF0Y2goX3JlKSkge1xuXHRcdFx0XHRjZWxsLnogPSBvLmRhdGVORiB8fCB0YWJsZV9mbXRbMTRdO1xuXHRcdFx0XHR2YXIgayA9IDA7XG5cdFx0XHRcdGlmKF9yZSAmJiBzLm1hdGNoKF9yZSkpeyBzPWRhdGVORl9maXgocywgby5kYXRlTkYsIChzLm1hdGNoKF9yZSl8fFtdKSk7IGs9MTsgfVxuXHRcdFx0XHRpZihvLmNlbGxEYXRlcykgeyBjZWxsLnQgPSAnZCc7IGNlbGwudiA9IHBhcnNlRGF0ZShzLCBrKTsgfVxuXHRcdFx0XHRlbHNlIHsgY2VsbC50ID0gJ24nOyBjZWxsLnYgPSBkYXRlbnVtKHBhcnNlRGF0ZShzLCBrKSk7IH1cblx0XHRcdFx0aWYoby5jZWxsVGV4dCAhPT0gZmFsc2UpIGNlbGwudyA9IFNTRl9mb3JtYXQoY2VsbC56LCBjZWxsLnYgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZW51bShjZWxsLnYpOmNlbGwudik7XG5cdFx0XHRcdGlmKCFvLmNlbGxORikgZGVsZXRlIGNlbGwuejtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNlbGwudCA9ICdzJztcblx0XHRcdFx0Y2VsbC52ID0gcztcblx0XHRcdH1cblx0XHRcdGlmKGNlbGwudCA9PSAneicpe31cblx0XHRcdGVsc2UgaWYoby5kZW5zZSkgeyBpZighd3NbUl0pIHdzW1JdID0gW107IHdzW1JdW0NdID0gY2VsbDsgfVxuXHRcdFx0ZWxzZSB3c1tlbmNvZGVfY2VsbCh7YzpDLHI6Un0pXSA9IGNlbGw7XG5cdFx0XHRzdGFydCA9IGVuZCsxOyBzdGFydGNjID0gc3RyLmNoYXJDb2RlQXQoc3RhcnQpO1xuXHRcdFx0aWYocmFuZ2UuZS5jIDwgQykgcmFuZ2UuZS5jID0gQztcblx0XHRcdGlmKHJhbmdlLmUuciA8IFIpIHJhbmdlLmUuciA9IFI7XG5cdFx0XHRpZihjYyA9PSBzZXBjYykgKytDOyBlbHNlIHsgQyA9IDA7ICsrUjsgaWYoby5zaGVldFJvd3MgJiYgby5zaGVldFJvd3MgPD0gUikgcmV0dXJuIHRydWU7IH1cblx0XHR9XG5cdFx0b3V0ZXI6IGZvcig7ZW5kIDwgc3RyLmxlbmd0aDsrK2VuZCkgc3dpdGNoKChjYz1zdHIuY2hhckNvZGVBdChlbmQpKSkge1xuXHRcdFx0Y2FzZSAweDIyOiBpZihzdGFydGNjID09PSAweDIyKSBpbnN0ciA9ICFpbnN0cjsgYnJlYWs7XG5cdFx0XHRjYXNlIHNlcGNjOiBjYXNlIDB4MGE6IGNhc2UgMHgwZDogaWYoIWluc3RyICYmIGZpbmlzaF9jZWxsKCkpIGJyZWFrIG91dGVyOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IGJyZWFrO1xuXHRcdH1cblx0XHRpZihlbmQgLSBzdGFydCA+IDApIGZpbmlzaF9jZWxsKCk7XG5cblx0XHR3c1snIXJlZiddID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0XHRyZXR1cm4gd3M7XG5cdH1cblxuXHRmdW5jdGlvbiBwcm5fdG9fc2hlZXRfc3RyKHN0ci8qOnN0cmluZyovLCBvcHRzKS8qOldvcmtzaGVldCovIHtcblx0XHRpZighKG9wdHMgJiYgb3B0cy5QUk4pKSByZXR1cm4gZHN2X3RvX3NoZWV0X3N0cihzdHIsIG9wdHMpO1xuXHRcdGlmKG9wdHMuRlMpIHJldHVybiBkc3ZfdG9fc2hlZXRfc3RyKHN0ciwgb3B0cyk7XG5cdFx0aWYoc3RyLnNsaWNlKDAsNCkgPT0gXCJzZXA9XCIpIHJldHVybiBkc3ZfdG9fc2hlZXRfc3RyKHN0ciwgb3B0cyk7XG5cdFx0aWYoc3RyLmluZGV4T2YoXCJcXHRcIikgPj0gMCB8fCBzdHIuaW5kZXhPZihcIixcIikgPj0gMCB8fCBzdHIuaW5kZXhPZihcIjtcIikgPj0gMCkgcmV0dXJuIGRzdl90b19zaGVldF9zdHIoc3RyLCBvcHRzKTtcblx0XHRyZXR1cm4gYW9hX3RvX3NoZWV0KHBybl90b19hb2Ffc3RyKHN0ciwgb3B0cyksIG9wdHMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJuX3RvX3NoZWV0KGQvKjpSYXdEYXRhKi8sIG9wdHMpLyo6V29ya3NoZWV0Ki8ge1xuXHRcdHZhciBzdHIgPSBcIlwiLCBieXRlcyA9IG9wdHMudHlwZSA9PSAnc3RyaW5nJyA/IFswLDAsMCwwXSA6IGZpcnN0Ynl0ZShkLCBvcHRzKTtcblx0XHRzd2l0Y2gob3B0cy50eXBlKSB7XG5cdFx0XHRjYXNlICdiYXNlNjQnOiBzdHIgPSBCYXNlNjRfZGVjb2RlKGQpOyBicmVhaztcblx0XHRcdGNhc2UgJ2JpbmFyeSc6IHN0ciA9IGQ7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYnVmZmVyJzpcblx0XHRcdFx0aWYob3B0cy5jb2RlcGFnZSA9PSA2NTAwMSkgc3RyID0gZC50b1N0cmluZygndXRmOCcpOyAvLyBUT0RPOiB0ZXN0IGlmIGJ1ZlxuXHRcdFx0XHRlbHNlIGlmKG9wdHMuY29kZXBhZ2UgJiYgdHlwZW9mICRjcHRhYmxlICE9PSAndW5kZWZpbmVkJykgc3RyID0gJGNwdGFibGUudXRpbHMuZGVjb2RlKG9wdHMuY29kZXBhZ2UsIGQpO1xuXHRcdFx0XHRlbHNlIHN0ciA9IGhhc19idWYgJiYgQnVmZmVyLmlzQnVmZmVyKGQpID8gZC50b1N0cmluZygnYmluYXJ5JykgOiBhMnMoZCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXJyYXknOiBzdHIgPSBjYzJzdHIoZCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnc3RyaW5nJzogc3RyID0gZDsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgdHlwZSBcIiArIG9wdHMudHlwZSk7XG5cdFx0fVxuXHRcdGlmKGJ5dGVzWzBdID09IDB4RUYgJiYgYnl0ZXNbMV0gPT0gMHhCQiAmJiBieXRlc1syXSA9PSAweEJGKSBzdHIgPSB1dGY4cmVhZChzdHIuc2xpY2UoMykpO1xuXHRcdGVsc2UgaWYob3B0cy50eXBlICE9ICdzdHJpbmcnICYmIG9wdHMudHlwZSAhPSAnYnVmZmVyJyAmJiBvcHRzLmNvZGVwYWdlID09IDY1MDAxKSBzdHIgPSB1dGY4cmVhZChzdHIpO1xuXHRcdGVsc2UgaWYoKG9wdHMudHlwZSA9PSAnYmluYXJ5JykgJiYgdHlwZW9mICRjcHRhYmxlICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNvZGVwYWdlKSAgc3RyID0gJGNwdGFibGUudXRpbHMuZGVjb2RlKG9wdHMuY29kZXBhZ2UsICRjcHRhYmxlLnV0aWxzLmVuY29kZSgyODU5MSxzdHIpKTtcblx0XHRpZihzdHIuc2xpY2UoMCwxOSkgPT0gXCJzb2NpYWxjYWxjOnZlcnNpb246XCIpIHJldHVybiBFVEgudG9fc2hlZXQob3B0cy50eXBlID09ICdzdHJpbmcnID8gc3RyIDogdXRmOHJlYWQoc3RyKSwgb3B0cyk7XG5cdFx0cmV0dXJuIHBybl90b19zaGVldF9zdHIoc3RyLCBvcHRzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHBybl90b193b3JrYm9vayhkLyo6UmF3RGF0YSovLCBvcHRzKS8qOldvcmtib29rKi8geyByZXR1cm4gc2hlZXRfdG9fd29ya2Jvb2socHJuX3RvX3NoZWV0KGQsIG9wdHMpLCBvcHRzKTsgfVxuXG5cdGZ1bmN0aW9uIHNoZWV0X3RvX3Bybih3cy8qOldvcmtzaGVldCovLyo6Oiwgb3B0czo/YW55Ki8pLyo6c3RyaW5nKi8ge1xuXHRcdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdFx0dmFyIHIgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKSwgY2VsbC8qOkNlbGwqLztcblx0XHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0XHRmb3IodmFyIFIgPSByLnMucjsgUiA8PSByLmUucjsgKytSKSB7XG5cdFx0XHR2YXIgb28vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0XHRcdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRcdFx0dmFyIGNvb3JkID0gZW5jb2RlX2NlbGwoe3I6UixjOkN9KTtcblx0XHRcdFx0Y2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tjb29yZF07XG5cdFx0XHRcdGlmKCFjZWxsIHx8IGNlbGwudiA9PSBudWxsKSB7IG9vLnB1c2goXCIgICAgICAgICAgXCIpOyBjb250aW51ZTsgfVxuXHRcdFx0XHR2YXIgdyA9IChjZWxsLncgfHwgKGZvcm1hdF9jZWxsKGNlbGwpLCBjZWxsLncpIHx8IFwiXCIpLnNsaWNlKDAsMTApO1xuXHRcdFx0XHR3aGlsZSh3Lmxlbmd0aCA8IDEwKSB3ICs9IFwiIFwiO1xuXHRcdFx0XHRvby5wdXNoKHcgKyAoQyA9PT0gMCA/IFwiIFwiIDogXCJcIikpO1xuXHRcdFx0fVxuXHRcdFx0by5wdXNoKG9vLmpvaW4oXCJcIikpO1xuXHRcdH1cblx0XHRyZXR1cm4gby5qb2luKFwiXFxuXCIpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHR0b193b3JrYm9vazogcHJuX3RvX3dvcmtib29rLFxuXHRcdHRvX3NoZWV0OiBwcm5fdG9fc2hlZXQsXG5cdFx0ZnJvbV9zaGVldDogc2hlZXRfdG9fcHJuXG5cdH07XG59KSgpO1xuXG4vKiBFeGNlbCBkZWZhdWx0cyB0byBTWUxLIGJ1dCB3YXJucyBpZiBkYXRhIGlzIG5vdCB2YWxpZCAqL1xuZnVuY3Rpb24gcmVhZF93Yl9JRChkLCBvcHRzKSB7XG5cdHZhciBvID0gb3B0cyB8fCB7fSwgT0xEX1dURiA9ICEhby5XVEY7IG8uV1RGID0gdHJ1ZTtcblx0dHJ5IHtcblx0XHR2YXIgb3V0ID0gU1lMSy50b193b3JrYm9vayhkLCBvKTtcblx0XHRvLldURiA9IE9MRF9XVEY7XG5cdFx0cmV0dXJuIG91dDtcblx0fSBjYXRjaChlKSB7XG5cdFx0by5XVEYgPSBPTERfV1RGO1xuXHRcdGlmKCFlLm1lc3NhZ2UubWF0Y2goL1NZTEsgYmFkIHJlY29yZCBJRC8pICYmIE9MRF9XVEYpIHRocm93IGU7XG5cdFx0cmV0dXJuIFBSTi50b193b3JrYm9vayhkLCBvcHRzKTtcblx0fVxufVxuXG52YXIgV0tfID0gLyojX19QVVJFX18qLyhmdW5jdGlvbigpIHtcblx0ZnVuY3Rpb24gbG90dXNob3BwZXIoZGF0YSwgY2IvKjpSZWNvcmRIb3BwZXJDQiovLCBvcHRzLyo6YW55Ki8pIHtcblx0XHRpZighZGF0YSkgcmV0dXJuO1xuXHRcdHByZXBfYmxvYihkYXRhLCBkYXRhLmwgfHwgMCk7XG5cdFx0dmFyIEVudW0gPSBvcHRzLkVudW0gfHwgV0sxRW51bTtcblx0XHR3aGlsZShkYXRhLmwgPCBkYXRhLmxlbmd0aCkge1xuXHRcdFx0dmFyIFJUID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRcdFx0dmFyIFIgPSBFbnVtW1JUXSB8fCBFbnVtWzB4RkZGRl07XG5cdFx0XHR2YXIgbGVuZ3RoID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRcdFx0dmFyIHRndCA9IGRhdGEubCArIGxlbmd0aDtcblx0XHRcdHZhciBkID0gUi5mICYmIFIuZihkYXRhLCBsZW5ndGgsIG9wdHMpO1xuXHRcdFx0ZGF0YS5sID0gdGd0O1xuXHRcdFx0aWYoY2IoZCwgUiwgUlQpKSByZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbG90dXNfdG9fd29ya2Jvb2soZC8qOlJhd0RhdGEqLywgb3B0cykge1xuXHRcdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jhc2U2NCc6IHJldHVybiBsb3R1c190b193b3JrYm9va19idWYoczJhKEJhc2U2NF9kZWNvZGUoZCkpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2JpbmFyeSc6IHJldHVybiBsb3R1c190b193b3JrYm9va19idWYoczJhKGQpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2J1ZmZlcic6XG5cdFx0XHRjYXNlICdhcnJheSc6IHJldHVybiBsb3R1c190b193b3JrYm9va19idWYoZCwgb3B0cyk7XG5cdFx0fVxuXHRcdHRocm93IFwiVW5zdXBwb3J0ZWQgdHlwZSBcIiArIG9wdHMudHlwZTtcblx0fVxuXG5cdGZ1bmN0aW9uIGxvdHVzX3RvX3dvcmtib29rX2J1ZihkLCBvcHRzKS8qOldvcmtib29rKi8ge1xuXHRcdGlmKCFkKSByZXR1cm4gZDtcblx0XHR2YXIgbyA9IG9wdHMgfHwge307XG5cdFx0aWYoREVOU0UgIT0gbnVsbCAmJiBvLmRlbnNlID09IG51bGwpIG8uZGVuc2UgPSBERU5TRTtcblx0XHR2YXIgcy8qOldvcmtzaGVldCovID0gKChvLmRlbnNlID8gW10gOiB7fSkvKjphbnkqLyksIG4gPSBcIlNoZWV0MVwiLCBuZXh0X24gPSBcIlwiLCBzaWR4ID0gMDtcblx0XHR2YXIgc2hlZXRzID0ge30sIHNuYW1lcyA9IFtdLCByZWFsbmFtZXMgPSBbXTtcblxuXHRcdHZhciByZWZndWVzcyA9IHtzOiB7cjowLCBjOjB9LCBlOiB7cjowLCBjOjB9IH07XG5cdFx0dmFyIHNoZWV0Um93cyA9IG8uc2hlZXRSb3dzIHx8IDA7XG5cblx0XHRpZihkWzJdID09IDB4MDApIHtcblx0XHRcdGlmKGRbM10gPT0gMHgwOCB8fCBkWzNdID09IDB4MDkpIHtcblx0XHRcdFx0aWYoZC5sZW5ndGggPj0gMTYgJiYgZFsxNF0gPT0gMHgwNSAmJiBkWzE1XSA9PT0gMHg2YykgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgV29ya3MgMyBmb3IgTWFjIGZpbGVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYoZFsyXSA9PSAweDAyKSB7XG5cdFx0XHRvLkVudW0gPSBXSzFFbnVtO1xuXHRcdFx0bG90dXNob3BwZXIoZCwgZnVuY3Rpb24odmFsLCBSLCBSVCkgeyBzd2l0Y2goUlQpIHtcblx0XHRcdFx0Y2FzZSAweDAwOiAvKiBCT0YgKi9cblx0XHRcdFx0XHRvLnZlcnMgPSB2YWw7XG5cdFx0XHRcdFx0aWYodmFsID49IDB4MTAwMCkgby5xcHJvID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAweDA2OiByZWZndWVzcyA9IHZhbDsgYnJlYWs7IC8qIFJBTkdFICovXG5cdFx0XHRcdGNhc2UgMHhDQzogaWYodmFsKSBuZXh0X24gPSB2YWw7IGJyZWFrOyAvKiBTSEVFVE5BTUVDUyAqL1xuXHRcdFx0XHRjYXNlIDB4REU6IG5leHRfbiA9IHZhbDsgYnJlYWs7IC8qIFNIRUVUTkFNRUxQICovXG5cdFx0XHRcdGNhc2UgMHgwRjogLyogTEFCRUwgKi9cblx0XHRcdFx0Y2FzZSAweDMzOiAvKiBTVFJJTkcgKi9cblx0XHRcdFx0XHRpZighby5xcHJvKSB2YWxbMV0udiA9IHZhbFsxXS52LnNsaWNlKDEpO1xuXHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0Y2FzZSAweDBEOiAvKiBJTlRFR0VSICovXG5cdFx0XHRcdGNhc2UgMHgwRTogLyogTlVNQkVSICovXG5cdFx0XHRcdGNhc2UgMHgxMDogLyogRk9STVVMQSAqL1xuXHRcdFx0XHRcdC8qIFRPRE86IGFjdHVhbCB0cmFuc2xhdGlvbiBvZiB0aGUgZm9ybWF0IGNvZGUgKi9cblx0XHRcdFx0XHRpZihSVCA9PSAweDBFICYmICh2YWxbMl0gJiAweDcwKSA9PSAweDcwICYmICh2YWxbMl0gJiAweDBGKSA+IDEgJiYgKHZhbFsyXSAmIDB4MEYpIDwgMTUpIHtcblx0XHRcdFx0XHRcdHZhbFsxXS56ID0gby5kYXRlTkYgfHwgdGFibGVfZm10WzE0XTtcblx0XHRcdFx0XHRcdGlmKG8uY2VsbERhdGVzKSB7IHZhbFsxXS50ID0gJ2QnOyB2YWxbMV0udiA9IG51bWRhdGUodmFsWzFdLnYpOyB9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoby5xcHJvKSB7XG5cdFx0XHRcdFx0XHRpZih2YWxbM10gPiBzaWR4KSB7XG5cdFx0XHRcdFx0XHRcdHNbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKHJlZmd1ZXNzKTtcblx0XHRcdFx0XHRcdFx0c2hlZXRzW25dID0gcztcblx0XHRcdFx0XHRcdFx0c25hbWVzLnB1c2gobik7XG5cdFx0XHRcdFx0XHRcdHMgPSAoby5kZW5zZSA/IFtdIDoge30pO1xuXHRcdFx0XHRcdFx0XHRyZWZndWVzcyA9IHtzOiB7cjowLCBjOjB9LCBlOiB7cjowLCBjOjB9IH07XG5cdFx0XHRcdFx0XHRcdHNpZHggPSB2YWxbM107IG4gPSBuZXh0X24gfHwgXCJTaGVldFwiICsgKHNpZHggKyAxKTsgbmV4dF9uID0gXCJcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgdG1wY2VsbCA9IG8uZGVuc2UgPyAoc1t2YWxbMF0ucl18fFtdKVt2YWxbMF0uY10gOiBzW2VuY29kZV9jZWxsKHZhbFswXSldO1xuXHRcdFx0XHRcdGlmKHRtcGNlbGwpIHtcblx0XHRcdFx0XHRcdHRtcGNlbGwudCA9IHZhbFsxXS50OyB0bXBjZWxsLnYgPSB2YWxbMV0udjtcblx0XHRcdFx0XHRcdGlmKHZhbFsxXS56ICE9IG51bGwpIHRtcGNlbGwueiA9IHZhbFsxXS56O1xuXHRcdFx0XHRcdFx0aWYodmFsWzFdLmYgIT0gbnVsbCkgdG1wY2VsbC5mID0gdmFsWzFdLmY7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoby5kZW5zZSkge1xuXHRcdFx0XHRcdFx0aWYoIXNbdmFsWzBdLnJdKSBzW3ZhbFswXS5yXSA9IFtdO1xuXHRcdFx0XHRcdFx0c1t2YWxbMF0ucl1bdmFsWzBdLmNdID0gdmFsWzFdO1xuXHRcdFx0XHRcdH0gZWxzZSBzW2VuY29kZV9jZWxsKHZhbFswXSldID0gdmFsWzFdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0fX0sIG8pO1xuXHRcdH0gZWxzZSBpZihkWzJdID09IDB4MUEgfHwgZFsyXSA9PSAweDBFKSB7XG5cdFx0XHRvLkVudW0gPSBXSzNFbnVtO1xuXHRcdFx0aWYoZFsyXSA9PSAweDBFKSB7IG8ucXBybyA9IHRydWU7IGQubCA9IDA7IH1cblx0XHRcdGxvdHVzaG9wcGVyKGQsIGZ1bmN0aW9uKHZhbCwgUiwgUlQpIHsgc3dpdGNoKFJUKSB7XG5cdFx0XHRcdGNhc2UgMHhDQzogbiA9IHZhbDsgYnJlYWs7IC8qIFNIRUVUTkFNRUNTICovXG5cdFx0XHRcdGNhc2UgMHgxNjogLyogTEFCRUwxNiAqL1xuXHRcdFx0XHRcdHZhbFsxXS52ID0gdmFsWzFdLnYuc2xpY2UoMSk7XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlIDB4MTc6IC8qIE5VTUJFUjE3ICovXG5cdFx0XHRcdGNhc2UgMHgxODogLyogTlVNQkVSMTggKi9cblx0XHRcdFx0Y2FzZSAweDE5OiAvKiBGT1JNVUxBMTkgKi9cblx0XHRcdFx0Y2FzZSAweDI1OiAvKiBOVU1CRVIyNSAqL1xuXHRcdFx0XHRjYXNlIDB4Mjc6IC8qIE5VTUJFUjI3ICovXG5cdFx0XHRcdGNhc2UgMHgyODogLyogRk9STVVMQTI4ICovXG5cdFx0XHRcdFx0aWYodmFsWzNdID4gc2lkeCkge1xuXHRcdFx0XHRcdFx0c1tcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UocmVmZ3Vlc3MpO1xuXHRcdFx0XHRcdFx0c2hlZXRzW25dID0gcztcblx0XHRcdFx0XHRcdHNuYW1lcy5wdXNoKG4pO1xuXHRcdFx0XHRcdFx0cyA9IChvLmRlbnNlID8gW10gOiB7fSk7XG5cdFx0XHRcdFx0XHRyZWZndWVzcyA9IHtzOiB7cjowLCBjOjB9LCBlOiB7cjowLCBjOjB9IH07XG5cdFx0XHRcdFx0XHRzaWR4ID0gdmFsWzNdOyBuID0gXCJTaGVldFwiICsgKHNpZHggKyAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoc2hlZXRSb3dzID4gMCAmJiB2YWxbMF0uciA+PSBzaGVldFJvd3MpIGJyZWFrO1xuXHRcdFx0XHRcdGlmKG8uZGVuc2UpIHtcblx0XHRcdFx0XHRcdGlmKCFzW3ZhbFswXS5yXSkgc1t2YWxbMF0ucl0gPSBbXTtcblx0XHRcdFx0XHRcdHNbdmFsWzBdLnJdW3ZhbFswXS5jXSA9IHZhbFsxXTtcblx0XHRcdFx0XHR9IGVsc2Ugc1tlbmNvZGVfY2VsbCh2YWxbMF0pXSA9IHZhbFsxXTtcblx0XHRcdFx0XHRpZihyZWZndWVzcy5lLmMgPCB2YWxbMF0uYykgcmVmZ3Vlc3MuZS5jID0gdmFsWzBdLmM7XG5cdFx0XHRcdFx0aWYocmVmZ3Vlc3MuZS5yIDwgdmFsWzBdLnIpIHJlZmd1ZXNzLmUuciA9IHZhbFswXS5yO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MUI6IC8qIFhGT1JNQVQgKi9cblx0XHRcdFx0XHRpZih2YWxbMHgzNmIwXSkgcmVhbG5hbWVzW3ZhbFsweDM2YjBdWzBdXSA9IHZhbFsweDM2YjBdWzFdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDYwMTogLyogU0hFRVRJTkZPUVAgKi9cblx0XHRcdFx0XHRyZWFsbmFtZXNbdmFsWzBdXSA9IHZhbFsxXTsgaWYodmFsWzBdID09IHNpZHgpIG4gPSB2YWxbMV07IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBicmVhaztcblx0XHRcdH19LCBvKTtcblx0XHR9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIExPVFVTIEJPRiBcIiArIGRbMl0pO1xuXHRcdHNbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKHJlZmd1ZXNzKTtcblx0XHRzaGVldHNbbmV4dF9uIHx8IG5dID0gcztcblx0XHRzbmFtZXMucHVzaChuZXh0X24gfHwgbik7XG5cdFx0aWYoIXJlYWxuYW1lcy5sZW5ndGgpIHJldHVybiB7IFNoZWV0TmFtZXM6IHNuYW1lcywgU2hlZXRzOiBzaGVldHMgfTtcblx0XHR2YXIgb3NoZWV0cyA9IHt9LCBybmFtZXMgPSBbXTtcblx0XHQvKiBUT0RPOiB2ZXJpZnkgbm8gY29sbGlzaW9ucyAqL1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCByZWFsbmFtZXMubGVuZ3RoOyArK2kpIGlmKHNoZWV0c1tzbmFtZXNbaV1dKSB7XG5cdFx0XHRybmFtZXMucHVzaChyZWFsbmFtZXNbaV0gfHwgc25hbWVzW2ldKTtcblx0XHRcdG9zaGVldHNbcmVhbG5hbWVzW2ldXSA9IHNoZWV0c1tyZWFsbmFtZXNbaV1dIHx8IHNoZWV0c1tzbmFtZXNbaV1dO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRybmFtZXMucHVzaChyZWFsbmFtZXNbaV0pO1xuXHRcdFx0b3NoZWV0c1tyZWFsbmFtZXNbaV1dID0gKHsgXCIhcmVmXCI6IFwiQTFcIiB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHsgU2hlZXROYW1lczogcm5hbWVzLCBTaGVldHM6IG9zaGVldHMgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNoZWV0X3RvX3drMSh3cy8qOldvcmtzaGVldCovLCBvcHRzLyo6V3JpdGVPcHRzKi8pIHtcblx0XHR2YXIgbyA9IG9wdHMgfHwge307XG5cdFx0aWYoK28uY29kZXBhZ2UgPj0gMCkgc2V0X2NwKCtvLmNvZGVwYWdlKTtcblx0XHRpZihvLnR5cGUgPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHdyaXRlIFdLMSB0byBKUyBzdHJpbmdcIik7XG5cdFx0dmFyIGJhID0gYnVmX2FycmF5KCk7XG5cdFx0dmFyIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbXCIhcmVmXCJdKTtcblx0XHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0XHR2YXIgY29scyA9IFtdO1xuXG5cdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAsIHdyaXRlX0JPRl9XSzEoMHgwNDA2KSk7XG5cdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDYsIHdyaXRlX1JBTkdFKHJhbmdlKSk7XG5cdFx0dmFyIG1heF9SID0gTWF0aC5taW4ocmFuZ2UuZS5yLCA4MTkxKTtcblx0XHRmb3IodmFyIFIgPSByYW5nZS5zLnI7IFIgPD0gbWF4X1I7ICsrUikge1xuXHRcdFx0dmFyIHJyID0gZW5jb2RlX3JvdyhSKTtcblx0XHRcdGZvcih2YXIgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xuXHRcdFx0XHRpZihSID09PSByYW5nZS5zLnIpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRcdFx0XHR2YXIgcmVmID0gY29sc1tDXSArIHJyO1xuXHRcdFx0XHR2YXIgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tyZWZdO1xuXHRcdFx0XHRpZighY2VsbCB8fCBjZWxsLnQgPT0gXCJ6XCIpIGNvbnRpbnVlO1xuXHRcdFx0XHQvKiBUT0RPOiBmb3JtdWxhIHJlY29yZHMgKi9cblx0XHRcdFx0aWYoY2VsbC50ID09IFwiblwiKSB7XG5cdFx0XHRcdFx0aWYoKGNlbGwudnwwKT09Y2VsbC52ICYmIGNlbGwudiA+PSAtMzI3NjggJiYgY2VsbC52IDw9IDMyNzY3KSB3cml0ZV9iaWZmX3JlYyhiYSwgMHgwZCwgd3JpdGVfSU5URUdFUihSLCBDLCBjZWxsLnYpKTtcblx0XHRcdFx0XHRlbHNlIHdyaXRlX2JpZmZfcmVjKGJhLCAweDBlLCB3cml0ZV9OVU1CRVIoUiwgQywgY2VsbC52KSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIHN0ciA9IGZvcm1hdF9jZWxsKGNlbGwpO1xuXHRcdFx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDBGLCB3cml0ZV9MQUJFTChSLCBDLCBzdHIuc2xpY2UoMCwgMjM5KSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDEpO1xuXHRcdHJldHVybiBiYS5lbmQoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGJvb2tfdG9fd2szKHdiLyo6V29ya2Jvb2sqLywgb3B0cy8qOldyaXRlT3B0cyovKSB7XG5cdFx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHRcdGlmKCtvLmNvZGVwYWdlID49IDApIHNldF9jcCgrby5jb2RlcGFnZSk7XG5cdFx0aWYoby50eXBlID09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB3cml0ZSBXSzMgdG8gSlMgc3RyaW5nXCIpO1xuXHRcdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXG5cdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAsIHdyaXRlX0JPRl9XSzMod2IpKTtcblxuXHRcdGZvcih2YXIgaSA9IDAsIGNudCA9IDA7IGkgPCB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgKytpKSBpZigod2IuU2hlZXRzW3diLlNoZWV0TmFtZXNbaV1dIHx8IHt9KVtcIiFyZWZcIl0pIHdyaXRlX2JpZmZfcmVjKGJhLCAweDFiLCB3cml0ZV9YRk9STUFUX1NIRUVUTkFNRSh3Yi5TaGVldE5hbWVzW2ldLCBjbnQrKykpO1xuXG5cdFx0dmFyIHdzaWR4ID0gMDtcblx0XHRmb3IoaSA9IDA7IGkgPCB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YXIgd3MgPSB3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpXV07XG5cdFx0XHRpZighd3MgfHwgIXdzW1wiIXJlZlwiXSkgY29udGludWU7XG5cdFx0XHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1tcIiFyZWZcIl0pO1xuXHRcdFx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdFx0XHR2YXIgY29scyA9IFtdO1xuXHRcdFx0dmFyIG1heF9SID0gTWF0aC5taW4ocmFuZ2UuZS5yLCA4MTkxKTtcblx0XHRcdGZvcih2YXIgUiA9IHJhbmdlLnMucjsgUiA8PSBtYXhfUjsgKytSKSB7XG5cdFx0XHRcdHZhciByciA9IGVuY29kZV9yb3coUik7XG5cdFx0XHRcdGZvcih2YXIgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xuXHRcdFx0XHRcdGlmKFIgPT09IHJhbmdlLnMucikgY29sc1tDXSA9IGVuY29kZV9jb2woQyk7XG5cdFx0XHRcdFx0dmFyIHJlZiA9IGNvbHNbQ10gKyBycjtcblx0XHRcdFx0XHR2YXIgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tyZWZdO1xuXHRcdFx0XHRcdGlmKCFjZWxsIHx8IGNlbGwudCA9PSBcInpcIikgY29udGludWU7XG5cdFx0XHRcdFx0LyogVE9ETzogRk9STVVMQTE5IE5VTUJFUjE4IHJlY29yZHMgKi9cblx0XHRcdFx0XHRpZihjZWxsLnQgPT0gXCJuXCIpIHtcblx0XHRcdFx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDE3LCB3cml0ZV9OVU1CRVJfMTcoUiwgQywgd3NpZHgsIGNlbGwudikpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR2YXIgc3RyID0gZm9ybWF0X2NlbGwoY2VsbCk7XG5cdFx0XHRcdFx0XHQvKiBUT0RPOiBtYXggbGVuPyAqL1xuXHRcdFx0XHRcdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MTYsIHdyaXRlX0xBQkVMXzE2KFIsIEMsIHdzaWR4LCBzdHIuc2xpY2UoMCwgMjM5KSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Kyt3c2lkeDtcblx0XHR9XG5cblx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMSk7XG5cdFx0cmV0dXJuIGJhLmVuZCgpO1xuXHR9XG5cblxuXHRmdW5jdGlvbiB3cml0ZV9CT0ZfV0sxKHYvKjpudW1iZXIqLykge1xuXHRcdHZhciBvdXQgPSBuZXdfYnVmKDIpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCB2KTtcblx0XHRyZXR1cm4gb3V0O1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVfQk9GX1dLMyh3Yi8qOldvcmtib29rKi8pIHtcblx0XHR2YXIgb3V0ID0gbmV3X2J1ZigyNik7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIDB4MTAwMCk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIDB4MDAwNCk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDQsIDB4MDAwMCk7XG5cdFx0dmFyIHJvd3MgPSAwLCBjb2xzID0gMCwgd3NjbnQgPSAwO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YXIgbmFtZSA9IHdiLlNoZWV0TmFtZXNbaV07XG5cdFx0XHR2YXIgd3MgPSB3Yi5TaGVldHNbbmFtZV07XG5cdFx0XHRpZighd3MgfHwgIXdzW1wiIXJlZlwiXSkgY29udGludWU7XG5cdFx0XHQrK3dzY250O1xuXHRcdFx0dmFyIHJhbmdlID0gZGVjb2RlX3JhbmdlKHdzW1wiIXJlZlwiXSk7XG5cdFx0XHRpZihyb3dzIDwgcmFuZ2UuZS5yKSByb3dzID0gcmFuZ2UuZS5yO1xuXHRcdFx0aWYoY29scyA8IHJhbmdlLmUuYykgY29scyA9IHJhbmdlLmUuYztcblx0XHR9XG5cdFx0aWYocm93cyA+IDgxOTEpIHJvd3MgPSA4MTkxO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCByb3dzKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMSwgd3NjbnQpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgxLCBjb2xzKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgMHgwMCk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIDB4MDApO1xuXHRcdG91dC53cml0ZV9zaGlmdCgxLCAweDAxKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMSwgMHgwMik7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdG91dC53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRyZXR1cm4gb3V0O1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VfUkFOR0UoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdFx0dmFyIG8gPSB7czp7YzowLHI6MH0sZTp7YzowLHI6MH19O1xuXHRcdGlmKGxlbmd0aCA9PSA4ICYmIG9wdHMucXBybykge1xuXHRcdFx0by5zLmMgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0XHRibG9iLmwrKztcblx0XHRcdG8ucy5yID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdFx0by5lLmMgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0XHRibG9iLmwrKztcblx0XHRcdG8uZS5yID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdFx0cmV0dXJuIG87XG5cdFx0fVxuXHRcdG8ucy5jID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdG8ucy5yID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGlmKGxlbmd0aCA9PSAxMiAmJiBvcHRzLnFwcm8pIGJsb2IubCArPSAyO1xuXHRcdG8uZS5jID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdG8uZS5yID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGlmKGxlbmd0aCA9PSAxMiAmJiBvcHRzLnFwcm8pIGJsb2IubCArPSAyO1xuXHRcdGlmKG8ucy5jID09IDB4RkZGRikgby5zLmMgPSBvLmUuYyA9IG8ucy5yID0gby5lLnIgPSAwO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cdGZ1bmN0aW9uIHdyaXRlX1JBTkdFKHJhbmdlKSB7XG5cdFx0dmFyIG91dCA9IG5ld19idWYoOCk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIHJhbmdlLnMuYyk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIHJhbmdlLnMucik7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIHJhbmdlLmUuYyk7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDIsIHJhbmdlLmUucik7XG5cdFx0cmV0dXJuIG91dDtcblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlX2NlbGwoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdFx0dmFyIG8gPSBbe2M6MCxyOjB9LCB7dDonbicsdjowfSwgMCwgMF07XG5cdFx0aWYob3B0cy5xcHJvICYmIG9wdHMudmVycyAhPSAweDUxMjApIHtcblx0XHRcdG9bMF0uYyA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0XHRcdG9bM10gPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0XHRvWzBdLnIgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0XHRibG9iLmwrPTI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9bMl0gPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0XHRvWzBdLmMgPSBibG9iLnJlYWRfc2hpZnQoMik7IG9bMF0uciA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHR9XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9MQUJFTChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0XHR2YXIgdGd0ID0gYmxvYi5sICsgbGVuZ3RoO1xuXHRcdHZhciBvID0gcGFyc2VfY2VsbChibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHRcdG9bMV0udCA9ICdzJztcblx0XHRpZihvcHRzLnZlcnMgPT0gMHg1MTIwKSB7XG5cdFx0XHRibG9iLmwrKztcblx0XHRcdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0XHRvWzFdLnYgPSBibG9iLnJlYWRfc2hpZnQobGVuLCAndXRmOCcpO1xuXHRcdFx0cmV0dXJuIG87XG5cdFx0fVxuXHRcdGlmKG9wdHMucXBybykgYmxvYi5sKys7XG5cdFx0b1sxXS52ID0gYmxvYi5yZWFkX3NoaWZ0KHRndCAtIGJsb2IubCwgJ2NzdHInKTtcblx0XHRyZXR1cm4gbztcblx0fVxuXHRmdW5jdGlvbiB3cml0ZV9MQUJFTChSLCBDLCBzKSB7XG5cdFx0LyogVE9ETzogZW5jb2RpbmcgKi9cblx0XHR2YXIgbyA9IG5ld19idWYoNyArIHMubGVuZ3RoKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4RkYpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgQyk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCBSKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4MjcpOyAvLyA/P1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBvLmxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YXIgY2MgPSBzLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRvLndyaXRlX3NoaWZ0KDEsIGNjID49IDB4ODAgPyAweDVGIDogY2MpO1xuXHRcdH1cblx0XHRvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VfSU5URUdFUihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0XHR2YXIgbyA9IHBhcnNlX2NlbGwoYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0XHRvWzFdLnYgPSBibG9iLnJlYWRfc2hpZnQoMiwgJ2knKTtcblx0XHRyZXR1cm4gbztcblx0fVxuXHRmdW5jdGlvbiB3cml0ZV9JTlRFR0VSKFIsIEMsIHYpIHtcblx0XHR2YXIgbyA9IG5ld19idWYoNyk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAweEZGKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIEMpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgUik7XG5cdFx0by53cml0ZV9zaGlmdCgyLCB2LCAnaScpO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VfTlVNQkVSKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRcdHZhciBvID0gcGFyc2VfY2VsbChibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHRcdG9bMV0udiA9IGJsb2IucmVhZF9zaGlmdCg4LCAnZicpO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cdGZ1bmN0aW9uIHdyaXRlX05VTUJFUihSLCBDLCB2KSB7XG5cdFx0dmFyIG8gPSBuZXdfYnVmKDEzKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4RkYpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgQyk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCBSKTtcblx0XHRvLndyaXRlX3NoaWZ0KDgsIHYsICdmJyk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9GT1JNVUxBKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRcdHZhciB0Z3QgPSBibG9iLmwgKyBsZW5ndGg7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdFx0LyogVE9ETzogZm9ybXVsYSAqL1xuXHRcdG9bMV0udiA9IGJsb2IucmVhZF9zaGlmdCg4LCAnZicpO1xuXHRcdGlmKG9wdHMucXBybykgYmxvYi5sID0gdGd0O1xuXHRcdGVsc2Uge1xuXHRcdFx0dmFyIGZsZW4gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0XHR3azFfZm1sYV90b19jc2YoYmxvYi5zbGljZShibG9iLmwsIGJsb2IubCArIGZsZW4pLCBvKTtcblx0XHRcdGJsb2IubCArPSBmbGVuO1xuXHRcdH1cblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGZ1bmN0aW9uIHdrMV9wYXJzZV9yYyhCLCBWLCBjb2wpIHtcblx0XHR2YXIgcmVsID0gViAmIDB4ODAwMDtcblx0XHRWICY9IH4weDgwMDA7XG5cdFx0ViA9IChyZWwgPyBCIDogMCkgKyAoKFYgPj0gMHgyMDAwKSA/IFYgLSAweDQwMDAgOiBWKTtcblx0XHRyZXR1cm4gKHJlbCA/IFwiXCIgOiBcIiRcIikgKyAoY29sID8gZW5jb2RlX2NvbChWKSA6IGVuY29kZV9yb3coVikpO1xuXHR9XG5cdC8qIHZhciBvcHJlYyA9IFtcblx0XHQ4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA2LCA0LCA0LCA1LCA1LCA3LCAzLCAzLFxuXHRcdDMsIDMsIDMsIDMsIDEsIDEsIDIsIDYsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDhcblx0XTsgKi9cblx0LyogVE9ETzogZmxlc2ggb3V0ICovXG5cdHZhciBGdW5jVGFiID0ge1xuXHRcdDB4MzM6IFtcIkZBTFNFXCIsIDBdLFxuXHRcdDB4MzQ6IFtcIlRSVUVcIiwgMF0sXG5cdFx0MHg0NjogW1wiTEVOXCIsIDFdLFxuXHRcdDB4NTA6IFtcIlNVTVwiLCA2OV0sXG5cdFx0MHg1MTogW1wiQVZFUkFHRUFcIiwgNjldLFxuXHRcdDB4NTI6IFtcIkNPVU5UQVwiLCA2OV0sXG5cdFx0MHg1MzogW1wiTUlOQVwiLCA2OV0sXG5cdFx0MHg1NDogW1wiTUFYQVwiLCA2OV0sXG5cdFx0MHg2RjogW1wiVFwiLCAxXVxuXHR9O1xuXHR2YXIgQmluT3BUYWIgPSBbXG5cdFx0ICBcIlwiLCAgIFwiXCIsICAgXCJcIiwgICBcIlwiLCAgIFwiXCIsICAgXCJcIiwgICBcIlwiLCAgIFwiXCIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWl4ZWQtc3BhY2VzLWFuZC10YWJzXG5cdFx0ICBcIlwiLCAgXCIrXCIsICBcIi1cIiwgIFwiKlwiLCAgXCIvXCIsICBcIl5cIiwgIFwiPVwiLCBcIjw+XCIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWl4ZWQtc3BhY2VzLWFuZC10YWJzXG5cdFx0XCI8PVwiLCBcIj49XCIsICBcIjxcIiwgIFwiPlwiLCAgIFwiXCIsICAgXCJcIiwgICBcIlwiLCAgIFwiXCIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWl4ZWQtc3BhY2VzLWFuZC10YWJzXG5cdFx0IFwiJlwiLCAgIFwiXCIsICAgXCJcIiwgICBcIlwiLCAgIFwiXCIsICAgXCJcIiwgICBcIlwiLCAgIFwiXCIgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWl4ZWQtc3BhY2VzLWFuZC10YWJzXG5cdF07XG5cblx0ZnVuY3Rpb24gd2sxX2ZtbGFfdG9fY3NmKGJsb2IsIG8pIHtcblx0XHRwcmVwX2Jsb2IoYmxvYiwgMCk7XG5cdFx0dmFyIG91dCA9IFtdLCBhcmdjID0gMCwgUiA9IFwiXCIsIEMgPSBcIlwiLCBhcmdMID0gXCJcIiwgYXJnUiA9IFwiXCI7XG5cdFx0d2hpbGUoYmxvYi5sIDwgYmxvYi5sZW5ndGgpIHtcblx0XHRcdHZhciBjYyA9IGJsb2JbYmxvYi5sKytdO1xuXHRcdFx0c3dpdGNoKGNjKSB7XG5cdFx0XHRcdGNhc2UgMHgwMDogb3V0LnB1c2goYmxvYi5yZWFkX3NoaWZ0KDgsICdmJykpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAxOiB7XG5cdFx0XHRcdFx0QyA9IHdrMV9wYXJzZV9yYyhvWzBdLmMsIGJsb2IucmVhZF9zaGlmdCgyKSwgdHJ1ZSk7XG5cdFx0XHRcdFx0UiA9IHdrMV9wYXJzZV9yYyhvWzBdLnIsIGJsb2IucmVhZF9zaGlmdCgyKSwgZmFsc2UpO1xuXHRcdFx0XHRcdG91dC5wdXNoKEMgKyBSKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAyOiB7XG5cdFx0XHRcdFx0dmFyIGMgPSB3azFfcGFyc2VfcmMob1swXS5jLCBibG9iLnJlYWRfc2hpZnQoMiksIHRydWUpO1xuXHRcdFx0XHRcdHZhciByID0gd2sxX3BhcnNlX3JjKG9bMF0uciwgYmxvYi5yZWFkX3NoaWZ0KDIpLCBmYWxzZSk7XG5cdFx0XHRcdFx0QyA9IHdrMV9wYXJzZV9yYyhvWzBdLmMsIGJsb2IucmVhZF9zaGlmdCgyKSwgdHJ1ZSk7XG5cdFx0XHRcdFx0UiA9IHdrMV9wYXJzZV9yYyhvWzBdLnIsIGJsb2IucmVhZF9zaGlmdCgyKSwgZmFsc2UpO1xuXHRcdFx0XHRcdG91dC5wdXNoKGMgKyByICsgXCI6XCIgKyBDICsgUik7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMzpcblx0XHRcdFx0XHRpZihibG9iLmwgPCBibG9iLmxlbmd0aCkgeyBjb25zb2xlLmVycm9yKFwiV0sxIHByZW1hdHVyZSBmb3JtdWxhIGVuZFwiKTsgcmV0dXJuOyB9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwNDogb3V0LnB1c2goXCIoXCIgKyBvdXQucG9wKCkgKyBcIilcIik7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDU6IG91dC5wdXNoKGJsb2IucmVhZF9zaGlmdCgyKSk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDY6IHtcblx0XHRcdFx0XHQvKiBUT0RPOiB0ZXh0IGVuY29kaW5nICovXG5cdFx0XHRcdFx0dmFyIFogPSBcIlwiOyB3aGlsZSgoY2MgPSBibG9iW2Jsb2IubCsrXSkpIFogKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjYyk7XG5cdFx0XHRcdFx0b3V0LnB1c2goJ1wiJyArIFoucmVwbGFjZSgvXCIvZywgJ1wiXCInKSArICdcIicpO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgMHgwODogb3V0LnB1c2goXCItXCIgKyBvdXQucG9wKCkpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDE3OiBvdXQucHVzaChcIitcIiArIG91dC5wb3AoKSk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MTY6IG91dC5wdXNoKFwiTk9UKFwiICsgb3V0LnBvcCgpICsgXCIpXCIpOyBicmVhaztcblxuXHRcdFx0XHRjYXNlIDB4MTQ6IGNhc2UgMHgxNToge1xuXHRcdFx0XHRcdGFyZ1IgPSBvdXQucG9wKCk7IGFyZ0wgPSBvdXQucG9wKCk7XG5cdFx0XHRcdFx0b3V0LnB1c2goW1wiQU5EXCIsIFwiT1JcIl1bY2MgLSAweDE0XSArIFwiKFwiICsgYXJnTCArIFwiLFwiICsgYXJnUiArIFwiKVwiKTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGlmKGNjIDwgMHgyMCAmJiBCaW5PcFRhYltjY10pIHtcblx0XHRcdFx0XHRcdGFyZ1IgPSBvdXQucG9wKCk7IGFyZ0wgPSBvdXQucG9wKCk7XG5cdFx0XHRcdFx0XHRvdXQucHVzaChhcmdMICsgQmluT3BUYWJbY2NdICsgYXJnUik7XG5cdFx0XHRcdFx0fSBlbHNlIGlmKEZ1bmNUYWJbY2NdKSB7XG5cdFx0XHRcdFx0XHRhcmdjID0gRnVuY1RhYltjY11bMV07XG5cdFx0XHRcdFx0XHRpZihhcmdjID09IDY5KSBhcmdjID0gYmxvYltibG9iLmwrK107XG5cdFx0XHRcdFx0XHRpZihhcmdjID4gb3V0Lmxlbmd0aCkgeyBjb25zb2xlLmVycm9yKFwiV0sxIGJhZCBmb3JtdWxhIHBhcnNlIDB4XCIgKyBjYy50b1N0cmluZygxNikgKyBcIjp8XCIgKyBvdXQuam9pbihcInxcIikgKyBcInxcIik7IHJldHVybjsgfVxuXHRcdFx0XHRcdFx0dmFyIGFyZ3MgPSBvdXQuc2xpY2UoLWFyZ2MpO1xuXHRcdFx0XHRcdFx0b3V0Lmxlbmd0aCAtPSBhcmdjO1xuXHRcdFx0XHRcdFx0b3V0LnB1c2goRnVuY1RhYltjY11bMF0gKyBcIihcIiArIGFyZ3Muam9pbihcIixcIikgKyBcIilcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYoY2MgPD0gMHgwNykgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJXSzEgaW52YWxpZCBvcGNvZGUgXCIgKyBjYy50b1N0cmluZygxNikpO1xuXHRcdFx0XHRcdGVsc2UgaWYoY2MgPD0gMHgxOCkgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJXSzEgdW5zdXBwb3J0ZWQgb3AgXCIgKyBjYy50b1N0cmluZygxNikpO1xuXHRcdFx0XHRcdGVsc2UgaWYoY2MgPD0gMHgxRSkgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJXSzEgaW52YWxpZCBvcGNvZGUgXCIgKyBjYy50b1N0cmluZygxNikpO1xuXHRcdFx0XHRcdGVsc2UgaWYoY2MgPD0gMHg3MykgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJXSzEgdW5zdXBwb3J0ZWQgZnVuY3Rpb24gb3Bjb2RlIFwiICsgY2MudG9TdHJpbmcoMTYpKTtcblx0XHRcdFx0XHQvLyBwb3NzaWJsZSBmdXR1cmUgZnVuY3Rpb25zID8/XG5cdFx0XHRcdFx0ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcihcIldLMSB1bnJlY29nbml6ZWQgb3Bjb2RlIFwiICsgY2MudG9TdHJpbmcoMTYpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYob3V0Lmxlbmd0aCA9PSAxKSBvWzFdLmYgPSBcIlwiICsgb3V0WzBdO1xuXHRcdGVsc2UgY29uc29sZS5lcnJvcihcIldLMSBiYWQgZm9ybXVsYSBwYXJzZSB8XCIgKyBvdXQuam9pbihcInxcIikgKyBcInxcIik7XG5cdH1cblxuXG5cdGZ1bmN0aW9uIHBhcnNlX2NlbGxfMyhibG9iLyo6OiwgbGVuZ3RoKi8pIHtcblx0XHR2YXIgbyA9IFt7YzowLHI6MH0sIHt0OiduJyx2OjB9LCAwXTtcblx0XHRvWzBdLnIgPSBibG9iLnJlYWRfc2hpZnQoMik7IG9bM10gPSBibG9iW2Jsb2IubCsrXTsgb1swXS5jID0gYmxvYltibG9iLmwrK107XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9MQUJFTF8xNihibG9iLCBsZW5ndGgpIHtcblx0XHR2YXIgbyA9IHBhcnNlX2NlbGxfMyhibG9iLCBsZW5ndGgpO1xuXHRcdG9bMV0udCA9ICdzJztcblx0XHRvWzFdLnYgPSBibG9iLnJlYWRfc2hpZnQobGVuZ3RoIC0gNCwgJ2NzdHInKTtcblx0XHRyZXR1cm4gbztcblx0fVxuXHRmdW5jdGlvbiB3cml0ZV9MQUJFTF8xNihSLCBDLCB3c2lkeCwgcykge1xuXHRcdC8qIFRPRE86IGVuY29kaW5nICovXG5cdFx0dmFyIG8gPSBuZXdfYnVmKDYgKyBzLmxlbmd0aCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCBSKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIHdzaWR4KTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIEMpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgMHgyNyk7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhciBjYyA9IHMuY2hhckNvZGVBdChpKTtcblx0XHRcdG8ud3JpdGVfc2hpZnQoMSwgY2MgPj0gMHg4MCA/IDB4NUYgOiBjYyk7XG5cdFx0fVxuXHRcdG8ud3JpdGVfc2hpZnQoMSwgMCk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9OVU1CRVJfMTgoYmxvYiwgbGVuZ3RoKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsXzMoYmxvYiwgbGVuZ3RoKTtcblx0XHRvWzFdLnYgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0dmFyIHYgPSBvWzFdLnYgPj4gMTtcblx0XHRpZihvWzFdLnYgJiAweDEpIHtcblx0XHRcdHN3aXRjaCh2ICYgMHgwNykge1xuXHRcdFx0XHRjYXNlIDA6IHYgPSAodiA+PiAzKSAqIDUwMDA7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDE6IHYgPSAodiA+PiAzKSAqIDUwMDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMjogdiA9ICh2ID4+IDMpIC8gMjA7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDM6IHYgPSAodiA+PiAzKSAvIDIwMDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgNDogdiA9ICh2ID4+IDMpIC8gMjAwMDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgNTogdiA9ICh2ID4+IDMpIC8gMjAwMDA7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDY6IHYgPSAodiA+PiAzKSAvIDE2OyBicmVhaztcblx0XHRcdFx0Y2FzZSA3OiB2ID0gKHYgPj4gMykgLyA2NDsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG9bMV0udiA9IHY7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9OVU1CRVJfMTcoYmxvYiwgbGVuZ3RoKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsXzMoYmxvYiwgbGVuZ3RoKTtcblx0XHR2YXIgdjEgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0dmFyIHYyID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdHZhciBlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGlmKGUgPT0gMHhGRkZGKSB7XG5cdFx0XHRpZih2MSA9PT0gMCAmJiB2MiA9PT0gMHhDMDAwMDAwMCkgeyBvWzFdLnQgPSBcImVcIjsgb1sxXS52ID0gMHgwRjsgfSAvLyBFUlIgLT4gI1ZBTFVFIVxuXHRcdFx0ZWxzZSBpZih2MSA9PT0gMCAmJiB2MiA9PT0gMHhEMDAwMDAwMCkgeyBvWzFdLnQgPSBcImVcIjsgb1sxXS52ID0gMHgyQTsgfSAvLyBOQSAtPiAjTi9BXG5cdFx0XHRlbHNlIG9bMV0udiA9IDA7XG5cdFx0XHRyZXR1cm4gbztcblx0XHR9XG5cdFx0dmFyIHMgPSBlICYgMHg4MDAwOyBlID0gKGUmMHg3RkZGKSAtIDE2NDQ2O1xuXHRcdG9bMV0udiA9ICgxIC0gcyoyKSAqICh2MiAqIE1hdGgucG93KDIsIGUrMzIpICsgdjEgKiBNYXRoLnBvdygyLCBlKSk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblx0ZnVuY3Rpb24gd3JpdGVfTlVNQkVSXzE3KFIsIEMsIHdzaWR4LCB2KSB7XG5cdFx0dmFyIG8gPSBuZXdfYnVmKDE0KTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIFIpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgd3NpZHgpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgQyk7XG5cdFx0aWYodiA9PSAwKSB7XG5cdFx0XHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdFx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRcdG8ud3JpdGVfc2hpZnQoMiwgMHhGRkZGKTtcblx0XHRcdHJldHVybiBvO1xuXHRcdH1cblx0XHR2YXIgcyA9IDAsIGUgPSAwLCB2MSA9IDAsIHYyID0gMDtcblx0XHRpZih2IDwgMCkgeyBzID0gMTsgdiA9IC12OyB9XG5cdFx0ZSA9IE1hdGgubG9nMih2KSB8IDA7XG5cdFx0diAvPSBNYXRoLnBvdygyLCBlLTMxKTtcblx0XHR2MiA9ICh2KT4+PjA7XG5cdFx0aWYoKHYyJjB4ODAwMDAwMDApID09IDApIHsgdi89MjsgKytlOyB2MiA9IHYgPj4+IDA7IH1cblx0XHR2IC09IHYyO1xuXHRcdHYyIHw9IDB4ODAwMDAwMDA7XG5cdFx0djIgPj4+PSAwO1xuXHRcdHYgKj0gTWF0aC5wb3coMiwgMzIpO1xuXHRcdHYxID0gdj4+PjA7XG5cdFx0by53cml0ZV9zaGlmdCg0LCB2MSk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCB2Mik7XG5cdFx0ZSArPSAweDNGRkYgKyAocyA/IDB4ODAwMCA6IDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgZSk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9GT1JNVUxBXzE5KGJsb2IsIGxlbmd0aCkge1xuXHRcdHZhciBvID0gcGFyc2VfTlVNQkVSXzE3KGJsb2IsIDE0KTtcblx0XHRibG9iLmwgKz0gbGVuZ3RoIC0gMTQ7IC8qIFRPRE86IFdLMyBmb3JtdWxhICovXG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9OVU1CRVJfMjUoYmxvYiwgbGVuZ3RoKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsXzMoYmxvYiwgbGVuZ3RoKTtcblx0XHR2YXIgdjEgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0b1sxXS52ID0gdjEgPj4gNjtcblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlX05VTUJFUl8yNyhibG9iLCBsZW5ndGgpIHtcblx0XHR2YXIgbyA9IHBhcnNlX2NlbGxfMyhibG9iLCBsZW5ndGgpO1xuXHRcdHZhciB2MSA9IGJsb2IucmVhZF9zaGlmdCg4LCdmJyk7XG5cdFx0b1sxXS52ID0gdjE7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9GT1JNVUxBXzI4KGJsb2IsIGxlbmd0aCkge1xuXHRcdHZhciBvID0gcGFyc2VfTlVNQkVSXzI3KGJsb2IsIDE0KTtcblx0XHRibG9iLmwgKz0gbGVuZ3RoIC0gMTA7IC8qIFRPRE86IGZvcm11bGEgKi9cblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlX1NIRUVUTkFNRUNTKGJsb2IsIGxlbmd0aCkge1xuXHRcdHJldHVybiBibG9iW2Jsb2IubCArIGxlbmd0aCAtIDFdID09IDAgPyBibG9iLnJlYWRfc2hpZnQobGVuZ3RoLCAnY3N0cicpIDogXCJcIjtcblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlX1NIRUVUTkFNRUxQKGJsb2IsIGxlbmd0aCkge1xuXHRcdHZhciBsZW4gPSBibG9iW2Jsb2IubCsrXTtcblx0XHRpZihsZW4gPiBsZW5ndGggLSAxKSBsZW4gPSBsZW5ndGggLSAxO1xuXHRcdHZhciBvID0gXCJcIjsgd2hpbGUoby5sZW5ndGggPCBsZW4pIG8gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShibG9iW2Jsb2IubCsrXSk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9TSEVFVElORk9RUChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0XHRpZighb3B0cy5xcHJvIHx8IGxlbmd0aCA8IDIxKSByZXR1cm47XG5cdFx0dmFyIGlkID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRcdGJsb2IubCArPSAxNztcblx0XHRibG9iLmwgKz0gMTsgLy92YXIgbGVuID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRcdGJsb2IubCArPSAyO1xuXHRcdHZhciBubSA9IGJsb2IucmVhZF9zaGlmdChsZW5ndGggLSAyMSwgJ2NzdHInKTtcblx0XHRyZXR1cm4gW2lkLCBubV07XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9YRk9STUFUKGJsb2IsIGxlbmd0aCkge1xuXHRcdHZhciBvID0ge30sIHRndCA9IGJsb2IubCArIGxlbmd0aDtcblx0XHR3aGlsZShibG9iLmwgPCB0Z3QpIHtcblx0XHRcdHZhciBkdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHRcdGlmKGR0ID09IDB4MzZiMCkge1xuXHRcdFx0XHRvW2R0XSA9IFswLCBcIlwiXTtcblx0XHRcdFx0b1tkdF1bMF0gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0XHRcdHdoaWxlKGJsb2JbYmxvYi5sXSkgeyBvW2R0XVsxXSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJsb2JbYmxvYi5sXSk7IGJsb2IubCsrOyB9IGJsb2IubCsrO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVE9ETzogMHgzYTk5ID8/XG5cdFx0fVxuXHRcdHJldHVybiBvO1xuXHR9XG5cdGZ1bmN0aW9uIHdyaXRlX1hGT1JNQVRfU0hFRVROQU1FKG5hbWUsIHdzaWR4KSB7XG5cdFx0dmFyIG91dCA9IG5ld19idWYoNSArIG5hbWUubGVuZ3RoKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgMHgzNmIwKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgd3NpZHgpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YXIgY2MgPSBuYW1lLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRvdXRbb3V0LmwrK10gPSBjYyA+IDB4N0YgPyAweDVGIDogY2M7XG5cdFx0fVxuXHRcdG91dFtvdXQubCsrXSA9IDA7XG5cdFx0cmV0dXJuIG91dDtcblx0fVxuXG5cdHZhciBXSzFFbnVtID0ge1xuXHRcdC8qOjpbKi8weDAwMDAvKjo6XSovOiB7IG46XCJCT0ZcIiwgZjpwYXJzZXVpbnQxNiB9LFxuXHRcdC8qOjpbKi8weDAwMDEvKjo6XSovOiB7IG46XCJFT0ZcIiB9LFxuXHRcdC8qOjpbKi8weDAwMDIvKjo6XSovOiB7IG46XCJDQUxDTU9ERVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwMy8qOjpdKi86IHsgbjpcIkNBTENPUkRFUlwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwNC8qOjpdKi86IHsgbjpcIlNQTElUXCIgfSxcblx0XHQvKjo6WyovMHgwMDA1Lyo6Ol0qLzogeyBuOlwiU1lOQ1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwNi8qOjpdKi86IHsgbjpcIlJBTkdFXCIsIGY6cGFyc2VfUkFOR0UgfSxcblx0XHQvKjo6WyovMHgwMDA3Lyo6Ol0qLzogeyBuOlwiV0lORE9XMVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwOC8qOjpdKi86IHsgbjpcIkNPTFcxXCIgfSxcblx0XHQvKjo6WyovMHgwMDA5Lyo6Ol0qLzogeyBuOlwiV0lOVFdPXCIgfSxcblx0XHQvKjo6WyovMHgwMDBBLyo6Ol0qLzogeyBuOlwiQ09MVzJcIiB9LFxuXHRcdC8qOjpbKi8weDAwMEIvKjo6XSovOiB7IG46XCJOQU1FXCIgfSxcblx0XHQvKjo6WyovMHgwMDBDLyo6Ol0qLzogeyBuOlwiQkxBTktcIiB9LFxuXHRcdC8qOjpbKi8weDAwMEQvKjo6XSovOiB7IG46XCJJTlRFR0VSXCIsIGY6cGFyc2VfSU5URUdFUiB9LFxuXHRcdC8qOjpbKi8weDAwMEUvKjo6XSovOiB7IG46XCJOVU1CRVJcIiwgZjpwYXJzZV9OVU1CRVIgfSxcblx0XHQvKjo6WyovMHgwMDBGLyo6Ol0qLzogeyBuOlwiTEFCRUxcIiwgZjpwYXJzZV9MQUJFTCB9LFxuXHRcdC8qOjpbKi8weDAwMTAvKjo6XSovOiB7IG46XCJGT1JNVUxBXCIsIGY6cGFyc2VfRk9STVVMQSB9LFxuXHRcdC8qOjpbKi8weDAwMTgvKjo6XSovOiB7IG46XCJUQUJMRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxOS8qOjpdKi86IHsgbjpcIk9SQU5HRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxQS8qOjpdKi86IHsgbjpcIlBSQU5HRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxQi8qOjpdKi86IHsgbjpcIlNSQU5HRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxQy8qOjpdKi86IHsgbjpcIkZSQU5HRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxRC8qOjpdKi86IHsgbjpcIktSQU5HRTFcIiB9LFxuXHRcdC8qOjpbKi8weDAwMjAvKjo6XSovOiB7IG46XCJIUkFOR0VcIiB9LFxuXHRcdC8qOjpbKi8weDAwMjMvKjo6XSovOiB7IG46XCJLUkFOR0UyXCIgfSxcblx0XHQvKjo6WyovMHgwMDI0Lyo6Ol0qLzogeyBuOlwiUFJPVEVDXCIgfSxcblx0XHQvKjo6WyovMHgwMDI1Lyo6Ol0qLzogeyBuOlwiRk9PVEVSXCIgfSxcblx0XHQvKjo6WyovMHgwMDI2Lyo6Ol0qLzogeyBuOlwiSEVBREVSXCIgfSxcblx0XHQvKjo6WyovMHgwMDI3Lyo6Ol0qLzogeyBuOlwiU0VUVVBcIiB9LFxuXHRcdC8qOjpbKi8weDAwMjgvKjo6XSovOiB7IG46XCJNQVJHSU5TXCIgfSxcblx0XHQvKjo6WyovMHgwMDI5Lyo6Ol0qLzogeyBuOlwiTEFCRUxGTVRcIiB9LFxuXHRcdC8qOjpbKi8weDAwMkEvKjo6XSovOiB7IG46XCJUSVRMRVNcIiB9LFxuXHRcdC8qOjpbKi8weDAwMkIvKjo6XSovOiB7IG46XCJTSEVFVEpTXCIgfSxcblx0XHQvKjo6WyovMHgwMDJELyo6Ol0qLzogeyBuOlwiR1JBUEhcIiB9LFxuXHRcdC8qOjpbKi8weDAwMkUvKjo6XSovOiB7IG46XCJOR1JBUEhcIiB9LFxuXHRcdC8qOjpbKi8weDAwMkYvKjo6XSovOiB7IG46XCJDQUxDQ09VTlRcIiB9LFxuXHRcdC8qOjpbKi8weDAwMzAvKjo6XSovOiB7IG46XCJVTkZPUk1BVFRFRFwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAzMS8qOjpdKi86IHsgbjpcIkNVUlNPUlcxMlwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAzMi8qOjpdKi86IHsgbjpcIldJTkRPV1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDAzMy8qOjpdKi86IHsgbjpcIlNUUklOR1wiLCBmOnBhcnNlX0xBQkVMIH0sXG5cdFx0Lyo6OlsqLzB4MDAzNy8qOjpdKi86IHsgbjpcIlBBU1NXT1JEXCIgfSxcblx0XHQvKjo6WyovMHgwMDM4Lyo6Ol0qLzogeyBuOlwiTE9DS0VEXCIgfSxcblx0XHQvKjo6WyovMHgwMDNDLyo6Ol0qLzogeyBuOlwiUVVFUllcIiB9LFxuXHRcdC8qOjpbKi8weDAwM0QvKjo6XSovOiB7IG46XCJRVUVSWU5BTUVcIiB9LFxuXHRcdC8qOjpbKi8weDAwM0UvKjo6XSovOiB7IG46XCJQUklOVFwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAzRi8qOjpdKi86IHsgbjpcIlBSSU5UTkFNRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0MC8qOjpdKi86IHsgbjpcIkdSQVBIMlwiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0MS8qOjpdKi86IHsgbjpcIkdSQVBITkFNRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0Mi8qOjpdKi86IHsgbjpcIlpPT01cIiB9LFxuXHRcdC8qOjpbKi8weDAwNDMvKjo6XSovOiB7IG46XCJTWU1TUExJVFwiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0NC8qOjpdKi86IHsgbjpcIk5TUk9XU1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0NS8qOjpdKi86IHsgbjpcIk5TQ09MU1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0Ni8qOjpdKi86IHsgbjpcIlJVTEVSXCIgfSxcblx0XHQvKjo6WyovMHgwMDQ3Lyo6Ol0qLzogeyBuOlwiTk5BTUVcIiB9LFxuXHRcdC8qOjpbKi8weDAwNDgvKjo6XSovOiB7IG46XCJBQ09NTVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0OS8qOjpdKi86IHsgbjpcIkFNQUNST1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDA0QS8qOjpdKi86IHsgbjpcIlBBUlNFXCIgfSxcblx0XHQvKjo6WyovMHgwMDY2Lyo6Ol0qLzogeyBuOlwiUFJBTkdFUz8/XCIgfSxcblx0XHQvKjo6WyovMHgwMDY3Lyo6Ol0qLzogeyBuOlwiUlJBTkdFUz8/XCIgfSxcblx0XHQvKjo6WyovMHgwMDY4Lyo6Ol0qLzogeyBuOlwiRk5BTUU/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDA2OS8qOjpdKi86IHsgbjpcIk1SQU5HRVM/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDBDQy8qOjpdKi86IHsgbjpcIlNIRUVUTkFNRUNTXCIsIGY6cGFyc2VfU0hFRVROQU1FQ1MgfSxcblx0XHQvKjo6WyovMHgwMERFLyo6Ol0qLzogeyBuOlwiU0hFRVROQU1FTFBcIiwgZjpwYXJzZV9TSEVFVE5BTUVMUCB9LFxuXHRcdC8qOjpbKi8weEZGRkYvKjo6XSovOiB7IG46XCJcIiB9XG5cdH07XG5cblx0dmFyIFdLM0VudW0gPSB7XG5cdFx0Lyo6OlsqLzB4MDAwMC8qOjpdKi86IHsgbjpcIkJPRlwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwMS8qOjpdKi86IHsgbjpcIkVPRlwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwMi8qOjpdKi86IHsgbjpcIlBBU1NXT1JEXCIgfSxcblx0XHQvKjo6WyovMHgwMDAzLyo6Ol0qLzogeyBuOlwiQ0FMQ1NFVFwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwNC8qOjpdKi86IHsgbjpcIldJTkRPV1NFVFwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwNS8qOjpdKi86IHsgbjpcIlNIRUVUQ0VMTFBUUlwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwNi8qOjpdKi86IHsgbjpcIlNIRUVUTEFZT1VUXCIgfSxcblx0XHQvKjo6WyovMHgwMDA3Lyo6Ol0qLzogeyBuOlwiQ09MVU1OV0lEVEhcIiB9LFxuXHRcdC8qOjpbKi8weDAwMDgvKjo6XSovOiB7IG46XCJISURERU5DT0xVTU5cIiB9LFxuXHRcdC8qOjpbKi8weDAwMDkvKjo6XSovOiB7IG46XCJVU0VSUkFOR0VcIiB9LFxuXHRcdC8qOjpbKi8weDAwMEEvKjo6XSovOiB7IG46XCJTWVNURU1SQU5HRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwQi8qOjpdKi86IHsgbjpcIlpFUk9GT1JDRVwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwQy8qOjpdKi86IHsgbjpcIlNPUlRLRVlESVJcIiB9LFxuXHRcdC8qOjpbKi8weDAwMEQvKjo6XSovOiB7IG46XCJGSUxFU0VBTFwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwRS8qOjpdKi86IHsgbjpcIkRBVEFGSUxMTlVNU1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDAwRi8qOjpdKi86IHsgbjpcIlBSSU5UTUFJTlwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxMC8qOjpdKi86IHsgbjpcIlBSSU5UU1RSSU5HXCIgfSxcblx0XHQvKjo6WyovMHgwMDExLyo6Ol0qLzogeyBuOlwiR1JBUEhNQUlOXCIgfSxcblx0XHQvKjo6WyovMHgwMDEyLyo6Ol0qLzogeyBuOlwiR1JBUEhTVFJJTkdcIiB9LFxuXHRcdC8qOjpbKi8weDAwMTMvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxNC8qOjpdKi86IHsgbjpcIkVSUkNFTExcIiB9LFxuXHRcdC8qOjpbKi8weDAwMTUvKjo6XSovOiB7IG46XCJOQUNFTExcIiB9LFxuXHRcdC8qOjpbKi8weDAwMTYvKjo6XSovOiB7IG46XCJMQUJFTDE2XCIsIGY6cGFyc2VfTEFCRUxfMTZ9LFxuXHRcdC8qOjpbKi8weDAwMTcvKjo6XSovOiB7IG46XCJOVU1CRVIxN1wiLCBmOnBhcnNlX05VTUJFUl8xNyB9LFxuXHRcdC8qOjpbKi8weDAwMTgvKjo6XSovOiB7IG46XCJOVU1CRVIxOFwiLCBmOnBhcnNlX05VTUJFUl8xOCB9LFxuXHRcdC8qOjpbKi8weDAwMTkvKjo6XSovOiB7IG46XCJGT1JNVUxBMTlcIiwgZjpwYXJzZV9GT1JNVUxBXzE5fSxcblx0XHQvKjo6WyovMHgwMDFBLyo6Ol0qLzogeyBuOlwiRk9STVVMQTFBXCIgfSxcblx0XHQvKjo6WyovMHgwMDFCLyo6Ol0qLzogeyBuOlwiWEZPUk1BVFwiLCBmOnBhcnNlX1hGT1JNQVQgfSxcblx0XHQvKjo6WyovMHgwMDFDLyo6Ol0qLzogeyBuOlwiRFRMQUJFTE1JU0NcIiB9LFxuXHRcdC8qOjpbKi8weDAwMUQvKjo6XSovOiB7IG46XCJEVExBQkVMQ0VMTFwiIH0sXG5cdFx0Lyo6OlsqLzB4MDAxRS8qOjpdKi86IHsgbjpcIkdSQVBIV0lORE9XXCIgfSxcblx0XHQvKjo6WyovMHgwMDFGLyo6Ol0qLzogeyBuOlwiQ1BBXCIgfSxcblx0XHQvKjo6WyovMHgwMDIwLyo6Ol0qLzogeyBuOlwiTFBMQVVUT1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDAyMS8qOjpdKi86IHsgbjpcIlFVRVJZXCIgfSxcblx0XHQvKjo6WyovMHgwMDIyLyo6Ol0qLzogeyBuOlwiSElEREVOU0hFRVRcIiB9LFxuXHRcdC8qOjpbKi8weDAwMjMvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDAyNS8qOjpdKi86IHsgbjpcIk5VTUJFUjI1XCIsIGY6cGFyc2VfTlVNQkVSXzI1IH0sXG5cdFx0Lyo6OlsqLzB4MDAyNi8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMDI3Lyo6Ol0qLzogeyBuOlwiTlVNQkVSMjdcIiwgZjpwYXJzZV9OVU1CRVJfMjcgfSxcblx0XHQvKjo6WyovMHgwMDI4Lyo6Ol0qLzogeyBuOlwiRk9STVVMQTI4XCIsIGY6cGFyc2VfRk9STVVMQV8yOCB9LFxuXHRcdC8qOjpbKi8weDAwOEUvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDA5My8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMDk2Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwOTcvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDA5OC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMDk5Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwOUEvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDA5Qi8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMDlDLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwQTMvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDBBRS8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMEFGLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwQjAvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDBCMS8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMEI4Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwQjkvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDBCQS8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMEJCLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwQkMvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDBDMy8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMEM5Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwQ0MvKjo6XSovOiB7IG46XCJTSEVFVE5BTUVDU1wiLCBmOnBhcnNlX1NIRUVUTkFNRUNTIH0sXG5cdFx0Lyo6OlsqLzB4MDBDRC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMENFLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAwQ0YvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDBEMC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMTAwLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAxMDMvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDEwNC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMTA1Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAxMDYvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDEwNy8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMTA5Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAxMEEvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDEwQi8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMTBDLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAxMEUvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDEwRi8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMTgwLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAxODUvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDE4Ni8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMTg5Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAxOEMvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDIwMC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMjAyLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAyMDEvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDIwNC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMjA1Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAyODAvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDI4MS8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMjgyLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAyODMvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDI4NC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMjg1Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAyODYvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDI4Ny8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMjg4Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAyOTIvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDI5My8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMjk0Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAyOTUvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDI5Ni8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMjk5Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDAyOUEvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDMwMC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwMzA0Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDA2MDEvKjo6XSovOiB7IG46XCJTSEVFVElORk9RUFwiLCBmOnBhcnNlX1NIRUVUSU5GT1FQIH0sXG5cdFx0Lyo6OlsqLzB4MDY0MC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwNjQyLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDA3MDEvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDcwMi8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwNzAzLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDA3MDQvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDc4MC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwODAwLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDA4MDEvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MDgwNC8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHgwQTgwLyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDJBRjYvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4MzIzMS8qOjpdKi86IHsgbjpcIj8/XCIgfSxcblx0XHQvKjo6WyovMHg2RTQ5Lyo6Ol0qLzogeyBuOlwiPz9cIiB9LFxuXHRcdC8qOjpbKi8weDZGNDQvKjo6XSovOiB7IG46XCI/P1wiIH0sXG5cdFx0Lyo6OlsqLzB4RkZGRi8qOjpdKi86IHsgbjpcIlwiIH1cblx0fTtcblx0cmV0dXJuIHtcblx0XHRzaGVldF90b193azE6IHNoZWV0X3RvX3drMSxcblx0XHRib29rX3RvX3drMzogYm9va190b193azMsXG5cdFx0dG9fd29ya2Jvb2s6IGxvdHVzX3RvX3dvcmtib29rXG5cdH07XG59KSgpO1xuLyogMTguNC43IHJQciBDVF9SUHJFbHQgKi9cbmZ1bmN0aW9uIHBhcnNlX3JwcihycHIpIHtcblx0dmFyIGZvbnQgPSB7fSwgbSA9IHJwci5tYXRjaCh0YWdyZWdleCksIGkgPSAwO1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXHRpZihtKSBmb3IoO2khPW0ubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKG1baV0pO1xuXHRcdHN3aXRjaCh5WzBdLnJlcGxhY2UoL1xcdyo6L2csXCJcIikpIHtcblx0XHRcdC8qIDE4LjguMTIgY29uZGVuc2UgQ1RfQm9vbGVhblByb3BlcnR5ICovXG5cdFx0XHQvKiAqKiBub3QgcmVxdWlyZWQgLiAqL1xuXHRcdFx0Y2FzZSAnPGNvbmRlbnNlJzogYnJlYWs7XG5cdFx0XHQvKiAxOC44LjE3IGV4dGVuZCBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdC8qICoqIG5vdCByZXF1aXJlZCAuICovXG5cdFx0XHRjYXNlICc8ZXh0ZW5kJzogYnJlYWs7XG5cdFx0XHQvKiAxOC44LjM2IHNoYWRvdyBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdC8qICoqIG5vdCByZXF1aXJlZCAuICovXG5cdFx0XHRjYXNlICc8c2hhZG93Jzpcblx0XHRcdFx0aWYoIXkudmFsKSBicmVhaztcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnPHNoYWRvdz4nOlxuXHRcdFx0Y2FzZSAnPHNoYWRvdy8+JzogZm9udC5zaGFkb3cgPSAxOyBicmVhaztcblx0XHRcdGNhc2UgJzwvc2hhZG93Pic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjEgY2hhcnNldCBDVF9JbnRQcm9wZXJ0eSBUT0RPICovXG5cdFx0XHRjYXNlICc8Y2hhcnNldCc6XG5cdFx0XHRcdGlmKHkudmFsID09ICcxJykgYnJlYWs7XG5cdFx0XHRcdGZvbnQuY3AgPSBDUzJDUFtwYXJzZUludCh5LnZhbCwgMTApXTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdC8qIDE4LjQuMiBvdXRsaW5lIENUX0Jvb2xlYW5Qcm9wZXJ0eSBUT0RPICovXG5cdFx0XHRjYXNlICc8b3V0bGluZSc6XG5cdFx0XHRcdGlmKCF5LnZhbCkgYnJlYWs7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGNhc2UgJzxvdXRsaW5lPic6XG5cdFx0XHRjYXNlICc8b3V0bGluZS8+JzogZm9udC5vdXRsaW5lID0gMTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L291dGxpbmU+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjQuNSByRm9udCBDVF9Gb250TmFtZSAqL1xuXHRcdFx0Y2FzZSAnPHJGb250JzogZm9udC5uYW1lID0geS52YWw7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjExIHN6IENUX0ZvbnRTaXplICovXG5cdFx0XHRjYXNlICc8c3onOiBmb250LnN6ID0geS52YWw7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjEwIHN0cmlrZSBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxzdHJpa2UnOlxuXHRcdFx0XHRpZigheS52YWwpIGJyZWFrO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICc8c3RyaWtlPic6XG5cdFx0XHRjYXNlICc8c3RyaWtlLz4nOiBmb250LnN0cmlrZSA9IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9zdHJpa2U+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjQuMTMgdSBDVF9VbmRlcmxpbmVQcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPHUnOlxuXHRcdFx0XHRpZigheS52YWwpIGJyZWFrO1xuXHRcdFx0XHRzd2l0Y2goeS52YWwpIHtcblx0XHRcdFx0XHRjYXNlICdkb3VibGUnOiBmb250LnV2YWwgPSBcImRvdWJsZVwiOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaW5nbGVBY2NvdW50aW5nJzogZm9udC51dmFsID0gXCJzaW5nbGUtYWNjb3VudGluZ1wiOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb3VibGVBY2NvdW50aW5nJzogZm9udC51dmFsID0gXCJkb3VibGUtYWNjb3VudGluZ1wiOyBicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICc8dT4nOlxuXHRcdFx0Y2FzZSAnPHUvPic6IGZvbnQudSA9IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC91Pic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjIgYiAqL1xuXHRcdFx0Y2FzZSAnPGInOlxuXHRcdFx0XHRpZih5LnZhbCA9PSAnMCcpIGJyZWFrO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICc8Yj4nOlxuXHRcdFx0Y2FzZSAnPGIvPic6IGZvbnQuYiA9IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9iPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjI2IGkgKi9cblx0XHRcdGNhc2UgJzxpJzpcblx0XHRcdFx0aWYoeS52YWwgPT0gJzAnKSBicmVhaztcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnPGk+Jzpcblx0XHRcdGNhc2UgJzxpLz4nOiBmb250LmkgPSAxOyBicmVhaztcblx0XHRcdGNhc2UgJzwvaT4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMy4xLjE1IGNvbG9yIENUX0NvbG9yIFRPRE86IHRpbnQsIHRoZW1lLCBhdXRvLCBpbmRleGVkICovXG5cdFx0XHRjYXNlICc8Y29sb3InOlxuXHRcdFx0XHRpZih5LnJnYikgZm9udC5jb2xvciA9IHkucmdiLnNsaWNlKDIsOCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGNvbG9yPic6IGNhc2UgJzxjb2xvci8+JzogY2FzZSAnPC9jb2xvcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4xOCBmYW1pbHkgU1RfRm9udEZhbWlseSAqL1xuXHRcdFx0Y2FzZSAnPGZhbWlseSc6IGZvbnQuZmFtaWx5ID0geS52YWw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGZhbWlseT4nOiBjYXNlICc8ZmFtaWx5Lz4nOiBjYXNlICc8L2ZhbWlseT4nOiBicmVhaztcblxuXHRcdFx0LyogMTguNC4xNCB2ZXJ0QWxpZ24gQ1RfVmVydGljYWxBbGlnbkZvbnRQcm9wZXJ0eSBUT0RPICovXG5cdFx0XHRjYXNlICc8dmVydEFsaWduJzogZm9udC52YWxpZ24gPSB5LnZhbDsgYnJlYWs7XG5cdFx0XHRjYXNlICc8dmVydEFsaWduPic6IGNhc2UgJzx2ZXJ0QWxpZ24vPic6IGNhc2UgJzwvdmVydEFsaWduPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjM1IHNjaGVtZSBDVF9Gb250U2NoZW1lIFRPRE8gKi9cblx0XHRcdGNhc2UgJzxzY2hlbWUnOiBicmVhaztcblx0XHRcdGNhc2UgJzxzY2hlbWU+JzogY2FzZSAnPHNjaGVtZS8+JzogY2FzZSAnPC9zY2hlbWU+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTAgZXh0THN0IENUX0V4dGVuc2lvbkxpc3QgPyAqL1xuXHRcdFx0Y2FzZSAnPGV4dExzdCc6IGNhc2UgJzxleHRMc3Q+JzogY2FzZSAnPC9leHRMc3Q+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8ZXh0JzogcGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9leHQ+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKHlbMF0uY2hhckNvZGVBdCgxKSAhPT0gNDcgJiYgIXBhc3MpIHRocm93IG5ldyBFcnJvcignVW5yZWNvZ25pemVkIHJpY2ggZm9ybWF0ICcgKyB5WzBdKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZvbnQ7XG59XG5cbnZhciBwYXJzZV9ycyA9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24oKSB7XG5cdHZhciB0cmVnZXggPSBtYXRjaHRhZyhcInRcIiksIHJwcmVnZXggPSBtYXRjaHRhZyhcInJQclwiKTtcblx0LyogMTguNC40IHIgQ1RfUkVsdCAqL1xuXHRmdW5jdGlvbiBwYXJzZV9yKHIpIHtcblx0XHQvKiAxOC40LjEyIHQgU1RfWHN0cmluZyAqL1xuXHRcdHZhciB0ID0gci5tYXRjaCh0cmVnZXgpLyosIGNwID0gNjUwMDEqLztcblx0XHRpZighdCkgcmV0dXJuIHt0Olwic1wiLCB2OlwiXCJ9O1xuXG5cdFx0dmFyIG8vKjpDZWxsKi8gPSAoe3Q6J3MnLCB2OnVuZXNjYXBleG1sKHRbMV0pfS8qOmFueSovKTtcblx0XHR2YXIgcnByID0gci5tYXRjaChycHJlZ2V4KTtcblx0XHRpZihycHIpIG8ucyA9IHBhcnNlX3JwcihycHJbMV0pO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cdHZhciBycmVnZXggPSAvPCg/Olxcdys6KT9yPi9nLCByZW5kID0gLzxcXC8oPzpcXHcrOik/cj4vO1xuXHRyZXR1cm4gZnVuY3Rpb24gcGFyc2VfcnMocnMpIHtcblx0XHRyZXR1cm4gcnMucmVwbGFjZShycmVnZXgsXCJcIikuc3BsaXQocmVuZCkubWFwKHBhcnNlX3IpLmZpbHRlcihmdW5jdGlvbihyKSB7IHJldHVybiByLnY7IH0pO1xuXHR9O1xufSkoKTtcblxuXG4vKiBQYXJzZSBhIGxpc3Qgb2YgPHI+IHRhZ3MgKi9cbnZhciByc190b19odG1sID0gLyojX19QVVJFX18qLyhmdW5jdGlvbiBwYXJzZV9yc19mYWN0b3J5KCkge1xuXHR2YXIgbmxyZWdleCA9IC8oXFxyXFxufFxcbikvZztcblx0ZnVuY3Rpb24gcGFyc2VfcnByMihmb250LCBpbnRybywgb3V0cm8pIHtcblx0XHR2YXIgc3R5bGUvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblxuXHRcdGlmKGZvbnQudSkgc3R5bGUucHVzaChcInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiKTtcblx0XHRpZihmb250LnV2YWwpIHN0eWxlLnB1c2goXCJ0ZXh0LXVuZGVybGluZS1zdHlsZTpcIiArIGZvbnQudXZhbCArIFwiO1wiKTtcblx0XHRpZihmb250LnN6KSBzdHlsZS5wdXNoKFwiZm9udC1zaXplOlwiICsgZm9udC5zeiArIFwicHQ7XCIpO1xuXHRcdGlmKGZvbnQub3V0bGluZSkgc3R5bGUucHVzaChcInRleHQtZWZmZWN0OiBvdXRsaW5lO1wiKTtcblx0XHRpZihmb250LnNoYWRvdykgc3R5bGUucHVzaChcInRleHQtc2hhZG93OiBhdXRvO1wiKTtcblx0XHRpbnRyby5wdXNoKCc8c3BhbiBzdHlsZT1cIicgKyBzdHlsZS5qb2luKFwiXCIpICsgJ1wiPicpO1xuXG5cdFx0aWYoZm9udC5iKSB7IGludHJvLnB1c2goXCI8Yj5cIik7IG91dHJvLnB1c2goXCI8L2I+XCIpOyB9XG5cdFx0aWYoZm9udC5pKSB7IGludHJvLnB1c2goXCI8aT5cIik7IG91dHJvLnB1c2goXCI8L2k+XCIpOyB9XG5cdFx0aWYoZm9udC5zdHJpa2UpIHsgaW50cm8ucHVzaChcIjxzPlwiKTsgb3V0cm8ucHVzaChcIjwvcz5cIik7IH1cblxuXHRcdHZhciBhbGlnbiA9IGZvbnQudmFsaWduIHx8IFwiXCI7XG5cdFx0aWYoYWxpZ24gPT0gXCJzdXBlcnNjcmlwdFwiIHx8IGFsaWduID09IFwic3VwZXJcIikgYWxpZ24gPSBcInN1cFwiO1xuXHRcdGVsc2UgaWYoYWxpZ24gPT0gXCJzdWJzY3JpcHRcIikgYWxpZ24gPSBcInN1YlwiO1xuXHRcdGlmKGFsaWduICE9IFwiXCIpIHsgaW50cm8ucHVzaChcIjxcIiArIGFsaWduICsgXCI+XCIpOyBvdXRyby5wdXNoKFwiPC9cIiArIGFsaWduICsgXCI+XCIpOyB9XG5cblx0XHRvdXRyby5wdXNoKFwiPC9zcGFuPlwiKTtcblx0XHRyZXR1cm4gZm9udDtcblx0fVxuXG5cdC8qIDE4LjQuNCByIENUX1JFbHQgKi9cblx0ZnVuY3Rpb24gcl90b19odG1sKHIpIHtcblx0XHR2YXIgdGVybXMvKjpbQXJyYXk8c3RyaW5nPiwgc3RyaW5nLCBBcnJheTxzdHJpbmc+XSovID0gW1tdLHIudixbXV07XG5cdFx0aWYoIXIudikgcmV0dXJuIFwiXCI7XG5cblx0XHRpZihyLnMpIHBhcnNlX3JwcjIoci5zLCB0ZXJtc1swXSwgdGVybXNbMl0pO1xuXG5cdFx0cmV0dXJuIHRlcm1zWzBdLmpvaW4oXCJcIikgKyB0ZXJtc1sxXS5yZXBsYWNlKG5scmVnZXgsJzxici8+JykgKyB0ZXJtc1syXS5qb2luKFwiXCIpO1xuXHR9XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHBhcnNlX3JzKHJzKSB7XG5cdFx0cmV0dXJuIHJzLm1hcChyX3RvX2h0bWwpLmpvaW4oXCJcIik7XG5cdH07XG59KSgpO1xuXG4vKiAxOC40Ljggc2kgQ1RfUnN0ICovXG52YXIgc2l0cmVnZXggPSAvPCg/Olxcdys6KT90W14+XSo+KFtePF0qKTxcXC8oPzpcXHcrOik/dD4vZywgc2lycmVnZXggPSAvPCg/Olxcdys6KT9yPi87XG52YXIgc2lycGhyZWdleCA9IC88KD86XFx3KzopP3JQaC4qPz4oW1xcc1xcU10qPyk8XFwvKD86XFx3KzopP3JQaD4vZztcbmZ1bmN0aW9uIHBhcnNlX3NpKHgsIG9wdHMpIHtcblx0dmFyIGh0bWwgPSBvcHRzID8gb3B0cy5jZWxsSFRNTCA6IHRydWU7XG5cdHZhciB6ID0ge307XG5cdGlmKCF4KSByZXR1cm4geyB0OiBcIlwiIH07XG5cdC8vdmFyIHk7XG5cdC8qIDE4LjQuMTIgdCBTVF9Yc3RyaW5nIChQbGFpbnRleHQgU3RyaW5nKSAqL1xuXHQvLyBUT0RPOiBpcyB3aGl0ZXNwYWNlIGFjdHVhbGx5IHZhbGlkIGhlcmU/XG5cdGlmKHgubWF0Y2goL15cXHMqPCg/Olxcdys6KT90W14+XSo+LykpIHtcblx0XHR6LnQgPSB1bmVzY2FwZXhtbCh1dGY4cmVhZCh4LnNsaWNlKHguaW5kZXhPZihcIj5cIikrMSkuc3BsaXQoLzxcXC8oPzpcXHcrOik/dD4vKVswXXx8XCJcIikpO1xuXHRcdHouciA9IHV0ZjhyZWFkKHgpO1xuXHRcdGlmKGh0bWwpIHouaCA9IGVzY2FwZWh0bWwoei50KTtcblx0fVxuXHQvKiAxOC40LjQgciBDVF9SRWx0IChSaWNoIFRleHQgUnVuKSAqL1xuXHRlbHNlIGlmKCgvKnkgPSAqL3gubWF0Y2goc2lycmVnZXgpKSkge1xuXHRcdHouciA9IHV0ZjhyZWFkKHgpO1xuXHRcdHoudCA9IHVuZXNjYXBleG1sKHV0ZjhyZWFkKCh4LnJlcGxhY2Uoc2lycGhyZWdleCwgJycpLm1hdGNoKHNpdHJlZ2V4KXx8W10pLmpvaW4oXCJcIikucmVwbGFjZSh0YWdyZWdleCxcIlwiKSkpO1xuXHRcdGlmKGh0bWwpIHouaCA9IHJzX3RvX2h0bWwocGFyc2VfcnMoei5yKSk7XG5cdH1cblx0LyogMTguNC4zIHBob25ldGljUHIgQ1RfUGhvbmV0aWNQciAoVE9ETzogbmVlZGVkIGZvciBBc2lhbiBzdXBwb3J0KSAqL1xuXHQvKiAxOC40LjYgclBoIENUX1Bob25ldGljUnVuIChUT0RPOiBuZWVkZWQgZm9yIEFzaWFuIHN1cHBvcnQpICovXG5cdHJldHVybiB6O1xufVxuXG4vKiAxOC40IFNoYXJlZCBTdHJpbmcgVGFibGUgKi9cbnZhciBzc3RyMCA9IC88KD86XFx3KzopP3NzdChbXj5dKik+KFtcXHNcXFNdKik8XFwvKD86XFx3KzopP3NzdD4vO1xudmFyIHNzdHIxID0gLzwoPzpcXHcrOik/KD86c2l8c3N0SXRlbSk+L2c7XG52YXIgc3N0cjIgPSAvPFxcLyg/Olxcdys6KT8oPzpzaXxzc3RJdGVtKT4vO1xuZnVuY3Rpb24gcGFyc2Vfc3N0X3htbChkYXRhLyo6c3RyaW5nKi8sIG9wdHMpLyo6U1NUKi8ge1xuXHR2YXIgcy8qOlNTVCovID0gKFtdLyo6YW55Ki8pLCBzcyA9IFwiXCI7XG5cdGlmKCFkYXRhKSByZXR1cm4gcztcblx0LyogMTguNC45IHNzdCBDVF9Tc3QgKi9cblx0dmFyIHNzdCA9IGRhdGEubWF0Y2goc3N0cjApO1xuXHRpZihzc3QpIHtcblx0XHRzcyA9IHNzdFsyXS5yZXBsYWNlKHNzdHIxLFwiXCIpLnNwbGl0KHNzdHIyKTtcblx0XHRmb3IodmFyIGkgPSAwOyBpICE9IHNzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YXIgbyA9IHBhcnNlX3NpKHNzW2ldLnRyaW0oKSwgb3B0cyk7XG5cdFx0XHRpZihvICE9IG51bGwpIHNbcy5sZW5ndGhdID0gbztcblx0XHR9XG5cdFx0c3N0ID0gcGFyc2V4bWx0YWcoc3N0WzFdKTsgcy5Db3VudCA9IHNzdC5jb3VudDsgcy5VbmlxdWUgPSBzc3QudW5pcXVlQ291bnQ7XG5cdH1cblx0cmV0dXJuIHM7XG59XG5cbnZhciBzdHJheXdzcmVnZXggPSAvXlxcc3xcXHMkfFtcXHRcXG5cXHJdLztcbmZ1bmN0aW9uIHdyaXRlX3NzdF94bWwoc3N0Lyo6U1NUKi8sIG9wdHMpLyo6c3RyaW5nKi8ge1xuXHRpZighb3B0cy5ib29rU1NUKSByZXR1cm4gXCJcIjtcblx0dmFyIG8gPSBbWE1MX0hFQURFUl07XG5cdG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnc3N0JywgbnVsbCwge1xuXHRcdHhtbG5zOiBYTUxOU19tYWluWzBdLFxuXHRcdGNvdW50OiBzc3QuQ291bnQsXG5cdFx0dW5pcXVlQ291bnQ6IHNzdC5VbmlxdWVcblx0fSkpO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IHNzdC5sZW5ndGg7ICsraSkgeyBpZihzc3RbaV0gPT0gbnVsbCkgY29udGludWU7XG5cdFx0dmFyIHMvKjpYTFN0cmluZyovID0gc3N0W2ldO1xuXHRcdHZhciBzaXRhZyA9IFwiPHNpPlwiO1xuXHRcdGlmKHMucikgc2l0YWcgKz0gcy5yO1xuXHRcdGVsc2Uge1xuXHRcdFx0c2l0YWcgKz0gXCI8dFwiO1xuXHRcdFx0aWYoIXMudCkgcy50ID0gXCJcIjtcblx0XHRcdGlmKHMudC5tYXRjaChzdHJheXdzcmVnZXgpKSBzaXRhZyArPSAnIHhtbDpzcGFjZT1cInByZXNlcnZlXCInO1xuXHRcdFx0c2l0YWcgKz0gXCI+XCIgKyBlc2NhcGV4bWwocy50KSArIFwiPC90PlwiO1xuXHRcdH1cblx0XHRzaXRhZyArPSBcIjwvc2k+XCI7XG5cdFx0b1tvLmxlbmd0aF0gPSAoc2l0YWcpO1xuXHR9XG5cdGlmKG8ubGVuZ3RoPjIpeyBvW28ubGVuZ3RoXSA9ICgnPC9zc3Q+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIFtNUy1YTFNCXSAyLjQuMjIxIEJydEJlZ2luU3N0ICovXG5mdW5jdGlvbiBwYXJzZV9CcnRCZWdpblNzdChkYXRhKSB7XG5cdHJldHVybiBbZGF0YS5yZWFkX3NoaWZ0KDQpLCBkYXRhLnJlYWRfc2hpZnQoNCldO1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjcuNDUgU2hhcmVkIFN0cmluZ3MgKi9cbmZ1bmN0aW9uIHBhcnNlX3NzdF9iaW4oZGF0YSwgb3B0cykvKjpTU1QqLyB7XG5cdHZhciBzLyo6U1NUKi8gPSAoW10vKjphbnkqLyk7XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cdHJlY29yZGhvcHBlcihkYXRhLCBmdW5jdGlvbiBob3BwZXJfc3N0KHZhbCwgUiwgUlQpIHtcblx0XHRzd2l0Y2goUlQpIHtcblx0XHRcdGNhc2UgMHgwMDlGOiAvKiBCcnRCZWdpblNzdCAqL1xuXHRcdFx0XHRzLkNvdW50ID0gdmFsWzBdOyBzLlVuaXF1ZSA9IHZhbFsxXTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAxMzogLyogQnJ0U1NUSXRlbSAqL1xuXHRcdFx0XHRzLnB1c2godmFsKTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDBBMDogLyogQnJ0RW5kU3N0ICovXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0XHRjYXNlIDB4MDAyMzogLyogQnJ0RlJUQmVnaW4gKi9cblx0XHRcdFx0cGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMjQ6IC8qIEJydEZSVEVuZCAqL1xuXHRcdFx0XHRwYXNzID0gZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZihSLlQpe31cblx0XHRcdFx0aWYoIXBhc3MgfHwgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcmVjb3JkIDB4XCIgKyBSVC50b1N0cmluZygxNikpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9CcnRCZWdpblNzdChzc3QsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDgpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIHNzdC5Db3VudCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgc3N0LlVuaXF1ZSk7XG5cdHJldHVybiBvO1xufVxuXG52YXIgd3JpdGVfQnJ0U1NUSXRlbSA9IHdyaXRlX1JpY2hTdHI7XG5cbmZ1bmN0aW9uIHdyaXRlX3NzdF9iaW4oc3N0Lyo6Oiwgb3B0cyovKSB7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA5RiAvKiBCcnRCZWdpblNzdCAqLywgd3JpdGVfQnJ0QmVnaW5Tc3Qoc3N0KSk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBzc3QubGVuZ3RoOyArK2kpIHdyaXRlX3JlY29yZChiYSwgMHgwMDEzIC8qIEJydFNTVEl0ZW0gKi8sIHdyaXRlX0JydFNTVEl0ZW0oc3N0W2ldKSk7XG5cdC8qIEZSVFNTVCAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDBBMCAvKiBCcnRFbmRTc3QgKi8pO1xuXHRyZXR1cm4gYmEuZW5kKCk7XG59XG5mdW5jdGlvbiBfSlMyQU5TSShzdHIvKjpzdHJpbmcqLykvKjpBcnJheTxudW1iZXI+Ki8ge1xuXHRpZih0eXBlb2YgJGNwdGFibGUgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gJGNwdGFibGUudXRpbHMuZW5jb2RlKGN1cnJlbnRfYW5zaSwgc3RyKTtcblx0dmFyIG8vKjpBcnJheTxudW1iZXI+Ki8gPSBbXSwgb28gPSBzdHIuc3BsaXQoXCJcIik7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBvby5sZW5ndGg7ICsraSkgb1tpXSA9IG9vW2ldLmNoYXJDb2RlQXQoMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuNCBWZXJzaW9uICovXG5mdW5jdGlvbiBwYXJzZV9DUllQVE9WZXJzaW9uKGJsb2IsIGxlbmd0aC8qOj9udW1iZXIqLykge1xuXHR2YXIgby8qOmFueSovID0ge307XG5cdG8uTWFqb3IgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdG8uTWlub3IgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdC8qOjogaWYobGVuZ3RoID09IG51bGwpIHJldHVybiBvOyAqL1xuXHRpZihsZW5ndGggPj0gNCkgYmxvYi5sICs9IGxlbmd0aCAtIDQ7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuNSBEYXRhU3BhY2VWZXJzaW9uSW5mbyAqL1xuZnVuY3Rpb24gcGFyc2VfRGF0YVNwYWNlVmVyc2lvbkluZm8oYmxvYikge1xuXHR2YXIgbyA9IHt9O1xuXHRvLmlkID0gYmxvYi5yZWFkX3NoaWZ0KDAsICdscHA0Jyk7XG5cdG8uUiA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdG8uVSA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdG8uVyA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuNi4xIERhdGFTcGFjZU1hcEVudHJ5IFN0cnVjdHVyZSAqL1xuZnVuY3Rpb24gcGFyc2VfRGF0YVNwYWNlTWFwRW50cnkoYmxvYikge1xuXHR2YXIgbGVuID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgZW5kID0gYmxvYi5sICsgbGVuIC0gNDtcblx0dmFyIG8gPSB7fTtcblx0dmFyIGNudCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIGNvbXBzLyo6QXJyYXk8e3Q6bnVtYmVyLCB2OnN0cmluZ30+Ki8gPSBbXTtcblx0LyogW01TLU9GRkNSWVBUT10gMi4xLjYuMiBEYXRhU3BhY2VSZWZlcmVuY2VDb21wb25lbnQgU3RydWN0dXJlICovXG5cdHdoaWxlKGNudC0tID4gMCkgY29tcHMucHVzaCh7IHQ6IGJsb2IucmVhZF9zaGlmdCg0KSwgdjogYmxvYi5yZWFkX3NoaWZ0KDAsICdscHA0JykgfSk7XG5cdG8ubmFtZSA9IGJsb2IucmVhZF9zaGlmdCgwLCAnbHBwNCcpO1xuXHRvLmNvbXBzID0gY29tcHM7XG5cdGlmKGJsb2IubCAhPSBlbmQpIHRocm93IG5ldyBFcnJvcihcIkJhZCBEYXRhU3BhY2VNYXBFbnRyeTogXCIgKyBibG9iLmwgKyBcIiAhPSBcIiArIGVuZCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuNiBEYXRhU3BhY2VNYXAgKi9cbmZ1bmN0aW9uIHBhcnNlX0RhdGFTcGFjZU1hcChibG9iKSB7XG5cdHZhciBvID0gW107XG5cdGJsb2IubCArPSA0OyAvLyBtdXN0IGJlIDB4OFxuXHR2YXIgY250ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR3aGlsZShjbnQtLSA+IDApIG8ucHVzaChwYXJzZV9EYXRhU3BhY2VNYXBFbnRyeShibG9iKSk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuNyBEYXRhU3BhY2VEZWZpbml0aW9uICovXG5mdW5jdGlvbiBwYXJzZV9EYXRhU3BhY2VEZWZpbml0aW9uKGJsb2IpLyo6QXJyYXk8c3RyaW5nPiovIHtcblx0dmFyIG8vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0YmxvYi5sICs9IDQ7IC8vIG11c3QgYmUgMHg4XG5cdHZhciBjbnQgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHdoaWxlKGNudC0tID4gMCkgby5wdXNoKGJsb2IucmVhZF9zaGlmdCgwLCAnbHBwNCcpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMS44IERhdGFTcGFjZURlZmluaXRpb24gKi9cbmZ1bmN0aW9uIHBhcnNlX1RyYW5zZm9ybUluZm9IZWFkZXIoYmxvYikge1xuXHR2YXIgbyA9IHt9O1xuXHQvKnZhciBsZW4gPSAqL2Jsb2IucmVhZF9zaGlmdCg0KTtcblx0YmxvYi5sICs9IDQ7IC8vIG11c3QgYmUgMHgxXG5cdG8uaWQgPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwcDQnKTtcblx0by5uYW1lID0gYmxvYi5yZWFkX3NoaWZ0KDAsICdscHA0Jyk7XG5cdG8uUiA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdG8uVSA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdG8uVyA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdHJldHVybiBvO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9QcmltYXJ5KGJsb2IpIHtcblx0LyogW01TLU9GRkNSWVBUT10gMi4yLjYgSVJNRFNUcmFuc2Zvcm1JbmZvICovXG5cdHZhciBoZHIgPSBwYXJzZV9UcmFuc2Zvcm1JbmZvSGVhZGVyKGJsb2IpO1xuXHQvKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuOSBFbmNyeXB0aW9uVHJhbnNmb3JtSW5mbyAqL1xuXHRoZHIuZW5hbWUgPSBibG9iLnJlYWRfc2hpZnQoMCwgJzhscHA0Jyk7XG5cdGhkci5ibGtzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0aGRyLmNtb2RlID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRpZihibG9iLnJlYWRfc2hpZnQoNCkgIT0gMHgwNCkgdGhyb3cgbmV3IEVycm9yKFwiQmFkICFQcmltYXJ5IHJlY29yZFwiKTtcblx0cmV0dXJuIGhkcjtcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4zLjIgRW5jcnlwdGlvbiBIZWFkZXIgKi9cbmZ1bmN0aW9uIHBhcnNlX0VuY3J5cHRpb25IZWFkZXIoYmxvYiwgbGVuZ3RoLyo6bnVtYmVyKi8pIHtcblx0dmFyIHRndCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIG8gPSB7fTtcblx0by5GbGFncyA9IChibG9iLnJlYWRfc2hpZnQoNCkgJiAweDNGKTtcblx0YmxvYi5sICs9IDQ7XG5cdG8uQWxnSUQgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciB2YWxpZCA9IGZhbHNlO1xuXHRzd2l0Y2goby5BbGdJRCkge1xuXHRcdGNhc2UgMHg2NjBFOiBjYXNlIDB4NjYwRjogY2FzZSAweDY2MTA6IHZhbGlkID0gKG8uRmxhZ3MgPT0gMHgyNCk7IGJyZWFrO1xuXHRcdGNhc2UgMHg2ODAxOiB2YWxpZCA9IChvLkZsYWdzID09IDB4MDQpOyBicmVhaztcblx0XHRjYXNlIDA6IHZhbGlkID0gKG8uRmxhZ3MgPT0gMHgxMCB8fCBvLkZsYWdzID09IDB4MDQgfHwgby5GbGFncyA9PSAweDI0KTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDogdGhyb3cgJ1VucmVjb2duaXplZCBlbmNyeXB0aW9uIGFsZ29yaXRobTogJyArIG8uQWxnSUQ7XG5cdH1cblx0aWYoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoXCJFbmNyeXB0aW9uIEZsYWdzL0FsZ0lEIG1pc21hdGNoXCIpO1xuXHRvLkFsZ0lESGFzaCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0by5LZXlTaXplID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRvLlByb3ZpZGVyVHlwZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0YmxvYi5sICs9IDg7XG5cdG8uQ1NQTmFtZSA9IGJsb2IucmVhZF9zaGlmdCgodGd0LWJsb2IubCk+PjEsICd1dGYxNmxlJyk7XG5cdGJsb2IubCA9IHRndDtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMy4zIEVuY3J5cHRpb24gVmVyaWZpZXIgKi9cbmZ1bmN0aW9uIHBhcnNlX0VuY3J5cHRpb25WZXJpZmllcihibG9iLCBsZW5ndGgvKjpudW1iZXIqLykge1xuXHR2YXIgbyA9IHt9LCB0Z3QgPSBibG9iLmwgKyBsZW5ndGg7XG5cdGJsb2IubCArPSA0OyAvLyBTYWx0U2l6ZSBtdXN0IGJlIDB4MTBcblx0by5TYWx0ID0gYmxvYi5zbGljZShibG9iLmwsIGJsb2IubCsxNik7IGJsb2IubCArPSAxNjtcblx0by5WZXJpZmllciA9IGJsb2Iuc2xpY2UoYmxvYi5sLCBibG9iLmwrMTYpOyBibG9iLmwgKz0gMTY7XG5cdC8qdmFyIHN6ID0gKi9ibG9iLnJlYWRfc2hpZnQoNCk7XG5cdG8uVmVyaWZpZXJIYXNoID0gYmxvYi5zbGljZShibG9iLmwsIHRndCk7IGJsb2IubCA9IHRndDtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMy40LiogRW5jcnlwdGlvbkluZm8gU3RyZWFtICovXG5mdW5jdGlvbiBwYXJzZV9FbmNyeXB0aW9uSW5mbyhibG9iKSB7XG5cdHZhciB2ZXJzID0gcGFyc2VfQ1JZUFRPVmVyc2lvbihibG9iKTtcblx0c3dpdGNoKHZlcnMuTWlub3IpIHtcblx0XHRjYXNlIDB4MDI6IHJldHVybiBbdmVycy5NaW5vciwgcGFyc2VfRW5jSW5mb1N0ZChibG9iLCB2ZXJzKV07XG5cdFx0Y2FzZSAweDAzOiByZXR1cm4gW3ZlcnMuTWlub3IsIHBhcnNlX0VuY0luZm9FeHQoYmxvYiwgdmVycyldO1xuXHRcdGNhc2UgMHgwNDogcmV0dXJuIFt2ZXJzLk1pbm9yLCBwYXJzZV9FbmNJbmZvQWdsKGJsb2IsIHZlcnMpXTtcblx0fVxuXHR0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSB1bnJlY29nbml6ZWQgVmVyc2lvbjogXCIgKyB2ZXJzLk1pbm9yKTtcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4zLjQuNSAgRW5jcnlwdGlvbkluZm8gU3RyZWFtIChTdGFuZGFyZCBFbmNyeXB0aW9uKSAqL1xuZnVuY3Rpb24gcGFyc2VfRW5jSW5mb1N0ZChibG9iLyo6OiwgdmVycyovKSB7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0aWYoKGZsYWdzICYgMHgzRikgIT0gMHgyNCkgdGhyb3cgbmV3IEVycm9yKFwiRW5jcnlwdGlvbkluZm8gbWlzbWF0Y2hcIik7XG5cdHZhciBzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0Ly92YXIgdGd0ID0gYmxvYi5sICsgc3o7XG5cdHZhciBoZHIgPSBwYXJzZV9FbmNyeXB0aW9uSGVhZGVyKGJsb2IsIHN6KTtcblx0dmFyIHZlcmlmaWVyID0gcGFyc2VfRW5jcnlwdGlvblZlcmlmaWVyKGJsb2IsIGJsb2IubGVuZ3RoIC0gYmxvYi5sKTtcblx0cmV0dXJuIHsgdDpcIlN0ZFwiLCBoOmhkciwgdjp2ZXJpZmllciB9O1xufVxuLyogW01TLU9GRkNSWVBUT10gMi4zLjQuNiAgRW5jcnlwdGlvbkluZm8gU3RyZWFtIChFeHRlbnNpYmxlIEVuY3J5cHRpb24pICovXG5mdW5jdGlvbiBwYXJzZV9FbmNJbmZvRXh0KC8qOjpibG9iLCB2ZXJzKi8pIHsgdGhyb3cgbmV3IEVycm9yKFwiRmlsZSBpcyBwYXNzd29yZC1wcm90ZWN0ZWQ6IEVDTUEtMzc2IEV4dGVuc2libGVcIik7IH1cbi8qIFtNUy1PRkZDUllQVE9dIDIuMy40LjEwIEVuY3J5cHRpb25JbmZvIFN0cmVhbSAoQWdpbGUgRW5jcnlwdGlvbikgKi9cbmZ1bmN0aW9uIHBhcnNlX0VuY0luZm9BZ2woYmxvYi8qOjosIHZlcnMqLykge1xuXHR2YXIgS2V5RGF0YSA9IFtcInNhbHRTaXplXCIsXCJibG9ja1NpemVcIixcImtleUJpdHNcIixcImhhc2hTaXplXCIsXCJjaXBoZXJBbGdvcml0aG1cIixcImNpcGhlckNoYWluaW5nXCIsXCJoYXNoQWxnb3JpdGhtXCIsXCJzYWx0VmFsdWVcIl07XG5cdGJsb2IubCs9NDtcblx0dmFyIHhtbCA9IGJsb2IucmVhZF9zaGlmdChibG9iLmxlbmd0aCAtIGJsb2IubCwgJ3V0ZjgnKTtcblx0dmFyIG8gPSB7fTtcblx0eG1sLnJlcGxhY2UodGFncmVnZXgsIGZ1bmN0aW9uIHhtbF9hZ2lsZSh4KSB7XG5cdFx0dmFyIHkvKjphbnkqLyA9IHBhcnNleG1sdGFnKHgpO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPD94bWwnOiBicmVhaztcblx0XHRcdGNhc2UgJzxlbmNyeXB0aW9uJzogY2FzZSAnPC9lbmNyeXB0aW9uPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGtleURhdGEnOiBLZXlEYXRhLmZvckVhY2goZnVuY3Rpb24oaykgeyBvW2tdID0geVtrXTsgfSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGRhdGFJbnRlZ3JpdHknOiBvLmVuY3J5cHRlZEhtYWNLZXkgPSB5LmVuY3J5cHRlZEhtYWNLZXk7IG8uZW5jcnlwdGVkSG1hY1ZhbHVlID0geS5lbmNyeXB0ZWRIbWFjVmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGtleUVuY3J5cHRvcnM+JzogY2FzZSAnPGtleUVuY3J5cHRvcnMnOiBvLmVuY3MgPSBbXTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2tleUVuY3J5cHRvcnM+JzogYnJlYWs7XG5cblx0XHRcdGNhc2UgJzxrZXlFbmNyeXB0b3InOiBvLnVyaSA9IHkudXJpOyBicmVhaztcblx0XHRcdGNhc2UgJzwva2V5RW5jcnlwdG9yPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGVuY3J5cHRlZEtleSc6IG8uZW5jcy5wdXNoKHkpOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IHlbMF07XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMy41LjEgUkM0IENyeXB0b0FQSSBFbmNyeXB0aW9uIEhlYWRlciAqL1xuZnVuY3Rpb24gcGFyc2VfUkM0Q3J5cHRvSGVhZGVyKGJsb2IsIGxlbmd0aC8qOm51bWJlciovKSB7XG5cdHZhciBvID0ge307XG5cdHZhciB2ZXJzID0gby5FbmNyeXB0aW9uVmVyc2lvbkluZm8gPSBwYXJzZV9DUllQVE9WZXJzaW9uKGJsb2IsIDQpOyBsZW5ndGggLT0gNDtcblx0aWYodmVycy5NaW5vciAhPSAyKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCBtaW5vciB2ZXJzaW9uIGNvZGU6ICcgKyB2ZXJzLk1pbm9yKTtcblx0aWYodmVycy5NYWpvciA+IDQgfHwgdmVycy5NYWpvciA8IDIpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkIG1ham9yIHZlcnNpb24gY29kZTogJyArIHZlcnMuTWFqb3IpO1xuXHRvLkZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyBsZW5ndGggLT0gNDtcblx0dmFyIHN6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyBsZW5ndGggLT0gNDtcblx0by5FbmNyeXB0aW9uSGVhZGVyID0gcGFyc2VfRW5jcnlwdGlvbkhlYWRlcihibG9iLCBzeik7IGxlbmd0aCAtPSBzejtcblx0by5FbmNyeXB0aW9uVmVyaWZpZXIgPSBwYXJzZV9FbmNyeXB0aW9uVmVyaWZpZXIoYmxvYiwgbGVuZ3RoKTtcblx0cmV0dXJuIG87XG59XG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuNi4xIFJDNCBFbmNyeXB0aW9uIEhlYWRlciAqL1xuZnVuY3Rpb24gcGFyc2VfUkM0SGVhZGVyKGJsb2IvKjo6LCBsZW5ndGgqLykge1xuXHR2YXIgbyA9IHt9O1xuXHR2YXIgdmVycyA9IG8uRW5jcnlwdGlvblZlcnNpb25JbmZvID0gcGFyc2VfQ1JZUFRPVmVyc2lvbihibG9iLCA0KTtcblx0aWYodmVycy5NYWpvciAhPSAxIHx8IHZlcnMuTWlub3IgIT0gMSkgdGhyb3cgJ3VucmVjb2duaXplZCB2ZXJzaW9uIGNvZGUgJyArIHZlcnMuTWFqb3IgKyAnIDogJyArIHZlcnMuTWlub3I7XG5cdG8uU2FsdCA9IGJsb2IucmVhZF9zaGlmdCgxNik7XG5cdG8uRW5jcnlwdGVkVmVyaWZpZXIgPSBibG9iLnJlYWRfc2hpZnQoMTYpO1xuXHRvLkVuY3J5cHRlZFZlcmlmaWVySGFzaCA9IGJsb2IucmVhZF9zaGlmdCgxNik7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuNy4xIEJpbmFyeSBEb2N1bWVudCBQYXNzd29yZCBWZXJpZmllciBEZXJpdmF0aW9uICovXG5mdW5jdGlvbiBjcnlwdG9fQ3JlYXRlUGFzc3dvcmRWZXJpZmllcl9NZXRob2QxKFBhc3N3b3JkLyo6c3RyaW5nKi8pIHtcblx0dmFyIFZlcmlmaWVyID0gMHgwMDAwLCBQYXNzd29yZEFycmF5O1xuXHR2YXIgUGFzc3dvcmREZWNvZGVkID0gX0pTMkFOU0koUGFzc3dvcmQpO1xuXHR2YXIgbGVuID0gUGFzc3dvcmREZWNvZGVkLmxlbmd0aCArIDEsIGksIFBhc3N3b3JkQnl0ZTtcblx0dmFyIEludGVybWVkaWF0ZTEsIEludGVybWVkaWF0ZTIsIEludGVybWVkaWF0ZTM7XG5cdFBhc3N3b3JkQXJyYXkgPSBuZXdfcmF3X2J1ZihsZW4pO1xuXHRQYXNzd29yZEFycmF5WzBdID0gUGFzc3dvcmREZWNvZGVkLmxlbmd0aDtcblx0Zm9yKGkgPSAxOyBpICE9IGxlbjsgKytpKSBQYXNzd29yZEFycmF5W2ldID0gUGFzc3dvcmREZWNvZGVkW2ktMV07XG5cdGZvcihpID0gbGVuLTE7IGkgPj0gMDsgLS1pKSB7XG5cdFx0UGFzc3dvcmRCeXRlID0gUGFzc3dvcmRBcnJheVtpXTtcblx0XHRJbnRlcm1lZGlhdGUxID0gKChWZXJpZmllciAmIDB4NDAwMCkgPT09IDB4MDAwMCkgPyAwIDogMTtcblx0XHRJbnRlcm1lZGlhdGUyID0gKFZlcmlmaWVyIDw8IDEpICYgMHg3RkZGO1xuXHRcdEludGVybWVkaWF0ZTMgPSBJbnRlcm1lZGlhdGUxIHwgSW50ZXJtZWRpYXRlMjtcblx0XHRWZXJpZmllciA9IEludGVybWVkaWF0ZTMgXiBQYXNzd29yZEJ5dGU7XG5cdH1cblx0cmV0dXJuIFZlcmlmaWVyIF4gMHhDRTRCO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuNy4yIEJpbmFyeSBEb2N1bWVudCBYT1IgQXJyYXkgSW5pdGlhbGl6YXRpb24gKi9cbnZhciBjcnlwdG9fQ3JlYXRlWG9yQXJyYXlfTWV0aG9kMSA9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24oKSB7XG5cdHZhciBQYWRBcnJheSA9IFsweEJCLCAweEZGLCAweEZGLCAweEJBLCAweEZGLCAweEZGLCAweEI5LCAweDgwLCAweDAwLCAweEJFLCAweDBGLCAweDAwLCAweEJGLCAweDBGLCAweDAwXTtcblx0dmFyIEluaXRpYWxDb2RlID0gWzB4RTFGMCwgMHgxRDBGLCAweENDOUMsIDB4ODRDMCwgMHgxMTBDLCAweDBFMTAsIDB4RjFDRSwgMHgzMTNFLCAweDE4NzIsIDB4RTEzOSwgMHhENDBGLCAweDg0RjksIDB4MjgwQywgMHhBOTZBLCAweDRFQzNdO1xuXHR2YXIgWG9yTWF0cml4ID0gWzB4QUVGQywgMHg0REQ5LCAweDlCQjIsIDB4Mjc0NSwgMHg0RThBLCAweDlEMTQsIDB4MkEwOSwgMHg3QjYxLCAweEY2QzIsIDB4RkRBNSwgMHhFQjZCLCAweEM2RjcsIDB4OURDRiwgMHgyQkJGLCAweDQ1NjMsIDB4OEFDNiwgMHgwNUFELCAweDBCNUEsIDB4MTZCNCwgMHgyRDY4LCAweDVBRDAsIDB4MDM3NSwgMHgwNkVBLCAweDBERDQsIDB4MUJBOCwgMHgzNzUwLCAweDZFQTAsIDB4REQ0MCwgMHhEODQ5LCAweEEwQjMsIDB4NTE0NywgMHhBMjhFLCAweDU1M0QsIDB4QUE3QSwgMHg0NEQ1LCAweDZGNDUsIDB4REU4QSwgMHhBRDM1LCAweDRBNEIsIDB4OTQ5NiwgMHgzOTBELCAweDcyMUEsIDB4RUIyMywgMHhDNjY3LCAweDlDRUYsIDB4MjlGRiwgMHg1M0ZFLCAweEE3RkMsIDB4NUZEOSwgMHg0N0QzLCAweDhGQTYsIDB4MEY2RCwgMHgxRURBLCAweDNEQjQsIDB4N0I2OCwgMHhGNkQwLCAweEI4NjEsIDB4NjBFMywgMHhDMUM2LCAweDkzQUQsIDB4Mzc3QiwgMHg2RUY2LCAweERERUMsIDB4NDVBMCwgMHg4QjQwLCAweDA2QTEsIDB4MEQ0MiwgMHgxQTg0LCAweDM1MDgsIDB4NkExMCwgMHhBQTUxLCAweDQ0ODMsIDB4ODkwNiwgMHgwMjJELCAweDA0NUEsIDB4MDhCNCwgMHgxMTY4LCAweDc2QjQsIDB4RUQ2OCwgMHhDQUYxLCAweDg1QzMsIDB4MUJBNywgMHgzNzRFLCAweDZFOUMsIDB4MzczMCwgMHg2RTYwLCAweERDQzAsIDB4QTlBMSwgMHg0MzYzLCAweDg2QzYsIDB4MURBRCwgMHgzMzMxLCAweDY2NjIsIDB4Q0NDNCwgMHg4OUE5LCAweDAzNzMsIDB4MDZFNiwgMHgwRENDLCAweDEwMjEsIDB4MjA0MiwgMHg0MDg0LCAweDgxMDgsIDB4MTIzMSwgMHgyNDYyLCAweDQ4QzRdO1xuXHR2YXIgUm9yID0gZnVuY3Rpb24oQnl0ZSkgeyByZXR1cm4gKChCeXRlLzIpIHwgKEJ5dGUqMTI4KSkgJiAweEZGOyB9O1xuXHR2YXIgWG9yUm9yID0gZnVuY3Rpb24oYnl0ZTEsIGJ5dGUyKSB7IHJldHVybiBSb3IoYnl0ZTEgXiBieXRlMik7IH07XG5cdHZhciBDcmVhdGVYb3JLZXlfTWV0aG9kMSA9IGZ1bmN0aW9uKFBhc3N3b3JkKSB7XG5cdFx0dmFyIFhvcktleSA9IEluaXRpYWxDb2RlW1Bhc3N3b3JkLmxlbmd0aCAtIDFdO1xuXHRcdHZhciBDdXJyZW50RWxlbWVudCA9IDB4Njg7XG5cdFx0Zm9yKHZhciBpID0gUGFzc3dvcmQubGVuZ3RoLTE7IGkgPj0gMDsgLS1pKSB7XG5cdFx0XHR2YXIgQ2hhciA9IFBhc3N3b3JkW2ldO1xuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiAhPSA3OyArK2opIHtcblx0XHRcdFx0aWYoQ2hhciAmIDB4NDApIFhvcktleSBePSBYb3JNYXRyaXhbQ3VycmVudEVsZW1lbnRdO1xuXHRcdFx0XHRDaGFyICo9IDI7IC0tQ3VycmVudEVsZW1lbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBYb3JLZXk7XG5cdH07XG5cdHJldHVybiBmdW5jdGlvbihwYXNzd29yZC8qOnN0cmluZyovKSB7XG5cdFx0dmFyIFBhc3N3b3JkID0gX0pTMkFOU0kocGFzc3dvcmQpO1xuXHRcdHZhciBYb3JLZXkgPSBDcmVhdGVYb3JLZXlfTWV0aG9kMShQYXNzd29yZCk7XG5cdFx0dmFyIEluZGV4ID0gUGFzc3dvcmQubGVuZ3RoO1xuXHRcdHZhciBPYmZ1c2NhdGlvbkFycmF5ID0gbmV3X3Jhd19idWYoMTYpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgIT0gMTY7ICsraSkgT2JmdXNjYXRpb25BcnJheVtpXSA9IDB4MDA7XG5cdFx0dmFyIFRlbXAsIFBhc3N3b3JkTGFzdENoYXIsIFBhZEluZGV4O1xuXHRcdGlmKChJbmRleCAmIDEpID09PSAxKSB7XG5cdFx0XHRUZW1wID0gWG9yS2V5ID4+IDg7XG5cdFx0XHRPYmZ1c2NhdGlvbkFycmF5W0luZGV4XSA9IFhvclJvcihQYWRBcnJheVswXSwgVGVtcCk7XG5cdFx0XHQtLUluZGV4O1xuXHRcdFx0VGVtcCA9IFhvcktleSAmIDB4RkY7XG5cdFx0XHRQYXNzd29yZExhc3RDaGFyID0gUGFzc3dvcmRbUGFzc3dvcmQubGVuZ3RoIC0gMV07XG5cdFx0XHRPYmZ1c2NhdGlvbkFycmF5W0luZGV4XSA9IFhvclJvcihQYXNzd29yZExhc3RDaGFyLCBUZW1wKTtcblx0XHR9XG5cdFx0d2hpbGUoSW5kZXggPiAwKSB7XG5cdFx0XHQtLUluZGV4O1xuXHRcdFx0VGVtcCA9IFhvcktleSA+PiA4O1xuXHRcdFx0T2JmdXNjYXRpb25BcnJheVtJbmRleF0gPSBYb3JSb3IoUGFzc3dvcmRbSW5kZXhdLCBUZW1wKTtcblx0XHRcdC0tSW5kZXg7XG5cdFx0XHRUZW1wID0gWG9yS2V5ICYgMHhGRjtcblx0XHRcdE9iZnVzY2F0aW9uQXJyYXlbSW5kZXhdID0gWG9yUm9yKFBhc3N3b3JkW0luZGV4XSwgVGVtcCk7XG5cdFx0fVxuXHRcdEluZGV4ID0gMTU7XG5cdFx0UGFkSW5kZXggPSAxNSAtIFBhc3N3b3JkLmxlbmd0aDtcblx0XHR3aGlsZShQYWRJbmRleCA+IDApIHtcblx0XHRcdFRlbXAgPSBYb3JLZXkgPj4gODtcblx0XHRcdE9iZnVzY2F0aW9uQXJyYXlbSW5kZXhdID0gWG9yUm9yKFBhZEFycmF5W1BhZEluZGV4XSwgVGVtcCk7XG5cdFx0XHQtLUluZGV4O1xuXHRcdFx0LS1QYWRJbmRleDtcblx0XHRcdFRlbXAgPSBYb3JLZXkgJiAweEZGO1xuXHRcdFx0T2JmdXNjYXRpb25BcnJheVtJbmRleF0gPSBYb3JSb3IoUGFzc3dvcmRbSW5kZXhdLCBUZW1wKTtcblx0XHRcdC0tSW5kZXg7XG5cdFx0XHQtLVBhZEluZGV4O1xuXHRcdH1cblx0XHRyZXR1cm4gT2JmdXNjYXRpb25BcnJheTtcblx0fTtcbn0pKCk7XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMy43LjMgQmluYXJ5IERvY3VtZW50IFhPUiBEYXRhIFRyYW5zZm9ybWF0aW9uIE1ldGhvZCAxICovXG52YXIgY3J5cHRvX0RlY3J5cHREYXRhX01ldGhvZDEgPSBmdW5jdGlvbihwYXNzd29yZC8qOnN0cmluZyovLCBEYXRhLCBYb3JBcnJheUluZGV4LCBYb3JBcnJheSwgTykge1xuXHQvKiBJZiBYb3JBcnJheSBpcyBzZXQsIHVzZSBpdDsgaWYgTyBpcyBub3Qgc2V0LCBtYWtlIGNoYW5nZXMgaW4tcGxhY2UgKi9cblx0aWYoIU8pIE8gPSBEYXRhO1xuXHRpZighWG9yQXJyYXkpIFhvckFycmF5ID0gY3J5cHRvX0NyZWF0ZVhvckFycmF5X01ldGhvZDEocGFzc3dvcmQpO1xuXHR2YXIgSW5kZXgsIFZhbHVlO1xuXHRmb3IoSW5kZXggPSAwOyBJbmRleCAhPSBEYXRhLmxlbmd0aDsgKytJbmRleCkge1xuXHRcdFZhbHVlID0gRGF0YVtJbmRleF07XG5cdFx0VmFsdWUgXj0gWG9yQXJyYXlbWG9yQXJyYXlJbmRleF07XG5cdFx0VmFsdWUgPSAoKFZhbHVlPj41KSB8IChWYWx1ZTw8MykpICYgMHhGRjtcblx0XHRPW0luZGV4XSA9IFZhbHVlO1xuXHRcdCsrWG9yQXJyYXlJbmRleDtcblx0fVxuXHRyZXR1cm4gW08sIFhvckFycmF5SW5kZXgsIFhvckFycmF5XTtcbn07XG5cbnZhciBjcnlwdG9fTWFrZVhvckRlY3J5cHRvciA9IGZ1bmN0aW9uKHBhc3N3b3JkLyo6c3RyaW5nKi8pIHtcblx0dmFyIFhvckFycmF5SW5kZXggPSAwLCBYb3JBcnJheSA9IGNyeXB0b19DcmVhdGVYb3JBcnJheV9NZXRob2QxKHBhc3N3b3JkKTtcblx0cmV0dXJuIGZ1bmN0aW9uKERhdGEpIHtcblx0XHR2YXIgTyA9IGNyeXB0b19EZWNyeXB0RGF0YV9NZXRob2QxKFwiXCIsIERhdGEsIFhvckFycmF5SW5kZXgsIFhvckFycmF5KTtcblx0XHRYb3JBcnJheUluZGV4ID0gT1sxXTtcblx0XHRyZXR1cm4gT1swXTtcblx0fTtcbn07XG5cbi8qIDIuNS4zNDMgKi9cbmZ1bmN0aW9uIHBhcnNlX1hPUk9iZnVzY2F0aW9uKGJsb2IsIGxlbmd0aCwgb3B0cywgb3V0KSB7XG5cdHZhciBvID0gKHsga2V5OiBwYXJzZXVpbnQxNihibG9iKSwgdmVyaWZpY2F0aW9uQnl0ZXM6IHBhcnNldWludDE2KGJsb2IpIH0vKjphbnkqLyk7XG5cdGlmKG9wdHMucGFzc3dvcmQpIG8udmVyaWZpZXIgPSBjcnlwdG9fQ3JlYXRlUGFzc3dvcmRWZXJpZmllcl9NZXRob2QxKG9wdHMucGFzc3dvcmQpO1xuXHRvdXQudmFsaWQgPSBvLnZlcmlmaWNhdGlvbkJ5dGVzID09PSBvLnZlcmlmaWVyO1xuXHRpZihvdXQudmFsaWQpIG91dC5pbnNpdHUgPSBjcnlwdG9fTWFrZVhvckRlY3J5cHRvcihvcHRzLnBhc3N3b3JkKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIDIuNC4xMTcgKi9cbmZ1bmN0aW9uIHBhcnNlX0ZpbGVQYXNzSGVhZGVyKGJsb2IsIGxlbmd0aC8qOm51bWJlciovLCBvbykge1xuXHR2YXIgbyA9IG9vIHx8IHt9OyBvLkluZm8gPSBibG9iLnJlYWRfc2hpZnQoMik7IGJsb2IubCAtPSAyO1xuXHRpZihvLkluZm8gPT09IDEpIG8uRGF0YSA9IHBhcnNlX1JDNEhlYWRlcihibG9iLCBsZW5ndGgpO1xuXHRlbHNlIG8uRGF0YSA9IHBhcnNlX1JDNENyeXB0b0hlYWRlcihibG9iLCBsZW5ndGgpO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHBhcnNlX0ZpbGVQYXNzKGJsb2IsIGxlbmd0aC8qOm51bWJlciovLCBvcHRzKSB7XG5cdHZhciBvID0gKHsgVHlwZTogb3B0cy5iaWZmID49IDggPyBibG9iLnJlYWRfc2hpZnQoMikgOiAwIH0vKjphbnkqLyk7IC8qIHdFbmNyeXB0aW9uVHlwZSAqL1xuXHRpZihvLlR5cGUpIHBhcnNlX0ZpbGVQYXNzSGVhZGVyKGJsb2IsIGxlbmd0aC0yLCBvKTtcblx0ZWxzZSBwYXJzZV9YT1JPYmZ1c2NhdGlvbihibG9iLCBvcHRzLmJpZmYgPj0gOCA/IGxlbmd0aCA6IGxlbmd0aCAtIDIsIG9wdHMsIG8pO1xuXHRyZXR1cm4gbztcbn1cblxuXG52YXIgUlRGID0gLyojX19QVVJFX18qLyhmdW5jdGlvbigpIHtcblx0ZnVuY3Rpb24gcnRmX3RvX3NoZWV0KGQvKjpSYXdEYXRhKi8sIG9wdHMpLyo6V29ya3NoZWV0Ki8ge1xuXHRcdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jhc2U2NCc6IHJldHVybiBydGZfdG9fc2hlZXRfc3RyKEJhc2U2NF9kZWNvZGUoZCksIG9wdHMpO1xuXHRcdFx0Y2FzZSAnYmluYXJ5JzogcmV0dXJuIHJ0Zl90b19zaGVldF9zdHIoZCwgb3B0cyk7XG5cdFx0XHRjYXNlICdidWZmZXInOiByZXR1cm4gcnRmX3RvX3NoZWV0X3N0cihoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihkKSA/IGQudG9TdHJpbmcoJ2JpbmFyeScpIDogYTJzKGQpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2FycmF5JzogIHJldHVybiBydGZfdG9fc2hlZXRfc3RyKGNjMnN0cihkKSwgb3B0cyk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcblx0fVxuXG5cdC8qIFRPRE86IHRoaXMgaXMgYSBzdHViICovXG5cdGZ1bmN0aW9uIHJ0Zl90b19zaGVldF9zdHIoc3RyLyo6c3RyaW5nKi8sIG9wdHMpLyo6V29ya3NoZWV0Ki8ge1xuXHRcdHZhciBvID0gb3B0cyB8fCB7fTtcblx0XHR2YXIgd3MvKjpXb3Jrc2hlZXQqLyA9IG8uZGVuc2UgPyAoW10vKjphbnkqLykgOiAoe30vKjphbnkqLyk7XG5cblx0XHR2YXIgcm93cyA9IHN0ci5tYXRjaCgvXFxcXHRyb3dkLio/XFxcXHJvd1xcYi9nKTtcblx0XHRpZighcm93cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcIlJURiBtaXNzaW5nIHRhYmxlXCIpO1xuXHRcdHZhciByYW5nZS8qOlJhbmdlKi8gPSAoe3M6IHtjOjAsIHI6MH0sIGU6IHtjOjAsIHI6cm93cy5sZW5ndGggLSAxfX0vKjphbnkqLyk7XG5cdFx0cm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvd3RmLCBSKSB7XG5cdFx0XHRpZihBcnJheS5pc0FycmF5KHdzKSkgd3NbUl0gPSBbXTtcblx0XHRcdHZhciBydGZyZSA9IC9cXFxcXFx3K1xcYi9nO1xuXHRcdFx0dmFyIGxhc3RfaW5kZXggPSAwO1xuXHRcdFx0dmFyIHJlcztcblx0XHRcdHZhciBDID0gLTE7XG5cdFx0XHR3aGlsZSgocmVzID0gcnRmcmUuZXhlYyhyb3d0ZikpKSB7XG5cdFx0XHRcdHN3aXRjaChyZXNbMF0pIHtcblx0XHRcdFx0XHRjYXNlIFwiXFxcXGNlbGxcIjpcblx0XHRcdFx0XHRcdHZhciBkYXRhID0gcm93dGYuc2xpY2UobGFzdF9pbmRleCwgcnRmcmUubGFzdEluZGV4IC0gcmVzWzBdLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRpZihkYXRhWzBdID09IFwiIFwiKSBkYXRhID0gZGF0YS5zbGljZSgxKTtcblx0XHRcdFx0XHRcdCsrQztcblx0XHRcdFx0XHRcdGlmKGRhdGEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IHZhbHVlIHBhcnNpbmcsIGluY2x1ZGluZyBjb2RlcGFnZSBhZGp1c3RtZW50c1xuXHRcdFx0XHRcdFx0XHR2YXIgY2VsbCA9IHt2OiBkYXRhLCB0Olwic1wifTtcblx0XHRcdFx0XHRcdFx0aWYoQXJyYXkuaXNBcnJheSh3cykpIHdzW1JdW0NdID0gY2VsbDtcblx0XHRcdFx0XHRcdFx0ZWxzZSB3c1tlbmNvZGVfY2VsbCh7cjpSLCBjOkN9KV0gPSBjZWxsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGFzdF9pbmRleCA9IHJ0ZnJlLmxhc3RJbmRleDtcblx0XHRcdH1cblx0XHRcdGlmKEMgPiByYW5nZS5lLmMpIHJhbmdlLmUuYyA9IEM7XG5cdFx0fSk7XG5cdFx0d3NbJyFyZWYnXSA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdFx0cmV0dXJuIHdzO1xuXHR9XG5cblx0ZnVuY3Rpb24gcnRmX3RvX3dvcmtib29rKGQvKjpSYXdEYXRhKi8sIG9wdHMpLyo6V29ya2Jvb2sqLyB7IHJldHVybiBzaGVldF90b193b3JrYm9vayhydGZfdG9fc2hlZXQoZCwgb3B0cyksIG9wdHMpOyB9XG5cblx0LyogVE9ETzogdGhpcyBpcyBhIHN0dWIgKi9cblx0ZnVuY3Rpb24gc2hlZXRfdG9fcnRmKHdzLyo6V29ya3NoZWV0Ki8vKjo6LCBvcHRzKi8pLyo6c3RyaW5nKi8ge1xuXHRcdHZhciBvID0gW1wie1xcXFxydGYxXFxcXGFuc2lcIl07XG5cdFx0dmFyIHIgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKSwgY2VsbC8qOkNlbGwqLztcblx0XHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0XHRmb3IodmFyIFIgPSByLnMucjsgUiA8PSByLmUucjsgKytSKSB7XG5cdFx0XHRvLnB1c2goXCJcXFxcdHJvd2RcXFxcdHJhdXRvZml0MVwiKTtcblx0XHRcdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIG8ucHVzaChcIlxcXFxjZWxseFwiICsgKEMrMSkpO1xuXHRcdFx0by5wdXNoKFwiXFxcXHBhcmRcXFxcaW50YmxcIik7XG5cdFx0XHRmb3IoQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRcdFx0dmFyIGNvb3JkID0gZW5jb2RlX2NlbGwoe3I6UixjOkN9KTtcblx0XHRcdFx0Y2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ106IHdzW2Nvb3JkXTtcblx0XHRcdFx0aWYoIWNlbGwgfHwgY2VsbC52ID09IG51bGwgJiYgKCFjZWxsLmYgfHwgY2VsbC5GKSkgY29udGludWU7XG5cdFx0XHRcdG8ucHVzaChcIiBcIiArIChjZWxsLncgfHwgKGZvcm1hdF9jZWxsKGNlbGwpLCBjZWxsLncpKSk7XG5cdFx0XHRcdG8ucHVzaChcIlxcXFxjZWxsXCIpO1xuXHRcdFx0fVxuXHRcdFx0by5wdXNoKFwiXFxcXHBhcmRcXFxcaW50YmxcXFxccm93XCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gby5qb2luKFwiXCIpICsgXCJ9XCI7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBydGZfdG9fd29ya2Jvb2ssXG5cdFx0dG9fc2hlZXQ6IHJ0Zl90b19zaGVldCxcblx0XHRmcm9tX3NoZWV0OiBzaGVldF90b19ydGZcblx0fTtcbn0pKCk7XG5mdW5jdGlvbiBoZXgyUkdCKGgpIHtcblx0dmFyIG8gPSBoLnNsaWNlKGhbMF09PT1cIiNcIj8xOjApLnNsaWNlKDAsNik7XG5cdHJldHVybiBbcGFyc2VJbnQoby5zbGljZSgwLDIpLDE2KSxwYXJzZUludChvLnNsaWNlKDIsNCksMTYpLHBhcnNlSW50KG8uc2xpY2UoNCw2KSwxNildO1xufVxuZnVuY3Rpb24gcmdiMkhleChyZ2IpIHtcblx0Zm9yKHZhciBpPTAsbz0xOyBpIT0zOyArK2kpIG8gPSBvKjI1NiArIChyZ2JbaV0+MjU1PzI1NTpyZ2JbaV08MD8wOnJnYltpXSk7XG5cdHJldHVybiBvLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpO1xufVxuXG5mdW5jdGlvbiByZ2IySFNMKHJnYikge1xuXHR2YXIgUiA9IHJnYlswXS8yNTUsIEcgPSByZ2JbMV0vMjU1LCBCPXJnYlsyXS8yNTU7XG5cdHZhciBNID0gTWF0aC5tYXgoUiwgRywgQiksIG0gPSBNYXRoLm1pbihSLCBHLCBCKSwgQyA9IE0gLSBtO1xuXHRpZihDID09PSAwKSByZXR1cm4gWzAsIDAsIFJdO1xuXG5cdHZhciBINiA9IDAsIFMgPSAwLCBMMiA9IChNICsgbSk7XG5cdFMgPSBDIC8gKEwyID4gMSA/IDIgLSBMMiA6IEwyKTtcblx0c3dpdGNoKE0pe1xuXHRcdGNhc2UgUjogSDYgPSAoKEcgLSBCKSAvIEMgKyA2KSU2OyBicmVhaztcblx0XHRjYXNlIEc6IEg2ID0gKChCIC0gUikgLyBDICsgMik7IGJyZWFrO1xuXHRcdGNhc2UgQjogSDYgPSAoKFIgLSBHKSAvIEMgKyA0KTsgYnJlYWs7XG5cdH1cblx0cmV0dXJuIFtINiAvIDYsIFMsIEwyIC8gMl07XG59XG5cbmZ1bmN0aW9uIGhzbDJSR0IoaHNsKXtcblx0dmFyIEggPSBoc2xbMF0sIFMgPSBoc2xbMV0sIEwgPSBoc2xbMl07XG5cdHZhciBDID0gUyAqIDIgKiAoTCA8IDAuNSA/IEwgOiAxIC0gTCksIG0gPSBMIC0gQy8yO1xuXHR2YXIgcmdiID0gW20sbSxtXSwgaDYgPSA2Kkg7XG5cblx0dmFyIFg7XG5cdGlmKFMgIT09IDApIHN3aXRjaChoNnwwKSB7XG5cdFx0Y2FzZSAwOiBjYXNlIDY6IFggPSBDICogaDY7IHJnYlswXSArPSBDOyByZ2JbMV0gKz0gWDsgYnJlYWs7XG5cdFx0Y2FzZSAxOiBYID0gQyAqICgyIC0gaDYpOyAgIHJnYlswXSArPSBYOyByZ2JbMV0gKz0gQzsgYnJlYWs7XG5cdFx0Y2FzZSAyOiBYID0gQyAqIChoNiAtIDIpOyAgIHJnYlsxXSArPSBDOyByZ2JbMl0gKz0gWDsgYnJlYWs7XG5cdFx0Y2FzZSAzOiBYID0gQyAqICg0IC0gaDYpOyAgIHJnYlsxXSArPSBYOyByZ2JbMl0gKz0gQzsgYnJlYWs7XG5cdFx0Y2FzZSA0OiBYID0gQyAqIChoNiAtIDQpOyAgIHJnYlsyXSArPSBDOyByZ2JbMF0gKz0gWDsgYnJlYWs7XG5cdFx0Y2FzZSA1OiBYID0gQyAqICg2IC0gaDYpOyAgIHJnYlsyXSArPSBYOyByZ2JbMF0gKz0gQzsgYnJlYWs7XG5cdH1cblx0Zm9yKHZhciBpID0gMDsgaSAhPSAzOyArK2kpIHJnYltpXSA9IE1hdGgucm91bmQocmdiW2ldKjI1NSk7XG5cdHJldHVybiByZ2I7XG59XG5cbi8qIDE4LjguMyBiZ0NvbG9yIHRpbnQgYWxnb3JpdGhtICovXG5mdW5jdGlvbiByZ2JfdGludChoZXgsIHRpbnQpIHtcblx0aWYodGludCA9PT0gMCkgcmV0dXJuIGhleDtcblx0dmFyIGhzbCA9IHJnYjJIU0woaGV4MlJHQihoZXgpKTtcblx0aWYgKHRpbnQgPCAwKSBoc2xbMl0gPSBoc2xbMl0gKiAoMSArIHRpbnQpO1xuXHRlbHNlIGhzbFsyXSA9IDEgLSAoMSAtIGhzbFsyXSkgKiAoMSAtIHRpbnQpO1xuXHRyZXR1cm4gcmdiMkhleChoc2wyUkdCKGhzbCkpO1xufVxuXG4vKiAxOC4zLjEuMTMgd2lkdGggY2FsY3VsYXRpb25zICovXG4vKiBbTVMtT0kyOTUwMF0gMi4xLjU5NSBDb2x1bW4gV2lkdGggJiBGb3JtYXR0aW5nICovXG52YXIgREVGX01EVyA9IDYsIE1BWF9NRFcgPSAxNSwgTUlOX01EVyA9IDEsIE1EVyA9IERFRl9NRFc7XG5mdW5jdGlvbiB3aWR0aDJweCh3aWR0aCkgeyByZXR1cm4gTWF0aC5mbG9vcigoIHdpZHRoICsgKE1hdGgucm91bmQoMTI4L01EVykpLzI1NiApKiBNRFcgKTsgfVxuZnVuY3Rpb24gcHgyY2hhcihweCkgeyByZXR1cm4gKE1hdGguZmxvb3IoKHB4IC0gNSkvTURXICogMTAwICsgMC41KSkvMTAwOyB9XG5mdW5jdGlvbiBjaGFyMndpZHRoKGNocikgeyByZXR1cm4gKE1hdGgucm91bmQoKGNociAqIE1EVyArIDUpL01EVyoyNTYpKS8yNTY7IH1cbi8vZnVuY3Rpb24gcHgyY2hhcl8ocHgpIHsgcmV0dXJuICgoKHB4IC0gNSkvTURXICogMTAwICsgMC41KSkvMTAwOyB9XG4vL2Z1bmN0aW9uIGNoYXIyd2lkdGhfKGNocikgeyByZXR1cm4gKCgoY2hyICogTURXICsgNSkvTURXKjI1NikpLzI1NjsgfVxuZnVuY3Rpb24gY3ljbGVfd2lkdGgoY29sbHcpIHsgcmV0dXJuIGNoYXIyd2lkdGgocHgyY2hhcih3aWR0aDJweChjb2xsdykpKTsgfVxuLyogWExTWC9YTFNCL1hMUyBzcGVjaWZ5IHdpZHRoIGluIHVuaXRzIG9mIE1EVyAqL1xuZnVuY3Rpb24gZmluZF9tZHdfY29sdyhjb2xsdykge1xuXHR2YXIgZGVsdGEgPSBNYXRoLmFicyhjb2xsdyAtIGN5Y2xlX3dpZHRoKGNvbGx3KSksIF9NRFcgPSBNRFc7XG5cdGlmKGRlbHRhID4gMC4wMDUpIGZvcihNRFc9TUlOX01EVzsgTURXPE1BWF9NRFc7ICsrTURXKSBpZihNYXRoLmFicyhjb2xsdyAtIGN5Y2xlX3dpZHRoKGNvbGx3KSkgPD0gZGVsdGEpIHsgZGVsdGEgPSBNYXRoLmFicyhjb2xsdyAtIGN5Y2xlX3dpZHRoKGNvbGx3KSk7IF9NRFcgPSBNRFc7IH1cblx0TURXID0gX01EVztcbn1cbi8qIFhMTUwgc3BlY2lmaWVzIHdpZHRoIGluIHRlcm1zIG9mIHBpeGVscyAqL1xuLypmdW5jdGlvbiBmaW5kX21kd193cHgod3B4KSB7XG5cdHZhciBkZWx0YSA9IEluZmluaXR5LCBndWVzcyA9IDAsIF9NRFcgPSBNSU5fTURXO1xuXHRmb3IoTURXPU1JTl9NRFc7IE1EVzxNQVhfTURXOyArK01EVykge1xuXHRcdGd1ZXNzID0gY2hhcjJ3aWR0aF8ocHgyY2hhcl8od3B4KSkqMjU2O1xuXHRcdGd1ZXNzID0gKGd1ZXNzKSAlIDE7XG5cdFx0aWYoZ3Vlc3MgPiAwLjUpIGd1ZXNzLS07XG5cdFx0aWYoTWF0aC5hYnMoZ3Vlc3MpIDwgZGVsdGEpIHsgZGVsdGEgPSBNYXRoLmFicyhndWVzcyk7IF9NRFcgPSBNRFc7IH1cblx0fVxuXHRNRFcgPSBfTURXO1xufSovXG5cbmZ1bmN0aW9uIHByb2Nlc3NfY29sKGNvbGwvKjpDb2xJbmZvKi8pIHtcblx0aWYoY29sbC53aWR0aCkge1xuXHRcdGNvbGwud3B4ID0gd2lkdGgycHgoY29sbC53aWR0aCk7XG5cdFx0Y29sbC53Y2ggPSBweDJjaGFyKGNvbGwud3B4KTtcblx0XHRjb2xsLk1EVyA9IE1EVztcblx0fSBlbHNlIGlmKGNvbGwud3B4KSB7XG5cdFx0Y29sbC53Y2ggPSBweDJjaGFyKGNvbGwud3B4KTtcblx0XHRjb2xsLndpZHRoID0gY2hhcjJ3aWR0aChjb2xsLndjaCk7XG5cdFx0Y29sbC5NRFcgPSBNRFc7XG5cdH0gZWxzZSBpZih0eXBlb2YgY29sbC53Y2ggPT0gJ251bWJlcicpIHtcblx0XHRjb2xsLndpZHRoID0gY2hhcjJ3aWR0aChjb2xsLndjaCk7XG5cdFx0Y29sbC53cHggPSB3aWR0aDJweChjb2xsLndpZHRoKTtcblx0XHRjb2xsLk1EVyA9IE1EVztcblx0fVxuXHRpZihjb2xsLmN1c3RvbVdpZHRoKSBkZWxldGUgY29sbC5jdXN0b21XaWR0aDtcbn1cblxudmFyIERFRl9QUEkgPSA5NiwgUFBJID0gREVGX1BQSTtcbmZ1bmN0aW9uIHB4MnB0KHB4KSB7IHJldHVybiBweCAqIDk2IC8gUFBJOyB9XG5mdW5jdGlvbiBwdDJweChwdCkgeyByZXR1cm4gcHQgKiBQUEkgLyA5NjsgfVxuXG4vKiBbTVMtRVhTUFhNTDNdIDIuNC41NCBTVF9lbm1QYXR0ZXJuICovXG52YXIgWExNTFBhdHRlcm5UeXBlTWFwID0ge1xuXHRcIk5vbmVcIjogXCJub25lXCIsXG5cdFwiU29saWRcIjogXCJzb2xpZFwiLFxuXHRcIkdyYXk1MFwiOiBcIm1lZGl1bUdyYXlcIixcblx0XCJHcmF5NzVcIjogXCJkYXJrR3JheVwiLFxuXHRcIkdyYXkyNVwiOiBcImxpZ2h0R3JheVwiLFxuXHRcIkhvcnpTdHJpcGVcIjogXCJkYXJrSG9yaXpvbnRhbFwiLFxuXHRcIlZlcnRTdHJpcGVcIjogXCJkYXJrVmVydGljYWxcIixcblx0XCJSZXZlcnNlRGlhZ1N0cmlwZVwiOiBcImRhcmtEb3duXCIsXG5cdFwiRGlhZ1N0cmlwZVwiOiBcImRhcmtVcFwiLFxuXHRcIkRpYWdDcm9zc1wiOiBcImRhcmtHcmlkXCIsXG5cdFwiVGhpY2tEaWFnQ3Jvc3NcIjogXCJkYXJrVHJlbGxpc1wiLFxuXHRcIlRoaW5Ib3J6U3RyaXBlXCI6IFwibGlnaHRIb3Jpem9udGFsXCIsXG5cdFwiVGhpblZlcnRTdHJpcGVcIjogXCJsaWdodFZlcnRpY2FsXCIsXG5cdFwiVGhpblJldmVyc2VEaWFnU3RyaXBlXCI6IFwibGlnaHREb3duXCIsXG5cdFwiVGhpbkhvcnpDcm9zc1wiOiBcImxpZ2h0R3JpZFwiXG59O1xuXG4vKiAxOC44LjUgYm9yZGVycyBDVF9Cb3JkZXJzICovXG5mdW5jdGlvbiBwYXJzZV9ib3JkZXJzKHQsIHN0eWxlcywgdGhlbWVzLCBvcHRzKSB7XG5cdHN0eWxlcy5Cb3JkZXJzID0gW107XG5cdHZhciBib3JkZXIgPSB7fTtcblx0dmFyIHBhc3MgPSBmYWxzZTtcblx0KHRbMF0ubWF0Y2godGFncmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyh4KTtcblx0XHRzd2l0Y2goc3RyaXBfbnMoeVswXSkpIHtcblx0XHRcdGNhc2UgJzxib3JkZXJzJzogY2FzZSAnPGJvcmRlcnM+JzogY2FzZSAnPC9ib3JkZXJzPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjQgYm9yZGVyIENUX0JvcmRlciAqL1xuXHRcdFx0Y2FzZSAnPGJvcmRlcic6IGNhc2UgJzxib3JkZXI+JzogY2FzZSAnPGJvcmRlci8+Jzpcblx0XHRcdFx0Ym9yZGVyID0gLyo6OigqL3t9Lyo6OiA6YW55KSovO1xuXHRcdFx0XHRpZih5LmRpYWdvbmFsVXApIGJvcmRlci5kaWFnb25hbFVwID0gcGFyc2V4bWxib29sKHkuZGlhZ29uYWxVcCk7XG5cdFx0XHRcdGlmKHkuZGlhZ29uYWxEb3duKSBib3JkZXIuZGlhZ29uYWxEb3duID0gcGFyc2V4bWxib29sKHkuZGlhZ29uYWxEb3duKTtcblx0XHRcdFx0c3R5bGVzLkJvcmRlcnMucHVzaChib3JkZXIpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzwvYm9yZGVyPic6IGJyZWFrO1xuXG5cdFx0XHQvKiBub3RlOiBub3QgaW4gc3BlYywgYXBwZWFycyB0byBiZSBDVF9Cb3JkZXJQciAqL1xuXHRcdFx0Y2FzZSAnPGxlZnQvPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGxlZnQnOiBjYXNlICc8bGVmdD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvbGVmdD4nOiBicmVhaztcblxuXHRcdFx0Lyogbm90ZTogbm90IGluIHNwZWMsIGFwcGVhcnMgdG8gYmUgQ1RfQm9yZGVyUHIgKi9cblx0XHRcdGNhc2UgJzxyaWdodC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8cmlnaHQnOiBjYXNlICc8cmlnaHQ+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8L3JpZ2h0Pic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjQzIHRvcCBDVF9Cb3JkZXJQciAqL1xuXHRcdFx0Y2FzZSAnPHRvcC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8dG9wJzogY2FzZSAnPHRvcD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvdG9wPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjYgYm90dG9tIENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8Ym90dG9tLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxib3R0b20nOiBjYXNlICc8Ym90dG9tPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9ib3R0b20+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMTMgZGlhZ29uYWwgQ1RfQm9yZGVyUHIgKi9cblx0XHRcdGNhc2UgJzxkaWFnb25hbCc6IGNhc2UgJzxkaWFnb25hbD4nOiBjYXNlICc8ZGlhZ29uYWwvPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9kaWFnb25hbD4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4yNSBob3Jpem9udGFsIENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8aG9yaXpvbnRhbCc6IGNhc2UgJzxob3Jpem9udGFsPic6IGNhc2UgJzxob3Jpem9udGFsLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvaG9yaXpvbnRhbD4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC40NCB2ZXJ0aWNhbCBDVF9Cb3JkZXJQciAqL1xuXHRcdFx0Y2FzZSAnPHZlcnRpY2FsJzogY2FzZSAnPHZlcnRpY2FsPic6IGNhc2UgJzx2ZXJ0aWNhbC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8L3ZlcnRpY2FsPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjM3IHN0YXJ0IENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8c3RhcnQnOiBjYXNlICc8c3RhcnQ+JzogY2FzZSAnPHN0YXJ0Lz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvc3RhcnQ+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMTYgZW5kIENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8ZW5kJzogY2FzZSAnPGVuZD4nOiBjYXNlICc8ZW5kLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvZW5kPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44Lj8gY29sb3IgQ1RfQ29sb3IgKi9cblx0XHRcdGNhc2UgJzxjb2xvcic6IGNhc2UgJzxjb2xvcj4nOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzxjb2xvci8+JzogY2FzZSAnPC9jb2xvcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMCBleHRMc3QgQ1RfRXh0ZW5zaW9uTGlzdCA/ICovXG5cdFx0XHRjYXNlICc8ZXh0THN0JzogY2FzZSAnPGV4dExzdD4nOiBjYXNlICc8L2V4dExzdD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxleHQnOiBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2V4dD4nOiBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYob3B0cyAmJiBvcHRzLldURikge1xuXHRcdFx0XHRpZighcGFzcykgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIGJvcmRlcnMnKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKiAxOC44LjIxIGZpbGxzIENUX0ZpbGxzICovXG5mdW5jdGlvbiBwYXJzZV9maWxscyh0LCBzdHlsZXMsIHRoZW1lcywgb3B0cykge1xuXHRzdHlsZXMuRmlsbHMgPSBbXTtcblx0dmFyIGZpbGwgPSB7fTtcblx0dmFyIHBhc3MgPSBmYWxzZTtcblx0KHRbMF0ubWF0Y2godGFncmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyh4KTtcblx0XHRzd2l0Y2goc3RyaXBfbnMoeVswXSkpIHtcblx0XHRcdGNhc2UgJzxmaWxscyc6IGNhc2UgJzxmaWxscz4nOiBjYXNlICc8L2ZpbGxzPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjIwIGZpbGwgQ1RfRmlsbCAqL1xuXHRcdFx0Y2FzZSAnPGZpbGw+JzogY2FzZSAnPGZpbGwnOiBjYXNlICc8ZmlsbC8+Jzpcblx0XHRcdFx0ZmlsbCA9IHt9OyBzdHlsZXMuRmlsbHMucHVzaChmaWxsKTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2ZpbGw+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMjQgZ3JhZGllbnRGaWxsIENUX0dyYWRpZW50RmlsbCAqL1xuXHRcdFx0Y2FzZSAnPGdyYWRpZW50RmlsbD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxncmFkaWVudEZpbGwnOlxuXHRcdFx0Y2FzZSAnPC9ncmFkaWVudEZpbGw+Jzogc3R5bGVzLkZpbGxzLnB1c2goZmlsbCk7IGZpbGwgPSB7fTsgYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMzIgcGF0dGVybkZpbGwgQ1RfUGF0dGVybkZpbGwgKi9cblx0XHRcdGNhc2UgJzxwYXR0ZXJuRmlsbCc6IGNhc2UgJzxwYXR0ZXJuRmlsbD4nOlxuXHRcdFx0XHRpZih5LnBhdHRlcm5UeXBlKSBmaWxsLnBhdHRlcm5UeXBlID0geS5wYXR0ZXJuVHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICc8cGF0dGVybkZpbGwvPic6IGNhc2UgJzwvcGF0dGVybkZpbGw+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMyBiZ0NvbG9yIENUX0NvbG9yICovXG5cdFx0XHRjYXNlICc8YmdDb2xvcic6XG5cdFx0XHRcdGlmKCFmaWxsLmJnQ29sb3IpIGZpbGwuYmdDb2xvciA9IHt9O1xuXHRcdFx0XHRpZih5LmluZGV4ZWQpIGZpbGwuYmdDb2xvci5pbmRleGVkID0gcGFyc2VJbnQoeS5pbmRleGVkLCAxMCk7XG5cdFx0XHRcdGlmKHkudGhlbWUpIGZpbGwuYmdDb2xvci50aGVtZSA9IHBhcnNlSW50KHkudGhlbWUsIDEwKTtcblx0XHRcdFx0aWYoeS50aW50KSBmaWxsLmJnQ29sb3IudGludCA9IHBhcnNlRmxvYXQoeS50aW50KTtcblx0XHRcdFx0LyogRXhjZWwgdXNlcyBBUkdCIHN0cmluZ3MgKi9cblx0XHRcdFx0aWYoeS5yZ2IpIGZpbGwuYmdDb2xvci5yZ2IgPSB5LnJnYi5zbGljZSgtNik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGJnQ29sb3IvPic6IGNhc2UgJzwvYmdDb2xvcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4xOSBmZ0NvbG9yIENUX0NvbG9yICovXG5cdFx0XHRjYXNlICc8ZmdDb2xvcic6XG5cdFx0XHRcdGlmKCFmaWxsLmZnQ29sb3IpIGZpbGwuZmdDb2xvciA9IHt9O1xuXHRcdFx0XHRpZih5LnRoZW1lKSBmaWxsLmZnQ29sb3IudGhlbWUgPSBwYXJzZUludCh5LnRoZW1lLCAxMCk7XG5cdFx0XHRcdGlmKHkudGludCkgZmlsbC5mZ0NvbG9yLnRpbnQgPSBwYXJzZUZsb2F0KHkudGludCk7XG5cdFx0XHRcdC8qIEV4Y2VsIHVzZXMgQVJHQiBzdHJpbmdzICovXG5cdFx0XHRcdGlmKHkucmdiICE9IG51bGwpIGZpbGwuZmdDb2xvci5yZ2IgPSB5LnJnYi5zbGljZSgtNik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGZnQ29sb3IvPic6IGNhc2UgJzwvZmdDb2xvcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4zOCBzdG9wIENUX0dyYWRpZW50U3RvcCAqL1xuXHRcdFx0Y2FzZSAnPHN0b3AnOiBjYXNlICc8c3RvcC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8L3N0b3A+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguPyBjb2xvciBDVF9Db2xvciAqL1xuXHRcdFx0Y2FzZSAnPGNvbG9yJzogY2FzZSAnPGNvbG9yLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvY29sb3I+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTAgZXh0THN0IENUX0V4dGVuc2lvbkxpc3QgPyAqL1xuXHRcdFx0Y2FzZSAnPGV4dExzdCc6IGNhc2UgJzxleHRMc3Q+JzogY2FzZSAnPC9leHRMc3Q+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8ZXh0JzogcGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9leHQ+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMgJiYgb3B0cy5XVEYpIHtcblx0XHRcdFx0aWYoIXBhc3MpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkICcgKyB5WzBdICsgJyBpbiBmaWxscycpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qIDE4LjguMjMgZm9udHMgQ1RfRm9udHMgKi9cbmZ1bmN0aW9uIHBhcnNlX2ZvbnRzKHQsIHN0eWxlcywgdGhlbWVzLCBvcHRzKSB7XG5cdHN0eWxlcy5Gb250cyA9IFtdO1xuXHR2YXIgZm9udCA9IHt9O1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXHQodFswXS5tYXRjaCh0YWdyZWdleCl8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKHgpO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPGZvbnRzJzogY2FzZSAnPGZvbnRzPic6IGNhc2UgJzwvZm9udHM+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMjIgZm9udCBDVF9Gb250ICovXG5cdFx0XHRjYXNlICc8Zm9udCc6IGNhc2UgJzxmb250Pic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9mb250Pic6IGNhc2UgJzxmb250Lz4nOlxuXHRcdFx0XHRzdHlsZXMuRm9udHMucHVzaChmb250KTtcblx0XHRcdFx0Zm9udCA9IHt9O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogMTguOC4yOSBuYW1lIENUX0ZvbnROYW1lICovXG5cdFx0XHRjYXNlICc8bmFtZSc6IGlmKHkudmFsKSBmb250Lm5hbWUgPSB1dGY4cmVhZCh5LnZhbCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPG5hbWUvPic6IGNhc2UgJzwvbmFtZT4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4yICBiIENUX0Jvb2xlYW5Qcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPGInOiBmb250LmJvbGQgPSB5LnZhbCA/IHBhcnNleG1sYm9vbCh5LnZhbCkgOiAxOyBicmVhaztcblx0XHRcdGNhc2UgJzxiLz4nOiBmb250LmJvbGQgPSAxOyBicmVhaztcblxuXHRcdFx0LyogMTguOC4yNiBpIENUX0Jvb2xlYW5Qcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPGknOiBmb250Lml0YWxpYyA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGkvPic6IGZvbnQuaXRhbGljID0gMTsgYnJlYWs7XG5cblx0XHRcdC8qIDE4LjQuMTMgdSBDVF9VbmRlcmxpbmVQcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPHUnOlxuXHRcdFx0XHRzd2l0Y2goeS52YWwpIHtcblx0XHRcdFx0XHRjYXNlIFwibm9uZVwiOiBmb250LnVuZGVybGluZSA9IDB4MDA7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJzaW5nbGVcIjogZm9udC51bmRlcmxpbmUgPSAweDAxOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiZG91YmxlXCI6IGZvbnQudW5kZXJsaW5lID0gMHgwMjsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInNpbmdsZUFjY291bnRpbmdcIjogZm9udC51bmRlcmxpbmUgPSAweDIxOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiZG91YmxlQWNjb3VudGluZ1wiOiBmb250LnVuZGVybGluZSA9IDB4MjI7IGJyZWFrO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHUvPic6IGZvbnQudW5kZXJsaW5lID0gMTsgYnJlYWs7XG5cblx0XHRcdC8qIDE4LjQuMTAgc3RyaWtlIENUX0Jvb2xlYW5Qcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPHN0cmlrZSc6IGZvbnQuc3RyaWtlID0geS52YWwgPyBwYXJzZXhtbGJvb2woeS52YWwpIDogMTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8c3RyaWtlLz4nOiBmb250LnN0cmlrZSA9IDE7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjIgIG91dGxpbmUgQ1RfQm9vbGVhblByb3BlcnR5ICovXG5cdFx0XHRjYXNlICc8b3V0bGluZSc6IGZvbnQub3V0bGluZSA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPG91dGxpbmUvPic6IGZvbnQub3V0bGluZSA9IDE7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjM2IHNoYWRvdyBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxzaGFkb3cnOiBmb250LnNoYWRvdyA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHNoYWRvdy8+JzogZm9udC5zaGFkb3cgPSAxOyBicmVhaztcblxuXHRcdFx0LyogMTguOC4xMiBjb25kZW5zZSBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxjb25kZW5zZSc6IGZvbnQuY29uZGVuc2UgPSB5LnZhbCA/IHBhcnNleG1sYm9vbCh5LnZhbCkgOiAxOyBicmVhaztcblx0XHRcdGNhc2UgJzxjb25kZW5zZS8+JzogZm9udC5jb25kZW5zZSA9IDE7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjE3IGV4dGVuZCBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxleHRlbmQnOiBmb250LmV4dGVuZCA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGV4dGVuZC8+JzogZm9udC5leHRlbmQgPSAxOyBicmVhaztcblxuXHRcdFx0LyogMTguNC4xMSBzeiBDVF9Gb250U2l6ZSAqL1xuXHRcdFx0Y2FzZSAnPHN6JzogaWYoeS52YWwpIGZvbnQuc3ogPSAreS52YWw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHN6Lz4nOiBjYXNlICc8L3N6Pic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjE0IHZlcnRBbGlnbiBDVF9WZXJ0aWNhbEFsaWduRm9udFByb3BlcnR5ICovXG5cdFx0XHRjYXNlICc8dmVydEFsaWduJzogaWYoeS52YWwpIGZvbnQudmVydEFsaWduID0geS52YWw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHZlcnRBbGlnbi8+JzogY2FzZSAnPC92ZXJ0QWxpZ24+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMTggZmFtaWx5IENUX0ZvbnRGYW1pbHkgKi9cblx0XHRcdGNhc2UgJzxmYW1pbHknOiBpZih5LnZhbCkgZm9udC5mYW1pbHkgPSBwYXJzZUludCh5LnZhbCwxMCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGZhbWlseS8+JzogY2FzZSAnPC9mYW1pbHk+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMzUgc2NoZW1lIENUX0ZvbnRTY2hlbWUgKi9cblx0XHRcdGNhc2UgJzxzY2hlbWUnOiBpZih5LnZhbCkgZm9udC5zY2hlbWUgPSB5LnZhbDsgYnJlYWs7XG5cdFx0XHRjYXNlICc8c2NoZW1lLz4nOiBjYXNlICc8L3NjaGVtZT4nOiBicmVhaztcblxuXHRcdFx0LyogMTguNC4xIGNoYXJzZXQgQ1RfSW50UHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxjaGFyc2V0Jzpcblx0XHRcdFx0aWYoeS52YWwgPT0gJzEnKSBicmVhaztcblx0XHRcdFx0eS5jb2RlcGFnZSA9IENTMkNQW3BhcnNlSW50KHkudmFsLCAxMCldO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogMTguPy4/IGNvbG9yIENUX0NvbG9yICovXG5cdFx0XHRjYXNlICc8Y29sb3InOlxuXHRcdFx0XHRpZighZm9udC5jb2xvcikgZm9udC5jb2xvciA9IHt9O1xuXHRcdFx0XHRpZih5LmF1dG8pIGZvbnQuY29sb3IuYXV0byA9IHBhcnNleG1sYm9vbCh5LmF1dG8pO1xuXG5cdFx0XHRcdGlmKHkucmdiKSBmb250LmNvbG9yLnJnYiA9IHkucmdiLnNsaWNlKC02KTtcblx0XHRcdFx0ZWxzZSBpZih5LmluZGV4ZWQpIHtcblx0XHRcdFx0XHRmb250LmNvbG9yLmluZGV4ID0gcGFyc2VJbnQoeS5pbmRleGVkLCAxMCk7XG5cdFx0XHRcdFx0dmFyIGljdiA9IFhMU0ljdltmb250LmNvbG9yLmluZGV4XTtcblx0XHRcdFx0XHRpZihmb250LmNvbG9yLmluZGV4ID09IDgxKSBpY3YgPSBYTFNJY3ZbMV07XG5cdFx0XHRcdFx0aWYoIWljdikgaWN2ID0gWExTSWN2WzFdOyAvL3Rocm93IG5ldyBFcnJvcih4KTsgLy8gbm90ZTogMjA2IGlzIHZhbGlkXG5cdFx0XHRcdFx0Zm9udC5jb2xvci5yZ2IgPSBpY3ZbMF0udG9TdHJpbmcoMTYpICsgaWN2WzFdLnRvU3RyaW5nKDE2KSArIGljdlsyXS50b1N0cmluZygxNik7XG5cdFx0XHRcdH0gZWxzZSBpZih5LnRoZW1lKSB7XG5cdFx0XHRcdFx0Zm9udC5jb2xvci50aGVtZSA9IHBhcnNlSW50KHkudGhlbWUsIDEwKTtcblx0XHRcdFx0XHRpZih5LnRpbnQpIGZvbnQuY29sb3IudGludCA9IHBhcnNlRmxvYXQoeS50aW50KTtcblx0XHRcdFx0XHRpZih5LnRoZW1lICYmIHRoZW1lcy50aGVtZUVsZW1lbnRzICYmIHRoZW1lcy50aGVtZUVsZW1lbnRzLmNsclNjaGVtZSkge1xuXHRcdFx0XHRcdFx0Zm9udC5jb2xvci5yZ2IgPSByZ2JfdGludCh0aGVtZXMudGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbZm9udC5jb2xvci50aGVtZV0ucmdiLCBmb250LmNvbG9yLnRpbnQgfHwgMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICc8Y29sb3IvPic6IGNhc2UgJzwvY29sb3I+JzogYnJlYWs7XG5cblx0XHRcdC8qIG5vdGU6IHNvbWV0aW1lcyBtYzpBbHRlcm5hdGVDb250ZW50IGFwcGVhcnMgYmFyZSAqL1xuXHRcdFx0Y2FzZSAnPEFsdGVybmF0ZUNvbnRlbnQnOiBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L0FsdGVybmF0ZUNvbnRlbnQ+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMCBleHRMc3QgQ1RfRXh0ZW5zaW9uTGlzdCA/ICovXG5cdFx0XHRjYXNlICc8ZXh0THN0JzogY2FzZSAnPGV4dExzdD4nOiBjYXNlICc8L2V4dExzdD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxleHQnOiBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2V4dD4nOiBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYob3B0cyAmJiBvcHRzLldURikge1xuXHRcdFx0XHRpZighcGFzcykgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIGZvbnRzJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyogMTguOC4zMSBudW1GbXRzIENUX051bUZtdHMgKi9cbmZ1bmN0aW9uIHBhcnNlX251bUZtdHModCwgc3R5bGVzLCBvcHRzKSB7XG5cdHN0eWxlcy5OdW1iZXJGbXQgPSBbXTtcblx0dmFyIGsvKkFycmF5PG51bWJlcj4qLyA9IChrZXlzKHRhYmxlX2ZtdCkvKjphbnkqLyk7XG5cdGZvcih2YXIgaT0wOyBpIDwgay5sZW5ndGg7ICsraSkgc3R5bGVzLk51bWJlckZtdFtrW2ldXSA9IHRhYmxlX2ZtdFtrW2ldXTtcblx0dmFyIG0gPSB0WzBdLm1hdGNoKHRhZ3JlZ2V4KTtcblx0aWYoIW0pIHJldHVybjtcblx0Zm9yKGk9MDsgaSA8IG0ubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKG1baV0pO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPG51bUZtdHMnOiBjYXNlICc8L251bUZtdHM+JzogY2FzZSAnPG51bUZtdHMvPic6IGNhc2UgJzxudW1GbXRzPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPG51bUZtdCc6IHtcblx0XHRcdFx0dmFyIGY9dW5lc2NhcGV4bWwodXRmOHJlYWQoeS5mb3JtYXRDb2RlKSksIGo9cGFyc2VJbnQoeS5udW1GbXRJZCwxMCk7XG5cdFx0XHRcdHN0eWxlcy5OdW1iZXJGbXRbal0gPSBmO1xuXHRcdFx0XHRpZihqPjApIHtcblx0XHRcdFx0XHRpZihqID4gMHgxODgpIHtcblx0XHRcdFx0XHRcdGZvcihqID0gMHgxODg7IGogPiAweDNjOyAtLWopIGlmKHN0eWxlcy5OdW1iZXJGbXRbal0gPT0gbnVsbCkgYnJlYWs7XG5cdFx0XHRcdFx0XHRzdHlsZXMuTnVtYmVyRm10W2pdID0gZjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0U1NGX2xvYWQoZixqKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBicmVhaztcblx0XHRcdGNhc2UgJzwvbnVtRm10Pic6IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYob3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkICcgKyB5WzBdICsgJyBpbiBudW1GbXRzJyk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHdyaXRlX251bUZtdHMoTkYvKjp7W246bnVtYmVyfHN0cmluZ106c3RyaW5nfSovLyo6Oiwgb3B0cyovKSB7XG5cdHZhciBvID0gW1wiPG51bUZtdHM+XCJdO1xuXHRbWzUsOF0sWzIzLDI2XSxbNDEsNDRdLFsvKjYzKi81MCwvKjY2XSxbMTY0LCovMzkyXV0uZm9yRWFjaChmdW5jdGlvbihyKSB7XG5cdFx0Zm9yKHZhciBpID0gclswXTsgaSA8PSByWzFdOyArK2kpIGlmKE5GW2ldICE9IG51bGwpIG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnbnVtRm10JyxudWxsLHtudW1GbXRJZDppLGZvcm1hdENvZGU6ZXNjYXBleG1sKE5GW2ldKX0pKTtcblx0fSk7XG5cdGlmKG8ubGVuZ3RoID09PSAxKSByZXR1cm4gXCJcIjtcblx0b1tvLmxlbmd0aF0gPSAoXCI8L251bUZtdHM+XCIpO1xuXHRvWzBdID0gd3JpdGV4dGFnKCdudW1GbXRzJywgbnVsbCwgeyBjb3VudDpvLmxlbmd0aC0yIH0pLnJlcGxhY2UoXCIvPlwiLCBcIj5cIik7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5cbi8qIDE4LjguMTAgY2VsbFhmcyBDVF9DZWxsWGZzICovXG52YXIgY2VsbFhGX3VpbnQgPSBbIFwibnVtRm10SWRcIiwgXCJmaWxsSWRcIiwgXCJmb250SWRcIiwgXCJib3JkZXJJZFwiLCBcInhmSWRcIiBdO1xudmFyIGNlbGxYRl9ib29sID0gWyBcImFwcGx5QWxpZ25tZW50XCIsIFwiYXBwbHlCb3JkZXJcIiwgXCJhcHBseUZpbGxcIiwgXCJhcHBseUZvbnRcIiwgXCJhcHBseU51bWJlckZvcm1hdFwiLCBcImFwcGx5UHJvdGVjdGlvblwiLCBcInBpdm90QnV0dG9uXCIsIFwicXVvdGVQcmVmaXhcIiBdO1xuZnVuY3Rpb24gcGFyc2VfY2VsbFhmcyh0LCBzdHlsZXMsIG9wdHMpIHtcblx0c3R5bGVzLkNlbGxYZiA9IFtdO1xuXHR2YXIgeGY7XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cdCh0WzBdLm1hdGNoKHRhZ3JlZ2V4KXx8W10pLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdHZhciB5ID0gcGFyc2V4bWx0YWcoeCksIGkgPSAwO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPGNlbGxYZnMnOiBjYXNlICc8Y2VsbFhmcz4nOiBjYXNlICc8Y2VsbFhmcy8+JzogY2FzZSAnPC9jZWxsWGZzPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjQ1IHhmIENUX1hmICovXG5cdFx0XHRjYXNlICc8eGYnOiBjYXNlICc8eGYvPic6XG5cdFx0XHRcdHhmID0geTtcblx0XHRcdFx0ZGVsZXRlIHhmWzBdO1xuXHRcdFx0XHRmb3IoaSA9IDA7IGkgPCBjZWxsWEZfdWludC5sZW5ndGg7ICsraSkgaWYoeGZbY2VsbFhGX3VpbnRbaV1dKVxuXHRcdFx0XHRcdHhmW2NlbGxYRl91aW50W2ldXSA9IHBhcnNlSW50KHhmW2NlbGxYRl91aW50W2ldXSwgMTApO1xuXHRcdFx0XHRmb3IoaSA9IDA7IGkgPCBjZWxsWEZfYm9vbC5sZW5ndGg7ICsraSkgaWYoeGZbY2VsbFhGX2Jvb2xbaV1dKVxuXHRcdFx0XHRcdHhmW2NlbGxYRl9ib29sW2ldXSA9IHBhcnNleG1sYm9vbCh4ZltjZWxsWEZfYm9vbFtpXV0pO1xuXHRcdFx0XHRpZihzdHlsZXMuTnVtYmVyRm10ICYmIHhmLm51bUZtdElkID4gMHgxODgpIHtcblx0XHRcdFx0XHRmb3IoaSA9IDB4MTg4OyBpID4gMHgzYzsgLS1pKSBpZihzdHlsZXMuTnVtYmVyRm10W3hmLm51bUZtdElkXSA9PSBzdHlsZXMuTnVtYmVyRm10W2ldKSB7IHhmLm51bUZtdElkID0gaTsgYnJlYWs7IH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzdHlsZXMuQ2VsbFhmLnB1c2goeGYpOyBicmVhaztcblx0XHRcdGNhc2UgJzwveGY+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMSBhbGlnbm1lbnQgQ1RfQ2VsbEFsaWdubWVudCAqL1xuXHRcdFx0Y2FzZSAnPGFsaWdubWVudCc6IGNhc2UgJzxhbGlnbm1lbnQvPic6XG5cdFx0XHRcdHZhciBhbGlnbm1lbnQgPSB7fTtcblx0XHRcdFx0aWYoeS52ZXJ0aWNhbCkgYWxpZ25tZW50LnZlcnRpY2FsID0geS52ZXJ0aWNhbDtcblx0XHRcdFx0aWYoeS5ob3Jpem9udGFsKSBhbGlnbm1lbnQuaG9yaXpvbnRhbCA9IHkuaG9yaXpvbnRhbDtcblx0XHRcdFx0aWYoeS50ZXh0Um90YXRpb24gIT0gbnVsbCkgYWxpZ25tZW50LnRleHRSb3RhdGlvbiA9IHkudGV4dFJvdGF0aW9uO1xuXHRcdFx0XHRpZih5LmluZGVudCkgYWxpZ25tZW50LmluZGVudCA9IHkuaW5kZW50O1xuXHRcdFx0XHRpZih5LndyYXBUZXh0KSBhbGlnbm1lbnQud3JhcFRleHQgPSBwYXJzZXhtbGJvb2woeS53cmFwVGV4dCk7XG5cdFx0XHRcdHhmLmFsaWdubWVudCA9IGFsaWdubWVudDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICc8L2FsaWdubWVudD4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4zMyBwcm90ZWN0aW9uIENUX0NlbGxQcm90ZWN0aW9uICovXG5cdFx0XHRjYXNlICc8cHJvdGVjdGlvbic6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9wcm90ZWN0aW9uPic6IGNhc2UgJzxwcm90ZWN0aW9uLz4nOiBicmVhaztcblxuXHRcdFx0Lyogbm90ZTogc29tZXRpbWVzIG1jOkFsdGVybmF0ZUNvbnRlbnQgYXBwZWFycyBiYXJlICovXG5cdFx0XHRjYXNlICc8QWx0ZXJuYXRlQ29udGVudCc6IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgJzwvQWx0ZXJuYXRlQ29udGVudD4nOiBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjEwIGV4dExzdCBDVF9FeHRlbnNpb25MaXN0ID8gKi9cblx0XHRcdGNhc2UgJzxleHRMc3QnOiBjYXNlICc8ZXh0THN0Pic6IGNhc2UgJzwvZXh0THN0Pic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGV4dCc6IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgJzwvZXh0Pic6IHBhc3MgPSBmYWxzZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiBpZihvcHRzICYmIG9wdHMuV1RGKSB7XG5cdFx0XHRcdGlmKCFwYXNzKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCAnICsgeVswXSArICcgaW4gY2VsbFhmcycpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2NlbGxYZnMoY2VsbFhmcykvKjpzdHJpbmcqLyB7XG5cdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnY2VsbFhmcycsbnVsbCkpO1xuXHRjZWxsWGZzLmZvckVhY2goZnVuY3Rpb24oYykge1xuXHRcdG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygneGYnLCBudWxsLCBjKSk7XG5cdH0pO1xuXHRvW28ubGVuZ3RoXSA9IChcIjwvY2VsbFhmcz5cIik7XG5cdGlmKG8ubGVuZ3RoID09PSAyKSByZXR1cm4gXCJcIjtcblx0b1swXSA9IHdyaXRleHRhZygnY2VsbFhmcycsbnVsbCwge2NvdW50Om8ubGVuZ3RoLTJ9KS5yZXBsYWNlKFwiLz5cIixcIj5cIik7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5cbi8qIDE4LjggU3R5bGVzIENUX1N0eWxlc2hlZXQqL1xudmFyIHBhcnNlX3N0eV94bWw9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24gbWFrZV9wc3R5eCgpIHtcbnZhciBudW1GbXRSZWdleCA9IC88KD86XFx3KzopP251bUZtdHMoW14+XSopPltcXFNcXHNdKj88XFwvKD86XFx3KzopP251bUZtdHM+LztcbnZhciBjZWxsWGZSZWdleCA9IC88KD86XFx3KzopP2NlbGxYZnMoW14+XSopPltcXFNcXHNdKj88XFwvKD86XFx3KzopP2NlbGxYZnM+LztcbnZhciBmaWxsc1JlZ2V4ID0gLzwoPzpcXHcrOik/ZmlsbHMoW14+XSopPltcXFNcXHNdKj88XFwvKD86XFx3KzopP2ZpbGxzPi87XG52YXIgZm9udHNSZWdleCA9IC88KD86XFx3KzopP2ZvbnRzKFtePl0qKT5bXFxTXFxzXSo/PFxcLyg/Olxcdys6KT9mb250cz4vO1xudmFyIGJvcmRlcnNSZWdleCA9IC88KD86XFx3KzopP2JvcmRlcnMoW14+XSopPltcXFNcXHNdKj88XFwvKD86XFx3KzopP2JvcmRlcnM+LztcblxucmV0dXJuIGZ1bmN0aW9uIHBhcnNlX3N0eV94bWwoZGF0YSwgdGhlbWVzLCBvcHRzKSB7XG5cdHZhciBzdHlsZXMgPSB7fTtcblx0aWYoIWRhdGEpIHJldHVybiBzdHlsZXM7XG5cdGRhdGEgPSBkYXRhLnJlcGxhY2UoLzwhLS0oW1xcc1xcU10qPyktLT4vbWcsXCJcIikucmVwbGFjZSgvPCFET0NUWVBFW15cXFtdKlxcW1teXFxdXSpcXF0+L2dtLFwiXCIpO1xuXHQvKiAxOC44LjM5IHN0eWxlU2hlZXQgQ1RfU3R5bGVzaGVldCAqL1xuXHR2YXIgdDtcblxuXHQvKiAxOC44LjMxIG51bUZtdHMgQ1RfTnVtRm10cyA/ICovXG5cdGlmKCh0PWRhdGEubWF0Y2gobnVtRm10UmVnZXgpKSkgcGFyc2VfbnVtRm10cyh0LCBzdHlsZXMsIG9wdHMpO1xuXG5cdC8qIDE4LjguMjMgZm9udHMgQ1RfRm9udHMgPyAqL1xuXHRpZigodD1kYXRhLm1hdGNoKGZvbnRzUmVnZXgpKSkgcGFyc2VfZm9udHModCwgc3R5bGVzLCB0aGVtZXMsIG9wdHMpO1xuXG5cdC8qIDE4LjguMjEgZmlsbHMgQ1RfRmlsbHMgPyAqL1xuXHRpZigodD1kYXRhLm1hdGNoKGZpbGxzUmVnZXgpKSkgcGFyc2VfZmlsbHModCwgc3R5bGVzLCB0aGVtZXMsIG9wdHMpO1xuXG5cdC8qIDE4LjguNSAgYm9yZGVycyBDVF9Cb3JkZXJzID8gKi9cblx0aWYoKHQ9ZGF0YS5tYXRjaChib3JkZXJzUmVnZXgpKSkgcGFyc2VfYm9yZGVycyh0LCBzdHlsZXMsIHRoZW1lcywgb3B0cyk7XG5cblx0LyogMTguOC45ICBjZWxsU3R5bGVYZnMgQ1RfQ2VsbFN0eWxlWGZzID8gKi9cblx0LyogMTguOC44ICBjZWxsU3R5bGVzIENUX0NlbGxTdHlsZXMgPyAqL1xuXG5cdC8qIDE4LjguMTAgY2VsbFhmcyBDVF9DZWxsWGZzID8gKi9cblx0aWYoKHQ9ZGF0YS5tYXRjaChjZWxsWGZSZWdleCkpKSBwYXJzZV9jZWxsWGZzKHQsIHN0eWxlcywgb3B0cyk7XG5cblx0LyogMTguOC4xNSBkeGZzIENUX0R4ZnMgPyAqL1xuXHQvKiAxOC44LjQyIHRhYmxlU3R5bGVzIENUX1RhYmxlU3R5bGVzID8gKi9cblx0LyogMTguOC4xMSBjb2xvcnMgQ1RfQ29sb3JzID8gKi9cblx0LyogMTguMi4xMCBleHRMc3QgQ1RfRXh0ZW5zaW9uTGlzdCA/ICovXG5cblx0cmV0dXJuIHN0eWxlcztcbn07XG59KSgpO1xuXG5mdW5jdGlvbiB3cml0ZV9zdHlfeG1sKHdiLyo6V29ya2Jvb2sqLywgb3B0cykvKjpzdHJpbmcqLyB7XG5cdHZhciBvID0gW1hNTF9IRUFERVIsIHdyaXRleHRhZygnc3R5bGVTaGVldCcsIG51bGwsIHtcblx0XHQneG1sbnMnOiBYTUxOU19tYWluWzBdLFxuXHRcdCd4bWxuczp2dCc6IFhNTE5TLnZ0XG5cdH0pXSwgdztcblx0aWYod2IuU1NGICYmICh3ID0gd3JpdGVfbnVtRm10cyh3Yi5TU0YpKSAhPSBudWxsKSBvW28ubGVuZ3RoXSA9IHc7XG5cdG9bby5sZW5ndGhdID0gKCc8Zm9udHMgY291bnQ9XCIxXCI+PGZvbnQ+PHN6IHZhbD1cIjEyXCIvPjxjb2xvciB0aGVtZT1cIjFcIi8+PG5hbWUgdmFsPVwiQ2FsaWJyaVwiLz48ZmFtaWx5IHZhbD1cIjJcIi8+PHNjaGVtZSB2YWw9XCJtaW5vclwiLz48L2ZvbnQ+PC9mb250cz4nKTtcblx0b1tvLmxlbmd0aF0gPSAoJzxmaWxscyBjb3VudD1cIjJcIj48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9XCJub25lXCIvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9XCJncmF5MTI1XCIvPjwvZmlsbD48L2ZpbGxzPicpO1xuXHRvW28ubGVuZ3RoXSA9ICgnPGJvcmRlcnMgY291bnQ9XCIxXCI+PGJvcmRlcj48bGVmdC8+PHJpZ2h0Lz48dG9wLz48Ym90dG9tLz48ZGlhZ29uYWwvPjwvYm9yZGVyPjwvYm9yZGVycz4nKTtcblx0b1tvLmxlbmd0aF0gPSAoJzxjZWxsU3R5bGVYZnMgY291bnQ9XCIxXCI+PHhmIG51bUZtdElkPVwiMFwiIGZvbnRJZD1cIjBcIiBmaWxsSWQ9XCIwXCIgYm9yZGVySWQ9XCIwXCIvPjwvY2VsbFN0eWxlWGZzPicpO1xuXHRpZigodyA9IHdyaXRlX2NlbGxYZnMob3B0cy5jZWxsWGZzKSkpIG9bby5sZW5ndGhdID0gKHcpO1xuXHRvW28ubGVuZ3RoXSA9ICgnPGNlbGxTdHlsZXMgY291bnQ9XCIxXCI+PGNlbGxTdHlsZSBuYW1lPVwiTm9ybWFsXCIgeGZJZD1cIjBcIiBidWlsdGluSWQ9XCIwXCIvPjwvY2VsbFN0eWxlcz4nKTtcblx0b1tvLmxlbmd0aF0gPSAoJzxkeGZzIGNvdW50PVwiMFwiLz4nKTtcblx0b1tvLmxlbmd0aF0gPSAoJzx0YWJsZVN0eWxlcyBjb3VudD1cIjBcIiBkZWZhdWx0VGFibGVTdHlsZT1cIlRhYmxlU3R5bGVNZWRpdW05XCIgZGVmYXVsdFBpdm90U3R5bGU9XCJQaXZvdFN0eWxlTWVkaXVtNFwiLz4nKTtcblxuXHRpZihvLmxlbmd0aD4yKXsgb1tvLmxlbmd0aF0gPSAoJzwvc3R5bGVTaGVldD4nKTsgb1sxXT1vWzFdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogW01TLVhMU0JdIDIuNC42NTcgQnJ0Rm10ICovXG5mdW5jdGlvbiBwYXJzZV9CcnRGbXQoZGF0YSwgbGVuZ3RoLyo6bnVtYmVyKi8pIHtcblx0dmFyIG51bUZtdElkID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgc3RGbXRDb2RlID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEsbGVuZ3RoLTIpO1xuXHRyZXR1cm4gW251bUZtdElkLCBzdEZtdENvZGVdO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Rm10KGkvKjpudW1iZXIqLywgZi8qOnN0cmluZyovLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1Zig2ICsgNCAqIGYubGVuZ3RoKTtcblx0by53cml0ZV9zaGlmdCgyLCBpKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKGYsIG8pO1xuXHR2YXIgb3V0ID0gKG8ubGVuZ3RoID4gby5sKSA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG5cdGlmKG8ubCA9PSBudWxsKSBvLmwgPSBvLmxlbmd0aDtcblx0cmV0dXJuIG91dDtcbn1cblxuLyogW01TLVhMU0JdIDIuNC42NTkgQnJ0Rm9udCBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9CcnRGb250KGRhdGEsIGxlbmd0aC8qOm51bWJlciovLCBvcHRzKSB7XG5cdHZhciBvdXQgPSAoe30vKjphbnkqLyk7XG5cblx0b3V0LnN6ID0gZGF0YS5yZWFkX3NoaWZ0KDIpIC8gMjA7XG5cblx0dmFyIGdyYml0ID0gcGFyc2VfRm9udEZsYWdzKGRhdGEsIDIsIG9wdHMpO1xuXHRpZihncmJpdC5mSXRhbGljKSBvdXQuaXRhbGljID0gMTtcblx0aWYoZ3JiaXQuZkNvbmRlbnNlKSBvdXQuY29uZGVuc2UgPSAxO1xuXHRpZihncmJpdC5mRXh0ZW5kKSBvdXQuZXh0ZW5kID0gMTtcblx0aWYoZ3JiaXQuZlNoYWRvdykgb3V0LnNoYWRvdyA9IDE7XG5cdGlmKGdyYml0LmZPdXRsaW5lKSBvdXQub3V0bGluZSA9IDE7XG5cdGlmKGdyYml0LmZTdHJpa2VvdXQpIG91dC5zdHJpa2UgPSAxO1xuXG5cdHZhciBibHMgPSBkYXRhLnJlYWRfc2hpZnQoMik7XG5cdGlmKGJscyA9PT0gMHgwMkJDKSBvdXQuYm9sZCA9IDE7XG5cblx0c3dpdGNoKGRhdGEucmVhZF9zaGlmdCgyKSkge1xuXHRcdC8qIGNhc2UgMDogb3V0LnZlcnRBbGlnbiA9IFwiYmFzZWxpbmVcIjsgYnJlYWs7ICovXG5cdFx0Y2FzZSAxOiBvdXQudmVydEFsaWduID0gXCJzdXBlcnNjcmlwdFwiOyBicmVhaztcblx0XHRjYXNlIDI6IG91dC52ZXJ0QWxpZ24gPSBcInN1YnNjcmlwdFwiOyBicmVhaztcblx0fVxuXG5cdHZhciB1bmRlcmxpbmUgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdGlmKHVuZGVybGluZSAhPSAwKSBvdXQudW5kZXJsaW5lID0gdW5kZXJsaW5lO1xuXG5cdHZhciBmYW1pbHkgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdGlmKGZhbWlseSA+IDApIG91dC5mYW1pbHkgPSBmYW1pbHk7XG5cblx0dmFyIGJDaGFyU2V0ID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRpZihiQ2hhclNldCA+IDApIG91dC5jaGFyc2V0ID0gYkNoYXJTZXQ7XG5cblx0ZGF0YS5sKys7XG5cdG91dC5jb2xvciA9IHBhcnNlX0JydENvbG9yKGRhdGEsIDgpO1xuXG5cdHN3aXRjaChkYXRhLnJlYWRfc2hpZnQoMSkpIHtcblx0XHQvKiBjYXNlIDA6IG91dC5zY2hlbWUgPSBcIm5vbmVcIjogYnJlYWs7ICovXG5cdFx0Y2FzZSAxOiBvdXQuc2NoZW1lID0gXCJtYWpvclwiOyBicmVhaztcblx0XHRjYXNlIDI6IG91dC5zY2hlbWUgPSBcIm1pbm9yXCI7IGJyZWFrO1xuXHR9XG5cblx0b3V0Lm5hbWUgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSwgbGVuZ3RoIC0gMjEpO1xuXG5cdHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRGb250KGZvbnQvKjphbnkqLywgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMjUrNCozMik7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZm9udC5zeiAqIDIwKTtcblx0d3JpdGVfRm9udEZsYWdzKGZvbnQsIG8pO1xuXHRvLndyaXRlX3NoaWZ0KDIsIGZvbnQuYm9sZCA/IDB4MDJCQyA6IDB4MDE5MCk7XG5cdHZhciBzc3MgPSAwO1xuXHRpZihmb250LnZlcnRBbGlnbiA9PSBcInN1cGVyc2NyaXB0XCIpIHNzcyA9IDE7XG5cdGVsc2UgaWYoZm9udC52ZXJ0QWxpZ24gPT0gXCJzdWJzY3JpcHRcIikgc3NzID0gMjtcblx0by53cml0ZV9zaGlmdCgyLCBzc3MpO1xuXHRvLndyaXRlX3NoaWZ0KDEsIGZvbnQudW5kZXJsaW5lIHx8IDApO1xuXHRvLndyaXRlX3NoaWZ0KDEsIGZvbnQuZmFtaWx5IHx8IDApO1xuXHRvLndyaXRlX3NoaWZ0KDEsIGZvbnQuY2hhcnNldCB8fCAwKTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0d3JpdGVfQnJ0Q29sb3IoZm9udC5jb2xvciwgbyk7XG5cdHZhciBzY2hlbWUgPSAwO1xuXHRpZihmb250LnNjaGVtZSA9PSBcIm1ham9yXCIpIHNjaGVtZSA9IDE7XG5cdGlmKGZvbnQuc2NoZW1lID09IFwibWlub3JcIikgc2NoZW1lID0gMjtcblx0by53cml0ZV9zaGlmdCgxLCBzY2hlbWUpO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoZm9udC5uYW1lLCBvKTtcblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC42NTAgQnJ0RmlsbCAqL1xudmFyIFhMU0JGaWxsUFROYW1lcyA9IFtcblx0XCJub25lXCIsXG5cdFwic29saWRcIixcblx0XCJtZWRpdW1HcmF5XCIsXG5cdFwiZGFya0dyYXlcIixcblx0XCJsaWdodEdyYXlcIixcblx0XCJkYXJrSG9yaXpvbnRhbFwiLFxuXHRcImRhcmtWZXJ0aWNhbFwiLFxuXHRcImRhcmtEb3duXCIsXG5cdFwiZGFya1VwXCIsXG5cdFwiZGFya0dyaWRcIixcblx0XCJkYXJrVHJlbGxpc1wiLFxuXHRcImxpZ2h0SG9yaXpvbnRhbFwiLFxuXHRcImxpZ2h0VmVydGljYWxcIixcblx0XCJsaWdodERvd25cIixcblx0XCJsaWdodFVwXCIsXG5cdFwibGlnaHRHcmlkXCIsXG5cdFwibGlnaHRUcmVsbGlzXCIsXG5cdFwiZ3JheTEyNVwiLFxuXHRcImdyYXkwNjI1XCJcbl07XG52YXIgcmV2X1hMU0JGaWxsUFROYW1lcy8qOkV2ZXJ0TnVtVHlwZSovO1xuLyogVE9ETzogZ3JhZGllbnQgZmlsbCByZXByZXNlbnRhdGlvbiAqL1xudmFyIHBhcnNlX0JydEZpbGwgPSBwYXJzZW5vb3A7XG5mdW5jdGlvbiB3cml0ZV9CcnRGaWxsKGZpbGwsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDQqMyArIDgqNyArIDE2KjEpO1xuXHRpZighcmV2X1hMU0JGaWxsUFROYW1lcykgcmV2X1hMU0JGaWxsUFROYW1lcyA9IChldmVydChYTFNCRmlsbFBUTmFtZXMpLyo6YW55Ki8pO1xuXHR2YXIgZmxzLyo6bnVtYmVyKi8gPSByZXZfWExTQkZpbGxQVE5hbWVzW2ZpbGwucGF0dGVyblR5cGVdO1xuXHRpZihmbHMgPT0gbnVsbCkgZmxzID0gMHgyODtcblx0by53cml0ZV9zaGlmdCg0LCBmbHMpO1xuXHR2YXIgaiA9IDA7XG5cdGlmKGZscyAhPSAweDI4KSB7XG5cdFx0LyogVE9ETzogY3VzdG9tIEZHIENvbG9yICovXG5cdFx0d3JpdGVfQnJ0Q29sb3Ioe2F1dG86MX0sIG8pO1xuXHRcdC8qIFRPRE86IGN1c3RvbSBCRyBDb2xvciAqL1xuXHRcdHdyaXRlX0JydENvbG9yKHthdXRvOjF9LCBvKTtcblxuXHRcdGZvcig7IGogPCAxMjsgKytqKSBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHR9IGVsc2Uge1xuXHRcdGZvcig7IGogPCA0OyArK2opIG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cblx0XHRmb3IoOyBqIDwgMTI7ICsraikgby53cml0ZV9zaGlmdCg0LCAwKTsgLyogVE9ETyAqL1xuXHRcdC8qIGlHcmFkaWVudFR5cGUgKi9cblx0XHQvKiB4bnVtRGVncmVlICovXG5cdFx0LyogeG51bUZpbGxUb0xlZnQgKi9cblx0XHQvKiB4bnVtRmlsbFRvUmlnaHQgKi9cblx0XHQvKiB4bnVtRmlsbFRvVG9wICovXG5cdFx0LyogeG51bUZpbGxUb0JvdHRvbSAqL1xuXHRcdC8qIGNOdW1TdG9wICovXG5cdFx0LyogeGZpbGxHcmFkaWVudFN0b3AgKi9cblx0fVxuXHRyZXR1cm4gby5sZW5ndGggPiBvLmwgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjgyNCBCcnRYRiAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0WEYoZGF0YSwgbGVuZ3RoLyo6bnVtYmVyKi8pIHtcblx0dmFyIHRndCA9IGRhdGEubCArIGxlbmd0aDtcblx0dmFyIGl4ZmVQYXJlbnQgPSBkYXRhLnJlYWRfc2hpZnQoMik7XG5cdHZhciBpZm10ID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRkYXRhLmwgPSB0Z3Q7XG5cdHJldHVybiB7aXhmZTppeGZlUGFyZW50LCBudW1GbXRJZDppZm10IH07XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRYRihkYXRhLCBpeGZlUCwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMTYpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIGl4ZmVQfHwwKTtcblx0by53cml0ZV9zaGlmdCgyLCBkYXRhLm51bUZtdElkfHwwKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTsgLyogaUZvbnQgKi9cblx0by53cml0ZV9zaGlmdCgyLCAwKTsgLyogaUZpbGwgKi9cblx0by53cml0ZV9zaGlmdCgyLCAwKTsgLyogaXhCb3JkZXIgKi9cblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLyogdHJvdCAqL1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiBpbmRlbnQgKi9cblx0dmFyIGZsb3cgPSAwO1xuXHRvLndyaXRlX3NoaWZ0KDEsIGZsb3cpOyAvKiBmbGFncyAqL1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiBmbGFncyAqL1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiB4ZkdyYml0QXRyICovXG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi41LjQgQmx4ZiBUT0RPICovXG5mdW5jdGlvbiB3cml0ZV9CbHhmKGRhdGEsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDEwKTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLyogZGcgKi9cblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTsgLyogY29sb3IgKi9cblx0by53cml0ZV9zaGlmdCg0LCAwKTsgLyogY29sb3IgKi9cblx0cmV0dXJuIG87XG59XG4vKiBbTVMtWExTQl0gMi40LjMwMiBCcnRCb3JkZXIgVE9ETyAqL1xudmFyIHBhcnNlX0JydEJvcmRlciA9IHBhcnNlbm9vcDtcbmZ1bmN0aW9uIHdyaXRlX0JydEJvcmRlcihib3JkZXIsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDUxKTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLyogZGlhZ29uYWwgKi9cblx0d3JpdGVfQmx4ZihudWxsLCBvKTsgLyogdG9wICovXG5cdHdyaXRlX0JseGYobnVsbCwgbyk7IC8qIGJvdHRvbSAqL1xuXHR3cml0ZV9CbHhmKG51bGwsIG8pOyAvKiBsZWZ0ICovXG5cdHdyaXRlX0JseGYobnVsbCwgbyk7IC8qIHJpZ2h0ICovXG5cdHdyaXRlX0JseGYobnVsbCwgbyk7IC8qIGRpYWcgKi9cblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC43NjMgQnJ0U3R5bGUgVE9ETyAqL1xuZnVuY3Rpb24gd3JpdGVfQnJ0U3R5bGUoc3R5bGUsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDEyKzQqMTApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIHN0eWxlLnhmSWQpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDEpO1xuXHRvLndyaXRlX3NoaWZ0KDEsICtzdHlsZS5idWlsdGluSWQpO1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiBpTGV2ZWwgKi9cblx0d3JpdGVfWExOdWxsYWJsZVdpZGVTdHJpbmcoc3R5bGUubmFtZSB8fCBcIlwiLCBvKTtcblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4yNzIgQnJ0QmVnaW5UYWJsZVN0eWxlcyAqL1xuZnVuY3Rpb24gd3JpdGVfQnJ0QmVnaW5UYWJsZVN0eWxlcyhjbnQsIGRlZlRhYmxlU3R5bGUsIGRlZlBpdm90U3R5bGUpIHtcblx0dmFyIG8gPSBuZXdfYnVmKDQrMjU2KjIqNCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgY250KTtcblx0d3JpdGVfWExOdWxsYWJsZVdpZGVTdHJpbmcoZGVmVGFibGVTdHlsZSwgbyk7XG5cdHdyaXRlX1hMTnVsbGFibGVXaWRlU3RyaW5nKGRlZlBpdm90U3R5bGUsIG8pO1xuXHRyZXR1cm4gby5sZW5ndGggPiBvLmwgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjcuNTAgU3R5bGVzICovXG5mdW5jdGlvbiBwYXJzZV9zdHlfYmluKGRhdGEsIHRoZW1lcywgb3B0cykge1xuXHR2YXIgc3R5bGVzID0ge307XG5cdHN0eWxlcy5OdW1iZXJGbXQgPSAoW10vKjphbnkqLyk7XG5cdGZvcih2YXIgeSBpbiB0YWJsZV9mbXQpIHN0eWxlcy5OdW1iZXJGbXRbeV0gPSB0YWJsZV9mbXRbeV07XG5cblx0c3R5bGVzLkNlbGxYZiA9IFtdO1xuXHRzdHlsZXMuRm9udHMgPSBbXTtcblx0dmFyIHN0YXRlLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cdHJlY29yZGhvcHBlcihkYXRhLCBmdW5jdGlvbiBob3BwZXJfc3R5KHZhbCwgUiwgUlQpIHtcblx0XHRzd2l0Y2goUlQpIHtcblx0XHRcdGNhc2UgMHgwMDJDOiAvKiBCcnRGbXQgKi9cblx0XHRcdFx0c3R5bGVzLk51bWJlckZtdFt2YWxbMF1dID0gdmFsWzFdOyBTU0ZfbG9hZCh2YWxbMV0sIHZhbFswXSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMkI6IC8qIEJydEZvbnQgKi9cblx0XHRcdFx0c3R5bGVzLkZvbnRzLnB1c2godmFsKTtcblx0XHRcdFx0aWYodmFsLmNvbG9yLnRoZW1lICE9IG51bGwgJiYgdGhlbWVzICYmIHRoZW1lcy50aGVtZUVsZW1lbnRzICYmIHRoZW1lcy50aGVtZUVsZW1lbnRzLmNsclNjaGVtZSkge1xuXHRcdFx0XHRcdHZhbC5jb2xvci5yZ2IgPSByZ2JfdGludCh0aGVtZXMudGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbdmFsLmNvbG9yLnRoZW1lXS5yZ2IsIHZhbC5jb2xvci50aW50IHx8IDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDA0MDE6IC8qIEJydEtub3duRm9udHMgKi8gYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyRDogLyogQnJ0RmlsbCAqL1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMHgwMDJFOiAvKiBCcnRCb3JkZXIgKi9cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyRjogLyogQnJ0WEYgKi9cblx0XHRcdFx0aWYoc3RhdGVbc3RhdGUubGVuZ3RoIC0gMV0gPT0gMHgwMjY5IC8qIEJydEJlZ2luQ2VsbFhGcyAqLykge1xuXHRcdFx0XHRcdHN0eWxlcy5DZWxsWGYucHVzaCh2YWwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMzA6IC8qIEJydFN0eWxlICovXG5cdFx0XHRjYXNlIDB4MDFGQjogLyogQnJ0RFhGICovXG5cdFx0XHRjYXNlIDB4MDIzQzogLyogQnJ0TVJVQ29sb3IgKi9cblx0XHRcdGNhc2UgMHgwMURCOiAvKiBCcnRJbmRleGVkQ29sb3IgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwNDkzOiAvKiBCcnREWEYxNCAqL1xuXHRcdFx0Y2FzZSAweDA4MzY6IC8qIEJydERYRjE1ICovXG5cdFx0XHRjYXNlIDB4MDQ2QTogLyogQnJ0U2xpY2VyU3R5bGVFbGVtZW50ICovXG5cdFx0XHRjYXNlIDB4MDIwMDogLyogQnJ0VGFibGVTdHlsZUVsZW1lbnQgKi9cblx0XHRcdGNhc2UgMHgwODJGOiAvKiBCcnRUaW1lbGluZVN0eWxlRWxlbWVudCAqL1xuXHRcdFx0Y2FzZSAweDBDMDA6IC8qIEJydFVpZCAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMjM6IC8qIEJydEZSVEJlZ2luICovXG5cdFx0XHRcdHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiBCcnRGUlRFbmQgKi9cblx0XHRcdFx0cGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI1OiAvKiBCcnRBQ0JlZ2luICovXG5cdFx0XHRcdHN0YXRlLnB1c2goUlQpOyBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNjogLyogQnJ0QUNFbmQgKi9cblx0XHRcdFx0c3RhdGUucG9wKCk7IHBhc3MgPSBmYWxzZTsgYnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKFIuVCA+IDApIHN0YXRlLnB1c2goUlQpO1xuXHRcdFx0XHRlbHNlIGlmKFIuVCA8IDApIHN0YXRlLnBvcCgpO1xuXHRcdFx0XHRlbHNlIGlmKCFwYXNzIHx8IChvcHRzLldURiAmJiBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0gIT0gMHgwMDI1IC8qIEJydEFDQmVnaW4gKi8pKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHJlY29yZCAweFwiICsgUlQudG9TdHJpbmcoMTYpKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9GTVRTX2JpbihiYSwgTkYvKjo/U1NGVGFibGUqLykge1xuXHRpZighTkYpIHJldHVybjtcblx0dmFyIGNudCA9IDA7XG5cdFtbNSw4XSxbMjMsMjZdLFs0MSw0NF0sWy8qNjMqLzUwLC8qNjZdLFsxNjQsKi8zOTJdXS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHtcblx0XHQvKjo6IGlmKCFORikgcmV0dXJuOyAqL1xuXHRcdGZvcih2YXIgaSA9IHJbMF07IGkgPD0gclsxXTsgKytpKSBpZihORltpXSAhPSBudWxsKSArK2NudDtcblx0fSk7XG5cblx0aWYoY250ID09IDApIHJldHVybjtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAyNjcgLyogQnJ0QmVnaW5GbXRzICovLCB3cml0ZV9VSW50MzJMRShjbnQpKTtcblx0W1s1LDhdLFsyMywyNl0sWzQxLDQ0XSxbLyo2MyovNTAsLyo2Nl0sWzE2NCwqLzM5Ml1dLmZvckVhY2goZnVuY3Rpb24ocikge1xuXHRcdC8qOjogaWYoIU5GKSByZXR1cm47ICovXG5cdFx0Zm9yKHZhciBpID0gclswXTsgaSA8PSByWzFdOyArK2kpIGlmKE5GW2ldICE9IG51bGwpIHdyaXRlX3JlY29yZChiYSwgMHgwMDJDIC8qIEJydEZtdCAqLywgd3JpdGVfQnJ0Rm10KGksIE5GW2ldKSk7XG5cdH0pO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI2OCAvKiBCcnRFbmRGbXRzICovKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfRk9OVFNfYmluKGJhLyo6OiwgZGF0YSovKSB7XG5cdHZhciBjbnQgPSAxO1xuXG5cdGlmKGNudCA9PSAwKSByZXR1cm47XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjYzIC8qIEJydEJlZ2luRm9udHMgKi8sIHdyaXRlX1VJbnQzMkxFKGNudCkpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDAyQiAvKiBCcnRGb250ICovLCB3cml0ZV9CcnRGb250KHtcblx0XHRzejoxMixcblx0XHRjb2xvcjoge3RoZW1lOjF9LFxuXHRcdG5hbWU6IFwiQ2FsaWJyaVwiLFxuXHRcdGZhbWlseTogMixcblx0XHRzY2hlbWU6IFwibWlub3JcIlxuXHR9KSk7XG5cdC8qIDEqNjU0OTFCcnRGb250IFtBQ0ZPTlRTXSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI2NCAvKiBCcnRFbmRGb250cyAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0ZJTExTX2JpbihiYS8qOjosIGRhdGEqLykge1xuXHR2YXIgY250ID0gMjtcblxuXHRpZihjbnQgPT0gMCkgcmV0dXJuO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI1QiAvKiBCcnRCZWdpbkZpbGxzICovLCB3cml0ZV9VSW50MzJMRShjbnQpKTtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwMkQgLyogQnJ0RmlsbCAqLywgd3JpdGVfQnJ0RmlsbCh7cGF0dGVyblR5cGU6XCJub25lXCJ9KSk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDJEIC8qIEJydEZpbGwgKi8sIHdyaXRlX0JydEZpbGwoe3BhdHRlcm5UeXBlOlwiZ3JheTEyNVwifSkpO1xuXHQvKiAxKjY1NDMxQnJ0RmlsbCAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI1QyAvKiBCcnRFbmRGaWxscyAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0JPUkRFUlNfYmluKGJhLyo6OiwgZGF0YSovKSB7XG5cdHZhciBjbnQgPSAxO1xuXG5cdGlmKGNudCA9PSAwKSByZXR1cm47XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjY1IC8qIEJydEJlZ2luQm9yZGVycyAqLywgd3JpdGVfVUludDMyTEUoY250KSk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDJFIC8qIEJydEJvcmRlciAqLywgd3JpdGVfQnJ0Qm9yZGVyKHt9KSk7XG5cdC8qIDEqNjU0MzBCcnRCb3JkZXIgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCAweDAyNjYgLyogQnJ0RW5kQm9yZGVycyAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0NFTExTVFlMRVhGU19iaW4oYmEvKjo6LCBkYXRhKi8pIHtcblx0dmFyIGNudCA9IDE7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjcyIC8qIEJydEJlZ2luQ2VsbFN0eWxlWEZzICovLCB3cml0ZV9VSW50MzJMRShjbnQpKTtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwMkYgLyogQnJ0WEYgKi8sIHdyaXRlX0JydFhGKHtcblx0XHRudW1GbXRJZDogMCxcblx0XHRmb250SWQ6ICAgMCxcblx0XHRmaWxsSWQ6ICAgMCxcblx0XHRib3JkZXJJZDogMFxuXHR9LCAweEZGRkYpKTtcblx0LyogMSo2NTQzMChCcnRYRiAqRlJUKSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI3MyAvKiBCcnRFbmRDZWxsU3R5bGVYRnMgKi8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9DRUxMWEZTX2JpbihiYSwgZGF0YSkge1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI2OSAvKiBCcnRCZWdpbkNlbGxYRnMgKi8sIHdyaXRlX1VJbnQzMkxFKGRhdGEubGVuZ3RoKSk7XG5cdGRhdGEuZm9yRWFjaChmdW5jdGlvbihjKSB7IHdyaXRlX3JlY29yZChiYSwgMHgwMDJGIC8qIEJydFhGICovLCB3cml0ZV9CcnRYRihjLDApKTsgfSk7XG5cdC8qIDEqNjU0MzAoQnJ0WEYgKkZSVCkgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCAweDAyNkEgLyogQnJ0RW5kQ2VsbFhGcyAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX1NUWUxFU19iaW4oYmEvKjo6LCBkYXRhKi8pIHtcblx0dmFyIGNudCA9IDE7XG5cblx0d3JpdGVfcmVjb3JkKGJhLCAweDAyNkIgLyogQnJ0QmVnaW5TdHlsZXMgKi8sIHdyaXRlX1VJbnQzMkxFKGNudCkpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDAzMCAvKiBCcnRTdHlsZSAqLywgd3JpdGVfQnJ0U3R5bGUoe1xuXHRcdHhmSWQ6MCxcblx0XHRidWlsdGluSWQ6MCxcblx0XHRuYW1lOlwiTm9ybWFsXCJcblx0fSkpO1xuXHQvKiAxKjY1NDMwKEJydFN0eWxlICpGUlQpICovXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjZDIC8qIEJydEVuZFN0eWxlcyAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0RYRlNfYmluKGJhLyo6OiwgZGF0YSovKSB7XG5cdHZhciBjbnQgPSAwO1xuXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMUY5IC8qIEJydEJlZ2luRFhGcyAqLywgd3JpdGVfVUludDMyTEUoY250KSk7XG5cdC8qICoyMTQ3NDgzNjQ3KEJydERYRiAqRlJUKSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDFGQSAvKiBCcnRFbmREWEZzICovKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfVEFCTEVTVFlMRVNfYmluKGJhLyo6OiwgZGF0YSovKSB7XG5cdHZhciBjbnQgPSAwO1xuXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMUZDIC8qIEJydEJlZ2luVGFibGVTdHlsZXMgKi8sIHdyaXRlX0JydEJlZ2luVGFibGVTdHlsZXMoY250LCBcIlRhYmxlU3R5bGVNZWRpdW05XCIsIFwiUGl2b3RTdHlsZU1lZGl1bTRcIikpO1xuXHQvKiAqVEFCTEVTVFlMRSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDFGRCAvKiBCcnRFbmRUYWJsZVN0eWxlcyAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0NPTE9SUEFMRVRURV9iaW4oLyo6OmJhLCBkYXRhKi8pIHtcblx0cmV0dXJuO1xuXHQvKiBCcnRCZWdpbkNvbG9yUGFsZXR0ZSBbSU5ERVhFRENPTE9SU10gW01SVUNPTE9SU10gQnJ0RW5kQ29sb3JQYWxldHRlICovXG59XG5cbi8qIFtNUy1YTFNCXSAyLjEuNy41MCBTdHlsZXMgKi9cbmZ1bmN0aW9uIHdyaXRlX3N0eV9iaW4od2IsIG9wdHMpIHtcblx0dmFyIGJhID0gYnVmX2FycmF5KCk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMTE2IC8qIEJydEJlZ2luU3R5bGVTaGVldCAqLyk7XG5cdHdyaXRlX0ZNVFNfYmluKGJhLCB3Yi5TU0YpO1xuXHR3cml0ZV9GT05UU19iaW4oYmEsIHdiKTtcblx0d3JpdGVfRklMTFNfYmluKGJhLCB3Yik7XG5cdHdyaXRlX0JPUkRFUlNfYmluKGJhLCB3Yik7XG5cdHdyaXRlX0NFTExTVFlMRVhGU19iaW4oYmEsIHdiKTtcblx0d3JpdGVfQ0VMTFhGU19iaW4oYmEsIG9wdHMuY2VsbFhmcyk7XG5cdHdyaXRlX1NUWUxFU19iaW4oYmEsIHdiKTtcblx0d3JpdGVfRFhGU19iaW4oYmEsIHdiKTtcblx0d3JpdGVfVEFCTEVTVFlMRVNfYmluKGJhLCB3Yik7XG5cdHdyaXRlX0NPTE9SUEFMRVRURV9iaW4oYmEsIHdiKTtcblx0LyogRlJUU1RZTEVTSEVFVCovXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMTE3IC8qIEJydEVuZFN0eWxlU2hlZXQgKi8pO1xuXHRyZXR1cm4gYmEuZW5kKCk7XG59XG4vKiBFdmVuIHRob3VnaCB0aGVtZSBsYXlvdXQgaXMgZGsxIGx0MSBkazIgbHQyLCB0cnVlIG9yZGVyIGlzIGx0MSBkazEgbHQyIGRrMiAqL1xudmFyIFhMU1hUaGVtZUNsclNjaGVtZSA9IFtcblx0JzwvYTpsdDE+JywgJzwvYTpkazE+JywgJzwvYTpsdDI+JywgJzwvYTpkazI+Jyxcblx0JzwvYTphY2NlbnQxPicsICc8L2E6YWNjZW50Mj4nLCAnPC9hOmFjY2VudDM+Jyxcblx0JzwvYTphY2NlbnQ0PicsICc8L2E6YWNjZW50NT4nLCAnPC9hOmFjY2VudDY+Jyxcblx0JzwvYTpobGluaz4nLCAnPC9hOmZvbEhsaW5rPidcbl07XG4vKiAyMC4xLjYuMiBjbHJTY2hlbWUgQ1RfQ29sb3JTY2hlbWUgKi9cbmZ1bmN0aW9uIHBhcnNlX2NsclNjaGVtZSh0LCB0aGVtZXMsIG9wdHMpIHtcblx0dGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lID0gW107XG5cdHZhciBjb2xvciA9IHt9O1xuXHQodFswXS5tYXRjaCh0YWdyZWdleCl8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKHgpO1xuXHRcdHN3aXRjaCh5WzBdKSB7XG5cdFx0XHQvKiAyMC4xLjYuMiBjbHJTY2hlbWUgKENvbG9yIFNjaGVtZSkgQ1RfQ29sb3JTY2hlbWUgKi9cblx0XHRcdGNhc2UgJzxhOmNsclNjaGVtZSc6IGNhc2UgJzwvYTpjbHJTY2hlbWU+JzogYnJlYWs7XG5cblx0XHRcdC8qIDIwLjEuMi4zLjMyIHNyZ2JDbHIgQ1RfU1JnYkNvbG9yICovXG5cdFx0XHRjYXNlICc8YTpzcmdiQ2xyJzpcblx0XHRcdFx0Y29sb3IucmdiID0geS52YWw7IGJyZWFrO1xuXG5cdFx0XHQvKiAyMC4xLjIuMy4zMyBzeXNDbHIgQ1RfU3lzdGVtQ29sb3IgKi9cblx0XHRcdGNhc2UgJzxhOnN5c0Nscic6XG5cdFx0XHRcdGNvbG9yLnJnYiA9IHkubGFzdENscjsgYnJlYWs7XG5cblx0XHRcdC8qIDIwLjEuNC4xLjEgYWNjZW50MSAoQWNjZW50IDEpICovXG5cdFx0XHQvKiAyMC4xLjQuMS4yIGFjY2VudDIgKEFjY2VudCAyKSAqL1xuXHRcdFx0LyogMjAuMS40LjEuMyBhY2NlbnQzIChBY2NlbnQgMykgKi9cblx0XHRcdC8qIDIwLjEuNC4xLjQgYWNjZW50NCAoQWNjZW50IDQpICovXG5cdFx0XHQvKiAyMC4xLjQuMS41IGFjY2VudDUgKEFjY2VudCA1KSAqL1xuXHRcdFx0LyogMjAuMS40LjEuNiBhY2NlbnQ2IChBY2NlbnQgNikgKi9cblx0XHRcdC8qIDIwLjEuNC4xLjkgZGsxIChEYXJrIDEpICovXG5cdFx0XHQvKiAyMC4xLjQuMS4xMCBkazIgKERhcmsgMikgKi9cblx0XHRcdC8qIDIwLjEuNC4xLjE1IGZvbEhsaW5rIChGb2xsb3dlZCBIeXBlcmxpbmspICovXG5cdFx0XHQvKiAyMC4xLjQuMS4xOSBobGluayAoSHlwZXJsaW5rKSAqL1xuXHRcdFx0LyogMjAuMS40LjEuMjIgbHQxIChMaWdodCAxKSAqL1xuXHRcdFx0LyogMjAuMS40LjEuMjMgbHQyIChMaWdodCAyKSAqL1xuXHRcdFx0Y2FzZSAnPGE6ZGsxPic6IGNhc2UgJzwvYTpkazE+Jzpcblx0XHRcdGNhc2UgJzxhOmx0MT4nOiBjYXNlICc8L2E6bHQxPic6XG5cdFx0XHRjYXNlICc8YTpkazI+JzogY2FzZSAnPC9hOmRrMj4nOlxuXHRcdFx0Y2FzZSAnPGE6bHQyPic6IGNhc2UgJzwvYTpsdDI+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDE+JzogY2FzZSAnPC9hOmFjY2VudDE+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDI+JzogY2FzZSAnPC9hOmFjY2VudDI+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDM+JzogY2FzZSAnPC9hOmFjY2VudDM+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDQ+JzogY2FzZSAnPC9hOmFjY2VudDQ+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDU+JzogY2FzZSAnPC9hOmFjY2VudDU+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDY+JzogY2FzZSAnPC9hOmFjY2VudDY+Jzpcblx0XHRcdGNhc2UgJzxhOmhsaW5rPic6IGNhc2UgJzwvYTpobGluaz4nOlxuXHRcdFx0Y2FzZSAnPGE6Zm9sSGxpbms+JzogY2FzZSAnPC9hOmZvbEhsaW5rPic6XG5cdFx0XHRcdGlmICh5WzBdLmNoYXJBdCgxKSA9PT0gJy8nKSB7XG5cdFx0XHRcdFx0dGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lW1hMU1hUaGVtZUNsclNjaGVtZS5pbmRleE9mKHlbMF0pXSA9IGNvbG9yO1xuXHRcdFx0XHRcdGNvbG9yID0ge307XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29sb3IubmFtZSA9IHlbMF0uc2xpY2UoMywgeVswXS5sZW5ndGggLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDogaWYob3B0cyAmJiBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKCdVbnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIGNsclNjaGVtZScpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qIDIwLjEuNC4xLjE4IGZvbnRTY2hlbWUgQ1RfRm9udFNjaGVtZSAqL1xuZnVuY3Rpb24gcGFyc2VfZm9udFNjaGVtZSgvKjo6dCwgdGhlbWVzLCBvcHRzKi8pIHsgfVxuXG4vKiAyMC4xLjQuMS4xNSBmbXRTY2hlbWUgQ1RfU3R5bGVNYXRyaXggKi9cbmZ1bmN0aW9uIHBhcnNlX2ZtdFNjaGVtZSgvKjo6dCwgdGhlbWVzLCBvcHRzKi8pIHsgfVxuXG52YXIgY2xyc3JlZ2V4ID0gLzxhOmNsclNjaGVtZShbXj5dKik+W1xcc1xcU10qPFxcL2E6Y2xyU2NoZW1lPi87XG52YXIgZm50c3JlZ2V4ID0gLzxhOmZvbnRTY2hlbWUoW14+XSopPltcXHNcXFNdKjxcXC9hOmZvbnRTY2hlbWU+LztcbnZhciBmbXRzcmVnZXggPSAvPGE6Zm10U2NoZW1lKFtePl0qKT5bXFxzXFxTXSo8XFwvYTpmbXRTY2hlbWU+LztcblxuLyogMjAuMS42LjEwIHRoZW1lRWxlbWVudHMgQ1RfQmFzZVN0eWxlcyAqL1xuZnVuY3Rpb24gcGFyc2VfdGhlbWVFbGVtZW50cyhkYXRhLCB0aGVtZXMsIG9wdHMpIHtcblx0dGhlbWVzLnRoZW1lRWxlbWVudHMgPSB7fTtcblxuXHR2YXIgdDtcblxuXHRbXG5cdFx0LyogY2xyU2NoZW1lIENUX0NvbG9yU2NoZW1lICovXG5cdFx0WydjbHJTY2hlbWUnLCBjbHJzcmVnZXgsIHBhcnNlX2NsclNjaGVtZV0sXG5cdFx0LyogZm9udFNjaGVtZSBDVF9Gb250U2NoZW1lICovXG5cdFx0Wydmb250U2NoZW1lJywgZm50c3JlZ2V4LCBwYXJzZV9mb250U2NoZW1lXSxcblx0XHQvKiBmbXRTY2hlbWUgQ1RfU3R5bGVNYXRyaXggKi9cblx0XHRbJ2ZtdFNjaGVtZScsIGZtdHNyZWdleCwgcGFyc2VfZm10U2NoZW1lXVxuXHRdLmZvckVhY2goZnVuY3Rpb24obSkge1xuXHRcdGlmKCEodD1kYXRhLm1hdGNoKG1bMV0pKSkgdGhyb3cgbmV3IEVycm9yKG1bMF0gKyAnIG5vdCBmb3VuZCBpbiB0aGVtZUVsZW1lbnRzJyk7XG5cdFx0bVsyXSh0LCB0aGVtZXMsIG9wdHMpO1xuXHR9KTtcbn1cblxudmFyIHRoZW1lbHRyZWdleCA9IC88YTp0aGVtZUVsZW1lbnRzKFtePl0qKT5bXFxzXFxTXSo8XFwvYTp0aGVtZUVsZW1lbnRzPi87XG5cbi8qIDE0LjIuNyBUaGVtZSBQYXJ0ICovXG5mdW5jdGlvbiBwYXJzZV90aGVtZV94bWwoZGF0YS8qOnN0cmluZyovLCBvcHRzKSB7XG5cdC8qIDIwLjEuNi45IHRoZW1lIENUX09mZmljZVN0eWxlU2hlZXQgKi9cblx0aWYoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIGRhdGEgPSB3cml0ZV90aGVtZSgpO1xuXG5cdHZhciB0O1xuXHR2YXIgdGhlbWVzID0ge307XG5cblx0LyogdGhlbWVFbGVtZW50cyBDVF9CYXNlU3R5bGVzICovXG5cdGlmKCEodD1kYXRhLm1hdGNoKHRoZW1lbHRyZWdleCkpKSB0aHJvdyBuZXcgRXJyb3IoJ3RoZW1lRWxlbWVudHMgbm90IGZvdW5kIGluIHRoZW1lJyk7XG5cdHBhcnNlX3RoZW1lRWxlbWVudHModFswXSwgdGhlbWVzLCBvcHRzKTtcblx0dGhlbWVzLnJhdyA9IGRhdGE7XG5cdHJldHVybiB0aGVtZXM7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3RoZW1lKFRoZW1lcywgb3B0cykvKjpzdHJpbmcqLyB7XG5cdGlmKG9wdHMgJiYgb3B0cy50aGVtZVhMU1gpIHJldHVybiBvcHRzLnRoZW1lWExTWDtcblx0aWYoVGhlbWVzICYmIHR5cGVvZiBUaGVtZXMucmF3ID09IFwic3RyaW5nXCIpIHJldHVybiBUaGVtZXMucmF3O1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSXTtcblx0b1tvLmxlbmd0aF0gPSAnPGE6dGhlbWUgeG1sbnM6YT1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluXCIgbmFtZT1cIk9mZmljZSBUaGVtZVwiPic7XG5cdG9bby5sZW5ndGhdID0gICc8YTp0aGVtZUVsZW1lbnRzPic7XG5cblx0b1tvLmxlbmd0aF0gPSAgICc8YTpjbHJTY2hlbWUgbmFtZT1cIk9mZmljZVwiPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmRrMT48YTpzeXNDbHIgdmFsPVwid2luZG93VGV4dFwiIGxhc3RDbHI9XCIwMDAwMDBcIi8+PC9hOmRrMT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpsdDE+PGE6c3lzQ2xyIHZhbD1cIndpbmRvd1wiIGxhc3RDbHI9XCJGRkZGRkZcIi8+PC9hOmx0MT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpkazI+PGE6c3JnYkNsciB2YWw9XCIxRjQ5N0RcIi8+PC9hOmRrMj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpsdDI+PGE6c3JnYkNsciB2YWw9XCJFRUVDRTFcIi8+PC9hOmx0Mj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTphY2NlbnQxPjxhOnNyZ2JDbHIgdmFsPVwiNEY4MUJEXCIvPjwvYTphY2NlbnQxPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmFjY2VudDI+PGE6c3JnYkNsciB2YWw9XCJDMDUwNERcIi8+PC9hOmFjY2VudDI+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6YWNjZW50Mz48YTpzcmdiQ2xyIHZhbD1cIjlCQkI1OVwiLz48L2E6YWNjZW50Mz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTphY2NlbnQ0PjxhOnNyZ2JDbHIgdmFsPVwiODA2NEEyXCIvPjwvYTphY2NlbnQ0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmFjY2VudDU+PGE6c3JnYkNsciB2YWw9XCI0QkFDQzZcIi8+PC9hOmFjY2VudDU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6YWNjZW50Nj48YTpzcmdiQ2xyIHZhbD1cIkY3OTY0NlwiLz48L2E6YWNjZW50Nj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpobGluaz48YTpzcmdiQ2xyIHZhbD1cIjAwMDBGRlwiLz48L2E6aGxpbms+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6Zm9sSGxpbms+PGE6c3JnYkNsciB2YWw9XCI4MDAwODBcIi8+PC9hOmZvbEhsaW5rPic7XG5cdG9bby5sZW5ndGhdID0gICAnPC9hOmNsclNjaGVtZT4nO1xuXG5cdG9bby5sZW5ndGhdID0gICAnPGE6Zm9udFNjaGVtZSBuYW1lPVwiT2ZmaWNlXCI+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6bWFqb3JGb250Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpsYXRpbiB0eXBlZmFjZT1cIkNhbWJyaWFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmVhIHR5cGVmYWNlPVwiXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpjcyB0eXBlZmFjZT1cIlwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJKcGFuXCIgdHlwZWZhY2U9XCLvvK3vvLMg77yw44K044K344OD44KvXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkhhbmdcIiB0eXBlZmFjZT1cIuunkeydgCDqs6DrlJVcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiSGFuc1wiIHR5cGVmYWNlPVwi5a6L5L2TXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkhhbnRcIiB0eXBlZmFjZT1cIuaWsOe0sOaYjumrlFwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJBcmFiXCIgdHlwZWZhY2U9XCJUaW1lcyBOZXcgUm9tYW5cIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiSGViclwiIHR5cGVmYWNlPVwiVGltZXMgTmV3IFJvbWFuXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRoYWlcIiB0eXBlZmFjZT1cIlRhaG9tYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJFdGhpXCIgdHlwZWZhY2U9XCJOeWFsYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJCZW5nXCIgdHlwZWZhY2U9XCJWcmluZGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiR3VqclwiIHR5cGVmYWNlPVwiU2hydXRpXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIktobXJcIiB0eXBlZmFjZT1cIk1vb2xCb3JhblwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJLbmRhXCIgdHlwZWZhY2U9XCJUdW5nYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJHdXJ1XCIgdHlwZWZhY2U9XCJSYWF2aVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJDYW5zXCIgdHlwZWZhY2U9XCJFdXBoZW1pYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJDaGVyXCIgdHlwZWZhY2U9XCJQbGFudGFnZW5ldCBDaGVyb2tlZVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJZaWlpXCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgWWkgQmFpdGlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVGlidFwiIHR5cGVmYWNlPVwiTWljcm9zb2Z0IEhpbWFsYXlhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRoYWFcIiB0eXBlZmFjZT1cIk1WIEJvbGlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiRGV2YVwiIHR5cGVmYWNlPVwiTWFuZ2FsXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRlbHVcIiB0eXBlZmFjZT1cIkdhdXRhbWlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVGFtbFwiIHR5cGVmYWNlPVwiTGF0aGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiU3lyY1wiIHR5cGVmYWNlPVwiRXN0cmFuZ2VsbyBFZGVzc2FcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiT3J5YVwiIHR5cGVmYWNlPVwiS2FsaW5nYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJNbHltXCIgdHlwZWZhY2U9XCJLYXJ0aWthXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkxhb29cIiB0eXBlZmFjZT1cIkRva0NoYW1wYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJTaW5oXCIgdHlwZWZhY2U9XCJJc2tvb2xhIFBvdGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiTW9uZ1wiIHR5cGVmYWNlPVwiTW9uZ29saWFuIEJhaXRpXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlZpZXRcIiB0eXBlZmFjZT1cIlRpbWVzIE5ldyBSb21hblwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJVaWdoXCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgVWlnaHVyXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkdlb3JcIiB0eXBlZmFjZT1cIlN5bGZhZW5cIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPC9hOm1ham9yRm9udD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTptaW5vckZvbnQ+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmxhdGluIHR5cGVmYWNlPVwiQ2FsaWJyaVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6ZWEgdHlwZWZhY2U9XCJcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmNzIHR5cGVmYWNlPVwiXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkpwYW5cIiB0eXBlZmFjZT1cIu+8re+8syDvvLDjgrTjgrfjg4Pjgq9cIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiSGFuZ1wiIHR5cGVmYWNlPVwi66eR7J2AIOqzoOuUlVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJIYW5zXCIgdHlwZWZhY2U9XCLlrovkvZNcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiSGFudFwiIHR5cGVmYWNlPVwi5paw57Sw5piO6auUXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkFyYWJcIiB0eXBlZmFjZT1cIkFyaWFsXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkhlYnJcIiB0eXBlZmFjZT1cIkFyaWFsXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRoYWlcIiB0eXBlZmFjZT1cIlRhaG9tYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJFdGhpXCIgdHlwZWZhY2U9XCJOeWFsYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJCZW5nXCIgdHlwZWZhY2U9XCJWcmluZGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiR3VqclwiIHR5cGVmYWNlPVwiU2hydXRpXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIktobXJcIiB0eXBlZmFjZT1cIkRhdW5QZW5oXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIktuZGFcIiB0eXBlZmFjZT1cIlR1bmdhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkd1cnVcIiB0eXBlZmFjZT1cIlJhYXZpXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkNhbnNcIiB0eXBlZmFjZT1cIkV1cGhlbWlhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkNoZXJcIiB0eXBlZmFjZT1cIlBsYW50YWdlbmV0IENoZXJva2VlXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIllpaWlcIiB0eXBlZmFjZT1cIk1pY3Jvc29mdCBZaSBCYWl0aVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJUaWJ0XCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgSGltYWxheWFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVGhhYVwiIHR5cGVmYWNlPVwiTVYgQm9saVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJEZXZhXCIgdHlwZWZhY2U9XCJNYW5nYWxcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVGVsdVwiIHR5cGVmYWNlPVwiR2F1dGFtaVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJUYW1sXCIgdHlwZWZhY2U9XCJMYXRoYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJTeXJjXCIgdHlwZWZhY2U9XCJFc3RyYW5nZWxvIEVkZXNzYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJPcnlhXCIgdHlwZWZhY2U9XCJLYWxpbmdhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIk1seW1cIiB0eXBlZmFjZT1cIkthcnRpa2FcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiTGFvb1wiIHR5cGVmYWNlPVwiRG9rQ2hhbXBhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlNpbmhcIiB0eXBlZmFjZT1cIklza29vbGEgUG90YVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJNb25nXCIgdHlwZWZhY2U9XCJNb25nb2xpYW4gQmFpdGlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVmlldFwiIHR5cGVmYWNlPVwiQXJpYWxcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVWlnaFwiIHR5cGVmYWNlPVwiTWljcm9zb2Z0IFVpZ2h1clwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJHZW9yXCIgdHlwZWZhY2U9XCJTeWxmYWVuXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzwvYTptaW5vckZvbnQ+Jztcblx0b1tvLmxlbmd0aF0gPSAgICc8L2E6Zm9udFNjaGVtZT4nO1xuXG5cdG9bby5sZW5ndGhdID0gICAnPGE6Zm10U2NoZW1lIG5hbWU9XCJPZmZpY2VcIj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpmaWxsU3R5bGVMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOnNvbGlkRmlsbD48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIi8+PC9hOnNvbGlkRmlsbD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Z3JhZEZpbGwgcm90V2l0aFNoYXBlPVwiMVwiPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6Z3NMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnRpbnQgdmFsPVwiNTAwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjMwMDAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpncyBwb3M9XCIzNTAwMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnRpbnQgdmFsPVwiMzcwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjMwMDAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpncyBwb3M9XCIxMDAwMDBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjE1MDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIzNTAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8L2E6Z3NMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8YTpsaW4gYW5nPVwiMTYyMDAwMDBcIiBzY2FsZWQ9XCIxXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8L2E6Z3JhZEZpbGw+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmdyYWRGaWxsIHJvdFdpdGhTaGFwZT1cIjFcIj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOmdzTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOmdzIHBvcz1cIjBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjEwMDAwMFwiLz48YTpzaGFkZSB2YWw9XCIxMDAwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjEzMDAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpncyBwb3M9XCIxMDAwMDBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjUwMDAwXCIvPjxhOnNoYWRlIHZhbD1cIjEwMDAwMFwiLz48YTpzYXRNb2QgdmFsPVwiMzUwMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPC9hOmdzTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6bGluIGFuZz1cIjE2MjAwMDAwXCIgc2NhbGVkPVwiMFwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPC9hOmdyYWRGaWxsPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzwvYTpmaWxsU3R5bGVMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6bG5TdHlsZUxzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6bG4gdz1cIjk1MjVcIiBjYXA9XCJmbGF0XCIgY21wZD1cInNuZ1wiIGFsZ249XCJjdHJcIj48YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6c2hhZGUgdmFsPVwiOTUwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjEwNTAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpzb2xpZEZpbGw+PGE6cHJzdERhc2ggdmFsPVwic29saWRcIi8+PC9hOmxuPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpsbiB3PVwiMjU0MDBcIiBjYXA9XCJmbGF0XCIgY21wZD1cInNuZ1wiIGFsZ249XCJjdHJcIj48YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCIvPjwvYTpzb2xpZEZpbGw+PGE6cHJzdERhc2ggdmFsPVwic29saWRcIi8+PC9hOmxuPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpsbiB3PVwiMzgxMDBcIiBjYXA9XCJmbGF0XCIgY21wZD1cInNuZ1wiIGFsZ249XCJjdHJcIj48YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCIvPjwvYTpzb2xpZEZpbGw+PGE6cHJzdERhc2ggdmFsPVwic29saWRcIi8+PC9hOmxuPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzwvYTpsblN0eWxlTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmVmZmVjdFN0eWxlTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTplZmZlY3RTdHlsZT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOmVmZmVjdExzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpvdXRlclNoZHcgYmx1clJhZD1cIjQwMDAwXCIgZGlzdD1cIjIwMDAwXCIgZGlyPVwiNTQwMDAwMFwiIHJvdFdpdGhTaGFwZT1cIjBcIj48YTpzcmdiQ2xyIHZhbD1cIjAwMDAwMFwiPjxhOmFscGhhIHZhbD1cIjM4MDAwXCIvPjwvYTpzcmdiQ2xyPjwvYTpvdXRlclNoZHc+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8L2E6ZWZmZWN0THN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8L2E6ZWZmZWN0U3R5bGU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmVmZmVjdFN0eWxlPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6ZWZmZWN0THN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOm91dGVyU2hkdyBibHVyUmFkPVwiNDAwMDBcIiBkaXN0PVwiMjMwMDBcIiBkaXI9XCI1NDAwMDAwXCIgcm90V2l0aFNoYXBlPVwiMFwiPjxhOnNyZ2JDbHIgdmFsPVwiMDAwMDAwXCI+PGE6YWxwaGEgdmFsPVwiMzUwMDBcIi8+PC9hOnNyZ2JDbHI+PC9hOm91dGVyU2hkdz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzwvYTplZmZlY3RMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzwvYTplZmZlY3RTdHlsZT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6ZWZmZWN0U3R5bGU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8YTplZmZlY3RMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6b3V0ZXJTaGR3IGJsdXJSYWQ9XCI0MDAwMFwiIGRpc3Q9XCIyMzAwMFwiIGRpcj1cIjU0MDAwMDBcIiByb3RXaXRoU2hhcGU9XCIwXCI+PGE6c3JnYkNsciB2YWw9XCIwMDAwMDBcIj48YTphbHBoYSB2YWw9XCIzNTAwMFwiLz48L2E6c3JnYkNscj48L2E6b3V0ZXJTaGR3Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPC9hOmVmZmVjdExzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOnNjZW5lM2Q+PGE6Y2FtZXJhIHByc3Q9XCJvcnRob2dyYXBoaWNGcm9udFwiPjxhOnJvdCBsYXQ9XCIwXCIgbG9uPVwiMFwiIHJldj1cIjBcIi8+PC9hOmNhbWVyYT48YTpsaWdodFJpZyByaWc9XCJ0aHJlZVB0XCIgZGlyPVwidFwiPjxhOnJvdCBsYXQ9XCIwXCIgbG9uPVwiMFwiIHJldj1cIjEyMDAwMDBcIi8+PC9hOmxpZ2h0UmlnPjwvYTpzY2VuZTNkPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6c3AzZD48YTpiZXZlbFQgdz1cIjYzNTAwXCIgaD1cIjI1NDAwXCIvPjwvYTpzcDNkPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8L2E6ZWZmZWN0U3R5bGU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPC9hOmVmZmVjdFN0eWxlTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmJnRmlsbFN0eWxlTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCIvPjwvYTpzb2xpZEZpbGw+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmdyYWRGaWxsIHJvdFdpdGhTaGFwZT1cIjFcIj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOmdzTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOmdzIHBvcz1cIjBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjQwMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIzNTAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiNDAwMDBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjQ1MDAwXCIvPjxhOnNoYWRlIHZhbD1cIjk5MDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIzNTAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiMTAwMDAwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6c2hhZGUgdmFsPVwiMjAwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjI1NTAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzwvYTpnc0xzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOnBhdGggcGF0aD1cImNpcmNsZVwiPjxhOmZpbGxUb1JlY3QgbD1cIjUwMDAwXCIgdD1cIi04MDAwMFwiIHI9XCI1MDAwMFwiIGI9XCIxODAwMDBcIi8+PC9hOnBhdGg+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzwvYTpncmFkRmlsbD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Z3JhZEZpbGwgcm90V2l0aFNoYXBlPVwiMVwiPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6Z3NMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnRpbnQgdmFsPVwiODAwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjMwMDAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpncyBwb3M9XCIxMDAwMDBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTpzaGFkZSB2YWw9XCIzMDAwMFwiLz48YTpzYXRNb2QgdmFsPVwiMjAwMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPC9hOmdzTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6cGF0aCBwYXRoPVwiY2lyY2xlXCI+PGE6ZmlsbFRvUmVjdCBsPVwiNTAwMDBcIiB0PVwiNTAwMDBcIiByPVwiNTAwMDBcIiBiPVwiNTAwMDBcIi8+PC9hOnBhdGg+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzwvYTpncmFkRmlsbD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8L2E6YmdGaWxsU3R5bGVMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICc8L2E6Zm10U2NoZW1lPic7XG5cdG9bby5sZW5ndGhdID0gICc8L2E6dGhlbWVFbGVtZW50cz4nO1xuXG5cdG9bby5sZW5ndGhdID0gICc8YTpvYmplY3REZWZhdWx0cz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgJzxhOnNwRGVmPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOnNwUHIvPjxhOmJvZHlQci8+PGE6bHN0U3R5bGUvPjxhOnN0eWxlPjxhOmxuUmVmIGlkeD1cIjFcIj48YTpzY2hlbWVDbHIgdmFsPVwiYWNjZW50MVwiLz48L2E6bG5SZWY+PGE6ZmlsbFJlZiBpZHg9XCIzXCI+PGE6c2NoZW1lQ2xyIHZhbD1cImFjY2VudDFcIi8+PC9hOmZpbGxSZWY+PGE6ZWZmZWN0UmVmIGlkeD1cIjJcIj48YTpzY2hlbWVDbHIgdmFsPVwiYWNjZW50MVwiLz48L2E6ZWZmZWN0UmVmPjxhOmZvbnRSZWYgaWR4PVwibWlub3JcIj48YTpzY2hlbWVDbHIgdmFsPVwibHQxXCIvPjwvYTpmb250UmVmPjwvYTpzdHlsZT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgJzwvYTpzcERlZj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgJzxhOmxuRGVmPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOnNwUHIvPjxhOmJvZHlQci8+PGE6bHN0U3R5bGUvPjxhOnN0eWxlPjxhOmxuUmVmIGlkeD1cIjJcIj48YTpzY2hlbWVDbHIgdmFsPVwiYWNjZW50MVwiLz48L2E6bG5SZWY+PGE6ZmlsbFJlZiBpZHg9XCIwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cImFjY2VudDFcIi8+PC9hOmZpbGxSZWY+PGE6ZWZmZWN0UmVmIGlkeD1cIjFcIj48YTpzY2hlbWVDbHIgdmFsPVwiYWNjZW50MVwiLz48L2E6ZWZmZWN0UmVmPjxhOmZvbnRSZWYgaWR4PVwibWlub3JcIj48YTpzY2hlbWVDbHIgdmFsPVwidHgxXCIvPjwvYTpmb250UmVmPjwvYTpzdHlsZT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgJzwvYTpsbkRlZj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAnPC9hOm9iamVjdERlZmF1bHRzPic7XG5cdG9bby5sZW5ndGhdID0gICc8YTpleHRyYUNsclNjaGVtZUxzdC8+Jztcblx0b1tvLmxlbmd0aF0gPSAnPC9hOnRoZW1lPic7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG4vKiBbTVMtWExTXSAyLjQuMzI2IFRPRE86IHBheWxvYWQgaXMgYSB6aXAgZmlsZSAqL1xuZnVuY3Rpb24gcGFyc2VfVGhlbWUoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBkd1RoZW1lVmVyc2lvbiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0aWYoZHdUaGVtZVZlcnNpb24gPT09IDEyNDIyNikgcmV0dXJuO1xuXHRpZighb3B0cy5jZWxsU3R5bGVzKSB7IGJsb2IubCA9IGVuZDsgcmV0dXJuOyB9XG5cdHZhciBkYXRhID0gYmxvYi5zbGljZShibG9iLmwpO1xuXHRibG9iLmwgPSBlbmQ7XG5cdHZhciB6aXA7IHRyeSB7IHppcCA9IHppcF9yZWFkKGRhdGEsIHt0eXBlOiBcImFycmF5XCJ9KTsgfSBjYXRjaChlKSB7IHJldHVybjsgfVxuXHR2YXIgdGhlbWVYTUwgPSBnZXR6aXBzdHIoemlwLCBcInRoZW1lL3RoZW1lL3RoZW1lMS54bWxcIiwgdHJ1ZSk7XG5cdGlmKCF0aGVtZVhNTCkgcmV0dXJuO1xuXHRyZXR1cm4gcGFyc2VfdGhlbWVfeG1sKHRoZW1lWE1MLCBvcHRzKTtcbn1cblxuLyogMi41LjQ5ICovXG5mdW5jdGlvbiBwYXJzZV9Db2xvclRoZW1lKGJsb2IvKjo6LCBsZW5ndGgqLykgeyByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDQpOyB9XG5cbi8qIDIuNS4xNTUgKi9cbmZ1bmN0aW9uIHBhcnNlX0Z1bGxDb2xvckV4dChibG9iLyo6OiwgbGVuZ3RoKi8pIHtcblx0dmFyIG8gPSB7fTtcblx0by54Y2xyVHlwZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0by5uVGludFNoYWRlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRzd2l0Y2goby54Y2xyVHlwZSkge1xuXHRcdGNhc2UgMDogYmxvYi5sICs9IDQ7IGJyZWFrO1xuXHRcdGNhc2UgMTogby54Y2xyVmFsdWUgPSBwYXJzZV9JY3ZYRihibG9iLCA0KTsgYnJlYWs7XG5cdFx0Y2FzZSAyOiBvLnhjbHJWYWx1ZSA9IHBhcnNlX0xvbmdSR0JBKGJsb2IsIDQpOyBicmVhaztcblx0XHRjYXNlIDM6IG8ueGNsclZhbHVlID0gcGFyc2VfQ29sb3JUaGVtZShibG9iLCA0KTsgYnJlYWs7XG5cdFx0Y2FzZSA0OiBibG9iLmwgKz0gNDsgYnJlYWs7XG5cdH1cblx0YmxvYi5sICs9IDg7XG5cdHJldHVybiBvO1xufVxuXG4vKiAyLjUuMTY0IFRPRE86IHJlYWQgNyBiaXRzKi9cbmZ1bmN0aW9uIHBhcnNlX0ljdlhGKGJsb2IsIGxlbmd0aCkge1xuXHRyZXR1cm4gcGFyc2Vub29wKGJsb2IsIGxlbmd0aCk7XG59XG5cbi8qIDIuNS4yODAgKi9cbmZ1bmN0aW9uIHBhcnNlX1hGRXh0R3JhZGllbnQoYmxvYiwgbGVuZ3RoKSB7XG5cdHJldHVybiBwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoKTtcbn1cblxuLyogW01TLVhMU10gMi41LjEwOCAqL1xuZnVuY3Rpb24gcGFyc2VfRXh0UHJvcChibG9iLyo6OiwgbGVuZ3RoKi8pLyo6QXJyYXk8YW55PiovIHtcblx0dmFyIGV4dFR5cGUgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjYiA9IGJsb2IucmVhZF9zaGlmdCgyKSAtIDQ7XG5cdHZhciBvID0gW2V4dFR5cGVdO1xuXHRzd2l0Y2goZXh0VHlwZSkge1xuXHRcdGNhc2UgMHgwNDogY2FzZSAweDA1OiBjYXNlIDB4MDc6IGNhc2UgMHgwODpcblx0XHRjYXNlIDB4MDk6IGNhc2UgMHgwQTogY2FzZSAweDBCOiBjYXNlIDB4MEQ6XG5cdFx0XHRvWzFdID0gcGFyc2VfRnVsbENvbG9yRXh0KGJsb2IsIGNiKTsgYnJlYWs7XG5cdFx0Y2FzZSAweDA2OiBvWzFdID0gcGFyc2VfWEZFeHRHcmFkaWVudChibG9iLCBjYik7IGJyZWFrO1xuXHRcdGNhc2UgMHgwRTogY2FzZSAweDBGOiBvWzFdID0gYmxvYi5yZWFkX3NoaWZ0KGNiID09PSAxID8gMSA6IDIpOyBicmVhaztcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgRXh0UHJvcCB0eXBlOiBcIiArIGV4dFR5cGUgKyBcIiBcIiArIGNiKTtcblx0fVxuXHRyZXR1cm4gbztcbn1cblxuLyogMi40LjM1NSAqL1xuZnVuY3Rpb24gcGFyc2VfWEZFeHQoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdGJsb2IubCArPSAyO1xuXHR2YXIgaXhmZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDI7XG5cdHZhciBjZXh0cyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGV4dC8qOkFPQSovID0gW107XG5cdHdoaWxlKGNleHRzLS0gPiAwKSBleHQucHVzaChwYXJzZV9FeHRQcm9wKGJsb2IsIGVuZC1ibG9iLmwpKTtcblx0cmV0dXJuIHtpeGZlOml4ZmUsIGV4dDpleHR9O1xufVxuXG4vKiB4ZiBpcyBhbiBYRiwgc2VlIHBhcnNlX1hGRXh0IGZvciB4ZmV4dCAqL1xuZnVuY3Rpb24gdXBkYXRlX3hmZXh0KHhmLCB4ZmV4dCkge1xuXHR4ZmV4dC5mb3JFYWNoKGZ1bmN0aW9uKHhmZSkge1xuXHRcdHN3aXRjaCh4ZmVbMF0pIHsgLyogMi41LjEwOCBleHRQcm9wRGF0YSAqL1xuXHRcdFx0Y2FzZSAweDA0OiBicmVhazsgLyogZm9yZWdyb3VuZCBjb2xvciAqL1xuXHRcdFx0Y2FzZSAweDA1OiBicmVhazsgLyogYmFja2dyb3VuZCBjb2xvciAqL1xuXHRcdFx0Y2FzZSAweDA2OiBicmVhazsgLyogZ3JhZGllbnQgZmlsbCAqL1xuXHRcdFx0Y2FzZSAweDA3OiBicmVhazsgLyogdG9wIGNlbGwgYm9yZGVyIGNvbG9yICovXG5cdFx0XHRjYXNlIDB4MDg6IGJyZWFrOyAvKiBib3R0b20gY2VsbCBib3JkZXIgY29sb3IgKi9cblx0XHRcdGNhc2UgMHgwOTogYnJlYWs7IC8qIGxlZnQgY2VsbCBib3JkZXIgY29sb3IgKi9cblx0XHRcdGNhc2UgMHgwYTogYnJlYWs7IC8qIHJpZ2h0IGNlbGwgYm9yZGVyIGNvbG9yICovXG5cdFx0XHRjYXNlIDB4MGI6IGJyZWFrOyAvKiBkaWFnb25hbCBjZWxsIGJvcmRlciBjb2xvciAqL1xuXHRcdFx0Y2FzZSAweDBkOiAvKiB0ZXh0IGNvbG9yICovXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDBlOiBicmVhazsgLyogZm9udCBzY2hlbWUgKi9cblx0XHRcdGNhc2UgMHgwZjogYnJlYWs7IC8qIGluZGVudGF0aW9uIGxldmVsICovXG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfQnJ0TWR0aW5mbyhkYXRhLCBsZW5ndGgpIHtcbiAgcmV0dXJuIHtcbiAgICBmbGFnczogZGF0YS5yZWFkX3NoaWZ0KDQpLFxuICAgIHZlcnNpb246IGRhdGEucmVhZF9zaGlmdCg0KSxcbiAgICBuYW1lOiBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSwgbGVuZ3RoIC0gOClcbiAgfTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydE1kdGluZm8oZGF0YSkge1xuICB2YXIgbyA9IG5ld19idWYoMTIgKyAyICogZGF0YS5uYW1lLmxlbmd0aCk7XG4gIG8ud3JpdGVfc2hpZnQoNCwgZGF0YS5mbGFncyk7XG4gIG8ud3JpdGVfc2hpZnQoNCwgZGF0YS52ZXJzaW9uKTtcbiAgd3JpdGVfWExXaWRlU3RyaW5nKGRhdGEubmFtZSwgbyk7XG4gIHJldHVybiBvLnNsaWNlKDAsIG8ubCk7XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRNZGIoZGF0YSkge1xuICB2YXIgb3V0ID0gW107XG4gIHZhciBjbnQgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG4gIHdoaWxlIChjbnQtLSA+IDApXG4gICAgb3V0LnB1c2goW2RhdGEucmVhZF9zaGlmdCg0KSwgZGF0YS5yZWFkX3NoaWZ0KDQpXSk7XG4gIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRNZGIobWRiKSB7XG4gIHZhciBvID0gbmV3X2J1Zig0ICsgOCAqIG1kYi5sZW5ndGgpO1xuICBvLndyaXRlX3NoaWZ0KDQsIG1kYi5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1kYi5sZW5ndGg7ICsraSkge1xuICAgIG8ud3JpdGVfc2hpZnQoNCwgbWRiW2ldWzBdKTtcbiAgICBvLndyaXRlX3NoaWZ0KDQsIG1kYltpXVsxXSk7XG4gIH1cbiAgcmV0dXJuIG87XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRCZWdpbkVzZm1kKGNudCwgbmFtZSkge1xuICB2YXIgbyA9IG5ld19idWYoOCArIDIgKiBuYW1lLmxlbmd0aCk7XG4gIG8ud3JpdGVfc2hpZnQoNCwgY250KTtcbiAgd3JpdGVfWExXaWRlU3RyaW5nKG5hbWUsIG8pO1xuICByZXR1cm4gby5zbGljZSgwLCBvLmwpO1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0QmVnaW5Fc21kYihkYXRhKSB7XG4gIGRhdGEubCArPSA0O1xuICByZXR1cm4gZGF0YS5yZWFkX3NoaWZ0KDQpICE9IDA7XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRCZWdpbkVzbWRiKGNudCwgY20pIHtcbiAgdmFyIG8gPSBuZXdfYnVmKDgpO1xuICBvLndyaXRlX3NoaWZ0KDQsIGNudCk7XG4gIG8ud3JpdGVfc2hpZnQoNCwgY20gPyAxIDogMCk7XG4gIHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfeGxtZXRhX2JpbihkYXRhLCBuYW1lLCBfb3B0cykge1xuICB2YXIgb3V0ID0geyBUeXBlczogW10sIENlbGw6IFtdLCBWYWx1ZTogW10gfTtcbiAgdmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcbiAgdmFyIHN0YXRlID0gW107XG4gIHZhciBwYXNzID0gZmFsc2U7XG4gIHZhciBtZXRhdHlwZSA9IDI7XG4gIHJlY29yZGhvcHBlcihkYXRhLCBmdW5jdGlvbih2YWwsIFIsIFJUKSB7XG4gICAgc3dpdGNoIChSVCkge1xuICAgICAgY2FzZSAzMzU6XG4gICAgICAgIG91dC5UeXBlcy5wdXNoKHsgbmFtZTogdmFsLm5hbWUgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MTpcbiAgICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24ocikge1xuICAgICAgICAgIGlmIChtZXRhdHlwZSA9PSAxKVxuICAgICAgICAgICAgb3V0LkNlbGwucHVzaCh7IHR5cGU6IG91dC5UeXBlc1tyWzBdIC0gMV0ubmFtZSwgaW5kZXg6IHJbMV0gfSk7XG4gICAgICAgICAgZWxzZSBpZiAobWV0YXR5cGUgPT0gMClcbiAgICAgICAgICAgIG91dC5WYWx1ZS5wdXNoKHsgdHlwZTogb3V0LlR5cGVzW3JbMF0gLSAxXS5uYW1lLCBpbmRleDogclsxXSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzMzc6XG4gICAgICAgIG1ldGF0eXBlID0gdmFsID8gMSA6IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzMzg6XG4gICAgICAgIG1ldGF0eXBlID0gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM1OlxuICAgICAgICBzdGF0ZS5wdXNoKFJUKTtcbiAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzNjpcbiAgICAgICAgc3RhdGUucG9wKCk7XG4gICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoUi5UKSB7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3MgfHwgb3B0cy5XVEYgJiYgc3RhdGVbc3RhdGUubGVuZ3RoIC0gMV0gIT0gMzUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCByZWNvcmQgMHhcIiArIFJULnRvU3RyaW5nKDE2KSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHdyaXRlX3hsbWV0YV9iaW4oKSB7XG4gIHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuICB3cml0ZV9yZWNvcmQoYmEsIDMzMik7XG4gIHdyaXRlX3JlY29yZChiYSwgMzM0LCB3cml0ZV9VSW50MzJMRSgxKSk7XG4gIHdyaXRlX3JlY29yZChiYSwgMzM1LCB3cml0ZV9CcnRNZHRpbmZvKHtcbiAgICBuYW1lOiBcIlhMREFQUlwiLFxuICAgIHZlcnNpb246IDEyZTQsXG4gICAgZmxhZ3M6IDM0OTY2NTcwNzJcbiAgfSkpO1xuICB3cml0ZV9yZWNvcmQoYmEsIDMzNik7XG4gIHdyaXRlX3JlY29yZChiYSwgMzM5LCB3cml0ZV9CcnRCZWdpbkVzZm1kKDEsIFwiWExEQVBSXCIpKTtcbiAgd3JpdGVfcmVjb3JkKGJhLCA1Mik7XG4gIHdyaXRlX3JlY29yZChiYSwgMzUsIHdyaXRlX1VJbnQzMkxFKDUxNCkpO1xuICB3cml0ZV9yZWNvcmQoYmEsIDQwOTYsIHdyaXRlX1VJbnQzMkxFKDApKTtcbiAgd3JpdGVfcmVjb3JkKGJhLCA0MDk3LCB3cml0ZXVpbnQxNigxKSk7XG4gIHdyaXRlX3JlY29yZChiYSwgMzYpO1xuICB3cml0ZV9yZWNvcmQoYmEsIDUzKTtcbiAgd3JpdGVfcmVjb3JkKGJhLCAzNDApO1xuICB3cml0ZV9yZWNvcmQoYmEsIDMzNywgd3JpdGVfQnJ0QmVnaW5Fc21kYigxLCB0cnVlKSk7XG4gIHdyaXRlX3JlY29yZChiYSwgNTEsIHdyaXRlX0JydE1kYihbWzEsIDBdXSkpO1xuICB3cml0ZV9yZWNvcmQoYmEsIDMzOCk7XG4gIHdyaXRlX3JlY29yZChiYSwgMzMzKTtcbiAgcmV0dXJuIGJhLmVuZCgpO1xufVxuZnVuY3Rpb24gcGFyc2VfeGxtZXRhX3htbChkYXRhLCBuYW1lLCBvcHRzKSB7XG4gIHZhciBvdXQgPSB7IFR5cGVzOiBbXSwgQ2VsbDogW10sIFZhbHVlOiBbXSB9O1xuICBpZiAoIWRhdGEpXG4gICAgcmV0dXJuIG91dDtcbiAgdmFyIHBhc3MgPSBmYWxzZTtcbiAgdmFyIG1ldGF0eXBlID0gMjtcbiAgdmFyIGxhc3RtZXRhO1xuICBkYXRhLnJlcGxhY2UodGFncmVnZXgsIGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgeSA9IHBhcnNleG1sdGFnKHgpO1xuICAgIHN3aXRjaCAoc3RyaXBfbnMoeVswXSkpIHtcbiAgICAgIGNhc2UgXCI8P3htbFwiOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI8bWV0YWRhdGFcIjpcbiAgICAgIGNhc2UgXCI8L21ldGFkYXRhPlwiOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI8bWV0YWRhdGFUeXBlc1wiOlxuICAgICAgY2FzZSBcIjwvbWV0YWRhdGFUeXBlcz5cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiPG1ldGFkYXRhVHlwZVwiOlxuICAgICAgICBvdXQuVHlwZXMucHVzaCh7IG5hbWU6IHkubmFtZSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiPC9tZXRhZGF0YVR5cGU+XCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjxmdXR1cmVNZXRhZGF0YVwiOlxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG91dC5UeXBlcy5sZW5ndGg7ICsrailcbiAgICAgICAgICBpZiAob3V0LlR5cGVzW2pdLm5hbWUgPT0geS5uYW1lKVxuICAgICAgICAgICAgbGFzdG1ldGEgPSBvdXQuVHlwZXNbal07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjwvZnV0dXJlTWV0YWRhdGE+XCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjxiaz5cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiPC9iaz5cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiPHJjXCI6XG4gICAgICAgIGlmIChtZXRhdHlwZSA9PSAxKVxuICAgICAgICAgIG91dC5DZWxsLnB1c2goeyB0eXBlOiBvdXQuVHlwZXNbeS50IC0gMV0ubmFtZSwgaW5kZXg6ICt5LnYgfSk7XG4gICAgICAgIGVsc2UgaWYgKG1ldGF0eXBlID09IDApXG4gICAgICAgICAgb3V0LlZhbHVlLnB1c2goeyB0eXBlOiBvdXQuVHlwZXNbeS50IC0gMV0ubmFtZSwgaW5kZXg6ICt5LnYgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjwvcmM+XCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjxjZWxsTWV0YWRhdGFcIjpcbiAgICAgICAgbWV0YXR5cGUgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI8L2NlbGxNZXRhZGF0YT5cIjpcbiAgICAgICAgbWV0YXR5cGUgPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI8dmFsdWVNZXRhZGF0YVwiOlxuICAgICAgICBtZXRhdHlwZSA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjwvdmFsdWVNZXRhZGF0YT5cIjpcbiAgICAgICAgbWV0YXR5cGUgPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI8ZXh0THN0XCI6XG4gICAgICBjYXNlIFwiPGV4dExzdD5cIjpcbiAgICAgIGNhc2UgXCI8L2V4dExzdD5cIjpcbiAgICAgIGNhc2UgXCI8ZXh0THN0Lz5cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiPGV4dFwiOlxuICAgICAgICBwYXNzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiPC9leHQ+XCI6XG4gICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiPHJ2YlwiOlxuICAgICAgICBpZiAoIWxhc3RtZXRhKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoIWxhc3RtZXRhLm9mZnNldHMpXG4gICAgICAgICAgbGFzdG1ldGEub2Zmc2V0cyA9IFtdO1xuICAgICAgICBsYXN0bWV0YS5vZmZzZXRzLnB1c2goK3kuaSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKCFwYXNzICYmIG9wdHMuV1RGKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVucmVjb2duaXplZCBcIiArIHlbMF0gKyBcIiBpbiBtZXRhZGF0YVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHg7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gd3JpdGVfeGxtZXRhX3htbCgpIHtcbiAgdmFyIG8gPSBbWE1MX0hFQURFUl07XG4gIG8ucHVzaCgnPG1ldGFkYXRhIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgeG1sbnM6eGxyZD1cImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3NwcmVhZHNoZWV0bWwvMjAxNy9yaWNoZGF0YVwiIHhtbG5zOnhkYT1cImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3NwcmVhZHNoZWV0bWwvMjAxNy9keW5hbWljYXJyYXlcIj5cXG4gIDxtZXRhZGF0YVR5cGVzIGNvdW50PVwiMVwiPlxcbiAgICA8bWV0YWRhdGFUeXBlIG5hbWU9XCJYTERBUFJcIiBtaW5TdXBwb3J0ZWRWZXJzaW9uPVwiMTIwMDAwXCIgY29weT1cIjFcIiBwYXN0ZUFsbD1cIjFcIiBwYXN0ZVZhbHVlcz1cIjFcIiBtZXJnZT1cIjFcIiBzcGxpdEZpcnN0PVwiMVwiIHJvd0NvbFNoaWZ0PVwiMVwiIGNsZWFyRm9ybWF0cz1cIjFcIiBjbGVhckNvbW1lbnRzPVwiMVwiIGFzc2lnbj1cIjFcIiBjb2VyY2U9XCIxXCIgY2VsbE1ldGE9XCIxXCIvPlxcbiAgPC9tZXRhZGF0YVR5cGVzPlxcbiAgPGZ1dHVyZU1ldGFkYXRhIG5hbWU9XCJYTERBUFJcIiBjb3VudD1cIjFcIj5cXG4gICAgPGJrPlxcbiAgICAgIDxleHRMc3Q+XFxuICAgICAgICA8ZXh0IHVyaT1cIntiZGJiOGNkYy1mYTFlLTQ5NmUtYTg1Ny0zYzNmMzBjMDI5YzN9XCI+XFxuICAgICAgICAgIDx4ZGE6ZHluYW1pY0FycmF5UHJvcGVydGllcyBmRHluYW1pYz1cIjFcIiBmQ29sbGFwc2VkPVwiMFwiLz5cXG4gICAgICAgIDwvZXh0PlxcbiAgICAgIDwvZXh0THN0PlxcbiAgICA8L2JrPlxcbiAgPC9mdXR1cmVNZXRhZGF0YT5cXG4gIDxjZWxsTWV0YWRhdGEgY291bnQ9XCIxXCI+XFxuICAgIDxiaz5cXG4gICAgICA8cmMgdD1cIjFcIiB2PVwiMFwiLz5cXG4gICAgPC9iaz5cXG4gIDwvY2VsbE1ldGFkYXRhPlxcbjwvbWV0YWRhdGE+Jyk7XG4gIHJldHVybiBvLmpvaW4oXCJcIik7XG59XG4vKiAxOC42IENhbGN1bGF0aW9uIENoYWluICovXG5mdW5jdGlvbiBwYXJzZV9jY194bWwoZGF0YS8qOjosIG5hbWUsIG9wdHMqLykvKjpBcnJheTxhbnk+Ki8ge1xuXHR2YXIgZCA9IFtdO1xuXHRpZighZGF0YSkgcmV0dXJuIGQ7XG5cdHZhciBpID0gMTtcblx0KGRhdGEubWF0Y2godGFncmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyh4KTtcblx0XHRzd2l0Y2goeVswXSkge1xuXHRcdFx0Y2FzZSAnPD94bWwnOiBicmVhaztcblx0XHRcdC8qIDE4LjYuMiAgY2FsY0NoYWluIENUX0NhbGNDaGFpbiAxICovXG5cdFx0XHRjYXNlICc8Y2FsY0NoYWluJzogY2FzZSAnPGNhbGNDaGFpbj4nOiBjYXNlICc8L2NhbGNDaGFpbj4nOiBicmVhaztcblx0XHRcdC8qIDE4LjYuMSAgYyBDVF9DYWxjQ2VsbCAxICovXG5cdFx0XHRjYXNlICc8Yyc6IGRlbGV0ZSB5WzBdOyBpZih5LmkpIGkgPSB5Lmk7IGVsc2UgeS5pID0gaTsgZC5wdXNoKHkpOyBicmVhaztcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZDtcbn1cblxuLy9mdW5jdGlvbiB3cml0ZV9jY194bWwoZGF0YSwgb3B0cykgeyB9XG5cbi8qIFtNUy1YTFNCXSAyLjYuNC4xICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDYWxjQ2hhaW5JdGVtJChkYXRhKSB7XG5cdHZhciBvdXQgPSB7fTtcblx0b3V0LmkgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBjZWxsID0ge307XG5cdGNlbGwuciA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0Y2VsbC5jID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRvdXQuciA9IGVuY29kZV9jZWxsKGNlbGwpO1xuXHR2YXIgZmxhZ3MgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdGlmKGZsYWdzICYgMHgyKSBvdXQubCA9ICcxJztcblx0aWYoZmxhZ3MgJiAweDgpIG91dC5hID0gJzEnO1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiAxOC42IENhbGN1bGF0aW9uIENoYWluICovXG5mdW5jdGlvbiBwYXJzZV9jY19iaW4oZGF0YSwgbmFtZSwgb3B0cykge1xuXHR2YXIgb3V0ID0gW107XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cdHJlY29yZGhvcHBlcihkYXRhLCBmdW5jdGlvbiBob3BwZXJfY2ModmFsLCBSLCBSVCkge1xuXHRcdHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAweDAwM0Y6IC8qICdCcnRDYWxjQ2hhaW5JdGVtJCcgKi9cblx0XHRcdFx0b3V0LnB1c2godmFsKTsgYnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKFIuVCl7LyogZW1wdHkgKi99XG5cdFx0XHRcdGVsc2UgaWYoIXBhc3MgfHwgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcmVjb3JkIDB4XCIgKyBSVC50b1N0cmluZygxNikpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBvdXQ7XG59XG5cbi8vZnVuY3Rpb24gd3JpdGVfY2NfYmluKGRhdGEsIG9wdHMpIHsgfVxuLyogMTguMTQgU3VwcGxlbWVudGFyeSBXb3JrYm9vayBEYXRhICovXG5mdW5jdGlvbiBwYXJzZV94bGlua194bWwoLyo6OmRhdGEsIHJlbCwgbmFtZTpzdHJpbmcsIF9vcHRzKi8pIHtcblx0Ly92YXIgb3B0cyA9IF9vcHRzIHx8IHt9O1xuXHQvL2lmKG9wdHMuV1RGKSB0aHJvdyBcIlhMU1ggRXh0ZXJuYWwgTGlua1wiO1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjcuMjUgRXh0ZXJuYWwgTGluayAqL1xuZnVuY3Rpb24gcGFyc2VfeGxpbmtfYmluKGRhdGEsIHJlbCwgbmFtZS8qOnN0cmluZyovLCBfb3B0cykge1xuXHRpZighZGF0YSkgcmV0dXJuIGRhdGE7XG5cdHZhciBvcHRzID0gX29wdHMgfHwge307XG5cblx0dmFyIHBhc3MgPSBmYWxzZSwgZW5kID0gZmFsc2U7XG5cblx0cmVjb3JkaG9wcGVyKGRhdGEsIGZ1bmN0aW9uIHhsaW5rX3BhcnNlKHZhbCwgUiwgUlQpIHtcblx0XHRpZihlbmQpIHJldHVybjtcblx0XHRzd2l0Y2goUlQpIHtcblx0XHRcdGNhc2UgMHgwMTY3OiAvKiAnQnJ0U3VwVGFicycgKi9cblx0XHRcdGNhc2UgMHgwMTZCOiAvKiAnQnJ0RXh0ZXJuVGFibGVTdGFydCcgKi9cblx0XHRcdGNhc2UgMHgwMTZDOiAvKiAnQnJ0RXh0ZXJuVGFibGVFbmQnICovXG5cdFx0XHRjYXNlIDB4MDE2RTogLyogJ0JydEV4dGVyblJvd0hkcicgKi9cblx0XHRcdGNhc2UgMHgwMTZGOiAvKiAnQnJ0RXh0ZXJuQ2VsbEJsYW5rJyAqL1xuXHRcdFx0Y2FzZSAweDAxNzA6IC8qICdCcnRFeHRlcm5DZWxsUmVhbCcgKi9cblx0XHRcdGNhc2UgMHgwMTcxOiAvKiAnQnJ0RXh0ZXJuQ2VsbEJvb2wnICovXG5cdFx0XHRjYXNlIDB4MDE3MjogLyogJ0JydEV4dGVybkNlbGxFcnJvcicgKi9cblx0XHRcdGNhc2UgMHgwMTczOiAvKiAnQnJ0RXh0ZXJuQ2VsbFN0cmluZycgKi9cblx0XHRcdGNhc2UgMHgwMUQ4OiAvKiAnQnJ0RXh0ZXJuVmFsdWVNZXRhJyAqL1xuXHRcdFx0Y2FzZSAweDAyNDE6IC8qICdCcnRTdXBOYW1lU3RhcnQnICovXG5cdFx0XHRjYXNlIDB4MDI0MjogLyogJ0JydFN1cE5hbWVWYWx1ZVN0YXJ0JyAqL1xuXHRcdFx0Y2FzZSAweDAyNDM6IC8qICdCcnRTdXBOYW1lVmFsdWVFbmQnICovXG5cdFx0XHRjYXNlIDB4MDI0NDogLyogJ0JydFN1cE5hbWVOdW0nICovXG5cdFx0XHRjYXNlIDB4MDI0NTogLyogJ0JydFN1cE5hbWVFcnInICovXG5cdFx0XHRjYXNlIDB4MDI0NjogLyogJ0JydFN1cE5hbWVTdCcgKi9cblx0XHRcdGNhc2UgMHgwMjQ3OiAvKiAnQnJ0U3VwTmFtZU5pbCcgKi9cblx0XHRcdGNhc2UgMHgwMjQ4OiAvKiAnQnJ0U3VwTmFtZUJvb2wnICovXG5cdFx0XHRjYXNlIDB4MDI0OTogLyogJ0JydFN1cE5hbWVGbWxhJyAqL1xuXHRcdFx0Y2FzZSAweDAyNEE6IC8qICdCcnRTdXBOYW1lQml0cycgKi9cblx0XHRcdGNhc2UgMHgwMjRCOiAvKiAnQnJ0U3VwTmFtZUVuZCcgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDIzOiAvKiAnQnJ0RlJUQmVnaW4nICovXG5cdFx0XHRcdHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRwYXNzID0gZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZihSLlQpey8qIGVtcHR5ICovfVxuXHRcdFx0XHRlbHNlIGlmKCFwYXNzIHx8IG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHJlY29yZCAweFwiICsgUlQudG9TdHJpbmcoMTYpKTtcblx0XHR9XG5cdH0sIG9wdHMpO1xufVxuLyogMjAuNSBEcmF3aW5nTUwgLSBTcHJlYWRzaGVldE1MIERyYXdpbmcgKi9cbi8qIDIwLjUuMi4zNSB3c0RyIENUX0RyYXdpbmcgKi9cbmZ1bmN0aW9uIHBhcnNlX2RyYXdpbmcoZGF0YSwgcmVscy8qOmFueSovKSB7XG5cdGlmKCFkYXRhKSByZXR1cm4gXCI/P1wiO1xuXHQvKlxuXHQgIENoYXJ0c2hlZXQgRHJhd2luZzpcblx0ICAgLSAyMC41LjIuMzUgd3NEciBDVF9EcmF3aW5nXG5cdCAgICAtIDIwLjUuMi4xICBhYnNvbHV0ZUFuY2hvciBDVF9BYnNvbHV0ZUFuY2hvclxuXHQgICAgIC0gMjAuNS4yLjE2IGdyYXBoaWNGcmFtZSBDVF9HcmFwaGljYWxPYmplY3RGcmFtZVxuXHQgICAgICAtIDIwLjEuMi4yLjE2IGdyYXBoaWMgQ1RfR3JhcGhpY2FsT2JqZWN0XG5cdCAgICAgICAtIDIwLjEuMi4yLjE3IGdyYXBoaWNEYXRhIENUX0dyYXBoaWNhbE9iamVjdERhdGFcbiAgICAgICAgICAtIGNoYXJ0IHJlZmVyZW5jZVxuXHQgICB0aGUgYWN0dWFsIHR5cGUgaXMgYmFzZWQgb24gdGhlIFVSSSBvZiB0aGUgZ3JhcGhpY0RhdGFcblx0XHRUT0RPOiBoYW5kbGUgZW1iZWRkZWQgY2hhcnRzIGFuZCBvdGhlciB0eXBlcyBvZiBncmFwaGljc1xuXHQqL1xuXHR2YXIgaWQgPSAoZGF0YS5tYXRjaCgvPGM6Y2hhcnQgW14+XSpyOmlkPVwiKFteXCJdKilcIi8pfHxbXCJcIixcIlwiXSlbMV07XG5cblx0cmV0dXJuIHJlbHNbJyFpZCddW2lkXS5UYXJnZXQ7XG59XG5cbi8qIEwuNS41LjIgU3ByZWFkc2hlZXRNTCBDb21tZW50cyArIFZNTCBTY2hlbWEgKi9cbnZhciBfc2hhcGVpZCA9IDEwMjQ7XG5mdW5jdGlvbiB3cml0ZV9jb21tZW50c192bWwocklkLyo6bnVtYmVyKi8sIGNvbW1lbnRzKSB7XG5cdHZhciBjc2l6ZSA9IFsyMTYwMCwgMjE2MDBdO1xuXHQvKiBMLjUuMi4xLjIgUGF0aCBBdHRyaWJ1dGUgKi9cblx0dmFyIGJib3ggPSBbXCJtMCwwbDBcIixjc2l6ZVsxXSxjc2l6ZVswXSxjc2l6ZVsxXSxjc2l6ZVswXSxcIjB4ZVwiXS5qb2luKFwiLFwiKTtcblx0dmFyIG8gPSBbXG5cdFx0d3JpdGV4dGFnKFwieG1sXCIsIG51bGwsIHsgJ3htbG5zOnYnOiBYTE1MTlMudiwgJ3htbG5zOm8nOiBYTE1MTlMubywgJ3htbG5zOngnOiBYTE1MTlMueCwgJ3htbG5zOm12JzogWExNTE5TLm12IH0pLnJlcGxhY2UoL1xcLz4vLFwiPlwiKSxcblx0XHR3cml0ZXh0YWcoXCJvOnNoYXBlbGF5b3V0XCIsIHdyaXRleHRhZyhcIm86aWRtYXBcIiwgbnVsbCwgeyd2OmV4dCc6XCJlZGl0XCIsICdkYXRhJzpySWR9KSwgeyd2OmV4dCc6XCJlZGl0XCJ9KSxcblx0XHR3cml0ZXh0YWcoXCJ2OnNoYXBldHlwZVwiLCBbXG5cdFx0XHR3cml0ZXh0YWcoXCJ2OnN0cm9rZVwiLCBudWxsLCB7am9pbnN0eWxlOlwibWl0ZXJcIn0pLFxuXHRcdFx0d3JpdGV4dGFnKFwidjpwYXRoXCIsIG51bGwsIHtncmFkaWVudHNoYXBlb2s6XCJ0XCIsICdvOmNvbm5lY3R0eXBlJzpcInJlY3RcIn0pXG5cdFx0XS5qb2luKFwiXCIpLCB7aWQ6XCJfeDAwMDBfdDIwMlwiLCAnbzpzcHQnOjIwMiwgY29vcmRzaXplOmNzaXplLmpvaW4oXCIsXCIpLHBhdGg6YmJveH0pXG5cdF07XG5cdHdoaWxlKF9zaGFwZWlkIDwgcklkICogMTAwMCkgX3NoYXBlaWQgKz0gMTAwMDtcblxuXHRjb21tZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcblx0dmFyIGMgPSBkZWNvZGVfY2VsbCh4WzBdKTtcblx0dmFyIGZpbGxvcHRzID0gLyo6OigqL3snY29sb3IyJzpcIiNCRUZGODJcIiwgJ3R5cGUnOlwiZ3JhZGllbnRcIn0vKjo6IDphbnkpKi87XG5cdGlmKGZpbGxvcHRzLnR5cGUgPT0gXCJncmFkaWVudFwiKSBmaWxsb3B0cy5hbmdsZSA9IFwiLTE4MFwiO1xuXHR2YXIgZmlsbHBhcm0gPSBmaWxsb3B0cy50eXBlID09IFwiZ3JhZGllbnRcIiA/IHdyaXRleHRhZyhcIm86ZmlsbFwiLCBudWxsLCB7dHlwZTpcImdyYWRpZW50VW5zY2FsZWRcIiwgJ3Y6ZXh0JzpcInZpZXdcIn0pIDogbnVsbDtcblx0dmFyIGZpbGx4bWwgPSB3cml0ZXh0YWcoJ3Y6ZmlsbCcsIGZpbGxwYXJtLCBmaWxsb3B0cyk7XG5cblx0dmFyIHNoYWRhdGEgPSAoe29uOlwidFwiLCAnb2JzY3VyZWQnOlwidFwifS8qOmFueSovKTtcblx0Kytfc2hhcGVpZDtcblxuXHRvID0gby5jb25jYXQoW1xuXHQnPHY6c2hhcGUnICsgd3h0X2hlbHBlcih7XG5cdFx0aWQ6J194MDAwMF9zJyArIF9zaGFwZWlkLFxuXHRcdHR5cGU6XCIjX3gwMDAwX3QyMDJcIixcblx0XHRzdHlsZTpcInBvc2l0aW9uOmFic29sdXRlOyBtYXJnaW4tbGVmdDo4MHB0O21hcmdpbi10b3A6NXB0O3dpZHRoOjEwNHB0O2hlaWdodDo2NHB0O3otaW5kZXg6MTBcIiArICh4WzFdLmhpZGRlbiA/IFwiO3Zpc2liaWxpdHk6aGlkZGVuXCIgOiBcIlwiKSAsXG5cdFx0ZmlsbGNvbG9yOlwiI0VDRkFENFwiLFxuXHRcdHN0cm9rZWNvbG9yOlwiI2VkZWFhMVwiXG5cdH0pICsgJz4nLFxuXHRcdGZpbGx4bWwsXG5cdFx0d3JpdGV4dGFnKFwidjpzaGFkb3dcIiwgbnVsbCwgc2hhZGF0YSksXG5cdFx0d3JpdGV4dGFnKFwidjpwYXRoXCIsIG51bGwsIHsnbzpjb25uZWN0dHlwZSc6XCJub25lXCJ9KSxcblx0XHQnPHY6dGV4dGJveD48ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpsZWZ0XCI+PC9kaXY+PC92OnRleHRib3g+Jyxcblx0XHQnPHg6Q2xpZW50RGF0YSBPYmplY3RUeXBlPVwiTm90ZVwiPicsXG5cdFx0XHQnPHg6TW92ZVdpdGhDZWxscy8+Jyxcblx0XHRcdCc8eDpTaXplV2l0aENlbGxzLz4nLFxuXHRcdFx0LyogUGFydCA0IDE5LjQuMi4zIEFuY2hvciAoQW5jaG9yKSAqL1xuXHRcdFx0d3JpdGV0YWcoJ3g6QW5jaG9yJywgW2MuYysxLCAwLCBjLnIrMSwgMCwgYy5jKzMsIDIwLCBjLnIrNSwgMjBdLmpvaW4oXCIsXCIpKSxcblx0XHRcdHdyaXRldGFnKCd4OkF1dG9GaWxsJywgXCJGYWxzZVwiKSxcblx0XHRcdHdyaXRldGFnKCd4OlJvdycsIFN0cmluZyhjLnIpKSxcblx0XHRcdHdyaXRldGFnKCd4OkNvbHVtbicsIFN0cmluZyhjLmMpKSxcblx0XHRcdHhbMV0uaGlkZGVuID8gJycgOiAnPHg6VmlzaWJsZS8+Jyxcblx0XHQnPC94OkNsaWVudERhdGE+Jyxcblx0JzwvdjpzaGFwZT4nXG5cdF0pOyB9KTtcblx0by5wdXNoKCc8L3htbD4nKTtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHNoZWV0X2luc2VydF9jb21tZW50cyhzaGVldCwgY29tbWVudHMvKjpBcnJheTxSYXdDb21tZW50PiovLCB0aHJlYWRlZC8qOmJvb2xlYW4qLywgcGVvcGxlLyo6P0FycmF5PGFueT4qLykge1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHNoZWV0KTtcblx0dmFyIGNlbGwvKjpDZWxsKi87XG5cdGNvbW1lbnRzLmZvckVhY2goZnVuY3Rpb24oY29tbWVudCkge1xuXHRcdHZhciByID0gZGVjb2RlX2NlbGwoY29tbWVudC5yZWYpO1xuXHRcdGlmKGRlbnNlKSB7XG5cdFx0XHRpZighc2hlZXRbci5yXSkgc2hlZXRbci5yXSA9IFtdO1xuXHRcdFx0Y2VsbCA9IHNoZWV0W3Iucl1bci5jXTtcblx0XHR9IGVsc2UgY2VsbCA9IHNoZWV0W2NvbW1lbnQucmVmXTtcblx0XHRpZiAoIWNlbGwpIHtcblx0XHRcdGNlbGwgPSAoe3Q6XCJ6XCJ9Lyo6YW55Ki8pO1xuXHRcdFx0aWYoZGVuc2UpIHNoZWV0W3Iucl1bci5jXSA9IGNlbGw7XG5cdFx0XHRlbHNlIHNoZWV0W2NvbW1lbnQucmVmXSA9IGNlbGw7XG5cdFx0XHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZShzaGVldFtcIiFyZWZcIl18fFwiQkRXR08xMDAwMDAxOkExXCIpO1xuXHRcdFx0aWYocmFuZ2Uucy5yID4gci5yKSByYW5nZS5zLnIgPSByLnI7XG5cdFx0XHRpZihyYW5nZS5lLnIgPCByLnIpIHJhbmdlLmUuciA9IHIucjtcblx0XHRcdGlmKHJhbmdlLnMuYyA+IHIuYykgcmFuZ2Uucy5jID0gci5jO1xuXHRcdFx0aWYocmFuZ2UuZS5jIDwgci5jKSByYW5nZS5lLmMgPSByLmM7XG5cdFx0XHR2YXIgZW5jb2RlZCA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdFx0XHRpZiAoZW5jb2RlZCAhPT0gc2hlZXRbXCIhcmVmXCJdKSBzaGVldFtcIiFyZWZcIl0gPSBlbmNvZGVkO1xuXHRcdH1cblxuXHRcdGlmICghY2VsbC5jKSBjZWxsLmMgPSBbXTtcblx0XHR2YXIgby8qOkNvbW1lbnQqLyA9ICh7YTogY29tbWVudC5hdXRob3IsIHQ6IGNvbW1lbnQudCwgcjogY29tbWVudC5yLCBUOiB0aHJlYWRlZH0pO1xuXHRcdGlmKGNvbW1lbnQuaCkgby5oID0gY29tbWVudC5oO1xuXG5cdFx0LyogdGhyZWFkZWQgY29tbWVudHMgYWx3YXlzIG92ZXJyaWRlICovXG5cdFx0Zm9yKHZhciBpID0gY2VsbC5jLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG5cdFx0XHRpZighdGhyZWFkZWQgJiYgY2VsbC5jW2ldLlQpIHJldHVybjtcblx0XHRcdGlmKHRocmVhZGVkICYmICFjZWxsLmNbaV0uVCkgY2VsbC5jLnNwbGljZShpLCAxKTtcblx0XHR9XG5cdFx0aWYodGhyZWFkZWQgJiYgcGVvcGxlKSBmb3IoaSA9IDA7IGkgPCBwZW9wbGUubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmKG8uYSA9PSBwZW9wbGVbaV0uaWQpIHsgby5hID0gcGVvcGxlW2ldLm5hbWUgfHwgby5hOyBicmVhazsgfVxuXHRcdH1cblx0XHRjZWxsLmMucHVzaChvKTtcblx0fSk7XG59XG5cbi8qIDE4LjcgQ29tbWVudHMgKi9cbmZ1bmN0aW9uIHBhcnNlX2NvbW1lbnRzX3htbChkYXRhLyo6c3RyaW5nKi8sIG9wdHMpLyo6QXJyYXk8UmF3Q29tbWVudD4qLyB7XG5cdC8qIDE4LjcuNiBDVF9Db21tZW50cyAqL1xuXHRpZihkYXRhLm1hdGNoKC88KD86XFx3KzopP2NvbW1lbnRzICpcXC8+LykpIHJldHVybiBbXTtcblx0dmFyIGF1dGhvcnMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIGNvbW1lbnRMaXN0Lyo6QXJyYXk8UmF3Q29tbWVudD4qLyA9IFtdO1xuXHR2YXIgYXV0aHRhZyA9IGRhdGEubWF0Y2goLzwoPzpcXHcrOik/YXV0aG9ycz4oW1xcc1xcU10qKTxcXC8oPzpcXHcrOik/YXV0aG9ycz4vKTtcblx0aWYoYXV0aHRhZyAmJiBhdXRodGFnWzFdKSBhdXRodGFnWzFdLnNwbGl0KC88XFwvXFx3Kjo/YXV0aG9yPi8pLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdGlmKHggPT09IFwiXCIgfHwgeC50cmltKCkgPT09IFwiXCIpIHJldHVybjtcblx0XHR2YXIgYSA9IHgubWF0Y2goLzwoPzpcXHcrOik/YXV0aG9yW14+XSo+KC4qKS8pO1xuXHRcdGlmKGEpIGF1dGhvcnMucHVzaChhWzFdKTtcblx0fSk7XG5cdHZhciBjbW50dGFnID0gZGF0YS5tYXRjaCgvPCg/Olxcdys6KT9jb21tZW50TGlzdD4oW1xcc1xcU10qKTxcXC8oPzpcXHcrOik/Y29tbWVudExpc3Q+Lyk7XG5cdGlmKGNtbnR0YWcgJiYgY21udHRhZ1sxXSkgY21udHRhZ1sxXS5zcGxpdCgvPFxcL1xcdyo6P2NvbW1lbnQ+LykuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0aWYoeCA9PT0gXCJcIiB8fCB4LnRyaW0oKSA9PT0gXCJcIikgcmV0dXJuO1xuXHRcdHZhciBjbSA9IHgubWF0Y2goLzwoPzpcXHcrOik/Y29tbWVudFtePl0qPi8pO1xuXHRcdGlmKCFjbSkgcmV0dXJuO1xuXHRcdHZhciB5ID0gcGFyc2V4bWx0YWcoY21bMF0pO1xuXHRcdHZhciBjb21tZW50Lyo6UmF3Q29tbWVudCovID0gKHsgYXV0aG9yOiB5LmF1dGhvcklkICYmIGF1dGhvcnNbeS5hdXRob3JJZF0gfHwgXCJzaGVldGpzZ2hvc3RcIiwgcmVmOiB5LnJlZiwgZ3VpZDogeS5ndWlkIH0vKjphbnkqLyk7XG5cdFx0dmFyIGNlbGwgPSBkZWNvZGVfY2VsbCh5LnJlZik7XG5cdFx0aWYob3B0cy5zaGVldFJvd3MgJiYgb3B0cy5zaGVldFJvd3MgPD0gY2VsbC5yKSByZXR1cm47XG5cdFx0dmFyIHRleHRNYXRjaCA9IHgubWF0Y2goLzwoPzpcXHcrOik/dGV4dD4oW1xcc1xcU10qKTxcXC8oPzpcXHcrOik/dGV4dD4vKTtcblx0XHR2YXIgcnQgPSAhIXRleHRNYXRjaCAmJiAhIXRleHRNYXRjaFsxXSAmJiBwYXJzZV9zaSh0ZXh0TWF0Y2hbMV0pIHx8IHtyOlwiXCIsdDpcIlwiLGg6XCJcIn07XG5cdFx0Y29tbWVudC5yID0gcnQucjtcblx0XHRpZihydC5yID09IFwiPHQ+PC90PlwiKSBydC50ID0gcnQuaCA9IFwiXCI7XG5cdFx0Y29tbWVudC50ID0gKHJ0LnR8fFwiXCIpLnJlcGxhY2UoL1xcclxcbi9nLFwiXFxuXCIpLnJlcGxhY2UoL1xcci9nLFwiXFxuXCIpO1xuXHRcdGlmKG9wdHMuY2VsbEhUTUwpIGNvbW1lbnQuaCA9IHJ0Lmg7XG5cdFx0Y29tbWVudExpc3QucHVzaChjb21tZW50KTtcblx0fSk7XG5cdHJldHVybiBjb21tZW50TGlzdDtcbn1cblxuZnVuY3Rpb24gd3JpdGVfY29tbWVudHNfeG1sKGRhdGEvKjo6LCBvcHRzKi8pIHtcblx0dmFyIG8gPSBbWE1MX0hFQURFUiwgd3JpdGV4dGFnKCdjb21tZW50cycsIG51bGwsIHsgJ3htbG5zJzogWE1MTlNfbWFpblswXSB9KV07XG5cblx0dmFyIGlhdXRob3IvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0by5wdXNoKFwiPGF1dGhvcnM+XCIpO1xuXHRkYXRhLmZvckVhY2goZnVuY3Rpb24oeCkgeyB4WzFdLmZvckVhY2goZnVuY3Rpb24odykgeyB2YXIgYSA9IGVzY2FwZXhtbCh3LmEpO1xuXHRcdGlmKGlhdXRob3IuaW5kZXhPZihhKSA9PSAtMSkge1xuXHRcdFx0aWF1dGhvci5wdXNoKGEpO1xuXHRcdFx0by5wdXNoKFwiPGF1dGhvcj5cIiArIGEgKyBcIjwvYXV0aG9yPlwiKTtcblx0XHR9XG5cdFx0aWYody5UICYmIHcuSUQgJiYgaWF1dGhvci5pbmRleE9mKFwidGM9XCIgKyB3LklEKSA9PSAtMSkge1xuXHRcdFx0aWF1dGhvci5wdXNoKFwidGM9XCIgKyB3LklEKTtcblx0XHRcdG8ucHVzaChcIjxhdXRob3I+XCIgKyBcInRjPVwiICsgdy5JRCArIFwiPC9hdXRob3I+XCIpO1xuXHRcdH1cblx0fSk7IH0pO1xuXHRpZihpYXV0aG9yLmxlbmd0aCA9PSAwKSB7IGlhdXRob3IucHVzaChcIlNoZWV0SjVcIik7IG8ucHVzaChcIjxhdXRob3I+U2hlZXRKNTwvYXV0aG9yPlwiKTsgfVxuXHRvLnB1c2goXCI8L2F1dGhvcnM+XCIpO1xuXHRvLnB1c2goXCI8Y29tbWVudExpc3Q+XCIpO1xuXHRkYXRhLmZvckVhY2goZnVuY3Rpb24oZCkge1xuXHRcdC8qIDE4LjcuMyBDVF9Db21tZW50ICovXG5cdFx0dmFyIGxhc3RhdXRob3IgPSAwLCB0cyA9IFtdO1xuXHRcdGlmKGRbMV1bMF0gJiYgZFsxXVswXS5UICYmIGRbMV1bMF0uSUQpIGxhc3RhdXRob3IgPSBpYXV0aG9yLmluZGV4T2YoXCJ0Yz1cIiArIGRbMV1bMF0uSUQpO1xuXHRcdGVsc2UgZFsxXS5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcblx0XHRcdGlmKGMuYSkgbGFzdGF1dGhvciA9IGlhdXRob3IuaW5kZXhPZihlc2NhcGV4bWwoYy5hKSk7XG5cdFx0XHR0cy5wdXNoKGMudHx8XCJcIik7XG5cdFx0fSk7XG5cdFx0by5wdXNoKCc8Y29tbWVudCByZWY9XCInICsgZFswXSArICdcIiBhdXRob3JJZD1cIicgKyBsYXN0YXV0aG9yICsgJ1wiPjx0ZXh0PicpO1xuXHRcdGlmKHRzLmxlbmd0aCA8PSAxKSBvLnB1c2god3JpdGV0YWcoXCJ0XCIsIGVzY2FwZXhtbCh0c1swXXx8XCJcIikpKTtcblx0XHRlbHNlIHtcblx0XHRcdC8qIGJhc2VkIG9uIFRocmVhZGVkIENvbW1lbnRzIC0+IENvbW1lbnRzIHByb2plY3Rpb24gKi9cblx0XHRcdHZhciB0ID0gXCJDb21tZW50OlxcbiAgICBcIiArICh0c1swXSkgKyBcIlxcblwiO1xuXHRcdFx0Zm9yKHZhciBpID0gMTsgaSA8IHRzLmxlbmd0aDsgKytpKSB0ICs9IFwiUmVwbHk6XFxuICAgIFwiICsgdHNbaV0gKyBcIlxcblwiO1xuXHRcdFx0by5wdXNoKHdyaXRldGFnKFwidFwiLCBlc2NhcGV4bWwodCkpKTtcblx0XHR9XG5cdFx0by5wdXNoKCc8L3RleHQ+PC9jb21tZW50PicpO1xuXHR9KTtcblx0by5wdXNoKFwiPC9jb21tZW50TGlzdD5cIik7XG5cdGlmKG8ubGVuZ3RoPjIpIHsgb1tvLmxlbmd0aF0gPSAoJzwvY29tbWVudHM+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuLyogW01TLVhMU1hdIDIuMS4xNyAqL1xuZnVuY3Rpb24gcGFyc2VfdGNtbnRfeG1sKGRhdGEvKjpzdHJpbmcqLywgb3B0cykvKjpBcnJheTxSYXdDb21tZW50PiovIHtcblx0dmFyIG91dCA9IFtdO1xuXHR2YXIgcGFzcyA9IGZhbHNlLCBjb21tZW50ID0ge30sIHRpZHggPSAwO1xuXHRkYXRhLnJlcGxhY2UodGFncmVnZXgsIGZ1bmN0aW9uIHhtbF90Y21udCh4LCBpZHgpIHtcblx0XHR2YXIgeS8qOmFueSovID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHN0cmlwX25zKHlbMF0pKSB7XG5cdFx0XHRjYXNlICc8P3htbCc6IGJyZWFrO1xuXG5cdFx0XHQvKiAyLjYuMjA3IFRocmVhZGVkQ29tbWVudHMgQ1RfVGhyZWFkZWRDb21tZW50cyAqL1xuXHRcdFx0Y2FzZSAnPFRocmVhZGVkQ29tbWVudHMnOiBicmVhaztcblx0XHRcdGNhc2UgJzwvVGhyZWFkZWRDb21tZW50cz4nOiBicmVhaztcblxuXHRcdFx0LyogMi42LjIwNSB0aHJlYWRlZENvbW1lbnQgQ1RfVGhyZWFkZWRDb21tZW50ICovXG5cdFx0XHRjYXNlICc8dGhyZWFkZWRDb21tZW50JzogY29tbWVudCA9IHthdXRob3I6IHkucGVyc29uSWQsIGd1aWQ6IHkuaWQsIHJlZjogeS5yZWYsIFQ6IDF9OyBicmVhaztcblx0XHRcdGNhc2UgJzwvdGhyZWFkZWRDb21tZW50Pic6IGlmKGNvbW1lbnQudCAhPSBudWxsKSBvdXQucHVzaChjb21tZW50KTsgYnJlYWs7XG5cblx0XHRcdGNhc2UgJzx0ZXh0Pic6IGNhc2UgJzx0ZXh0JzogdGlkeCA9IGlkeCArIHgubGVuZ3RoOyBicmVhaztcblx0XHRcdGNhc2UgJzwvdGV4dD4nOiBjb21tZW50LnQgPSBkYXRhLnNsaWNlKHRpZHgsIGlkeCkucmVwbGFjZSgvXFxyXFxuL2csIFwiXFxuXCIpLnJlcGxhY2UoL1xcci9nLCBcIlxcblwiKTsgYnJlYWs7XG5cblx0XHRcdC8qIDIuNi4yMDYgbWVudGlvbnMgQ1RfVGhyZWFkZWRDb21tZW50TWVudGlvbnMgVE9ETyAqL1xuXHRcdFx0Y2FzZSAnPG1lbnRpb25zJzogY2FzZSAnPG1lbnRpb25zPic6IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgJzwvbWVudGlvbnM+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblxuXHRcdFx0LyogMi42LjIwMiBtZW50aW9uIENUX01lbnRpb24gVE9ETyAqL1xuXG5cdFx0XHQvKiAxOC4yLjEwIGV4dExzdCBDVF9FeHRlbnNpb25MaXN0ID8gKi9cblx0XHRcdGNhc2UgJzxleHRMc3QnOiBjYXNlICc8ZXh0THN0Pic6IGNhc2UgJzwvZXh0THN0Pic6IGNhc2UgJzxleHRMc3QvPic6IGJyZWFrO1xuXHRcdFx0LyogMTguMi43ICBleHQgQ1RfRXh0ZW5zaW9uICsgKi9cblx0XHRcdGNhc2UgJzxleHQnOiBwYXNzPXRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9leHQ+JzogcGFzcz1mYWxzZTsgYnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6IGlmKCFwYXNzICYmIG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCAnICsgeVswXSArICcgaW4gdGhyZWFkZWQgY29tbWVudHMnKTtcblx0XHR9XG5cdFx0cmV0dXJuIHg7XG5cdH0pO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiB3cml0ZV90Y21udF94bWwoY29tbWVudHMsIHBlb3BsZSwgb3B0cykge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSLCB3cml0ZXh0YWcoJ1RocmVhZGVkQ29tbWVudHMnLCBudWxsLCB7ICd4bWxucyc6IFhNTE5TLlRDTU5UIH0pLnJlcGxhY2UoL1tcXC9dPi8sIFwiPlwiKV07XG5cdGNvbW1lbnRzLmZvckVhY2goZnVuY3Rpb24oY2Fycikge1xuXHRcdHZhciByb290aWQgPSBcIlwiO1xuXHRcdChjYXJyWzFdIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGMsIGlkeCkge1xuXHRcdFx0aWYoIWMuVCkgeyBkZWxldGUgYy5JRDsgcmV0dXJuOyB9XG5cdFx0XHRpZihjLmEgJiYgcGVvcGxlLmluZGV4T2YoYy5hKSA9PSAtMSkgcGVvcGxlLnB1c2goYy5hKTtcblx0XHRcdHZhciB0Y29wdHMgPSB7XG5cdFx0XHRcdHJlZjogY2FyclswXSxcblx0XHRcdFx0aWQ6IFwiezU0RUU3OTUxLTcyNjItNDIwMC02OTY5LVwiICsgKFwiMDAwMDAwMDAwMDAwXCIgKyBvcHRzLnRjaWQrKykuc2xpY2UoLTEyKSArIFwifVwiXG5cdFx0XHR9O1xuXHRcdFx0aWYoaWR4ID09IDApIHJvb3RpZCA9IHRjb3B0cy5pZDtcblx0XHRcdGVsc2UgdGNvcHRzLnBhcmVudElkID0gcm9vdGlkO1xuXHRcdFx0Yy5JRCA9IHRjb3B0cy5pZDtcblx0XHRcdGlmKGMuYSkgdGNvcHRzLnBlcnNvbklkID0gXCJ7NTRFRTc5NTAtNzI2Mi00MjAwLTY5NjktXCIgKyAoXCIwMDAwMDAwMDAwMDBcIiArIHBlb3BsZS5pbmRleE9mKGMuYSkpLnNsaWNlKC0xMikgKyBcIn1cIjtcblx0XHRcdG8ucHVzaCh3cml0ZXh0YWcoJ3RocmVhZGVkQ29tbWVudCcsIHdyaXRldGFnKCd0ZXh0JywgYy50fHxcIlwiKSwgdGNvcHRzKSk7XG5cdFx0fSk7XG5cdH0pO1xuXHRvLnB1c2goJzwvVGhyZWFkZWRDb21tZW50cz4nKTtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuLyogW01TLVhMU1hdIDIuMS4xOCAqL1xuZnVuY3Rpb24gcGFyc2VfcGVvcGxlX3htbChkYXRhLyo6c3RyaW5nKi8sIG9wdHMpIHtcblx0dmFyIG91dCA9IFtdO1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXHRkYXRhLnJlcGxhY2UodGFncmVnZXgsIGZ1bmN0aW9uIHhtbF90Y21udCh4KSB7XG5cdFx0dmFyIHkvKjphbnkqLyA9IHBhcnNleG1sdGFnKHgpO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPD94bWwnOiBicmVhaztcblxuXHRcdFx0LyogMi40Ljg1IHBlcnNvbkxpc3QgQ1RfUGVyc29uTGlzdCAqL1xuXHRcdFx0Y2FzZSAnPHBlcnNvbkxpc3QnOiBicmVhaztcblx0XHRcdGNhc2UgJzwvcGVyc29uTGlzdD4nOiBicmVhaztcblxuXHRcdFx0LyogMi42LjIwMyBwZXJzb24gQ1RfUGVyc29uIFRPRE86IHByb3ZpZGVycyAqL1xuXHRcdFx0Y2FzZSAnPHBlcnNvbic6IG91dC5wdXNoKHtuYW1lOiB5LmRpc3BsYXluYW1lLCBpZDogeS5pZCB9KTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L3BlcnNvbj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMCBleHRMc3QgQ1RfRXh0ZW5zaW9uTGlzdCA/ICovXG5cdFx0XHRjYXNlICc8ZXh0THN0JzogY2FzZSAnPGV4dExzdD4nOiBjYXNlICc8L2V4dExzdD4nOiBjYXNlICc8ZXh0THN0Lz4nOiBicmVhaztcblx0XHRcdC8qIDE4LjIuNyAgZXh0IENUX0V4dGVuc2lvbiArICovXG5cdFx0XHRjYXNlICc8ZXh0JzogcGFzcz10cnVlOyBicmVhaztcblx0XHRcdGNhc2UgJzwvZXh0Pic6IHBhc3M9ZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OiBpZighcGFzcyAmJiBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIHRocmVhZGVkIGNvbW1lbnRzJyk7XG5cdFx0fVxuXHRcdHJldHVybiB4O1xuXHR9KTtcblx0cmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHdyaXRlX3Blb3BsZV94bWwocGVvcGxlLyosIG9wdHMqLykge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSLCB3cml0ZXh0YWcoJ3BlcnNvbkxpc3QnLCBudWxsLCB7XG5cdFx0J3htbG5zJzogWE1MTlMuVENNTlQsXG5cdFx0J3htbG5zOngnOiBYTUxOU19tYWluWzBdXG5cdH0pLnJlcGxhY2UoL1tcXC9dPi8sIFwiPlwiKV07XG5cdHBlb3BsZS5mb3JFYWNoKGZ1bmN0aW9uKHBlcnNvbiwgaWR4KSB7XG5cdFx0by5wdXNoKHdyaXRleHRhZygncGVyc29uJywgbnVsbCwge1xuXHRcdFx0ZGlzcGxheU5hbWU6IHBlcnNvbixcblx0XHRcdGlkOiBcIns1NEVFNzk1MC03MjYyLTQyMDAtNjk2OS1cIiArIChcIjAwMDAwMDAwMDAwMFwiICsgaWR4KS5zbGljZSgtMTIpICsgXCJ9XCIsXG5cdFx0XHR1c2VySWQ6IHBlcnNvbixcblx0XHRcdHByb3ZpZGVySWQ6IFwiTm9uZVwiXG5cdFx0fSkpO1xuXHR9KTtcblx0by5wdXNoKFwiPC9wZXJzb25MaXN0PlwiKTtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIFtNUy1YTFNCXSAyLjQuMjggQnJ0QmVnaW5Db21tZW50ICovXG5mdW5jdGlvbiBwYXJzZV9CcnRCZWdpbkNvbW1lbnQoZGF0YSkge1xuXHR2YXIgb3V0ID0ge307XG5cdG91dC5pYXV0aG9yID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgcmZ4ID0gcGFyc2VfVW5jaGVja2VkUmZYKGRhdGEsIDE2KTtcblx0b3V0LnJmeCA9IHJmeC5zO1xuXHRvdXQucmVmID0gZW5jb2RlX2NlbGwocmZ4LnMpO1xuXHRkYXRhLmwgKz0gMTY7IC8qdmFyIGd1aWQgPSBwYXJzZV9HVUlEKGRhdGEpOyAqL1xuXHRyZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0QmVnaW5Db21tZW50KGRhdGEsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1ZigzNik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgZGF0YVsxXS5pYXV0aG9yKTtcblx0d3JpdGVfVW5jaGVja2VkUmZYKChkYXRhWzBdLyo6YW55Ki8pLCBvKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuMzI3IEJydENvbW1lbnRBdXRob3IgKi9cbnZhciBwYXJzZV9CcnRDb21tZW50QXV0aG9yID0gcGFyc2VfWExXaWRlU3RyaW5nO1xuZnVuY3Rpb24gd3JpdGVfQnJ0Q29tbWVudEF1dGhvcihkYXRhKSB7IHJldHVybiB3cml0ZV9YTFdpZGVTdHJpbmcoZGF0YS5zbGljZSgwLCA1NCkpOyB9XG5cbi8qIFtNUy1YTFNCXSAyLjEuNy44IENvbW1lbnRzICovXG5mdW5jdGlvbiBwYXJzZV9jb21tZW50c19iaW4oZGF0YSwgb3B0cykvKjpBcnJheTxSYXdDb21tZW50PiovIHtcblx0dmFyIG91dC8qOkFycmF5PFJhd0NvbW1lbnQ+Ki8gPSBbXTtcblx0dmFyIGF1dGhvcnMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIGMgPSB7fTtcblx0dmFyIHBhc3MgPSBmYWxzZTtcblx0cmVjb3JkaG9wcGVyKGRhdGEsIGZ1bmN0aW9uIGhvcHBlcl9jbW50KHZhbCwgUiwgUlQpIHtcblx0XHRzd2l0Y2goUlQpIHtcblx0XHRcdGNhc2UgMHgwMjc4OiAvKiAnQnJ0Q29tbWVudEF1dGhvcicgKi9cblx0XHRcdFx0YXV0aG9ycy5wdXNoKHZhbCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAyN0I6IC8qICdCcnRCZWdpbkNvbW1lbnQnICovXG5cdFx0XHRcdGMgPSB2YWw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAyN0Q6IC8qICdCcnRDb21tZW50VGV4dCcgKi9cblx0XHRcdFx0Yy50ID0gdmFsLnQ7IGMuaCA9IHZhbC5oOyBjLnIgPSB2YWwucjsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDI3QzogLyogJ0JydEVuZENvbW1lbnQnICovXG5cdFx0XHRcdGMuYXV0aG9yID0gYXV0aG9yc1tjLmlhdXRob3JdO1xuXHRcdFx0XHRkZWxldGUgKGMvKjphbnkqLykuaWF1dGhvcjtcblx0XHRcdFx0aWYob3B0cy5zaGVldFJvd3MgJiYgYy5yZnggJiYgb3B0cy5zaGVldFJvd3MgPD0gYy5yZngucikgYnJlYWs7XG5cdFx0XHRcdGlmKCFjLnQpIGMudCA9IFwiXCI7XG5cdFx0XHRcdGRlbGV0ZSBjLnJmeDsgb3V0LnB1c2goYyk7IGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MEMwMDogLyogJ0JydFVpZCcgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDIzOiAvKiAnQnJ0RlJUQmVnaW4nICovXG5cdFx0XHRcdHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMjU6IC8qICdCcnRBQ0JlZ2luJyAqLyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI2OiAvKiAnQnJ0QUNFbmQnICovIGJyZWFrO1xuXG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKFIuVCl7LyogZW1wdHkgKi99XG5cdFx0XHRcdGVsc2UgaWYoIXBhc3MgfHwgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcmVjb3JkIDB4XCIgKyBSVC50b1N0cmluZygxNikpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2NvbW1lbnRzX2JpbihkYXRhLyo6Oiwgb3B0cyovKSB7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR2YXIgaWF1dGhvci8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI3NCAvKiBCcnRCZWdpbkNvbW1lbnRzICovKTtcblxuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI3NiAvKiBCcnRCZWdpbkNvbW1lbnRBdXRob3JzICovKTtcblx0ZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGNvbW1lbnQpIHtcblx0XHRjb21tZW50WzFdLmZvckVhY2goZnVuY3Rpb24oYykge1xuXHRcdFx0aWYoaWF1dGhvci5pbmRleE9mKGMuYSkgPiAtMSkgcmV0dXJuO1xuXHRcdFx0aWF1dGhvci5wdXNoKGMuYS5zbGljZSgwLDU0KSk7XG5cdFx0XHR3cml0ZV9yZWNvcmQoYmEsIDB4MDI3OCAvKiBCcnRDb21tZW50QXV0aG9yICovLCB3cml0ZV9CcnRDb21tZW50QXV0aG9yKGMuYSkpO1xuXHRcdH0pO1xuXHR9KTtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAyNzcgLyogQnJ0RW5kQ29tbWVudEF1dGhvcnMgKi8pO1xuXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjc5IC8qIEJydEJlZ2luQ29tbWVudExpc3QgKi8pO1xuXHRkYXRhLmZvckVhY2goZnVuY3Rpb24oY29tbWVudCkge1xuXHRcdGNvbW1lbnRbMV0uZm9yRWFjaChmdW5jdGlvbihjKSB7XG5cdFx0XHRjLmlhdXRob3IgPSBpYXV0aG9yLmluZGV4T2YoYy5hKTtcblx0XHRcdHZhciByYW5nZSA9IHtzOmRlY29kZV9jZWxsKGNvbW1lbnRbMF0pLGU6ZGVjb2RlX2NlbGwoY29tbWVudFswXSl9O1xuXHRcdFx0d3JpdGVfcmVjb3JkKGJhLCAweDAyN0IgLyogQnJ0QmVnaW5Db21tZW50ICovLCB3cml0ZV9CcnRCZWdpbkNvbW1lbnQoW3JhbmdlLCBjXSkpO1xuXHRcdFx0aWYoYy50ICYmIGMudC5sZW5ndGggPiAwKSB3cml0ZV9yZWNvcmQoYmEsIDB4MDI3RCAvKiBCcnRDb21tZW50VGV4dCAqLywgd3JpdGVfQnJ0Q29tbWVudFRleHQoYykpO1xuXHRcdFx0d3JpdGVfcmVjb3JkKGJhLCAweDAyN0MgLyogQnJ0RW5kQ29tbWVudCAqLyk7XG5cdFx0XHRkZWxldGUgYy5pYXV0aG9yO1xuXHRcdH0pO1xuXHR9KTtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAyN0EgLyogQnJ0RW5kQ29tbWVudExpc3QgKi8pO1xuXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjc1IC8qIEJydEVuZENvbW1lbnRzICovKTtcblx0cmV0dXJuIGJhLmVuZCgpO1xufVxudmFyIENUX1ZCQSA9IFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS52YmFQcm9qZWN0XCI7XG5mdW5jdGlvbiBtYWtlX3ZiYV94bHMoY2ZiKSB7XG4gIHZhciBuZXdjZmIgPSBDRkIudXRpbHMuY2ZiX25ldyh7IHJvb3Q6IFwiUlwiIH0pO1xuICBjZmIuRnVsbFBhdGhzLmZvckVhY2goZnVuY3Rpb24ocCwgaSkge1xuICAgIGlmIChwLnNsaWNlKC0xKSA9PT0gXCIvXCIgfHwgIXAubWF0Y2goL19WQkFfUFJPSkVDVF9DVVIvKSlcbiAgICAgIHJldHVybjtcbiAgICB2YXIgbmV3cGF0aCA9IHAucmVwbGFjZSgvXlteXFwvXSovLCBcIlJcIikucmVwbGFjZSgvXFwvX1ZCQV9QUk9KRUNUX0NVUlxcdTAwMDAqLywgXCJcIik7XG4gICAgQ0ZCLnV0aWxzLmNmYl9hZGQobmV3Y2ZiLCBuZXdwYXRoLCBjZmIuRmlsZUluZGV4W2ldLmNvbnRlbnQpO1xuICB9KTtcbiAgcmV0dXJuIENGQi53cml0ZShuZXdjZmIpO1xufVxuZnVuY3Rpb24gZmlsbF92YmFfeGxzKGNmYiwgdmJhKSB7XG4gIHZiYS5GdWxsUGF0aHMuZm9yRWFjaChmdW5jdGlvbihwLCBpKSB7XG4gICAgaWYgKGkgPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgbmV3cGF0aCA9IHAucmVwbGFjZSgvW15cXC9dKltcXC9dLywgXCIvX1ZCQV9QUk9KRUNUX0NVUi9cIik7XG4gICAgaWYgKG5ld3BhdGguc2xpY2UoLTEpICE9PSBcIi9cIilcbiAgICAgIENGQi51dGlscy5jZmJfYWRkKGNmYiwgbmV3cGF0aCwgdmJhLkZpbGVJbmRleFtpXS5jb250ZW50KTtcbiAgfSk7XG59XG52YXIgVkJBRk1UUyA9IFtcInhsc2JcIiwgXCJ4bHNtXCIsIFwieGxhbVwiLCBcImJpZmY4XCIsIFwieGxhXCJdO1xuLyogbWFjcm8gYW5kIGRpYWxvZyBzaGVldCBzdHVicyAqL1xuZnVuY3Rpb24gcGFyc2VfZHNfYmluKC8qOjpkYXRhOmFueSwgb3B0cywgaWR4Om51bWJlciwgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKi8pLyo6V29ya3NoZWV0Ki8geyByZXR1cm4geychdHlwZSc6J2RpYWxvZyd9OyB9XG5mdW5jdGlvbiBwYXJzZV9kc194bWwoLyo6OmRhdGE6YW55LCBvcHRzLCBpZHg6bnVtYmVyLCByZWxzLCB3YiwgdGhlbWVzLCBzdHlsZXMqLykvKjpXb3Jrc2hlZXQqLyB7IHJldHVybiB7JyF0eXBlJzonZGlhbG9nJ307IH1cbmZ1bmN0aW9uIHBhcnNlX21zX2JpbigvKjo6ZGF0YTphbnksIG9wdHMsIGlkeDpudW1iZXIsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyovKS8qOldvcmtzaGVldCovIHsgcmV0dXJuIHsnIXR5cGUnOidtYWNybyd9OyB9XG5mdW5jdGlvbiBwYXJzZV9tc194bWwoLyo6OmRhdGE6YW55LCBvcHRzLCBpZHg6bnVtYmVyLCByZWxzLCB3YiwgdGhlbWVzLCBzdHlsZXMqLykvKjpXb3Jrc2hlZXQqLyB7IHJldHVybiB7JyF0eXBlJzonbWFjcm8nfTsgfVxuLyogVE9ETzogaXQgd2lsbCBiZSB1c2VmdWwgdG8gcGFyc2UgdGhlIGZ1bmN0aW9uIHN0ciAqL1xudmFyIHJjX3RvX2ExID0gLyojX19QVVJFX18qLyhmdW5jdGlvbigpe1xuXHR2YXIgcmNyZWdleCA9IC8oXnxbXkEtWmEtel9dKVIoXFxbPy0/XFxkK1xcXXxbMS05XVxcZCp8KUMoXFxbPy0/XFxkK1xcXXxbMS05XVxcZCp8KSg/IVtBLVphLXowLTlfXSkvZztcblx0dmFyIHJjYmFzZS8qOkNlbGwqLyA9ICh7cjowLGM6MH0vKjphbnkqLyk7XG5cdGZ1bmN0aW9uIHJjZnVuYygkJCwkMSwkMiwkMykge1xuXHRcdHZhciBjUmVsID0gZmFsc2UsIHJSZWwgPSBmYWxzZTtcblxuXHRcdGlmKCQyLmxlbmd0aCA9PSAwKSByUmVsID0gdHJ1ZTtcblx0XHRlbHNlIGlmKCQyLmNoYXJBdCgwKSA9PSBcIltcIikgeyByUmVsID0gdHJ1ZTsgJDIgPSAkMi5zbGljZSgxLCAtMSk7IH1cblxuXHRcdGlmKCQzLmxlbmd0aCA9PSAwKSBjUmVsID0gdHJ1ZTtcblx0XHRlbHNlIGlmKCQzLmNoYXJBdCgwKSA9PSBcIltcIikgeyBjUmVsID0gdHJ1ZTsgJDMgPSAkMy5zbGljZSgxLCAtMSk7IH1cblxuXHRcdHZhciBSID0gJDIubGVuZ3RoPjA/cGFyc2VJbnQoJDIsMTApfDA6MCwgQyA9ICQzLmxlbmd0aD4wP3BhcnNlSW50KCQzLDEwKXwwOjA7XG5cblx0XHRpZihjUmVsKSBDICs9IHJjYmFzZS5jOyBlbHNlIC0tQztcblx0XHRpZihyUmVsKSBSICs9IHJjYmFzZS5yOyBlbHNlIC0tUjtcblx0XHRyZXR1cm4gJDEgKyAoY1JlbCA/IFwiXCIgOiBcIiRcIikgKyBlbmNvZGVfY29sKEMpICsgKHJSZWwgPyBcIlwiIDogXCIkXCIpICsgZW5jb2RlX3JvdyhSKTtcblx0fVxuXHRyZXR1cm4gZnVuY3Rpb24gcmNfdG9fYTEoZnN0ci8qOnN0cmluZyovLCBiYXNlLyo6Q2VsbCovKS8qOnN0cmluZyovIHtcblx0XHRyY2Jhc2UgPSBiYXNlO1xuXHRcdHJldHVybiBmc3RyLnJlcGxhY2UocmNyZWdleCwgcmNmdW5jKTtcblx0fTtcbn0pKCk7XG5cbnZhciBjcmVmcmVnZXggPSAvKF58W14uX0EtWjAtOV0pKFskXT8pKFtBLVpdezEsMn18W0EtV11bQS1aXXsyfXxYW0EtRV1bQS1aXXxYRltBLURdKShbJF0/KSgxMFswLTNdXFxkezR9fDEwNFswLTddXFxkezN9fDEwNDhbMC00XVxcZHsyfXwxMDQ4NVswLTZdXFxkfDEwNDg1N1swLTZdfFsxLTldXFxkezAsNX0pKD8hW18uXFwoQS1aYS16MC05XSkvZztcbnZhciBhMV90b19yYyA9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24oKXtcblx0cmV0dXJuIGZ1bmN0aW9uIGExX3RvX3JjKGZzdHIvKjpzdHJpbmcqLywgYmFzZS8qOkNlbGxBZGRyZXNzKi8pIHtcblx0XHRyZXR1cm4gZnN0ci5yZXBsYWNlKGNyZWZyZWdleCwgZnVuY3Rpb24oJDAsICQxLCAkMiwgJDMsICQ0LCAkNSkge1xuXHRcdFx0dmFyIGMgPSBkZWNvZGVfY29sKCQzKSAtICgkMiA/IDAgOiBiYXNlLmMpO1xuXHRcdFx0dmFyIHIgPSBkZWNvZGVfcm93KCQ1KSAtICgkNCA/IDAgOiBiYXNlLnIpO1xuXHRcdFx0dmFyIFIgPSAociA9PSAwID8gXCJcIiA6ICEkNCA/IFwiW1wiICsgciArIFwiXVwiIDogKHIrMSkpO1xuXHRcdFx0dmFyIEMgPSAoYyA9PSAwID8gXCJcIiA6ICEkMiA/IFwiW1wiICsgYyArIFwiXVwiIDogKGMrMSkpO1xuXHRcdFx0cmV0dXJuICQxICsgXCJSXCIgKyBSICsgXCJDXCIgKyBDO1xuXHRcdH0pO1xuXHR9O1xufSkoKTtcblxuLyogbm8gZGVmaW5lZCBuYW1lIGNhbiBjb2xsaWRlIHdpdGggYSB2YWxpZCBjZWxsIGFkZHJlc3MgQTE6WEZEMTA0ODU3NiAuLi4gZXhjZXB0IExPRzEwISAqL1xuZnVuY3Rpb24gc2hpZnRfZm9ybXVsYV9zdHIoZi8qOnN0cmluZyovLCBkZWx0YS8qOkNlbGwqLykvKjpzdHJpbmcqLyB7XG5cdHJldHVybiBmLnJlcGxhY2UoY3JlZnJlZ2V4LCBmdW5jdGlvbigkMCwgJDEsICQyLCAkMywgJDQsICQ1KSB7XG5cdFx0cmV0dXJuICQxKygkMj09XCIkXCIgPyAkMiskMyA6IGVuY29kZV9jb2woZGVjb2RlX2NvbCgkMykrZGVsdGEuYykpKygkND09XCIkXCIgPyAkNCskNSA6IGVuY29kZV9yb3coZGVjb2RlX3JvdygkNSkgKyBkZWx0YS5yKSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBzaGlmdF9mb3JtdWxhX3hsc3goZi8qOnN0cmluZyovLCByYW5nZS8qOnN0cmluZyovLCBjZWxsLyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgciA9IGRlY29kZV9yYW5nZShyYW5nZSksIHMgPSByLnMsIGMgPSBkZWNvZGVfY2VsbChjZWxsKTtcblx0dmFyIGRlbHRhID0ge3I6Yy5yIC0gcy5yLCBjOmMuYyAtIHMuY307XG5cdHJldHVybiBzaGlmdF9mb3JtdWxhX3N0cihmLCBkZWx0YSk7XG59XG5cbi8qIFRPRE86IHBhcnNlIGZvcm11bGEgKi9cbmZ1bmN0aW9uIGZ1enp5Zm1sYShmLyo6c3RyaW5nKi8pLyo6Ym9vbGVhbiovIHtcblx0aWYoZi5sZW5ndGggPT0gMSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3hsZm4oZi8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0cmV0dXJuIGYucmVwbGFjZSgvX3hsZm5cXC4vZyxcIlwiKTtcbn1cbmZ1bmN0aW9uIHBhcnNlcmVhZDEoYmxvYikgeyBibG9iLmwrPTE7IHJldHVybjsgfVxuXG4vKiBbTVMtWExTXSAyLjUuNTEgKi9cbmZ1bmN0aW9uIHBhcnNlX0NvbFJlbFUoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBjID0gYmxvYi5yZWFkX3NoaWZ0KGxlbmd0aCA9PSAxID8gMSA6IDIpO1xuXHRyZXR1cm4gW2MgJiAweDNGRkYsIChjID4+IDE0KSAmIDEsIChjID4+IDE1KSAmIDFdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjEwNSA7IFtNUy1YTFNCXSAyLjUuOTcuODkgKi9cbmZ1bmN0aW9uIHBhcnNlX1JnY2VBcmVhKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdyA9IDI7XG5cdGlmKG9wdHMpIHtcblx0XHRpZihvcHRzLmJpZmYgPj0gMiAmJiBvcHRzLmJpZmYgPD0gNSkgcmV0dXJuIHBhcnNlX1JnY2VBcmVhX0JJRkYyKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdFx0ZWxzZSBpZihvcHRzLmJpZmYgPT0gMTIpIHcgPSA0O1xuXHR9XG5cdHZhciByPWJsb2IucmVhZF9zaGlmdCh3KSwgUj1ibG9iLnJlYWRfc2hpZnQodyk7XG5cdHZhciBjPXBhcnNlX0NvbFJlbFUoYmxvYiwgMik7XG5cdHZhciBDPXBhcnNlX0NvbFJlbFUoYmxvYiwgMik7XG5cdHJldHVybiB7IHM6e3I6ciwgYzpjWzBdLCBjUmVsOmNbMV0sIHJSZWw6Y1syXX0sIGU6e3I6UiwgYzpDWzBdLCBjUmVsOkNbMV0sIHJSZWw6Q1syXX0gfTtcbn1cbi8qIEJJRkYgMi01IGVuY29kZXMgZmxhZ3MgaW4gdGhlIHJvdyBmaWVsZCAqL1xuZnVuY3Rpb24gcGFyc2VfUmdjZUFyZWFfQklGRjIoYmxvYi8qOjosIGxlbmd0aCwgb3B0cyovKSB7XG5cdHZhciByPXBhcnNlX0NvbFJlbFUoYmxvYiwgMiksIFI9cGFyc2VfQ29sUmVsVShibG9iLCAyKTtcblx0dmFyIGM9YmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHR2YXIgQz1ibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiB7IHM6e3I6clswXSwgYzpjLCBjUmVsOnJbMV0sIHJSZWw6clsyXX0sIGU6e3I6UlswXSwgYzpDLCBjUmVsOlJbMV0sIHJSZWw6UlsyXX0gfTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4xMDUgOyBbTVMtWExTQl0gMi41Ljk3LjkwICovXG5mdW5jdGlvbiBwYXJzZV9SZ2NlQXJlYVJlbChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmIDwgOCkgcmV0dXJuIHBhcnNlX1JnY2VBcmVhX0JJRkYyKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdHZhciByPWJsb2IucmVhZF9zaGlmdChvcHRzLmJpZmYgPT0gMTIgPyA0IDogMiksIFI9YmxvYi5yZWFkX3NoaWZ0KG9wdHMuYmlmZiA9PSAxMiA/IDQgOiAyKTtcblx0dmFyIGM9cGFyc2VfQ29sUmVsVShibG9iLCAyKTtcblx0dmFyIEM9cGFyc2VfQ29sUmVsVShibG9iLCAyKTtcblx0cmV0dXJuIHsgczp7cjpyLCBjOmNbMF0sIGNSZWw6Y1sxXSwgclJlbDpjWzJdfSwgZTp7cjpSLCBjOkNbMF0sIGNSZWw6Q1sxXSwgclJlbDpDWzJdfSB9O1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjEwOSA7IFtNUy1YTFNCXSAyLjUuOTcuOTEgKi9cbmZ1bmN0aW9uIHBhcnNlX1JnY2VMb2MoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGlmKG9wdHMgJiYgb3B0cy5iaWZmID49IDIgJiYgb3B0cy5iaWZmIDw9IDUpIHJldHVybiBwYXJzZV9SZ2NlTG9jX0JJRkYyKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdHZhciByID0gYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmID09IDEyID8gNCA6IDIpO1xuXHR2YXIgYyA9IHBhcnNlX0NvbFJlbFUoYmxvYiwgMik7XG5cdHJldHVybiB7cjpyLCBjOmNbMF0sIGNSZWw6Y1sxXSwgclJlbDpjWzJdfTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1JnY2VMb2NfQklGRjIoYmxvYi8qOjosIGxlbmd0aCwgb3B0cyovKSB7XG5cdHZhciByID0gcGFyc2VfQ29sUmVsVShibG9iLCAyKTtcblx0dmFyIGMgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiB7cjpyWzBdLCBjOmMsIGNSZWw6clsxXSwgclJlbDpyWzJdfTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4xMDcsIDIuNS40NyAqL1xuZnVuY3Rpb24gcGFyc2VfUmdjZUVsZkxvYyhibG9iLyo6OiwgbGVuZ3RoLCBvcHRzKi8pIHtcblx0dmFyIHIgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4ge3I6ciwgYzpjICYgMHhGRiwgZlF1b3RlZDohIShjICYgMHg0MDAwKSwgY1JlbDpjPj4xNSwgclJlbDpjPj4xNSB9O1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjExMSA7IFtNUy1YTFNCXSAyLjUuOTcuOTIgVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfUmdjZUxvY1JlbChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGJpZmYgPSBvcHRzICYmIG9wdHMuYmlmZiA/IG9wdHMuYmlmZiA6IDg7XG5cdGlmKGJpZmYgPj0gMiAmJiBiaWZmIDw9IDUpIHJldHVybiBwYXJzZV9SZ2NlTG9jUmVsX0JJRkYyKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdHZhciByID0gYmxvYi5yZWFkX3NoaWZ0KGJpZmYgPj0gMTIgPyA0IDogMik7XG5cdHZhciBjbCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGNSZWwgPSAoY2wgJiAweDQwMDApID4+IDE0LCByUmVsID0gKGNsICYgMHg4MDAwKSA+PiAxNTtcblx0Y2wgJj0gMHgzRkZGO1xuXHRpZihyUmVsID09IDEpIHdoaWxlKHIgPiAweDdGRkZGKSByIC09IDB4MTAwMDAwO1xuXHRpZihjUmVsID09IDEpIHdoaWxlKGNsID4gMHgxRkZGKSBjbCA9IGNsIC0gMHg0MDAwO1xuXHRyZXR1cm4ge3I6cixjOmNsLGNSZWw6Y1JlbCxyUmVsOnJSZWx9O1xufVxuZnVuY3Rpb24gcGFyc2VfUmdjZUxvY1JlbF9CSUZGMihibG9iLyo6OiwgbGVuZ3RoOm51bWJlciwgb3B0cyovKSB7XG5cdHZhciBybCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGMgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHZhciByUmVsID0gKHJsICYgMHg4MDAwKSA+PiAxNSwgY1JlbCA9IChybCAmIDB4NDAwMCkgPj4gMTQ7XG5cdHJsICY9IDB4M0ZGRjtcblx0aWYoclJlbCA9PSAxICYmIHJsID49IDB4MjAwMCkgcmwgPSBybCAtIDB4NDAwMDtcblx0aWYoY1JlbCA9PSAxICYmIGMgPj0gMHg4MCkgYyA9IGMgLSAweDEwMDtcblx0cmV0dXJuIHtyOnJsLGM6YyxjUmVsOmNSZWwsclJlbDpyUmVsfTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4yNyA7IFtNUy1YTFNCXSAyLjUuOTcuMTggKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0FyZWEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sKytdICYgMHg2MCkgPj4gNTtcblx0dmFyIGFyZWEgPSBwYXJzZV9SZ2NlQXJlYShibG9iLCBvcHRzLmJpZmYgPj0gMiAmJiBvcHRzLmJpZmYgPD0gNSA/IDYgOiA4LCBvcHRzKTtcblx0cmV0dXJuIFt0eXBlLCBhcmVhXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4yOCA7IFtNUy1YTFNCXSAyLjUuOTcuMTkgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0FyZWEzZChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYltibG9iLmwrK10gJiAweDYwKSA+PiA1O1xuXHR2YXIgaXh0aSA9IGJsb2IucmVhZF9zaGlmdCgyLCAnaScpO1xuXHR2YXIgdyA9IDg7XG5cdGlmKG9wdHMpIHN3aXRjaChvcHRzLmJpZmYpIHtcblx0XHRjYXNlIDU6IGJsb2IubCArPSAxMjsgdyA9IDY7IGJyZWFrO1xuXHRcdGNhc2UgMTI6IHcgPSAxMjsgYnJlYWs7XG5cdH1cblx0dmFyIGFyZWEgPSBwYXJzZV9SZ2NlQXJlYShibG9iLCB3LCBvcHRzKTtcblx0cmV0dXJuIFt0eXBlLCBpeHRpLCBhcmVhXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4yOSA7IFtNUy1YTFNCXSAyLjUuOTcuMjAgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0FyZWFFcnIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sKytdICYgMHg2MCkgPj4gNTtcblx0YmxvYi5sICs9IG9wdHMgJiYgKG9wdHMuYmlmZiA+IDgpID8gMTIgOiAob3B0cy5iaWZmIDwgOCA/IDYgOiA4KTtcblx0cmV0dXJuIFt0eXBlXTtcbn1cbi8qIFtNUy1YTFNdIDIuNS4xOTguMzAgOyBbTVMtWExTQl0gMi41Ljk3LjIxICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBcmVhRXJyM2QoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sKytdICYgMHg2MCkgPj4gNTtcblx0dmFyIGl4dGkgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciB3ID0gODtcblx0aWYob3B0cykgc3dpdGNoKG9wdHMuYmlmZikge1xuXHRcdGNhc2UgNTogYmxvYi5sICs9IDEyOyB3ID0gNjsgYnJlYWs7XG5cdFx0Y2FzZSAxMjogdyA9IDEyOyBicmVhaztcblx0fVxuXHRibG9iLmwgKz0gdztcblx0cmV0dXJuIFt0eXBlLCBpeHRpXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zMSA7IFtNUy1YTFNCXSAyLjUuOTcuMjIgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0FyZWFOKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdHlwZSA9IChibG9iW2Jsb2IubCsrXSAmIDB4NjApID4+IDU7XG5cdHZhciBhcmVhID0gcGFyc2VfUmdjZUFyZWFSZWwoYmxvYiwgbGVuZ3RoIC0gMSwgb3B0cyk7XG5cdHJldHVybiBbdHlwZSwgYXJlYV07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMzIgOyBbTVMtWExTQl0gMi41Ljk3LjIzICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBcnJheShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYltibG9iLmwrK10gJiAweDYwKSA+PiA1O1xuXHRibG9iLmwgKz0gb3B0cy5iaWZmID09IDIgPyA2IDogb3B0cy5iaWZmID09IDEyID8gMTQgOiA3O1xuXHRyZXR1cm4gW3R5cGVdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjMzIDsgW01TLVhMU0JdIDIuNS45Ny4yNCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0ckJheGNlbChibG9iKSB7XG5cdHZhciBiaXRTZW1pID0gYmxvYltibG9iLmwrMV0gJiAweDAxOyAvKiAxID0gdm9sYXRpbGUgKi9cblx0dmFyIGJpdEJheGNlbCA9IDE7XG5cdGJsb2IubCArPSA0O1xuXHRyZXR1cm4gW2JpdFNlbWksIGJpdEJheGNlbF07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMzQgOyBbTVMtWExTQl0gMi41Ljk3LjI1ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBdHRyQ2hvb3NlKGJsb2IsIGxlbmd0aCwgb3B0cykvKjpBcnJheTxudW1iZXI+Ki8ge1xuXHRibG9iLmwgKz0yO1xuXHR2YXIgb2Zmc2V0ID0gYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAxIDogMik7XG5cdHZhciBvLyo6QXJyYXk8bnVtYmVyPiovID0gW107XG5cdC8qIG9mZnNldCBpcyAxIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzICovXG5cdGZvcih2YXIgaSA9IDA7IGkgPD0gb2Zmc2V0OyArK2kpIG8ucHVzaChibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPT0gMiA/IDEgOiAyKSk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjM1IDsgW01TLVhMU0JdIDIuNS45Ny4yNiAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0ckdvdG8oYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBiaXRHb3RvID0gKGJsb2JbYmxvYi5sKzFdICYgMHhGRikgPyAxIDogMDtcblx0YmxvYi5sICs9IDI7XG5cdHJldHVybiBbYml0R290bywgYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAxIDogMildO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjM2IDsgW01TLVhMU0JdIDIuNS45Ny4yNyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0cklmKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgYml0SWYgPSAoYmxvYltibG9iLmwrMV0gJiAweEZGKSA/IDEgOiAwO1xuXHRibG9iLmwgKz0gMjtcblx0cmV0dXJuIFtiaXRJZiwgYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAxIDogMildO1xufVxuXG4vKiBbTVMtWExTQl0gMi41Ljk3LjI4ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBdHRySWZFcnJvcihibG9iKSB7XG5cdHZhciBiaXRJZiA9IChibG9iW2Jsb2IubCsxXSAmIDB4RkYpID8gMSA6IDA7XG5cdGJsb2IubCArPSAyO1xuXHRyZXR1cm4gW2JpdElmLCBibG9iLnJlYWRfc2hpZnQoMildO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjM3IDsgW01TLVhMU0JdIDIuNS45Ny4yOSAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0clNlbWkoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBiaXRTZW1pID0gKGJsb2JbYmxvYi5sKzFdICYgMHhGRikgPyAxIDogMDtcblx0YmxvYi5sICs9IG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAzIDogNDtcblx0cmV0dXJuIFtiaXRTZW1pXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC40MCA7IFtNUy1YTFNCXSAyLjUuOTcuMzIgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJTcGFjZVR5cGUoYmxvYi8qOjosIGxlbmd0aCovKSB7XG5cdHZhciB0eXBlID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCBjY2ggPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiBbdHlwZSwgY2NoXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zOCA7IFtNUy1YTFNCXSAyLjUuOTcuMzAgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJTcGFjZShibG9iKSB7XG5cdGJsb2IucmVhZF9zaGlmdCgyKTtcblx0cmV0dXJuIHBhcnNlX1B0Z0F0dHJTcGFjZVR5cGUoYmxvYiwgMik7XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMzkgOyBbTVMtWExTQl0gMi41Ljk3LjMxICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBdHRyU3BhY2VTZW1pKGJsb2IpIHtcblx0YmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4gcGFyc2VfUHRnQXR0clNwYWNlVHlwZShibG9iLCAyKTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC44NCA7IFtNUy1YTFNCXSAyLjUuOTcuNjggVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnUmVmKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHQvL3ZhciBwdGcgPSBibG9iW2Jsb2IubF0gJiAweDFGO1xuXHR2YXIgdHlwZSA9IChibG9iW2Jsb2IubF0gJiAweDYwKT4+NTtcblx0YmxvYi5sICs9IDE7XG5cdHZhciBsb2MgPSBwYXJzZV9SZ2NlTG9jKGJsb2IsIDAsIG9wdHMpO1xuXHRyZXR1cm4gW3R5cGUsIGxvY107XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguODggOyBbTVMtWExTQl0gMi41Ljk3LjcyIFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z1JlZk4oYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sXSAmIDB4NjApPj41O1xuXHRibG9iLmwgKz0gMTtcblx0dmFyIGxvYyA9IHBhcnNlX1JnY2VMb2NSZWwoYmxvYiwgMCwgb3B0cyk7XG5cdHJldHVybiBbdHlwZSwgbG9jXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC44NSA7IFtNUy1YTFNCXSAyLjUuOTcuNjkgVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnUmVmM2QoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sXSAmIDB4NjApPj41O1xuXHRibG9iLmwgKz0gMTtcblx0dmFyIGl4dGkgPSBibG9iLnJlYWRfc2hpZnQoMik7IC8vIFh0aUluZGV4XG5cdGlmKG9wdHMgJiYgb3B0cy5iaWZmID09IDUpIGJsb2IubCArPSAxMjtcblx0dmFyIGxvYyA9IHBhcnNlX1JnY2VMb2MoYmxvYiwgMCwgb3B0cyk7IC8vIFRPRE86IG9yIFJnY2VMb2NSZWxcblx0cmV0dXJuIFt0eXBlLCBpeHRpLCBsb2NdO1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNjIgOyBbTVMtWExTQl0gMi41Ljk3LjQ1IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0Z1bmMoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdC8vdmFyIHB0ZyA9IGJsb2JbYmxvYi5sXSAmIDB4MUY7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sXSAmIDB4NjApPj41O1xuXHRibG9iLmwgKz0gMTtcblx0dmFyIGlmdGFiID0gYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmIDw9IDMgPyAxIDogMik7XG5cdHJldHVybiBbRnRhYkFyZ2NbaWZ0YWJdLCBGdGFiW2lmdGFiXSwgdHlwZV07XG59XG4vKiBbTVMtWExTXSAyLjUuMTk4LjYzIDsgW01TLVhMU0JdIDIuNS45Ny40NiBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9QdGdGdW5jVmFyKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdHlwZSA9IGJsb2JbYmxvYi5sKytdO1xuXHR2YXIgY3BhcmFtcyA9IGJsb2IucmVhZF9zaGlmdCgxKSwgdGFiID0gb3B0cyAmJiBvcHRzLmJpZmYgPD0gMyA/IFsodHlwZSA9PSAweDU4ID8gLTEgOiAwKSwgYmxvYi5yZWFkX3NoaWZ0KDEpXTogcGFyc2V0YWIoYmxvYik7XG5cdHJldHVybiBbY3BhcmFtcywgKHRhYlswXSA9PT0gMCA/IEZ0YWIgOiBDZXRhYilbdGFiWzFdXV07XG59XG5cbmZ1bmN0aW9uIHBhcnNldGFiKGJsb2IpIHtcblx0cmV0dXJuIFtibG9iW2Jsb2IubCsxXT4+NywgYmxvYi5yZWFkX3NoaWZ0KDIpICYgMHg3RkZGXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC40MSA7IFtNUy1YTFNCXSAyLjUuOTcuMzMgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJTdW0oYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGJsb2IubCArPSBvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMyA6IDQ7IHJldHVybjtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC41OCA7IFtNUy1YTFNCXSAyLjUuOTcuNDAgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0V4cChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0YmxvYi5sKys7XG5cdGlmKG9wdHMgJiYgb3B0cy5iaWZmID09IDEyKSByZXR1cm4gW2Jsb2IucmVhZF9zaGlmdCg0LCAnaScpLCAwXTtcblx0dmFyIHJvdyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGNvbCA9IGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMSA6IDIpO1xuXHRyZXR1cm4gW3JvdywgY29sXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC41NyA7IFtNUy1YTFNCXSAyLjUuOTcuMzkgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0VycihibG9iKSB7IGJsb2IubCsrOyByZXR1cm4gQkVycltibG9iLnJlYWRfc2hpZnQoMSldOyB9XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNjYgOyBbTVMtWExTQl0gMi41Ljk3LjQ5ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdJbnQoYmxvYikgeyBibG9iLmwrKzsgcmV0dXJuIGJsb2IucmVhZF9zaGlmdCgyKTsgfVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjQyIDsgW01TLVhMU0JdIDIuNS45Ny4zNCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQm9vbChibG9iKSB7IGJsb2IubCsrOyByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDEpIT09MDt9XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNzkgOyBbTVMtWExTQl0gMi41Ljk3LjYzICovXG5mdW5jdGlvbiBwYXJzZV9QdGdOdW0oYmxvYikgeyBibG9iLmwrKzsgcmV0dXJuIHBhcnNlX1hudW0oYmxvYiwgOCk7IH1cblxuLyogW01TLVhMU10gMi41LjE5OC44OSA7IFtNUy1YTFNCXSAyLjUuOTcuNzQgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z1N0cihibG9iLCBsZW5ndGgsIG9wdHMpIHsgYmxvYi5sKys7IHJldHVybiBwYXJzZV9TaG9ydFhMVW5pY29kZVN0cmluZyhibG9iLCBsZW5ndGgtMSwgb3B0cyk7IH1cblxuLyogW01TLVhMU10gMi41LjE5Mi4xMTIgKyAyLjUuMTkyLjExezMsNCw1LDYsN30gKi9cbi8qIFtNUy1YTFNCXSAyLjUuOTcuOTMgKyAyLjUuOTcuOXs0LDUsNiw3fSAqL1xuZnVuY3Rpb24gcGFyc2VfU2VyQXIoYmxvYiwgYmlmZi8qOm51bWJlciovKSB7XG5cdHZhciB2YWwgPSBbYmxvYi5yZWFkX3NoaWZ0KDEpXTtcblx0aWYoYmlmZiA9PSAxMikgc3dpdGNoKHZhbFswXSkge1xuXHRcdGNhc2UgMHgwMjogdmFsWzBdID0gMHgwNDsgYnJlYWs7IC8qIFNlckJvb2wgKi9cblx0XHRjYXNlIDB4MDQ6IHZhbFswXSA9IDB4MTA7IGJyZWFrOyAvKiBTZXJFcnIgKi9cblx0XHRjYXNlIDB4MDA6IHZhbFswXSA9IDB4MDE7IGJyZWFrOyAvKiBTZXJOdW0gKi9cblx0XHRjYXNlIDB4MDE6IHZhbFswXSA9IDB4MDI7IGJyZWFrOyAvKiBTZXJTdHIgKi9cblx0fVxuXHRzd2l0Y2godmFsWzBdKSB7XG5cdFx0Y2FzZSAweDA0OiAvKiBTZXJCb29sIC0tIGJvb2xlYW4gKi9cblx0XHRcdHZhbFsxXSA9IHBhcnNlYm9vbChibG9iLCAxKSA/ICdUUlVFJyA6ICdGQUxTRSc7XG5cdFx0XHRpZihiaWZmICE9IDEyKSBibG9iLmwgKz0gNzsgYnJlYWs7XG5cdFx0Y2FzZSAweDI1OiAvKiBhcHBlYXJzIHRvIGJlIGFuIGFsaWFzICovXG5cdFx0Y2FzZSAweDEwOiAvKiBTZXJFcnIgLS0gZXJyb3IgKi9cblx0XHRcdHZhbFsxXSA9IEJFcnJbYmxvYltibG9iLmxdXTtcblx0XHRcdGJsb2IubCArPSAoKGJpZmYgPT0gMTIpID8gNCA6IDgpOyBicmVhaztcblx0XHRjYXNlIDB4MDA6IC8qIFNlck5pbCAtLSBob25lc3RseSwgSSdtIG5vdCBzdXJlIGhvdyB0byByZXByb2R1Y2UgdGhpcyAqL1xuXHRcdFx0YmxvYi5sICs9IDg7IGJyZWFrO1xuXHRcdGNhc2UgMHgwMTogLyogU2VyTnVtIC0tIFhudW0gKi9cblx0XHRcdHZhbFsxXSA9IHBhcnNlX1hudW0oYmxvYiwgOCk7IGJyZWFrO1xuXHRcdGNhc2UgMHgwMjogLyogU2VyU3RyIC0tIFhMVW5pY29kZVN0cmluZyAoPDI1NiBjaGFycykgKi9cblx0XHRcdHZhbFsxXSA9IHBhcnNlX1hMVW5pY29kZVN0cmluZzIoYmxvYiwgMCwge2JpZmY6YmlmZiA+IDAgJiYgYmlmZiA8IDggPyAyIDogYmlmZn0pOyBicmVhaztcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgU2VyQXI6IFwiICsgdmFsWzBdKTsgLyogVW5yZWFjaGFibGUgKi9cblx0fVxuXHRyZXR1cm4gdmFsO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjYxIDsgW01TLVhMU0JdIDIuNS45Ny40NCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnRXh0cmFNZW0oYmxvYiwgY2NlLCBvcHRzKSB7XG5cdHZhciBjb3VudCA9IGJsb2IucmVhZF9zaGlmdCgob3B0cy5iaWZmID09IDEyKSA/IDQgOiAyKTtcblx0dmFyIG91dC8qOkFycmF5PFJhbmdlPiovID0gW107XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gY291bnQ7ICsraSkgb3V0LnB1c2goKChvcHRzLmJpZmYgPT0gMTIpID8gcGFyc2VfVW5jaGVja2VkUmZYIDogcGFyc2VfUmVmOFUpKGJsb2IsIDgpKTtcblx0cmV0dXJuIG91dDtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC41OSA7IFtNUy1YTFNCXSAyLjUuOTcuNDEgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0V4dHJhQXJyYXkoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciByb3dzID0gMCwgY29scyA9IDA7XG5cdGlmKG9wdHMuYmlmZiA9PSAxMikge1xuXHRcdHJvd3MgPSBibG9iLnJlYWRfc2hpZnQoNCk7IC8vIERSd1xuXHRcdGNvbHMgPSBibG9iLnJlYWRfc2hpZnQoNCk7IC8vIERDb2xcblx0fSBlbHNlIHtcblx0XHRjb2xzID0gMSArIGJsb2IucmVhZF9zaGlmdCgxKTsgLy9EQ29sQnl0ZVVcblx0XHRyb3dzID0gMSArIGJsb2IucmVhZF9zaGlmdCgyKTsgLy9EUndcblx0fVxuXHRpZihvcHRzLmJpZmYgPj0gMiAmJiBvcHRzLmJpZmYgPCA4KSB7IC0tcm93czsgaWYoLS1jb2xzID09IDApIGNvbHMgPSAweDEwMDsgfVxuXHQvLyAkRmxvd0lnbm9yZVxuXHRmb3IodmFyIGkgPSAwLCBvLyo6QXJyYXk8QXJyYXk8YW55Pj4qLyA9IFtdOyBpICE9IHJvd3MgJiYgKG9baV0gPSBbXSk7ICsraSlcblx0XHRmb3IodmFyIGogPSAwOyBqICE9IGNvbHM7ICsraikgb1tpXVtqXSA9IHBhcnNlX1NlckFyKGJsb2IsIG9wdHMuYmlmZik7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4Ljc2IDsgW01TLVhMU0JdIDIuNS45Ny42MCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnTmFtZShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdHZhciB3ID0gKCFvcHRzIHx8IChvcHRzLmJpZmYgPj0gOCkpID8gNCA6IDI7XG5cdHZhciBuYW1laW5kZXggPSBibG9iLnJlYWRfc2hpZnQodyk7XG5cdHN3aXRjaChvcHRzLmJpZmYpIHtcblx0XHRjYXNlIDI6IGJsb2IubCArPSA1OyBicmVhaztcblx0XHRjYXNlIDM6IGNhc2UgNDogYmxvYi5sICs9IDg7IGJyZWFrO1xuXHRcdGNhc2UgNTogYmxvYi5sICs9IDEyOyBicmVhaztcblx0fVxuXHRyZXR1cm4gW3R5cGUsIDAsIG5hbWVpbmRleF07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNzcgOyBbTVMtWExTQl0gMi41Ljk3LjYxICovXG5mdW5jdGlvbiBwYXJzZV9QdGdOYW1lWChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmID09IDUpIHJldHVybiBwYXJzZV9QdGdOYW1lWF9CSUZGNShibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHR2YXIgdHlwZSA9IChibG9iLnJlYWRfc2hpZnQoMSkgPj4+IDUpICYgMHgwMztcblx0dmFyIGl4dGkgPSBibG9iLnJlYWRfc2hpZnQoMik7IC8vIFh0aUluZGV4XG5cdHZhciBuYW1laW5kZXggPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBbdHlwZSwgaXh0aSwgbmFtZWluZGV4XTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z05hbWVYX0JJRkY1KGJsb2IvKjo6LCBsZW5ndGgsIG9wdHMqLykge1xuXHR2YXIgdHlwZSA9IChibG9iLnJlYWRfc2hpZnQoMSkgPj4+IDUpICYgMHgwMztcblx0dmFyIGl4dGkgPSBibG9iLnJlYWRfc2hpZnQoMiwgJ2knKTsgLy8gWHRpSW5kZXhcblx0YmxvYi5sICs9IDg7XG5cdHZhciBuYW1laW5kZXggPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAxMjtcblx0cmV0dXJuIFt0eXBlLCBpeHRpLCBuYW1laW5kZXhdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjcwIDsgW01TLVhMU0JdIDIuNS45Ny41NCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnTWVtQXJlYShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdGJsb2IubCArPSAob3B0cyAmJiBvcHRzLmJpZmYgPT0gMiA/IDMgOiA0KTtcblx0dmFyIGNjZSA9IGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMSA6IDIpO1xuXHRyZXR1cm4gW3R5cGUsIGNjZV07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNzIgOyBbTVMtWExTQl0gMi41Ljk3LjU2ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdNZW1GdW5jKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdHlwZSA9IChibG9iLnJlYWRfc2hpZnQoMSkgPj4+IDUpICYgMHgwMztcblx0dmFyIGNjZSA9IGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMSA6IDIpO1xuXHRyZXR1cm4gW3R5cGUsIGNjZV07XG59XG5cblxuLyogW01TLVhMU10gMi41LjE5OC44NiA7IFtNUy1YTFNCXSAyLjUuOTcuNjkgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z1JlZkVycihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdGJsb2IubCArPSA0O1xuXHRpZihvcHRzLmJpZmYgPCA4KSBibG9iLmwtLTtcblx0aWYob3B0cy5iaWZmID09IDEyKSBibG9iLmwgKz0gMjtcblx0cmV0dXJuIFt0eXBlXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC44NyA7IFtNUy1YTFNCXSAyLjUuOTcuNzEgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z1JlZkVycjNkKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdHlwZSA9IChibG9iW2Jsb2IubCsrXSAmIDB4NjApID4+IDU7XG5cdHZhciBpeHRpID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgdyA9IDQ7XG5cdGlmKG9wdHMpIHN3aXRjaChvcHRzLmJpZmYpIHtcblx0XHRjYXNlIDU6IHcgPSAxNTsgYnJlYWs7XG5cdFx0Y2FzZSAxMjogdyA9IDY7IGJyZWFrO1xuXHR9XG5cdGJsb2IubCArPSB3O1xuXHRyZXR1cm4gW3R5cGUsIGl4dGldO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjcxIDsgW01TLVhMU0JdIDIuNS45Ny41NSAqL1xudmFyIHBhcnNlX1B0Z01lbUVyciA9IHBhcnNlbm9vcDtcbi8qIFtNUy1YTFNdIDIuNS4xOTguNzMgIDsgW01TLVhMU0JdIDIuNS45Ny41NyAqL1xudmFyIHBhcnNlX1B0Z01lbU5vTWVtID0gcGFyc2Vub29wO1xuLyogW01TLVhMU10gMi41LjE5OC45MiAqL1xudmFyIHBhcnNlX1B0Z1RibCA9IHBhcnNlbm9vcDtcblxuZnVuY3Rpb24gcGFyc2VfUHRnRWxmTG9jKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRibG9iLmwgKz0gMjtcblx0cmV0dXJuIFtwYXJzZV9SZ2NlRWxmTG9jKGJsb2IsIDQsIG9wdHMpXTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z0VsZk5vb3AoYmxvYi8qOjosIGxlbmd0aCwgb3B0cyovKSB7XG5cdGJsb2IubCArPSA2O1xuXHRyZXR1cm4gW107XG59XG4vKiBbTVMtWExTXSAyLjUuMTk4LjQ2ICovXG52YXIgcGFyc2VfUHRnRWxmQ29sID0gcGFyc2VfUHRnRWxmTG9jO1xuLyogW01TLVhMU10gMi41LjE5OC40NyAqL1xudmFyIHBhcnNlX1B0Z0VsZkNvbFMgPSBwYXJzZV9QdGdFbGZOb29wO1xuLyogW01TLVhMU10gMi41LjE5OC40OCAqL1xudmFyIHBhcnNlX1B0Z0VsZkNvbFNWID0gcGFyc2VfUHRnRWxmTm9vcDtcbi8qIFtNUy1YTFNdIDIuNS4xOTguNDkgKi9cbnZhciBwYXJzZV9QdGdFbGZDb2xWID0gcGFyc2VfUHRnRWxmTG9jO1xuLyogW01TLVhMU10gMi41LjE5OC41MCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnRWxmTGVsKGJsb2IvKjo6LCBsZW5ndGgsIG9wdHMqLykge1xuXHRibG9iLmwgKz0gMjtcblx0cmV0dXJuIFtwYXJzZXVpbnQxNihibG9iKSwgYmxvYi5yZWFkX3NoaWZ0KDIpICYgMHgwMV07XG59XG4vKiBbTVMtWExTXSAyLjUuMTk4LjUxICovXG52YXIgcGFyc2VfUHRnRWxmUmFkaWNhbCA9IHBhcnNlX1B0Z0VsZkxvYztcbi8qIFtNUy1YTFNdIDIuNS4xOTguNTIgKi9cbnZhciBwYXJzZV9QdGdFbGZSYWRpY2FsTGVsID0gcGFyc2VfUHRnRWxmTGVsO1xuLyogW01TLVhMU10gMi41LjE5OC41MyAqL1xudmFyIHBhcnNlX1B0Z0VsZlJhZGljYWxTID0gcGFyc2VfUHRnRWxmTm9vcDtcbi8qIFtNUy1YTFNdIDIuNS4xOTguNTQgKi9cbnZhciBwYXJzZV9QdGdFbGZSdyA9IHBhcnNlX1B0Z0VsZkxvYztcbi8qIFtNUy1YTFNdIDIuNS4xOTguNTUgKi9cbnZhciBwYXJzZV9QdGdFbGZSd1YgPSBwYXJzZV9QdGdFbGZMb2M7XG5cbi8qIFtNUy1YTFNCXSAyLjUuOTcuNTIgVE9ETyAqL1xudmFyIFB0Z0xpc3RSVCA9IFtcblx0XCJEYXRhXCIsXG5cdFwiQWxsXCIsXG5cdFwiSGVhZGVyc1wiLFxuXHRcIj8/XCIsXG5cdFwiP0RhdGEyXCIsXG5cdFwiPz9cIixcblx0XCI/RGF0YUhlYWRlcnNcIixcblx0XCI/P1wiLFxuXHRcIlRvdGFsc1wiLFxuXHRcIj8/XCIsXG5cdFwiPz9cIixcblx0XCI/P1wiLFxuXHRcIj9EYXRhVG90YWxzXCIsXG5cdFwiPz9cIixcblx0XCI/P1wiLFxuXHRcIj8/XCIsXG5cdFwiP0N1cnJlbnRcIlxuXTtcbmZ1bmN0aW9uIHBhcnNlX1B0Z0xpc3QoYmxvYi8qOjosIGxlbmd0aCwgb3B0cyovKSB7XG5cdGJsb2IubCArPSAyO1xuXHR2YXIgaXh0aSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgaWR4ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgYyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIEMgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBydCA9IFB0Z0xpc3RSVFsoZmxhZ3MgPj4gMikgJiAweDFGXTtcblx0cmV0dXJuIHtpeHRpOiBpeHRpLCBjb2x0eXBlOihmbGFncyYweDMpLCBydDpydCwgaWR4OmlkeCwgYzpjLCBDOkN9O1xufVxuLyogW01TLVhMU10gMi41LjE5OC45MSA7IFtNUy1YTFNCXSAyLjUuOTcuNzYgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z1N4TmFtZShibG9iLyo6OiwgbGVuZ3RoLCBvcHRzKi8pIHtcblx0YmxvYi5sICs9IDI7XG5cdHJldHVybiBbYmxvYi5yZWFkX3NoaWZ0KDQpXTtcbn1cblxuLyogW1hMU10gb2xkIHNwZWMgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z1NoZWV0KGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRibG9iLmwgKz0gNTtcblx0YmxvYi5sICs9IDI7XG5cdGJsb2IubCArPSAob3B0cy5iaWZmID09IDIgPyAxIDogNCk7XG5cdHJldHVybiBbXCJQVEdTSEVFVFwiXTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z0VuZFNoZWV0KGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRibG9iLmwgKz0gKG9wdHMuYmlmZiA9PSAyID8gNCA6IDUpO1xuXHRyZXR1cm4gW1wiUFRHRU5EU0hFRVRcIl07XG59XG5mdW5jdGlvbiBwYXJzZV9QdGdNZW1BcmVhTihibG9iLyo6OiwgbGVuZ3RoLCBvcHRzKi8pIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdHZhciBjY2UgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiBbdHlwZSwgY2NlXTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z01lbU5vTWVtTihibG9iLyo6OiwgbGVuZ3RoLCBvcHRzKi8pIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdHZhciBjY2UgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiBbdHlwZSwgY2NlXTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJOb29wKGJsb2IvKjo6LCBsZW5ndGgsIG9wdHMqLykge1xuXHRibG9iLmwgKz0gNDtcblx0cmV0dXJuIFswLCAwXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4yNSA7IFtNUy1YTFNCXSAyLjUuOTcuMTYgKi9cbnZhciBQdGdUeXBlcyA9IHtcblx0Lyo6OlsqLzB4MDEvKjo6XSovOiB7IG46J1B0Z0V4cCcsIGY6cGFyc2VfUHRnRXhwIH0sXG5cdC8qOjpbKi8weDAyLyo6Ol0qLzogeyBuOidQdGdUYmwnLCBmOnBhcnNlX1B0Z1RibCB9LFxuXHQvKjo6WyovMHgwMy8qOjpdKi86IHsgbjonUHRnQWRkJywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDA0Lyo6Ol0qLzogeyBuOidQdGdTdWInLCBmOnBhcnNlcmVhZDEgfSxcblx0Lyo6OlsqLzB4MDUvKjo6XSovOiB7IG46J1B0Z011bCcsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgwNi8qOjpdKi86IHsgbjonUHRnRGl2JywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDA3Lyo6Ol0qLzogeyBuOidQdGdQb3dlcicsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgwOC8qOjpdKi86IHsgbjonUHRnQ29uY2F0JywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDA5Lyo6Ol0qLzogeyBuOidQdGdMdCcsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgwQS8qOjpdKi86IHsgbjonUHRnTGUnLCBmOnBhcnNlcmVhZDEgfSxcblx0Lyo6OlsqLzB4MEIvKjo6XSovOiB7IG46J1B0Z0VxJywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDBDLyo6Ol0qLzogeyBuOidQdGdHZScsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgwRC8qOjpdKi86IHsgbjonUHRnR3QnLCBmOnBhcnNlcmVhZDEgfSxcblx0Lyo6OlsqLzB4MEUvKjo6XSovOiB7IG46J1B0Z05lJywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDBGLyo6Ol0qLzogeyBuOidQdGdJc2VjdCcsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgxMC8qOjpdKi86IHsgbjonUHRnVW5pb24nLCBmOnBhcnNlcmVhZDEgfSxcblx0Lyo6OlsqLzB4MTEvKjo6XSovOiB7IG46J1B0Z1JhbmdlJywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDEyLyo6Ol0qLzogeyBuOidQdGdVcGx1cycsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgxMy8qOjpdKi86IHsgbjonUHRnVW1pbnVzJywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDE0Lyo6Ol0qLzogeyBuOidQdGdQZXJjZW50JywgZjpwYXJzZXJlYWQxIH0sXG5cdC8qOjpbKi8weDE1Lyo6Ol0qLzogeyBuOidQdGdQYXJlbicsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgxNi8qOjpdKi86IHsgbjonUHRnTWlzc0FyZycsIGY6cGFyc2VyZWFkMSB9LFxuXHQvKjo6WyovMHgxNy8qOjpdKi86IHsgbjonUHRnU3RyJywgZjpwYXJzZV9QdGdTdHIgfSxcblx0Lyo6OlsqLzB4MUEvKjo6XSovOiB7IG46J1B0Z1NoZWV0JywgZjpwYXJzZV9QdGdTaGVldCB9LFxuXHQvKjo6WyovMHgxQi8qOjpdKi86IHsgbjonUHRnRW5kU2hlZXQnLCBmOnBhcnNlX1B0Z0VuZFNoZWV0IH0sXG5cdC8qOjpbKi8weDFDLyo6Ol0qLzogeyBuOidQdGdFcnInLCBmOnBhcnNlX1B0Z0VyciB9LFxuXHQvKjo6WyovMHgxRC8qOjpdKi86IHsgbjonUHRnQm9vbCcsIGY6cGFyc2VfUHRnQm9vbCB9LFxuXHQvKjo6WyovMHgxRS8qOjpdKi86IHsgbjonUHRnSW50JywgZjpwYXJzZV9QdGdJbnQgfSxcblx0Lyo6OlsqLzB4MUYvKjo6XSovOiB7IG46J1B0Z051bScsIGY6cGFyc2VfUHRnTnVtIH0sXG5cdC8qOjpbKi8weDIwLyo6Ol0qLzogeyBuOidQdGdBcnJheScsIGY6cGFyc2VfUHRnQXJyYXkgfSxcblx0Lyo6OlsqLzB4MjEvKjo6XSovOiB7IG46J1B0Z0Z1bmMnLCBmOnBhcnNlX1B0Z0Z1bmMgfSxcblx0Lyo6OlsqLzB4MjIvKjo6XSovOiB7IG46J1B0Z0Z1bmNWYXInLCBmOnBhcnNlX1B0Z0Z1bmNWYXIgfSxcblx0Lyo6OlsqLzB4MjMvKjo6XSovOiB7IG46J1B0Z05hbWUnLCBmOnBhcnNlX1B0Z05hbWUgfSxcblx0Lyo6OlsqLzB4MjQvKjo6XSovOiB7IG46J1B0Z1JlZicsIGY6cGFyc2VfUHRnUmVmIH0sXG5cdC8qOjpbKi8weDI1Lyo6Ol0qLzogeyBuOidQdGdBcmVhJywgZjpwYXJzZV9QdGdBcmVhIH0sXG5cdC8qOjpbKi8weDI2Lyo6Ol0qLzogeyBuOidQdGdNZW1BcmVhJywgZjpwYXJzZV9QdGdNZW1BcmVhIH0sXG5cdC8qOjpbKi8weDI3Lyo6Ol0qLzogeyBuOidQdGdNZW1FcnInLCBmOnBhcnNlX1B0Z01lbUVyciB9LFxuXHQvKjo6WyovMHgyOC8qOjpdKi86IHsgbjonUHRnTWVtTm9NZW0nLCBmOnBhcnNlX1B0Z01lbU5vTWVtIH0sXG5cdC8qOjpbKi8weDI5Lyo6Ol0qLzogeyBuOidQdGdNZW1GdW5jJywgZjpwYXJzZV9QdGdNZW1GdW5jIH0sXG5cdC8qOjpbKi8weDJBLyo6Ol0qLzogeyBuOidQdGdSZWZFcnInLCBmOnBhcnNlX1B0Z1JlZkVyciB9LFxuXHQvKjo6WyovMHgyQi8qOjpdKi86IHsgbjonUHRnQXJlYUVycicsIGY6cGFyc2VfUHRnQXJlYUVyciB9LFxuXHQvKjo6WyovMHgyQy8qOjpdKi86IHsgbjonUHRnUmVmTicsIGY6cGFyc2VfUHRnUmVmTiB9LFxuXHQvKjo6WyovMHgyRC8qOjpdKi86IHsgbjonUHRnQXJlYU4nLCBmOnBhcnNlX1B0Z0FyZWFOIH0sXG5cdC8qOjpbKi8weDJFLyo6Ol0qLzogeyBuOidQdGdNZW1BcmVhTicsIGY6cGFyc2VfUHRnTWVtQXJlYU4gfSxcblx0Lyo6OlsqLzB4MkYvKjo6XSovOiB7IG46J1B0Z01lbU5vTWVtTicsIGY6cGFyc2VfUHRnTWVtTm9NZW1OIH0sXG5cdC8qOjpbKi8weDM5Lyo6Ol0qLzogeyBuOidQdGdOYW1lWCcsIGY6cGFyc2VfUHRnTmFtZVggfSxcblx0Lyo6OlsqLzB4M0EvKjo6XSovOiB7IG46J1B0Z1JlZjNkJywgZjpwYXJzZV9QdGdSZWYzZCB9LFxuXHQvKjo6WyovMHgzQi8qOjpdKi86IHsgbjonUHRnQXJlYTNkJywgZjpwYXJzZV9QdGdBcmVhM2QgfSxcblx0Lyo6OlsqLzB4M0MvKjo6XSovOiB7IG46J1B0Z1JlZkVycjNkJywgZjpwYXJzZV9QdGdSZWZFcnIzZCB9LFxuXHQvKjo6WyovMHgzRC8qOjpdKi86IHsgbjonUHRnQXJlYUVycjNkJywgZjpwYXJzZV9QdGdBcmVhRXJyM2QgfSxcblx0Lyo6OlsqLzB4RkYvKjo6XSovOiB7fVxufTtcbi8qIFRoZXNlIGFyZSBkdXBsaWNhdGVkIGluIHRoZSBQdGdUeXBlcyB0YWJsZSAqL1xudmFyIFB0Z0R1cGVzID0ge1xuXHQvKjo6WyovMHg0MC8qOjpdKi86IDB4MjAsIC8qOjpbKi8weDYwLyo6Ol0qLzogMHgyMCxcblx0Lyo6OlsqLzB4NDEvKjo6XSovOiAweDIxLCAvKjo6WyovMHg2MS8qOjpdKi86IDB4MjEsXG5cdC8qOjpbKi8weDQyLyo6Ol0qLzogMHgyMiwgLyo6OlsqLzB4NjIvKjo6XSovOiAweDIyLFxuXHQvKjo6WyovMHg0My8qOjpdKi86IDB4MjMsIC8qOjpbKi8weDYzLyo6Ol0qLzogMHgyMyxcblx0Lyo6OlsqLzB4NDQvKjo6XSovOiAweDI0LCAvKjo6WyovMHg2NC8qOjpdKi86IDB4MjQsXG5cdC8qOjpbKi8weDQ1Lyo6Ol0qLzogMHgyNSwgLyo6OlsqLzB4NjUvKjo6XSovOiAweDI1LFxuXHQvKjo6WyovMHg0Ni8qOjpdKi86IDB4MjYsIC8qOjpbKi8weDY2Lyo6Ol0qLzogMHgyNixcblx0Lyo6OlsqLzB4NDcvKjo6XSovOiAweDI3LCAvKjo6WyovMHg2Ny8qOjpdKi86IDB4MjcsXG5cdC8qOjpbKi8weDQ4Lyo6Ol0qLzogMHgyOCwgLyo6OlsqLzB4NjgvKjo6XSovOiAweDI4LFxuXHQvKjo6WyovMHg0OS8qOjpdKi86IDB4MjksIC8qOjpbKi8weDY5Lyo6Ol0qLzogMHgyOSxcblx0Lyo6OlsqLzB4NEEvKjo6XSovOiAweDJBLCAvKjo6WyovMHg2QS8qOjpdKi86IDB4MkEsXG5cdC8qOjpbKi8weDRCLyo6Ol0qLzogMHgyQiwgLyo6OlsqLzB4NkIvKjo6XSovOiAweDJCLFxuXHQvKjo6WyovMHg0Qy8qOjpdKi86IDB4MkMsIC8qOjpbKi8weDZDLyo6Ol0qLzogMHgyQyxcblx0Lyo6OlsqLzB4NEQvKjo6XSovOiAweDJELCAvKjo6WyovMHg2RC8qOjpdKi86IDB4MkQsXG5cdC8qOjpbKi8weDRFLyo6Ol0qLzogMHgyRSwgLyo6OlsqLzB4NkUvKjo6XSovOiAweDJFLFxuXHQvKjo6WyovMHg0Ri8qOjpdKi86IDB4MkYsIC8qOjpbKi8weDZGLyo6Ol0qLzogMHgyRixcblx0Lyo6OlsqLzB4NTgvKjo6XSovOiAweDIyLCAvKjo6WyovMHg3OC8qOjpdKi86IDB4MjIsXG5cdC8qOjpbKi8weDU5Lyo6Ol0qLzogMHgzOSwgLyo6OlsqLzB4NzkvKjo6XSovOiAweDM5LFxuXHQvKjo6WyovMHg1QS8qOjpdKi86IDB4M0EsIC8qOjpbKi8weDdBLyo6Ol0qLzogMHgzQSxcblx0Lyo6OlsqLzB4NUIvKjo6XSovOiAweDNCLCAvKjo6WyovMHg3Qi8qOjpdKi86IDB4M0IsXG5cdC8qOjpbKi8weDVDLyo6Ol0qLzogMHgzQywgLyo6OlsqLzB4N0MvKjo6XSovOiAweDNDLFxuXHQvKjo6WyovMHg1RC8qOjpdKi86IDB4M0QsIC8qOjpbKi8weDdELyo6Ol0qLzogMHgzRFxufTtcblxudmFyIFB0ZzE4ID0ge1xuXHQvKjo6WyovMHgwMS8qOjpdKi86IHsgbjonUHRnRWxmTGVsJywgZjpwYXJzZV9QdGdFbGZMZWwgfSxcblx0Lyo6OlsqLzB4MDIvKjo6XSovOiB7IG46J1B0Z0VsZlJ3JywgZjpwYXJzZV9QdGdFbGZSdyB9LFxuXHQvKjo6WyovMHgwMy8qOjpdKi86IHsgbjonUHRnRWxmQ29sJywgZjpwYXJzZV9QdGdFbGZDb2wgfSxcblx0Lyo6OlsqLzB4MDYvKjo6XSovOiB7IG46J1B0Z0VsZlJ3VicsIGY6cGFyc2VfUHRnRWxmUndWIH0sXG5cdC8qOjpbKi8weDA3Lyo6Ol0qLzogeyBuOidQdGdFbGZDb2xWJywgZjpwYXJzZV9QdGdFbGZDb2xWIH0sXG5cdC8qOjpbKi8weDBBLyo6Ol0qLzogeyBuOidQdGdFbGZSYWRpY2FsJywgZjpwYXJzZV9QdGdFbGZSYWRpY2FsIH0sXG5cdC8qOjpbKi8weDBCLyo6Ol0qLzogeyBuOidQdGdFbGZSYWRpY2FsUycsIGY6cGFyc2VfUHRnRWxmUmFkaWNhbFMgfSxcblx0Lyo6OlsqLzB4MEQvKjo6XSovOiB7IG46J1B0Z0VsZkNvbFMnLCBmOnBhcnNlX1B0Z0VsZkNvbFMgfSxcblx0Lyo6OlsqLzB4MEYvKjo6XSovOiB7IG46J1B0Z0VsZkNvbFNWJywgZjpwYXJzZV9QdGdFbGZDb2xTViB9LFxuXHQvKjo6WyovMHgxMC8qOjpdKi86IHsgbjonUHRnRWxmUmFkaWNhbExlbCcsIGY6cGFyc2VfUHRnRWxmUmFkaWNhbExlbCB9LFxuXHQvKjo6WyovMHgxOS8qOjpdKi86IHsgbjonUHRnTGlzdCcsIGY6cGFyc2VfUHRnTGlzdCB9LFxuXHQvKjo6WyovMHgxRC8qOjpdKi86IHsgbjonUHRnU3hOYW1lJywgZjpwYXJzZV9QdGdTeE5hbWUgfSxcblx0Lyo6OlsqLzB4RkYvKjo6XSovOiB7fVxufTtcbnZhciBQdGcxOSA9IHtcblx0Lyo6OlsqLzB4MDAvKjo6XSovOiB7IG46J1B0Z0F0dHJOb29wJywgZjpwYXJzZV9QdGdBdHRyTm9vcCB9LFxuXHQvKjo6WyovMHgwMS8qOjpdKi86IHsgbjonUHRnQXR0clNlbWknLCBmOnBhcnNlX1B0Z0F0dHJTZW1pIH0sXG5cdC8qOjpbKi8weDAyLyo6Ol0qLzogeyBuOidQdGdBdHRySWYnLCBmOnBhcnNlX1B0Z0F0dHJJZiB9LFxuXHQvKjo6WyovMHgwNC8qOjpdKi86IHsgbjonUHRnQXR0ckNob29zZScsIGY6cGFyc2VfUHRnQXR0ckNob29zZSB9LFxuXHQvKjo6WyovMHgwOC8qOjpdKi86IHsgbjonUHRnQXR0ckdvdG8nLCBmOnBhcnNlX1B0Z0F0dHJHb3RvIH0sXG5cdC8qOjpbKi8weDEwLyo6Ol0qLzogeyBuOidQdGdBdHRyU3VtJywgZjpwYXJzZV9QdGdBdHRyU3VtIH0sXG5cdC8qOjpbKi8weDIwLyo6Ol0qLzogeyBuOidQdGdBdHRyQmF4Y2VsJywgZjpwYXJzZV9QdGdBdHRyQmF4Y2VsIH0sXG5cdC8qOjpbKi8weDIxLyo6Ol0qLzogeyBuOidQdGdBdHRyQmF4Y2VsJywgZjpwYXJzZV9QdGdBdHRyQmF4Y2VsIH0sXG5cdC8qOjpbKi8weDQwLyo6Ol0qLzogeyBuOidQdGdBdHRyU3BhY2UnLCBmOnBhcnNlX1B0Z0F0dHJTcGFjZSB9LFxuXHQvKjo6WyovMHg0MS8qOjpdKi86IHsgbjonUHRnQXR0clNwYWNlU2VtaScsIGY6cGFyc2VfUHRnQXR0clNwYWNlU2VtaSB9LFxuXHQvKjo6WyovMHg4MC8qOjpdKi86IHsgbjonUHRnQXR0cklmRXJyb3InLCBmOnBhcnNlX1B0Z0F0dHJJZkVycm9yIH0sXG5cdC8qOjpbKi8weEZGLyo6Ol0qLzoge31cbn07XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMTAzIDsgW01TLVhMU0JdIDIuNS45Ny44NyAqL1xuZnVuY3Rpb24gcGFyc2VfUmdiRXh0cmEoYmxvYiwgbGVuZ3RoLCByZ2NlLCBvcHRzKSB7XG5cdGlmKG9wdHMuYmlmZiA8IDgpIHJldHVybiBwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoKTtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIG8gPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPT0gcmdjZS5sZW5ndGg7ICsraSkge1xuXHRcdHN3aXRjaChyZ2NlW2ldWzBdKSB7XG5cdFx0XHRjYXNlICdQdGdBcnJheSc6IC8qIFB0Z0FycmF5IC0+IFB0Z0V4dHJhQXJyYXkgKi9cblx0XHRcdFx0cmdjZVtpXVsxXSA9IHBhcnNlX1B0Z0V4dHJhQXJyYXkoYmxvYiwgMCwgb3B0cyk7XG5cdFx0XHRcdG8ucHVzaChyZ2NlW2ldWzFdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdNZW1BcmVhJzogLyogUHRnTWVtQXJlYSAtPiBQdGdFeHRyYU1lbSAqL1xuXHRcdFx0XHRyZ2NlW2ldWzJdID0gcGFyc2VfUHRnRXh0cmFNZW0oYmxvYiwgcmdjZVtpXVsxXSwgb3B0cyk7XG5cdFx0XHRcdG8ucHVzaChyZ2NlW2ldWzJdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdFeHAnOiAvKiBQdGdFeHAgLT4gUHRnRXh0cmFDb2wgKi9cblx0XHRcdFx0aWYob3B0cyAmJiBvcHRzLmJpZmYgPT0gMTIpIHtcblx0XHRcdFx0XHRyZ2NlW2ldWzFdWzFdID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdFx0XHRcdG8ucHVzaChyZ2NlW2ldWzFdKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z0xpc3QnOiAvKiBUT0RPOiBQdGdMaXN0IC0+IFB0Z0V4dHJhTGlzdCAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmUmFkaWNhbFMnOiAvKiBUT0RPOiBQdGdFbGZSYWRpY2FsUyAtPiBQdGdFeHRyYUVsZiAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmQ29sUyc6IC8qIFRPRE86IFB0Z0VsZkNvbFMgLT4gUHRnRXh0cmFFbGYgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZkNvbFNWJzogLyogVE9ETzogUHRnRWxmQ29sU1YgLT4gUHRnRXh0cmFFbGYgKi9cblx0XHRcdFx0dGhyb3cgXCJVbnN1cHBvcnRlZCBcIiArIHJnY2VbaV1bMF07XG5cdFx0XHRkZWZhdWx0OiBicmVhaztcblx0XHR9XG5cdH1cblx0bGVuZ3RoID0gdGFyZ2V0IC0gYmxvYi5sO1xuXHQvKiBub3RlOiB0aGlzIGlzIHRlY2huaWNhbGx5IGFuIGVycm9yIGJ1dCBFeGNlbCBkaXNyZWdhcmRzICovXG5cdC8vaWYodGFyZ2V0ICE9PSBibG9iLmwgJiYgYmxvYi5sICE9PSB0YXJnZXQgLSBsZW5ndGgpIHRocm93IG5ldyBFcnJvcih0YXJnZXQgKyBcIiAhPSBcIiArIGJsb2IubCk7XG5cdGlmKGxlbmd0aCAhPT0gMCkgby5wdXNoKHBhcnNlbm9vcChibG9iLCBsZW5ndGgpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMTA0IDsgW01TLVhMU0JdIDIuNS45Ny44OCAqL1xuZnVuY3Rpb24gcGFyc2VfUmdjZShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIFIsIGlkLCBwdGdzID0gW107XG5cdHdoaWxlKHRhcmdldCAhPSBibG9iLmwpIHtcblx0XHRsZW5ndGggPSB0YXJnZXQgLSBibG9iLmw7XG5cdFx0aWQgPSBibG9iW2Jsb2IubF07XG5cdFx0UiA9IFB0Z1R5cGVzW2lkXSB8fCBQdGdUeXBlc1tQdGdEdXBlc1tpZF1dO1xuXHRcdGlmKGlkID09PSAweDE4IHx8IGlkID09PSAweDE5KSBSID0gKGlkID09PSAweDE4ID8gUHRnMTggOiBQdGcxOSlbYmxvYltibG9iLmwgKyAxXV07XG5cdFx0aWYoIVIgfHwgIVIuZikgeyAvKnB0Z3MucHVzaCovKHBhcnNlbm9vcChibG9iLCBsZW5ndGgpKTsgfVxuXHRcdGVsc2UgeyBwdGdzLnB1c2goW1IubiwgUi5mKGJsb2IsIGxlbmd0aCwgb3B0cyldKTsgfVxuXHR9XG5cdHJldHVybiBwdGdzO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlfYXJyYXkoZi8qOkFycmF5PEFycmF5PHN0cmluZz4+Ki8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgby8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgZi5sZW5ndGg7ICsraSkge1xuXHRcdHZhciB4ID0gZltpXSwgci8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHRcdGZvcih2YXIgaiA9IDA7IGogPCB4Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHR2YXIgeSA9IHhbal07XG5cdFx0XHRpZih5KSBzd2l0Y2goeVswXSkge1xuXHRcdFx0XHQvLyBUT0RPOiBoYW5kbGUgZW1iZWRkZWQgcXVvdGVzXG5cdFx0XHRcdGNhc2UgMHgwMjpcblx0XHRcdFx0XHQvKjo6IGlmKHR5cGVvZiB5WzFdICE9ICdzdHJpbmcnKSB0aHJvdyBcInVucmVhY2hhYmxlXCI7ICovXG5cdFx0XHRcdFx0ci5wdXNoKCdcIicgKyB5WzFdLnJlcGxhY2UoL1wiL2csJ1wiXCInKSArICdcIicpOyBicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogci5wdXNoKHlbMV0pO1xuXHRcdFx0fSBlbHNlIHIucHVzaChcIlwiKTtcblx0XHR9XG5cdFx0by5wdXNoKHIuam9pbihcIixcIikpO1xuXHR9XG5cdHJldHVybiBvLmpvaW4oXCI7XCIpO1xufVxuXG4vKiBbTVMtWExTXSAyLjIuMiA7IFtNUy1YTFNCXSAyLjIuMiBUT0RPICovXG52YXIgUHRnQmluT3AgPSB7XG5cdFB0Z0FkZDogXCIrXCIsXG5cdFB0Z0NvbmNhdDogXCImXCIsXG5cdFB0Z0RpdjogXCIvXCIsXG5cdFB0Z0VxOiBcIj1cIixcblx0UHRnR2U6IFwiPj1cIixcblx0UHRnR3Q6IFwiPlwiLFxuXHRQdGdMZTogXCI8PVwiLFxuXHRQdGdMdDogXCI8XCIsXG5cdFB0Z011bDogXCIqXCIsXG5cdFB0Z05lOiBcIjw+XCIsXG5cdFB0Z1Bvd2VyOiBcIl5cIixcblx0UHRnU3ViOiBcIi1cIlxufTtcblxuLy8gTGlzdCBvZiBpbnZhbGlkIGNoYXJhY3RlcnMgbmVlZHMgdG8gYmUgdGVzdGVkIGZ1cnRoZXJcbmZ1bmN0aW9uIGZvcm11bGFfcXVvdGVfc2hlZXRfbmFtZShzbmFtZS8qOnN0cmluZyovLCBvcHRzKS8qOnN0cmluZyovIHtcblx0aWYoIXNuYW1lICYmICEob3B0cyAmJiBvcHRzLmJpZmYgPD0gNSAmJiBvcHRzLmJpZmYgPj0gMikpIHRocm93IG5ldyBFcnJvcihcImVtcHR5IHNoZWV0IG5hbWVcIik7XG5cdGlmICgvW15cXHdcXHU0RTAwLVxcdTlGRkZcXHUzMDQwLVxcdTMwRkZdLy50ZXN0KHNuYW1lKSkgcmV0dXJuIFwiJ1wiICsgc25hbWUgKyBcIidcIjtcblx0cmV0dXJuIHNuYW1lO1xufVxuZnVuY3Rpb24gZ2V0X2l4dGlfcmF3KHN1cGJvb2tzLCBpeHRpLyo6bnVtYmVyKi8sIG9wdHMpLyo6c3RyaW5nKi8ge1xuXHRpZighc3VwYm9va3MpIHJldHVybiBcIlNIMzNUSlNFUlIwXCI7XG5cdGlmKG9wdHMuYmlmZiA+IDggJiYgKCFzdXBib29rcy5YVEkgfHwgIXN1cGJvb2tzLlhUSVtpeHRpXSkpIHJldHVybiBzdXBib29rcy5TaGVldE5hbWVzW2l4dGldO1xuXHRpZighc3VwYm9va3MuWFRJKSByZXR1cm4gXCJTSDMzVEpTRVJSNlwiO1xuXHR2YXIgWFRJID0gc3VwYm9va3MuWFRJW2l4dGldO1xuXHRpZihvcHRzLmJpZmYgPCA4KSB7XG5cdFx0aWYoaXh0aSA+IDEwMDAwKSBpeHRpLT0gNjU1MzY7XG5cdFx0aWYoaXh0aSA8IDApIGl4dGkgPSAtaXh0aTtcblx0XHRyZXR1cm4gaXh0aSA9PSAwID8gXCJcIiA6IHN1cGJvb2tzLlhUSVtpeHRpIC0gMV07XG5cdH1cblx0aWYoIVhUSSkgcmV0dXJuIFwiU0gzM1RKU0VSUjFcIjtcblx0dmFyIG8gPSBcIlwiO1xuXHRpZihvcHRzLmJpZmYgPiA4KSBzd2l0Y2goc3VwYm9va3NbWFRJWzBdXVswXSkge1xuXHRcdGNhc2UgMHgwMTY1OiAvKiAnQnJ0U3VwU2VsZicgKi9cblx0XHRcdG8gPSBYVElbMV0gPT0gLTEgPyBcIiNSRUZcIiA6IHN1cGJvb2tzLlNoZWV0TmFtZXNbWFRJWzFdXTtcblx0XHRcdHJldHVybiBYVElbMV0gPT0gWFRJWzJdID8gbyA6IG8gKyBcIjpcIiArIHN1cGJvb2tzLlNoZWV0TmFtZXNbWFRJWzJdXTtcblx0XHRjYXNlIDB4MDE2NjogLyogJ0JydFN1cFNhbWUnICovXG5cdFx0XHRpZihvcHRzLlNJRCAhPSBudWxsKSByZXR1cm4gc3VwYm9va3MuU2hlZXROYW1lc1tvcHRzLlNJRF07XG5cdFx0XHRyZXR1cm4gXCJTSDMzVEpTU0FNRVwiICsgc3VwYm9va3NbWFRJWzBdXVswXTtcblx0XHRjYXNlIDB4MDE2MzogLyogJ0JydFN1cEJvb2tTcmMnICovXG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0ZGVmYXVsdDogcmV0dXJuIFwiU0gzM1RKU1NSQ1wiICsgc3VwYm9va3NbWFRJWzBdXVswXTtcblx0fVxuXHRzd2l0Y2goc3VwYm9va3NbWFRJWzBdXVswXVswXSkge1xuXHRcdGNhc2UgMHgwNDAxOlxuXHRcdFx0byA9IFhUSVsxXSA9PSAtMSA/IFwiI1JFRlwiIDogKHN1cGJvb2tzLlNoZWV0TmFtZXNbWFRJWzFdXSB8fCBcIlNIMzNUSlNFUlIzXCIpO1xuXHRcdFx0cmV0dXJuIFhUSVsxXSA9PSBYVElbMl0gPyBvIDogbyArIFwiOlwiICsgc3VwYm9va3MuU2hlZXROYW1lc1tYVElbMl1dO1xuXHRcdGNhc2UgMHgzQTAxOiByZXR1cm4gc3VwYm9va3NbWFRJWzBdXS5zbGljZSgxKS5tYXAoZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gbmFtZS5OYW1lOyB9KS5qb2luKFwiOztcIik7IC8vcmV0dXJuIFwiU0gzM1RKU0VSUjhcIjtcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYoIXN1cGJvb2tzW1hUSVswXV1bMF1bM10pIHJldHVybiBcIlNIMzNUSlNFUlIyXCI7XG5cdFx0XHRvID0gWFRJWzFdID09IC0xID8gXCIjUkVGXCIgOiAoc3VwYm9va3NbWFRJWzBdXVswXVszXVtYVElbMV1dIHx8IFwiU0gzM1RKU0VSUjRcIik7XG5cdFx0XHRyZXR1cm4gWFRJWzFdID09IFhUSVsyXSA/IG8gOiBvICsgXCI6XCIgKyBzdXBib29rc1tYVElbMF1dWzBdWzNdW1hUSVsyXV07XG5cdH1cbn1cbmZ1bmN0aW9uIGdldF9peHRpKHN1cGJvb2tzLCBpeHRpLyo6bnVtYmVyKi8sIG9wdHMpLyo6c3RyaW5nKi8ge1xuXHR2YXIgaXh0aXJhdyA9IGdldF9peHRpX3JhdyhzdXBib29rcywgaXh0aSwgb3B0cyk7XG5cdHJldHVybiBpeHRpcmF3ID09IFwiI1JFRlwiID8gaXh0aXJhdyA6IGZvcm11bGFfcXVvdGVfc2hlZXRfbmFtZShpeHRpcmF3LCBvcHRzKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeV9mb3JtdWxhKGZvcm11bGEvKkFycmF5PGFueT4qLywgcmFuZ2UsIGNlbGwvKjphbnkqLywgc3VwYm9va3MsIG9wdHMpLyo6c3RyaW5nKi8ge1xuXHR2YXIgYmlmZiA9IChvcHRzICYmIG9wdHMuYmlmZikgfHwgODtcblx0dmFyIF9yYW5nZSA9IC8qcmFuZ2UgIT0gbnVsbCA/IHJhbmdlIDoqLyB7czp7YzowLCByOjB9LGU6e2M6MCwgcjowfX07XG5cdHZhciBzdGFjay8qOkFycmF5PHN0cmluZz4qLyA9IFtdLCBlMSwgZTIsIC8qOjp0eXBlLCovIGMvKjpDZWxsQWRkcmVzcyovLCBpeHRpPTAsIG5hbWVpZHg9MCwgciwgc25hbWU9XCJcIjtcblx0aWYoIWZvcm11bGFbMF0gfHwgIWZvcm11bGFbMF1bMF0pIHJldHVybiBcIlwiO1xuXHR2YXIgbGFzdF9zcCA9IC0xLCBzcCA9IFwiXCI7XG5cdGZvcih2YXIgZmYgPSAwLCBmZmxlbiA9IGZvcm11bGFbMF0ubGVuZ3RoOyBmZiA8IGZmbGVuOyArK2ZmKSB7XG5cdFx0dmFyIGYgPSBmb3JtdWxhWzBdW2ZmXTtcblx0XHRzd2l0Y2goZlswXSkge1xuXHRcdFx0Y2FzZSAnUHRnVW1pbnVzJzogLyogW01TLVhMU10gMi41LjE5OC45MyAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKFwiLVwiICsgc3RhY2sucG9wKCkpOyBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z1VwbHVzJzogLyogW01TLVhMU10gMi41LjE5OC45NSAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKFwiK1wiICsgc3RhY2sucG9wKCkpOyBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z1BlcmNlbnQnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjgxICovXG5cdFx0XHRcdHN0YWNrLnB1c2goc3RhY2sucG9wKCkgKyBcIiVcIik7IGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdBZGQnOiAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjI2ICovXG5cdFx0XHRjYXNlICdQdGdDb25jYXQnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjQzICovXG5cdFx0XHRjYXNlICdQdGdEaXYnOiAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjQ1ICovXG5cdFx0XHRjYXNlICdQdGdFcSc6ICAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjU2ICovXG5cdFx0XHRjYXNlICdQdGdHZSc6ICAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjY0ICovXG5cdFx0XHRjYXNlICdQdGdHdCc6ICAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjY1ICovXG5cdFx0XHRjYXNlICdQdGdMZSc6ICAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjY4ICovXG5cdFx0XHRjYXNlICdQdGdMdCc6ICAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjY5ICovXG5cdFx0XHRjYXNlICdQdGdNdWwnOiAgICAvKiBbTVMtWExTXSAyLjUuMTk4Ljc1ICovXG5cdFx0XHRjYXNlICdQdGdOZSc6ICAgICAvKiBbTVMtWExTXSAyLjUuMTk4Ljc4ICovXG5cdFx0XHRjYXNlICdQdGdQb3dlcic6ICAvKiBbTVMtWExTXSAyLjUuMTk4LjgyICovXG5cdFx0XHRjYXNlICdQdGdTdWInOiAgICAvKiBbTVMtWExTXSAyLjUuMTk4LjkwICovXG5cdFx0XHRcdGUxID0gc3RhY2sucG9wKCk7IGUyID0gc3RhY2sucG9wKCk7XG5cdFx0XHRcdGlmKGxhc3Rfc3AgPj0gMCkge1xuXHRcdFx0XHRcdHN3aXRjaChmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzBdKSB7XG5cdFx0XHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0XHRcdHNwID0gZmlsbChcIiBcIiwgZm9ybXVsYVswXVtsYXN0X3NwXVsxXVsxXSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdFx0XHRzcCA9IGZpbGwoXCJcXHJcIiwgZm9ybXVsYVswXVtsYXN0X3NwXVsxXVsxXSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0c3AgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdFx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBQdGdBdHRyU3BhY2VUeXBlIFwiICsgZm9ybXVsYVswXVtsYXN0X3NwXVsxXVswXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGUyID0gZTIgKyBzcDtcblx0XHRcdFx0XHRsYXN0X3NwID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhY2sucHVzaChlMitQdGdCaW5PcFtmWzBdXStlMSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdJc2VjdCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNjcgKi9cblx0XHRcdFx0ZTEgPSBzdGFjay5wb3AoKTsgZTIgPSBzdGFjay5wb3AoKTtcblx0XHRcdFx0c3RhY2sucHVzaChlMitcIiBcIitlMSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnVW5pb24nOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljk0ICovXG5cdFx0XHRcdGUxID0gc3RhY2sucG9wKCk7IGUyID0gc3RhY2sucG9wKCk7XG5cdFx0XHRcdHN0YWNrLnB1c2goZTIrXCIsXCIrZTEpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ1B0Z1JhbmdlJzogLyogW01TLVhMU10gMi41LjE5OC44MyAqL1xuXHRcdFx0XHRlMSA9IHN0YWNrLnBvcCgpOyBlMiA9IHN0YWNrLnBvcCgpO1xuXHRcdFx0XHRzdGFjay5wdXNoKGUyK1wiOlwiK2UxKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0F0dHJDaG9vc2UnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjM0ICovXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnQXR0ckdvdG8nOiAvKiBbTVMtWExTXSAyLjUuMTk4LjM1ICovXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnQXR0cklmJzogLyogW01TLVhMU10gMi41LjE5OC4zNiAqL1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ1B0Z0F0dHJJZkVycm9yJzogLyogW01TLVhMU0JdIDIuNS45Ny4yOCAqL1xuXHRcdFx0XHRicmVhaztcblxuXG5cdFx0XHRjYXNlICdQdGdSZWYnOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljg0ICovXG5cdFx0XHRcdC8qOjp0eXBlID0gZlsxXVswXTsgKi9jID0gc2hpZnRfY2VsbF94bHMoKGZbMV1bMV0vKjphbnkqLyksIF9yYW5nZSwgb3B0cyk7XG5cdFx0XHRcdHN0YWNrLnB1c2goZW5jb2RlX2NlbGxfeGxzKGMsIGJpZmYpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdSZWZOJzogLyogW01TLVhMU10gMi41LjE5OC44OCAqL1xuXHRcdFx0XHQvKjo6dHlwZSA9IGZbMV1bMF07ICovYyA9IGNlbGwgPyBzaGlmdF9jZWxsX3hscygoZlsxXVsxXS8qOmFueSovKSwgY2VsbCwgb3B0cykgOiAoZlsxXVsxXS8qOmFueSovKTtcblx0XHRcdFx0c3RhY2sucHVzaChlbmNvZGVfY2VsbF94bHMoYywgYmlmZikpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ1B0Z1JlZjNkJzogLyogW01TLVhMU10gMi41LjE5OC44NSAqL1xuXHRcdFx0XHQvKjo6dHlwZSA9IGZbMV1bMF07ICovaXh0aSA9IC8qOjpOdW1iZXIoKi9mWzFdWzFdLyo6OikqLzsgYyA9IHNoaWZ0X2NlbGxfeGxzKChmWzFdWzJdLyo6YW55Ki8pLCBfcmFuZ2UsIG9wdHMpO1xuXHRcdFx0XHRzbmFtZSA9IGdldF9peHRpKHN1cGJvb2tzLCBpeHRpLCBvcHRzKTtcblx0XHRcdFx0dmFyIHcgPSBzbmFtZTsgLyogSUU5IGZhaWxzIG9uIGRlZmluZWQgbmFtZXMgKi8gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXHRcdFx0XHRzdGFjay5wdXNoKHNuYW1lICsgXCIhXCIgKyBlbmNvZGVfY2VsbF94bHMoYywgYmlmZikpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnRnVuYyc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNjIgKi9cblx0XHRcdGNhc2UgJ1B0Z0Z1bmNWYXInOiAvKiBbTVMtWExTXSAyLjUuMTk4LjYzICovXG5cdFx0XHRcdC8qIGZbMV0gPSBbYXJnYywgZnVuYywgdHlwZV0gKi9cblx0XHRcdFx0dmFyIGFyZ2MvKjpudW1iZXIqLyA9IChmWzFdWzBdLyo6YW55Ki8pLCBmdW5jLyo6c3RyaW5nKi8gPSAoZlsxXVsxXS8qOmFueSovKTtcblx0XHRcdFx0aWYoIWFyZ2MpIGFyZ2MgPSAwO1xuXHRcdFx0XHRhcmdjICY9IDB4N0Y7XG5cdFx0XHRcdHZhciBhcmdzID0gYXJnYyA9PSAwID8gW10gOiBzdGFjay5zbGljZSgtYXJnYyk7XG5cdFx0XHRcdHN0YWNrLmxlbmd0aCAtPSBhcmdjO1xuXHRcdFx0XHRpZihmdW5jID09PSAnVXNlcicpIGZ1bmMgPSBhcmdzLnNoaWZ0KCk7XG5cdFx0XHRcdHN0YWNrLnB1c2goZnVuYyArIFwiKFwiICsgYXJncy5qb2luKFwiLFwiKSArIFwiKVwiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0Jvb2wnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjQyICovXG5cdFx0XHRcdHN0YWNrLnB1c2goZlsxXSA/IFwiVFJVRVwiIDogXCJGQUxTRVwiKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdQdGdJbnQnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjY2ICovXG5cdFx0XHRcdHN0YWNrLnB1c2goLyo6OlN0cmluZygqL2ZbMV0vKjo6KSovKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdQdGdOdW0nOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljc5IFRPRE86IHByZWNpc2lvbj8gKi9cblx0XHRcdFx0c3RhY2sucHVzaChTdHJpbmcoZlsxXSkpOyBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z1N0cic6IC8qIFtNUy1YTFNdIDIuNS4xOTguODkgKi9cblx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0c3RhY2sucHVzaCgnXCInICsgZlsxXS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpICsgJ1wiJyk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnRXJyJzogLyogW01TLVhMU10gMi41LjE5OC41NyAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKC8qOjpTdHJpbmcoKi9mWzFdLyo6OikqLyk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnQXJlYU4nOiAvKiBbTVMtWExTXSAyLjUuMTk4LjMxIFRPRE8gKi9cblx0XHRcdFx0Lyo6OnR5cGUgPSBmWzFdWzBdOyAqL3IgPSBzaGlmdF9yYW5nZV94bHMoZlsxXVsxXSwgY2VsbCA/IHtzOmNlbGx9IDogX3JhbmdlLCBvcHRzKTtcblx0XHRcdFx0c3RhY2sucHVzaChlbmNvZGVfcmFuZ2VfeGxzKChyLyo6YW55Ki8pLCBvcHRzKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnQXJlYSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMjcgVE9ETzogZml4ZWQgcG9pbnRzICovXG5cdFx0XHRcdC8qOjp0eXBlID0gZlsxXVswXTsgKi9yID0gc2hpZnRfcmFuZ2VfeGxzKGZbMV1bMV0sIF9yYW5nZSwgb3B0cyk7XG5cdFx0XHRcdHN0YWNrLnB1c2goZW5jb2RlX3JhbmdlX3hscygoci8qOmFueSovKSwgb3B0cykpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ1B0Z0FyZWEzZCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMjggVE9ETyAqL1xuXHRcdFx0XHQvKjo6dHlwZSA9IGZbMV1bMF07ICovaXh0aSA9IC8qOjpOdW1iZXIoKi9mWzFdWzFdLyo6OikqLzsgciA9IGZbMV1bMl07XG5cdFx0XHRcdHNuYW1lID0gZ2V0X2l4dGkoc3VwYm9va3MsIGl4dGksIG9wdHMpO1xuXHRcdFx0XHRzdGFjay5wdXNoKHNuYW1lICsgXCIhXCIgKyBlbmNvZGVfcmFuZ2VfeGxzKChyLyo6YW55Ki8pLCBvcHRzKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnQXR0clN1bSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNDEgKi9cblx0XHRcdFx0c3RhY2sucHVzaChcIlNVTShcIiArIHN0YWNrLnBvcCgpICsgXCIpXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnQXR0ckJheGNlbCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMzMgKi9cblx0XHRcdGNhc2UgJ1B0Z0F0dHJTZW1pJzogLyogW01TLVhMU10gMi41LjE5OC4zNyAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnTmFtZSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNzYgOyBbTVMtWExTQl0gMi41Ljk3LjYwIFRPRE86IHJldmlzaW9ucyAqL1xuXHRcdFx0XHQvKiBmWzFdID0gdHlwZSwgMCwgbmFtZWluZGV4ICovXG5cdFx0XHRcdG5hbWVpZHggPSAoZlsxXVsyXS8qOmFueSovKTtcblx0XHRcdFx0dmFyIGxibCA9IChzdXBib29rcy5uYW1lc3x8W10pW25hbWVpZHgtMV0gfHwgKHN1cGJvb2tzWzBdfHxbXSlbbmFtZWlkeF07XG5cdFx0XHRcdHZhciBuYW1lID0gbGJsID8gbGJsLk5hbWUgOiBcIlNIMzNUSlNOQU1FXCIgKyBTdHJpbmcobmFtZWlkeCk7XG5cdFx0XHRcdC8qIFtNUy1YTFNCXSAyLjUuOTcuMTAgRnRhYiAtLSBsYXN0IHZlcmlmaWVkIDIwMjIwMjA0ICovXG5cdFx0XHRcdGlmKG5hbWUgJiYgbmFtZS5zbGljZSgwLDYpID09IFwiX3hsZm4uXCIgJiYgIW9wdHMueGxmbikgbmFtZSA9IG5hbWUuc2xpY2UoNik7XG5cdFx0XHRcdHN0YWNrLnB1c2gobmFtZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdOYW1lWCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNzcgOyBbTVMtWExTQl0gMi41Ljk3LjYxIFRPRE86IHJldmlzaW9ucyAqL1xuXHRcdFx0XHQvKiBmWzFdID0gdHlwZSwgaXh0aSwgbmFtZWluZGV4ICovXG5cdFx0XHRcdHZhciBib29raWR4Lyo6bnVtYmVyKi8gPSAoZlsxXVsxXS8qOmFueSovKTsgbmFtZWlkeCA9IChmWzFdWzJdLyo6YW55Ki8pOyB2YXIgZXh0ZXJuYm9vaztcblx0XHRcdFx0LyogVE9ETzogUHJvcGVybHkgaGFuZGxlIG1pc3NpbmcgdmFsdWVzIC0tIHRoaXMgc2hvdWxkIGJlIHVzaW5nIGdldF9peHRpX3JhdyBwcmltYXJpbHkgKi9cblx0XHRcdFx0aWYob3B0cy5iaWZmIDw9IDUpIHtcblx0XHRcdFx0XHRpZihib29raWR4IDwgMCkgYm9va2lkeCA9IC1ib29raWR4O1xuXHRcdFx0XHRcdGlmKHN1cGJvb2tzW2Jvb2tpZHhdKSBleHRlcm5ib29rID0gc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIG8gPSBcIlwiO1xuXHRcdFx0XHRcdGlmKCgoc3VwYm9va3NbYm9va2lkeF18fFtdKVswXXx8W10pWzBdID09IDB4M0EwMSl7LyogZW1wdHkgKi99XG5cdFx0XHRcdFx0ZWxzZSBpZigoKHN1cGJvb2tzW2Jvb2tpZHhdfHxbXSlbMF18fFtdKVswXSA9PSAweDA0MDEpe1xuXHRcdFx0XHRcdFx0aWYoc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF0gJiYgc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF0uaXRhYiA+IDApIHtcblx0XHRcdFx0XHRcdFx0byA9IHN1cGJvb2tzLlNoZWV0TmFtZXNbc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF0uaXRhYi0xXSArIFwiIVwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIG8gPSBzdXBib29rcy5TaGVldE5hbWVzW25hbWVpZHgtMV0rIFwiIVwiO1xuXHRcdFx0XHRcdGlmKHN1cGJvb2tzW2Jvb2tpZHhdICYmIHN1cGJvb2tzW2Jvb2tpZHhdW25hbWVpZHhdKSBvICs9IHN1cGJvb2tzW2Jvb2tpZHhdW25hbWVpZHhdLk5hbWU7XG5cdFx0XHRcdFx0ZWxzZSBpZihzdXBib29rc1swXSAmJiBzdXBib29rc1swXVtuYW1laWR4XSkgbyArPSBzdXBib29rc1swXVtuYW1laWR4XS5OYW1lO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFyIGl4dGlkYXRhID0gKGdldF9peHRpX3JhdyhzdXBib29rcywgYm9va2lkeCwgb3B0cyl8fFwiXCIpLnNwbGl0KFwiOztcIik7XG5cdFx0XHRcdFx0XHRpZihpeHRpZGF0YVtuYW1laWR4IC0gMV0pIG8gPSBpeHRpZGF0YVtuYW1laWR4IC0gMV07IC8vIFRPRE86IGNvbmZpcm0gdGhpcyBpcyBjb3JyZWN0XG5cdFx0XHRcdFx0XHRlbHNlIG8gKz0gXCJTSDMzVEpTRVJSWFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdGFjay5wdXNoKG8pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFleHRlcm5ib29rKSBleHRlcm5ib29rID0ge05hbWU6IFwiU0gzM1RKU0VSUllcIn07XG5cdFx0XHRcdHN0YWNrLnB1c2goZXh0ZXJuYm9vay5OYW1lKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z1BhcmVuJzogLyogW01TLVhMU10gMi41LjE5OC44MCAqL1xuXHRcdFx0XHR2YXIgbHAgPSAnKCcsIHJwID0gJyknO1xuXHRcdFx0XHRpZihsYXN0X3NwID49IDApIHtcblx0XHRcdFx0XHRzcCA9IFwiXCI7XG5cdFx0XHRcdFx0c3dpdGNoKGZvcm11bGFbMF1bbGFzdF9zcF1bMV1bMF0pIHtcblx0XHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0XHRjYXNlIDI6IGxwID0gZmlsbChcIiBcIiwgZm9ybXVsYVswXVtsYXN0X3NwXVsxXVsxXSkgKyBscDsgYnJlYWs7XG5cdFx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdFx0Y2FzZSAzOiBscCA9IGZpbGwoXCJcXHJcIiwgZm9ybXVsYVswXVtsYXN0X3NwXVsxXVsxXSkgKyBscDsgYnJlYWs7XG5cdFx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdFx0Y2FzZSA0OiBycCA9IGZpbGwoXCIgXCIsIGZvcm11bGFbMF1bbGFzdF9zcF1bMV1bMV0pICsgcnA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0XHRcdGNhc2UgNTogcnAgPSBmaWxsKFwiXFxyXCIsIGZvcm11bGFbMF1bbGFzdF9zcF1bMV1bMV0pICsgcnA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0XHRcdFx0aWYob3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgUHRnQXR0clNwYWNlVHlwZSBcIiArIGZvcm11bGFbMF1bbGFzdF9zcF1bMV1bMF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsYXN0X3NwID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhY2sucHVzaChscCArIHN0YWNrLnBvcCgpICsgcnApOyBicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnUmVmRXJyJzogLyogW01TLVhMU10gMi41LjE5OC44NiAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKCcjUkVGIScpOyBicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnUmVmRXJyM2QnOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljg3ICovXG5cdFx0XHRcdHN0YWNrLnB1c2goJyNSRUYhJyk7IGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdFeHAnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjU4IFRPRE8gKi9cblx0XHRcdFx0YyA9IHtjOihmWzFdWzFdLyo6YW55Ki8pLHI6KGZbMV1bMF0vKjphbnkqLyl9O1xuXHRcdFx0XHR2YXIgcSA9ICh7YzogY2VsbC5jLCByOmNlbGwucn0vKjphbnkqLyk7XG5cdFx0XHRcdGlmKHN1cGJvb2tzLnNoYXJlZGZbZW5jb2RlX2NlbGwoYyldKSB7XG5cdFx0XHRcdFx0dmFyIHBhcnNlZGYgPSAoc3VwYm9va3Muc2hhcmVkZltlbmNvZGVfY2VsbChjKV0pO1xuXHRcdFx0XHRcdHN0YWNrLnB1c2goc3RyaW5naWZ5X2Zvcm11bGEocGFyc2VkZiwgX3JhbmdlLCBxLCBzdXBib29rcywgb3B0cykpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBmbmQgPSBmYWxzZTtcblx0XHRcdFx0XHRmb3IoZTE9MDtlMSE9c3VwYm9va3MuYXJyYXlmLmxlbmd0aDsgKytlMSkge1xuXHRcdFx0XHRcdFx0LyogVE9ETzogc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIHJhbmdlX2hhcyAqL1xuXHRcdFx0XHRcdFx0ZTIgPSBzdXBib29rcy5hcnJheWZbZTFdO1xuXHRcdFx0XHRcdFx0aWYoYy5jIDwgZTJbMF0ucy5jIHx8IGMuYyA+IGUyWzBdLmUuYykgY29udGludWU7XG5cdFx0XHRcdFx0XHRpZihjLnIgPCBlMlswXS5zLnIgfHwgYy5yID4gZTJbMF0uZS5yKSBjb250aW51ZTtcblx0XHRcdFx0XHRcdHN0YWNrLnB1c2goc3RyaW5naWZ5X2Zvcm11bGEoZTJbMV0sIF9yYW5nZSwgcSwgc3VwYm9va3MsIG9wdHMpKTtcblx0XHRcdFx0XHRcdGZuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoIWZuZCkgc3RhY2sucHVzaCgvKjo6U3RyaW5nKCovZlsxXS8qOjopKi8pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdBcnJheSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMzIgVE9ETyAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKFwie1wiICsgc3RyaW5naWZ5X2FycmF5KC8qOjooKi9mWzFdLyo6OiA6YW55KSovKSArIFwifVwiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z01lbUFyZWEnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjcwIFRPRE86IGNvbmZpcm0gdGhpcyBpcyBhIG5vbi1kaXNwbGF5ICovXG5cdFx0XHRcdC8vc3RhY2sucHVzaChcIihcIiArIGZbMl0ubWFwKGVuY29kZV9yYW5nZSkuam9pbihcIixcIikgKyBcIilcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdBdHRyU3BhY2UnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjM4ICovXG5cdFx0XHRjYXNlICdQdGdBdHRyU3BhY2VTZW1pJzogLyogW01TLVhMU10gMi41LjE5OC4zOSAqL1xuXHRcdFx0XHRsYXN0X3NwID0gZmY7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdUYmwnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjkyIFRPRE8gKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z01lbUVycic6IC8qIFtNUy1YTFNdIDIuNS4xOTguNzEgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z01pc3NBcmcnOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljc0ICovXG5cdFx0XHRcdHN0YWNrLnB1c2goXCJcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdBcmVhRXJyJzogLyogW01TLVhMU10gMi41LjE5OC4yOSAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKFwiI1JFRiFcIik7IGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdBcmVhRXJyM2QnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjMwICovXG5cdFx0XHRcdHN0YWNrLnB1c2goXCIjUkVGIVwiKTsgYnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0xpc3QnOiAvKiBbTVMtWExTQl0gMi41Ljk3LjUyICovXG5cdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdHN0YWNrLnB1c2goXCJUYWJsZVwiICsgZlsxXS5pZHggKyBcIlsjXCIgKyBmWzFdLnJ0ICsgXCJdXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnTWVtQXJlYU4nOlxuXHRcdFx0Y2FzZSAnUHRnTWVtTm9NZW1OJzpcblx0XHRcdGNhc2UgJ1B0Z0F0dHJOb29wJzpcblx0XHRcdGNhc2UgJ1B0Z1NoZWV0Jzpcblx0XHRcdGNhc2UgJ1B0Z0VuZFNoZWV0Jzpcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z01lbUZ1bmMnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjcyIFRPRE8gKi9cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdNZW1Ob01lbSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNzMgVE9ETyAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnRWxmQ29sJzogLyogW01TLVhMU10gMi41LjE5OC40NiAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmQ29sUyc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNDcgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZkNvbFNWJzogLyogW01TLVhMU10gMi41LjE5OC40OCAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmQ29sVic6IC8qIFtNUy1YTFNdIDIuNS4xOTguNDkgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZkxlbCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNTAgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZlJhZGljYWwnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjUxICovXG5cdFx0XHRjYXNlICdQdGdFbGZSYWRpY2FsTGVsJzogLyogW01TLVhMU10gMi41LjE5OC41MiAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmUmFkaWNhbFMnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjUzICovXG5cdFx0XHRjYXNlICdQdGdFbGZSdyc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNTQgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZlJ3Vic6IC8qIFtNUy1YTFNdIDIuNS4xOTguNTUgKi9cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgRUxGc1wiKTtcblxuXHRcdFx0Y2FzZSAnUHRnU3hOYW1lJzogLyogW01TLVhMU10gMi41LjE5OC45MSBUT0RPIC0tIGZpbmQgYSB0ZXN0IGNhc2UgKi9cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbnJlY29nbml6ZWQgRm9ybXVsYSBUb2tlbjogJyArIFN0cmluZyhmKSk7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1VucmVjb2duaXplZCBGb3JtdWxhIFRva2VuOiAnICsgU3RyaW5nKGYpKTtcblx0XHR9XG5cdFx0dmFyIFB0Z05vbkRpc3AgPSBbJ1B0Z0F0dHJTcGFjZScsICdQdGdBdHRyU3BhY2VTZW1pJywgJ1B0Z0F0dHJHb3RvJ107XG5cdFx0aWYob3B0cy5iaWZmICE9IDMpIGlmKGxhc3Rfc3AgPj0gMCAmJiBQdGdOb25EaXNwLmluZGV4T2YoZm9ybXVsYVswXVtmZl1bMF0pID09IC0xKSB7XG5cdFx0XHRmID0gZm9ybXVsYVswXVtsYXN0X3NwXTtcblx0XHRcdHZhciBfbGVmdCA9IHRydWU7XG5cdFx0XHRzd2l0Y2goZlsxXVswXSkge1xuXHRcdFx0XHQvKiBub3RlOiBzb21lIGJhZCBYTFNCIGZpbGVzIG9taXQgdGhlIFB0Z1BhcmVuICovXG5cdFx0XHRcdGNhc2UgNDogX2xlZnQgPSBmYWxzZTtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlIDA6XG5cdFx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0XHRzcCA9IGZpbGwoXCIgXCIsIGZbMV1bMV0pOyBicmVhaztcblx0XHRcdFx0Y2FzZSA1OiBfbGVmdCA9IGZhbHNlO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdHNwID0gZmlsbChcIlxcclwiLCBmWzFdWzFdKTsgYnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0c3AgPSBcIlwiO1xuXHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0aWYob3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgUHRnQXR0clNwYWNlVHlwZSBcIiArIGZbMV1bMF0pO1xuXHRcdFx0fVxuXHRcdFx0c3RhY2sucHVzaCgoX2xlZnQgPyBzcCA6IFwiXCIpICsgc3RhY2sucG9wKCkgKyAoX2xlZnQgPyBcIlwiIDogc3ApKTtcblx0XHRcdGxhc3Rfc3AgPSAtMTtcblx0XHR9XG5cdH1cblx0aWYoc3RhY2subGVuZ3RoID4gMSAmJiBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiYmFkIGZvcm11bGEgc3RhY2tcIik7XG5cdHJldHVybiBzdGFja1swXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4xIFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0FycmF5UGFyc2VkRm9ybXVsYShibG9iLCBsZW5ndGgsIG9wdHMvKjo6LCByZWYqLykge1xuXHR2YXIgdGFyZ2V0ID0gYmxvYi5sICsgbGVuZ3RoLCBsZW4gPSBvcHRzLmJpZmYgPT0gMiA/IDEgOiAyO1xuXHR2YXIgcmdjYiwgY2NlID0gYmxvYi5yZWFkX3NoaWZ0KGxlbik7IC8vIGxlbmd0aCBvZiByZ2NlXG5cdGlmKGNjZSA9PSAweEZGRkYpIHJldHVybiBbW10scGFyc2Vub29wKGJsb2IsIGxlbmd0aC0yKV07XG5cdHZhciByZ2NlID0gcGFyc2VfUmdjZShibG9iLCBjY2UsIG9wdHMpO1xuXHRpZihsZW5ndGggIT09IGNjZSArIGxlbikgcmdjYiA9IHBhcnNlX1JnYkV4dHJhKGJsb2IsIGxlbmd0aCAtIGNjZSAtIGxlbiwgcmdjZSwgb3B0cyk7XG5cdGJsb2IubCA9IHRhcmdldDtcblx0cmV0dXJuIFtyZ2NlLCByZ2NiXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zIFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1hMU0NlbGxQYXJzZWRGb3JtdWxhKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdGFyZ2V0ID0gYmxvYi5sICsgbGVuZ3RoLCBsZW4gPSBvcHRzLmJpZmYgPT0gMiA/IDEgOiAyO1xuXHR2YXIgcmdjYiwgY2NlID0gYmxvYi5yZWFkX3NoaWZ0KGxlbik7IC8vIGxlbmd0aCBvZiByZ2NlXG5cdGlmKGNjZSA9PSAweEZGRkYpIHJldHVybiBbW10scGFyc2Vub29wKGJsb2IsIGxlbmd0aC0yKV07XG5cdHZhciByZ2NlID0gcGFyc2VfUmdjZShibG9iLCBjY2UsIG9wdHMpO1xuXHRpZihsZW5ndGggIT09IGNjZSArIGxlbikgcmdjYiA9IHBhcnNlX1JnYkV4dHJhKGJsb2IsIGxlbmd0aCAtIGNjZSAtIGxlbiwgcmdjZSwgb3B0cyk7XG5cdGJsb2IubCA9IHRhcmdldDtcblx0cmV0dXJuIFtyZ2NlLCByZ2NiXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4yMSAqL1xuZnVuY3Rpb24gcGFyc2VfTmFtZVBhcnNlZEZvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzLCBjY2UpIHtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIHJnY2UgPSBwYXJzZV9SZ2NlKGJsb2IsIGNjZSwgb3B0cyk7XG5cdHZhciByZ2NiO1xuXHRpZih0YXJnZXQgIT09IGJsb2IubCkgcmdjYiA9IHBhcnNlX1JnYkV4dHJhKGJsb2IsIHRhcmdldCAtIGJsb2IubCwgcmdjZSwgb3B0cyk7XG5cdHJldHVybiBbcmdjZSwgcmdjYl07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMTE4IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1NoYXJlZFBhcnNlZEZvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciByZ2NiLCBjY2UgPSBibG9iLnJlYWRfc2hpZnQoMik7IC8vIGxlbmd0aCBvZiByZ2NlXG5cdHZhciByZ2NlID0gcGFyc2VfUmdjZShibG9iLCBjY2UsIG9wdHMpO1xuXHRpZihjY2UgPT0gMHhGRkZGKSByZXR1cm4gW1tdLHBhcnNlbm9vcChibG9iLCBsZW5ndGgtMildO1xuXHRpZihsZW5ndGggIT09IGNjZSArIDIpIHJnY2IgPSBwYXJzZV9SZ2JFeHRyYShibG9iLCB0YXJnZXQgLSBjY2UgLSAyLCByZ2NlLCBvcHRzKTtcblx0cmV0dXJuIFtyZ2NlLCByZ2NiXTtcbn1cblxuLyogW01TLVhMU10gMi41LjEzMyBUT0RPOiBob3cgdG8gZW1pdCBlbXB0eSBzdHJpbmdzPyAqL1xuZnVuY3Rpb24gcGFyc2VfRm9ybXVsYVZhbHVlKGJsb2IvKjo6LCBsZW5ndGgqLykge1xuXHR2YXIgYjtcblx0aWYoX19yZWFkVUludDE2TEUoYmxvYixibG9iLmwgKyA2KSAhPT0gMHhGRkZGKSByZXR1cm4gW3BhcnNlX1hudW0oYmxvYiksJ24nXTtcblx0c3dpdGNoKGJsb2JbYmxvYi5sXSkge1xuXHRcdGNhc2UgMHgwMDogYmxvYi5sICs9IDg7IHJldHVybiBbXCJTdHJpbmdcIiwgJ3MnXTtcblx0XHRjYXNlIDB4MDE6IGIgPSBibG9iW2Jsb2IubCsyXSA9PT0gMHgxOyBibG9iLmwgKz0gODsgcmV0dXJuIFtiLCdiJ107XG5cdFx0Y2FzZSAweDAyOiBiID0gYmxvYltibG9iLmwrMl07IGJsb2IubCArPSA4OyByZXR1cm4gW2IsJ2UnXTtcblx0XHRjYXNlIDB4MDM6IGJsb2IubCArPSA4OyByZXR1cm4gW1wiXCIsJ3MnXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5mdW5jdGlvbiB3cml0ZV9Gb3JtdWxhVmFsdWUodmFsdWUpIHtcblx0aWYodmFsdWUgPT0gbnVsbCkge1xuXHRcdC8vIEJsYW5rIFN0cmluZyBWYWx1ZVxuXHRcdHZhciBvID0gbmV3X2J1Zig4KTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4MDMpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMHhGRkZGKTtcblx0XHRyZXR1cm4gbztcblx0fSBlbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiKSByZXR1cm4gd3JpdGVfWG51bSh2YWx1ZSk7XG5cdHJldHVybiB3cml0ZV9YbnVtKDApO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTI3IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0Zvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0aWYob3B0cy5iaWZmID09IDIpICsrYmxvYi5sO1xuXHR2YXIgdmFsID0gcGFyc2VfRm9ybXVsYVZhbHVlKGJsb2IsOCk7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0aWYob3B0cy5iaWZmICE9IDIpIHtcblx0XHRibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0aWYob3B0cy5iaWZmID49IDUpIHtcblx0XHRcdC8qdmFyIGNobiA9ICovYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdH1cblx0fVxuXHR2YXIgY2JmID0gcGFyc2VfWExTQ2VsbFBhcnNlZEZvcm11bGEoYmxvYiwgZW5kIC0gYmxvYi5sLCBvcHRzKTtcblx0cmV0dXJuIHtjZWxsOmNlbGwsIHZhbDp2YWxbMF0sIGZvcm11bGE6Y2JmLCBzaGFyZWQ6IChmbGFncyA+PiAzKSAmIDEsIHR0OnZhbFsxXX07XG59XG5mdW5jdGlvbiB3cml0ZV9Gb3JtdWxhKGNlbGwvKjpDZWxsKi8sIFIvKjpudW1iZXIqLywgQy8qOm51bWJlciovLCBvcHRzLCBvcy8qOm51bWJlciovKSB7XG5cdC8vIENlbGxcblx0dmFyIG8xID0gd3JpdGVfWExTQ2VsbChSLCBDLCBvcyk7XG5cblx0Ly8gRm9ybXVsYVZhbHVlXG5cdHZhciBvMiA9IHdyaXRlX0Zvcm11bGFWYWx1ZShjZWxsLnYpO1xuXG5cdC8vIGZsYWdzICsgY2FjaGVcblx0dmFyIG8zID0gbmV3X2J1Zig2KTtcblx0dmFyIGZsYWdzID0gMHgwMSB8IDB4MjA7XG5cdG8zLndyaXRlX3NoaWZ0KDIsIGZsYWdzKTtcblx0bzMud3JpdGVfc2hpZnQoNCwgMCk7XG5cblx0Ly8gQ2VsbFBhcnNlZEZvcm11bGFcblx0dmFyIGJmID0gbmV3X2J1ZihjZWxsLmJmLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBjZWxsLmJmLmxlbmd0aDsgKytpKSBiZltpXSA9IGNlbGwuYmZbaV07XG5cblx0dmFyIG91dCA9IGJjb25jYXQoW28xLCBvMiwgbzMsIGJmXSk7XG5cdHJldHVybiBvdXQ7XG59XG5cblxuLyogWExTQiBQYXJzZWQgRm9ybXVsYSByZWNvcmRzIGhhdmUgdGhlIHNhbWUgc2hhcGUgKi9cbmZ1bmN0aW9uIHBhcnNlX1hMU0JQYXJzZWRGb3JtdWxhKGRhdGEsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgY2NlID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgcmdjZSA9IHBhcnNlX1JnY2UoZGF0YSwgY2NlLCBvcHRzKTtcblx0dmFyIGNiID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgcmdjYiA9IGNiID4gMCA/IHBhcnNlX1JnYkV4dHJhKGRhdGEsIGNiLCByZ2NlLCBvcHRzKSA6IG51bGw7XG5cdHJldHVybiBbcmdjZSwgcmdjYl07XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuOTcuMSBBcnJheVBhcnNlZEZvcm11bGEgKi9cbnZhciBwYXJzZV9YTFNCQXJyYXlQYXJzZWRGb3JtdWxhID0gcGFyc2VfWExTQlBhcnNlZEZvcm11bGE7XG4vKiBbTVMtWExTQl0gMi41Ljk3LjQgQ2VsbFBhcnNlZEZvcm11bGEgKi9cbnZhciBwYXJzZV9YTFNCQ2VsbFBhcnNlZEZvcm11bGEgPSBwYXJzZV9YTFNCUGFyc2VkRm9ybXVsYTtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuOCBEVlBhcnNlZEZvcm11bGEgKi9cbi8vdmFyIHBhcnNlX1hMU0JEVlBhcnNlZEZvcm11bGEgPSBwYXJzZV9YTFNCUGFyc2VkRm9ybXVsYTtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuOSBGUlRQYXJzZWRGb3JtdWxhICovXG4vL3ZhciBwYXJzZV9YTFNCRlJUUGFyc2VkRm9ybXVsYSA9IHBhcnNlX1hMU0JQYXJzZWRGb3JtdWxhMjtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuMTIgTmFtZVBhcnNlZEZvcm11bGEgKi9cbnZhciBwYXJzZV9YTFNCTmFtZVBhcnNlZEZvcm11bGEgPSBwYXJzZV9YTFNCUGFyc2VkRm9ybXVsYTtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuOTggU2hhcmVkUGFyc2VkRm9ybXVsYSAqL1xudmFyIHBhcnNlX1hMU0JTaGFyZWRQYXJzZWRGb3JtdWxhID0gcGFyc2VfWExTQlBhcnNlZEZvcm11bGE7XG52YXIgQ2V0YWIgPSB7XG4gIDA6IFwiQkVFUFwiLFxuICAxOiBcIk9QRU5cIixcbiAgMjogXCJPUEVOLkxJTktTXCIsXG4gIDM6IFwiQ0xPU0UuQUxMXCIsXG4gIDQ6IFwiU0FWRVwiLFxuICA1OiBcIlNBVkUuQVNcIixcbiAgNjogXCJGSUxFLkRFTEVURVwiLFxuICA3OiBcIlBBR0UuU0VUVVBcIixcbiAgODogXCJQUklOVFwiLFxuICA5OiBcIlBSSU5URVIuU0VUVVBcIixcbiAgMTA6IFwiUVVJVFwiLFxuICAxMTogXCJORVcuV0lORE9XXCIsXG4gIDEyOiBcIkFSUkFOR0UuQUxMXCIsXG4gIDEzOiBcIldJTkRPVy5TSVpFXCIsXG4gIDE0OiBcIldJTkRPVy5NT1ZFXCIsXG4gIDE1OiBcIkZVTExcIixcbiAgMTY6IFwiQ0xPU0VcIixcbiAgMTc6IFwiUlVOXCIsXG4gIDIyOiBcIlNFVC5QUklOVC5BUkVBXCIsXG4gIDIzOiBcIlNFVC5QUklOVC5USVRMRVNcIixcbiAgMjQ6IFwiU0VULlBBR0UuQlJFQUtcIixcbiAgMjU6IFwiUkVNT1ZFLlBBR0UuQlJFQUtcIixcbiAgMjY6IFwiRk9OVFwiLFxuICAyNzogXCJESVNQTEFZXCIsXG4gIDI4OiBcIlBST1RFQ1QuRE9DVU1FTlRcIixcbiAgMjk6IFwiUFJFQ0lTSU9OXCIsXG4gIDMwOiBcIkExLlIxQzFcIixcbiAgMzE6IFwiQ0FMQ1VMQVRFLk5PV1wiLFxuICAzMjogXCJDQUxDVUxBVElPTlwiLFxuICAzNDogXCJEQVRBLkZJTkRcIixcbiAgMzU6IFwiRVhUUkFDVFwiLFxuICAzNjogXCJEQVRBLkRFTEVURVwiLFxuICAzNzogXCJTRVQuREFUQUJBU0VcIixcbiAgMzg6IFwiU0VULkNSSVRFUklBXCIsXG4gIDM5OiBcIlNPUlRcIixcbiAgNDA6IFwiREFUQS5TRVJJRVNcIixcbiAgNDE6IFwiVEFCTEVcIixcbiAgNDI6IFwiRk9STUFULk5VTUJFUlwiLFxuICA0MzogXCJBTElHTk1FTlRcIixcbiAgNDQ6IFwiU1RZTEVcIixcbiAgNDU6IFwiQk9SREVSXCIsXG4gIDQ2OiBcIkNFTEwuUFJPVEVDVElPTlwiLFxuICA0NzogXCJDT0xVTU4uV0lEVEhcIixcbiAgNDg6IFwiVU5ET1wiLFxuICA0OTogXCJDVVRcIixcbiAgNTA6IFwiQ09QWVwiLFxuICA1MTogXCJQQVNURVwiLFxuICA1MjogXCJDTEVBUlwiLFxuICA1MzogXCJQQVNURS5TUEVDSUFMXCIsXG4gIDU0OiBcIkVESVQuREVMRVRFXCIsXG4gIDU1OiBcIklOU0VSVFwiLFxuICA1NjogXCJGSUxMLlJJR0hUXCIsXG4gIDU3OiBcIkZJTEwuRE9XTlwiLFxuICA2MTogXCJERUZJTkUuTkFNRVwiLFxuICA2MjogXCJDUkVBVEUuTkFNRVNcIixcbiAgNjM6IFwiRk9STVVMQS5HT1RPXCIsXG4gIDY0OiBcIkZPUk1VTEEuRklORFwiLFxuICA2NTogXCJTRUxFQ1QuTEFTVC5DRUxMXCIsXG4gIDY2OiBcIlNIT1cuQUNUSVZFLkNFTExcIixcbiAgNjc6IFwiR0FMTEVSWS5BUkVBXCIsXG4gIDY4OiBcIkdBTExFUlkuQkFSXCIsXG4gIDY5OiBcIkdBTExFUlkuQ09MVU1OXCIsXG4gIDcwOiBcIkdBTExFUlkuTElORVwiLFxuICA3MTogXCJHQUxMRVJZLlBJRVwiLFxuICA3MjogXCJHQUxMRVJZLlNDQVRURVJcIixcbiAgNzM6IFwiQ09NQklOQVRJT05cIixcbiAgNzQ6IFwiUFJFRkVSUkVEXCIsXG4gIDc1OiBcIkFERC5PVkVSTEFZXCIsXG4gIDc2OiBcIkdSSURMSU5FU1wiLFxuICA3NzogXCJTRVQuUFJFRkVSUkVEXCIsXG4gIDc4OiBcIkFYRVNcIixcbiAgNzk6IFwiTEVHRU5EXCIsXG4gIDgwOiBcIkFUVEFDSC5URVhUXCIsXG4gIDgxOiBcIkFERC5BUlJPV1wiLFxuICA4MjogXCJTRUxFQ1QuQ0hBUlRcIixcbiAgODM6IFwiU0VMRUNULlBMT1QuQVJFQVwiLFxuICA4NDogXCJQQVRURVJOU1wiLFxuICA4NTogXCJNQUlOLkNIQVJUXCIsXG4gIDg2OiBcIk9WRVJMQVlcIixcbiAgODc6IFwiU0NBTEVcIixcbiAgODg6IFwiRk9STUFULkxFR0VORFwiLFxuICA4OTogXCJGT1JNQVQuVEVYVFwiLFxuICA5MDogXCJFRElULlJFUEVBVFwiLFxuICA5MTogXCJQQVJTRVwiLFxuICA5MjogXCJKVVNUSUZZXCIsXG4gIDkzOiBcIkhJREVcIixcbiAgOTQ6IFwiVU5ISURFXCIsXG4gIDk1OiBcIldPUktTUEFDRVwiLFxuICA5NjogXCJGT1JNVUxBXCIsXG4gIDk3OiBcIkZPUk1VTEEuRklMTFwiLFxuICA5ODogXCJGT1JNVUxBLkFSUkFZXCIsXG4gIDk5OiBcIkRBVEEuRklORC5ORVhUXCIsXG4gIDEwMDogXCJEQVRBLkZJTkQuUFJFVlwiLFxuICAxMDE6IFwiRk9STVVMQS5GSU5ELk5FWFRcIixcbiAgMTAyOiBcIkZPUk1VTEEuRklORC5QUkVWXCIsXG4gIDEwMzogXCJBQ1RJVkFURVwiLFxuICAxMDQ6IFwiQUNUSVZBVEUuTkVYVFwiLFxuICAxMDU6IFwiQUNUSVZBVEUuUFJFVlwiLFxuICAxMDY6IFwiVU5MT0NLRUQuTkVYVFwiLFxuICAxMDc6IFwiVU5MT0NLRUQuUFJFVlwiLFxuICAxMDg6IFwiQ09QWS5QSUNUVVJFXCIsXG4gIDEwOTogXCJTRUxFQ1RcIixcbiAgMTEwOiBcIkRFTEVURS5OQU1FXCIsXG4gIDExMTogXCJERUxFVEUuRk9STUFUXCIsXG4gIDExMjogXCJWTElORVwiLFxuICAxMTM6IFwiSExJTkVcIixcbiAgMTE0OiBcIlZQQUdFXCIsXG4gIDExNTogXCJIUEFHRVwiLFxuICAxMTY6IFwiVlNDUk9MTFwiLFxuICAxMTc6IFwiSFNDUk9MTFwiLFxuICAxMTg6IFwiQUxFUlRcIixcbiAgMTE5OiBcIk5FV1wiLFxuICAxMjA6IFwiQ0FOQ0VMLkNPUFlcIixcbiAgMTIxOiBcIlNIT1cuQ0xJUEJPQVJEXCIsXG4gIDEyMjogXCJNRVNTQUdFXCIsXG4gIDEyNDogXCJQQVNURS5MSU5LXCIsXG4gIDEyNTogXCJBUFAuQUNUSVZBVEVcIixcbiAgMTI2OiBcIkRFTEVURS5BUlJPV1wiLFxuICAxMjc6IFwiUk9XLkhFSUdIVFwiLFxuICAxMjg6IFwiRk9STUFULk1PVkVcIixcbiAgMTI5OiBcIkZPUk1BVC5TSVpFXCIsXG4gIDEzMDogXCJGT1JNVUxBLlJFUExBQ0VcIixcbiAgMTMxOiBcIlNFTkQuS0VZU1wiLFxuICAxMzI6IFwiU0VMRUNULlNQRUNJQUxcIixcbiAgMTMzOiBcIkFQUExZLk5BTUVTXCIsXG4gIDEzNDogXCJSRVBMQUNFLkZPTlRcIixcbiAgMTM1OiBcIkZSRUVaRS5QQU5FU1wiLFxuICAxMzY6IFwiU0hPVy5JTkZPXCIsXG4gIDEzNzogXCJTUExJVFwiLFxuICAxMzg6IFwiT04uV0lORE9XXCIsXG4gIDEzOTogXCJPTi5EQVRBXCIsXG4gIDE0MDogXCJESVNBQkxFLklOUFVUXCIsXG4gIDE0MjogXCJPVVRMSU5FXCIsXG4gIDE0MzogXCJMSVNULk5BTUVTXCIsXG4gIDE0NDogXCJGSUxFLkNMT1NFXCIsXG4gIDE0NTogXCJTQVZFLldPUktCT09LXCIsXG4gIDE0NjogXCJEQVRBLkZPUk1cIixcbiAgMTQ3OiBcIkNPUFkuQ0hBUlRcIixcbiAgMTQ4OiBcIk9OLlRJTUVcIixcbiAgMTQ5OiBcIldBSVRcIixcbiAgMTUwOiBcIkZPUk1BVC5GT05UXCIsXG4gIDE1MTogXCJGSUxMLlVQXCIsXG4gIDE1MjogXCJGSUxMLkxFRlRcIixcbiAgMTUzOiBcIkRFTEVURS5PVkVSTEFZXCIsXG4gIDE1NTogXCJTSE9SVC5NRU5VU1wiLFxuICAxNTk6IFwiU0VULlVQREFURS5TVEFUVVNcIixcbiAgMTYxOiBcIkNPTE9SLlBBTEVUVEVcIixcbiAgMTYyOiBcIkRFTEVURS5TVFlMRVwiLFxuICAxNjM6IFwiV0lORE9XLlJFU1RPUkVcIixcbiAgMTY0OiBcIldJTkRPVy5NQVhJTUlaRVwiLFxuICAxNjY6IFwiQ0hBTkdFLkxJTktcIixcbiAgMTY3OiBcIkNBTENVTEFURS5ET0NVTUVOVFwiLFxuICAxNjg6IFwiT04uS0VZXCIsXG4gIDE2OTogXCJBUFAuUkVTVE9SRVwiLFxuICAxNzA6IFwiQVBQLk1PVkVcIixcbiAgMTcxOiBcIkFQUC5TSVpFXCIsXG4gIDE3MjogXCJBUFAuTUlOSU1JWkVcIixcbiAgMTczOiBcIkFQUC5NQVhJTUlaRVwiLFxuICAxNzQ6IFwiQlJJTkcuVE8uRlJPTlRcIixcbiAgMTc1OiBcIlNFTkQuVE8uQkFDS1wiLFxuICAxODU6IFwiTUFJTi5DSEFSVC5UWVBFXCIsXG4gIDE4NjogXCJPVkVSTEFZLkNIQVJULlRZUEVcIixcbiAgMTg3OiBcIlNFTEVDVC5FTkRcIixcbiAgMTg4OiBcIk9QRU4uTUFJTFwiLFxuICAxODk6IFwiU0VORC5NQUlMXCIsXG4gIDE5MDogXCJTVEFOREFSRC5GT05UXCIsXG4gIDE5MTogXCJDT05TT0xJREFURVwiLFxuICAxOTI6IFwiU09SVC5TUEVDSUFMXCIsXG4gIDE5MzogXCJHQUxMRVJZLjNELkFSRUFcIixcbiAgMTk0OiBcIkdBTExFUlkuM0QuQ09MVU1OXCIsXG4gIDE5NTogXCJHQUxMRVJZLjNELkxJTkVcIixcbiAgMTk2OiBcIkdBTExFUlkuM0QuUElFXCIsXG4gIDE5NzogXCJWSUVXLjNEXCIsXG4gIDE5ODogXCJHT0FMLlNFRUtcIixcbiAgMTk5OiBcIldPUktHUk9VUFwiLFxuICAyMDA6IFwiRklMTC5HUk9VUFwiLFxuICAyMDE6IFwiVVBEQVRFLkxJTktcIixcbiAgMjAyOiBcIlBST01PVEVcIixcbiAgMjAzOiBcIkRFTU9URVwiLFxuICAyMDQ6IFwiU0hPVy5ERVRBSUxcIixcbiAgMjA2OiBcIlVOR1JPVVBcIixcbiAgMjA3OiBcIk9CSkVDVC5QUk9QRVJUSUVTXCIsXG4gIDIwODogXCJTQVZFLk5FVy5PQkpFQ1RcIixcbiAgMjA5OiBcIlNIQVJFXCIsXG4gIDIxMDogXCJTSEFSRS5OQU1FXCIsXG4gIDIxMTogXCJEVVBMSUNBVEVcIixcbiAgMjEyOiBcIkFQUExZLlNUWUxFXCIsXG4gIDIxMzogXCJBU1NJR04uVE8uT0JKRUNUXCIsXG4gIDIxNDogXCJPQkpFQ1QuUFJPVEVDVElPTlwiLFxuICAyMTU6IFwiSElERS5PQkpFQ1RcIixcbiAgMjE2OiBcIlNFVC5FWFRSQUNUXCIsXG4gIDIxNzogXCJDUkVBVEUuUFVCTElTSEVSXCIsXG4gIDIxODogXCJTVUJTQ1JJQkUuVE9cIixcbiAgMjE5OiBcIkFUVFJJQlVURVNcIixcbiAgMjIwOiBcIlNIT1cuVE9PTEJBUlwiLFxuICAyMjI6IFwiUFJJTlQuUFJFVklFV1wiLFxuICAyMjM6IFwiRURJVC5DT0xPUlwiLFxuICAyMjQ6IFwiU0hPVy5MRVZFTFNcIixcbiAgMjI1OiBcIkZPUk1BVC5NQUlOXCIsXG4gIDIyNjogXCJGT1JNQVQuT1ZFUkxBWVwiLFxuICAyMjc6IFwiT04uUkVDQUxDXCIsXG4gIDIyODogXCJFRElULlNFUklFU1wiLFxuICAyMjk6IFwiREVGSU5FLlNUWUxFXCIsXG4gIDI0MDogXCJMSU5FLlBSSU5UXCIsXG4gIDI0MzogXCJFTlRFUi5EQVRBXCIsXG4gIDI0OTogXCJHQUxMRVJZLlJBREFSXCIsXG4gIDI1MDogXCJNRVJHRS5TVFlMRVNcIixcbiAgMjUxOiBcIkVESVRJT04uT1BUSU9OU1wiLFxuICAyNTI6IFwiUEFTVEUuUElDVFVSRVwiLFxuICAyNTM6IFwiUEFTVEUuUElDVFVSRS5MSU5LXCIsXG4gIDI1NDogXCJTUEVMTElOR1wiLFxuICAyNTY6IFwiWk9PTVwiLFxuICAyNTk6IFwiSU5TRVJULk9CSkVDVFwiLFxuICAyNjA6IFwiV0lORE9XLk1JTklNSVpFXCIsXG4gIDI2NTogXCJTT1VORC5OT1RFXCIsXG4gIDI2NjogXCJTT1VORC5QTEFZXCIsXG4gIDI2NzogXCJGT1JNQVQuU0hBUEVcIixcbiAgMjY4OiBcIkVYVEVORC5QT0xZR09OXCIsXG4gIDI2OTogXCJGT1JNQVQuQVVUT1wiLFxuICAyNzI6IFwiR0FMTEVSWS4zRC5CQVJcIixcbiAgMjczOiBcIkdBTExFUlkuM0QuU1VSRkFDRVwiLFxuICAyNzQ6IFwiRklMTC5BVVRPXCIsXG4gIDI3NjogXCJDVVNUT01JWkUuVE9PTEJBUlwiLFxuICAyNzc6IFwiQURELlRPT0xcIixcbiAgMjc4OiBcIkVESVQuT0JKRUNUXCIsXG4gIDI3OTogXCJPTi5ET1VCTEVDTElDS1wiLFxuICAyODA6IFwiT04uRU5UUllcIixcbiAgMjgxOiBcIldPUktCT09LLkFERFwiLFxuICAyODI6IFwiV09SS0JPT0suTU9WRVwiLFxuICAyODM6IFwiV09SS0JPT0suQ09QWVwiLFxuICAyODQ6IFwiV09SS0JPT0suT1BUSU9OU1wiLFxuICAyODU6IFwiU0FWRS5XT1JLU1BBQ0VcIixcbiAgMjg4OiBcIkNIQVJULldJWkFSRFwiLFxuICAyODk6IFwiREVMRVRFLlRPT0xcIixcbiAgMjkwOiBcIk1PVkUuVE9PTFwiLFxuICAyOTE6IFwiV09SS0JPT0suU0VMRUNUXCIsXG4gIDI5MjogXCJXT1JLQk9PSy5BQ1RJVkFURVwiLFxuICAyOTM6IFwiQVNTSUdOLlRPLlRPT0xcIixcbiAgMjk1OiBcIkNPUFkuVE9PTFwiLFxuICAyOTY6IFwiUkVTRVQuVE9PTFwiLFxuICAyOTc6IFwiQ09OU1RSQUlOLk5VTUVSSUNcIixcbiAgMjk4OiBcIlBBU1RFLlRPT0xcIixcbiAgMzAyOiBcIldPUktCT09LLk5FV1wiLFxuICAzMDU6IFwiU0NFTkFSSU8uQ0VMTFNcIixcbiAgMzA2OiBcIlNDRU5BUklPLkRFTEVURVwiLFxuICAzMDc6IFwiU0NFTkFSSU8uQUREXCIsXG4gIDMwODogXCJTQ0VOQVJJTy5FRElUXCIsXG4gIDMwOTogXCJTQ0VOQVJJTy5TSE9XXCIsXG4gIDMxMDogXCJTQ0VOQVJJTy5TSE9XLk5FWFRcIixcbiAgMzExOiBcIlNDRU5BUklPLlNVTU1BUllcIixcbiAgMzEyOiBcIlBJVk9ULlRBQkxFLldJWkFSRFwiLFxuICAzMTM6IFwiUElWT1QuRklFTEQuUFJPUEVSVElFU1wiLFxuICAzMTQ6IFwiUElWT1QuRklFTERcIixcbiAgMzE1OiBcIlBJVk9ULklURU1cIixcbiAgMzE2OiBcIlBJVk9ULkFERC5GSUVMRFNcIixcbiAgMzE4OiBcIk9QVElPTlMuQ0FMQ1VMQVRJT05cIixcbiAgMzE5OiBcIk9QVElPTlMuRURJVFwiLFxuICAzMjA6IFwiT1BUSU9OUy5WSUVXXCIsXG4gIDMyMTogXCJBRERJTi5NQU5BR0VSXCIsXG4gIDMyMjogXCJNRU5VLkVESVRPUlwiLFxuICAzMjM6IFwiQVRUQUNILlRPT0xCQVJTXCIsXG4gIDMyNDogXCJWQkFBY3RpdmF0ZVwiLFxuICAzMjU6IFwiT1BUSU9OUy5DSEFSVFwiLFxuICAzMjg6IFwiVkJBLklOU0VSVC5GSUxFXCIsXG4gIDMzMDogXCJWQkEuUFJPQ0VEVVJFLkRFRklOSVRJT05cIixcbiAgMzM2OiBcIlJPVVRJTkcuU0xJUFwiLFxuICAzMzg6IFwiUk9VVEUuRE9DVU1FTlRcIixcbiAgMzM5OiBcIk1BSUwuTE9HT05cIixcbiAgMzQyOiBcIklOU0VSVC5QSUNUVVJFXCIsXG4gIDM0MzogXCJFRElULlRPT0xcIixcbiAgMzQ0OiBcIkdBTExFUlkuRE9VR0hOVVRcIixcbiAgMzUwOiBcIkNIQVJULlRSRU5EXCIsXG4gIDM1MjogXCJQSVZPVC5JVEVNLlBST1BFUlRJRVNcIixcbiAgMzU0OiBcIldPUktCT09LLklOU0VSVFwiLFxuICAzNTU6IFwiT1BUSU9OUy5UUkFOU0lUSU9OXCIsXG4gIDM1NjogXCJPUFRJT05TLkdFTkVSQUxcIixcbiAgMzcwOiBcIkZJTFRFUi5BRFZBTkNFRFwiLFxuICAzNzM6IFwiTUFJTC5BREQuTUFJTEVSXCIsXG4gIDM3NDogXCJNQUlMLkRFTEVURS5NQUlMRVJcIixcbiAgMzc1OiBcIk1BSUwuUkVQTFlcIixcbiAgMzc2OiBcIk1BSUwuUkVQTFkuQUxMXCIsXG4gIDM3NzogXCJNQUlMLkZPUldBUkRcIixcbiAgMzc4OiBcIk1BSUwuTkVYVC5MRVRURVJcIixcbiAgMzc5OiBcIkRBVEEuTEFCRUxcIixcbiAgMzgwOiBcIklOU0VSVC5USVRMRVwiLFxuICAzODE6IFwiRk9OVC5QUk9QRVJUSUVTXCIsXG4gIDM4MjogXCJNQUNSTy5PUFRJT05TXCIsXG4gIDM4MzogXCJXT1JLQk9PSy5ISURFXCIsXG4gIDM4NDogXCJXT1JLQk9PSy5VTkhJREVcIixcbiAgMzg1OiBcIldPUktCT09LLkRFTEVURVwiLFxuICAzODY6IFwiV09SS0JPT0suTkFNRVwiLFxuICAzODg6IFwiR0FMTEVSWS5DVVNUT01cIixcbiAgMzkwOiBcIkFERC5DSEFSVC5BVVRPRk9STUFUXCIsXG4gIDM5MTogXCJERUxFVEUuQ0hBUlQuQVVUT0ZPUk1BVFwiLFxuICAzOTI6IFwiQ0hBUlQuQURELkRBVEFcIixcbiAgMzkzOiBcIkFVVE8uT1VUTElORVwiLFxuICAzOTQ6IFwiVEFCLk9SREVSXCIsXG4gIDM5NTogXCJTSE9XLkRJQUxPR1wiLFxuICAzOTY6IFwiU0VMRUNULkFMTFwiLFxuICAzOTc6IFwiVU5HUk9VUC5TSEVFVFNcIixcbiAgMzk4OiBcIlNVQlRPVEFMLkNSRUFURVwiLFxuICAzOTk6IFwiU1VCVE9UQUwuUkVNT1ZFXCIsXG4gIDQwMDogXCJSRU5BTUUuT0JKRUNUXCIsXG4gIDQxMjogXCJXT1JLQk9PSy5TQ1JPTExcIixcbiAgNDEzOiBcIldPUktCT09LLk5FWFRcIixcbiAgNDE0OiBcIldPUktCT09LLlBSRVZcIixcbiAgNDE1OiBcIldPUktCT09LLlRBQi5TUExJVFwiLFxuICA0MTY6IFwiRlVMTC5TQ1JFRU5cIixcbiAgNDE3OiBcIldPUktCT09LLlBST1RFQ1RcIixcbiAgNDIwOiBcIlNDUk9MTEJBUi5QUk9QRVJUSUVTXCIsXG4gIDQyMTogXCJQSVZPVC5TSE9XLlBBR0VTXCIsXG4gIDQyMjogXCJURVhULlRPLkNPTFVNTlNcIixcbiAgNDIzOiBcIkZPUk1BVC5DSEFSVFRZUEVcIixcbiAgNDI0OiBcIkxJTksuRk9STUFUXCIsXG4gIDQyNTogXCJUUkFDRVIuRElTUExBWVwiLFxuICA0MzA6IFwiVFJBQ0VSLk5BVklHQVRFXCIsXG4gIDQzMTogXCJUUkFDRVIuQ0xFQVJcIixcbiAgNDMyOiBcIlRSQUNFUi5FUlJPUlwiLFxuICA0MzM6IFwiUElWT1QuRklFTEQuR1JPVVBcIixcbiAgNDM0OiBcIlBJVk9ULkZJRUxELlVOR1JPVVBcIixcbiAgNDM1OiBcIkNIRUNLQk9YLlBST1BFUlRJRVNcIixcbiAgNDM2OiBcIkxBQkVMLlBST1BFUlRJRVNcIixcbiAgNDM3OiBcIkxJU1RCT1guUFJPUEVSVElFU1wiLFxuICA0Mzg6IFwiRURJVEJPWC5QUk9QRVJUSUVTXCIsXG4gIDQzOTogXCJQSVZPVC5SRUZSRVNIXCIsXG4gIDQ0MDogXCJMSU5LLkNPTUJPXCIsXG4gIDQ0MTogXCJPUEVOLlRFWFRcIixcbiAgNDQyOiBcIkhJREUuRElBTE9HXCIsXG4gIDQ0MzogXCJTRVQuRElBTE9HLkZPQ1VTXCIsXG4gIDQ0NDogXCJFTkFCTEUuT0JKRUNUXCIsXG4gIDQ0NTogXCJQVVNIQlVUVE9OLlBST1BFUlRJRVNcIixcbiAgNDQ2OiBcIlNFVC5ESUFMT0cuREVGQVVMVFwiLFxuICA0NDc6IFwiRklMVEVSXCIsXG4gIDQ0ODogXCJGSUxURVIuU0hPVy5BTExcIixcbiAgNDQ5OiBcIkNMRUFSLk9VVExJTkVcIixcbiAgNDUwOiBcIkZVTkNUSU9OLldJWkFSRFwiLFxuICA0NTE6IFwiQURELkxJU1QuSVRFTVwiLFxuICA0NTI6IFwiU0VULkxJU1QuSVRFTVwiLFxuICA0NTM6IFwiUkVNT1ZFLkxJU1QuSVRFTVwiLFxuICA0NTQ6IFwiU0VMRUNULkxJU1QuSVRFTVwiLFxuICA0NTU6IFwiU0VULkNPTlRST0wuVkFMVUVcIixcbiAgNDU2OiBcIlNBVkUuQ09QWS5BU1wiLFxuICA0NTg6IFwiT1BUSU9OUy5MSVNUUy5BRERcIixcbiAgNDU5OiBcIk9QVElPTlMuTElTVFMuREVMRVRFXCIsXG4gIDQ2MDogXCJTRVJJRVMuQVhFU1wiLFxuICA0NjE6IFwiU0VSSUVTLlhcIixcbiAgNDYyOiBcIlNFUklFUy5ZXCIsXG4gIDQ2MzogXCJFUlJPUkJBUi5YXCIsXG4gIDQ2NDogXCJFUlJPUkJBUi5ZXCIsXG4gIDQ2NTogXCJGT1JNQVQuQ0hBUlRcIixcbiAgNDY2OiBcIlNFUklFUy5PUkRFUlwiLFxuICA0Njc6IFwiTUFJTC5MT0dPRkZcIixcbiAgNDY4OiBcIkNMRUFSLlJPVVRJTkcuU0xJUFwiLFxuICA0Njk6IFwiQVBQLkFDVElWQVRFLk1JQ1JPU09GVFwiLFxuICA0NzA6IFwiTUFJTC5FRElULk1BSUxFUlwiLFxuICA0NzE6IFwiT04uU0hFRVRcIixcbiAgNDcyOiBcIlNUQU5EQVJELldJRFRIXCIsXG4gIDQ3MzogXCJTQ0VOQVJJTy5NRVJHRVwiLFxuICA0NzQ6IFwiU1VNTUFSWS5JTkZPXCIsXG4gIDQ3NTogXCJGSU5ELkZJTEVcIixcbiAgNDc2OiBcIkFDVElWRS5DRUxMLkZPTlRcIixcbiAgNDc3OiBcIkVOQUJMRS5USVBXSVpBUkRcIixcbiAgNDc4OiBcIlZCQS5NQUtFLkFERElOXCIsXG4gIDQ4MDogXCJJTlNFUlREQVRBVEFCTEVcIixcbiAgNDgxOiBcIldPUktHUk9VUC5PUFRJT05TXCIsXG4gIDQ4MjogXCJNQUlMLlNFTkQuTUFJTEVSXCIsXG4gIDQ4NTogXCJBVVRPQ09SUkVDVFwiLFxuICA0ODk6IFwiUE9TVC5ET0NVTUVOVFwiLFxuICA0OTE6IFwiUElDS0xJU1RcIixcbiAgNDkzOiBcIlZJRVcuU0hPV1wiLFxuICA0OTQ6IFwiVklFVy5ERUZJTkVcIixcbiAgNDk1OiBcIlZJRVcuREVMRVRFXCIsXG4gIDUwOTogXCJTSEVFVC5CQUNLR1JPVU5EXCIsXG4gIDUxMDogXCJJTlNFUlQuTUFQLk9CSkVDVFwiLFxuICA1MTE6IFwiT1BUSU9OUy5NRU5PTk9cIixcbiAgNTE3OiBcIk1TT0NIRUNLU1wiLFxuICA1MTg6IFwiTk9STUFMXCIsXG4gIDUxOTogXCJMQVlPVVRcIixcbiAgNTIwOiBcIlJNLlBSSU5ULkFSRUFcIixcbiAgNTIxOiBcIkNMRUFSLlBSSU5ULkFSRUFcIixcbiAgNTIyOiBcIkFERC5QUklOVC5BUkVBXCIsXG4gIDUyMzogXCJNT1ZFLkJSS1wiLFxuICA1NDU6IFwiSElERUNVUlIuTk9URVwiLFxuICA1NDY6IFwiSElERUFMTC5OT1RFU1wiLFxuICA1NDc6IFwiREVMRVRFLk5PVEVcIixcbiAgNTQ4OiBcIlRSQVZFUlNFLk5PVEVTXCIsXG4gIDU0OTogXCJBQ1RJVkFURS5OT1RFU1wiLFxuICA2MjA6IFwiUFJPVEVDVC5SRVZJU0lPTlNcIixcbiAgNjIxOiBcIlVOUFJPVEVDVC5SRVZJU0lPTlNcIixcbiAgNjQ3OiBcIk9QVElPTlMuTUVcIixcbiAgNjUzOiBcIldFQi5QVUJMSVNIXCIsXG4gIDY2NzogXCJORVdXRUJRVUVSWVwiLFxuICA2NzM6IFwiUElWT1QuVEFCTEUuQ0hBUlRcIixcbiAgNzUzOiBcIk9QVElPTlMuU0FWRVwiLFxuICA3NTU6IFwiT1BUSU9OUy5TUEVMTFwiLFxuICA4MDg6IFwiSElERUFMTC5JTktBTk5PVFNcIlxufTtcbnZhciBGdGFiID0ge1xuICAwOiBcIkNPVU5UXCIsXG4gIDE6IFwiSUZcIixcbiAgMjogXCJJU05BXCIsXG4gIDM6IFwiSVNFUlJPUlwiLFxuICA0OiBcIlNVTVwiLFxuICA1OiBcIkFWRVJBR0VcIixcbiAgNjogXCJNSU5cIixcbiAgNzogXCJNQVhcIixcbiAgODogXCJST1dcIixcbiAgOTogXCJDT0xVTU5cIixcbiAgMTA6IFwiTkFcIixcbiAgMTE6IFwiTlBWXCIsXG4gIDEyOiBcIlNUREVWXCIsXG4gIDEzOiBcIkRPTExBUlwiLFxuICAxNDogXCJGSVhFRFwiLFxuICAxNTogXCJTSU5cIixcbiAgMTY6IFwiQ09TXCIsXG4gIDE3OiBcIlRBTlwiLFxuICAxODogXCJBVEFOXCIsXG4gIDE5OiBcIlBJXCIsXG4gIDIwOiBcIlNRUlRcIixcbiAgMjE6IFwiRVhQXCIsXG4gIDIyOiBcIkxOXCIsXG4gIDIzOiBcIkxPRzEwXCIsXG4gIDI0OiBcIkFCU1wiLFxuICAyNTogXCJJTlRcIixcbiAgMjY6IFwiU0lHTlwiLFxuICAyNzogXCJST1VORFwiLFxuICAyODogXCJMT09LVVBcIixcbiAgMjk6IFwiSU5ERVhcIixcbiAgMzA6IFwiUkVQVFwiLFxuICAzMTogXCJNSURcIixcbiAgMzI6IFwiTEVOXCIsXG4gIDMzOiBcIlZBTFVFXCIsXG4gIDM0OiBcIlRSVUVcIixcbiAgMzU6IFwiRkFMU0VcIixcbiAgMzY6IFwiQU5EXCIsXG4gIDM3OiBcIk9SXCIsXG4gIDM4OiBcIk5PVFwiLFxuICAzOTogXCJNT0RcIixcbiAgNDA6IFwiRENPVU5UXCIsXG4gIDQxOiBcIkRTVU1cIixcbiAgNDI6IFwiREFWRVJBR0VcIixcbiAgNDM6IFwiRE1JTlwiLFxuICA0NDogXCJETUFYXCIsXG4gIDQ1OiBcIkRTVERFVlwiLFxuICA0NjogXCJWQVJcIixcbiAgNDc6IFwiRFZBUlwiLFxuICA0ODogXCJURVhUXCIsXG4gIDQ5OiBcIkxJTkVTVFwiLFxuICA1MDogXCJUUkVORFwiLFxuICA1MTogXCJMT0dFU1RcIixcbiAgNTI6IFwiR1JPV1RIXCIsXG4gIDUzOiBcIkdPVE9cIixcbiAgNTQ6IFwiSEFMVFwiLFxuICA1NTogXCJSRVRVUk5cIixcbiAgNTY6IFwiUFZcIixcbiAgNTc6IFwiRlZcIixcbiAgNTg6IFwiTlBFUlwiLFxuICA1OTogXCJQTVRcIixcbiAgNjA6IFwiUkFURVwiLFxuICA2MTogXCJNSVJSXCIsXG4gIDYyOiBcIklSUlwiLFxuICA2MzogXCJSQU5EXCIsXG4gIDY0OiBcIk1BVENIXCIsXG4gIDY1OiBcIkRBVEVcIixcbiAgNjY6IFwiVElNRVwiLFxuICA2NzogXCJEQVlcIixcbiAgNjg6IFwiTU9OVEhcIixcbiAgNjk6IFwiWUVBUlwiLFxuICA3MDogXCJXRUVLREFZXCIsXG4gIDcxOiBcIkhPVVJcIixcbiAgNzI6IFwiTUlOVVRFXCIsXG4gIDczOiBcIlNFQ09ORFwiLFxuICA3NDogXCJOT1dcIixcbiAgNzU6IFwiQVJFQVNcIixcbiAgNzY6IFwiUk9XU1wiLFxuICA3NzogXCJDT0xVTU5TXCIsXG4gIDc4OiBcIk9GRlNFVFwiLFxuICA3OTogXCJBQlNSRUZcIixcbiAgODA6IFwiUkVMUkVGXCIsXG4gIDgxOiBcIkFSR1VNRU5UXCIsXG4gIDgyOiBcIlNFQVJDSFwiLFxuICA4MzogXCJUUkFOU1BPU0VcIixcbiAgODQ6IFwiRVJST1JcIixcbiAgODU6IFwiU1RFUFwiLFxuICA4NjogXCJUWVBFXCIsXG4gIDg3OiBcIkVDSE9cIixcbiAgODg6IFwiU0VULk5BTUVcIixcbiAgODk6IFwiQ0FMTEVSXCIsXG4gIDkwOiBcIkRFUkVGXCIsXG4gIDkxOiBcIldJTkRPV1NcIixcbiAgOTI6IFwiU0VSSUVTXCIsXG4gIDkzOiBcIkRPQ1VNRU5UU1wiLFxuICA5NDogXCJBQ1RJVkUuQ0VMTFwiLFxuICA5NTogXCJTRUxFQ1RJT05cIixcbiAgOTY6IFwiUkVTVUxUXCIsXG4gIDk3OiBcIkFUQU4yXCIsXG4gIDk4OiBcIkFTSU5cIixcbiAgOTk6IFwiQUNPU1wiLFxuICAxMDA6IFwiQ0hPT1NFXCIsXG4gIDEwMTogXCJITE9PS1VQXCIsXG4gIDEwMjogXCJWTE9PS1VQXCIsXG4gIDEwMzogXCJMSU5LU1wiLFxuICAxMDQ6IFwiSU5QVVRcIixcbiAgMTA1OiBcIklTUkVGXCIsXG4gIDEwNjogXCJHRVQuRk9STVVMQVwiLFxuICAxMDc6IFwiR0VULk5BTUVcIixcbiAgMTA4OiBcIlNFVC5WQUxVRVwiLFxuICAxMDk6IFwiTE9HXCIsXG4gIDExMDogXCJFWEVDXCIsXG4gIDExMTogXCJDSEFSXCIsXG4gIDExMjogXCJMT1dFUlwiLFxuICAxMTM6IFwiVVBQRVJcIixcbiAgMTE0OiBcIlBST1BFUlwiLFxuICAxMTU6IFwiTEVGVFwiLFxuICAxMTY6IFwiUklHSFRcIixcbiAgMTE3OiBcIkVYQUNUXCIsXG4gIDExODogXCJUUklNXCIsXG4gIDExOTogXCJSRVBMQUNFXCIsXG4gIDEyMDogXCJTVUJTVElUVVRFXCIsXG4gIDEyMTogXCJDT0RFXCIsXG4gIDEyMjogXCJOQU1FU1wiLFxuICAxMjM6IFwiRElSRUNUT1JZXCIsXG4gIDEyNDogXCJGSU5EXCIsXG4gIDEyNTogXCJDRUxMXCIsXG4gIDEyNjogXCJJU0VSUlwiLFxuICAxMjc6IFwiSVNURVhUXCIsXG4gIDEyODogXCJJU05VTUJFUlwiLFxuICAxMjk6IFwiSVNCTEFOS1wiLFxuICAxMzA6IFwiVFwiLFxuICAxMzE6IFwiTlwiLFxuICAxMzI6IFwiRk9QRU5cIixcbiAgMTMzOiBcIkZDTE9TRVwiLFxuICAxMzQ6IFwiRlNJWkVcIixcbiAgMTM1OiBcIkZSRUFETE5cIixcbiAgMTM2OiBcIkZSRUFEXCIsXG4gIDEzNzogXCJGV1JJVEVMTlwiLFxuICAxMzg6IFwiRldSSVRFXCIsXG4gIDEzOTogXCJGUE9TXCIsXG4gIDE0MDogXCJEQVRFVkFMVUVcIixcbiAgMTQxOiBcIlRJTUVWQUxVRVwiLFxuICAxNDI6IFwiU0xOXCIsXG4gIDE0MzogXCJTWURcIixcbiAgMTQ0OiBcIkREQlwiLFxuICAxNDU6IFwiR0VULkRFRlwiLFxuICAxNDY6IFwiUkVGVEVYVFwiLFxuICAxNDc6IFwiVEVYVFJFRlwiLFxuICAxNDg6IFwiSU5ESVJFQ1RcIixcbiAgMTQ5OiBcIlJFR0lTVEVSXCIsXG4gIDE1MDogXCJDQUxMXCIsXG4gIDE1MTogXCJBREQuQkFSXCIsXG4gIDE1MjogXCJBREQuTUVOVVwiLFxuICAxNTM6IFwiQURELkNPTU1BTkRcIixcbiAgMTU0OiBcIkVOQUJMRS5DT01NQU5EXCIsXG4gIDE1NTogXCJDSEVDSy5DT01NQU5EXCIsXG4gIDE1NjogXCJSRU5BTUUuQ09NTUFORFwiLFxuICAxNTc6IFwiU0hPVy5CQVJcIixcbiAgMTU4OiBcIkRFTEVURS5NRU5VXCIsXG4gIDE1OTogXCJERUxFVEUuQ09NTUFORFwiLFxuICAxNjA6IFwiR0VULkNIQVJULklURU1cIixcbiAgMTYxOiBcIkRJQUxPRy5CT1hcIixcbiAgMTYyOiBcIkNMRUFOXCIsXG4gIDE2MzogXCJNREVURVJNXCIsXG4gIDE2NDogXCJNSU5WRVJTRVwiLFxuICAxNjU6IFwiTU1VTFRcIixcbiAgMTY2OiBcIkZJTEVTXCIsXG4gIDE2NzogXCJJUE1UXCIsXG4gIDE2ODogXCJQUE1UXCIsXG4gIDE2OTogXCJDT1VOVEFcIixcbiAgMTcwOiBcIkNBTkNFTC5LRVlcIixcbiAgMTcxOiBcIkZPUlwiLFxuICAxNzI6IFwiV0hJTEVcIixcbiAgMTczOiBcIkJSRUFLXCIsXG4gIDE3NDogXCJORVhUXCIsXG4gIDE3NTogXCJJTklUSUFURVwiLFxuICAxNzY6IFwiUkVRVUVTVFwiLFxuICAxNzc6IFwiUE9LRVwiLFxuICAxNzg6IFwiRVhFQ1VURVwiLFxuICAxNzk6IFwiVEVSTUlOQVRFXCIsXG4gIDE4MDogXCJSRVNUQVJUXCIsXG4gIDE4MTogXCJIRUxQXCIsXG4gIDE4MjogXCJHRVQuQkFSXCIsXG4gIDE4MzogXCJQUk9EVUNUXCIsXG4gIDE4NDogXCJGQUNUXCIsXG4gIDE4NTogXCJHRVQuQ0VMTFwiLFxuICAxODY6IFwiR0VULldPUktTUEFDRVwiLFxuICAxODc6IFwiR0VULldJTkRPV1wiLFxuICAxODg6IFwiR0VULkRPQ1VNRU5UXCIsXG4gIDE4OTogXCJEUFJPRFVDVFwiLFxuICAxOTA6IFwiSVNOT05URVhUXCIsXG4gIDE5MTogXCJHRVQuTk9URVwiLFxuICAxOTI6IFwiTk9URVwiLFxuICAxOTM6IFwiU1RERVZQXCIsXG4gIDE5NDogXCJWQVJQXCIsXG4gIDE5NTogXCJEU1RERVZQXCIsXG4gIDE5NjogXCJEVkFSUFwiLFxuICAxOTc6IFwiVFJVTkNcIixcbiAgMTk4OiBcIklTTE9HSUNBTFwiLFxuICAxOTk6IFwiRENPVU5UQVwiLFxuICAyMDA6IFwiREVMRVRFLkJBUlwiLFxuICAyMDE6IFwiVU5SRUdJU1RFUlwiLFxuICAyMDQ6IFwiVVNET0xMQVJcIixcbiAgMjA1OiBcIkZJTkRCXCIsXG4gIDIwNjogXCJTRUFSQ0hCXCIsXG4gIDIwNzogXCJSRVBMQUNFQlwiLFxuICAyMDg6IFwiTEVGVEJcIixcbiAgMjA5OiBcIlJJR0hUQlwiLFxuICAyMTA6IFwiTUlEQlwiLFxuICAyMTE6IFwiTEVOQlwiLFxuICAyMTI6IFwiUk9VTkRVUFwiLFxuICAyMTM6IFwiUk9VTkRET1dOXCIsXG4gIDIxNDogXCJBU0NcIixcbiAgMjE1OiBcIkRCQ1NcIixcbiAgMjE2OiBcIlJBTktcIixcbiAgMjE5OiBcIkFERFJFU1NcIixcbiAgMjIwOiBcIkRBWVMzNjBcIixcbiAgMjIxOiBcIlRPREFZXCIsXG4gIDIyMjogXCJWREJcIixcbiAgMjIzOiBcIkVMU0VcIixcbiAgMjI0OiBcIkVMU0UuSUZcIixcbiAgMjI1OiBcIkVORC5JRlwiLFxuICAyMjY6IFwiRk9SLkNFTExcIixcbiAgMjI3OiBcIk1FRElBTlwiLFxuICAyMjg6IFwiU1VNUFJPRFVDVFwiLFxuICAyMjk6IFwiU0lOSFwiLFxuICAyMzA6IFwiQ09TSFwiLFxuICAyMzE6IFwiVEFOSFwiLFxuICAyMzI6IFwiQVNJTkhcIixcbiAgMjMzOiBcIkFDT1NIXCIsXG4gIDIzNDogXCJBVEFOSFwiLFxuICAyMzU6IFwiREdFVFwiLFxuICAyMzY6IFwiQ1JFQVRFLk9CSkVDVFwiLFxuICAyMzc6IFwiVk9MQVRJTEVcIixcbiAgMjM4OiBcIkxBU1QuRVJST1JcIixcbiAgMjM5OiBcIkNVU1RPTS5VTkRPXCIsXG4gIDI0MDogXCJDVVNUT00uUkVQRUFUXCIsXG4gIDI0MTogXCJGT1JNVUxBLkNPTlZFUlRcIixcbiAgMjQyOiBcIkdFVC5MSU5LLklORk9cIixcbiAgMjQzOiBcIlRFWFQuQk9YXCIsXG4gIDI0NDogXCJJTkZPXCIsXG4gIDI0NTogXCJHUk9VUFwiLFxuICAyNDY6IFwiR0VULk9CSkVDVFwiLFxuICAyNDc6IFwiREJcIixcbiAgMjQ4OiBcIlBBVVNFXCIsXG4gIDI1MTogXCJSRVNVTUVcIixcbiAgMjUyOiBcIkZSRVFVRU5DWVwiLFxuICAyNTM6IFwiQURELlRPT0xCQVJcIixcbiAgMjU0OiBcIkRFTEVURS5UT09MQkFSXCIsXG4gIDI1NTogXCJVc2VyXCIsXG4gIDI1NjogXCJSRVNFVC5UT09MQkFSXCIsXG4gIDI1NzogXCJFVkFMVUFURVwiLFxuICAyNTg6IFwiR0VULlRPT0xCQVJcIixcbiAgMjU5OiBcIkdFVC5UT09MXCIsXG4gIDI2MDogXCJTUEVMTElORy5DSEVDS1wiLFxuICAyNjE6IFwiRVJST1IuVFlQRVwiLFxuICAyNjI6IFwiQVBQLlRJVExFXCIsXG4gIDI2MzogXCJXSU5ET1cuVElUTEVcIixcbiAgMjY0OiBcIlNBVkUuVE9PTEJBUlwiLFxuICAyNjU6IFwiRU5BQkxFLlRPT0xcIixcbiAgMjY2OiBcIlBSRVNTLlRPT0xcIixcbiAgMjY3OiBcIlJFR0lTVEVSLklEXCIsXG4gIDI2ODogXCJHRVQuV09SS0JPT0tcIixcbiAgMjY5OiBcIkFWRURFVlwiLFxuICAyNzA6IFwiQkVUQURJU1RcIixcbiAgMjcxOiBcIkdBTU1BTE5cIixcbiAgMjcyOiBcIkJFVEFJTlZcIixcbiAgMjczOiBcIkJJTk9NRElTVFwiLFxuICAyNzQ6IFwiQ0hJRElTVFwiLFxuICAyNzU6IFwiQ0hJSU5WXCIsXG4gIDI3NjogXCJDT01CSU5cIixcbiAgMjc3OiBcIkNPTkZJREVOQ0VcIixcbiAgMjc4OiBcIkNSSVRCSU5PTVwiLFxuICAyNzk6IFwiRVZFTlwiLFxuICAyODA6IFwiRVhQT05ESVNUXCIsXG4gIDI4MTogXCJGRElTVFwiLFxuICAyODI6IFwiRklOVlwiLFxuICAyODM6IFwiRklTSEVSXCIsXG4gIDI4NDogXCJGSVNIRVJJTlZcIixcbiAgMjg1OiBcIkZMT09SXCIsXG4gIDI4NjogXCJHQU1NQURJU1RcIixcbiAgMjg3OiBcIkdBTU1BSU5WXCIsXG4gIDI4ODogXCJDRUlMSU5HXCIsXG4gIDI4OTogXCJIWVBHRU9NRElTVFwiLFxuICAyOTA6IFwiTE9HTk9STURJU1RcIixcbiAgMjkxOiBcIkxPR0lOVlwiLFxuICAyOTI6IFwiTkVHQklOT01ESVNUXCIsXG4gIDI5MzogXCJOT1JNRElTVFwiLFxuICAyOTQ6IFwiTk9STVNESVNUXCIsXG4gIDI5NTogXCJOT1JNSU5WXCIsXG4gIDI5NjogXCJOT1JNU0lOVlwiLFxuICAyOTc6IFwiU1RBTkRBUkRJWkVcIixcbiAgMjk4OiBcIk9ERFwiLFxuICAyOTk6IFwiUEVSTVVUXCIsXG4gIDMwMDogXCJQT0lTU09OXCIsXG4gIDMwMTogXCJURElTVFwiLFxuICAzMDI6IFwiV0VJQlVMTFwiLFxuICAzMDM6IFwiU1VNWE1ZMlwiLFxuICAzMDQ6IFwiU1VNWDJNWTJcIixcbiAgMzA1OiBcIlNVTVgyUFkyXCIsXG4gIDMwNjogXCJDSElURVNUXCIsXG4gIDMwNzogXCJDT1JSRUxcIixcbiAgMzA4OiBcIkNPVkFSXCIsXG4gIDMwOTogXCJGT1JFQ0FTVFwiLFxuICAzMTA6IFwiRlRFU1RcIixcbiAgMzExOiBcIklOVEVSQ0VQVFwiLFxuICAzMTI6IFwiUEVBUlNPTlwiLFxuICAzMTM6IFwiUlNRXCIsXG4gIDMxNDogXCJTVEVZWFwiLFxuICAzMTU6IFwiU0xPUEVcIixcbiAgMzE2OiBcIlRURVNUXCIsXG4gIDMxNzogXCJQUk9CXCIsXG4gIDMxODogXCJERVZTUVwiLFxuICAzMTk6IFwiR0VPTUVBTlwiLFxuICAzMjA6IFwiSEFSTUVBTlwiLFxuICAzMjE6IFwiU1VNU1FcIixcbiAgMzIyOiBcIktVUlRcIixcbiAgMzIzOiBcIlNLRVdcIixcbiAgMzI0OiBcIlpURVNUXCIsXG4gIDMyNTogXCJMQVJHRVwiLFxuICAzMjY6IFwiU01BTExcIixcbiAgMzI3OiBcIlFVQVJUSUxFXCIsXG4gIDMyODogXCJQRVJDRU5USUxFXCIsXG4gIDMyOTogXCJQRVJDRU5UUkFOS1wiLFxuICAzMzA6IFwiTU9ERVwiLFxuICAzMzE6IFwiVFJJTU1FQU5cIixcbiAgMzMyOiBcIlRJTlZcIixcbiAgMzM0OiBcIk1PVklFLkNPTU1BTkRcIixcbiAgMzM1OiBcIkdFVC5NT1ZJRVwiLFxuICAzMzY6IFwiQ09OQ0FURU5BVEVcIixcbiAgMzM3OiBcIlBPV0VSXCIsXG4gIDMzODogXCJQSVZPVC5BREQuREFUQVwiLFxuICAzMzk6IFwiR0VULlBJVk9ULlRBQkxFXCIsXG4gIDM0MDogXCJHRVQuUElWT1QuRklFTERcIixcbiAgMzQxOiBcIkdFVC5QSVZPVC5JVEVNXCIsXG4gIDM0MjogXCJSQURJQU5TXCIsXG4gIDM0MzogXCJERUdSRUVTXCIsXG4gIDM0NDogXCJTVUJUT1RBTFwiLFxuICAzNDU6IFwiU1VNSUZcIixcbiAgMzQ2OiBcIkNPVU5USUZcIixcbiAgMzQ3OiBcIkNPVU5UQkxBTktcIixcbiAgMzQ4OiBcIlNDRU5BUklPLkdFVFwiLFxuICAzNDk6IFwiT1BUSU9OUy5MSVNUUy5HRVRcIixcbiAgMzUwOiBcIklTUE1UXCIsXG4gIDM1MTogXCJEQVRFRElGXCIsXG4gIDM1MjogXCJEQVRFU1RSSU5HXCIsXG4gIDM1MzogXCJOVU1CRVJTVFJJTkdcIixcbiAgMzU0OiBcIlJPTUFOXCIsXG4gIDM1NTogXCJPUEVOLkRJQUxPR1wiLFxuICAzNTY6IFwiU0FWRS5ESUFMT0dcIixcbiAgMzU3OiBcIlZJRVcuR0VUXCIsXG4gIDM1ODogXCJHRVRQSVZPVERBVEFcIixcbiAgMzU5OiBcIkhZUEVSTElOS1wiLFxuICAzNjA6IFwiUEhPTkVUSUNcIixcbiAgMzYxOiBcIkFWRVJBR0VBXCIsXG4gIDM2MjogXCJNQVhBXCIsXG4gIDM2MzogXCJNSU5BXCIsXG4gIDM2NDogXCJTVERFVlBBXCIsXG4gIDM2NTogXCJWQVJQQVwiLFxuICAzNjY6IFwiU1RERVZBXCIsXG4gIDM2NzogXCJWQVJBXCIsXG4gIDM2ODogXCJCQUhUVEVYVFwiLFxuICAzNjk6IFwiVEhBSURBWU9GV0VFS1wiLFxuICAzNzA6IFwiVEhBSURJR0lUXCIsXG4gIDM3MTogXCJUSEFJTU9OVEhPRllFQVJcIixcbiAgMzcyOiBcIlRIQUlOVU1TT1VORFwiLFxuICAzNzM6IFwiVEhBSU5VTVNUUklOR1wiLFxuICAzNzQ6IFwiVEhBSVNUUklOR0xFTkdUSFwiLFxuICAzNzU6IFwiSVNUSEFJRElHSVRcIixcbiAgMzc2OiBcIlJPVU5EQkFIVERPV05cIixcbiAgMzc3OiBcIlJPVU5EQkFIVFVQXCIsXG4gIDM3ODogXCJUSEFJWUVBUlwiLFxuICAzNzk6IFwiUlREXCIsXG4gIDM4MDogXCJDVUJFVkFMVUVcIixcbiAgMzgxOiBcIkNVQkVNRU1CRVJcIixcbiAgMzgyOiBcIkNVQkVNRU1CRVJQUk9QRVJUWVwiLFxuICAzODM6IFwiQ1VCRVJBTktFRE1FTUJFUlwiLFxuICAzODQ6IFwiSEVYMkJJTlwiLFxuICAzODU6IFwiSEVYMkRFQ1wiLFxuICAzODY6IFwiSEVYMk9DVFwiLFxuICAzODc6IFwiREVDMkJJTlwiLFxuICAzODg6IFwiREVDMkhFWFwiLFxuICAzODk6IFwiREVDMk9DVFwiLFxuICAzOTA6IFwiT0NUMkJJTlwiLFxuICAzOTE6IFwiT0NUMkhFWFwiLFxuICAzOTI6IFwiT0NUMkRFQ1wiLFxuICAzOTM6IFwiQklOMkRFQ1wiLFxuICAzOTQ6IFwiQklOMk9DVFwiLFxuICAzOTU6IFwiQklOMkhFWFwiLFxuICAzOTY6IFwiSU1TVUJcIixcbiAgMzk3OiBcIklNRElWXCIsXG4gIDM5ODogXCJJTVBPV0VSXCIsXG4gIDM5OTogXCJJTUFCU1wiLFxuICA0MDA6IFwiSU1TUVJUXCIsXG4gIDQwMTogXCJJTUxOXCIsXG4gIDQwMjogXCJJTUxPRzJcIixcbiAgNDAzOiBcIklNTE9HMTBcIixcbiAgNDA0OiBcIklNU0lOXCIsXG4gIDQwNTogXCJJTUNPU1wiLFxuICA0MDY6IFwiSU1FWFBcIixcbiAgNDA3OiBcIklNQVJHVU1FTlRcIixcbiAgNDA4OiBcIklNQ09OSlVHQVRFXCIsXG4gIDQwOTogXCJJTUFHSU5BUllcIixcbiAgNDEwOiBcIklNUkVBTFwiLFxuICA0MTE6IFwiQ09NUExFWFwiLFxuICA0MTI6IFwiSU1TVU1cIixcbiAgNDEzOiBcIklNUFJPRFVDVFwiLFxuICA0MTQ6IFwiU0VSSUVTU1VNXCIsXG4gIDQxNTogXCJGQUNURE9VQkxFXCIsXG4gIDQxNjogXCJTUVJUUElcIixcbiAgNDE3OiBcIlFVT1RJRU5UXCIsXG4gIDQxODogXCJERUxUQVwiLFxuICA0MTk6IFwiR0VTVEVQXCIsXG4gIDQyMDogXCJJU0VWRU5cIixcbiAgNDIxOiBcIklTT0REXCIsXG4gIDQyMjogXCJNUk9VTkRcIixcbiAgNDIzOiBcIkVSRlwiLFxuICA0MjQ6IFwiRVJGQ1wiLFxuICA0MjU6IFwiQkVTU0VMSlwiLFxuICA0MjY6IFwiQkVTU0VMS1wiLFxuICA0Mjc6IFwiQkVTU0VMWVwiLFxuICA0Mjg6IFwiQkVTU0VMSVwiLFxuICA0Mjk6IFwiWElSUlwiLFxuICA0MzA6IFwiWE5QVlwiLFxuICA0MzE6IFwiUFJJQ0VNQVRcIixcbiAgNDMyOiBcIllJRUxETUFUXCIsXG4gIDQzMzogXCJJTlRSQVRFXCIsXG4gIDQzNDogXCJSRUNFSVZFRFwiLFxuICA0MzU6IFwiRElTQ1wiLFxuICA0MzY6IFwiUFJJQ0VESVNDXCIsXG4gIDQzNzogXCJZSUVMRERJU0NcIixcbiAgNDM4OiBcIlRCSUxMRVFcIixcbiAgNDM5OiBcIlRCSUxMUFJJQ0VcIixcbiAgNDQwOiBcIlRCSUxMWUlFTERcIixcbiAgNDQxOiBcIlBSSUNFXCIsXG4gIDQ0MjogXCJZSUVMRFwiLFxuICA0NDM6IFwiRE9MTEFSREVcIixcbiAgNDQ0OiBcIkRPTExBUkZSXCIsXG4gIDQ0NTogXCJOT01JTkFMXCIsXG4gIDQ0NjogXCJFRkZFQ1RcIixcbiAgNDQ3OiBcIkNVTVBSSU5DXCIsXG4gIDQ0ODogXCJDVU1JUE1UXCIsXG4gIDQ0OTogXCJFREFURVwiLFxuICA0NTA6IFwiRU9NT05USFwiLFxuICA0NTE6IFwiWUVBUkZSQUNcIixcbiAgNDUyOiBcIkNPVVBEQVlCU1wiLFxuICA0NTM6IFwiQ09VUERBWVNcIixcbiAgNDU0OiBcIkNPVVBEQVlTTkNcIixcbiAgNDU1OiBcIkNPVVBOQ0RcIixcbiAgNDU2OiBcIkNPVVBOVU1cIixcbiAgNDU3OiBcIkNPVVBQQ0RcIixcbiAgNDU4OiBcIkRVUkFUSU9OXCIsXG4gIDQ1OTogXCJNRFVSQVRJT05cIixcbiAgNDYwOiBcIk9ERExQUklDRVwiLFxuICA0NjE6IFwiT0RETFlJRUxEXCIsXG4gIDQ2MjogXCJPRERGUFJJQ0VcIixcbiAgNDYzOiBcIk9EREZZSUVMRFwiLFxuICA0NjQ6IFwiUkFOREJFVFdFRU5cIixcbiAgNDY1OiBcIldFRUtOVU1cIixcbiAgNDY2OiBcIkFNT1JERUdSQ1wiLFxuICA0Njc6IFwiQU1PUkxJTkNcIixcbiAgNDY4OiBcIkNPTlZFUlRcIixcbiAgNzI0OiBcIlNIRUVUSlNcIixcbiAgNDY5OiBcIkFDQ1JJTlRcIixcbiAgNDcwOiBcIkFDQ1JJTlRNXCIsXG4gIDQ3MTogXCJXT1JLREFZXCIsXG4gIDQ3MjogXCJORVRXT1JLREFZU1wiLFxuICA0NzM6IFwiR0NEXCIsXG4gIDQ3NDogXCJNVUxUSU5PTUlBTFwiLFxuICA0NzU6IFwiTENNXCIsXG4gIDQ3NjogXCJGVlNDSEVEVUxFXCIsXG4gIDQ3NzogXCJDVUJFS1BJTUVNQkVSXCIsXG4gIDQ3ODogXCJDVUJFU0VUXCIsXG4gIDQ3OTogXCJDVUJFU0VUQ09VTlRcIixcbiAgNDgwOiBcIklGRVJST1JcIixcbiAgNDgxOiBcIkNPVU5USUZTXCIsXG4gIDQ4MjogXCJTVU1JRlNcIixcbiAgNDgzOiBcIkFWRVJBR0VJRlwiLFxuICA0ODQ6IFwiQVZFUkFHRUlGU1wiXG59O1xudmFyIEZ0YWJBcmdjID0ge1xuICAyOiAxLFxuICAzOiAxLFxuICAxMDogMCxcbiAgMTU6IDEsXG4gIDE2OiAxLFxuICAxNzogMSxcbiAgMTg6IDEsXG4gIDE5OiAwLFxuICAyMDogMSxcbiAgMjE6IDEsXG4gIDIyOiAxLFxuICAyMzogMSxcbiAgMjQ6IDEsXG4gIDI1OiAxLFxuICAyNjogMSxcbiAgMjc6IDIsXG4gIDMwOiAyLFxuICAzMTogMyxcbiAgMzI6IDEsXG4gIDMzOiAxLFxuICAzNDogMCxcbiAgMzU6IDAsXG4gIDM4OiAxLFxuICAzOTogMixcbiAgNDA6IDMsXG4gIDQxOiAzLFxuICA0MjogMyxcbiAgNDM6IDMsXG4gIDQ0OiAzLFxuICA0NTogMyxcbiAgNDc6IDMsXG4gIDQ4OiAyLFxuICA1MzogMSxcbiAgNjE6IDMsXG4gIDYzOiAwLFxuICA2NTogMyxcbiAgNjY6IDMsXG4gIDY3OiAxLFxuICA2ODogMSxcbiAgNjk6IDEsXG4gIDcwOiAxLFxuICA3MTogMSxcbiAgNzI6IDEsXG4gIDczOiAxLFxuICA3NDogMCxcbiAgNzU6IDEsXG4gIDc2OiAxLFxuICA3NzogMSxcbiAgNzk6IDIsXG4gIDgwOiAyLFxuICA4MzogMSxcbiAgODU6IDAsXG4gIDg2OiAxLFxuICA4OTogMCxcbiAgOTA6IDEsXG4gIDk0OiAwLFxuICA5NTogMCxcbiAgOTc6IDIsXG4gIDk4OiAxLFxuICA5OTogMSxcbiAgMTAxOiAzLFxuICAxMDI6IDMsXG4gIDEwNTogMSxcbiAgMTA2OiAxLFxuICAxMDg6IDIsXG4gIDExMTogMSxcbiAgMTEyOiAxLFxuICAxMTM6IDEsXG4gIDExNDogMSxcbiAgMTE3OiAyLFxuICAxMTg6IDEsXG4gIDExOTogNCxcbiAgMTIxOiAxLFxuICAxMjY6IDEsXG4gIDEyNzogMSxcbiAgMTI4OiAxLFxuICAxMjk6IDEsXG4gIDEzMDogMSxcbiAgMTMxOiAxLFxuICAxMzM6IDEsXG4gIDEzNDogMSxcbiAgMTM1OiAxLFxuICAxMzY6IDIsXG4gIDEzNzogMixcbiAgMTM4OiAyLFxuICAxNDA6IDEsXG4gIDE0MTogMSxcbiAgMTQyOiAzLFxuICAxNDM6IDQsXG4gIDE0NDogNCxcbiAgMTYxOiAxLFxuICAxNjI6IDEsXG4gIDE2MzogMSxcbiAgMTY0OiAxLFxuICAxNjU6IDIsXG4gIDE3MjogMSxcbiAgMTc1OiAyLFxuICAxNzY6IDIsXG4gIDE3NzogMyxcbiAgMTc4OiAyLFxuICAxNzk6IDEsXG4gIDE4NDogMSxcbiAgMTg2OiAxLFxuICAxODk6IDMsXG4gIDE5MDogMSxcbiAgMTk1OiAzLFxuICAxOTY6IDMsXG4gIDE5NzogMSxcbiAgMTk4OiAxLFxuICAxOTk6IDMsXG4gIDIwMTogMSxcbiAgMjA3OiA0LFxuICAyMTA6IDMsXG4gIDIxMTogMSxcbiAgMjEyOiAyLFxuICAyMTM6IDIsXG4gIDIxNDogMSxcbiAgMjE1OiAxLFxuICAyMjU6IDAsXG4gIDIyOTogMSxcbiAgMjMwOiAxLFxuICAyMzE6IDEsXG4gIDIzMjogMSxcbiAgMjMzOiAxLFxuICAyMzQ6IDEsXG4gIDIzNTogMyxcbiAgMjQ0OiAxLFxuICAyNDc6IDQsXG4gIDI1MjogMixcbiAgMjU3OiAxLFxuICAyNjE6IDEsXG4gIDI3MTogMSxcbiAgMjczOiA0LFxuICAyNzQ6IDIsXG4gIDI3NTogMixcbiAgMjc2OiAyLFxuICAyNzc6IDMsXG4gIDI3ODogMyxcbiAgMjc5OiAxLFxuICAyODA6IDMsXG4gIDI4MTogMyxcbiAgMjgyOiAzLFxuICAyODM6IDEsXG4gIDI4NDogMSxcbiAgMjg1OiAyLFxuICAyODY6IDQsXG4gIDI4NzogMyxcbiAgMjg4OiAyLFxuICAyODk6IDQsXG4gIDI5MDogMyxcbiAgMjkxOiAzLFxuICAyOTI6IDMsXG4gIDI5MzogNCxcbiAgMjk0OiAxLFxuICAyOTU6IDMsXG4gIDI5NjogMSxcbiAgMjk3OiAzLFxuICAyOTg6IDEsXG4gIDI5OTogMixcbiAgMzAwOiAzLFxuICAzMDE6IDMsXG4gIDMwMjogNCxcbiAgMzAzOiAyLFxuICAzMDQ6IDIsXG4gIDMwNTogMixcbiAgMzA2OiAyLFxuICAzMDc6IDIsXG4gIDMwODogMixcbiAgMzA5OiAzLFxuICAzMTA6IDIsXG4gIDMxMTogMixcbiAgMzEyOiAyLFxuICAzMTM6IDIsXG4gIDMxNDogMixcbiAgMzE1OiAyLFxuICAzMTY6IDQsXG4gIDMyNTogMixcbiAgMzI2OiAyLFxuICAzMjc6IDIsXG4gIDMyODogMixcbiAgMzMxOiAyLFxuICAzMzI6IDIsXG4gIDMzNzogMixcbiAgMzQyOiAxLFxuICAzNDM6IDEsXG4gIDM0NjogMixcbiAgMzQ3OiAxLFxuICAzNTA6IDQsXG4gIDM1MTogMyxcbiAgMzUyOiAxLFxuICAzNTM6IDIsXG4gIDM2MDogMSxcbiAgMzY4OiAxLFxuICAzNjk6IDEsXG4gIDM3MDogMSxcbiAgMzcxOiAxLFxuICAzNzI6IDEsXG4gIDM3MzogMSxcbiAgMzc0OiAxLFxuICAzNzU6IDEsXG4gIDM3NjogMSxcbiAgMzc3OiAxLFxuICAzNzg6IDEsXG4gIDM4MjogMyxcbiAgMzg1OiAxLFxuICAzOTI6IDEsXG4gIDM5MzogMSxcbiAgMzk2OiAyLFxuICAzOTc6IDIsXG4gIDM5ODogMixcbiAgMzk5OiAxLFxuICA0MDA6IDEsXG4gIDQwMTogMSxcbiAgNDAyOiAxLFxuICA0MDM6IDEsXG4gIDQwNDogMSxcbiAgNDA1OiAxLFxuICA0MDY6IDEsXG4gIDQwNzogMSxcbiAgNDA4OiAxLFxuICA0MDk6IDEsXG4gIDQxMDogMSxcbiAgNDE0OiA0LFxuICA0MTU6IDEsXG4gIDQxNjogMSxcbiAgNDE3OiAyLFxuICA0MjA6IDEsXG4gIDQyMTogMSxcbiAgNDIyOiAyLFxuICA0MjQ6IDEsXG4gIDQyNTogMixcbiAgNDI2OiAyLFxuICA0Mjc6IDIsXG4gIDQyODogMixcbiAgNDMwOiAzLFxuICA0Mzg6IDMsXG4gIDQzOTogMyxcbiAgNDQwOiAzLFxuICA0NDM6IDIsXG4gIDQ0NDogMixcbiAgNDQ1OiAyLFxuICA0NDY6IDIsXG4gIDQ0NzogNixcbiAgNDQ4OiA2LFxuICA0NDk6IDIsXG4gIDQ1MDogMixcbiAgNDY0OiAyLFxuICA0Njg6IDMsXG4gIDQ3NjogMixcbiAgNDc5OiAxLFxuICA0ODA6IDIsXG4gIDY1NTM1OiAwXG59O1xuLyogUGFydCAzIFRPRE86IGFjdHVhbGx5IHBhcnNlIGZvcm11bGFlICovXG5mdW5jdGlvbiBvZHNfdG9fY3NmX2Zvcm11bGEoZi8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0aWYoZi5zbGljZSgwLDMpID09IFwib2Y6XCIpIGYgPSBmLnNsaWNlKDMpO1xuXHQvKiA1LjIgQmFzaWMgRXhwcmVzc2lvbnMgKi9cblx0aWYoZi5jaGFyQ29kZUF0KDApID09IDYxKSB7XG5cdFx0ZiA9IGYuc2xpY2UoMSk7XG5cdFx0aWYoZi5jaGFyQ29kZUF0KDApID09IDYxKSBmID0gZi5zbGljZSgxKTtcblx0fVxuXHRmID0gZi5yZXBsYWNlKC9DT01cXC5NSUNST1NPRlRcXC4vZywgXCJcIik7XG5cdC8qIFBhcnQgMyBTZWN0aW9uIDUuOCBSZWZlcmVuY2VzICovXG5cdGYgPSBmLnJlcGxhY2UoL1xcWygoPzpcXC5bQS1aXStbMC05XSspKD86OlxcLltBLVpdK1swLTldKyk/KVxcXS9nLCBmdW5jdGlvbigkJCwgJDEpIHsgcmV0dXJuICQxLnJlcGxhY2UoL1xcLi9nLFwiXCIpOyB9KTtcblx0LyogVE9ETzogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhpcyAqL1xuXHRmID0gZi5yZXBsYWNlKC9cXFsuKCNbQS1aXSpbPyFdKVxcXS9nLCBcIiQxXCIpO1xuXHRyZXR1cm4gZi5yZXBsYWNlKC9bO35dL2csXCIsXCIpLnJlcGxhY2UoL1xcfC9nLFwiO1wiKTtcbn1cblxuZnVuY3Rpb24gY3NmX3RvX29kc19mb3JtdWxhKGYvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvID0gXCJvZjo9XCIgKyBmLnJlcGxhY2UoY3JlZnJlZ2V4LCBcIiQxWy4kMiQzJDQkNV1cIikucmVwbGFjZSgvXFxdOlxcWy9nLFwiOlwiKTtcblx0LyogVE9ETzogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhpcyAqL1xuXHRyZXR1cm4gby5yZXBsYWNlKC87L2csIFwifFwiKS5yZXBsYWNlKC8sL2csXCI7XCIpO1xufVxuXG5mdW5jdGlvbiBvZHNfdG9fY3NmXzNEKHIvKjpzdHJpbmcqLykvKjpbc3RyaW5nLCBzdHJpbmddKi8ge1xuXHR2YXIgYSA9IHIuc3BsaXQoXCI6XCIpO1xuXHR2YXIgcyA9IGFbMF0uc3BsaXQoXCIuXCIpWzBdO1xuXHRyZXR1cm4gW3MsIGFbMF0uc3BsaXQoXCIuXCIpWzFdICsgKGEubGVuZ3RoID4gMSA/IChcIjpcIiArIChhWzFdLnNwbGl0KFwiLlwiKVsxXSB8fCBhWzFdLnNwbGl0KFwiLlwiKVswXSkpIDogXCJcIildO1xufVxuXG5mdW5jdGlvbiBjc2ZfdG9fb2RzXzNEKHIvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdHJldHVybiByLnJlcGxhY2UoL1xcLi8sXCIhXCIpO1xufVxuXG52YXIgc3RycyA9IHt9OyAvLyBzaGFyZWQgc3RyaW5nc1xudmFyIF9zc2ZvcHRzID0ge307IC8vIHNwcmVhZHNoZWV0IGZvcm1hdHRpbmcgb3B0aW9uc1xuXG5cbi8qZ2xvYmFsIE1hcCAqL1xudmFyIGJyb3dzZXJfaGFzX01hcCA9IHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnO1xuXG5mdW5jdGlvbiBnZXRfc3N0X2lkKHNzdC8qOlNTVCovLCBzdHIvKjpzdHJpbmcqLywgcmV2KS8qOm51bWJlciovIHtcblx0dmFyIGkgPSAwLCBsZW4gPSBzc3QubGVuZ3RoO1xuXHRpZihyZXYpIHtcblx0XHRpZihicm93c2VyX2hhc19NYXAgPyByZXYuaGFzKHN0cikgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmV2LCBzdHIpKSB7XG5cdFx0XHR2YXIgcmV2YXJyID0gYnJvd3Nlcl9oYXNfTWFwID8gcmV2LmdldChzdHIpIDogcmV2W3N0cl07XG5cdFx0XHRmb3IoOyBpIDwgcmV2YXJyLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdGlmKHNzdFtyZXZhcnJbaV1dLnQgPT09IHN0cikgeyBzc3QuQ291bnQgKys7IHJldHVybiByZXZhcnJbaV07IH1cblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBmb3IoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRpZihzc3RbaV0udCA9PT0gc3RyKSB7IHNzdC5Db3VudCArKzsgcmV0dXJuIGk7IH1cblx0fVxuXHRzc3RbbGVuXSA9ICh7dDpzdHJ9Lyo6YW55Ki8pOyBzc3QuQ291bnQgKys7IHNzdC5VbmlxdWUgKys7XG5cdGlmKHJldikge1xuXHRcdGlmKGJyb3dzZXJfaGFzX01hcCkge1xuXHRcdFx0aWYoIXJldi5oYXMoc3RyKSkgcmV2LnNldChzdHIsIFtdKTtcblx0XHRcdHJldi5nZXQoc3RyKS5wdXNoKGxlbik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmV2LCBzdHIpKSByZXZbc3RyXSA9IFtdO1xuXHRcdFx0cmV2W3N0cl0ucHVzaChsZW4pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbGVuO1xufVxuXG5mdW5jdGlvbiBjb2xfb2JqX3coQy8qOm51bWJlciovLCBjb2wpIHtcblx0dmFyIHAgPSAoe21pbjpDKzEsbWF4OkMrMX0vKjphbnkqLyk7XG5cdC8qIHdjaCAoY2hhcnMpLCB3cHggKHBpeGVscykgKi9cblx0dmFyIHdjaCA9IC0xO1xuXHRpZihjb2wuTURXKSBNRFcgPSBjb2wuTURXO1xuXHRpZihjb2wud2lkdGggIT0gbnVsbCkgcC5jdXN0b21XaWR0aCA9IDE7XG5cdGVsc2UgaWYoY29sLndweCAhPSBudWxsKSB3Y2ggPSBweDJjaGFyKGNvbC53cHgpO1xuXHRlbHNlIGlmKGNvbC53Y2ggIT0gbnVsbCkgd2NoID0gY29sLndjaDtcblx0aWYod2NoID4gLTEpIHsgcC53aWR0aCA9IGNoYXIyd2lkdGgod2NoKTsgcC5jdXN0b21XaWR0aCA9IDE7IH1cblx0ZWxzZSBpZihjb2wud2lkdGggIT0gbnVsbCkgcC53aWR0aCA9IGNvbC53aWR0aDtcblx0aWYoY29sLmhpZGRlbikgcC5oaWRkZW4gPSB0cnVlO1xuXHRpZihjb2wubGV2ZWwgIT0gbnVsbCkgeyBwLm91dGxpbmVMZXZlbCA9IHAubGV2ZWwgPSBjb2wubGV2ZWw7IH1cblx0cmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRfbWFyZ2lucyhtYXJnaW5zLyo6TWFyZ2lucyovLCBtb2RlLyo6P3N0cmluZyovKSB7XG5cdGlmKCFtYXJnaW5zKSByZXR1cm47XG5cdHZhciBkZWZzID0gWzAuNywgMC43LCAwLjc1LCAwLjc1LCAwLjMsIDAuM107XG5cdGlmKG1vZGUgPT0gJ3hsbWwnKSBkZWZzID0gWzEsIDEsIDEsIDEsIDAuNSwgMC41XTtcblx0aWYobWFyZ2lucy5sZWZ0ICAgPT0gbnVsbCkgbWFyZ2lucy5sZWZ0ICAgPSBkZWZzWzBdO1xuXHRpZihtYXJnaW5zLnJpZ2h0ICA9PSBudWxsKSBtYXJnaW5zLnJpZ2h0ICA9IGRlZnNbMV07XG5cdGlmKG1hcmdpbnMudG9wICAgID09IG51bGwpIG1hcmdpbnMudG9wICAgID0gZGVmc1syXTtcblx0aWYobWFyZ2lucy5ib3R0b20gPT0gbnVsbCkgbWFyZ2lucy5ib3R0b20gPSBkZWZzWzNdO1xuXHRpZihtYXJnaW5zLmhlYWRlciA9PSBudWxsKSBtYXJnaW5zLmhlYWRlciA9IGRlZnNbNF07XG5cdGlmKG1hcmdpbnMuZm9vdGVyID09IG51bGwpIG1hcmdpbnMuZm9vdGVyID0gZGVmc1s1XTtcbn1cblxuZnVuY3Rpb24gZ2V0X2NlbGxfc3R5bGUoc3R5bGVzLyo6QXJyYXk8YW55PiovLCBjZWxsLyo6Q2VsbCovLCBvcHRzKSB7XG5cdHZhciB6ID0gb3B0cy5yZXZzc2ZbY2VsbC56ICE9IG51bGwgPyBjZWxsLnogOiBcIkdlbmVyYWxcIl07XG5cdHZhciBpID0gMHgzYywgbGVuID0gc3R5bGVzLmxlbmd0aDtcblx0aWYoeiA9PSBudWxsICYmIG9wdHMuc3NmKSB7XG5cdFx0Zm9yKDsgaSA8IDB4MTg4OyArK2kpIGlmKG9wdHMuc3NmW2ldID09IG51bGwpIHtcblx0XHRcdFNTRl9sb2FkKGNlbGwueiwgaSk7XG5cdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0b3B0cy5zc2ZbaV0gPSBjZWxsLno7XG5cdFx0XHRvcHRzLnJldnNzZltjZWxsLnpdID0geiA9IGk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0Zm9yKGkgPSAwOyBpICE9IGxlbjsgKytpKSBpZihzdHlsZXNbaV0ubnVtRm10SWQgPT09IHopIHJldHVybiBpO1xuXHRzdHlsZXNbbGVuXSA9IHtcblx0XHRudW1GbXRJZDp6LFxuXHRcdGZvbnRJZDowLFxuXHRcdGZpbGxJZDowLFxuXHRcdGJvcmRlcklkOjAsXG5cdFx0eGZJZDowLFxuXHRcdGFwcGx5TnVtYmVyRm9ybWF0OjFcblx0fTtcblx0cmV0dXJuIGxlbjtcbn1cblxuZnVuY3Rpb24gc2FmZV9mb3JtYXQocC8qOkNlbGwqLywgZm10aWQvKjpudW1iZXIqLywgZmlsbGlkLyo6P251bWJlciovLCBvcHRzLCB0aGVtZXMsIHN0eWxlcykge1xuXHR0cnkge1xuXHRcdGlmKG9wdHMuY2VsbE5GKSBwLnogPSB0YWJsZV9mbXRbZm10aWRdO1xuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cblx0aWYocC50ID09PSAneicgJiYgIW9wdHMuY2VsbFN0eWxlcykgcmV0dXJuO1xuXHRpZihwLnQgPT09ICdkJyAmJiB0eXBlb2YgcC52ID09PSAnc3RyaW5nJykgcC52ID0gcGFyc2VEYXRlKHAudik7XG5cdGlmKCghb3B0cyB8fCBvcHRzLmNlbGxUZXh0ICE9PSBmYWxzZSkgJiYgcC50ICE9PSAneicpIHRyeSB7XG5cdFx0aWYodGFibGVfZm10W2ZtdGlkXSA9PSBudWxsKSBTU0ZfbG9hZChTU0ZJbXBsaWNpdFtmbXRpZF0gfHwgXCJHZW5lcmFsXCIsIGZtdGlkKTtcblx0XHRpZihwLnQgPT09ICdlJykgcC53ID0gcC53IHx8IEJFcnJbcC52XTtcblx0XHRlbHNlIGlmKGZtdGlkID09PSAwKSB7XG5cdFx0XHRpZihwLnQgPT09ICduJykge1xuXHRcdFx0XHRpZigocC52fDApID09PSBwLnYpIHAudyA9IHAudi50b1N0cmluZygxMCk7XG5cdFx0XHRcdGVsc2UgcC53ID0gU1NGX2dlbmVyYWxfbnVtKHAudik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKHAudCA9PT0gJ2QnKSB7XG5cdFx0XHRcdHZhciBkZCA9IGRhdGVudW0ocC52KTtcblx0XHRcdFx0aWYoKGRkfDApID09PSBkZCkgcC53ID0gZGQudG9TdHJpbmcoMTApO1xuXHRcdFx0XHRlbHNlIHAudyA9IFNTRl9nZW5lcmFsX251bShkZCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKHAudiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gXCJcIjtcblx0XHRcdGVsc2UgcC53ID0gU1NGX2dlbmVyYWwocC52LF9zc2ZvcHRzKTtcblx0XHR9XG5cdFx0ZWxzZSBpZihwLnQgPT09ICdkJykgcC53ID0gU1NGX2Zvcm1hdChmbXRpZCxkYXRlbnVtKHAudiksX3NzZm9wdHMpO1xuXHRcdGVsc2UgcC53ID0gU1NGX2Zvcm1hdChmbXRpZCxwLnYsX3NzZm9wdHMpO1xuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cblx0aWYoIW9wdHMuY2VsbFN0eWxlcykgcmV0dXJuO1xuXHRpZihmaWxsaWQgIT0gbnVsbCkgdHJ5IHtcblx0XHRwLnMgPSBzdHlsZXMuRmlsbHNbZmlsbGlkXTtcblx0XHRpZiAocC5zLmZnQ29sb3IgJiYgcC5zLmZnQ29sb3IudGhlbWUgJiYgIXAucy5mZ0NvbG9yLnJnYikge1xuXHRcdFx0cC5zLmZnQ29sb3IucmdiID0gcmdiX3RpbnQodGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lW3Aucy5mZ0NvbG9yLnRoZW1lXS5yZ2IsIHAucy5mZ0NvbG9yLnRpbnQgfHwgMCk7XG5cdFx0XHRpZihvcHRzLldURikgcC5zLmZnQ29sb3IucmF3X3JnYiA9IHRoZW1lcy50aGVtZUVsZW1lbnRzLmNsclNjaGVtZVtwLnMuZmdDb2xvci50aGVtZV0ucmdiO1xuXHRcdH1cblx0XHRpZiAocC5zLmJnQ29sb3IgJiYgcC5zLmJnQ29sb3IudGhlbWUpIHtcblx0XHRcdHAucy5iZ0NvbG9yLnJnYiA9IHJnYl90aW50KHRoZW1lcy50aGVtZUVsZW1lbnRzLmNsclNjaGVtZVtwLnMuYmdDb2xvci50aGVtZV0ucmdiLCBwLnMuYmdDb2xvci50aW50IHx8IDApO1xuXHRcdFx0aWYob3B0cy5XVEYpIHAucy5iZ0NvbG9yLnJhd19yZ2IgPSB0aGVtZXMudGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbcC5zLmJnQ29sb3IudGhlbWVdLnJnYjtcblx0XHR9XG5cdH0gY2F0Y2goZSkgeyBpZihvcHRzLldURiAmJiBzdHlsZXMuRmlsbHMpIHRocm93IGU7IH1cbn1cblxuZnVuY3Rpb24gY2hlY2tfd3Mod3MvKjpXb3Jrc2hlZXQqLywgc25hbWUvKjpzdHJpbmcqLywgaS8qOm51bWJlciovKSB7XG5cdGlmKHdzICYmIHdzWychcmVmJ10pIHtcblx0XHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0XHRpZihyYW5nZS5lLmMgPCByYW5nZS5zLmMgfHwgcmFuZ2UuZS5yIDwgcmFuZ2Uucy5yKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgcmFuZ2UgKFwiICsgaSArIFwiKTogXCIgKyB3c1snIXJlZiddKTtcblx0fVxufVxuZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX2RpbSh3cy8qOldvcmtzaGVldCovLCBzLyo6c3RyaW5nKi8pIHtcblx0dmFyIGQgPSBzYWZlX2RlY29kZV9yYW5nZShzKTtcblx0aWYoZC5zLnI8PWQuZS5yICYmIGQucy5jPD1kLmUuYyAmJiBkLnMucj49MCAmJiBkLnMuYz49MCkgd3NbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKGQpO1xufVxudmFyIG1lcmdlY3JlZ2V4ID0gLzwoPzpcXHc6KT9tZXJnZUNlbGwgcmVmPVwiW0EtWjAtOTpdK1wiXFxzKltcXC9dPz4vZztcbnZhciBzaGVldGRhdGFyZWdleCA9IC88KD86XFx3KzopP3NoZWV0RGF0YVtePl0qPihbXFxzXFxTXSopPFxcLyg/Olxcdys6KT9zaGVldERhdGE+LztcbnZhciBobGlua3JlZ2V4ID0gLzwoPzpcXHc6KT9oeXBlcmxpbmsgW14+XSo+L21nO1xudmFyIGRpbXJlZ2V4ID0gL1wiKFxcdyo6XFx3KilcIi87XG52YXIgY29scmVnZXggPSAvPCg/OlxcdzopP2NvbFxcYltePl0qW1xcL10/Pi9nO1xudmFyIGFmcmVnZXggPSAvPCg/OlxcdzopP2F1dG9GaWx0ZXJbXj5dKihbXFwvXXw+KFtcXHNcXFNdKik8XFwvKD86XFx3Oik/YXV0b0ZpbHRlcik+L2c7XG52YXIgbWFyZ2lucmVnZXg9IC88KD86XFx3Oik/cGFnZU1hcmdpbnNbXj5dKlxcLz4vZztcbnZhciBzaGVldHBycmVnZXggPSAvPCg/OlxcdzopP3NoZWV0UHJcXGIoPzpbXj5hLXpdW14+XSopP1xcLz4vO1xudmFyIHNoZWV0cHJyZWdleDI9IC88KD86XFx3Oik/c2hlZXRQcltePl0qKD86W1xcL118PihbXFxzXFxTXSopPFxcLyg/OlxcdzopP3NoZWV0UHIpPi87XG52YXIgc3ZzcmVnZXggPSAvPCg/OlxcdzopP3NoZWV0Vmlld3NbXj5dKig/OltcXC9dfD4oW1xcc1xcU10qKTxcXC8oPzpcXHc6KT9zaGVldFZpZXdzKT4vO1xuXG4vKiAxOC4zIFdvcmtzaGVldHMgKi9cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbChkYXRhLyo6P3N0cmluZyovLCBvcHRzLCBpZHgvKjpudW1iZXIqLywgcmVscywgd2IvKjpXQldCUHJvcHMqLywgdGhlbWVzLCBzdHlsZXMpLyo6V29ya3NoZWV0Ki8ge1xuXHRpZighZGF0YSkgcmV0dXJuIGRhdGE7XG5cdGlmKCFyZWxzKSByZWxzID0geychaWQnOnt9fTtcblx0aWYoREVOU0UgIT0gbnVsbCAmJiBvcHRzLmRlbnNlID09IG51bGwpIG9wdHMuZGVuc2UgPSBERU5TRTtcblxuXHQvKiAxOC4zLjEuOTkgd29ya3NoZWV0IENUX1dvcmtzaGVldCAqL1xuXHR2YXIgcyA9IG9wdHMuZGVuc2UgPyAoW10vKjphbnkqLykgOiAoe30vKjphbnkqLyk7XG5cdHZhciByZWZndWVzcy8qOlJhbmdlKi8gPSAoe3M6IHtyOjIwMDAwMDAsIGM6MjAwMDAwMH0sIGU6IHtyOjAsIGM6MH0gfS8qOmFueSovKTtcblxuXHR2YXIgZGF0YTEgPSBcIlwiLCBkYXRhMiA9IFwiXCI7XG5cdHZhciBtdGNoLyo6P2FueSovID0gZGF0YS5tYXRjaChzaGVldGRhdGFyZWdleCk7XG5cdGlmKG10Y2gpIHtcblx0XHRkYXRhMSA9IGRhdGEuc2xpY2UoMCwgbXRjaC5pbmRleCk7XG5cdFx0ZGF0YTIgPSBkYXRhLnNsaWNlKG10Y2guaW5kZXggKyBtdGNoWzBdLmxlbmd0aCk7XG5cdH0gZWxzZSBkYXRhMSA9IGRhdGEyID0gZGF0YTtcblxuXHQvKiAxOC4zLjEuODIgc2hlZXRQciBDVF9TaGVldFByICovXG5cdHZhciBzaGVldFByID0gZGF0YTEubWF0Y2goc2hlZXRwcnJlZ2V4KTtcblx0aWYoc2hlZXRQcikgcGFyc2Vfd3NfeG1sX3NoZWV0cHIoc2hlZXRQclswXSwgcywgd2IsIGlkeCk7XG5cdGVsc2UgaWYoKHNoZWV0UHIgPSBkYXRhMS5tYXRjaChzaGVldHBycmVnZXgyKSkpIHBhcnNlX3dzX3htbF9zaGVldHByMihzaGVldFByWzBdLCBzaGVldFByWzFdfHxcIlwiLCBzLCB3YiwgaWR4LCBzdHlsZXMsIHRoZW1lcyk7XG5cblx0LyogMTguMy4xLjM1IGRpbWVuc2lvbiBDVF9TaGVldERpbWVuc2lvbiAqL1xuXHR2YXIgcmlkeCA9IChkYXRhMS5tYXRjaCgvPCg/Olxcdyo6KT9kaW1lbnNpb24vKXx8e2luZGV4Oi0xfSkuaW5kZXg7XG5cdGlmKHJpZHggPiAwKSB7XG5cdFx0dmFyIHJlZiA9IGRhdGExLnNsaWNlKHJpZHgscmlkeCs1MCkubWF0Y2goZGltcmVnZXgpO1xuXHRcdGlmKHJlZikgcGFyc2Vfd3NfeG1sX2RpbShzLCByZWZbMV0pO1xuXHR9XG5cblx0LyogMTguMy4xLjg4IHNoZWV0Vmlld3MgQ1RfU2hlZXRWaWV3cyAqL1xuXHR2YXIgc3ZzID0gZGF0YTEubWF0Y2goc3ZzcmVnZXgpO1xuXHRpZihzdnMgJiYgc3ZzWzFdKSBwYXJzZV93c194bWxfc2hlZXR2aWV3cyhzdnNbMV0sIHdiKTtcblxuXHQvKiAxOC4zLjEuMTcgY29scyBDVF9Db2xzICovXG5cdHZhciBjb2x1bW5zLyo6QXJyYXk8Q29sSW5mbz4qLyA9IFtdO1xuXHRpZihvcHRzLmNlbGxTdHlsZXMpIHtcblx0XHQvKiAxOC4zLjEuMTMgY29sIENUX0NvbCAqL1xuXHRcdHZhciBjb2xzID0gZGF0YTEubWF0Y2goY29scmVnZXgpO1xuXHRcdGlmKGNvbHMpIHBhcnNlX3dzX3htbF9jb2xzKGNvbHVtbnMsIGNvbHMpO1xuXHR9XG5cblx0LyogMTguMy4xLjgwIHNoZWV0RGF0YSBDVF9TaGVldERhdGEgPyAqL1xuXHRpZihtdGNoKSBwYXJzZV93c194bWxfZGF0YShtdGNoWzFdLCBzLCBvcHRzLCByZWZndWVzcywgdGhlbWVzLCBzdHlsZXMpO1xuXG5cdC8qIDE4LjMuMS4yICBhdXRvRmlsdGVyIENUX0F1dG9GaWx0ZXIgKi9cblx0dmFyIGFmaWx0ZXIgPSBkYXRhMi5tYXRjaChhZnJlZ2V4KTtcblx0aWYoYWZpbHRlcikgc1snIWF1dG9maWx0ZXInXSA9IHBhcnNlX3dzX3htbF9hdXRvZmlsdGVyKGFmaWx0ZXJbMF0pO1xuXG5cdC8qIDE4LjMuMS41NSBtZXJnZUNlbGxzIENUX01lcmdlQ2VsbHMgKi9cblx0dmFyIG1lcmdlcy8qOkFycmF5PFJhbmdlPiovID0gW107XG5cdHZhciBfbWVyZ2UgPSBkYXRhMi5tYXRjaChtZXJnZWNyZWdleCk7XG5cdGlmKF9tZXJnZSkgZm9yKHJpZHggPSAwOyByaWR4ICE9IF9tZXJnZS5sZW5ndGg7ICsrcmlkeClcblx0XHRtZXJnZXNbcmlkeF0gPSBzYWZlX2RlY29kZV9yYW5nZShfbWVyZ2VbcmlkeF0uc2xpY2UoX21lcmdlW3JpZHhdLmluZGV4T2YoXCJcXFwiXCIpKzEpKTtcblxuXHQvKiAxOC4zLjEuNDggaHlwZXJsaW5rcyBDVF9IeXBlcmxpbmtzICovXG5cdHZhciBobGluayA9IGRhdGEyLm1hdGNoKGhsaW5rcmVnZXgpO1xuXHRpZihobGluaykgcGFyc2Vfd3NfeG1sX2hsaW5rcyhzLCBobGluaywgcmVscyk7XG5cblx0LyogMTguMy4xLjYyIHBhZ2VNYXJnaW5zIENUX1BhZ2VNYXJnaW5zICovXG5cdHZhciBtYXJnaW5zID0gZGF0YTIubWF0Y2gobWFyZ2lucmVnZXgpO1xuXHRpZihtYXJnaW5zKSBzWychbWFyZ2lucyddID0gcGFyc2Vfd3NfeG1sX21hcmdpbnMocGFyc2V4bWx0YWcobWFyZ2luc1swXSkpO1xuXG5cdGlmKCFzW1wiIXJlZlwiXSAmJiByZWZndWVzcy5lLmMgPj0gcmVmZ3Vlc3Mucy5jICYmIHJlZmd1ZXNzLmUuciA+PSByZWZndWVzcy5zLnIpIHNbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKHJlZmd1ZXNzKTtcblx0aWYob3B0cy5zaGVldFJvd3MgPiAwICYmIHNbXCIhcmVmXCJdKSB7XG5cdFx0dmFyIHRtcHJlZiA9IHNhZmVfZGVjb2RlX3JhbmdlKHNbXCIhcmVmXCJdKTtcblx0XHRpZihvcHRzLnNoZWV0Um93cyA8PSArdG1wcmVmLmUucikge1xuXHRcdFx0dG1wcmVmLmUuciA9IG9wdHMuc2hlZXRSb3dzIC0gMTtcblx0XHRcdGlmKHRtcHJlZi5lLnIgPiByZWZndWVzcy5lLnIpIHRtcHJlZi5lLnIgPSByZWZndWVzcy5lLnI7XG5cdFx0XHRpZih0bXByZWYuZS5yIDwgdG1wcmVmLnMucikgdG1wcmVmLnMuciA9IHRtcHJlZi5lLnI7XG5cdFx0XHRpZih0bXByZWYuZS5jID4gcmVmZ3Vlc3MuZS5jKSB0bXByZWYuZS5jID0gcmVmZ3Vlc3MuZS5jO1xuXHRcdFx0aWYodG1wcmVmLmUuYyA8IHRtcHJlZi5zLmMpIHRtcHJlZi5zLmMgPSB0bXByZWYuZS5jO1xuXHRcdFx0c1tcIiFmdWxscmVmXCJdID0gc1tcIiFyZWZcIl07XG5cdFx0XHRzW1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZSh0bXByZWYpO1xuXHRcdH1cblx0fVxuXHRpZihjb2x1bW5zLmxlbmd0aCA+IDApIHNbXCIhY29sc1wiXSA9IGNvbHVtbnM7XG5cdGlmKG1lcmdlcy5sZW5ndGggPiAwKSBzW1wiIW1lcmdlc1wiXSA9IG1lcmdlcztcblx0cmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9tZXJnZXMobWVyZ2VzLyo6QXJyYXk8UmFuZ2U+Ki8pLyo6c3RyaW5nKi8ge1xuXHRpZihtZXJnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblx0dmFyIG8gPSAnPG1lcmdlQ2VsbHMgY291bnQ9XCInICsgbWVyZ2VzLmxlbmd0aCArICdcIj4nO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IG1lcmdlcy5sZW5ndGg7ICsraSkgbyArPSAnPG1lcmdlQ2VsbCByZWY9XCInICsgZW5jb2RlX3JhbmdlKG1lcmdlc1tpXSkgKyAnXCIvPic7XG5cdHJldHVybiBvICsgJzwvbWVyZ2VDZWxscz4nO1xufVxuXG4vKiAxOC4zLjEuODItMyBzaGVldFByIENUX0NoYXJ0c2hlZXRQciAvIENUX1NoZWV0UHIgKi9cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9zaGVldHByKHNoZWV0UHIvKjpzdHJpbmcqLywgcywgd2IvKjpXQldCUHJvcHMqLywgaWR4Lyo6bnVtYmVyKi8pIHtcblx0dmFyIGRhdGEgPSBwYXJzZXhtbHRhZyhzaGVldFByKTtcblx0aWYoIXdiLlNoZWV0c1tpZHhdKSB3Yi5TaGVldHNbaWR4XSA9IHt9O1xuXHRpZihkYXRhLmNvZGVOYW1lKSB3Yi5TaGVldHNbaWR4XS5Db2RlTmFtZSA9IHVuZXNjYXBleG1sKHV0ZjhyZWFkKGRhdGEuY29kZU5hbWUpKTtcbn1cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9zaGVldHByMihzaGVldFByLyo6c3RyaW5nKi8sIGJvZHkvKjpzdHJpbmcqLywgcywgd2IvKjpXQldCUHJvcHMqLywgaWR4Lyo6bnVtYmVyKi8pIHtcblx0cGFyc2Vfd3NfeG1sX3NoZWV0cHIoc2hlZXRQci5zbGljZSgwLCBzaGVldFByLmluZGV4T2YoXCI+XCIpKSwgcywgd2IsIGlkeCk7XG59XG5mdW5jdGlvbiB3cml0ZV93c194bWxfc2hlZXRwcih3cywgd2IsIGlkeCwgb3B0cywgbykge1xuXHR2YXIgbmVlZGVkID0gZmFsc2U7XG5cdHZhciBwcm9wcyA9IHt9LCBwYXlsb2FkID0gbnVsbDtcblx0aWYob3B0cy5ib29rVHlwZSAhPT0gJ3hsc3gnICYmIHdiLnZiYXJhdykge1xuXHRcdHZhciBjbmFtZSA9IHdiLlNoZWV0TmFtZXNbaWR4XTtcblx0XHR0cnkgeyBpZih3Yi5Xb3JrYm9vaykgY25hbWUgPSB3Yi5Xb3JrYm9vay5TaGVldHNbaWR4XS5Db2RlTmFtZSB8fCBjbmFtZTsgfSBjYXRjaChlKSB7fVxuXHRcdG5lZWRlZCA9IHRydWU7XG5cdFx0cHJvcHMuY29kZU5hbWUgPSB1dGY4d3JpdGUoZXNjYXBleG1sKGNuYW1lKSk7XG5cdH1cblxuXHRpZih3cyAmJiB3c1tcIiFvdXRsaW5lXCJdKSB7XG5cdFx0dmFyIG91dGxpbmVwcm9wcyA9IHtzdW1tYXJ5QmVsb3c6MSwgc3VtbWFyeVJpZ2h0OjF9O1xuXHRcdGlmKHdzW1wiIW91dGxpbmVcIl0uYWJvdmUpIG91dGxpbmVwcm9wcy5zdW1tYXJ5QmVsb3cgPSAwO1xuXHRcdGlmKHdzW1wiIW91dGxpbmVcIl0ubGVmdCkgb3V0bGluZXByb3BzLnN1bW1hcnlSaWdodCA9IDA7XG5cdFx0cGF5bG9hZCA9IChwYXlsb2FkfHxcIlwiKSArIHdyaXRleHRhZygnb3V0bGluZVByJywgbnVsbCwgb3V0bGluZXByb3BzKTtcblx0fVxuXG5cdGlmKCFuZWVkZWQgJiYgIXBheWxvYWQpIHJldHVybjtcblx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdzaGVldFByJywgcGF5bG9hZCwgcHJvcHMpKTtcbn1cblxuLyogMTguMy4xLjg1IHNoZWV0UHJvdGVjdGlvbiBDVF9TaGVldFByb3RlY3Rpb24gKi9cbnZhciBzaGVldHByb3RfZGVmZmFsc2UgPSBbXCJvYmplY3RzXCIsIFwic2NlbmFyaW9zXCIsIFwic2VsZWN0TG9ja2VkQ2VsbHNcIiwgXCJzZWxlY3RVbmxvY2tlZENlbGxzXCJdO1xudmFyIHNoZWV0cHJvdF9kZWZ0cnVlID0gW1xuXHRcImZvcm1hdENvbHVtbnNcIiwgXCJmb3JtYXRSb3dzXCIsIFwiZm9ybWF0Q2VsbHNcIixcblx0XCJpbnNlcnRDb2x1bW5zXCIsIFwiaW5zZXJ0Um93c1wiLCBcImluc2VydEh5cGVybGlua3NcIixcblx0XCJkZWxldGVDb2x1bW5zXCIsIFwiZGVsZXRlUm93c1wiLFxuXHRcInNvcnRcIiwgXCJhdXRvRmlsdGVyXCIsIFwicGl2b3RUYWJsZXNcIlxuXTtcbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9wcm90ZWN0aW9uKHNwKS8qOnN0cmluZyovIHtcblx0Ly8gYWxnb3JpdGhtTmFtZSwgaGFzaFZhbHVlLCBzYWx0VmFsdWUsIHNwaW5Db3VudFxuXHR2YXIgbyA9ICh7c2hlZXQ6MX0vKjphbnkqLyk7XG5cdHNoZWV0cHJvdF9kZWZmYWxzZS5mb3JFYWNoKGZ1bmN0aW9uKG4pIHsgaWYoc3Bbbl0gIT0gbnVsbCAmJiBzcFtuXSkgb1tuXSA9IFwiMVwiOyB9KTtcblx0c2hlZXRwcm90X2RlZnRydWUuZm9yRWFjaChmdW5jdGlvbihuKSB7IGlmKHNwW25dICE9IG51bGwgJiYgIXNwW25dKSBvW25dID0gXCIwXCI7IH0pO1xuXHQvKiBUT0RPOiBhbGdvcml0aG0gKi9cblx0aWYoc3AucGFzc3dvcmQpIG8ucGFzc3dvcmQgPSBjcnlwdG9fQ3JlYXRlUGFzc3dvcmRWZXJpZmllcl9NZXRob2QxKHNwLnBhc3N3b3JkKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIHdyaXRleHRhZygnc2hlZXRQcm90ZWN0aW9uJywgbnVsbCwgbyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9obGlua3MocywgZGF0YS8qOkFycmF5PHN0cmluZz4qLywgcmVscykge1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHMpO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IGRhdGEubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgdmFsID0gcGFyc2V4bWx0YWcodXRmOHJlYWQoZGF0YVtpXSksIHRydWUpO1xuXHRcdGlmKCF2YWwucmVmKSByZXR1cm47XG5cdFx0dmFyIHJlbCA9ICgocmVscyB8fCB7fSlbJyFpZCddfHxbXSlbdmFsLmlkXTtcblx0XHRpZihyZWwpIHtcblx0XHRcdHZhbC5UYXJnZXQgPSByZWwuVGFyZ2V0O1xuXHRcdFx0aWYodmFsLmxvY2F0aW9uKSB2YWwuVGFyZ2V0ICs9IFwiI1wiK3VuZXNjYXBleG1sKHZhbC5sb2NhdGlvbik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbC5UYXJnZXQgPSBcIiNcIiArIHVuZXNjYXBleG1sKHZhbC5sb2NhdGlvbik7XG5cdFx0XHRyZWwgPSB7VGFyZ2V0OiB2YWwuVGFyZ2V0LCBUYXJnZXRNb2RlOiAnSW50ZXJuYWwnfTtcblx0XHR9XG5cdFx0dmFsLlJlbCA9IHJlbDtcblx0XHRpZih2YWwudG9vbHRpcCkgeyB2YWwuVG9vbHRpcCA9IHZhbC50b29sdGlwOyBkZWxldGUgdmFsLnRvb2x0aXA7IH1cblx0XHR2YXIgcm5nID0gc2FmZV9kZWNvZGVfcmFuZ2UodmFsLnJlZik7XG5cdFx0Zm9yKHZhciBSPXJuZy5zLnI7Ujw9cm5nLmUucjsrK1IpIGZvcih2YXIgQz1ybmcucy5jO0M8PXJuZy5lLmM7KytDKSB7XG5cdFx0XHR2YXIgYWRkciA9IGVuY29kZV9jZWxsKHtjOkMscjpSfSk7XG5cdFx0XHRpZihkZW5zZSkge1xuXHRcdFx0XHRpZighc1tSXSkgc1tSXSA9IFtdO1xuXHRcdFx0XHRpZighc1tSXVtDXSkgc1tSXVtDXSA9IHt0OlwielwiLHY6dW5kZWZpbmVkfTtcblx0XHRcdFx0c1tSXVtDXS5sID0gdmFsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYoIXNbYWRkcl0pIHNbYWRkcl0gPSB7dDpcInpcIix2OnVuZGVmaW5lZH07XG5cdFx0XHRcdHNbYWRkcl0ubCA9IHZhbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX21hcmdpbnMobWFyZ2luKSB7XG5cdHZhciBvID0ge307XG5cdFtcImxlZnRcIiwgXCJyaWdodFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImhlYWRlclwiLCBcImZvb3RlclwiXS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcblx0XHRpZihtYXJnaW5ba10pIG9ba10gPSBwYXJzZUZsb2F0KG1hcmdpbltrXSk7XG5cdH0pO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9tYXJnaW5zKG1hcmdpbikvKjpzdHJpbmcqLyB7XG5cdGRlZmF1bHRfbWFyZ2lucyhtYXJnaW4pO1xuXHRyZXR1cm4gd3JpdGV4dGFnKCdwYWdlTWFyZ2lucycsIG51bGwsIG1hcmdpbik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9jb2xzKGNvbHVtbnMsIGNvbHMpIHtcblx0dmFyIHNlZW5jb2wgPSBmYWxzZTtcblx0Zm9yKHZhciBjb2xpID0gMDsgY29saSAhPSBjb2xzLmxlbmd0aDsgKytjb2xpKSB7XG5cdFx0dmFyIGNvbGwgPSBwYXJzZXhtbHRhZyhjb2xzW2NvbGldLCB0cnVlKTtcblx0XHRpZihjb2xsLmhpZGRlbikgY29sbC5oaWRkZW4gPSBwYXJzZXhtbGJvb2woY29sbC5oaWRkZW4pO1xuXHRcdHZhciBjb2xtPXBhcnNlSW50KGNvbGwubWluLCAxMCktMSwgY29sTT1wYXJzZUludChjb2xsLm1heCwxMCktMTtcblx0XHRpZihjb2xsLm91dGxpbmVMZXZlbCkgY29sbC5sZXZlbCA9ICgrY29sbC5vdXRsaW5lTGV2ZWwgfHwgMCk7XG5cdFx0ZGVsZXRlIGNvbGwubWluOyBkZWxldGUgY29sbC5tYXg7IGNvbGwud2lkdGggPSArY29sbC53aWR0aDtcblx0XHRpZighc2VlbmNvbCAmJiBjb2xsLndpZHRoKSB7IHNlZW5jb2wgPSB0cnVlOyBmaW5kX21kd19jb2x3KGNvbGwud2lkdGgpOyB9XG5cdFx0cHJvY2Vzc19jb2woY29sbCk7XG5cdFx0d2hpbGUoY29sbSA8PSBjb2xNKSBjb2x1bW5zW2NvbG0rK10gPSBkdXAoY29sbCk7XG5cdH1cbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9jb2xzKHdzLCBjb2xzKS8qOnN0cmluZyovIHtcblx0dmFyIG8gPSBbXCI8Y29scz5cIl0sIGNvbDtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSBjb2xzLmxlbmd0aDsgKytpKSB7XG5cdFx0aWYoIShjb2wgPSBjb2xzW2ldKSkgY29udGludWU7XG5cdFx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdjb2wnLCBudWxsLCBjb2xfb2JqX3coaSwgY29sKSkpO1xuXHR9XG5cdG9bby5sZW5ndGhdID0gXCI8L2NvbHM+XCI7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9hdXRvZmlsdGVyKGRhdGEvKjpzdHJpbmcqLykge1xuXHR2YXIgbyA9IHsgcmVmOiAoZGF0YS5tYXRjaCgvcmVmPVwiKFteXCJdKilcIi8pfHxbXSlbMV19O1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9hdXRvZmlsdGVyKGRhdGEsIHdzLCB3YiwgaWR4KS8qOnN0cmluZyovIHtcblx0dmFyIHJlZiA9IHR5cGVvZiBkYXRhLnJlZiA9PSBcInN0cmluZ1wiID8gZGF0YS5yZWYgOiBlbmNvZGVfcmFuZ2UoZGF0YS5yZWYpO1xuXHRpZighd2IuV29ya2Jvb2spIHdiLldvcmtib29rID0gKHtTaGVldHM6W119Lyo6YW55Ki8pO1xuXHRpZighd2IuV29ya2Jvb2suTmFtZXMpIHdiLldvcmtib29rLk5hbWVzID0gW107XG5cdHZhciBuYW1lcy8qOiBBcnJheTxhbnk+ICovID0gd2IuV29ya2Jvb2suTmFtZXM7XG5cdHZhciByYW5nZSA9IGRlY29kZV9yYW5nZShyZWYpO1xuXHRpZihyYW5nZS5zLnIgPT0gcmFuZ2UuZS5yKSB7IHJhbmdlLmUuciA9IGRlY29kZV9yYW5nZSh3c1tcIiFyZWZcIl0pLmUucjsgcmVmID0gZW5jb2RlX3JhbmdlKHJhbmdlKTsgfVxuXHRmb3IodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgbmFtZSA9IG5hbWVzW2ldO1xuXHRcdGlmKG5hbWUuTmFtZSAhPSAnX3hsbm0uX0ZpbHRlckRhdGFiYXNlJykgY29udGludWU7XG5cdFx0aWYobmFtZS5TaGVldCAhPSBpZHgpIGNvbnRpbnVlO1xuXHRcdG5hbWUuUmVmID0gXCInXCIgKyB3Yi5TaGVldE5hbWVzW2lkeF0gKyBcIichXCIgKyByZWY7IGJyZWFrO1xuXHR9XG5cdGlmKGkgPT0gbmFtZXMubGVuZ3RoKSBuYW1lcy5wdXNoKHsgTmFtZTogJ194bG5tLl9GaWx0ZXJEYXRhYmFzZScsIFNoZWV0OiBpZHgsIFJlZjogXCInXCIgKyB3Yi5TaGVldE5hbWVzW2lkeF0gKyBcIichXCIgKyByZWYgIH0pO1xuXHRyZXR1cm4gd3JpdGV4dGFnKFwiYXV0b0ZpbHRlclwiLCBudWxsLCB7cmVmOnJlZn0pO1xufVxuXG4vKiAxOC4zLjEuODggc2hlZXRWaWV3cyBDVF9TaGVldFZpZXdzICovXG4vKiAxOC4zLjEuODcgc2hlZXRWaWV3IENUX1NoZWV0VmlldyAqL1xudmFyIHN2aWV3cmVnZXggPSAvPCg/OlxcdzopP3NoZWV0Vmlldyg/OltePmEtel1bXj5dKik/XFwvPz4vO1xuZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX3NoZWV0dmlld3MoZGF0YSwgd2IvKjpXQldCUHJvcHMqLykge1xuXHRpZighd2IuVmlld3MpIHdiLlZpZXdzID0gW3t9XTtcblx0KGRhdGEubWF0Y2goc3ZpZXdyZWdleCl8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHIvKjpzdHJpbmcqLywgaS8qOm51bWJlciovKSB7XG5cdFx0dmFyIHRhZyA9IHBhcnNleG1sdGFnKHIpO1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0aWYoIXdiLlZpZXdzW2ldKSB3Yi5WaWV3c1tpXSA9IHt9O1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0aWYoK3RhZy56b29tU2NhbGUpIHdiLlZpZXdzW2ldLnpvb20gPSArdGFnLnpvb21TY2FsZTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdGlmKHBhcnNleG1sYm9vbCh0YWcucmlnaHRUb0xlZnQpKSB3Yi5WaWV3c1tpXS5SVEwgPSB0cnVlO1xuXHR9KTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9zaGVldHZpZXdzKHdzLCBvcHRzLCBpZHgsIHdiKS8qOnN0cmluZyovIHtcblx0dmFyIHN2aWV3ID0gKHt3b3JrYm9va1ZpZXdJZDpcIjBcIn0vKjphbnkqLyk7XG5cdC8vICRGbG93SWdub3JlXG5cdGlmKCgoKHdifHx7fSkuV29ya2Jvb2t8fHt9KS5WaWV3c3x8W10pWzBdKSBzdmlldy5yaWdodFRvTGVmdCA9IHdiLldvcmtib29rLlZpZXdzWzBdLlJUTCA/IFwiMVwiIDogXCIwXCI7XG5cdHJldHVybiB3cml0ZXh0YWcoXCJzaGVldFZpZXdzXCIsIHdyaXRleHRhZyhcInNoZWV0Vmlld1wiLCBudWxsLCBzdmlldyksIHt9KTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfd3NfeG1sX2NlbGwoY2VsbC8qOkNlbGwqLywgcmVmLCB3cywgb3B0cy8qOjosIGlkeCwgd2IqLykvKjpzdHJpbmcqLyB7XG5cdGlmKGNlbGwuYykgd3NbJyFjb21tZW50cyddLnB1c2goW3JlZiwgY2VsbC5jXSk7XG5cdGlmKGNlbGwudiA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjZWxsLmYgIT09IFwic3RyaW5nXCIgfHwgY2VsbC50ID09PSAneicgJiYgIWNlbGwuZikgcmV0dXJuIFwiXCI7XG5cdHZhciB2diA9IFwiXCI7XG5cdHZhciBvbGR0ID0gY2VsbC50LCBvbGR2ID0gY2VsbC52O1xuXHRpZihjZWxsLnQgIT09IFwielwiKSBzd2l0Y2goY2VsbC50KSB7XG5cdFx0Y2FzZSAnYic6IHZ2ID0gY2VsbC52ID8gXCIxXCIgOiBcIjBcIjsgYnJlYWs7XG5cdFx0Y2FzZSAnbic6IHZ2ID0gJycrY2VsbC52OyBicmVhaztcblx0XHRjYXNlICdlJzogdnYgPSBCRXJyW2NlbGwudl07IGJyZWFrO1xuXHRcdGNhc2UgJ2QnOlxuXHRcdFx0aWYob3B0cyAmJiBvcHRzLmNlbGxEYXRlcykgdnYgPSBwYXJzZURhdGUoY2VsbC52LCAtMSkudG9JU09TdHJpbmcoKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjZWxsID0gZHVwKGNlbGwpO1xuXHRcdFx0XHRjZWxsLnQgPSAnbic7XG5cdFx0XHRcdHZ2ID0gJycrKGNlbGwudiA9IGRhdGVudW0ocGFyc2VEYXRlKGNlbGwudikpKTtcblx0XHRcdH1cblx0XHRcdGlmKHR5cGVvZiBjZWxsLnogPT09ICd1bmRlZmluZWQnKSBjZWxsLnogPSB0YWJsZV9mbXRbMTRdO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDogdnYgPSBjZWxsLnY7IGJyZWFrO1xuXHR9XG5cdHZhciB2ID0gd3JpdGV0YWcoJ3YnLCBlc2NhcGV4bWwodnYpKSwgbyA9ICh7cjpyZWZ9Lyo6YW55Ki8pO1xuXHQvKiBUT0RPOiBjZWxsIHN0eWxlICovXG5cdHZhciBvcyA9IGdldF9jZWxsX3N0eWxlKG9wdHMuY2VsbFhmcywgY2VsbCwgb3B0cyk7XG5cdGlmKG9zICE9PSAwKSBvLnMgPSBvcztcblx0c3dpdGNoKGNlbGwudCkge1xuXHRcdGNhc2UgJ24nOiBicmVhaztcblx0XHRjYXNlICdkJzogby50ID0gXCJkXCI7IGJyZWFrO1xuXHRcdGNhc2UgJ2InOiBvLnQgPSBcImJcIjsgYnJlYWs7XG5cdFx0Y2FzZSAnZSc6IG8udCA9IFwiZVwiOyBicmVhaztcblx0XHRjYXNlICd6JzogYnJlYWs7XG5cdFx0ZGVmYXVsdDogaWYoY2VsbC52ID09IG51bGwpIHsgZGVsZXRlIGNlbGwudDsgYnJlYWs7IH1cblx0XHRcdGlmKGNlbGwudi5sZW5ndGggPiAzMjc2NykgdGhyb3cgbmV3IEVycm9yKFwiVGV4dCBsZW5ndGggbXVzdCBub3QgZXhjZWVkIDMyNzY3IGNoYXJhY3RlcnNcIik7XG5cdFx0XHRpZihvcHRzICYmIG9wdHMuYm9va1NTVCkge1xuXHRcdFx0XHR2ID0gd3JpdGV0YWcoJ3YnLCAnJytnZXRfc3N0X2lkKG9wdHMuU3RyaW5ncywgY2VsbC52LCBvcHRzLnJldlN0cmluZ3MpKTtcblx0XHRcdFx0by50ID0gXCJzXCI7IGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0by50ID0gXCJzdHJcIjsgYnJlYWs7XG5cdH1cblx0aWYoY2VsbC50ICE9IG9sZHQpIHsgY2VsbC50ID0gb2xkdDsgY2VsbC52ID0gb2xkdjsgfVxuXHRpZih0eXBlb2YgY2VsbC5mID09IFwic3RyaW5nXCIgJiYgY2VsbC5mKSB7XG5cdFx0dmFyIGZmID0gY2VsbC5GICYmIGNlbGwuRi5zbGljZSgwLCByZWYubGVuZ3RoKSA9PSByZWYgPyB7dDpcImFycmF5XCIsIHJlZjpjZWxsLkZ9IDogbnVsbDtcblx0XHR2ID0gd3JpdGV4dGFnKCdmJywgZXNjYXBleG1sKGNlbGwuZiksIGZmKSArIChjZWxsLnYgIT0gbnVsbCA/IHYgOiBcIlwiKTtcblx0fVxuXHRpZihjZWxsLmwpIHdzWychbGlua3MnXS5wdXNoKFtyZWYsIGNlbGwubF0pO1xuXHRpZihjZWxsLkQpIG8uY20gPSAxO1xuXHRyZXR1cm4gd3JpdGV4dGFnKCdjJywgdiwgbyk7XG59XG5cbnZhciBwYXJzZV93c194bWxfZGF0YSA9IC8qI19fUFVSRV9fKi8oZnVuY3Rpb24oKSB7XG5cdHZhciBjZWxscmVnZXggPSAvPCg/Olxcdys6KT9jWyBcXC8+XS8sIHJvd3JlZ2V4ID0gLzxcXC8oPzpcXHcrOik/cm93Pi87XG5cdHZhciBycmVnZXggPSAvcj1bXCInXShbXlwiJ10qKVtcIiddLywgaXNyZWdleCA9IC88KD86XFx3KzopP2lzPihbXFxTXFxzXSo/KTxcXC8oPzpcXHcrOik/aXM+Lztcblx0dmFyIHJlZnJlZ2V4ID0gL3JlZj1bXCInXShbXlwiJ10qKVtcIiddLztcblx0dmFyIG1hdGNoX3YgPSBtYXRjaHRhZyhcInZcIiksIG1hdGNoX2YgPSBtYXRjaHRhZyhcImZcIik7XG5cbnJldHVybiBmdW5jdGlvbiBwYXJzZV93c194bWxfZGF0YShzZGF0YS8qOnN0cmluZyovLCBzLCBvcHRzLCBndWVzcy8qOlJhbmdlKi8sIHRoZW1lcywgc3R5bGVzKSB7XG5cdHZhciByaSA9IDAsIHggPSBcIlwiLCBjZWxscy8qOkFycmF5PHN0cmluZz4qLyA9IFtdLCBjcmVmLyo6P0FycmF5PHN0cmluZz4qLyA9IFtdLCBpZHg9MCwgaT0wLCBjYz0wLCBkPVwiXCIsIHAvKjphbnkqLztcblx0dmFyIHRhZywgdGFnciA9IDAsIHRhZ2MgPSAwO1xuXHR2YXIgc3N0ciwgZnRhZztcblx0dmFyIGZtdGlkID0gMCwgZmlsbGlkID0gMDtcblx0dmFyIGRvX2Zvcm1hdCA9IEFycmF5LmlzQXJyYXkoc3R5bGVzLkNlbGxYZiksIGNmO1xuXHR2YXIgYXJyYXlmLyo6QXJyYXk8W1JhbmdlLCBzdHJpbmddPiovID0gW107XG5cdHZhciBzaGFyZWRmID0gW107XG5cdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkocyk7XG5cdHZhciByb3dzLyo6QXJyYXk8Um93SW5mbz4qLyA9IFtdLCByb3dvYmogPSB7fSwgcm93cml0ZSA9IGZhbHNlO1xuXHR2YXIgc2hlZXRTdHVicyA9ICEhb3B0cy5zaGVldFN0dWJzO1xuXHRmb3IodmFyIG1hcnIgPSBzZGF0YS5zcGxpdChyb3dyZWdleCksIG10ID0gMCwgbWFycmxlbiA9IG1hcnIubGVuZ3RoOyBtdCAhPSBtYXJybGVuOyArK210KSB7XG5cdFx0eCA9IG1hcnJbbXRdLnRyaW0oKTtcblx0XHR2YXIgeGxlbiA9IHgubGVuZ3RoO1xuXHRcdGlmKHhsZW4gPT09IDApIGNvbnRpbnVlO1xuXG5cdFx0LyogMTguMy4xLjczIHJvdyBDVF9Sb3cgKi9cblx0XHR2YXIgcnN0YXJ0aSA9IDA7XG5cdFx0b3V0YTogZm9yKHJpID0gMDsgcmkgPCB4bGVuOyArK3JpKSBzd2l0Y2goLyp4LmNoYXJDb2RlQXQocmkpKi94W3JpXSkge1xuXHRcdFx0Y2FzZSBcIj5cIiAvKjYyKi86XG5cdFx0XHRcdGlmKC8qeC5jaGFyQ29kZUF0KHJpLTEpICE9IDQ3Ki94W3JpLTFdICE9IFwiL1wiKSB7ICsrcmk7IGJyZWFrIG91dGE7IH1cblx0XHRcdFx0aWYob3B0cyAmJiBvcHRzLmNlbGxTdHlsZXMpIHtcblx0XHRcdFx0XHQvLyBUT0RPOiBhdm9pZCBkdXBsaWNhdGlvblxuXHRcdFx0XHRcdHRhZyA9IHBhcnNleG1sdGFnKHguc2xpY2UocnN0YXJ0aSxyaSksIHRydWUpO1xuXHRcdFx0XHRcdHRhZ3IgPSB0YWcuciAhPSBudWxsID8gcGFyc2VJbnQodGFnLnIsIDEwKSA6IHRhZ3IrMTsgdGFnYyA9IC0xO1xuXHRcdFx0XHRcdGlmKG9wdHMuc2hlZXRSb3dzICYmIG9wdHMuc2hlZXRSb3dzIDwgdGFncikgY29udGludWU7XG5cdFx0XHRcdFx0cm93b2JqID0ge307IHJvd3JpdGUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZih0YWcuaHQpIHsgcm93cml0ZSA9IHRydWU7IHJvd29iai5ocHQgPSBwYXJzZUZsb2F0KHRhZy5odCk7IHJvd29iai5ocHggPSBwdDJweChyb3dvYmouaHB0KTsgfVxuXHRcdFx0XHRcdGlmKHRhZy5oaWRkZW4gPT0gXCIxXCIpIHsgcm93cml0ZSA9IHRydWU7IHJvd29iai5oaWRkZW4gPSB0cnVlOyB9XG5cdFx0XHRcdFx0aWYodGFnLm91dGxpbmVMZXZlbCAhPSBudWxsKSB7IHJvd3JpdGUgPSB0cnVlOyByb3dvYmoubGV2ZWwgPSArdGFnLm91dGxpbmVMZXZlbDsgfVxuXHRcdFx0XHRcdGlmKHJvd3JpdGUpIHJvd3NbdGFnci0xXSA9IHJvd29iajtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCI8XCIgLyo2MCovOiByc3RhcnRpID0gcmk7IGJyZWFrO1xuXHRcdH1cblx0XHRpZihyc3RhcnRpID49IHJpKSBicmVhaztcblx0XHR0YWcgPSBwYXJzZXhtbHRhZyh4LnNsaWNlKHJzdGFydGkscmkpLCB0cnVlKTtcblx0XHR0YWdyID0gdGFnLnIgIT0gbnVsbCA/IHBhcnNlSW50KHRhZy5yLCAxMCkgOiB0YWdyKzE7IHRhZ2MgPSAtMTtcblx0XHRpZihvcHRzLnNoZWV0Um93cyAmJiBvcHRzLnNoZWV0Um93cyA8IHRhZ3IpIGNvbnRpbnVlO1xuXHRcdGlmKGd1ZXNzLnMuciA+IHRhZ3IgLSAxKSBndWVzcy5zLnIgPSB0YWdyIC0gMTtcblx0XHRpZihndWVzcy5lLnIgPCB0YWdyIC0gMSkgZ3Vlc3MuZS5yID0gdGFnciAtIDE7XG5cblx0XHRpZihvcHRzICYmIG9wdHMuY2VsbFN0eWxlcykge1xuXHRcdFx0cm93b2JqID0ge307IHJvd3JpdGUgPSBmYWxzZTtcblx0XHRcdGlmKHRhZy5odCkgeyByb3dyaXRlID0gdHJ1ZTsgcm93b2JqLmhwdCA9IHBhcnNlRmxvYXQodGFnLmh0KTsgcm93b2JqLmhweCA9IHB0MnB4KHJvd29iai5ocHQpOyB9XG5cdFx0XHRpZih0YWcuaGlkZGVuID09IFwiMVwiKSB7IHJvd3JpdGUgPSB0cnVlOyByb3dvYmouaGlkZGVuID0gdHJ1ZTsgfVxuXHRcdFx0aWYodGFnLm91dGxpbmVMZXZlbCAhPSBudWxsKSB7IHJvd3JpdGUgPSB0cnVlOyByb3dvYmoubGV2ZWwgPSArdGFnLm91dGxpbmVMZXZlbDsgfVxuXHRcdFx0aWYocm93cml0ZSkgcm93c1t0YWdyLTFdID0gcm93b2JqO1xuXHRcdH1cblxuXHRcdC8qIDE4LjMuMS40IGMgQ1RfQ2VsbCAqL1xuXHRcdGNlbGxzID0geC5zbGljZShyaSkuc3BsaXQoY2VsbHJlZ2V4KTtcblx0XHRmb3IodmFyIHJzbGljZSA9IDA7IHJzbGljZSAhPSBjZWxscy5sZW5ndGg7ICsrcnNsaWNlKSBpZihjZWxsc1tyc2xpY2VdLnRyaW0oKS5jaGFyQXQoMCkgIT0gXCI8XCIpIGJyZWFrO1xuXHRcdGNlbGxzID0gY2VsbHMuc2xpY2UocnNsaWNlKTtcblx0XHRmb3IocmkgPSAwOyByaSAhPSBjZWxscy5sZW5ndGg7ICsrcmkpIHtcblx0XHRcdHggPSBjZWxsc1tyaV0udHJpbSgpO1xuXHRcdFx0aWYoeC5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXHRcdFx0Y3JlZiA9IHgubWF0Y2gocnJlZ2V4KTsgaWR4ID0gcmk7IGk9MDsgY2M9MDtcblx0XHRcdHggPSBcIjxjIFwiICsgKHguc2xpY2UoMCwxKT09XCI8XCI/XCI+XCI6XCJcIikgKyB4O1xuXHRcdFx0aWYoY3JlZiAhPSBudWxsICYmIGNyZWYubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGlkeCA9IDA7IGQ9Y3JlZlsxXTtcblx0XHRcdFx0Zm9yKGk9MDsgaSAhPSBkLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdFx0aWYoKGNjPWQuY2hhckNvZGVBdChpKS02NCkgPCAxIHx8IGNjID4gMjYpIGJyZWFrO1xuXHRcdFx0XHRcdGlkeCA9IDI2KmlkeCArIGNjO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC0taWR4O1xuXHRcdFx0XHR0YWdjID0gaWR4O1xuXHRcdFx0fSBlbHNlICsrdGFnYztcblx0XHRcdGZvcihpID0gMDsgaSAhPSB4Lmxlbmd0aDsgKytpKSBpZih4LmNoYXJDb2RlQXQoaSkgPT09IDYyKSBicmVhazsgKytpO1xuXHRcdFx0dGFnID0gcGFyc2V4bWx0YWcoeC5zbGljZSgwLGkpLCB0cnVlKTtcblx0XHRcdGlmKCF0YWcucikgdGFnLnIgPSBlbmNvZGVfY2VsbCh7cjp0YWdyLTEsIGM6dGFnY30pO1xuXHRcdFx0ZCA9IHguc2xpY2UoaSk7XG5cdFx0XHRwID0gKHt0OlwiXCJ9Lyo6YW55Ki8pO1xuXG5cdFx0XHRpZigoY3JlZj1kLm1hdGNoKG1hdGNoX3YpKSE9IG51bGwgJiYgLyo6OmNyZWYgIT0gbnVsbCAmJiAqL2NyZWZbMV0gIT09ICcnKSBwLnY9dW5lc2NhcGV4bWwoY3JlZlsxXSk7XG5cdFx0XHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0XHRcdGlmKChjcmVmPWQubWF0Y2gobWF0Y2hfZikpIT0gbnVsbCAmJiAvKjo6Y3JlZiAhPSBudWxsICYmICovY3JlZlsxXSAhPT0gJycpIHtcblx0XHRcdFx0XHQvKiBUT0RPOiBtYXRjaCBhZ2FpbnN0IFhMU1hGdXR1cmVGdW5jdGlvbnMgKi9cblx0XHRcdFx0XHRwLmY9dW5lc2NhcGV4bWwodXRmOHJlYWQoY3JlZlsxXSkpLnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKTtcblx0XHRcdFx0XHRpZighb3B0cy54bGZuKSBwLmYgPSBfeGxmbihwLmYpO1xuXHRcdFx0XHRcdGlmKC8qOjpjcmVmICE9IG51bGwgJiYgY3JlZlswXSAhPSBudWxsICYmICovY3JlZlswXS5pbmRleE9mKCd0PVwiYXJyYXlcIicpID4gLTEpIHtcblx0XHRcdFx0XHRcdHAuRiA9IChkLm1hdGNoKHJlZnJlZ2V4KXx8W10pWzFdO1xuXHRcdFx0XHRcdFx0aWYocC5GLmluZGV4T2YoXCI6XCIpID4gLTEpIGFycmF5Zi5wdXNoKFtzYWZlX2RlY29kZV9yYW5nZShwLkYpLCBwLkZdKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoLyo6OmNyZWYgIT0gbnVsbCAmJiBjcmVmWzBdICE9IG51bGwgJiYgKi9jcmVmWzBdLmluZGV4T2YoJ3Q9XCJzaGFyZWRcIicpID4gLTEpIHtcblx0XHRcdFx0XHRcdC8vIFRPRE86IHBhcnNlIGZvcm11bGFcblx0XHRcdFx0XHRcdGZ0YWcgPSBwYXJzZXhtbHRhZyhjcmVmWzBdKTtcblx0XHRcdFx0XHRcdHZhciBfX19mID0gdW5lc2NhcGV4bWwodXRmOHJlYWQoY3JlZlsxXSkpO1xuXHRcdFx0XHRcdFx0aWYoIW9wdHMueGxmbikgX19fZiA9IF94bGZuKF9fX2YpO1xuXHRcdFx0XHRcdFx0c2hhcmVkZltwYXJzZUludChmdGFnLnNpLCAxMCldID0gW2Z0YWcsIF9fX2YsIHRhZy5yXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZigoY3JlZj1kLm1hdGNoKC88ZltePl0qXFwvPi8pKSkge1xuXHRcdFx0XHRcdGZ0YWcgPSBwYXJzZXhtbHRhZyhjcmVmWzBdKTtcblx0XHRcdFx0XHRpZihzaGFyZWRmW2Z0YWcuc2ldKSBwLmYgPSBzaGlmdF9mb3JtdWxhX3hsc3goc2hhcmVkZltmdGFnLnNpXVsxXSwgc2hhcmVkZltmdGFnLnNpXVsyXS8qWzBdLnJlZiovLCB0YWcucik7XG5cdFx0XHRcdH1cblx0XHRcdFx0LyogVE9ETzogZmFjdG9yIG91dCBjb250YWlucyBsb2dpYyAqL1xuXHRcdFx0XHR2YXIgX3RhZyA9IGRlY29kZV9jZWxsKHRhZy5yKTtcblx0XHRcdFx0Zm9yKGkgPSAwOyBpIDwgYXJyYXlmLmxlbmd0aDsgKytpKVxuXHRcdFx0XHRcdGlmKF90YWcuciA+PSBhcnJheWZbaV1bMF0ucy5yICYmIF90YWcuciA8PSBhcnJheWZbaV1bMF0uZS5yKVxuXHRcdFx0XHRcdFx0aWYoX3RhZy5jID49IGFycmF5ZltpXVswXS5zLmMgJiYgX3RhZy5jIDw9IGFycmF5ZltpXVswXS5lLmMpXG5cdFx0XHRcdFx0XHRcdHAuRiA9IGFycmF5ZltpXVsxXTtcblx0XHRcdH1cblxuXHRcdFx0aWYodGFnLnQgPT0gbnVsbCAmJiBwLnYgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZihwLmYgfHwgcC5GKSB7XG5cdFx0XHRcdFx0cC52ID0gMDsgcC50ID0gXCJuXCI7XG5cdFx0XHRcdH0gZWxzZSBpZighc2hlZXRTdHVicykgY29udGludWU7XG5cdFx0XHRcdGVsc2UgcC50ID0gXCJ6XCI7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHAudCA9IHRhZy50IHx8IFwiblwiO1xuXHRcdFx0aWYoZ3Vlc3Mucy5jID4gdGFnYykgZ3Vlc3Mucy5jID0gdGFnYztcblx0XHRcdGlmKGd1ZXNzLmUuYyA8IHRhZ2MpIGd1ZXNzLmUuYyA9IHRhZ2M7XG5cdFx0XHQvKiAxOC4xOC4xMSB0IFNUX0NlbGxUeXBlICovXG5cdFx0XHRzd2l0Y2gocC50KSB7XG5cdFx0XHRcdGNhc2UgJ24nOlxuXHRcdFx0XHRcdGlmKHAudiA9PSBcIlwiIHx8IHAudiA9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRpZighc2hlZXRTdHVicykgY29udGludWU7XG5cdFx0XHRcdFx0XHRwLnQgPSAneic7XG5cdFx0XHRcdFx0fSBlbHNlIHAudiA9IHBhcnNlRmxvYXQocC52KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncyc6XG5cdFx0XHRcdFx0aWYodHlwZW9mIHAudiA9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0aWYoIXNoZWV0U3R1YnMpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0cC50ID0gJ3onO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzc3RyID0gc3Ryc1twYXJzZUludChwLnYsIDEwKV07XG5cdFx0XHRcdFx0XHRwLnYgPSBzc3RyLnQ7XG5cdFx0XHRcdFx0XHRwLnIgPSBzc3RyLnI7XG5cdFx0XHRcdFx0XHRpZihvcHRzLmNlbGxIVE1MKSBwLmggPSBzc3RyLmg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdzdHInOlxuXHRcdFx0XHRcdHAudCA9IFwic1wiO1xuXHRcdFx0XHRcdHAudiA9IChwLnYhPW51bGwpID8gdXRmOHJlYWQocC52KSA6ICcnO1xuXHRcdFx0XHRcdGlmKG9wdHMuY2VsbEhUTUwpIHAuaCA9IGVzY2FwZWh0bWwocC52KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnaW5saW5lU3RyJzpcblx0XHRcdFx0XHRjcmVmID0gZC5tYXRjaChpc3JlZ2V4KTtcblx0XHRcdFx0XHRwLnQgPSAncyc7XG5cdFx0XHRcdFx0aWYoY3JlZiAhPSBudWxsICYmIChzc3RyID0gcGFyc2Vfc2koY3JlZlsxXSkpKSB7XG5cdFx0XHRcdFx0XHRwLnYgPSBzc3RyLnQ7XG5cdFx0XHRcdFx0XHRpZihvcHRzLmNlbGxIVE1MKSBwLmggPSBzc3RyLmg7XG5cdFx0XHRcdFx0fSBlbHNlIHAudiA9IFwiXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2InOiBwLnYgPSBwYXJzZXhtbGJvb2wocC52KTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2QnOlxuXHRcdFx0XHRcdGlmKG9wdHMuY2VsbERhdGVzKSBwLnYgPSBwYXJzZURhdGUocC52LCAxKTtcblx0XHRcdFx0XHRlbHNlIHsgcC52ID0gZGF0ZW51bShwYXJzZURhdGUocC52LCAxKSk7IHAudCA9ICduJzsgfVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHQvKiBlcnJvciBzdHJpbmcgaW4gLncsIG51bWJlciBpbiAudiAqL1xuXHRcdFx0XHRjYXNlICdlJzpcblx0XHRcdFx0XHRpZighb3B0cyB8fCBvcHRzLmNlbGxUZXh0ICE9PSBmYWxzZSkgcC53ID0gcC52O1xuXHRcdFx0XHRcdHAudiA9IFJCRXJyW3Audl07IGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0LyogZm9ybWF0dGluZyAqL1xuXHRcdFx0Zm10aWQgPSBmaWxsaWQgPSAwO1xuXHRcdFx0Y2YgPSBudWxsO1xuXHRcdFx0aWYoZG9fZm9ybWF0ICYmIHRhZy5zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y2YgPSBzdHlsZXMuQ2VsbFhmW3RhZy5zXTtcblx0XHRcdFx0aWYoY2YgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmKGNmLm51bUZtdElkICE9IG51bGwpIGZtdGlkID0gY2YubnVtRm10SWQ7XG5cdFx0XHRcdFx0aWYob3B0cy5jZWxsU3R5bGVzKSB7XG5cdFx0XHRcdFx0XHRpZihjZi5maWxsSWQgIT0gbnVsbCkgZmlsbGlkID0gY2YuZmlsbElkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0c2FmZV9mb3JtYXQocCwgZm10aWQsIGZpbGxpZCwgb3B0cywgdGhlbWVzLCBzdHlsZXMpO1xuXHRcdFx0aWYob3B0cy5jZWxsRGF0ZXMgJiYgZG9fZm9ybWF0ICYmIHAudCA9PSAnbicgJiYgZm10X2lzX2RhdGUodGFibGVfZm10W2ZtdGlkXSkpIHsgcC50ID0gJ2QnOyBwLnYgPSBudW1kYXRlKHAudik7IH1cblx0XHRcdGlmKHRhZy5jbSAmJiBvcHRzLnhsbWV0YSkge1xuXHRcdFx0XHR2YXIgY20gPSAob3B0cy54bG1ldGEuQ2VsbHx8W10pWyt0YWcuY20tMV07XG5cdFx0XHRcdGlmKGNtICYmIGNtLnR5cGUgPT0gJ1hMREFQUicpIHAuRCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZihkZW5zZSkge1xuXHRcdFx0XHR2YXIgX3IgPSBkZWNvZGVfY2VsbCh0YWcucik7XG5cdFx0XHRcdGlmKCFzW19yLnJdKSBzW19yLnJdID0gW107XG5cdFx0XHRcdHNbX3Iucl1bX3IuY10gPSBwO1xuXHRcdFx0fSBlbHNlIHNbdGFnLnJdID0gcDtcblx0XHR9XG5cdH1cblx0aWYocm93cy5sZW5ndGggPiAwKSBzWychcm93cyddID0gcm93cztcbn07IH0pKCk7XG5cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9kYXRhKHdzLyo6V29ya3NoZWV0Ki8sIG9wdHMsIGlkeC8qOm51bWJlciovLCB3Yi8qOldvcmtib29rKi8vKjo6LCByZWxzKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgby8qOkFycmF5PHN0cmluZz4qLyA9IFtdLCByLyo6QXJyYXk8c3RyaW5nPiovID0gW10sIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSksIGNlbGw9XCJcIiwgcmVmLCByciA9IFwiXCIsIGNvbHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXSwgUj0wLCBDPTAsIHJvd3MgPSB3c1snIXJvd3MnXTtcblx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdHZhciBwYXJhbXMgPSAoe3I6cnJ9Lyo6YW55Ki8pLCByb3cvKjpSb3dJbmZvKi8sIGhlaWdodCA9IC0xO1xuXHRmb3IoQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykgY29sc1tDXSA9IGVuY29kZV9jb2woQyk7XG5cdGZvcihSID0gcmFuZ2Uucy5yOyBSIDw9IHJhbmdlLmUucjsgKytSKSB7XG5cdFx0ciA9IFtdO1xuXHRcdHJyID0gZW5jb2RlX3JvdyhSKTtcblx0XHRmb3IoQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xuXHRcdFx0cmVmID0gY29sc1tDXSArIHJyO1xuXHRcdFx0dmFyIF9jZWxsID0gZGVuc2UgPyAod3NbUl18fFtdKVtDXTogd3NbcmVmXTtcblx0XHRcdGlmKF9jZWxsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXHRcdFx0aWYoKGNlbGwgPSB3cml0ZV93c194bWxfY2VsbChfY2VsbCwgcmVmLCB3cywgb3B0cywgaWR4LCB3YikpICE9IG51bGwpIHIucHVzaChjZWxsKTtcblx0XHR9XG5cdFx0aWYoci5sZW5ndGggPiAwIHx8IChyb3dzICYmIHJvd3NbUl0pKSB7XG5cdFx0XHRwYXJhbXMgPSAoe3I6cnJ9Lyo6YW55Ki8pO1xuXHRcdFx0aWYocm93cyAmJiByb3dzW1JdKSB7XG5cdFx0XHRcdHJvdyA9IHJvd3NbUl07XG5cdFx0XHRcdGlmKHJvdy5oaWRkZW4pIHBhcmFtcy5oaWRkZW4gPSAxO1xuXHRcdFx0XHRoZWlnaHQgPSAtMTtcblx0XHRcdFx0aWYocm93LmhweCkgaGVpZ2h0ID0gcHgycHQocm93LmhweCk7XG5cdFx0XHRcdGVsc2UgaWYocm93LmhwdCkgaGVpZ2h0ID0gcm93LmhwdDtcblx0XHRcdFx0aWYoaGVpZ2h0ID4gLTEpIHsgcGFyYW1zLmh0ID0gaGVpZ2h0OyBwYXJhbXMuY3VzdG9tSGVpZ2h0ID0gMTsgfVxuXHRcdFx0XHRpZihyb3cubGV2ZWwpIHsgcGFyYW1zLm91dGxpbmVMZXZlbCA9IHJvdy5sZXZlbDsgfVxuXHRcdFx0fVxuXHRcdFx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdyb3cnLCByLmpvaW4oXCJcIiksIHBhcmFtcykpO1xuXHRcdH1cblx0fVxuXHRpZihyb3dzKSBmb3IoOyBSIDwgcm93cy5sZW5ndGg7ICsrUikge1xuXHRcdGlmKHJvd3MgJiYgcm93c1tSXSkge1xuXHRcdFx0cGFyYW1zID0gKHtyOlIrMX0vKjphbnkqLyk7XG5cdFx0XHRyb3cgPSByb3dzW1JdO1xuXHRcdFx0aWYocm93LmhpZGRlbikgcGFyYW1zLmhpZGRlbiA9IDE7XG5cdFx0XHRoZWlnaHQgPSAtMTtcblx0XHRcdGlmIChyb3cuaHB4KSBoZWlnaHQgPSBweDJwdChyb3cuaHB4KTtcblx0XHRcdGVsc2UgaWYgKHJvdy5ocHQpIGhlaWdodCA9IHJvdy5ocHQ7XG5cdFx0XHRpZiAoaGVpZ2h0ID4gLTEpIHsgcGFyYW1zLmh0ID0gaGVpZ2h0OyBwYXJhbXMuY3VzdG9tSGVpZ2h0ID0gMTsgfVxuXHRcdFx0aWYgKHJvdy5sZXZlbCkgeyBwYXJhbXMub3V0bGluZUxldmVsID0gcm93LmxldmVsOyB9XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ3JvdycsIFwiXCIsIHBhcmFtcykpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93c194bWwoaWR4Lyo6bnVtYmVyKi8sIG9wdHMsIHdiLyo6V29ya2Jvb2sqLywgcmVscykvKjpzdHJpbmcqLyB7XG5cdHZhciBvID0gW1hNTF9IRUFERVIsIHdyaXRleHRhZygnd29ya3NoZWV0JywgbnVsbCwge1xuXHRcdCd4bWxucyc6IFhNTE5TX21haW5bMF0sXG5cdFx0J3htbG5zOnInOiBYTUxOUy5yXG5cdH0pXTtcblx0dmFyIHMgPSB3Yi5TaGVldE5hbWVzW2lkeF0sIHNpZHggPSAwLCByZGF0YSA9IFwiXCI7XG5cdHZhciB3cyA9IHdiLlNoZWV0c1tzXTtcblx0aWYod3MgPT0gbnVsbCkgd3MgPSB7fTtcblx0dmFyIHJlZiA9IHdzWychcmVmJ10gfHwgJ0ExJztcblx0dmFyIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2UocmVmKTtcblx0aWYocmFuZ2UuZS5jID4gMHgzRkZGIHx8IHJhbmdlLmUuciA+IDB4RkZGRkYpIHtcblx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2UgXCIgKyByZWYgKyBcIiBleGNlZWRzIGZvcm1hdCBsaW1pdCBBMTpYRkQxMDQ4NTc2XCIpO1xuXHRcdHJhbmdlLmUuYyA9IE1hdGgubWluKHJhbmdlLmUuYywgMHgzRkZGKTtcblx0XHRyYW5nZS5lLnIgPSBNYXRoLm1pbihyYW5nZS5lLmMsIDB4RkZGRkYpO1xuXHRcdHJlZiA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdH1cblx0aWYoIXJlbHMpIHJlbHMgPSB7fTtcblx0d3NbJyFjb21tZW50cyddID0gW107XG5cdHZhciBfZHJhd2luZyA9IFtdO1xuXG5cdHdyaXRlX3dzX3htbF9zaGVldHByKHdzLCB3YiwgaWR4LCBvcHRzLCBvKTtcblxuXHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ2RpbWVuc2lvbicsIG51bGwsIHsncmVmJzogcmVmfSkpO1xuXG5cdG9bby5sZW5ndGhdID0gd3JpdGVfd3NfeG1sX3NoZWV0dmlld3Mod3MsIG9wdHMsIGlkeCwgd2IpO1xuXG5cdC8qIFRPRE86IHN0b3JlIGluIFdCLCBwcm9jZXNzIHN0eWxlcyAqL1xuXHRpZihvcHRzLnNoZWV0Rm9ybWF0KSBvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ3NoZWV0Rm9ybWF0UHInLCBudWxsLCB7XG5cdFx0ZGVmYXVsdFJvd0hlaWdodDpvcHRzLnNoZWV0Rm9ybWF0LmRlZmF1bHRSb3dIZWlnaHR8fCcxNicsXG5cdFx0YmFzZUNvbFdpZHRoOm9wdHMuc2hlZXRGb3JtYXQuYmFzZUNvbFdpZHRofHwnMTAnLFxuXHRcdG91dGxpbmVMZXZlbFJvdzpvcHRzLnNoZWV0Rm9ybWF0Lm91dGxpbmVMZXZlbFJvd3x8JzcnXG5cdH0pKTtcblxuXHRpZih3c1snIWNvbHMnXSAhPSBudWxsICYmIHdzWychY29scyddLmxlbmd0aCA+IDApIG9bby5sZW5ndGhdID0gKHdyaXRlX3dzX3htbF9jb2xzKHdzLCB3c1snIWNvbHMnXSkpO1xuXG5cdG9bc2lkeCA9IG8ubGVuZ3RoXSA9ICc8c2hlZXREYXRhLz4nO1xuXHR3c1snIWxpbmtzJ10gPSBbXTtcblx0aWYod3NbJyFyZWYnXSAhPSBudWxsKSB7XG5cdFx0cmRhdGEgPSB3cml0ZV93c194bWxfZGF0YSh3cywgb3B0cywgaWR4LCB3YiwgcmVscyk7XG5cdFx0aWYocmRhdGEubGVuZ3RoID4gMCkgb1tvLmxlbmd0aF0gPSAocmRhdGEpO1xuXHR9XG5cdGlmKG8ubGVuZ3RoPnNpZHgrMSkgeyBvW28ubGVuZ3RoXSA9ICgnPC9zaGVldERhdGE+Jyk7IG9bc2lkeF09b1tzaWR4XS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblxuXHQvKiBzaGVldENhbGNQciAqL1xuXG5cdGlmKHdzWychcHJvdGVjdCddKSBvW28ubGVuZ3RoXSA9IHdyaXRlX3dzX3htbF9wcm90ZWN0aW9uKHdzWychcHJvdGVjdCddKTtcblxuXHQvKiBwcm90ZWN0ZWRSYW5nZXMgKi9cblx0Lyogc2NlbmFyaW9zICovXG5cblx0aWYod3NbJyFhdXRvZmlsdGVyJ10gIT0gbnVsbCkgb1tvLmxlbmd0aF0gPSB3cml0ZV93c194bWxfYXV0b2ZpbHRlcih3c1snIWF1dG9maWx0ZXInXSwgd3MsIHdiLCBpZHgpO1xuXG5cdC8qIHNvcnRTdGF0ZSAqL1xuXHQvKiBkYXRhQ29uc29saWRhdGUgKi9cblx0LyogY3VzdG9tU2hlZXRWaWV3cyAqL1xuXG5cdGlmKHdzWychbWVyZ2VzJ10gIT0gbnVsbCAmJiB3c1snIW1lcmdlcyddLmxlbmd0aCA+IDApIG9bby5sZW5ndGhdID0gKHdyaXRlX3dzX3htbF9tZXJnZXMod3NbJyFtZXJnZXMnXSkpO1xuXG5cdC8qIHBob25ldGljUHIgKi9cblx0LyogY29uZGl0aW9uYWxGb3JtYXR0aW5nICovXG5cdC8qIGRhdGFWYWxpZGF0aW9ucyAqL1xuXG5cdHZhciByZWxjID0gLTEsIHJlbCwgcklkID0gLTE7XG5cdGlmKC8qOjooKi93c1snIWxpbmtzJ10vKjo6fHxbXSkqLy5sZW5ndGggPiAwKSB7XG5cdFx0b1tvLmxlbmd0aF0gPSBcIjxoeXBlcmxpbmtzPlwiO1xuXHRcdC8qOjooKi93c1snIWxpbmtzJ10vKjo6fHxbXSkqLy5mb3JFYWNoKGZ1bmN0aW9uKGwpIHtcblx0XHRcdGlmKCFsWzFdLlRhcmdldCkgcmV0dXJuO1xuXHRcdFx0cmVsID0gKHtcInJlZlwiOmxbMF19Lyo6YW55Ki8pO1xuXHRcdFx0aWYobFsxXS5UYXJnZXQuY2hhckF0KDApICE9IFwiI1wiKSB7XG5cdFx0XHRcdHJJZCA9IGFkZF9yZWxzKHJlbHMsIC0xLCBlc2NhcGV4bWwobFsxXS5UYXJnZXQpLnJlcGxhY2UoLyMuKiQvLCBcIlwiKSwgUkVMUy5ITElOSyk7XG5cdFx0XHRcdHJlbFtcInI6aWRcIl0gPSBcInJJZFwiK3JJZDtcblx0XHRcdH1cblx0XHRcdGlmKChyZWxjID0gbFsxXS5UYXJnZXQuaW5kZXhPZihcIiNcIikpID4gLTEpIHJlbC5sb2NhdGlvbiA9IGVzY2FwZXhtbChsWzFdLlRhcmdldC5zbGljZShyZWxjKzEpKTtcblx0XHRcdGlmKGxbMV0uVG9vbHRpcCkgcmVsLnRvb2x0aXAgPSBlc2NhcGV4bWwobFsxXS5Ub29sdGlwKTtcblx0XHRcdG9bby5sZW5ndGhdID0gd3JpdGV4dGFnKFwiaHlwZXJsaW5rXCIsbnVsbCxyZWwpO1xuXHRcdH0pO1xuXHRcdG9bby5sZW5ndGhdID0gXCI8L2h5cGVybGlua3M+XCI7XG5cdH1cblx0ZGVsZXRlIHdzWychbGlua3MnXTtcblxuXHQvKiBwcmludE9wdGlvbnMgKi9cblxuXHRpZih3c1snIW1hcmdpbnMnXSAhPSBudWxsKSBvW28ubGVuZ3RoXSA9ICB3cml0ZV93c194bWxfbWFyZ2lucyh3c1snIW1hcmdpbnMnXSk7XG5cblx0LyogcGFnZVNldHVwICovXG5cdC8qIGhlYWRlckZvb3RlciAqL1xuXHQvKiByb3dCcmVha3MgKi9cblx0LyogY29sQnJlYWtzICovXG5cdC8qIGN1c3RvbVByb3BlcnRpZXMgKi9cblx0LyogY2VsbFdhdGNoZXMgKi9cblxuXHRpZighb3B0cyB8fCBvcHRzLmlnbm9yZUVDIHx8IChvcHRzLmlnbm9yZUVDID09ICh2b2lkIDApKSkgb1tvLmxlbmd0aF0gPSB3cml0ZXRhZyhcImlnbm9yZWRFcnJvcnNcIiwgd3JpdGV4dGFnKFwiaWdub3JlZEVycm9yXCIsIG51bGwsIHtudW1iZXJTdG9yZWRBc1RleHQ6MSwgc3FyZWY6cmVmfSkpO1xuXG5cdC8qIHNtYXJ0VGFncyAqL1xuXG5cdGlmKF9kcmF3aW5nLmxlbmd0aCA+IDApIHtcblx0XHRySWQgPSBhZGRfcmVscyhyZWxzLCAtMSwgXCIuLi9kcmF3aW5ncy9kcmF3aW5nXCIgKyAoaWR4KzEpICsgXCIueG1sXCIsIFJFTFMuRFJBVyk7XG5cdFx0b1tvLmxlbmd0aF0gPSB3cml0ZXh0YWcoXCJkcmF3aW5nXCIsIG51bGwsIHtcInI6aWRcIjpcInJJZFwiICsgcklkfSk7XG5cdFx0d3NbJyFkcmF3aW5nJ10gPSBfZHJhd2luZztcblx0fVxuXG5cdGlmKHdzWychY29tbWVudHMnXS5sZW5ndGggPiAwKSB7XG5cdFx0cklkID0gYWRkX3JlbHMocmVscywgLTEsIFwiLi4vZHJhd2luZ3Mvdm1sRHJhd2luZ1wiICsgKGlkeCsxKSArIFwiLnZtbFwiLCBSRUxTLlZNTCk7XG5cdFx0b1tvLmxlbmd0aF0gPSB3cml0ZXh0YWcoXCJsZWdhY3lEcmF3aW5nXCIsIG51bGwsIHtcInI6aWRcIjpcInJJZFwiICsgcklkfSk7XG5cdFx0d3NbJyFsZWdhY3knXSA9IHJJZDtcblx0fVxuXG5cdC8qIGxlZ2FjeURyYXdpbmdIRiAqL1xuXHQvKiBwaWN0dXJlICovXG5cdC8qIG9sZU9iamVjdHMgKi9cblx0LyogY29udHJvbHMgKi9cblx0Lyogd2ViUHVibGlzaEl0ZW1zICovXG5cdC8qIHRhYmxlUGFydHMgKi9cblx0LyogZXh0THN0ICovXG5cblx0aWYoby5sZW5ndGg+MSkgeyBvW28ubGVuZ3RoXSA9ICgnPC93b3Jrc2hlZXQ+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuLyogW01TLVhMU0JdIDIuNC43MjYgQnJ0Um93SGRyICovXG5mdW5jdGlvbiBwYXJzZV9CcnRSb3dIZHIoZGF0YSwgbGVuZ3RoKSB7XG5cdHZhciB6ID0gKHt9Lyo6YW55Ki8pO1xuXHR2YXIgdGd0ID0gZGF0YS5sICsgbGVuZ3RoO1xuXHR6LnIgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdGRhdGEubCArPSA0OyAvLyBUT0RPOiBpeGZlXG5cdHZhciBtaXlSdyA9IGRhdGEucmVhZF9zaGlmdCgyKTtcblx0ZGF0YS5sICs9IDE7IC8vIFRPRE86IHRvcC9ib3QgcGFkZGluZ1xuXHR2YXIgZmxhZ3MgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdGRhdGEubCA9IHRndDtcblx0aWYoZmxhZ3MgJiAweDA3KSB6LmxldmVsID0gZmxhZ3MgJiAweDA3O1xuXHRpZihmbGFncyAmIDB4MTApIHouaGlkZGVuID0gdHJ1ZTtcblx0aWYoZmxhZ3MgJiAweDIwKSB6LmhwdCA9IG1peVJ3IC8gMjA7XG5cdHJldHVybiB6O1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Um93SGRyKFIvKjpudW1iZXIqLywgcmFuZ2UsIHdzKSB7XG5cdHZhciBvID0gbmV3X2J1ZigxNys4KjE2KTtcblx0dmFyIHJvdyA9ICh3c1snIXJvd3MnXXx8W10pW1JdfHx7fTtcblx0by53cml0ZV9zaGlmdCg0LCBSKTtcblxuXHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvKiBUT0RPOiBpeGZlICovXG5cblx0dmFyIG1peVJ3ID0gMHgwMTQwO1xuXHRpZihyb3cuaHB4KSBtaXlSdyA9IHB4MnB0KHJvdy5ocHgpICogMjA7XG5cdGVsc2UgaWYocm93LmhwdCkgbWl5UncgPSByb3cuaHB0ICogMjA7XG5cdG8ud3JpdGVfc2hpZnQoMiwgbWl5UncpO1xuXG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7IC8qIHRvcC9ib3QgcGFkZGluZyAqL1xuXG5cdHZhciBmbGFncyA9IDB4MDtcblx0aWYocm93LmxldmVsKSBmbGFncyB8PSByb3cubGV2ZWw7XG5cdGlmKHJvdy5oaWRkZW4pIGZsYWdzIHw9IDB4MTA7XG5cdGlmKHJvdy5ocHggfHwgcm93LmhwdCkgZmxhZ3MgfD0gMHgyMDtcblx0by53cml0ZV9zaGlmdCgxLCBmbGFncyk7XG5cblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLyogcGhvbmV0aWMgZ3VpZGUgKi9cblxuXHQvKiBbTVMtWExTQl0gMi41LjggQnJ0Q29sU3BhbiBleHBsYWlucyB0aGUgbWVjaGFuaXNtICovXG5cdHZhciBuY29sc3BhbiA9IDAsIGxjcyA9IG8ubDtcblx0by5sICs9IDQ7XG5cblx0dmFyIGNhZGRyID0ge3I6UiwgYzowfTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcblx0XHRpZigocmFuZ2Uucy5jID4gKChpKzEpIDw8IDEwKSkgfHwgKHJhbmdlLmUuYyA8IChpIDw8IDEwKSkpIGNvbnRpbnVlO1xuXHRcdHZhciBmaXJzdCA9IC0xLCBsYXN0ID0gLTE7XG5cdFx0Zm9yKHZhciBqID0gKGk8PDEwKTsgaiA8ICgoaSsxKTw8MTApOyArK2opIHtcblx0XHRcdGNhZGRyLmMgPSBqO1xuXHRcdFx0dmFyIGNlbGwgPSBBcnJheS5pc0FycmF5KHdzKSA/ICh3c1tjYWRkci5yXXx8W10pW2NhZGRyLmNdIDogd3NbZW5jb2RlX2NlbGwoY2FkZHIpXTtcblx0XHRcdGlmKGNlbGwpIHsgaWYoZmlyc3QgPCAwKSBmaXJzdCA9IGo7IGxhc3QgPSBqOyB9XG5cdFx0fVxuXHRcdGlmKGZpcnN0IDwgMCkgY29udGludWU7XG5cdFx0KytuY29sc3Bhbjtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIGZpcnN0KTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIGxhc3QpO1xuXHR9XG5cblx0dmFyIGwgPSBvLmw7XG5cdG8ubCA9IGxjcztcblx0by53cml0ZV9zaGlmdCg0LCBuY29sc3Bhbik7XG5cdG8ubCA9IGw7XG5cblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cbmZ1bmN0aW9uIHdyaXRlX3Jvd19oZWFkZXIoYmEsIHdzLCByYW5nZSwgUikge1xuXHR2YXIgbyA9IHdyaXRlX0JydFJvd0hkcihSLCByYW5nZSwgd3MpO1xuXHRpZigoby5sZW5ndGggPiAxNykgfHwgKHdzWychcm93cyddfHxbXSlbUl0pIHdyaXRlX3JlY29yZChiYSwgMHgwMDAwIC8qIEJydFJvd0hkciAqLywgbyk7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuODIwIEJydFdzRGltICovXG52YXIgcGFyc2VfQnJ0V3NEaW0gPSBwYXJzZV9VbmNoZWNrZWRSZlg7XG52YXIgd3JpdGVfQnJ0V3NEaW0gPSB3cml0ZV9VbmNoZWNrZWRSZlg7XG5cbi8qIFtNUy1YTFNCXSAyLjQuODIxIEJydFdzRm10SW5mbyAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0V3NGbXRJbmZvKC8qOjpkYXRhLCBsZW5ndGgqLykge1xufVxuLy9mdW5jdGlvbiB3cml0ZV9CcnRXc0ZtdEluZm8od3MsIG8pIHsgfVxuXG4vKiBbTVMtWExTQl0gMi40LjgyMyBCcnRXc1Byb3AgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydFdzUHJvcChkYXRhLCBsZW5ndGgpIHtcblx0dmFyIHogPSB7fTtcblx0dmFyIGYgPSBkYXRhW2RhdGEubF07ICsrZGF0YS5sO1xuXHR6LmFib3ZlID0gIShmICYgMHg0MCk7XG5cdHoubGVmdCAgPSAhKGYgJiAweDgwKTtcblx0LyogVE9ETzogcHVsbCBmbGFncyAqL1xuXHRkYXRhLmwgKz0gMTg7XG5cdHoubmFtZSA9IHBhcnNlX1hMU0JDb2RlTmFtZShkYXRhLCBsZW5ndGggLSAxOSk7XG5cdHJldHVybiB6O1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0V3NQcm9wKHN0ciwgb3V0bCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDg0KzQqc3RyLmxlbmd0aCk7XG5cdHZhciBmID0gMHhDMDtcblx0aWYob3V0bCkge1xuXHRcdGlmKG91dGwuYWJvdmUpIGYgJj0gfjB4NDA7XG5cdFx0aWYob3V0bC5sZWZ0KSAgZiAmPSB+MHg4MDtcblx0fVxuXHRvLndyaXRlX3NoaWZ0KDEsIGYpO1xuXHRmb3IodmFyIGkgPSAxOyBpIDwgMzsgKytpKSBvLndyaXRlX3NoaWZ0KDEsMCk7XG5cdHdyaXRlX0JydENvbG9yKHthdXRvOjF9LCBvKTtcblx0by53cml0ZV9zaGlmdCgtNCwtMSk7XG5cdG8ud3JpdGVfc2hpZnQoLTQsLTEpO1xuXHR3cml0ZV9YTFNCQ29kZU5hbWUoc3RyLCBvKTtcblx0cmV0dXJuIG8uc2xpY2UoMCwgby5sKTtcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMDYgQnJ0Q2VsbEJsYW5rICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDZWxsQmxhbmsoZGF0YSkge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JDZWxsKGRhdGEpO1xuXHRyZXR1cm4gW2NlbGxdO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Q2VsbEJsYW5rKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOCk7XG5cdHJldHVybiB3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRTaG9ydEJsYW5rKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHRyZXR1cm4gW2NlbGxdO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0U2hvcnRCbGFuayhjZWxsLCBuY2VsbCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDQpO1xuXHRyZXR1cm4gd3JpdGVfWExTQlNob3J0Q2VsbChuY2VsbCwgbyk7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuMzA3IEJydENlbGxCb29sICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDZWxsQm9vbChkYXRhKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdHZhciBmQm9vbCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0cmV0dXJuIFtjZWxsLCBmQm9vbCwgJ2InXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxCb29sKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOSk7XG5cdHdyaXRlX1hMU0JDZWxsKG5jZWxsLCBvKTtcblx0by53cml0ZV9zaGlmdCgxLCBjZWxsLnYgPyAxIDogMCk7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0U2hvcnRCb29sKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHR2YXIgZkJvb2wgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiBbY2VsbCwgZkJvb2wsICdiJ107XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRTaG9ydEJvb2woY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1Zig1KTtcblx0d3JpdGVfWExTQlNob3J0Q2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgY2VsbC52ID8gMSA6IDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMDggQnJ0Q2VsbEVycm9yICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDZWxsRXJyb3IoZGF0YSkge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JDZWxsKGRhdGEpO1xuXHR2YXIgYkVycm9yID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4gW2NlbGwsIGJFcnJvciwgJ2UnXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxFcnJvcihjZWxsLCBuY2VsbCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDkpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgY2VsbC52KTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRTaG9ydEVycm9yKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHR2YXIgYkVycm9yID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4gW2NlbGwsIGJFcnJvciwgJ2UnXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydFNob3J0RXJyb3IoY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1Zig4KTtcblx0d3JpdGVfWExTQlNob3J0Q2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgY2VsbC52KTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0cmV0dXJuIG87XG59XG5cblxuLyogW01TLVhMU0JdIDIuNC4zMTEgQnJ0Q2VsbElzc3QgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxJc3N0KGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0dmFyIGlzc3QgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBbY2VsbCwgaXNzdCwgJ3MnXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxJc3N0KGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTIpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgbmNlbGwudik7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0U2hvcnRJc3N0KGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHR2YXIgaXNzdCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0cmV0dXJuIFtjZWxsLCBpc3N0LCAncyddO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0U2hvcnRJc3N0KGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOCk7XG5cdHdyaXRlX1hMU0JTaG9ydENlbGwobmNlbGwsIG8pO1xuXHRvLndyaXRlX3NoaWZ0KDQsIG5jZWxsLnYpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMTMgQnJ0Q2VsbFJlYWwgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxSZWFsKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0dmFyIHZhbHVlID0gcGFyc2VfWG51bShkYXRhKTtcblx0cmV0dXJuIFtjZWxsLCB2YWx1ZSwgJ24nXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxSZWFsKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTYpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdHdyaXRlX1hudW0oY2VsbC52LCBvKTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRTaG9ydFJlYWwoZGF0YSkge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JTaG9ydENlbGwoZGF0YSk7XG5cdHZhciB2YWx1ZSA9IHBhcnNlX1hudW0oZGF0YSk7XG5cdHJldHVybiBbY2VsbCwgdmFsdWUsICduJ107XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRTaG9ydFJlYWwoY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1ZigxMik7XG5cdHdyaXRlX1hMU0JTaG9ydENlbGwobmNlbGwsIG8pO1xuXHR3cml0ZV9YbnVtKGNlbGwudiwgbyk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjMxNCBCcnRDZWxsUmsgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxSayhkYXRhKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdHZhciB2YWx1ZSA9IHBhcnNlX1JrTnVtYmVyKGRhdGEpO1xuXHRyZXR1cm4gW2NlbGwsIHZhbHVlLCAnbiddO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Q2VsbFJrKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTIpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdHdyaXRlX1JrTnVtYmVyKGNlbGwudiwgbyk7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0U2hvcnRSayhkYXRhKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQlNob3J0Q2VsbChkYXRhKTtcblx0dmFyIHZhbHVlID0gcGFyc2VfUmtOdW1iZXIoZGF0YSk7XG5cdHJldHVybiBbY2VsbCwgdmFsdWUsICduJ107XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRTaG9ydFJrKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOCk7XG5cdHdyaXRlX1hMU0JTaG9ydENlbGwobmNlbGwsIG8pO1xuXHR3cml0ZV9Sa051bWJlcihjZWxsLnYsIG8pO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMjMgQnJ0Q2VsbFJTdHJpbmcgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxSU3RyaW5nKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0dmFyIHZhbHVlID0gcGFyc2VfUmljaFN0cihkYXRhKTtcblx0cmV0dXJuIFtjZWxsLCB2YWx1ZSwgJ2lzJ107XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuMzE3IEJydENlbGxTdCAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0Q2VsbFN0KGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0dmFyIHZhbHVlID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEpO1xuXHRyZXR1cm4gW2NlbGwsIHZhbHVlLCAnc3RyJ107XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRDZWxsU3QoY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1ZigxMiArIDQgKiBjZWxsLnYubGVuZ3RoKTtcblx0d3JpdGVfWExTQkNlbGwobmNlbGwsIG8pO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoY2VsbC52LCBvKTtcblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cbmZ1bmN0aW9uIHBhcnNlX0JydFNob3J0U3QoZGF0YSkge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JTaG9ydENlbGwoZGF0YSk7XG5cdHZhciB2YWx1ZSA9IHBhcnNlX1hMV2lkZVN0cmluZyhkYXRhKTtcblx0cmV0dXJuIFtjZWxsLCB2YWx1ZSwgJ3N0ciddO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0U2hvcnRTdChjZWxsLCBuY2VsbCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDggKyA0ICogY2VsbC52Lmxlbmd0aCk7XG5cdHdyaXRlX1hMU0JTaG9ydENlbGwobmNlbGwsIG8pO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoY2VsbC52LCBvKTtcblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC42NTMgQnJ0Rm1sYUJvb2wgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEZtbGFCb29sKGRhdGEsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gZGF0YS5sICsgbGVuZ3RoO1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JDZWxsKGRhdGEpO1xuXHRjZWxsLnIgPSBvcHRzWychcm93J107XG5cdHZhciB2YWx1ZSA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIG8gPSBbY2VsbCwgdmFsdWUsICdiJ107XG5cdGlmKG9wdHMuY2VsbEZvcm11bGEpIHtcblx0XHRkYXRhLmwgKz0gMjtcblx0XHR2YXIgZm9ybXVsYSA9IHBhcnNlX1hMU0JDZWxsUGFyc2VkRm9ybXVsYShkYXRhLCBlbmQgLSBkYXRhLmwsIG9wdHMpO1xuXHRcdG9bM10gPSBzdHJpbmdpZnlfZm9ybXVsYShmb3JtdWxhLCBudWxsLypyYW5nZSovLCBjZWxsLCBvcHRzLnN1cGJvb2tzLCBvcHRzKTsvKiBUT0RPICovXG5cdH1cblx0ZWxzZSBkYXRhLmwgPSBlbmQ7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY1NCBCcnRGbWxhRXJyb3IgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEZtbGFFcnJvcihkYXRhLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGVuZCA9IGRhdGEubCArIGxlbmd0aDtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0Y2VsbC5yID0gb3B0c1snIXJvdyddO1xuXHR2YXIgdmFsdWUgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBvID0gW2NlbGwsIHZhbHVlLCAnZSddO1xuXHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0ZGF0YS5sICs9IDI7XG5cdFx0dmFyIGZvcm11bGEgPSBwYXJzZV9YTFNCQ2VsbFBhcnNlZEZvcm11bGEoZGF0YSwgZW5kIC0gZGF0YS5sLCBvcHRzKTtcblx0XHRvWzNdID0gc3RyaW5naWZ5X2Zvcm11bGEoZm9ybXVsYSwgbnVsbC8qcmFuZ2UqLywgY2VsbCwgb3B0cy5zdXBib29rcywgb3B0cyk7LyogVE9ETyAqL1xuXHR9XG5cdGVsc2UgZGF0YS5sID0gZW5kO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC42NTUgQnJ0Rm1sYU51bSAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0Rm1sYU51bShkYXRhLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGVuZCA9IGRhdGEubCArIGxlbmd0aDtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0Y2VsbC5yID0gb3B0c1snIXJvdyddO1xuXHR2YXIgdmFsdWUgPSBwYXJzZV9YbnVtKGRhdGEpO1xuXHR2YXIgbyA9IFtjZWxsLCB2YWx1ZSwgJ24nXTtcblx0aWYob3B0cy5jZWxsRm9ybXVsYSkge1xuXHRcdGRhdGEubCArPSAyO1xuXHRcdHZhciBmb3JtdWxhID0gcGFyc2VfWExTQkNlbGxQYXJzZWRGb3JtdWxhKGRhdGEsIGVuZCAtIGRhdGEubCwgb3B0cyk7XG5cdFx0b1szXSA9IHN0cmluZ2lmeV9mb3JtdWxhKGZvcm11bGEsIG51bGwvKnJhbmdlKi8sIGNlbGwsIG9wdHMuc3VwYm9va3MsIG9wdHMpOy8qIFRPRE8gKi9cblx0fVxuXHRlbHNlIGRhdGEubCA9IGVuZDtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNjU2IEJydEZtbGFTdHJpbmcgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEZtbGFTdHJpbmcoZGF0YSwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdGNlbGwuciA9IG9wdHNbJyFyb3cnXTtcblx0dmFyIHZhbHVlID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEpO1xuXHR2YXIgbyA9IFtjZWxsLCB2YWx1ZSwgJ3N0ciddO1xuXHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0ZGF0YS5sICs9IDI7XG5cdFx0dmFyIGZvcm11bGEgPSBwYXJzZV9YTFNCQ2VsbFBhcnNlZEZvcm11bGEoZGF0YSwgZW5kIC0gZGF0YS5sLCBvcHRzKTtcblx0XHRvWzNdID0gc3RyaW5naWZ5X2Zvcm11bGEoZm9ybXVsYSwgbnVsbC8qcmFuZ2UqLywgY2VsbCwgb3B0cy5zdXBib29rcywgb3B0cyk7LyogVE9ETyAqL1xuXHR9XG5cdGVsc2UgZGF0YS5sID0gZW5kO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC42ODIgQnJ0TWVyZ2VDZWxsICovXG52YXIgcGFyc2VfQnJ0TWVyZ2VDZWxsID0gcGFyc2VfVW5jaGVja2VkUmZYO1xudmFyIHdyaXRlX0JydE1lcmdlQ2VsbCA9IHdyaXRlX1VuY2hlY2tlZFJmWDtcbi8qIFtNUy1YTFNCXSAyLjQuMTA3IEJydEJlZ2luTWVyZ2VDZWxscyAqL1xuZnVuY3Rpb24gd3JpdGVfQnJ0QmVnaW5NZXJnZUNlbGxzKGNudCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDQpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIGNudCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY2MiBCcnRITGluayAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0SExpbmsoZGF0YSwgbGVuZ3RoLyo6Oiwgb3B0cyovKSB7XG5cdHZhciBlbmQgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdHZhciByZnggPSBwYXJzZV9VbmNoZWNrZWRSZlgoZGF0YSwgMTYpO1xuXHR2YXIgcmVsSWQgPSBwYXJzZV9YTE51bGxhYmxlV2lkZVN0cmluZyhkYXRhKTtcblx0dmFyIGxvYyA9IHBhcnNlX1hMV2lkZVN0cmluZyhkYXRhKTtcblx0dmFyIHRvb2x0aXAgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSk7XG5cdHZhciBkaXNwbGF5ID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEpO1xuXHRkYXRhLmwgPSBlbmQ7XG5cdHZhciBvID0gKHtyZng6cmZ4LCByZWxJZDpyZWxJZCwgbG9jOmxvYywgZGlzcGxheTpkaXNwbGF5fS8qOmFueSovKTtcblx0aWYodG9vbHRpcCkgby5Ub29sdGlwID0gdG9vbHRpcDtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRITGluayhsLCBySWQpIHtcblx0dmFyIG8gPSBuZXdfYnVmKDUwKzQqKGxbMV0uVGFyZ2V0Lmxlbmd0aCArIChsWzFdLlRvb2x0aXAgfHwgXCJcIikubGVuZ3RoKSk7XG5cdHdyaXRlX1VuY2hlY2tlZFJmWCh7czpkZWNvZGVfY2VsbChsWzBdKSwgZTpkZWNvZGVfY2VsbChsWzBdKX0sIG8pO1xuXHR3cml0ZV9SZWxJRChcInJJZFwiICsgcklkLCBvKTtcblx0dmFyIGxvY2lkeCA9IGxbMV0uVGFyZ2V0LmluZGV4T2YoXCIjXCIpO1xuXHR2YXIgbG9jID0gbG9jaWR4ID09IC0xID8gXCJcIiA6IGxbMV0uVGFyZ2V0LnNsaWNlKGxvY2lkeCsxKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKGxvYyB8fCBcIlwiLCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKGxbMV0uVG9vbHRpcCB8fCBcIlwiLCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKFwiXCIsIG8pO1xuXHRyZXR1cm4gby5zbGljZSgwLCBvLmwpO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY5MiBCcnRQYW5lICovXG5mdW5jdGlvbiBwYXJzZV9CcnRQYW5lKC8qZGF0YSwgbGVuZ3RoLCBvcHRzKi8pIHtcbn1cblxuLyogW01TLVhMU0JdIDIuNC42IEJydEFyckZtbGEgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEFyckZtbGEoZGF0YSwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdHZhciByZnggPSBwYXJzZV9SZlgoZGF0YSwgMTYpO1xuXHR2YXIgZkFsd2F5c0NhbGMgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBvID0gW3JmeF07IG9bMl0gPSBmQWx3YXlzQ2FsYztcblx0aWYob3B0cy5jZWxsRm9ybXVsYSkge1xuXHRcdHZhciBmb3JtdWxhID0gcGFyc2VfWExTQkFycmF5UGFyc2VkRm9ybXVsYShkYXRhLCBlbmQgLSBkYXRhLmwsIG9wdHMpO1xuXHRcdG9bMV0gPSBmb3JtdWxhO1xuXHR9IGVsc2UgZGF0YS5sID0gZW5kO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC43NTAgQnJ0U2hyRm1sYSAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0U2hyRm1sYShkYXRhLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGVuZCA9IGRhdGEubCArIGxlbmd0aDtcblx0dmFyIHJmeCA9IHBhcnNlX1VuY2hlY2tlZFJmWChkYXRhLCAxNik7XG5cdHZhciBvID0gW3JmeF07XG5cdGlmKG9wdHMuY2VsbEZvcm11bGEpIHtcblx0XHR2YXIgZm9ybXVsYSA9IHBhcnNlX1hMU0JTaGFyZWRQYXJzZWRGb3JtdWxhKGRhdGEsIGVuZCAtIGRhdGEubCwgb3B0cyk7XG5cdFx0b1sxXSA9IGZvcm11bGE7XG5cdFx0ZGF0YS5sID0gZW5kO1xuXHR9IGVsc2UgZGF0YS5sID0gZW5kO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMjMgQnJ0Q29sSW5mbyAqL1xuLyogVE9ETzogb25jZSBYTFMgQ29sSW5mbyBpcyBzZXQsIGNvbWJpbmUgdGhlIGZ1bmN0aW9ucyAqL1xuZnVuY3Rpb24gd3JpdGVfQnJ0Q29sSW5mbyhDLyo6bnVtYmVyKi8sIGNvbCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDE4KTtcblx0dmFyIHAgPSBjb2xfb2JqX3coQywgY29sKTtcblx0by53cml0ZV9zaGlmdCgtNCwgQyk7XG5cdG8ud3JpdGVfc2hpZnQoLTQsIEMpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIChwLndpZHRoIHx8IDEwKSAqIDI1Nik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMC8qaXhmZSovKTsgLy8gc3R5bGVcblx0dmFyIGZsYWdzID0gMDtcblx0aWYoY29sLmhpZGRlbikgZmxhZ3MgfD0gMHgwMTtcblx0aWYodHlwZW9mIHAud2lkdGggPT0gJ251bWJlcicpIGZsYWdzIHw9IDB4MDI7XG5cdGlmKGNvbC5sZXZlbCkgZmxhZ3MgfD0gKGNvbC5sZXZlbCA8PCA4KTtcblx0by53cml0ZV9zaGlmdCgyLCBmbGFncyk7IC8vIGJpdCBmbGFnXG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY3OCBCcnRNYXJnaW5zICovXG52YXIgQnJ0TWFyZ2luS2V5cyA9IFtcImxlZnRcIixcInJpZ2h0XCIsXCJ0b3BcIixcImJvdHRvbVwiLFwiaGVhZGVyXCIsXCJmb290ZXJcIl07XG5mdW5jdGlvbiBwYXJzZV9CcnRNYXJnaW5zKGRhdGEvKjo6LCBsZW5ndGgsIG9wdHMqLykvKjpNYXJnaW5zKi8ge1xuXHR2YXIgbWFyZ2lucyA9ICh7fS8qOmFueSovKTtcblx0QnJ0TWFyZ2luS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsgbWFyZ2luc1trXSA9IHBhcnNlX1hudW0oZGF0YSwgOCk7IH0pO1xuXHRyZXR1cm4gbWFyZ2lucztcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydE1hcmdpbnMobWFyZ2lucy8qOk1hcmdpbnMqLywgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDYqOCk7XG5cdGRlZmF1bHRfbWFyZ2lucyhtYXJnaW5zKTtcblx0QnJ0TWFyZ2luS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsgd3JpdGVfWG51bSgobWFyZ2lucy8qOmFueSovKVtrXSwgbyk7IH0pO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4yOTkgQnJ0QmVnaW5Xc1ZpZXcgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEJlZ2luV3NWaWV3KGRhdGEvKjo6LCBsZW5ndGgsIG9wdHMqLykge1xuXHR2YXIgZiA9IGRhdGEucmVhZF9zaGlmdCgyKTtcblx0ZGF0YS5sICs9IDI4O1xuXHRyZXR1cm4geyBSVEw6IGYgJiAweDIwIH07XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRCZWdpbldzVmlldyh3cywgV29ya2Jvb2ssIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1ZigzMCk7XG5cdHZhciBmID0gMHgzOWM7XG5cdGlmKCgoKFdvcmtib29rfHx7fSkuVmlld3N8fFtdKVswXXx8e30pLlJUTCkgZiB8PSAweDIwO1xuXHRvLndyaXRlX3NoaWZ0KDIsIGYpOyAvLyBiaXQgZmxhZ1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvLyB2aWV3IGZpcnN0IHJvd1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvLyB2aWV3IGZpcnN0IGNvbFxuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvLyBncmlkbGluZSBjb2xvciBJQ1Zcblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAxMDApOyAvLyB6b29tIHNjYWxlXG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7IC8vIHdvcmtib29rIHZpZXcgaWRcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuMzA5IEJydENlbGxJZ25vcmVFQyAqL1xuZnVuY3Rpb24gd3JpdGVfQnJ0Q2VsbElnbm9yZUVDKHJlZikge1xuXHR2YXIgbyA9IG5ld19idWYoMjQpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDQpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDEpO1xuXHR3cml0ZV9VbmNoZWNrZWRSZlgocmVmLCBvKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNzQ4IEJydFNoZWV0UHJvdGVjdGlvbiAqL1xuZnVuY3Rpb24gd3JpdGVfQnJ0U2hlZXRQcm90ZWN0aW9uKHNwLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTYqNCsyKTtcblx0by53cml0ZV9zaGlmdCgyLCBzcC5wYXNzd29yZCA/IGNyeXB0b19DcmVhdGVQYXNzd29yZFZlcmlmaWVyX01ldGhvZDEoc3AucGFzc3dvcmQpIDogMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMSk7IC8vIHRoaXMgcmVjb3JkIHNob3VsZCBub3QgYmUgd3JpdHRlbiBpZiBubyBwcm90ZWN0aW9uXG5cdFtcblx0XHRbXCJvYmplY3RzXCIsICAgICAgICAgICAgIGZhbHNlXSwgLy8gZk9iamVjdHNcblx0XHRbXCJzY2VuYXJpb3NcIiwgICAgICAgICAgIGZhbHNlXSwgLy8gZlNjZW5hcmlvc1xuXHRcdFtcImZvcm1hdENlbGxzXCIsICAgICAgICAgIHRydWVdLCAvLyBmRm9ybWF0Q2VsbHNcblx0XHRbXCJmb3JtYXRDb2x1bW5zXCIsICAgICAgICB0cnVlXSwgLy8gZkZvcm1hdENvbHVtbnNcblx0XHRbXCJmb3JtYXRSb3dzXCIsICAgICAgICAgICB0cnVlXSwgLy8gZkZvcm1hdFJvd3Ncblx0XHRbXCJpbnNlcnRDb2x1bW5zXCIsICAgICAgICB0cnVlXSwgLy8gZkluc2VydENvbHVtbnNcblx0XHRbXCJpbnNlcnRSb3dzXCIsICAgICAgICAgICB0cnVlXSwgLy8gZkluc2VydFJvd3Ncblx0XHRbXCJpbnNlcnRIeXBlcmxpbmtzXCIsICAgICB0cnVlXSwgLy8gZkluc2VydEh5cGVybGlua3Ncblx0XHRbXCJkZWxldGVDb2x1bW5zXCIsICAgICAgICB0cnVlXSwgLy8gZkRlbGV0ZUNvbHVtbnNcblx0XHRbXCJkZWxldGVSb3dzXCIsICAgICAgICAgICB0cnVlXSwgLy8gZkRlbGV0ZVJvd3Ncblx0XHRbXCJzZWxlY3RMb2NrZWRDZWxsc1wiLCAgIGZhbHNlXSwgLy8gZlNlbExvY2tlZENlbGxzXG5cdFx0W1wic29ydFwiLCAgICAgICAgICAgICAgICAgdHJ1ZV0sIC8vIGZTb3J0XG5cdFx0W1wiYXV0b0ZpbHRlclwiLCAgICAgICAgICAgdHJ1ZV0sIC8vIGZBdXRvRmlsdGVyXG5cdFx0W1wicGl2b3RUYWJsZXNcIiwgICAgICAgICAgdHJ1ZV0sIC8vIGZQaXZvdFRhYmxlc1xuXHRcdFtcInNlbGVjdFVubG9ja2VkQ2VsbHNcIiwgZmFsc2VdICAvLyBmU2VsVW5sb2NrZWRDZWxsc1xuXHRdLmZvckVhY2goZnVuY3Rpb24obikge1xuXHRcdC8qOjogaWYobyA9PSBudWxsKSB0aHJvdyBcInVucmVhY2hhYmxlXCI7ICovXG5cdFx0aWYoblsxXSkgby53cml0ZV9zaGlmdCg0LCBzcFtuWzBdXSAhPSBudWxsICYmICFzcFtuWzBdXSA/IDEgOiAwKTtcblx0XHRlbHNlICAgICAgby53cml0ZV9zaGlmdCg0LCBzcFtuWzBdXSAhPSBudWxsICYmIHNwW25bMF1dID8gMCA6IDEpO1xuXHR9KTtcblx0cmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIHBhcnNlX0JydERWYWwoLypkYXRhLCBsZW5ndGgsIG9wdHMqLykge1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0RFZhbDE0KC8qZGF0YSwgbGVuZ3RoLCBvcHRzKi8pIHtcbn1cbi8qIFtNUy1YTFNCXSAyLjEuNy42MSBXb3Jrc2hlZXQgKi9cbmZ1bmN0aW9uIHBhcnNlX3dzX2JpbihkYXRhLCBfb3B0cywgaWR4LCByZWxzLCB3Yi8qOldCV0JQcm9wcyovLCB0aGVtZXMsIHN0eWxlcykvKjpXb3Jrc2hlZXQqLyB7XG5cdGlmKCFkYXRhKSByZXR1cm4gZGF0YTtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0aWYoIXJlbHMpIHJlbHMgPSB7JyFpZCc6e319O1xuXHRpZihERU5TRSAhPSBudWxsICYmIG9wdHMuZGVuc2UgPT0gbnVsbCkgb3B0cy5kZW5zZSA9IERFTlNFO1xuXHR2YXIgcy8qOldvcmtzaGVldCovID0gKG9wdHMuZGVuc2UgPyBbXSA6IHt9KTtcblxuXHR2YXIgcmVmO1xuXHR2YXIgcmVmZ3Vlc3MgPSB7czoge3I6MjAwMDAwMCwgYzoyMDAwMDAwfSwgZToge3I6MCwgYzowfSB9O1xuXG5cdHZhciBzdGF0ZS8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHR2YXIgcGFzcyA9IGZhbHNlLCBlbmQgPSBmYWxzZTtcblx0dmFyIHJvdywgcCwgY2YsIFIsIEMsIGFkZHIsIHNzdHIsIHJyLCBjZWxsLyo6Q2VsbCovO1xuXHR2YXIgbWVyZ2VzLyo6QXJyYXk8UmFuZ2U+Ki8gPSBbXTtcblx0b3B0cy5iaWZmID0gMTI7XG5cdG9wdHNbJyFyb3cnXSA9IDA7XG5cblx0dmFyIGFpID0gMCwgYWYgPSBmYWxzZTtcblxuXHR2YXIgYXJyYXlmLyo6QXJyYXk8W1JhbmdlLCBzdHJpbmddPiovID0gW107XG5cdHZhciBzaGFyZWRmID0ge307XG5cdHZhciBzdXBib29rcyA9IG9wdHMuc3VwYm9va3MgfHwgLyo6OigqL3diLyo6OiA6YW55KSovLnN1cGJvb2tzIHx8IChbW11dLyo6YW55Ki8pO1xuXHRzdXBib29rcy5zaGFyZWRmID0gc2hhcmVkZjtcblx0c3VwYm9va3MuYXJyYXlmID0gYXJyYXlmO1xuXHRzdXBib29rcy5TaGVldE5hbWVzID0gd2IuU2hlZXROYW1lcyB8fCB3Yi5TaGVldHMubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgubmFtZTsgfSk7XG5cdGlmKCFvcHRzLnN1cGJvb2tzKSB7XG5cdFx0b3B0cy5zdXBib29rcyA9IHN1cGJvb2tzO1xuXHRcdGlmKHdiLk5hbWVzKSBmb3IodmFyIGkgPSAwOyBpIDwgd2IuTmFtZXMubGVuZ3RoOyArK2kpIHN1cGJvb2tzWzBdW2krMV0gPSB3Yi5OYW1lc1tpXTtcblx0fVxuXG5cdHZhciBjb2xpbmZvLyo6QXJyYXk8Q29sSW5mbz4qLyA9IFtdLCByb3dpbmZvLyo6QXJyYXk8Um93SW5mbz4qLyA9IFtdO1xuXHR2YXIgc2VlbmNvbCA9IGZhbHNlO1xuXG5cdFhMU0JSZWNvcmRFbnVtWzB4MDAxMF0gPSB7IG46XCJCcnRTaG9ydFJlYWxcIiwgZjpwYXJzZV9CcnRTaG9ydFJlYWwgfTtcblxuXHR2YXIgY20sIHZtO1xuXG5cdHJlY29yZGhvcHBlcihkYXRhLCBmdW5jdGlvbiB3c19wYXJzZSh2YWwsIFJSLCBSVCkge1xuXHRcdGlmKGVuZCkgcmV0dXJuO1xuXHRcdHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAweDAwOTQ6IC8qICdCcnRXc0RpbScgKi9cblx0XHRcdFx0cmVmID0gdmFsOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDAwOiAvKiAnQnJ0Um93SGRyJyAqL1xuXHRcdFx0XHRyb3cgPSB2YWw7XG5cdFx0XHRcdGlmKG9wdHMuc2hlZXRSb3dzICYmIG9wdHMuc2hlZXRSb3dzIDw9IHJvdy5yKSBlbmQ9dHJ1ZTtcblx0XHRcdFx0cnIgPSBlbmNvZGVfcm93KFIgPSByb3cucik7XG5cdFx0XHRcdG9wdHNbJyFyb3cnXSA9IHJvdy5yO1xuXHRcdFx0XHRpZih2YWwuaGlkZGVuIHx8IHZhbC5ocHQgfHwgdmFsLmxldmVsICE9IG51bGwpIHtcblx0XHRcdFx0XHRpZih2YWwuaHB0KSB2YWwuaHB4ID0gcHQycHgodmFsLmhwdCk7XG5cdFx0XHRcdFx0cm93aW5mb1t2YWwucl0gPSB2YWw7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDAyOiAvKiAnQnJ0Q2VsbFJrJyAqL1xuXHRcdFx0Y2FzZSAweDAwMDM6IC8qICdCcnRDZWxsRXJyb3InICovXG5cdFx0XHRjYXNlIDB4MDAwNDogLyogJ0JydENlbGxCb29sJyAqL1xuXHRcdFx0Y2FzZSAweDAwMDU6IC8qICdCcnRDZWxsUmVhbCcgKi9cblx0XHRcdGNhc2UgMHgwMDA2OiAvKiAnQnJ0Q2VsbFN0JyAqL1xuXHRcdFx0Y2FzZSAweDAwMDc6IC8qICdCcnRDZWxsSXNzdCcgKi9cblx0XHRcdGNhc2UgMHgwMDA4OiAvKiAnQnJ0Rm1sYVN0cmluZycgKi9cblx0XHRcdGNhc2UgMHgwMDA5OiAvKiAnQnJ0Rm1sYU51bScgKi9cblx0XHRcdGNhc2UgMHgwMDBBOiAvKiAnQnJ0Rm1sYUJvb2wnICovXG5cdFx0XHRjYXNlIDB4MDAwQjogLyogJ0JydEZtbGFFcnJvcicgKi9cblx0XHRcdGNhc2UgMHgwMDBEOiAvKiAnQnJ0U2hvcnRSaycgKi9cblx0XHRcdGNhc2UgMHgwMDBFOiAvKiAnQnJ0U2hvcnRFcnJvcicgKi9cblx0XHRcdGNhc2UgMHgwMDBGOiAvKiAnQnJ0U2hvcnRCb29sJyAqL1xuXHRcdFx0Y2FzZSAweDAwMTA6IC8qICdCcnRTaG9ydFJlYWwnICovXG5cdFx0XHRjYXNlIDB4MDAxMTogLyogJ0JydFNob3J0U3QnICovXG5cdFx0XHRjYXNlIDB4MDAxMjogLyogJ0JydFNob3J0SXNzdCcgKi9cblx0XHRcdGNhc2UgMHgwMDNFOiAvKiAnQnJ0Q2VsbFJTdHJpbmcnICovXG5cdFx0XHRcdHAgPSAoe3Q6dmFsWzJdfS8qOmFueSovKTtcblx0XHRcdFx0c3dpdGNoKHZhbFsyXSkge1xuXHRcdFx0XHRcdGNhc2UgJ24nOiBwLnYgPSB2YWxbMV07IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3MnOiBzc3RyID0gc3Ryc1t2YWxbMV1dOyBwLnYgPSBzc3RyLnQ7IHAuciA9IHNzdHIucjsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYic6IHAudiA9IHZhbFsxXSA/IHRydWUgOiBmYWxzZTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZSc6IHAudiA9IHZhbFsxXTsgaWYob3B0cy5jZWxsVGV4dCAhPT0gZmFsc2UpIHAudyA9IEJFcnJbcC52XTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3RyJzogcC50ID0gJ3MnOyBwLnYgPSB2YWxbMV07IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2lzJzogcC50ID0gJ3MnOyBwLnYgPSB2YWxbMV0udDsgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoKGNmID0gc3R5bGVzLkNlbGxYZlt2YWxbMF0uaVN0eWxlUmVmXSkpIHNhZmVfZm9ybWF0KHAsY2YubnVtRm10SWQsbnVsbCxvcHRzLCB0aGVtZXMsIHN0eWxlcyk7XG5cdFx0XHRcdEMgPSB2YWxbMF0uYyA9PSAtMSA/IEMgKyAxIDogdmFsWzBdLmM7XG5cdFx0XHRcdGlmKG9wdHMuZGVuc2UpIHsgaWYoIXNbUl0pIHNbUl0gPSBbXTsgc1tSXVtDXSA9IHA7IH1cblx0XHRcdFx0ZWxzZSBzW2VuY29kZV9jb2woQykgKyBycl0gPSBwO1xuXHRcdFx0XHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0XHRcdFx0YWYgPSBmYWxzZTtcblx0XHRcdFx0XHRmb3IoYWkgPSAwOyBhaSA8IGFycmF5Zi5sZW5ndGg7ICsrYWkpIHtcblx0XHRcdFx0XHRcdHZhciBhaWkgPSBhcnJheWZbYWldO1xuXHRcdFx0XHRcdFx0aWYocm93LnIgPj0gYWlpWzBdLnMuciAmJiByb3cuciA8PSBhaWlbMF0uZS5yKVxuXHRcdFx0XHRcdFx0XHRpZihDID49IGFpaVswXS5zLmMgJiYgQyA8PSBhaWlbMF0uZS5jKSB7XG5cdFx0XHRcdFx0XHRcdFx0cC5GID0gZW5jb2RlX3JhbmdlKGFpaVswXSk7IGFmID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZighYWYgJiYgdmFsLmxlbmd0aCA+IDMpIHAuZiA9IHZhbFszXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmKHJlZmd1ZXNzLnMuciA+IHJvdy5yKSByZWZndWVzcy5zLnIgPSByb3cucjtcblx0XHRcdFx0aWYocmVmZ3Vlc3Mucy5jID4gQykgcmVmZ3Vlc3Mucy5jID0gQztcblx0XHRcdFx0aWYocmVmZ3Vlc3MuZS5yIDwgcm93LnIpIHJlZmd1ZXNzLmUuciA9IHJvdy5yO1xuXHRcdFx0XHRpZihyZWZndWVzcy5lLmMgPCBDKSByZWZndWVzcy5lLmMgPSBDO1xuXHRcdFx0XHRpZihvcHRzLmNlbGxEYXRlcyAmJiBjZiAmJiBwLnQgPT0gJ24nICYmIGZtdF9pc19kYXRlKHRhYmxlX2ZtdFtjZi5udW1GbXRJZF0pKSB7XG5cdFx0XHRcdFx0dmFyIF9kID0gU1NGX3BhcnNlX2RhdGVfY29kZShwLnYpOyBpZihfZCkgeyBwLnQgPSAnZCc7IHAudiA9IG5ldyBEYXRlKF9kLnksIF9kLm0tMSxfZC5kLF9kLkgsX2QuTSxfZC5TLF9kLnUpOyB9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoY20pIHtcblx0XHRcdFx0XHRpZihjbS50eXBlID09ICdYTERBUFInKSBwLkQgPSB0cnVlO1xuXHRcdFx0XHRcdGNtID0gdm9pZCAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHZtKSB2bSA9IHZvaWQgMDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDAxOiAvKiAnQnJ0Q2VsbEJsYW5rJyAqL1xuXHRcdFx0Y2FzZSAweDAwMEM6IC8qICdCcnRTaG9ydEJsYW5rJyAqL1xuXHRcdFx0XHRpZighb3B0cy5zaGVldFN0dWJzIHx8IHBhc3MpIGJyZWFrO1xuXHRcdFx0XHRwID0gKHt0Oid6Jyx2OnZvaWQgMH0vKjphbnkqLyk7XG5cdFx0XHRcdEMgPSB2YWxbMF0uYyA9PSAtMSA/IEMgKyAxIDogdmFsWzBdLmM7XG5cdFx0XHRcdGlmKG9wdHMuZGVuc2UpIHsgaWYoIXNbUl0pIHNbUl0gPSBbXTsgc1tSXVtDXSA9IHA7IH1cblx0XHRcdFx0ZWxzZSBzW2VuY29kZV9jb2woQykgKyBycl0gPSBwO1xuXHRcdFx0XHRpZihyZWZndWVzcy5zLnIgPiByb3cucikgcmVmZ3Vlc3Mucy5yID0gcm93LnI7XG5cdFx0XHRcdGlmKHJlZmd1ZXNzLnMuYyA+IEMpIHJlZmd1ZXNzLnMuYyA9IEM7XG5cdFx0XHRcdGlmKHJlZmd1ZXNzLmUuciA8IHJvdy5yKSByZWZndWVzcy5lLnIgPSByb3cucjtcblx0XHRcdFx0aWYocmVmZ3Vlc3MuZS5jIDwgQykgcmVmZ3Vlc3MuZS5jID0gQztcblx0XHRcdFx0aWYoY20pIHtcblx0XHRcdFx0XHRpZihjbS50eXBlID09ICdYTERBUFInKSBwLkQgPSB0cnVlO1xuXHRcdFx0XHRcdGNtID0gdm9pZCAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHZtKSB2bSA9IHZvaWQgMDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMEIwOiAvKiAnQnJ0TWVyZ2VDZWxsJyAqL1xuXHRcdFx0XHRtZXJnZXMucHVzaCh2YWwpOyBicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMzE6IHsgLyogJ0JydENlbGxNZXRhJyAqL1xuXHRcdFx0XHRjbSA9ICgob3B0cy54bG1ldGF8fHt9KS5DZWxsfHxbXSlbdmFsLTFdO1xuXHRcdFx0fSBicmVhaztcblxuXHRcdFx0Y2FzZSAweDAxRUU6IC8qICdCcnRITGluaycgKi9cblx0XHRcdFx0dmFyIHJlbCA9IHJlbHNbJyFpZCddW3ZhbC5yZWxJZF07XG5cdFx0XHRcdGlmKHJlbCkge1xuXHRcdFx0XHRcdHZhbC5UYXJnZXQgPSByZWwuVGFyZ2V0O1xuXHRcdFx0XHRcdGlmKHZhbC5sb2MpIHZhbC5UYXJnZXQgKz0gXCIjXCIrdmFsLmxvYztcblx0XHRcdFx0XHR2YWwuUmVsID0gcmVsO1xuXHRcdFx0XHR9IGVsc2UgaWYodmFsLnJlbElkID09ICcnKSB7XG5cdFx0XHRcdFx0dmFsLlRhcmdldCA9IFwiI1wiICsgdmFsLmxvYztcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IoUj12YWwucmZ4LnMucjtSPD12YWwucmZ4LmUucjsrK1IpIGZvcihDPXZhbC5yZngucy5jO0M8PXZhbC5yZnguZS5jOysrQykge1xuXHRcdFx0XHRcdGlmKG9wdHMuZGVuc2UpIHtcblx0XHRcdFx0XHRcdGlmKCFzW1JdKSBzW1JdID0gW107XG5cdFx0XHRcdFx0XHRpZighc1tSXVtDXSkgc1tSXVtDXSA9IHt0Oid6Jyx2OnVuZGVmaW5lZH07XG5cdFx0XHRcdFx0XHRzW1JdW0NdLmwgPSB2YWw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFkZHIgPSBlbmNvZGVfY2VsbCh7YzpDLHI6Un0pO1xuXHRcdFx0XHRcdFx0aWYoIXNbYWRkcl0pIHNbYWRkcl0gPSB7dDoneicsdjp1bmRlZmluZWR9O1xuXHRcdFx0XHRcdFx0c1thZGRyXS5sID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAxQUE6IC8qICdCcnRBcnJGbWxhJyAqL1xuXHRcdFx0XHRpZighb3B0cy5jZWxsRm9ybXVsYSkgYnJlYWs7XG5cdFx0XHRcdGFycmF5Zi5wdXNoKHZhbCk7XG5cdFx0XHRcdGNlbGwgPSAoKG9wdHMuZGVuc2UgPyBzW1JdW0NdIDogc1tlbmNvZGVfY29sKEMpICsgcnJdKS8qOmFueSovKTtcblx0XHRcdFx0Y2VsbC5mID0gc3RyaW5naWZ5X2Zvcm11bGEodmFsWzFdLCByZWZndWVzcywge3I6cm93LnIsIGM6Q30sIHN1cGJvb2tzLCBvcHRzKTtcblx0XHRcdFx0Y2VsbC5GID0gZW5jb2RlX3JhbmdlKHZhbFswXSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAxQUI6IC8qICdCcnRTaHJGbWxhJyAqL1xuXHRcdFx0XHRpZighb3B0cy5jZWxsRm9ybXVsYSkgYnJlYWs7XG5cdFx0XHRcdHNoYXJlZGZbZW5jb2RlX2NlbGwodmFsWzBdLnMpXSA9IHZhbFsxXTtcblx0XHRcdFx0Y2VsbCA9IChvcHRzLmRlbnNlID8gc1tSXVtDXSA6IHNbZW5jb2RlX2NvbChDKSArIHJyXSk7XG5cdFx0XHRcdGNlbGwuZiA9IHN0cmluZ2lmeV9mb3JtdWxhKHZhbFsxXSwgcmVmZ3Vlc3MsIHtyOnJvdy5yLCBjOkN9LCBzdXBib29rcywgb3B0cyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiBpZGVudGljYWwgdG8gJ0NvbEluZm8nIGluIFhMUyAqL1xuXHRcdFx0Y2FzZSAweDAwM0M6IC8qICdCcnRDb2xJbmZvJyAqL1xuXHRcdFx0XHRpZighb3B0cy5jZWxsU3R5bGVzKSBicmVhaztcblx0XHRcdFx0d2hpbGUodmFsLmUgPj0gdmFsLnMpIHtcblx0XHRcdFx0XHRjb2xpbmZvW3ZhbC5lLS1dID0geyB3aWR0aDogdmFsLncvMjU2LCBoaWRkZW46ICEhKHZhbC5mbGFncyAmIDB4MDEpLCBsZXZlbDogdmFsLmxldmVsIH07XG5cdFx0XHRcdFx0aWYoIXNlZW5jb2wpIHsgc2VlbmNvbCA9IHRydWU7IGZpbmRfbWR3X2NvbHcodmFsLncvMjU2KTsgfVxuXHRcdFx0XHRcdHByb2Nlc3NfY29sKGNvbGluZm9bdmFsLmUrMV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDBBMTogLyogJ0JydEJlZ2luQUZpbHRlcicgKi9cblx0XHRcdFx0c1snIWF1dG9maWx0ZXInXSA9IHsgcmVmOmVuY29kZV9yYW5nZSh2YWwpIH07XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDFEQzogLyogJ0JydE1hcmdpbnMnICovXG5cdFx0XHRcdHNbJyFtYXJnaW5zJ10gPSB2YWw7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDA5MzogLyogJ0JydFdzUHJvcCcgKi9cblx0XHRcdFx0aWYoIXdiLlNoZWV0c1tpZHhdKSB3Yi5TaGVldHNbaWR4XSA9IHt9O1xuXHRcdFx0XHRpZih2YWwubmFtZSkgd2IuU2hlZXRzW2lkeF0uQ29kZU5hbWUgPSB2YWwubmFtZTtcblx0XHRcdFx0aWYodmFsLmFib3ZlIHx8IHZhbC5sZWZ0KSBzWychb3V0bGluZSddID0geyBhYm92ZTogdmFsLmFib3ZlLCBsZWZ0OiB2YWwubGVmdCB9O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwODk6IC8qICdCcnRCZWdpbldzVmlldycgKi9cblx0XHRcdFx0aWYoIXdiLlZpZXdzKSB3Yi5WaWV3cyA9IFt7fV07XG5cdFx0XHRcdGlmKCF3Yi5WaWV3c1swXSkgd2IuVmlld3NbMF0gPSB7fTtcblx0XHRcdFx0aWYodmFsLlJUTCkgd2IuVmlld3NbMF0uUlRMID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMUU1OiAvKiAnQnJ0V3NGbXRJbmZvJyAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwNDA6IC8qICdCcnREVmFsJyAqL1xuXHRcdFx0Y2FzZSAweDA0MUQ6IC8qICdCcnREVmFsMTQnICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDA5NzogLyogJ0JydFBhbmUnICovXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwOTg6IC8qICdCcnRTZWwnICovXG5cdFx0XHRjYXNlIDB4MDBBRjogLyogJ0JydEFGaWx0ZXJEYXRlR3JvdXBJdGVtJyAqL1xuXHRcdFx0Y2FzZSAweDAyODQ6IC8qICdCcnRBY3RpdmVYJyAqL1xuXHRcdFx0Y2FzZSAweDAyNzE6IC8qICdCcnRCaWdOYW1lJyAqL1xuXHRcdFx0Y2FzZSAweDAyMzI6IC8qICdCcnRCa0hpbScgKi9cblx0XHRcdGNhc2UgMHgwMThDOiAvKiAnQnJ0QnJrJyAqL1xuXHRcdFx0Y2FzZSAweDA0NTg6IC8qICdCcnRDRkljb24nICovXG5cdFx0XHRjYXNlIDB4MDQ3QTogLyogJ0JydENGUnVsZUV4dCcgKi9cblx0XHRcdGNhc2UgMHgwMUQ3OiAvKiAnQnJ0Q0ZWTycgKi9cblx0XHRcdGNhc2UgMHgwNDFBOiAvKiAnQnJ0Q0ZWTzE0JyAqL1xuXHRcdFx0Y2FzZSAweDAyODk6IC8qICdCcnRDZWxsSWdub3JlRUMnICovXG5cdFx0XHRjYXNlIDB4MDQ1MTogLyogJ0JydENlbGxJZ25vcmVFQzE0JyAqL1xuXHRcdFx0Y2FzZSAweDAyNEQ6IC8qICdCcnRDZWxsU21hcnRUYWdQcm9wZXJ0eScgKi9cblx0XHRcdGNhc2UgMHgwMjVGOiAvKiAnQnJ0Q2VsbFdhdGNoJyAqL1xuXHRcdFx0Y2FzZSAweDAyMzQ6IC8qICdCcnRDb2xvcicgKi9cblx0XHRcdGNhc2UgMHgwNDFGOiAvKiAnQnJ0Q29sb3IxNCcgKi9cblx0XHRcdGNhc2UgMHgwMEE4OiAvKiAnQnJ0Q29sb3JGaWx0ZXInICovXG5cdFx0XHRjYXNlIDB4MDBBRTogLyogJ0JydEN1c3RvbUZpbHRlcicgKi9cblx0XHRcdGNhc2UgMHgwNDlDOiAvKiAnQnJ0Q3VzdG9tRmlsdGVyMTQnICovXG5cdFx0XHRjYXNlIDB4MDFGMzogLyogJ0JydERSZWYnICovXG5cdFx0XHRjYXNlIDB4MDFGQjogLyogJ0JydERYRicgKi9cblx0XHRcdGNhc2UgMHgwMjI2OiAvKiAnQnJ0RHJhd2luZycgKi9cblx0XHRcdGNhc2UgMHgwMEFCOiAvKiAnQnJ0RHluYW1pY0ZpbHRlcicgKi9cblx0XHRcdGNhc2UgMHgwMEE3OiAvKiAnQnJ0RmlsdGVyJyAqL1xuXHRcdFx0Y2FzZSAweDA0OTk6IC8qICdCcnRGaWx0ZXIxNCcgKi9cblx0XHRcdGNhc2UgMHgwMEE5OiAvKiAnQnJ0SWNvbkZpbHRlcicgKi9cblx0XHRcdGNhc2UgMHgwNDlEOiAvKiAnQnJ0SWNvbkZpbHRlcjE0JyAqL1xuXHRcdFx0Y2FzZSAweDAyMjc6IC8qICdCcnRMZWdhY3lEcmF3aW5nJyAqL1xuXHRcdFx0Y2FzZSAweDAyMjg6IC8qICdCcnRMZWdhY3lEcmF3aW5nSEYnICovXG5cdFx0XHRjYXNlIDB4MDI5NTogLyogJ0JydExpc3RQYXJ0JyAqL1xuXHRcdFx0Y2FzZSAweDAyN0Y6IC8qICdCcnRPbGVPYmplY3QnICovXG5cdFx0XHRjYXNlIDB4MDFERTogLyogJ0JydFBhZ2VTZXR1cCcgKi9cblx0XHRcdGNhc2UgMHgwMjE5OiAvKiAnQnJ0UGhvbmV0aWNJbmZvJyAqL1xuXHRcdFx0Y2FzZSAweDAxREQ6IC8qICdCcnRQcmludE9wdGlvbnMnICovXG5cdFx0XHRjYXNlIDB4MDIxODogLyogJ0JydFJhbmdlUHJvdGVjdGlvbicgKi9cblx0XHRcdGNhc2UgMHgwNDRGOiAvKiAnQnJ0UmFuZ2VQcm90ZWN0aW9uMTQnICovXG5cdFx0XHRjYXNlIDB4MDJBODogLyogJ0JydFJhbmdlUHJvdGVjdGlvbklzbycgKi9cblx0XHRcdGNhc2UgMHgwNDUwOiAvKiAnQnJ0UmFuZ2VQcm90ZWN0aW9uSXNvMTQnICovXG5cdFx0XHRjYXNlIDB4MDQwMDogLyogJ0JydFJ3RGVzY2VudCcgKi9cblx0XHRcdGNhc2UgMHgwMjk3OiAvKiAnQnJ0U2hlZXRDYWxjUHJvcCcgKi9cblx0XHRcdGNhc2UgMHgwMjE3OiAvKiAnQnJ0U2hlZXRQcm90ZWN0aW9uJyAqL1xuXHRcdFx0Y2FzZSAweDAyQTY6IC8qICdCcnRTaGVldFByb3RlY3Rpb25Jc28nICovXG5cdFx0XHRjYXNlIDB4MDFGODogLyogJ0JydFNsYycgKi9cblx0XHRcdGNhc2UgMHgwNDEzOiAvKiAnQnJ0U3BhcmtsaW5lJyAqL1xuXHRcdFx0Y2FzZSAweDAxQUM6IC8qICdCcnRUYWJsZScgKi9cblx0XHRcdGNhc2UgMHgwMEFBOiAvKiAnQnJ0VG9wMTBGaWx0ZXInICovXG5cdFx0XHRjYXNlIDB4MEMwMDogLyogJ0JydFVpZCcgKi9cblx0XHRcdGNhc2UgMHgwMDMyOiAvKiAnQnJ0VmFsdWVNZXRhJyAqL1xuXHRcdFx0Y2FzZSAweDA4MTY6IC8qICdCcnRXZWJFeHRlbnNpb24nICovXG5cdFx0XHRjYXNlIDB4MDQxNTogLyogJ0JydFdzRm10SW5mb0V4MTQnICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDAyMzogLyogJ0JydEZSVEJlZ2luJyAqL1xuXHRcdFx0XHRwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNDogLyogJ0JydEZSVEVuZCcgKi9cblx0XHRcdFx0cGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI1OiAvKiAnQnJ0QUNCZWdpbicgKi9cblx0XHRcdFx0c3RhdGUucHVzaChSVCk7IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI2OiAvKiAnQnJ0QUNFbmQnICovXG5cdFx0XHRcdHN0YXRlLnBvcCgpOyBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZihSUi5UKXsvKiBlbXB0eSAqL31cblx0XHRcdFx0ZWxzZSBpZighcGFzcyB8fCBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCByZWNvcmQgMHhcIiArIFJULnRvU3RyaW5nKDE2KSk7XG5cdFx0fVxuXHR9LCBvcHRzKTtcblxuXHRkZWxldGUgb3B0cy5zdXBib29rcztcblx0ZGVsZXRlIG9wdHNbJyFyb3cnXTtcblxuXHRpZighc1tcIiFyZWZcIl0gJiYgKHJlZmd1ZXNzLnMuciA8IDIwMDAwMDAgfHwgcmVmICYmIChyZWYuZS5yID4gMCB8fCByZWYuZS5jID4gMCB8fCByZWYucy5yID4gMCB8fCByZWYucy5jID4gMCkpKSBzW1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZShyZWYgfHwgcmVmZ3Vlc3MpO1xuXHRpZihvcHRzLnNoZWV0Um93cyAmJiBzW1wiIXJlZlwiXSkge1xuXHRcdHZhciB0bXByZWYgPSBzYWZlX2RlY29kZV9yYW5nZShzW1wiIXJlZlwiXSk7XG5cdFx0aWYob3B0cy5zaGVldFJvd3MgPD0gK3RtcHJlZi5lLnIpIHtcblx0XHRcdHRtcHJlZi5lLnIgPSBvcHRzLnNoZWV0Um93cyAtIDE7XG5cdFx0XHRpZih0bXByZWYuZS5yID4gcmVmZ3Vlc3MuZS5yKSB0bXByZWYuZS5yID0gcmVmZ3Vlc3MuZS5yO1xuXHRcdFx0aWYodG1wcmVmLmUuciA8IHRtcHJlZi5zLnIpIHRtcHJlZi5zLnIgPSB0bXByZWYuZS5yO1xuXHRcdFx0aWYodG1wcmVmLmUuYyA+IHJlZmd1ZXNzLmUuYykgdG1wcmVmLmUuYyA9IHJlZmd1ZXNzLmUuYztcblx0XHRcdGlmKHRtcHJlZi5lLmMgPCB0bXByZWYucy5jKSB0bXByZWYucy5jID0gdG1wcmVmLmUuYztcblx0XHRcdHNbXCIhZnVsbHJlZlwiXSA9IHNbXCIhcmVmXCJdO1xuXHRcdFx0c1tcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UodG1wcmVmKTtcblx0XHR9XG5cdH1cblx0aWYobWVyZ2VzLmxlbmd0aCA+IDApIHNbXCIhbWVyZ2VzXCJdID0gbWVyZ2VzO1xuXHRpZihjb2xpbmZvLmxlbmd0aCA+IDApIHNbXCIhY29sc1wiXSA9IGNvbGluZm87XG5cdGlmKHJvd2luZm8ubGVuZ3RoID4gMCkgc1tcIiFyb3dzXCJdID0gcm93aW5mbztcblx0cmV0dXJuIHM7XG59XG5cbi8qIFRPRE86IHNvbWV0aGluZyB1c2VmdWwgLS0gdGhpcyBpcyBhIHN0dWIgKi9cbmZ1bmN0aW9uIHdyaXRlX3dzX2Jpbl9jZWxsKGJhLyo6QnVmQXJyYXkqLywgY2VsbC8qOkNlbGwqLywgUi8qOm51bWJlciovLCBDLyo6bnVtYmVyKi8sIG9wdHMsIHdzLyo6V29ya3NoZWV0Ki8sIGxhc3Rfc2Vlbi8qOmJvb2xlYW4qLykvKjpib29sZWFuKi8ge1xuXHRpZihjZWxsLnYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuXHR2YXIgdnYgPSBcIlwiO1xuXHRzd2l0Y2goY2VsbC50KSB7XG5cdFx0Y2FzZSAnYic6IHZ2ID0gY2VsbC52ID8gXCIxXCIgOiBcIjBcIjsgYnJlYWs7XG5cdFx0Y2FzZSAnZCc6IC8vIG5vIEJydENlbGxEYXRlIDooXG5cdFx0XHRjZWxsID0gZHVwKGNlbGwpO1xuXHRcdFx0Y2VsbC56ID0gY2VsbC56IHx8IHRhYmxlX2ZtdFsxNF07XG5cdFx0XHRjZWxsLnYgPSBkYXRlbnVtKHBhcnNlRGF0ZShjZWxsLnYpKTsgY2VsbC50ID0gJ24nO1xuXHRcdFx0YnJlYWs7XG5cdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgJ24nOiBjYXNlICdlJzogdnYgPSAnJytjZWxsLnY7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHZ2ID0gY2VsbC52OyBicmVhaztcblx0fVxuXHR2YXIgby8qOmFueSovID0gKHtyOlIsIGM6Q30vKjphbnkqLyk7XG5cdC8qIFRPRE86IGNlbGwgc3R5bGUgKi9cblx0by5zID0gZ2V0X2NlbGxfc3R5bGUob3B0cy5jZWxsWGZzLCBjZWxsLCBvcHRzKTtcblx0aWYoY2VsbC5sKSB3c1snIWxpbmtzJ10ucHVzaChbZW5jb2RlX2NlbGwobyksIGNlbGwubF0pO1xuXHRpZihjZWxsLmMpIHdzWychY29tbWVudHMnXS5wdXNoKFtlbmNvZGVfY2VsbChvKSwgY2VsbC5jXSk7XG5cdHN3aXRjaChjZWxsLnQpIHtcblx0XHRjYXNlICdzJzogY2FzZSAnc3RyJzpcblx0XHRcdGlmKG9wdHMuYm9va1NTVCkge1xuXHRcdFx0XHR2diA9IGdldF9zc3RfaWQob3B0cy5TdHJpbmdzLCAoY2VsbC52Lyo6YW55Ki8pLCBvcHRzLnJldlN0cmluZ3MpO1xuXHRcdFx0XHRvLnQgPSBcInNcIjsgby52ID0gdnY7XG5cdFx0XHRcdGlmKGxhc3Rfc2Vlbikgd3JpdGVfcmVjb3JkKGJhLCAweDAwMTIgLyogQnJ0U2hvcnRJc3N0ICovLCB3cml0ZV9CcnRTaG9ydElzc3QoY2VsbCwgbykpO1xuXHRcdFx0XHRlbHNlIHdyaXRlX3JlY29yZChiYSwgMHgwMDA3IC8qIEJydENlbGxJc3N0ICovLCB3cml0ZV9CcnRDZWxsSXNzdChjZWxsLCBvKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvLnQgPSBcInN0clwiO1xuXHRcdFx0XHRpZihsYXN0X3NlZW4pIHdyaXRlX3JlY29yZChiYSwgMHgwMDExIC8qIEJydFNob3J0U3QgKi8sIHdyaXRlX0JydFNob3J0U3QoY2VsbCwgbykpO1xuXHRcdFx0XHRlbHNlIHdyaXRlX3JlY29yZChiYSwgMHgwMDA2IC8qIEJydENlbGxTdCAqLywgd3JpdGVfQnJ0Q2VsbFN0KGNlbGwsIG8pKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGNhc2UgJ24nOlxuXHRcdFx0LyogVE9ETzogZGV0ZXJtaW5lIHRocmVzaG9sZCBmb3IgUmVhbCB2cyBSSyAqL1xuXHRcdFx0aWYoY2VsbC52ID09IChjZWxsLnYgfCAwKSAmJiBjZWxsLnYgPiAtMTAwMCAmJiBjZWxsLnYgPCAxMDAwKSB7XG5cdFx0XHRcdGlmKGxhc3Rfc2Vlbikgd3JpdGVfcmVjb3JkKGJhLCAweDAwMEQgLyogQnJ0U2hvcnRSayAqLywgd3JpdGVfQnJ0U2hvcnRSayhjZWxsLCBvKSk7XG5cdFx0XHRcdGVsc2Ugd3JpdGVfcmVjb3JkKGJhLCAweDAwMDIgLyogQnJ0Q2VsbFJrICovLCB3cml0ZV9CcnRDZWxsUmsoY2VsbCwgbykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYobGFzdF9zZWVuKSB3cml0ZV9yZWNvcmQoYmEsIDB4MDAxMCAvKiBCcnRTaG9ydFJlYWwgKi8sIHdyaXRlX0JydFNob3J0UmVhbChjZWxsLCBvKSk7XG5cdFx0XHRcdGVsc2Ugd3JpdGVfcmVjb3JkKGJhLCAweDAwMDUgLyogQnJ0Q2VsbFJlYWwgKi8sIHdyaXRlX0JydENlbGxSZWFsKGNlbGwsIG8pKTtcblx0XHRcdH0gcmV0dXJuIHRydWU7XG5cdFx0Y2FzZSAnYic6XG5cdFx0XHRvLnQgPSBcImJcIjtcblx0XHRcdGlmKGxhc3Rfc2Vlbikgd3JpdGVfcmVjb3JkKGJhLCAweDAwMEYgLyogQnJ0U2hvcnRCb29sICovLCB3cml0ZV9CcnRTaG9ydEJvb2woY2VsbCwgbykpO1xuXHRcdFx0ZWxzZSB3cml0ZV9yZWNvcmQoYmEsIDB4MDAwNCAvKiBCcnRDZWxsQm9vbCAqLywgd3JpdGVfQnJ0Q2VsbEJvb2woY2VsbCwgbykpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2FzZSAnZSc6XG5cdFx0XHRvLnQgPSBcImVcIjtcblx0XHRcdGlmKGxhc3Rfc2Vlbikgd3JpdGVfcmVjb3JkKGJhLCAweDAwMEUgLyogQnJ0U2hvcnRFcnJvciAqLywgd3JpdGVfQnJ0U2hvcnRFcnJvcihjZWxsLCBvKSk7XG5cdFx0XHRlbHNlIHdyaXRlX3JlY29yZChiYSwgMHgwMDAzIC8qIEJydENlbGxFcnJvciAqLywgd3JpdGVfQnJ0Q2VsbEVycm9yKGNlbGwsIG8pKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmKGxhc3Rfc2Vlbikgd3JpdGVfcmVjb3JkKGJhLCAweDAwMEMgLyogQnJ0U2hvcnRCbGFuayAqLywgd3JpdGVfQnJ0U2hvcnRCbGFuayhjZWxsLCBvKSk7XG5cdGVsc2Ugd3JpdGVfcmVjb3JkKGJhLCAweDAwMDEgLyogQnJ0Q2VsbEJsYW5rICovLCB3cml0ZV9CcnRDZWxsQmxhbmsoY2VsbCwgbykpO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfQ0VMTFRBQkxFKGJhLCB3cy8qOldvcmtzaGVldCovLCBpZHgvKjpudW1iZXIqLywgb3B0cy8qOjosIHdiOldvcmtib29rKi8pIHtcblx0dmFyIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSB8fCBcIkExXCIpLCByZWYsIHJyID0gXCJcIiwgY29scy8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA5MSAvKiBCcnRCZWdpblNoZWV0RGF0YSAqLyk7XG5cdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHR2YXIgY2FwID0gcmFuZ2UuZS5yO1xuXHRpZih3c1snIXJvd3MnXSkgY2FwID0gTWF0aC5tYXgocmFuZ2UuZS5yLCB3c1snIXJvd3MnXS5sZW5ndGggLSAxKTtcblx0Zm9yKHZhciBSID0gcmFuZ2Uucy5yOyBSIDw9IGNhcDsgKytSKSB7XG5cdFx0cnIgPSBlbmNvZGVfcm93KFIpO1xuXHRcdC8qIFtBQ0NFTExUQUJMRV0gKi9cblx0XHQvKiBCcnRSb3dIZHIgKi9cblx0XHR3cml0ZV9yb3dfaGVhZGVyKGJhLCB3cywgcmFuZ2UsIFIpO1xuXHRcdHZhciBsYXN0X3NlZW4gPSBmYWxzZTtcblx0XHRpZihSIDw9IHJhbmdlLmUucikgZm9yKHZhciBDID0gcmFuZ2Uucy5jOyBDIDw9IHJhbmdlLmUuYzsgKytDKSB7XG5cdFx0XHQvKiAqMTYzODRDRUxMICovXG5cdFx0XHRpZihSID09PSByYW5nZS5zLnIpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRcdFx0cmVmID0gY29sc1tDXSArIHJyO1xuXHRcdFx0dmFyIGNlbGwgPSBkZW5zZSA/ICh3c1tSXXx8W10pW0NdIDogd3NbcmVmXTtcblx0XHRcdGlmKCFjZWxsKSB7IGxhc3Rfc2VlbiA9IGZhbHNlOyBjb250aW51ZTsgfVxuXHRcdFx0Lyogd3JpdGUgY2VsbCAqL1xuXHRcdFx0bGFzdF9zZWVuID0gd3JpdGVfd3NfYmluX2NlbGwoYmEsIGNlbGwsIFIsIEMsIG9wdHMsIHdzLCBsYXN0X3NlZW4pO1xuXHRcdH1cblx0fVxuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA5MiAvKiBCcnRFbmRTaGVldERhdGEgKi8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9NRVJHRUNFTExTKGJhLCB3cy8qOldvcmtzaGVldCovKSB7XG5cdGlmKCF3cyB8fCAhd3NbJyFtZXJnZXMnXSkgcmV0dXJuO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDBCMSAvKiBCcnRCZWdpbk1lcmdlQ2VsbHMgKi8sIHdyaXRlX0JydEJlZ2luTWVyZ2VDZWxscyh3c1snIW1lcmdlcyddLmxlbmd0aCkpO1xuXHR3c1snIW1lcmdlcyddLmZvckVhY2goZnVuY3Rpb24obSkgeyB3cml0ZV9yZWNvcmQoYmEsIDB4MDBCMCAvKiBCcnRNZXJnZUNlbGwgKi8sIHdyaXRlX0JydE1lcmdlQ2VsbChtKSk7IH0pO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDBCMiAvKiBCcnRFbmRNZXJnZUNlbGxzICovKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfQ09MSU5GT1MoYmEsIHdzLyo6V29ya3NoZWV0Ki8vKjo6LCBpZHg6bnVtYmVyLCBvcHRzLCB3YjpXb3JrYm9vayovKSB7XG5cdGlmKCF3cyB8fCAhd3NbJyFjb2xzJ10pIHJldHVybjtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAxODYgLyogQnJ0QmVnaW5Db2xJbmZvcyAqLyk7XG5cdHdzWychY29scyddLmZvckVhY2goZnVuY3Rpb24obSwgaSkgeyBpZihtKSB3cml0ZV9yZWNvcmQoYmEsIDB4MDAzQyAvKiAnQnJ0Q29sSW5mbycgKi8sIHdyaXRlX0JydENvbEluZm8oaSwgbSkpOyB9KTtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAxODcgLyogQnJ0RW5kQ29sSW5mb3MgKi8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9JR05PUkVFQ1MoYmEsIHdzLyo6V29ya3NoZWV0Ki8pIHtcblx0aWYoIXdzIHx8ICF3c1snIXJlZiddKSByZXR1cm47XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjg4IC8qIEJydEJlZ2luQ2VsbElnbm9yZUVDcyAqLyk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjg5IC8qIEJydENlbGxJZ25vcmVFQyAqLywgd3JpdGVfQnJ0Q2VsbElnbm9yZUVDKHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pKSk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMjhBIC8qIEJydEVuZENlbGxJZ25vcmVFQ3MgKi8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9ITElOS1MoYmEsIHdzLyo6V29ya3NoZWV0Ki8sIHJlbHMpIHtcblx0LyogKkJydEhMaW5rICovXG5cdHdzWychbGlua3MnXS5mb3JFYWNoKGZ1bmN0aW9uKGwpIHtcblx0XHRpZighbFsxXS5UYXJnZXQpIHJldHVybjtcblx0XHR2YXIgcklkID0gYWRkX3JlbHMocmVscywgLTEsIGxbMV0uVGFyZ2V0LnJlcGxhY2UoLyMuKiQvLCBcIlwiKSwgUkVMUy5ITElOSyk7XG5cdFx0d3JpdGVfcmVjb3JkKGJhLCAweDAxRUUgLyogQnJ0SExpbmsgKi8sIHdyaXRlX0JydEhMaW5rKGwsIHJJZCkpO1xuXHR9KTtcblx0ZGVsZXRlIHdzWychbGlua3MnXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0xFR0FDWURSQVdJTkcoYmEsIHdzLyo6V29ya3NoZWV0Ki8sIGlkeC8qOm51bWJlciovLCByZWxzKSB7XG5cdC8qIFtCcnRMZWdhY3lEcmF3aW5nXSAqL1xuXHRpZih3c1snIWNvbW1lbnRzJ10ubGVuZ3RoID4gMCkge1xuXHRcdHZhciBySWQgPSBhZGRfcmVscyhyZWxzLCAtMSwgXCIuLi9kcmF3aW5ncy92bWxEcmF3aW5nXCIgKyAoaWR4KzEpICsgXCIudm1sXCIsIFJFTFMuVk1MKTtcblx0XHR3cml0ZV9yZWNvcmQoYmEsIDB4MDIyNyAvKiBCcnRMZWdhY3lEcmF3aW5nICovLCB3cml0ZV9SZWxJRChcInJJZFwiICsgcklkKSk7XG5cdFx0d3NbJyFsZWdhY3knXSA9IHJJZDtcblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZV9BVVRPRklMVEVSKGJhLCB3cywgd2IsIGlkeCkge1xuXHRpZighd3NbJyFhdXRvZmlsdGVyJ10pIHJldHVybjtcblx0dmFyIGRhdGEgPSB3c1snIWF1dG9maWx0ZXInXTtcblx0dmFyIHJlZiA9IHR5cGVvZiBkYXRhLnJlZiA9PT0gXCJzdHJpbmdcIiA/IGRhdGEucmVmIDogZW5jb2RlX3JhbmdlKGRhdGEucmVmKTtcblxuXHQvKiBVcGRhdGUgRmlsdGVyRGF0YWJhc2UgZGVmaW5lZCBuYW1lIGZvciB0aGUgd29ya3NoZWV0ICovXG5cdGlmKCF3Yi5Xb3JrYm9vaykgd2IuV29ya2Jvb2sgPSAoe1NoZWV0czpbXX0vKjphbnkqLyk7XG5cdGlmKCF3Yi5Xb3JrYm9vay5OYW1lcykgd2IuV29ya2Jvb2suTmFtZXMgPSBbXTtcblx0dmFyIG5hbWVzLyo6IEFycmF5PGFueT4gKi8gPSB3Yi5Xb3JrYm9vay5OYW1lcztcblx0dmFyIHJhbmdlID0gZGVjb2RlX3JhbmdlKHJlZik7XG5cdGlmKHJhbmdlLnMuciA9PSByYW5nZS5lLnIpIHsgcmFuZ2UuZS5yID0gZGVjb2RlX3JhbmdlKHdzW1wiIXJlZlwiXSkuZS5yOyByZWYgPSBlbmNvZGVfcmFuZ2UocmFuZ2UpOyB9XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBuYW1lID0gbmFtZXNbaV07XG5cdFx0aWYobmFtZS5OYW1lICE9ICdfeGxubS5fRmlsdGVyRGF0YWJhc2UnKSBjb250aW51ZTtcblx0XHRpZihuYW1lLlNoZWV0ICE9IGlkeCkgY29udGludWU7XG5cdFx0bmFtZS5SZWYgPSBcIidcIiArIHdiLlNoZWV0TmFtZXNbaWR4XSArIFwiJyFcIiArIHJlZjsgYnJlYWs7XG5cdH1cblx0aWYoaSA9PSBuYW1lcy5sZW5ndGgpIG5hbWVzLnB1c2goeyBOYW1lOiAnX3hsbm0uX0ZpbHRlckRhdGFiYXNlJywgU2hlZXQ6IGlkeCwgUmVmOiBcIidcIiArIHdiLlNoZWV0TmFtZXNbaWR4XSArIFwiJyFcIiArIHJlZiAgfSk7XG5cblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwQTEgLyogQnJ0QmVnaW5BRmlsdGVyICovLCB3cml0ZV9VbmNoZWNrZWRSZlgoc2FmZV9kZWNvZGVfcmFuZ2UocmVmKSkpO1xuXHQvKiAqRklMVEVSQ09MVU1OICovXG5cdC8qIFtTT1JUU1RBVEVdICovXG5cdC8qIEJydEVuZEFGaWx0ZXIgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwQTIgLyogQnJ0RW5kQUZpbHRlciAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX1dTVklFV1MyKGJhLCB3cywgV29ya2Jvb2spIHtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwODUgLyogQnJ0QmVnaW5Xc1ZpZXdzICovKTtcblx0eyAvKiAxKldTVklFVzIgKi9cblx0XHQvKiBbQUNVSURdICovXG5cdFx0d3JpdGVfcmVjb3JkKGJhLCAweDAwODkgLyogQnJ0QmVnaW5Xc1ZpZXcgKi8sIHdyaXRlX0JydEJlZ2luV3NWaWV3KHdzLCBXb3JrYm9vaykpO1xuXHRcdC8qIFtCcnRQYW5lXSAqL1xuXHRcdC8qICo0QnJ0U2VsICovXG5cdFx0LyogKjRTWFNFTEVDVCAqL1xuXHRcdC8qICpGUlQgKi9cblx0XHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA4QSAvKiBCcnRFbmRXc1ZpZXcgKi8pO1xuXHR9XG5cdC8qICpGUlQgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwODYgLyogQnJ0RW5kV3NWaWV3cyAqLyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX1dTRk1USU5GTygvKjo6YmEsIHdzKi8pIHtcblx0LyogW0FDV1NGTVRJTkZPXSAqL1xuXHQvLyB3cml0ZV9yZWNvcmQoYmEsIDB4MDFFNSAvKiBCcnRXc0ZtdEluZm8gKi8sIHdyaXRlX0JydFdzRm10SW5mbyh3cykpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9TSEVFVFBST1RFQ1QoYmEsIHdzKSB7XG5cdGlmKCF3c1snIXByb3RlY3QnXSkgcmV0dXJuO1xuXHQvKiBbQnJ0U2hlZXRQcm90ZWN0aW9uSXNvXSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDIxNyAvKiBCcnRTaGVldFByb3RlY3Rpb24gKi8sIHdyaXRlX0JydFNoZWV0UHJvdGVjdGlvbih3c1snIXByb3RlY3QnXSkpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93c19iaW4oaWR4Lyo6bnVtYmVyKi8sIG9wdHMsIHdiLyo6V29ya2Jvb2sqLywgcmVscykge1xuXHR2YXIgYmEgPSBidWZfYXJyYXkoKTtcblx0dmFyIHMgPSB3Yi5TaGVldE5hbWVzW2lkeF0sIHdzID0gd2IuU2hlZXRzW3NdIHx8IHt9O1xuXHR2YXIgYy8qOnN0cmluZyovID0gczsgdHJ5IHsgaWYod2IgJiYgd2IuV29ya2Jvb2spIGMgPSB3Yi5Xb3JrYm9vay5TaGVldHNbaWR4XS5Db2RlTmFtZSB8fCBjOyB9IGNhdGNoKGUpIHt9XG5cdHZhciByID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSB8fCBcIkExXCIpO1xuXHRpZihyLmUuYyA+IDB4M0ZGRiB8fCByLmUuciA+IDB4RkZGRkYpIHtcblx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2UgXCIgKyAod3NbJyFyZWYnXSB8fCBcIkExXCIpICsgXCIgZXhjZWVkcyBmb3JtYXQgbGltaXQgQTE6WEZEMTA0ODU3NlwiKTtcblx0XHRyLmUuYyA9IE1hdGgubWluKHIuZS5jLCAweDNGRkYpO1xuXHRcdHIuZS5yID0gTWF0aC5taW4oci5lLmMsIDB4RkZGRkYpO1xuXHR9XG5cdHdzWychbGlua3MnXSA9IFtdO1xuXHQvKiBwYXNzZWQgYmFjayB0byB3cml0ZV96aXAgYW5kIHJlbW92ZWQgdGhlcmUgKi9cblx0d3NbJyFjb21tZW50cyddID0gW107XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDgxIC8qIEJydEJlZ2luU2hlZXQgKi8pO1xuXHRpZih3Yi52YmFyYXcgfHwgd3NbJyFvdXRsaW5lJ10pIHdyaXRlX3JlY29yZChiYSwgMHgwMDkzIC8qIEJydFdzUHJvcCAqLywgd3JpdGVfQnJ0V3NQcm9wKGMsIHdzWychb3V0bGluZSddKSk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDk0IC8qIEJydFdzRGltICovLCB3cml0ZV9CcnRXc0RpbShyKSk7XG5cdHdyaXRlX1dTVklFV1MyKGJhLCB3cywgd2IuV29ya2Jvb2spO1xuXHR3cml0ZV9XU0ZNVElORk8oYmEsIHdzKTtcblx0d3JpdGVfQ09MSU5GT1MoYmEsIHdzLCBpZHgsIG9wdHMsIHdiKTtcblx0d3JpdGVfQ0VMTFRBQkxFKGJhLCB3cywgaWR4LCBvcHRzLCB3Yik7XG5cdC8qIFtCcnRTaGVldENhbGNQcm9wXSAqL1xuXHR3cml0ZV9TSEVFVFBST1RFQ1QoYmEsIHdzKTtcblx0LyogKihbQnJ0UmFuZ2VQcm90ZWN0aW9uSXNvXSBCcnRSYW5nZVByb3RlY3Rpb24pICovXG5cdC8qIFtTQ0VOTUFOXSAqL1xuXHR3cml0ZV9BVVRPRklMVEVSKGJhLCB3cywgd2IsIGlkeCk7XG5cdC8qIFtTT1JUU1RBVEVdICovXG5cdC8qIFtEQ09OXSAqL1xuXHQvKiBbVVNFUlNIVklFV1NdICovXG5cdHdyaXRlX01FUkdFQ0VMTFMoYmEsIHdzKTtcblx0LyogW0JydFBob25ldGljSW5mb10gKi9cblx0LyogKkNPTkRJVElPTkFMRk9STUFUVElORyAqL1xuXHQvKiBbRFZBTFNdICovXG5cdHdyaXRlX0hMSU5LUyhiYSwgd3MsIHJlbHMpO1xuXHQvKiBbQnJ0UHJpbnRPcHRpb25zXSAqL1xuXHRpZih3c1snIW1hcmdpbnMnXSkgd3JpdGVfcmVjb3JkKGJhLCAweDAxREMgLyogQnJ0TWFyZ2lucyAqLywgd3JpdGVfQnJ0TWFyZ2lucyh3c1snIW1hcmdpbnMnXSkpO1xuXHQvKiBbQnJ0UGFnZVNldHVwXSAqL1xuXHQvKiBbSEVBREVSRk9PVEVSXSAqL1xuXHQvKiBbUldCUktdICovXG5cdC8qIFtDT0xCUktdICovXG5cdC8qICpCcnRCaWdOYW1lICovXG5cdC8qIFtDRUxMV0FUQ0hFU10gKi9cblx0aWYoIW9wdHMgfHwgb3B0cy5pZ25vcmVFQyB8fCAob3B0cy5pZ25vcmVFQyA9PSAodm9pZCAwKSkpIHdyaXRlX0lHTk9SRUVDUyhiYSwgd3MpO1xuXHQvKiBbU01BUlRUQUdTXSAqL1xuXHQvKiBbQnJ0RHJhd2luZ10gKi9cblx0d3JpdGVfTEVHQUNZRFJBV0lORyhiYSwgd3MsIGlkeCwgcmVscyk7XG5cdC8qIFtCcnRMZWdhY3lEcmF3aW5nSEZdICovXG5cdC8qIFtCcnRCa0hpbV0gKi9cblx0LyogW09MRU9CSkVDVFNdICovXG5cdC8qIFtBQ1RJVkVYQ09OVFJPTFNdICovXG5cdC8qIFtXRUJQVUJJVEVNU10gKi9cblx0LyogW0xJU1RQQVJUU10gKi9cblx0LyogRlJUV09SS1NIRUVUICovXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDgyIC8qIEJydEVuZFNoZWV0ICovKTtcblx0cmV0dXJuIGJhLmVuZCgpO1xufVxuZnVuY3Rpb24gcGFyc2VfQ2FjaGUoZGF0YS8qOnN0cmluZyovKS8qOltBcnJheTxudW1iZXJ8c3RyaW5nPiwgc3RyaW5nLCA/c3RyaW5nXSovIHtcblx0dmFyIGNvbC8qOkFycmF5PG51bWJlcnxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIG51bSA9IGRhdGEubWF0Y2goL148YzpudW1DYWNoZT4vKTtcblx0dmFyIGY7XG5cblx0LyogMjEuMi4yLjE1MCBwdCBDVF9OdW1WYWwgKi9cblx0KGRhdGEubWF0Y2goLzxjOnB0IGlkeD1cIihcXGQqKVwiPiguKj8pPFxcL2M6cHQ+L21nKXx8W10pLmZvckVhY2goZnVuY3Rpb24ocHQpIHtcblx0XHR2YXIgcSA9IHB0Lm1hdGNoKC88YzpwdCBpZHg9XCIoXFxkKj8pXCI+PGM6dj4oLiopPFxcL2M6dj48XFwvYzpwdD4vKTtcblx0XHRpZighcSkgcmV0dXJuO1xuXHRcdGNvbFsrcVsxXV0gPSBudW0gPyArcVsyXSA6IHFbMl07XG5cdH0pO1xuXG5cdC8qIDIxLjIuMi43MSBmb3JtYXRDb2RlIENUX1hzdHJpbmcgKi9cblx0dmFyIG5mID0gdW5lc2NhcGV4bWwoKGRhdGEubWF0Y2goLzxjOmZvcm1hdENvZGU+KFtcXHNcXFNdKj8pPFxcL2M6Zm9ybWF0Q29kZT4vKSB8fCBbXCJcIixcIkdlbmVyYWxcIl0pWzFdKTtcblxuXHQoZGF0YS5tYXRjaCgvPGM6Zj4oLio/KTxcXC9jOmY+L21nKXx8W10pLmZvckVhY2goZnVuY3Rpb24oRikgeyBmID0gRi5yZXBsYWNlKC88Lio/Pi9nLFwiXCIpOyB9KTtcblxuXHRyZXR1cm4gW2NvbCwgbmYsIGZdO1xufVxuXG4vKiAyMS4yIERyYXdpbmdNTCAtIENoYXJ0cyAqL1xuZnVuY3Rpb24gcGFyc2VfY2hhcnQoZGF0YS8qOj9zdHJpbmcqLywgbmFtZS8qOnN0cmluZyovLCBvcHRzLCByZWxzLCB3YiwgY3NoZWV0KSB7XG5cdHZhciBjcy8qOldvcmtzaGVldCovID0gKChjc2hlZXQgfHwge1wiIXR5cGVcIjpcImNoYXJ0XCJ9KS8qOmFueSovKTtcblx0aWYoIWRhdGEpIHJldHVybiBjc2hlZXQ7XG5cdC8qIDIxLjIuMi4yNyBjaGFydCBDVF9DaGFydCAqL1xuXG5cdHZhciBDID0gMCwgUiA9IDAsIGNvbCA9IFwiQVwiO1xuXHR2YXIgcmVmZ3Vlc3MgPSB7czoge3I6MjAwMDAwMCwgYzoyMDAwMDAwfSwgZToge3I6MCwgYzowfSB9O1xuXG5cdC8qIDIxLjIuMi4xMjAgbnVtQ2FjaGUgQ1RfTnVtRGF0YSAqL1xuXHQoZGF0YS5tYXRjaCgvPGM6bnVtQ2FjaGU+W1xcc1xcU10qPzxcXC9jOm51bUNhY2hlPi9nbSl8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKG5jKSB7XG5cdFx0dmFyIGNhY2hlID0gcGFyc2VfQ2FjaGUobmMpO1xuXHRcdHJlZmd1ZXNzLnMuciA9IHJlZmd1ZXNzLnMuYyA9IDA7XG5cdFx0cmVmZ3Vlc3MuZS5jID0gQztcblx0XHRjb2wgPSBlbmNvZGVfY29sKEMpO1xuXHRcdGNhY2hlWzBdLmZvckVhY2goZnVuY3Rpb24obixpKSB7XG5cdFx0XHRjc1tjb2wgKyBlbmNvZGVfcm93KGkpXSA9IHt0OiduJywgdjpuLCB6OmNhY2hlWzFdIH07XG5cdFx0XHRSID0gaTtcblx0XHR9KTtcblx0XHRpZihyZWZndWVzcy5lLnIgPCBSKSByZWZndWVzcy5lLnIgPSBSO1xuXHRcdCsrQztcblx0fSk7XG5cdGlmKEMgPiAwKSBjc1tcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UocmVmZ3Vlc3MpO1xuXHRyZXR1cm4gY3M7XG59XG4vKiAxOC4zIFdvcmtzaGVldHMgYWxzbyBjb3ZlcnMgQ2hhcnRzaGVldHMgKi9cbmZ1bmN0aW9uIHBhcnNlX2NzX3htbChkYXRhLyo6P3N0cmluZyovLCBvcHRzLCBpZHgvKjpudW1iZXIqLywgcmVscywgd2IvKjo6LCB0aGVtZXMsIHN0eWxlcyovKS8qOldvcmtzaGVldCovIHtcblx0aWYoIWRhdGEpIHJldHVybiBkYXRhO1xuXHQvKiAxOC4zLjEuMTIgY2hhcnRzaGVldCBDVF9DaGFydFNoZWV0ICovXG5cdGlmKCFyZWxzKSByZWxzID0geychaWQnOnt9fTtcblx0dmFyIHMgPSAoeychdHlwZSc6XCJjaGFydFwiLCAnIWRyYXdlbCc6bnVsbCwgJyFyZWwnOlwiXCJ9Lyo6YW55Ki8pO1xuXHR2YXIgbTtcblxuXHQvKiAxOC4zLjEuODMgc2hlZXRQciBDVF9DaGFydHNoZWV0UHIgKi9cblx0dmFyIHNoZWV0UHIgPSBkYXRhLm1hdGNoKHNoZWV0cHJyZWdleCk7XG5cdGlmKHNoZWV0UHIpIHBhcnNlX3dzX3htbF9zaGVldHByKHNoZWV0UHJbMF0sIHMsIHdiLCBpZHgpO1xuXG5cdC8qIDE4LjMuMS4zNiBkcmF3aW5nIENUX0RyYXdpbmcgKi9cblx0aWYoKG0gPSBkYXRhLm1hdGNoKC9kcmF3aW5nIHI6aWQ9XCIoLio/KVwiLykpKSBzWychcmVsJ10gPSBtWzFdO1xuXG5cdGlmKHJlbHNbJyFpZCddW3NbJyFyZWwnXV0pIHNbJyFkcmF3ZWwnXSA9IHJlbHNbJyFpZCddW3NbJyFyZWwnXV07XG5cdHJldHVybiBzO1xufVxuZnVuY3Rpb24gd3JpdGVfY3NfeG1sKGlkeC8qOm51bWJlciovLCBvcHRzLCB3Yi8qOldvcmtib29rKi8sIHJlbHMpLyo6c3RyaW5nKi8ge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSLCB3cml0ZXh0YWcoJ2NoYXJ0c2hlZXQnLCBudWxsLCB7XG5cdFx0J3htbG5zJzogWE1MTlNfbWFpblswXSxcblx0XHQneG1sbnM6cic6IFhNTE5TLnJcblx0fSldO1xuXHRvW28ubGVuZ3RoXSA9IHdyaXRleHRhZyhcImRyYXdpbmdcIiwgbnVsbCwge1wicjppZFwiOiBcInJJZDFcIn0pO1xuXHRhZGRfcmVscyhyZWxzLCAtMSwgXCIuLi9kcmF3aW5ncy9kcmF3aW5nXCIgKyAoaWR4KzEpICsgXCIueG1sXCIsIFJFTFMuRFJBVyk7XG5cdGlmKG8ubGVuZ3RoPjIpIHsgb1tvLmxlbmd0aF0gPSAoJzwvY2hhcnRzaGVldD4nKTsgb1sxXT1vWzFdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjMzMSBCcnRDc1Byb3AgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENzUHJvcChkYXRhLCBsZW5ndGgvKjpudW1iZXIqLykge1xuXHRkYXRhLmwgKz0gMTA7XG5cdHZhciBuYW1lID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEsIGxlbmd0aCAtIDEwKTtcblx0cmV0dXJuIHsgbmFtZTogbmFtZSB9O1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjcuNyBDaGFydCBTaGVldCAqL1xuZnVuY3Rpb24gcGFyc2VfY3NfYmluKGRhdGEsIG9wdHMsIGlkeC8qOm51bWJlciovLCByZWxzLCB3Yi8qOjosIHRoZW1lcywgc3R5bGVzKi8pLyo6V29ya3NoZWV0Ki8ge1xuXHRpZighZGF0YSkgcmV0dXJuIGRhdGE7XG5cdGlmKCFyZWxzKSByZWxzID0geychaWQnOnt9fTtcblx0dmFyIHMgPSB7JyF0eXBlJzpcImNoYXJ0XCIsICchZHJhd2VsJzpudWxsLCAnIXJlbCc6XCJcIn07XG5cdHZhciBzdGF0ZS8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXHRyZWNvcmRob3BwZXIoZGF0YSwgZnVuY3Rpb24gY3NfcGFyc2UodmFsLCBSLCBSVCkge1xuXHRcdHN3aXRjaChSVCkge1xuXG5cdFx0XHRjYXNlIDB4MDIyNjogLyogJ0JydERyYXdpbmcnICovXG5cdFx0XHRcdHNbJyFyZWwnXSA9IHZhbDsgYnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMjhCOiAvKiAnQnJ0Q3NQcm9wJyAqL1xuXHRcdFx0XHRpZighd2IuU2hlZXRzW2lkeF0pIHdiLlNoZWV0c1tpZHhdID0ge307XG5cdFx0XHRcdGlmKHZhbC5uYW1lKSB3Yi5TaGVldHNbaWR4XS5Db2RlTmFtZSA9IHZhbC5uYW1lO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAyMzI6IC8qICdCcnRCa0hpbScgKi9cblx0XHRcdGNhc2UgMHgwMjhDOiAvKiAnQnJ0Q3NQYWdlU2V0dXAnICovXG5cdFx0XHRjYXNlIDB4MDI5RDogLyogJ0JydENzUHJvdGVjdGlvbicgKi9cblx0XHRcdGNhc2UgMHgwMkE3OiAvKiAnQnJ0Q3NQcm90ZWN0aW9uSXNvJyAqL1xuXHRcdFx0Y2FzZSAweDAyMjc6IC8qICdCcnRMZWdhY3lEcmF3aW5nJyAqL1xuXHRcdFx0Y2FzZSAweDAyMjg6IC8qICdCcnRMZWdhY3lEcmF3aW5nSEYnICovXG5cdFx0XHRjYXNlIDB4MDFEQzogLyogJ0JydE1hcmdpbnMnICovXG5cdFx0XHRjYXNlIDB4MEMwMDogLyogJ0JydFVpZCcgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDIzOiAvKiAnQnJ0RlJUQmVnaW4nICovXG5cdFx0XHRcdHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMjU6IC8qICdCcnRBQ0JlZ2luJyAqL1xuXHRcdFx0XHRzdGF0ZS5wdXNoKFJUKTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNjogLyogJ0JydEFDRW5kJyAqL1xuXHRcdFx0XHRzdGF0ZS5wb3AoKTsgYnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKFIuVCA+IDApIHN0YXRlLnB1c2goUlQpO1xuXHRcdFx0XHRlbHNlIGlmKFIuVCA8IDApIHN0YXRlLnBvcCgpO1xuXHRcdFx0XHRlbHNlIGlmKCFwYXNzIHx8IG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHJlY29yZCAweFwiICsgUlQudG9TdHJpbmcoMTYpKTtcblx0XHR9XG5cdH0sIG9wdHMpO1xuXG5cdGlmKHJlbHNbJyFpZCddW3NbJyFyZWwnXV0pIHNbJyFkcmF3ZWwnXSA9IHJlbHNbJyFpZCddW3NbJyFyZWwnXV07XG5cdHJldHVybiBzO1xufVxuZnVuY3Rpb24gd3JpdGVfY3NfYmluKC8qOjppZHg6bnVtYmVyLCBvcHRzLCB3YjpXb3JrYm9vaywgcmVscyovKSB7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA4MSAvKiBCcnRCZWdpblNoZWV0ICovKTtcblx0LyogW0JydENzUHJvcF0gKi9cblx0LyogQ1NWSUVXUyAqL1xuXHQvKiBbW0JydENzUHJvdGVjdGlvbklzb10gQnJ0Q3NQcm90ZWN0aW9uXSAqL1xuXHQvKiBbVVNFUkNTVklFV1NdICovXG5cdC8qIFtCcnRNYXJnaW5zXSAqL1xuXHQvKiBbQnJ0Q3NQYWdlU2V0dXBdICovXG5cdC8qIFtIRUFERVJGT09URVJdICovXG5cdC8qIEJydERyYXdpbmcgKi9cblx0LyogW0JydExlZ2FjeURyYXdpbmddICovXG5cdC8qIFtCcnRMZWdhY3lEcmF3aW5nSEZdICovXG5cdC8qIFtCcnRCa0hpbV0gKi9cblx0LyogW1dFQlBVQklURU1TXSAqL1xuXHQvKiBGUlRDSEFSVFNIRUVUICovXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDgyIC8qIEJydEVuZFNoZWV0ICovKTtcblx0cmV0dXJuIGJhLmVuZCgpO1xufVxuLyogMTguMi4yOCAoQ1RfV29ya2Jvb2tQcm90ZWN0aW9uKSBEZWZhdWx0cyAqL1xudmFyIFdCUHJvcHNEZWYgPSBbXG5cdFsnYWxsb3dSZWZyZXNoUXVlcnknLCAgICAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0WydhdXRvQ29tcHJlc3NQaWN0dXJlcycsICAgICAgICB0cnVlLCAgXCJib29sXCJdLFxuXHRbJ2JhY2t1cEZpbGUnLCAgICAgICAgICAgICAgICAgIGZhbHNlLCBcImJvb2xcIl0sXG5cdFsnY2hlY2tDb21wYXRpYmlsaXR5JywgICAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0WydDb2RlTmFtZScsICAgICAgICAgICAgICAgICAgICAnJ10sXG5cdFsnZGF0ZTE5MDQnLCAgICAgICAgICAgICAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0WydkZWZhdWx0VGhlbWVWZXJzaW9uJywgICAgICAgICAwLCAgICAgIFwiaW50XCJdLFxuXHRbJ2ZpbHRlclByaXZhY3knLCAgICAgICAgICAgICAgIGZhbHNlLCBcImJvb2xcIl0sXG5cdFsnaGlkZVBpdm90RmllbGRMaXN0JywgICAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0Wydwcm9tcHRlZFNvbHV0aW9ucycsICAgICAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ3B1Ymxpc2hJdGVtcycsICAgICAgICAgICAgICAgIGZhbHNlLCBcImJvb2xcIl0sXG5cdFsncmVmcmVzaEFsbENvbm5lY3Rpb25zJywgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0WydzYXZlRXh0ZXJuYWxMaW5rVmFsdWVzJywgICAgICB0cnVlLCAgXCJib29sXCJdLFxuXHRbJ3Nob3dCb3JkZXJVbnNlbGVjdGVkVGFibGVzJywgIHRydWUsICBcImJvb2xcIl0sXG5cdFsnc2hvd0lua0Fubm90YXRpb24nLCAgICAgICAgICAgdHJ1ZSwgIFwiYm9vbFwiXSxcblx0WydzaG93T2JqZWN0cycsICAgICAgICAgICAgICAgICAnYWxsJ10sXG5cdFsnc2hvd1Bpdm90Q2hhcnRGaWx0ZXInLCAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0Wyd1cGRhdGVMaW5rcycsICd1c2VyU2V0J11cbl07XG5cbi8qIDE4LjIuMzAgKENUX0Jvb2tWaWV3KSBEZWZhdWx0cyAqL1xudmFyIFdCVmlld0RlZiA9IFtcblx0WydhY3RpdmVUYWInLCAgICAgICAgICAgICAgICAgICAwLCAgICAgIFwiaW50XCJdLFxuXHRbJ2F1dG9GaWx0ZXJEYXRlR3JvdXBpbmcnLCAgICAgIHRydWUsICBcImJvb2xcIl0sXG5cdFsnZmlyc3RTaGVldCcsICAgICAgICAgICAgICAgICAgMCwgICAgICBcImludFwiXSxcblx0WydtaW5pbWl6ZWQnLCAgICAgICAgICAgICAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ3Nob3dIb3Jpem9udGFsU2Nyb2xsJywgICAgICAgIHRydWUsICBcImJvb2xcIl0sXG5cdFsnc2hvd1NoZWV0VGFicycsICAgICAgICAgICAgICAgdHJ1ZSwgIFwiYm9vbFwiXSxcblx0WydzaG93VmVydGljYWxTY3JvbGwnLCAgICAgICAgICB0cnVlLCAgXCJib29sXCJdLFxuXHRbJ3RhYlJhdGlvJywgICAgICAgICAgICAgICAgICAgIDYwMCwgICAgXCJpbnRcIl0sXG5cdFsndmlzaWJpbGl0eScsICAgICAgICAgICAgICAgICAgJ3Zpc2libGUnXVxuXHQvL3dpbmRvd3tIZWlnaHQsV2lkdGh9LCB7eCx5fVdpbmRvd1xuXTtcblxuLyogMTguMi4xOSAoQ1RfU2hlZXQpIERlZmF1bHRzICovXG52YXIgU2hlZXREZWYgPSBbXG5cdC8vWydzdGF0ZScsICd2aXNpYmxlJ11cbl07XG5cbi8qIDE4LjIuMiAgKENUX0NhbGNQcikgRGVmYXVsdHMgKi9cbnZhciBDYWxjUHJEZWYgPSBbXG5cdFsnY2FsY0NvbXBsZXRlZCcsICd0cnVlJ10sXG5cdFsnY2FsY01vZGUnLCAnYXV0byddLFxuXHRbJ2NhbGNPblNhdmUnLCAndHJ1ZSddLFxuXHRbJ2NvbmN1cnJlbnRDYWxjJywgJ3RydWUnXSxcblx0WydmdWxsQ2FsY09uTG9hZCcsICdmYWxzZSddLFxuXHRbJ2Z1bGxQcmVjaXNpb24nLCAndHJ1ZSddLFxuXHRbJ2l0ZXJhdGUnLCAnZmFsc2UnXSxcblx0WydpdGVyYXRlQ291bnQnLCAnMTAwJ10sXG5cdFsnaXRlcmF0ZURlbHRhJywgJzAuMDAxJ10sXG5cdFsncmVmTW9kZScsICdBMSddXG5dO1xuXG4vKiAxOC4yLjMgKENUX0N1c3RvbVdvcmtib29rVmlldykgRGVmYXVsdHMgKi9cbi8qdmFyIEN1c3RvbVdCVmlld0RlZiA9IFtcblx0WydhdXRvVXBkYXRlJywgJ2ZhbHNlJ10sXG5cdFsnY2hhbmdlc1NhdmVkV2luJywgJ2ZhbHNlJ10sXG5cdFsnaW5jbHVkZUhpZGRlblJvd0NvbCcsICd0cnVlJ10sXG5cdFsnaW5jbHVkZVByaW50U2V0dGluZ3MnLCAndHJ1ZSddLFxuXHRbJ21heGltaXplZCcsICdmYWxzZSddLFxuXHRbJ21pbmltaXplZCcsICdmYWxzZSddLFxuXHRbJ29ubHlTeW5jJywgJ2ZhbHNlJ10sXG5cdFsncGVyc29uYWxWaWV3JywgJ2ZhbHNlJ10sXG5cdFsnc2hvd0NvbW1lbnRzJywgJ2NvbW1JbmRpY2F0b3InXSxcblx0WydzaG93Rm9ybXVsYUJhcicsICd0cnVlJ10sXG5cdFsnc2hvd0hvcml6b250YWxTY3JvbGwnLCAndHJ1ZSddLFxuXHRbJ3Nob3dPYmplY3RzJywgJ2FsbCddLFxuXHRbJ3Nob3dTaGVldFRhYnMnLCAndHJ1ZSddLFxuXHRbJ3Nob3dTdGF0dXNiYXInLCAndHJ1ZSddLFxuXHRbJ3Nob3dWZXJ0aWNhbFNjcm9sbCcsICd0cnVlJ10sXG5cdFsndGFiUmF0aW8nLCAnNjAwJ10sXG5cdFsneFdpbmRvdycsICcwJ10sXG5cdFsneVdpbmRvdycsICcwJ11cbl07Ki9cblxuZnVuY3Rpb24gcHVzaF9kZWZhdWx0c19hcnJheSh0YXJnZXQsIGRlZmF1bHRzKSB7XG5cdGZvcih2YXIgaiA9IDA7IGogIT0gdGFyZ2V0Lmxlbmd0aDsgKytqKSB7IHZhciB3ID0gdGFyZ2V0W2pdO1xuXHRcdGZvcih2YXIgaT0wOyBpICE9IGRlZmF1bHRzLmxlbmd0aDsgKytpKSB7IHZhciB6ID0gZGVmYXVsdHNbaV07XG5cdFx0XHRpZih3W3pbMF1dID09IG51bGwpIHdbelswXV0gPSB6WzFdO1xuXHRcdFx0ZWxzZSBzd2l0Y2goelsyXSkge1xuXHRcdFx0Y2FzZSBcImJvb2xcIjogaWYodHlwZW9mIHdbelswXV0gPT0gXCJzdHJpbmdcIikgd1t6WzBdXSA9IHBhcnNleG1sYm9vbCh3W3pbMF1dKTsgYnJlYWs7XG5cdFx0XHRjYXNlIFwiaW50XCI6IGlmKHR5cGVvZiB3W3pbMF1dID09IFwic3RyaW5nXCIpIHdbelswXV0gPSBwYXJzZUludCh3W3pbMF1dLCAxMCk7IGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZnVuY3Rpb24gcHVzaF9kZWZhdWx0cyh0YXJnZXQsIGRlZmF1bHRzKSB7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gZGVmYXVsdHMubGVuZ3RoOyArK2kpIHsgdmFyIHogPSBkZWZhdWx0c1tpXTtcblx0XHRpZih0YXJnZXRbelswXV0gPT0gbnVsbCkgdGFyZ2V0W3pbMF1dID0gelsxXTtcblx0XHRlbHNlIHN3aXRjaCh6WzJdKSB7XG5cdFx0XHRjYXNlIFwiYm9vbFwiOiBpZih0eXBlb2YgdGFyZ2V0W3pbMF1dID09IFwic3RyaW5nXCIpIHRhcmdldFt6WzBdXSA9IHBhcnNleG1sYm9vbCh0YXJnZXRbelswXV0pOyBicmVhaztcblx0XHRcdGNhc2UgXCJpbnRcIjogaWYodHlwZW9mIHRhcmdldFt6WzBdXSA9PSBcInN0cmluZ1wiKSB0YXJnZXRbelswXV0gPSBwYXJzZUludCh0YXJnZXRbelswXV0sIDEwKTsgYnJlYWs7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3diX2RlZmF1bHRzKHdiKSB7XG5cdHB1c2hfZGVmYXVsdHMod2IuV0JQcm9wcywgV0JQcm9wc0RlZik7XG5cdHB1c2hfZGVmYXVsdHMod2IuQ2FsY1ByLCBDYWxjUHJEZWYpO1xuXG5cdHB1c2hfZGVmYXVsdHNfYXJyYXkod2IuV0JWaWV3LCBXQlZpZXdEZWYpO1xuXHRwdXNoX2RlZmF1bHRzX2FycmF5KHdiLlNoZWV0cywgU2hlZXREZWYpO1xuXG5cdF9zc2ZvcHRzLmRhdGUxOTA0ID0gcGFyc2V4bWxib29sKHdiLldCUHJvcHMuZGF0ZTE5MDQpO1xufVxuXG5mdW5jdGlvbiBzYWZlMTkwNCh3Yi8qOldvcmtib29rKi8pLyo6c3RyaW5nKi8ge1xuXHQvKiBUT0RPOiBzdG9yZSBkYXRlMTkwNCBzb21ld2hlcmUgZWxzZSAqL1xuXHRpZighd2IuV29ya2Jvb2spIHJldHVybiBcImZhbHNlXCI7XG5cdGlmKCF3Yi5Xb3JrYm9vay5XQlByb3BzKSByZXR1cm4gXCJmYWxzZVwiO1xuXHRyZXR1cm4gcGFyc2V4bWxib29sKHdiLldvcmtib29rLldCUHJvcHMuZGF0ZTE5MDQpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCI7XG59XG5cbnZhciBiYWRjaGFycyA9IC8qI19fUFVSRV9fKi9cIl1bKj9cXC9cXFxcXCIuc3BsaXQoXCJcIik7XG5mdW5jdGlvbiBjaGVja193c19uYW1lKG4vKjpzdHJpbmcqLywgc2FmZS8qOj9ib29sZWFuKi8pLyo6Ym9vbGVhbiovIHtcblx0aWYobi5sZW5ndGggPiAzMSkgeyBpZihzYWZlKSByZXR1cm4gZmFsc2U7IHRocm93IG5ldyBFcnJvcihcIlNoZWV0IG5hbWVzIGNhbm5vdCBleGNlZWQgMzEgY2hhcnNcIik7IH1cblx0dmFyIF9nb29kID0gdHJ1ZTtcblx0YmFkY2hhcnMuZm9yRWFjaChmdW5jdGlvbihjKSB7XG5cdFx0aWYobi5pbmRleE9mKGMpID09IC0xKSByZXR1cm47XG5cdFx0aWYoIXNhZmUpIHRocm93IG5ldyBFcnJvcihcIlNoZWV0IG5hbWUgY2Fubm90IGNvbnRhaW4gOiBcXFxcIC8gPyAqIFsgXVwiKTtcblx0XHRfZ29vZCA9IGZhbHNlO1xuXHR9KTtcblx0cmV0dXJuIF9nb29kO1xufVxuZnVuY3Rpb24gY2hlY2tfd2JfbmFtZXMoTiwgUywgY29kZXMpIHtcblx0Ti5mb3JFYWNoKGZ1bmN0aW9uKG4saSkge1xuXHRcdGNoZWNrX3dzX25hbWUobik7XG5cdFx0Zm9yKHZhciBqID0gMDsgaiA8IGk7ICsraikgaWYobiA9PSBOW2pdKSB0aHJvdyBuZXcgRXJyb3IoXCJEdXBsaWNhdGUgU2hlZXQgTmFtZTogXCIgKyBuKTtcblx0XHRpZihjb2Rlcykge1xuXHRcdFx0dmFyIGNuID0gKFMgJiYgU1tpXSAmJiBTW2ldLkNvZGVOYW1lKSB8fCBuO1xuXHRcdFx0aWYoY24uY2hhckNvZGVBdCgwKSA9PSA5NSAmJiBjbi5sZW5ndGggPiAyMikgdGhyb3cgbmV3IEVycm9yKFwiQmFkIENvZGUgTmFtZTogV29ya3NoZWV0XCIgKyBjbik7XG5cdFx0fVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGNoZWNrX3diKHdiKSB7XG5cdGlmKCF3YiB8fCAhd2IuU2hlZXROYW1lcyB8fCAhd2IuU2hlZXRzKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFdvcmtib29rXCIpO1xuXHRpZighd2IuU2hlZXROYW1lcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcIldvcmtib29rIGlzIGVtcHR5XCIpO1xuXHR2YXIgU2hlZXRzID0gKHdiLldvcmtib29rICYmIHdiLldvcmtib29rLlNoZWV0cykgfHwgW107XG5cdGNoZWNrX3diX25hbWVzKHdiLlNoZWV0TmFtZXMsIFNoZWV0cywgISF3Yi52YmFyYXcpO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkgY2hlY2tfd3Mod2IuU2hlZXRzW3diLlNoZWV0TmFtZXNbaV1dLCB3Yi5TaGVldE5hbWVzW2ldLCBpKTtcblx0LyogVE9ETzogdmFsaWRhdGUgd29ya2Jvb2sgKi9cbn1cbi8qIDE4LjIgV29ya2Jvb2sgKi9cbnZhciB3Ym5zcmVnZXggPSAvPFxcdys6d29ya2Jvb2svO1xuZnVuY3Rpb24gcGFyc2Vfd2JfeG1sKGRhdGEsIG9wdHMpLyo6V29ya2Jvb2tGaWxlKi8ge1xuXHRpZighZGF0YSkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgZmlsZVwiKTtcblx0dmFyIHdiID0gLyo6OigqL3sgQXBwVmVyc2lvbjp7fSwgV0JQcm9wczp7fSwgV0JWaWV3OltdLCBTaGVldHM6W10sIENhbGNQcjp7fSwgTmFtZXM6W10sIHhtbG5zOiBcIlwiIH0vKjo6KSovO1xuXHR2YXIgcGFzcyA9IGZhbHNlLCB4bWxucyA9IFwieG1sbnNcIjtcblx0dmFyIGRuYW1lID0ge30sIGRuc3RhcnQgPSAwO1xuXHRkYXRhLnJlcGxhY2UodGFncmVnZXgsIGZ1bmN0aW9uIHhtbF93Yih4LCBpZHgpIHtcblx0XHR2YXIgeS8qOmFueSovID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHN0cmlwX25zKHlbMF0pKSB7XG5cdFx0XHRjYXNlICc8P3htbCc6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjI3IHdvcmtib29rIENUX1dvcmtib29rIDEgKi9cblx0XHRcdGNhc2UgJzx3b3JrYm9vayc6XG5cdFx0XHRcdGlmKHgubWF0Y2god2Juc3JlZ2V4KSkgeG1sbnMgPSBcInhtbG5zXCIgKyB4Lm1hdGNoKC88KFxcdyspOi8pWzFdO1xuXHRcdFx0XHR3Yi54bWxucyA9IHlbeG1sbnNdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzwvd29ya2Jvb2s+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTMgZmlsZVZlcnNpb24gQ1RfRmlsZVZlcnNpb24gPyAqL1xuXHRcdFx0Y2FzZSAnPGZpbGVWZXJzaW9uJzogZGVsZXRlIHlbMF07IHdiLkFwcFZlcnNpb24gPSB5OyBicmVhaztcblx0XHRcdGNhc2UgJzxmaWxlVmVyc2lvbi8+JzogY2FzZSAnPC9maWxlVmVyc2lvbj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMiBmaWxlU2hhcmluZyBDVF9GaWxlU2hhcmluZyA/ICovXG5cdFx0XHRjYXNlICc8ZmlsZVNoYXJpbmcnOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzxmaWxlU2hhcmluZy8+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMjggd29ya2Jvb2tQciBDVF9Xb3JrYm9va1ByID8gKi9cblx0XHRcdGNhc2UgJzx3b3JrYm9va1ByJzpcblx0XHRcdGNhc2UgJzx3b3JrYm9va1ByLz4nOlxuXHRcdFx0XHRXQlByb3BzRGVmLmZvckVhY2goZnVuY3Rpb24odykge1xuXHRcdFx0XHRcdGlmKHlbd1swXV0gPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0XHRcdHN3aXRjaCh3WzJdKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYm9vbFwiOiB3Yi5XQlByb3BzW3dbMF1dID0gcGFyc2V4bWxib29sKHlbd1swXV0pOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJpbnRcIjogd2IuV0JQcm9wc1t3WzBdXSA9IHBhcnNlSW50KHlbd1swXV0sIDEwKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OiB3Yi5XQlByb3BzW3dbMF1dID0geVt3WzBdXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZih5LmNvZGVOYW1lKSB3Yi5XQlByb3BzLkNvZGVOYW1lID0gdXRmOHJlYWQoeS5jb2RlTmFtZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC93b3JrYm9va1ByPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjI5IHdvcmtib29rUHJvdGVjdGlvbiBDVF9Xb3JrYm9va1Byb3RlY3Rpb24gPyAqL1xuXHRcdFx0Y2FzZSAnPHdvcmtib29rUHJvdGVjdGlvbic6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHdvcmtib29rUHJvdGVjdGlvbi8+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMSAgYm9va1ZpZXdzIENUX0Jvb2tWaWV3cyA/ICovXG5cdFx0XHRjYXNlICc8Ym9va1ZpZXdzJzogY2FzZSAnPGJvb2tWaWV3cz4nOiBjYXNlICc8L2Jvb2tWaWV3cz4nOiBicmVhaztcblx0XHRcdC8qIDE4LjIuMzAgICB3b3JrYm9va1ZpZXcgQ1RfQm9va1ZpZXcgKyAqL1xuXHRcdFx0Y2FzZSAnPHdvcmtib29rVmlldyc6IGNhc2UgJzx3b3JrYm9va1ZpZXcvPic6IGRlbGV0ZSB5WzBdOyB3Yi5XQlZpZXcucHVzaCh5KTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L3dvcmtib29rVmlldz4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4yMCBzaGVldHMgQ1RfU2hlZXRzIDEgKi9cblx0XHRcdGNhc2UgJzxzaGVldHMnOiBjYXNlICc8c2hlZXRzPic6IGNhc2UgJzwvc2hlZXRzPic6IGJyZWFrOyAvLyBhZ2dyZWdhdGUgc2hlZXRcblx0XHRcdC8qIDE4LjIuMTkgICBzaGVldCBDVF9TaGVldCArICovXG5cdFx0XHRjYXNlICc8c2hlZXQnOlxuXHRcdFx0XHRzd2l0Y2goeS5zdGF0ZSkge1xuXHRcdFx0XHRcdGNhc2UgXCJoaWRkZW5cIjogeS5IaWRkZW4gPSAxOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIFwidmVyeUhpZGRlblwiOiB5LkhpZGRlbiA9IDI7IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHkuSGlkZGVuID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRkZWxldGUgeS5zdGF0ZTtcblx0XHRcdFx0eS5uYW1lID0gdW5lc2NhcGV4bWwodXRmOHJlYWQoeS5uYW1lKSk7XG5cdFx0XHRcdGRlbGV0ZSB5WzBdOyB3Yi5TaGVldHMucHVzaCh5KTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L3NoZWV0Pic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjE1IGZ1bmN0aW9uR3JvdXBzIENUX0Z1bmN0aW9uR3JvdXBzID8gKi9cblx0XHRcdGNhc2UgJzxmdW5jdGlvbkdyb3Vwcyc6IGNhc2UgJzxmdW5jdGlvbkdyb3Vwcy8+JzogYnJlYWs7XG5cdFx0XHQvKiAxOC4yLjE0ICAgZnVuY3Rpb25Hcm91cCBDVF9GdW5jdGlvbkdyb3VwICsgKi9cblx0XHRcdGNhc2UgJzxmdW5jdGlvbkdyb3VwJzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuOSAgZXh0ZXJuYWxSZWZlcmVuY2VzIENUX0V4dGVybmFsUmVmZXJlbmNlcyA/ICovXG5cdFx0XHRjYXNlICc8ZXh0ZXJuYWxSZWZlcmVuY2VzJzogY2FzZSAnPC9leHRlcm5hbFJlZmVyZW5jZXM+JzogY2FzZSAnPGV4dGVybmFsUmVmZXJlbmNlcz4nOiBicmVhaztcblx0XHRcdC8qIDE4LjIuOCAgICBleHRlcm5hbFJlZmVyZW5jZSBDVF9FeHRlcm5hbFJlZmVyZW5jZSArICovXG5cdFx0XHRjYXNlICc8ZXh0ZXJuYWxSZWZlcmVuY2UnOiBicmVhaztcblxuXHRcdFx0LyogMTguMi42ICBkZWZpbmVkTmFtZXMgQ1RfRGVmaW5lZE5hbWVzID8gKi9cblx0XHRcdGNhc2UgJzxkZWZpbmVkTmFtZXMvPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGRlZmluZWROYW1lcz4nOiBjYXNlICc8ZGVmaW5lZE5hbWVzJzogcGFzcz10cnVlOyBicmVhaztcblx0XHRcdGNhc2UgJzwvZGVmaW5lZE5hbWVzPic6IHBhc3M9ZmFsc2U7IGJyZWFrO1xuXHRcdFx0LyogMTguMi41ICAgIGRlZmluZWROYW1lIENUX0RlZmluZWROYW1lICsgKi9cblx0XHRcdGNhc2UgJzxkZWZpbmVkTmFtZSc6IHtcblx0XHRcdFx0ZG5hbWUgPSB7fTtcblx0XHRcdFx0ZG5hbWUuTmFtZSA9IHV0ZjhyZWFkKHkubmFtZSk7XG5cdFx0XHRcdGlmKHkuY29tbWVudCkgZG5hbWUuQ29tbWVudCA9IHkuY29tbWVudDtcblx0XHRcdFx0aWYoeS5sb2NhbFNoZWV0SWQpIGRuYW1lLlNoZWV0ID0gK3kubG9jYWxTaGVldElkO1xuXHRcdFx0XHRpZihwYXJzZXhtbGJvb2woeS5oaWRkZW58fFwiMFwiKSkgZG5hbWUuSGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0ZG5zdGFydCA9IGlkeCArIHgubGVuZ3RoO1xuXHRcdFx0fVx0YnJlYWs7XG5cdFx0XHRjYXNlICc8L2RlZmluZWROYW1lPic6IHtcblx0XHRcdFx0ZG5hbWUuUmVmID0gdW5lc2NhcGV4bWwodXRmOHJlYWQoZGF0YS5zbGljZShkbnN0YXJ0LCBpZHgpKSk7XG5cdFx0XHRcdHdiLk5hbWVzLnB1c2goZG5hbWUpO1xuXHRcdFx0fSBicmVhaztcblx0XHRcdGNhc2UgJzxkZWZpbmVkTmFtZS8+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMiAgY2FsY1ByIENUX0NhbGNQciA/ICovXG5cdFx0XHRjYXNlICc8Y2FsY1ByJzogZGVsZXRlIHlbMF07IHdiLkNhbGNQciA9IHk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGNhbGNQci8+JzogZGVsZXRlIHlbMF07IHdiLkNhbGNQciA9IHk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9jYWxjUHI+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTYgb2xlU2l6ZSBDVF9PbGVTaXplID8gKHJlZiByZXF1aXJlZCkgKi9cblx0XHRcdGNhc2UgJzxvbGVTaXplJzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuNCAgY3VzdG9tV29ya2Jvb2tWaWV3cyBDVF9DdXN0b21Xb3JrYm9va1ZpZXdzID8gKi9cblx0XHRcdGNhc2UgJzxjdXN0b21Xb3JrYm9va1ZpZXdzPic6IGNhc2UgJzwvY3VzdG9tV29ya2Jvb2tWaWV3cz4nOiBjYXNlICc8Y3VzdG9tV29ya2Jvb2tWaWV3cyc6IGJyZWFrO1xuXHRcdFx0LyogMTguMi4zICBjdXN0b21Xb3JrYm9va1ZpZXcgQ1RfQ3VzdG9tV29ya2Jvb2tWaWV3ICsgKi9cblx0XHRcdGNhc2UgJzxjdXN0b21Xb3JrYm9va1ZpZXcnOiBjYXNlICc8L2N1c3RvbVdvcmtib29rVmlldz4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xOCBwaXZvdENhY2hlcyBDVF9QaXZvdENhY2hlcyA/ICovXG5cdFx0XHRjYXNlICc8cGl2b3RDYWNoZXM+JzogY2FzZSAnPC9waXZvdENhY2hlcz4nOiBjYXNlICc8cGl2b3RDYWNoZXMnOiBicmVhaztcblx0XHRcdC8qIDE4LjIuMTcgcGl2b3RDYWNoZSBDVF9QaXZvdENhY2hlID8gKi9cblx0XHRcdGNhc2UgJzxwaXZvdENhY2hlJzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMjEgc21hcnRUYWdQciBDVF9TbWFydFRhZ1ByID8gKi9cblx0XHRcdGNhc2UgJzxzbWFydFRhZ1ByJzogY2FzZSAnPHNtYXJ0VGFnUHIvPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjIzIHNtYXJ0VGFnVHlwZXMgQ1RfU21hcnRUYWdUeXBlcyA/ICovXG5cdFx0XHRjYXNlICc8c21hcnRUYWdUeXBlcyc6IGNhc2UgJzxzbWFydFRhZ1R5cGVzPic6IGNhc2UgJzwvc21hcnRUYWdUeXBlcz4nOiBicmVhaztcblx0XHRcdC8qIDE4LjIuMjIgc21hcnRUYWdUeXBlIENUX1NtYXJ0VGFnVHlwZSA/ICovXG5cdFx0XHRjYXNlICc8c21hcnRUYWdUeXBlJzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMjQgd2ViUHVibGlzaGluZyBDVF9XZWJQdWJsaXNoaW5nID8gKi9cblx0XHRcdGNhc2UgJzx3ZWJQdWJsaXNoaW5nJzogY2FzZSAnPHdlYlB1Ymxpc2hpbmcvPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjExIGZpbGVSZWNvdmVyeVByIENUX0ZpbGVSZWNvdmVyeVByID8gKi9cblx0XHRcdGNhc2UgJzxmaWxlUmVjb3ZlcnlQcic6IGNhc2UgJzxmaWxlUmVjb3ZlcnlQci8+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMjYgd2ViUHVibGlzaE9iamVjdHMgQ1RfV2ViUHVibGlzaE9iamVjdHMgPyAqL1xuXHRcdFx0Y2FzZSAnPHdlYlB1Ymxpc2hPYmplY3RzPic6IGNhc2UgJzx3ZWJQdWJsaXNoT2JqZWN0cyc6IGNhc2UgJzwvd2ViUHVibGlzaE9iamVjdHM+JzogYnJlYWs7XG5cdFx0XHQvKiAxOC4yLjI1IHdlYlB1Ymxpc2hPYmplY3QgQ1RfV2ViUHVibGlzaE9iamVjdCA/ICovXG5cdFx0XHRjYXNlICc8d2ViUHVibGlzaE9iamVjdCc6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjEwIGV4dExzdCBDVF9FeHRlbnNpb25MaXN0ID8gKi9cblx0XHRcdGNhc2UgJzxleHRMc3QnOiBjYXNlICc8ZXh0THN0Pic6IGNhc2UgJzwvZXh0THN0Pic6IGNhc2UgJzxleHRMc3QvPic6IGJyZWFrO1xuXHRcdFx0LyogMTguMi43ICBleHQgQ1RfRXh0ZW5zaW9uICsgKi9cblx0XHRcdGNhc2UgJzxleHQnOiBwYXNzPXRydWU7IGJyZWFrOyAvL1RPRE86IGNoZWNrIHdpdGggdmVyc2lvbnMgb2YgZXhjZWxcblx0XHRcdGNhc2UgJzwvZXh0Pic6IHBhc3M9ZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHQvKiBPdGhlcnMgKi9cblx0XHRcdGNhc2UgJzxBcmNoSUQnOiBicmVhaztcblx0XHRcdGNhc2UgJzxBbHRlcm5hdGVDb250ZW50Jzpcblx0XHRcdGNhc2UgJzxBbHRlcm5hdGVDb250ZW50Pic6IHBhc3M9dHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L0FsdGVybmF0ZUNvbnRlbnQ+JzogcGFzcz1mYWxzZTsgYnJlYWs7XG5cblx0XHRcdC8qIFRPRE8gKi9cblx0XHRcdGNhc2UgJzxyZXZpc2lvblB0cic6IGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OiBpZighcGFzcyAmJiBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIHdvcmtib29rJyk7XG5cdFx0fVxuXHRcdHJldHVybiB4O1xuXHR9KTtcblx0aWYoWE1MTlNfbWFpbi5pbmRleE9mKHdiLnhtbG5zKSA9PT0gLTEpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gTmFtZXNwYWNlOiBcIiArIHdiLnhtbG5zKTtcblxuXHRwYXJzZV93Yl9kZWZhdWx0cyh3Yik7XG5cblx0cmV0dXJuIHdiO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93Yl94bWwod2IvKjpXb3JrYm9vayovLyo6Oiwgb3B0czo/V3JpdGVPcHRzKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSXTtcblx0b1tvLmxlbmd0aF0gPSB3cml0ZXh0YWcoJ3dvcmtib29rJywgbnVsbCwge1xuXHRcdCd4bWxucyc6IFhNTE5TX21haW5bMF0sXG5cdFx0Ly8neG1sbnM6bXgnOiBYTUxOUy5teCxcblx0XHQvLyd4bWxuczpzJzogWE1MTlNfbWFpblswXSxcblx0XHQneG1sbnM6cic6IFhNTE5TLnJcblx0fSk7XG5cblx0dmFyIHdyaXRlX25hbWVzID0gKHdiLldvcmtib29rICYmICh3Yi5Xb3JrYm9vay5OYW1lc3x8W10pLmxlbmd0aCA+IDApO1xuXG5cdC8qIGZpbGVWZXJzaW9uICovXG5cdC8qIGZpbGVTaGFyaW5nICovXG5cblx0dmFyIHdvcmtib29rUHIvKjphbnkqLyA9ICh7Y29kZU5hbWU6XCJUaGlzV29ya2Jvb2tcIn0vKjphbnkqLyk7XG5cdGlmKHdiLldvcmtib29rICYmIHdiLldvcmtib29rLldCUHJvcHMpIHtcblx0XHRXQlByb3BzRGVmLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdFx0Lyo6OiBpZighd2IuV29ya2Jvb2sgfHwgIXdiLldvcmtib29rLldCUHJvcHMpIHRocm93IFwidW5yZWFjaGFibGVcIjsgKi9cblx0XHRcdGlmKCh3Yi5Xb3JrYm9vay5XQlByb3BzW3hbMF1dLyo6YW55Ki8pID09IG51bGwpIHJldHVybjtcblx0XHRcdGlmKCh3Yi5Xb3JrYm9vay5XQlByb3BzW3hbMF1dLyo6YW55Ki8pID09IHhbMV0pIHJldHVybjtcblx0XHRcdHdvcmtib29rUHJbeFswXV0gPSAod2IuV29ya2Jvb2suV0JQcm9wc1t4WzBdXS8qOmFueSovKTtcblx0XHR9KTtcblx0XHQvKjo6IGlmKCF3Yi5Xb3JrYm9vayB8fCAhd2IuV29ya2Jvb2suV0JQcm9wcykgdGhyb3cgXCJ1bnJlYWNoYWJsZVwiOyAqL1xuXHRcdGlmKHdiLldvcmtib29rLldCUHJvcHMuQ29kZU5hbWUpIHsgd29ya2Jvb2tQci5jb2RlTmFtZSA9IHdiLldvcmtib29rLldCUHJvcHMuQ29kZU5hbWU7IGRlbGV0ZSB3b3JrYm9va1ByLkNvZGVOYW1lOyB9XG5cdH1cblx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCd3b3JrYm9va1ByJywgbnVsbCwgd29ya2Jvb2tQcikpO1xuXG5cdC8qIHdvcmtib29rUHJvdGVjdGlvbiAqL1xuXG5cdHZhciBzaGVldHMgPSB3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5TaGVldHMgfHwgW107XG5cdHZhciBpID0gMDtcblxuXHQvKiBib29rVmlld3Mgb25seSB3cml0dGVuIGlmIGZpcnN0IHdvcmtzaGVldCBpcyBoaWRkZW4gKi9cblx0aWYoc2hlZXRzICYmIHNoZWV0c1swXSAmJiAhIXNoZWV0c1swXS5IaWRkZW4pIHtcblx0XHRvW28ubGVuZ3RoXSA9IFwiPGJvb2tWaWV3cz5cIjtcblx0XHRmb3IoaSA9IDA7IGkgIT0gd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYoIXNoZWV0c1tpXSkgYnJlYWs7XG5cdFx0XHRpZighc2hlZXRzW2ldLkhpZGRlbikgYnJlYWs7XG5cdFx0fVxuXHRcdGlmKGkgPT0gd2IuU2hlZXROYW1lcy5sZW5ndGgpIGkgPSAwO1xuXHRcdG9bby5sZW5ndGhdID0gJzx3b3JrYm9va1ZpZXcgZmlyc3RTaGVldD1cIicgKyBpICsgJ1wiIGFjdGl2ZVRhYj1cIicgKyBpICsgJ1wiLz4nO1xuXHRcdG9bby5sZW5ndGhdID0gXCI8L2Jvb2tWaWV3cz5cIjtcblx0fVxuXG5cdG9bby5sZW5ndGhdID0gXCI8c2hlZXRzPlwiO1xuXHRmb3IoaSA9IDA7IGkgIT0gd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBzaHQgPSAoe25hbWU6ZXNjYXBleG1sKHdiLlNoZWV0TmFtZXNbaV0uc2xpY2UoMCwzMSkpfS8qOmFueSovKTtcblx0XHRzaHQuc2hlZXRJZCA9IFwiXCIrKGkrMSk7XG5cdFx0c2h0W1wicjppZFwiXSA9IFwicklkXCIrKGkrMSk7XG5cdFx0aWYoc2hlZXRzW2ldKSBzd2l0Y2goc2hlZXRzW2ldLkhpZGRlbikge1xuXHRcdFx0Y2FzZSAxOiBzaHQuc3RhdGUgPSBcImhpZGRlblwiOyBicmVhaztcblx0XHRcdGNhc2UgMjogc2h0LnN0YXRlID0gXCJ2ZXJ5SGlkZGVuXCI7IGJyZWFrO1xuXHRcdH1cblx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ3NoZWV0JyxudWxsLHNodCkpO1xuXHR9XG5cdG9bby5sZW5ndGhdID0gXCI8L3NoZWV0cz5cIjtcblxuXHQvKiBmdW5jdGlvbkdyb3VwcyAqL1xuXHQvKiBleHRlcm5hbFJlZmVyZW5jZXMgKi9cblxuXHRpZih3cml0ZV9uYW1lcykge1xuXHRcdG9bby5sZW5ndGhdID0gXCI8ZGVmaW5lZE5hbWVzPlwiO1xuXHRcdGlmKHdiLldvcmtib29rICYmIHdiLldvcmtib29rLk5hbWVzKSB3Yi5Xb3JrYm9vay5OYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcblx0XHRcdHZhciBkLyo6YW55Ki8gPSB7bmFtZTpuLk5hbWV9O1xuXHRcdFx0aWYobi5Db21tZW50KSBkLmNvbW1lbnQgPSBuLkNvbW1lbnQ7XG5cdFx0XHRpZihuLlNoZWV0ICE9IG51bGwpIGQubG9jYWxTaGVldElkID0gXCJcIituLlNoZWV0O1xuXHRcdFx0aWYobi5IaWRkZW4pIGQuaGlkZGVuID0gXCIxXCI7XG5cdFx0XHRpZighbi5SZWYpIHJldHVybjtcblx0XHRcdG9bby5sZW5ndGhdID0gd3JpdGV4dGFnKCdkZWZpbmVkTmFtZScsIGVzY2FwZXhtbChuLlJlZiksIGQpO1xuXHRcdH0pO1xuXHRcdG9bby5sZW5ndGhdID0gXCI8L2RlZmluZWROYW1lcz5cIjtcblx0fVxuXG5cdC8qIGNhbGNQciAqL1xuXHQvKiBvbGVTaXplICovXG5cdC8qIGN1c3RvbVdvcmtib29rVmlld3MgKi9cblx0LyogcGl2b3RDYWNoZXMgKi9cblx0Lyogc21hcnRUYWdQciAqL1xuXHQvKiBzbWFydFRhZ1R5cGVzICovXG5cdC8qIHdlYlB1Ymxpc2hpbmcgKi9cblx0LyogZmlsZVJlY292ZXJ5UHIgKi9cblx0Lyogd2ViUHVibGlzaE9iamVjdHMgKi9cblx0LyogZXh0THN0ICovXG5cblx0aWYoby5sZW5ndGg+Mil7IG9bby5sZW5ndGhdID0gJzwvd29ya2Jvb2s+Jzsgb1sxXT1vWzFdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogW01TLVhMU0JdIDIuNC4zMDQgQnJ0QnVuZGxlU2ggKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEJ1bmRsZVNoKGRhdGEsIGxlbmd0aC8qOm51bWJlciovKSB7XG5cdHZhciB6ID0ge307XG5cdHouSGlkZGVuID0gZGF0YS5yZWFkX3NoaWZ0KDQpOyAvL2hzU3RhdGUgU1RfU2hlZXRTdGF0ZVxuXHR6LmlUYWJJRCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0ei5zdHJSZWxJRCA9IHBhcnNlX1JlbElEKGRhdGEsbGVuZ3RoLTgpO1xuXHR6Lm5hbWUgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSk7XG5cdHJldHVybiB6O1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0QnVuZGxlU2goZGF0YSwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMTI3KTtcblx0by53cml0ZV9zaGlmdCg0LCBkYXRhLkhpZGRlbik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgZGF0YS5pVGFiSUQpO1xuXHR3cml0ZV9SZWxJRChkYXRhLnN0clJlbElELCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKGRhdGEubmFtZS5zbGljZSgwLDMxKSwgbyk7XG5cdHJldHVybiBvLmxlbmd0aCA+IG8ubCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuODE1IEJydFdiUHJvcCAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0V2JQcm9wKGRhdGEsIGxlbmd0aCkvKjpXQlByb3BzKi8ge1xuXHR2YXIgby8qOldCUHJvcHMqLyA9ICh7fS8qOmFueSovKTtcblx0dmFyIGZsYWdzID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRvLmRlZmF1bHRUaGVtZVZlcnNpb24gPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBzdHJOYW1lID0gKGxlbmd0aCA+IDgpID8gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEpIDogXCJcIjtcblx0aWYoc3RyTmFtZS5sZW5ndGggPiAwKSBvLkNvZGVOYW1lID0gc3RyTmFtZTtcblx0by5hdXRvQ29tcHJlc3NQaWN0dXJlcyA9ICEhKGZsYWdzICYgMHgxMDAwMCk7XG5cdG8uYmFja3VwRmlsZSA9ICEhKGZsYWdzICYgMHg0MCk7XG5cdG8uY2hlY2tDb21wYXRpYmlsaXR5ID0gISEoZmxhZ3MgJiAweDEwMDApO1xuXHRvLmRhdGUxOTA0ID0gISEoZmxhZ3MgJiAweDAxKTtcblx0by5maWx0ZXJQcml2YWN5ID0gISEoZmxhZ3MgJiAweDA4KTtcblx0by5oaWRlUGl2b3RGaWVsZExpc3QgPSAhIShmbGFncyAmIDB4NDAwKTtcblx0by5wcm9tcHRlZFNvbHV0aW9ucyA9ICEhKGZsYWdzICYgMHgxMCk7XG5cdG8ucHVibGlzaEl0ZW1zID0gISEoZmxhZ3MgJiAweDgwMCk7XG5cdG8ucmVmcmVzaEFsbENvbm5lY3Rpb25zID0gISEoZmxhZ3MgJiAweDQwMDAwKTtcblx0by5zYXZlRXh0ZXJuYWxMaW5rVmFsdWVzID0gISEoZmxhZ3MgJiAweDgwKTtcblx0by5zaG93Qm9yZGVyVW5zZWxlY3RlZFRhYmxlcyA9ICEhKGZsYWdzICYgMHgwNCk7XG5cdG8uc2hvd0lua0Fubm90YXRpb24gPSAhIShmbGFncyAmIDB4MjApO1xuXHRvLnNob3dPYmplY3RzID0gW1wiYWxsXCIsIFwicGxhY2Vob2xkZXJzXCIsIFwibm9uZVwiXVsoZmxhZ3MgPj4gMTMpICYgMHgwM107XG5cdG8uc2hvd1Bpdm90Q2hhcnRGaWx0ZXIgPSAhIShmbGFncyAmIDB4ODAwMCk7XG5cdG8udXBkYXRlTGlua3MgPSBbXCJ1c2VyU2V0XCIsIFwibmV2ZXJcIiwgXCJhbHdheXNcIl1bKGZsYWdzID4+IDgpICYgMHgwM107XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0V2JQcm9wKGRhdGEvKjo/V0JQcm9wcyovLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1Zig3Mik7XG5cdHZhciBmbGFncyA9IDA7XG5cdGlmKGRhdGEpIHtcblx0XHQvKiBUT0RPOiBtaXJyb3IgcGFyc2VfQnJ0V2JQcm9wIGZpZWxkcyAqL1xuXHRcdGlmKGRhdGEuZmlsdGVyUHJpdmFjeSkgZmxhZ3MgfD0gMHgwODtcblx0fVxuXHRvLndyaXRlX3NoaWZ0KDQsIGZsYWdzKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0d3JpdGVfWExTQkNvZGVOYW1lKGRhdGEgJiYgZGF0YS5Db2RlTmFtZSB8fCBcIlRoaXNXb3JrYm9va1wiLCBvKTtcblx0cmV0dXJuIG8uc2xpY2UoMCwgby5sKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfQnJ0RlJUQXJjaElEJChkYXRhLCBsZW5ndGgpIHtcblx0dmFyIG8gPSB7fTtcblx0ZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRvLkFyY2hJRCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0ZGF0YS5sICs9IGxlbmd0aCAtIDg7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY4NyBCcnROYW1lICovXG5mdW5jdGlvbiBwYXJzZV9CcnROYW1lKGRhdGEsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gZGF0YS5sICsgbGVuZ3RoO1xuXHRkYXRhLmwgKz0gNDsgLy92YXIgZmxhZ3MgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdGRhdGEubCArPSAxOyAvL3ZhciBjaEtleSA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIGl0YWIgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBuYW1lID0gcGFyc2VfWExOYW1lV2lkZVN0cmluZyhkYXRhKTtcblx0dmFyIGZvcm11bGEgPSBwYXJzZV9YTFNCTmFtZVBhcnNlZEZvcm11bGEoZGF0YSwgMCwgb3B0cyk7XG5cdHZhciBjb21tZW50ID0gcGFyc2VfWExOdWxsYWJsZVdpZGVTdHJpbmcoZGF0YSk7XG5cdC8vaWYoMCAvKiBmUHJvYyAqLykge1xuXHRcdC8vIHVudXNlZHN0cmluZzE6IFhMTnVsbGFibGVXaWRlU3RyaW5nXG5cdFx0Ly8gZGVzY3JpcHRpb246IFhMTnVsbGFibGVXaWRlU3RyaW5nXG5cdFx0Ly8gaGVscFRvcGljOiBYTE51bGxhYmxlV2lkZVN0cmluZ1xuXHRcdC8vIHVudXNlZHN0cmluZzI6IFhMTnVsbGFibGVXaWRlU3RyaW5nXG5cdC8vfVxuXHRkYXRhLmwgPSBlbmQ7XG5cdHZhciBvdXQgPSAoe05hbWU6bmFtZSwgUHRnOmZvcm11bGF9Lyo6YW55Ki8pO1xuXHRpZihpdGFiIDwgMHhGRkZGRkZGKSBvdXQuU2hlZXQgPSBpdGFiO1xuXHRpZihjb21tZW50KSBvdXQuQ29tbWVudCA9IGNvbW1lbnQ7XG5cdHJldHVybiBvdXQ7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjEuNy42MSBXb3JrYm9vayAqL1xuZnVuY3Rpb24gcGFyc2Vfd2JfYmluKGRhdGEsIG9wdHMpLyo6V29ya2Jvb2tGaWxlKi8ge1xuXHR2YXIgd2IgPSB7IEFwcFZlcnNpb246e30sIFdCUHJvcHM6e30sIFdCVmlldzpbXSwgU2hlZXRzOltdLCBDYWxjUHI6e30sIHhtbG5zOiBcIlwiIH07XG5cdHZhciBzdGF0ZS8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXG5cdGlmKCFvcHRzKSBvcHRzID0ge307XG5cdG9wdHMuYmlmZiA9IDEyO1xuXG5cdHZhciBOYW1lcyA9IFtdO1xuXHR2YXIgc3VwYm9va3MgPSAoW1tdXS8qOmFueSovKTtcblx0c3VwYm9va3MuU2hlZXROYW1lcyA9IFtdO1xuXHRzdXBib29rcy5YVEkgPSBbXTtcblxuXHRYTFNCUmVjb3JkRW51bVsweDAwMTBdID0geyBuOlwiQnJ0RlJUQXJjaElEJFwiLCBmOnBhcnNlX0JydEZSVEFyY2hJRCQgfTtcblxuXHRyZWNvcmRob3BwZXIoZGF0YSwgZnVuY3Rpb24gaG9wcGVyX3diKHZhbCwgUiwgUlQpIHtcblx0XHRzd2l0Y2goUlQpIHtcblx0XHRcdGNhc2UgMHgwMDlDOiAvKiAnQnJ0QnVuZGxlU2gnICovXG5cdFx0XHRcdHN1cGJvb2tzLlNoZWV0TmFtZXMucHVzaCh2YWwubmFtZSk7XG5cdFx0XHRcdHdiLlNoZWV0cy5wdXNoKHZhbCk7IGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDA5OTogLyogJ0JydFdiUHJvcCcgKi9cblx0XHRcdFx0d2IuV0JQcm9wcyA9IHZhbDsgYnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDI3OiAvKiAnQnJ0TmFtZScgKi9cblx0XHRcdFx0aWYodmFsLlNoZWV0ICE9IG51bGwpIG9wdHMuU0lEID0gdmFsLlNoZWV0O1xuXHRcdFx0XHR2YWwuUmVmID0gc3RyaW5naWZ5X2Zvcm11bGEodmFsLlB0ZywgbnVsbCwgbnVsbCwgc3VwYm9va3MsIG9wdHMpO1xuXHRcdFx0XHRkZWxldGUgb3B0cy5TSUQ7XG5cdFx0XHRcdGRlbGV0ZSB2YWwuUHRnO1xuXHRcdFx0XHROYW1lcy5wdXNoKHZhbCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDA0MEM6IC8qICdCcnROYW1lRXh0JyAqLyBicmVhaztcblxuXHRcdFx0Y2FzZSAweDAxNjU6IC8qICdCcnRTdXBTZWxmJyAqL1xuXHRcdFx0Y2FzZSAweDAxNjY6IC8qICdCcnRTdXBTYW1lJyAqL1xuXHRcdFx0Y2FzZSAweDAxNjM6IC8qICdCcnRTdXBCb29rU3JjJyAqL1xuXHRcdFx0Y2FzZSAweDAyOUI6IC8qICdCcnRTdXBBZGRpbicgKi9cblx0XHRcdFx0aWYoIXN1cGJvb2tzWzBdLmxlbmd0aCkgc3VwYm9va3NbMF0gPSBbUlQsIHZhbF07XG5cdFx0XHRcdGVsc2Ugc3VwYm9va3MucHVzaChbUlQsIHZhbF0pO1xuXHRcdFx0XHRzdXBib29rc1tzdXBib29rcy5sZW5ndGggLSAxXS5YVEkgPSBbXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDB4MDE2QTogLyogJ0JydEV4dGVyblNoZWV0JyAqL1xuXHRcdFx0XHRpZihzdXBib29rcy5sZW5ndGggPT09IDApIHsgc3VwYm9va3NbMF0gPSBbXTsgc3VwYm9va3NbMF0uWFRJID0gW107IH1cblx0XHRcdFx0c3VwYm9va3Nbc3VwYm9va3MubGVuZ3RoIC0gMV0uWFRJID0gc3VwYm9va3Nbc3VwYm9va3MubGVuZ3RoIC0gMV0uWFRJLmNvbmNhdCh2YWwpO1xuXHRcdFx0XHRzdXBib29rcy5YVEkgPSBzdXBib29rcy5YVEkuY29uY2F0KHZhbCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAxNjk6IC8qICdCcnRQbGFjZWhvbGRlck5hbWUnICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDgxNzogLyogJ0JydEFic1BhdGgxNScgKi9cblx0XHRcdGNhc2UgMHgwMDlFOiAvKiAnQnJ0Qm9va1ZpZXcnICovXG5cdFx0XHRjYXNlIDB4MDA4RjogLyogJ0JydEJlZ2luQnVuZGxlU2hzJyAqL1xuXHRcdFx0Y2FzZSAweDAyOTg6IC8qICdCcnRCZWdpbkZuR3JvdXAnICovXG5cdFx0XHRjYXNlIDB4MDE2MTogLyogJ0JydEJlZ2luRXh0ZXJuYWxzJyAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogY2FzZSAnQnJ0TW9kZWxUaW1lR3JvdXBpbmdDYWxjQ29sJyAqL1xuXHRcdFx0Y2FzZSAweDBDMDA6IC8qICdCcnRVaWQnICovXG5cdFx0XHRjYXNlIDB4MEMwMTogLyogJ0JydFJldmlzaW9uUHRyJyAqL1xuXHRcdFx0Y2FzZSAweDAyMTY6IC8qICdCcnRCb29rUHJvdGVjdGlvbicgKi9cblx0XHRcdGNhc2UgMHgwMkE1OiAvKiAnQnJ0Qm9va1Byb3RlY3Rpb25Jc28nICovXG5cdFx0XHRjYXNlIDB4MDA5RDogLyogJ0JydENhbGNQcm9wJyAqL1xuXHRcdFx0Y2FzZSAweDAyNjI6IC8qICdCcnRDcmFzaFJlY0VycicgKi9cblx0XHRcdGNhc2UgMHgwODAyOiAvKiAnQnJ0RGVjb3VwbGVkUGl2b3RDYWNoZUlEJyAqL1xuXHRcdFx0Y2FzZSAweDAwOUI6IC8qICdCcnRGaWxlUmVjb3ZlcicgKi9cblx0XHRcdGNhc2UgMHgwMjI0OiAvKiAnQnJ0RmlsZVNoYXJpbmcnICovXG5cdFx0XHRjYXNlIDB4MDJBNDogLyogJ0JydEZpbGVTaGFyaW5nSXNvJyAqL1xuXHRcdFx0Y2FzZSAweDAwODA6IC8qICdCcnRGaWxlVmVyc2lvbicgKi9cblx0XHRcdGNhc2UgMHgwMjk5OiAvKiAnQnJ0Rm5Hcm91cCcgKi9cblx0XHRcdGNhc2UgMHgwODUwOiAvKiAnQnJ0TW9kZWxSZWxhdGlvbnNoaXAnICovXG5cdFx0XHRjYXNlIDB4MDg0RDogLyogJ0JydE1vZGVsVGFibGUnICovXG5cdFx0XHRjYXNlIDB4MDIyNTogLyogJ0JydE9sZVNpemUnICovXG5cdFx0XHRjYXNlIDB4MDgwNTogLyogJ0JydFBpdm90VGFibGVSZWYnICovXG5cdFx0XHRjYXNlIDB4MDI1NDogLyogJ0JydFNtYXJ0VGFnVHlwZScgKi9cblx0XHRcdGNhc2UgMHgwODFDOiAvKiAnQnJ0VGFibGVTbGljZXJDYWNoZUlEJyAqL1xuXHRcdFx0Y2FzZSAweDA4MUI6IC8qICdCcnRUYWJsZVNsaWNlckNhY2hlSURzJyAqL1xuXHRcdFx0Y2FzZSAweDA4MjI6IC8qICdCcnRUaW1lbGluZUNhY2hlUGl2b3RDYWNoZUlEJyAqL1xuXHRcdFx0Y2FzZSAweDAxOEQ6IC8qICdCcnRVc2VyQm9va1ZpZXcnICovXG5cdFx0XHRjYXNlIDB4MDA5QTogLyogJ0JydFdiRmFjdG9pZCcgKi9cblx0XHRcdGNhc2UgMHgwNDVEOiAvKiAnQnJ0V2JQcm9wMTQnICovXG5cdFx0XHRjYXNlIDB4MDIyOTogLyogJ0JydFdlYk9wdCcgKi9cblx0XHRcdGNhc2UgMHgwODJCOiAvKiAnQnJ0V29ya0Jvb2tQcjE1JyAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMjM6IC8qICdCcnRGUlRCZWdpbicgKi9cblx0XHRcdFx0c3RhdGUucHVzaChSVCk7IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRzdGF0ZS5wb3AoKTsgcGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI1OiAvKiAnQnJ0QUNCZWdpbicgKi9cblx0XHRcdFx0c3RhdGUucHVzaChSVCk7IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI2OiAvKiAnQnJ0QUNFbmQnICovXG5cdFx0XHRcdHN0YXRlLnBvcCgpOyBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDAxMDogLyogJ0JydEZSVEFyY2hJRCQnICovIGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZihSLlQpey8qIGVtcHR5ICovfVxuXHRcdFx0XHRlbHNlIGlmKCFwYXNzIHx8IChvcHRzLldURiAmJiBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0gIT0gMHgwMDI1IC8qIEJydEFDQmVnaW4gKi8gJiYgc3RhdGVbc3RhdGUubGVuZ3RoLTFdICE9IDB4MDAyMyAvKiBCcnRGUlRCZWdpbiAqLykpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcmVjb3JkIDB4XCIgKyBSVC50b1N0cmluZygxNikpO1xuXHRcdH1cblx0fSwgb3B0cyk7XG5cblx0cGFyc2Vfd2JfZGVmYXVsdHMod2IpO1xuXG5cdC8vICRGbG93SWdub3JlXG5cdHdiLk5hbWVzID0gTmFtZXM7XG5cblx0KHdiLyo6YW55Ki8pLnN1cGJvb2tzID0gc3VwYm9va3M7XG5cdHJldHVybiB3Yjtcbn1cblxuZnVuY3Rpb24gd3JpdGVfQlVORExFU0hTKGJhLCB3Yi8qOjosIG9wdHMqLykge1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA4RiAvKiBCcnRCZWdpbkJ1bmRsZVNocyAqLyk7XG5cdGZvcih2YXIgaWR4ID0gMDsgaWR4ICE9IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK2lkeCkge1xuXHRcdHZhciB2aXogPSB3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5TaGVldHMgJiYgd2IuV29ya2Jvb2suU2hlZXRzW2lkeF0gJiYgd2IuV29ya2Jvb2suU2hlZXRzW2lkeF0uSGlkZGVuIHx8IDA7XG5cdFx0dmFyIGQgPSB7IEhpZGRlbjogdml6LCBpVGFiSUQ6IGlkeCsxLCBzdHJSZWxJRDogJ3JJZCcgKyAoaWR4KzEpLCBuYW1lOiB3Yi5TaGVldE5hbWVzW2lkeF0gfTtcblx0XHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA5QyAvKiBCcnRCdW5kbGVTaCAqLywgd3JpdGVfQnJ0QnVuZGxlU2goZCkpO1xuXHR9XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDkwIC8qIEJydEVuZEJ1bmRsZVNocyAqLyk7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNjQ5IEJydEZpbGVWZXJzaW9uICovXG5mdW5jdGlvbiB3cml0ZV9CcnRGaWxlVmVyc2lvbihkYXRhLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1ZigxMjcpO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IDQ7ICsraSkgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKFwiU2hlZXRKU1wiLCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKFhMU1gudmVyc2lvbiwgbyk7XG5cdHdyaXRlX1hMV2lkZVN0cmluZyhYTFNYLnZlcnNpb24sIG8pO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoXCI3MjYyXCIsIG8pO1xuXHRyZXR1cm4gby5sZW5ndGggPiBvLmwgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjMwMSBCcnRCb29rVmlldyAqL1xuZnVuY3Rpb24gd3JpdGVfQnJ0Qm9va1ZpZXcoaWR4LCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1ZigyOSk7XG5cdG8ud3JpdGVfc2hpZnQoLTQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KC00LCA0NjApO1xuXHRvLndyaXRlX3NoaWZ0KDQsICAyODgwMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgIDE3NjAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAgNTAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAgaWR4KTtcblx0by53cml0ZV9zaGlmdCg0LCAgaWR4KTtcblx0dmFyIGZsYWdzID0gMHg3ODtcblx0by53cml0ZV9zaGlmdCgxLCAgZmxhZ3MpO1xuXHRyZXR1cm4gby5sZW5ndGggPiBvLmwgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9CT09LVklFV1MoYmEsIHdiLyo6Oiwgb3B0cyovKSB7XG5cdC8qIHJlcXVpcmVkIGlmIGhpZGRlbiB0YWIgYXBwZWFycyBiZWZvcmUgdmlzaWJsZSB0YWIgKi9cblx0aWYoIXdiLldvcmtib29rIHx8ICF3Yi5Xb3JrYm9vay5TaGVldHMpIHJldHVybjtcblx0dmFyIHNoZWV0cyA9IHdiLldvcmtib29rLlNoZWV0cztcblx0dmFyIGkgPSAwLCB2aXN0YWIgPSAtMSwgaGlkZGVuID0gLTE7XG5cdGZvcig7IGkgPCBzaGVldHMubGVuZ3RoOyArK2kpIHtcblx0XHRpZighc2hlZXRzW2ldIHx8ICFzaGVldHNbaV0uSGlkZGVuICYmIHZpc3RhYiA9PSAtMSkgdmlzdGFiID0gaTtcblx0XHRlbHNlIGlmKHNoZWV0c1tpXS5IaWRkZW4gPT0gMSAmJiBoaWRkZW4gPT0gLTEpIGhpZGRlbiA9IGk7XG5cdH1cblx0aWYoaGlkZGVuID4gdmlzdGFiKSByZXR1cm47XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDg3IC8qIEJydEJlZ2luQm9va1ZpZXdzICovKTtcblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwOUUgLyogQnJ0Qm9va1ZpZXcgKi8sIHdyaXRlX0JydEJvb2tWaWV3KHZpc3RhYikpO1xuXHQvKiAxKihCcnRCb29rVmlldyAqRlJUKSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIDB4MDA4OCAvKiBCcnRFbmRCb29rVmlld3MgKi8pO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjMwNSBCcnRDYWxjUHJvcCAqL1xuLypmdW5jdGlvbiB3cml0ZV9CcnRDYWxjUHJvcChkYXRhLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1ZigyNik7XG5cdG8ud3JpdGVfc2hpZnQoNCwwKTsgLy8gZm9yY2UgcmVjYWxjXG5cdG8ud3JpdGVfc2hpZnQoNCwxKTtcblx0by53cml0ZV9zaGlmdCg0LDApO1xuXHR3cml0ZV9YbnVtKDAsIG8pO1xuXHRvLndyaXRlX3NoaWZ0KC00LCAxMDIzKTtcblx0by53cml0ZV9zaGlmdCgxLCAweDMzKTtcblx0by53cml0ZV9zaGlmdCgxLCAweDAwKTtcblx0cmV0dXJuIG87XG59Ki9cblxuLyogW01TLVhMU0JdIDIuNC42NDYgQnJ0RmlsZVJlY292ZXIgKi9cbi8qZnVuY3Rpb24gd3JpdGVfQnJ0RmlsZVJlY292ZXIoZGF0YSwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMSk7XG5cdG8ud3JpdGVfc2hpZnQoMSwwKTtcblx0cmV0dXJuIG87XG59Ki9cblxuLyogW01TLVhMU0JdIDIuMS43LjYxIFdvcmtib29rICovXG5mdW5jdGlvbiB3cml0ZV93Yl9iaW4od2IsIG9wdHMpIHtcblx0dmFyIGJhID0gYnVmX2FycmF5KCk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDgzIC8qIEJydEJlZ2luQm9vayAqLyk7XG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDgwIC8qIEJydEZpbGVWZXJzaW9uICovLCB3cml0ZV9CcnRGaWxlVmVyc2lvbigpKTtcblx0LyogW1tCcnRGaWxlU2hhcmluZ0lzb10gQnJ0RmlsZVNoYXJpbmddICovXG5cdHdyaXRlX3JlY29yZChiYSwgMHgwMDk5IC8qIEJydFdiUHJvcCAqLywgd3JpdGVfQnJ0V2JQcm9wKHdiLldvcmtib29rICYmIHdiLldvcmtib29rLldCUHJvcHMgfHwgbnVsbCkpO1xuXHQvKiBbQUNBQlNQQVRIXSAqL1xuXHQvKiBbW0JydEJvb2tQcm90ZWN0aW9uSXNvXSBCcnRCb29rUHJvdGVjdGlvbl0gKi9cblx0d3JpdGVfQk9PS1ZJRVdTKGJhLCB3Yiwgb3B0cyk7XG5cdHdyaXRlX0JVTkRMRVNIUyhiYSwgd2IsIG9wdHMpO1xuXHQvKiBbRk5HUk9VUF0gKi9cblx0LyogW0VYVEVSTkFMU10gKi9cblx0LyogKkJydE5hbWUgKi9cblx0Lyogd3JpdGVfcmVjb3JkKGJhLCAweDAwOUQgQnJ0Q2FsY1Byb3AsIHdyaXRlX0JydENhbGNQcm9wKCkpOyAqL1xuXHQvKiBbQnJ0T2xlU2l6ZV0gKi9cblx0LyogKihCcnRVc2VyQm9va1ZpZXcgKkZSVCkgKi9cblx0LyogW1BJVk9UQ0FDSEVJRFNdICovXG5cdC8qIFtCcnRXYkZhY3RvaWRdICovXG5cdC8qIFtTTUFSVFRBR1RZUEVTXSAqL1xuXHQvKiBbQnJ0V2ViT3B0XSAqL1xuXHQvKiB3cml0ZV9yZWNvcmQoYmEsIDB4MDA5QiBCcnRGaWxlUmVjb3Zlciwgd3JpdGVfQnJ0RmlsZVJlY292ZXIoKSk7ICovXG5cdC8qIFtXRUJQVUJJVEVNU10gKi9cblx0LyogW0NSRVJSU10gKi9cblx0LyogRlJUV09SS0JPT0sgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCAweDAwODQgLyogQnJ0RW5kQm9vayAqLyk7XG5cblx0cmV0dXJuIGJhLmVuZCgpO1xufVxuZnVuY3Rpb24gcGFyc2Vfd2IoZGF0YSwgbmFtZS8qOnN0cmluZyovLCBvcHRzKS8qOldvcmtib29rRmlsZSovIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX3diX2JpbigoZGF0YS8qOmFueSovKSwgb3B0cyk7XG5cdHJldHVybiBwYXJzZV93Yl94bWwoKGRhdGEvKjphbnkqLyksIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV93cyhkYXRhLCBuYW1lLyo6c3RyaW5nKi8sIGlkeC8qOm51bWJlciovLCBvcHRzLCByZWxzLCB3YiwgdGhlbWVzLCBzdHlsZXMpLyo6V29ya3NoZWV0Ki8ge1xuXHRpZihuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiKSByZXR1cm4gcGFyc2Vfd3NfYmluKChkYXRhLyo6YW55Ki8pLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG5cdHJldHVybiBwYXJzZV93c194bWwoKGRhdGEvKjphbnkqLyksIG9wdHMsIGlkeCwgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3MoZGF0YSwgbmFtZS8qOnN0cmluZyovLCBpZHgvKjpudW1iZXIqLywgb3B0cywgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKS8qOldvcmtzaGVldCovIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX2NzX2JpbigoZGF0YS8qOmFueSovKSwgb3B0cywgaWR4LCByZWxzLCB3YiwgdGhlbWVzLCBzdHlsZXMpO1xuXHRyZXR1cm4gcGFyc2VfY3NfeG1sKChkYXRhLyo6YW55Ki8pLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX21zKGRhdGEsIG5hbWUvKjpzdHJpbmcqLywgaWR4Lyo6bnVtYmVyKi8sIG9wdHMsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcykvKjpXb3Jrc2hlZXQqLyB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9tc19iaW4oKGRhdGEvKjphbnkqLyksIG9wdHMsIGlkeCwgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKTtcblx0cmV0dXJuIHBhcnNlX21zX3htbCgoZGF0YS8qOmFueSovKSwgb3B0cywgaWR4LCByZWxzLCB3YiwgdGhlbWVzLCBzdHlsZXMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9kcyhkYXRhLCBuYW1lLyo6c3RyaW5nKi8sIGlkeC8qOm51bWJlciovLCBvcHRzLCByZWxzLCB3YiwgdGhlbWVzLCBzdHlsZXMpLyo6V29ya3NoZWV0Ki8ge1xuXHRpZihuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiKSByZXR1cm4gcGFyc2VfZHNfYmluKChkYXRhLyo6YW55Ki8pLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG5cdHJldHVybiBwYXJzZV9kc194bWwoKGRhdGEvKjphbnkqLyksIG9wdHMsIGlkeCwgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2Vfc3R5KGRhdGEsIG5hbWUvKjpzdHJpbmcqLywgdGhlbWVzLCBvcHRzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9zdHlfYmluKChkYXRhLyo6YW55Ki8pLCB0aGVtZXMsIG9wdHMpO1xuXHRyZXR1cm4gcGFyc2Vfc3R5X3htbCgoZGF0YS8qOmFueSovKSwgdGhlbWVzLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfdGhlbWUoZGF0YS8qOnN0cmluZyovLCBuYW1lLyo6c3RyaW5nKi8sIG9wdHMpIHtcblx0cmV0dXJuIHBhcnNlX3RoZW1lX3htbChkYXRhLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2Vfc3N0KGRhdGEsIG5hbWUvKjpzdHJpbmcqLywgb3B0cykvKjpTU1QqLyB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9zc3RfYmluKChkYXRhLyo6YW55Ki8pLCBvcHRzKTtcblx0cmV0dXJuIHBhcnNlX3NzdF94bWwoKGRhdGEvKjphbnkqLyksIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jbW50KGRhdGEsIG5hbWUvKjpzdHJpbmcqLywgb3B0cykvKjpBcnJheTxSYXdDb21tZW50PiovIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX2NvbW1lbnRzX2JpbigoZGF0YS8qOmFueSovKSwgb3B0cyk7XG5cdHJldHVybiBwYXJzZV9jb21tZW50c194bWwoKGRhdGEvKjphbnkqLyksIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jYyhkYXRhLCBuYW1lLyo6c3RyaW5nKi8sIG9wdHMpIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX2NjX2JpbigoZGF0YS8qOmFueSovKSwgbmFtZSwgb3B0cyk7XG5cdHJldHVybiBwYXJzZV9jY194bWwoKGRhdGEvKjphbnkqLyksIG5hbWUsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV94bGluayhkYXRhLCByZWwsIG5hbWUvKjpzdHJpbmcqLywgb3B0cykge1xuXHRpZihuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiKSByZXR1cm4gcGFyc2VfeGxpbmtfYmluKChkYXRhLyo6YW55Ki8pLCByZWwsIG5hbWUsIG9wdHMpO1xuXHRyZXR1cm4gcGFyc2VfeGxpbmtfeG1sKChkYXRhLyo6YW55Ki8pLCByZWwsIG5hbWUsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV94bG1ldGEoZGF0YSwgbmFtZS8qOnN0cmluZyovLCBvcHRzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV94bG1ldGFfYmluKChkYXRhLyo6YW55Ki8pLCBuYW1lLCBvcHRzKTtcblx0cmV0dXJuIHBhcnNlX3hsbWV0YV94bWwoKGRhdGEvKjphbnkqLyksIG5hbWUsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93Yih3YiwgbmFtZS8qOnN0cmluZyovLCBvcHRzKSB7XG5cdHJldHVybiAobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIiA/IHdyaXRlX3diX2JpbiA6IHdyaXRlX3diX3htbCkod2IsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93cyhkYXRhLyo6bnVtYmVyKi8sIG5hbWUvKjpzdHJpbmcqLywgb3B0cywgd2IvKjpXb3JrYm9vayovLCByZWxzKSB7XG5cdHJldHVybiAobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIiA/IHdyaXRlX3dzX2JpbiA6IHdyaXRlX3dzX3htbCkoZGF0YSwgb3B0cywgd2IsIHJlbHMpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmZ1bmN0aW9uIHdyaXRlX2NzKGRhdGEvKjpudW1iZXIqLywgbmFtZS8qOnN0cmluZyovLCBvcHRzLCB3Yi8qOldvcmtib29rKi8sIHJlbHMpIHtcblx0cmV0dXJuIChuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiID8gd3JpdGVfY3NfYmluIDogd3JpdGVfY3NfeG1sKShkYXRhLCBvcHRzLCB3YiwgcmVscyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3N0eShkYXRhLCBuYW1lLyo6c3RyaW5nKi8sIG9wdHMpIHtcblx0cmV0dXJuIChuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiID8gd3JpdGVfc3R5X2JpbiA6IHdyaXRlX3N0eV94bWwpKGRhdGEsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9zc3QoZGF0YS8qOlNTVCovLCBuYW1lLyo6c3RyaW5nKi8sIG9wdHMpIHtcblx0cmV0dXJuIChuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiID8gd3JpdGVfc3N0X2JpbiA6IHdyaXRlX3NzdF94bWwpKGRhdGEsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9jbW50KGRhdGEvKjpBcnJheTxhbnk+Ki8sIG5hbWUvKjpzdHJpbmcqLywgb3B0cykge1xuXHRyZXR1cm4gKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIgPyB3cml0ZV9jb21tZW50c19iaW4gOiB3cml0ZV9jb21tZW50c194bWwpKGRhdGEsIG9wdHMpO1xufVxuLypcbmZ1bmN0aW9uIHdyaXRlX2NjKGRhdGEsIG5hbWU6c3RyaW5nLCBvcHRzKSB7XG5cdHJldHVybiAobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIiA/IHdyaXRlX2NjX2JpbiA6IHdyaXRlX2NjX3htbCkoZGF0YSwgb3B0cyk7XG59XG4qL1xuXG5mdW5jdGlvbiB3cml0ZV94bG1ldGEobmFtZS8qOnN0cmluZyovKSB7XG5cdHJldHVybiAobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIiA/IHdyaXRlX3hsbWV0YV9iaW4gOiB3cml0ZV94bG1ldGFfeG1sKSgpO1xufVxudmFyIGF0dHJlZ2V4ZzI9LyhbXFx3Ol0rKT0oKD86XCIpKFteXCJdKikoPzpcIil8KD86JykoW14nXSopKD86JykpL2c7XG52YXIgYXR0cmVnZXgyPS8oW1xcdzpdKyk9KCg/OlwiKSg/OlteXCJdKikoPzpcIil8KD86JykoPzpbXiddKikoPzonKSkvO1xuZnVuY3Rpb24geGxtbF9wYXJzZXhtbHRhZyh0YWcvKjpzdHJpbmcqLywgc2tpcF9yb290Lyo6P2Jvb2xlYW4qLykge1xuXHR2YXIgd29yZHMgPSB0YWcuc3BsaXQoL1xccysvKTtcblx0dmFyIHovKjphbnkqLyA9IChbXS8qOmFueSovKTsgaWYoIXNraXBfcm9vdCkgelswXSA9IHdvcmRzWzBdO1xuXHRpZih3b3Jkcy5sZW5ndGggPT09IDEpIHJldHVybiB6O1xuXHR2YXIgbSA9IHRhZy5tYXRjaChhdHRyZWdleGcyKSwgeSwgaiwgdywgaTtcblx0aWYobSkgZm9yKGkgPSAwOyBpICE9IG0ubGVuZ3RoOyArK2kpIHtcblx0XHR5ID0gbVtpXS5tYXRjaChhdHRyZWdleDIpO1xuLyo6OiBpZigheSB8fCAheVsyXSkgY29udGludWU7ICovXG5cdFx0aWYoKGo9eVsxXS5pbmRleE9mKFwiOlwiKSkgPT09IC0xKSB6W3lbMV1dID0geVsyXS5zbGljZSgxLHlbMl0ubGVuZ3RoLTEpO1xuXHRcdGVsc2Uge1xuXHRcdFx0aWYoeVsxXS5zbGljZSgwLDYpID09PSBcInhtbG5zOlwiKSB3ID0gXCJ4bWxuc1wiK3lbMV0uc2xpY2UoNik7XG5cdFx0XHRlbHNlIHcgPSB5WzFdLnNsaWNlKGorMSk7XG5cdFx0XHR6W3ddID0geVsyXS5zbGljZSgxLHlbMl0ubGVuZ3RoLTEpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gejtcbn1cbmZ1bmN0aW9uIHhsbWxfcGFyc2V4bWx0YWdvYmoodGFnLyo6c3RyaW5nKi8pIHtcblx0dmFyIHdvcmRzID0gdGFnLnNwbGl0KC9cXHMrLyk7XG5cdHZhciB6ID0ge307XG5cdGlmKHdvcmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHo7XG5cdHZhciBtID0gdGFnLm1hdGNoKGF0dHJlZ2V4ZzIpLCB5LCBqLCB3LCBpO1xuXHRpZihtKSBmb3IoaSA9IDA7IGkgIT0gbS5sZW5ndGg7ICsraSkge1xuXHRcdHkgPSBtW2ldLm1hdGNoKGF0dHJlZ2V4Mik7XG4vKjo6IGlmKCF5IHx8ICF5WzJdKSBjb250aW51ZTsgKi9cblx0XHRpZigoaj15WzFdLmluZGV4T2YoXCI6XCIpKSA9PT0gLTEpIHpbeVsxXV0gPSB5WzJdLnNsaWNlKDEseVsyXS5sZW5ndGgtMSk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZih5WzFdLnNsaWNlKDAsNikgPT09IFwieG1sbnM6XCIpIHcgPSBcInhtbG5zXCIreVsxXS5zbGljZSg2KTtcblx0XHRcdGVsc2UgdyA9IHlbMV0uc2xpY2UoaisxKTtcblx0XHRcdHpbd10gPSB5WzJdLnNsaWNlKDEseVsyXS5sZW5ndGgtMSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB6O1xufVxuXG4vLyAtLS0tXG5cbi8qIG1hcCBmcm9tIHhsbWwgbmFtZWQgZm9ybWF0cyB0byBTU0YgVE9ETzogbG9jYWxpemUgKi9cbnZhciBYTE1MRm9ybWF0TWFwLyo6IHtbc3RyaW5nXTpzdHJpbmd9Ki87XG5cbmZ1bmN0aW9uIHhsbWxfZm9ybWF0KGZvcm1hdCwgdmFsdWUpLyo6c3RyaW5nKi8ge1xuXHR2YXIgZm10ID0gWExNTEZvcm1hdE1hcFtmb3JtYXRdIHx8IHVuZXNjYXBleG1sKGZvcm1hdCk7XG5cdGlmKGZtdCA9PT0gXCJHZW5lcmFsXCIpIHJldHVybiBTU0ZfZ2VuZXJhbCh2YWx1ZSk7XG5cdHJldHVybiBTU0ZfZm9ybWF0KGZtdCwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiB4bG1sX3NldF9jdXN0cHJvcChDdXN0cHJvcHMsIGtleSwgY3AsIHZhbC8qOnN0cmluZyovKSB7XG5cdHZhciBvdmFsLyo6YW55Ki8gPSB2YWw7XG5cdHN3aXRjaCgoY3BbMF0ubWF0Y2goL2R0OmR0PVwiKFtcXHcuXSspXCIvKXx8W1wiXCIsXCJcIl0pWzFdKSB7XG5cdFx0Y2FzZSBcImJvb2xlYW5cIjogb3ZhbCA9IHBhcnNleG1sYm9vbCh2YWwpOyBicmVhaztcblx0XHRjYXNlIFwiaTJcIjogY2FzZSBcImludFwiOiBvdmFsID0gcGFyc2VJbnQodmFsLCAxMCk7IGJyZWFrO1xuXHRcdGNhc2UgXCJyNFwiOiBjYXNlIFwiZmxvYXRcIjogb3ZhbCA9IHBhcnNlRmxvYXQodmFsKTsgYnJlYWs7XG5cdFx0Y2FzZSBcImRhdGVcIjogY2FzZSBcImRhdGVUaW1lLnR6XCI6IG92YWwgPSBwYXJzZURhdGUodmFsKTsgYnJlYWs7XG5cdFx0Y2FzZSBcImk4XCI6IGNhc2UgXCJzdHJpbmdcIjogY2FzZSBcImZpeGVkXCI6IGNhc2UgXCJ1dWlkXCI6IGNhc2UgXCJiaW4uYmFzZTY0XCI6IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcImJhZCBjdXN0cHJvcDpcIiArIGNwWzBdKTtcblx0fVxuXHRDdXN0cHJvcHNbdW5lc2NhcGV4bWwoa2V5KV0gPSBvdmFsO1xufVxuXG5mdW5jdGlvbiBzYWZlX2Zvcm1hdF94bG1sKGNlbGwvKjpDZWxsKi8sIG5mLCBvKSB7XG5cdGlmKGNlbGwudCA9PT0gJ3onKSByZXR1cm47XG5cdGlmKCFvIHx8IG8uY2VsbFRleHQgIT09IGZhbHNlKSB0cnkge1xuXHRcdGlmKGNlbGwudCA9PT0gJ2UnKSB7IGNlbGwudyA9IGNlbGwudyB8fCBCRXJyW2NlbGwudl07IH1cblx0XHRlbHNlIGlmKG5mID09PSBcIkdlbmVyYWxcIikge1xuXHRcdFx0aWYoY2VsbC50ID09PSAnbicpIHtcblx0XHRcdFx0aWYoKGNlbGwudnwwKSA9PT0gY2VsbC52KSBjZWxsLncgPSBjZWxsLnYudG9TdHJpbmcoMTApO1xuXHRcdFx0XHRlbHNlIGNlbGwudyA9IFNTRl9nZW5lcmFsX251bShjZWxsLnYpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBjZWxsLncgPSBTU0ZfZ2VuZXJhbChjZWxsLnYpO1xuXHRcdH1cblx0XHRlbHNlIGNlbGwudyA9IHhsbWxfZm9ybWF0KG5mfHxcIkdlbmVyYWxcIiwgY2VsbC52KTtcblx0fSBjYXRjaChlKSB7IGlmKG8uV1RGKSB0aHJvdyBlOyB9XG5cdHRyeSB7XG5cdFx0dmFyIHogPSBYTE1MRm9ybWF0TWFwW25mXXx8bmZ8fFwiR2VuZXJhbFwiO1xuXHRcdGlmKG8uY2VsbE5GKSBjZWxsLnogPSB6O1xuXHRcdGlmKG8uY2VsbERhdGVzICYmIGNlbGwudCA9PSAnbicgJiYgZm10X2lzX2RhdGUoeikpIHtcblx0XHRcdHZhciBfZCA9IFNTRl9wYXJzZV9kYXRlX2NvZGUoY2VsbC52KTsgaWYoX2QpIHsgY2VsbC50ID0gJ2QnOyBjZWxsLnYgPSBuZXcgRGF0ZShfZC55LCBfZC5tLTEsX2QuZCxfZC5ILF9kLk0sX2QuUyxfZC51KTsgfVxuXHRcdH1cblx0fSBjYXRjaChlKSB7IGlmKG8uV1RGKSB0aHJvdyBlOyB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3Nfc3R5bGVfeGxtbChzdHlsZXMsIHN0YWcsIG9wdHMpIHtcblx0aWYob3B0cy5jZWxsU3R5bGVzKSB7XG5cdFx0aWYoc3RhZy5JbnRlcmlvcikge1xuXHRcdFx0dmFyIEkgPSBzdGFnLkludGVyaW9yO1xuXHRcdFx0aWYoSS5QYXR0ZXJuKSBJLnBhdHRlcm5UeXBlID0gWExNTFBhdHRlcm5UeXBlTWFwW0kuUGF0dGVybl0gfHwgSS5QYXR0ZXJuO1xuXHRcdH1cblx0fVxuXHRzdHlsZXNbc3RhZy5JRF0gPSBzdGFnO1xufVxuXG4vKiBUT0RPOiB0aGVyZSBtdXN0IGV4aXN0IHNvbWUgZm9ybSBvZiBPU1AtYmxlc3NlZCBzcGVjICovXG5mdW5jdGlvbiBwYXJzZV94bG1sX2RhdGEoeG1sLCBzcywgZGF0YSwgY2VsbC8qOmFueSovLCBiYXNlLCBzdHlsZXMsIGNzdHksIHJvdywgYXJyYXlmLCBvKSB7XG5cdHZhciBuZiA9IFwiR2VuZXJhbFwiLCBzaWQgPSBjZWxsLlN0eWxlSUQsIFMgPSB7fTsgbyA9IG8gfHwge307XG5cdHZhciBpbnRlcmlvcnMgPSBbXTtcblx0dmFyIGkgPSAwO1xuXHRpZihzaWQgPT09IHVuZGVmaW5lZCAmJiByb3cpIHNpZCA9IHJvdy5TdHlsZUlEO1xuXHRpZihzaWQgPT09IHVuZGVmaW5lZCAmJiBjc3R5KSBzaWQgPSBjc3R5LlN0eWxlSUQ7XG5cdHdoaWxlKHN0eWxlc1tzaWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZihzdHlsZXNbc2lkXS5uZikgbmYgPSBzdHlsZXNbc2lkXS5uZjtcblx0XHRpZihzdHlsZXNbc2lkXS5JbnRlcmlvcikgaW50ZXJpb3JzLnB1c2goc3R5bGVzW3NpZF0uSW50ZXJpb3IpO1xuXHRcdGlmKCFzdHlsZXNbc2lkXS5QYXJlbnQpIGJyZWFrO1xuXHRcdHNpZCA9IHN0eWxlc1tzaWRdLlBhcmVudDtcblx0fVxuXHRzd2l0Y2goZGF0YS5UeXBlKSB7XG5cdFx0Y2FzZSAnQm9vbGVhbic6XG5cdFx0XHRjZWxsLnQgPSAnYic7XG5cdFx0XHRjZWxsLnYgPSBwYXJzZXhtbGJvb2woeG1sKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ1N0cmluZyc6XG5cdFx0XHRjZWxsLnQgPSAncyc7IGNlbGwuciA9IHhsbWxfZml4c3RyKHVuZXNjYXBleG1sKHhtbCkpO1xuXHRcdFx0Y2VsbC52ID0gKHhtbC5pbmRleE9mKFwiPFwiKSA+IC0xID8gdW5lc2NhcGV4bWwoc3N8fHhtbCkucmVwbGFjZSgvPC4qPz4vZywgXCJcIikgOiBjZWxsLnIpOyAvLyB0b2RvOiBCUiBldGNcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ0RhdGVUaW1lJzpcblx0XHRcdGlmKHhtbC5zbGljZSgtMSkgIT0gXCJaXCIpIHhtbCArPSBcIlpcIjtcblx0XHRcdGNlbGwudiA9IChwYXJzZURhdGUoeG1sKSAtIG5ldyBEYXRlKERhdGUuVVRDKDE4OTksIDExLCAzMCkpKSAvICgyNCAqIDYwICogNjAgKiAxMDAwKTtcblx0XHRcdGlmKGNlbGwudiAhPT0gY2VsbC52KSBjZWxsLnYgPSB1bmVzY2FwZXhtbCh4bWwpO1xuXHRcdFx0ZWxzZSBpZihjZWxsLnY8NjApIGNlbGwudiA9IGNlbGwudiAtMTtcblx0XHRcdGlmKCFuZiB8fCBuZiA9PSBcIkdlbmVyYWxcIikgbmYgPSBcInl5eXktbW0tZGRcIjtcblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRjYXNlICdOdW1iZXInOlxuXHRcdFx0aWYoY2VsbC52ID09PSB1bmRlZmluZWQpIGNlbGwudj0reG1sO1xuXHRcdFx0aWYoIWNlbGwudCkgY2VsbC50ID0gJ24nO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnRXJyb3InOiBjZWxsLnQgPSAnZSc7IGNlbGwudiA9IFJCRXJyW3htbF07IGlmKG8uY2VsbFRleHQgIT09IGZhbHNlKSBjZWxsLncgPSB4bWw7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRpZih4bWwgPT0gXCJcIiAmJiBzcyA9PSBcIlwiKSB7IGNlbGwudCA9ICd6JzsgfVxuXHRcdFx0ZWxzZSB7IGNlbGwudCA9ICdzJzsgY2VsbC52ID0geGxtbF9maXhzdHIoc3N8fHhtbCk7IH1cblx0XHRcdGJyZWFrO1xuXHR9XG5cdHNhZmVfZm9ybWF0X3hsbWwoY2VsbCwgbmYsIG8pO1xuXHRpZihvLmNlbGxGb3JtdWxhICE9PSBmYWxzZSkge1xuXHRcdGlmKGNlbGwuRm9ybXVsYSkge1xuXHRcdFx0dmFyIGZzdHIgPSB1bmVzY2FwZXhtbChjZWxsLkZvcm11bGEpO1xuXHRcdFx0Lyogc3RyaWN0bHkgc3BlYWtpbmcsIHRoZSBsZWFkaW5nID0gaXMgcmVxdWlyZWQgYnV0IHNvbWUgd3JpdGVycyBvbWl0ICovXG5cdFx0XHRpZihmc3RyLmNoYXJDb2RlQXQoMCkgPT0gNjEgLyogPSAqLykgZnN0ciA9IGZzdHIuc2xpY2UoMSk7XG5cdFx0XHRjZWxsLmYgPSByY190b19hMShmc3RyLCBiYXNlKTtcblx0XHRcdGRlbGV0ZSBjZWxsLkZvcm11bGE7XG5cdFx0XHRpZihjZWxsLkFycmF5UmFuZ2UgPT0gXCJSQ1wiKSBjZWxsLkYgPSByY190b19hMShcIlJDOlJDXCIsIGJhc2UpO1xuXHRcdFx0ZWxzZSBpZihjZWxsLkFycmF5UmFuZ2UpIHtcblx0XHRcdFx0Y2VsbC5GID0gcmNfdG9fYTEoY2VsbC5BcnJheVJhbmdlLCBiYXNlKTtcblx0XHRcdFx0YXJyYXlmLnB1c2goW3NhZmVfZGVjb2RlX3JhbmdlKGNlbGwuRiksIGNlbGwuRl0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IoaSA9IDA7IGkgPCBhcnJheWYubGVuZ3RoOyArK2kpXG5cdFx0XHRcdGlmKGJhc2UuciA+PSBhcnJheWZbaV1bMF0ucy5yICYmIGJhc2UuciA8PSBhcnJheWZbaV1bMF0uZS5yKVxuXHRcdFx0XHRcdGlmKGJhc2UuYyA+PSBhcnJheWZbaV1bMF0ucy5jICYmIGJhc2UuYyA8PSBhcnJheWZbaV1bMF0uZS5jKVxuXHRcdFx0XHRcdFx0Y2VsbC5GID0gYXJyYXlmW2ldWzFdO1xuXHRcdH1cblx0fVxuXHRpZihvLmNlbGxTdHlsZXMpIHtcblx0XHRpbnRlcmlvcnMuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0XHRpZighUy5wYXR0ZXJuVHlwZSAmJiB4LnBhdHRlcm5UeXBlKSBTLnBhdHRlcm5UeXBlID0geC5wYXR0ZXJuVHlwZTtcblx0XHR9KTtcblx0XHRjZWxsLnMgPSBTO1xuXHR9XG5cdGlmKGNlbGwuU3R5bGVJRCAhPT0gdW5kZWZpbmVkKSBjZWxsLml4ZmUgPSBjZWxsLlN0eWxlSUQ7XG59XG5cbmZ1bmN0aW9uIHhsbWxfY2xlYW5fY29tbWVudChjb21tZW50Lyo6YW55Ki8pIHtcblx0Y29tbWVudC50ID0gY29tbWVudC52IHx8IFwiXCI7XG5cdGNvbW1lbnQudCA9IGNvbW1lbnQudC5yZXBsYWNlKC9cXHJcXG4vZyxcIlxcblwiKS5yZXBsYWNlKC9cXHIvZyxcIlxcblwiKTtcblx0Y29tbWVudC52ID0gY29tbWVudC53ID0gY29tbWVudC5peGZlID0gdW5kZWZpbmVkO1xufVxuXG4vKiBUT0RPOiBFdmVyeXRoaW5nICovXG5mdW5jdGlvbiBwYXJzZV94bG1sX3htbChkLCBfb3B0cykvKjpXb3JrYm9vayovIHtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0bWFrZV9zc2YoKTtcblx0dmFyIHN0ciA9IGRlYm9tKHhsbWxfbm9ybWFsaXplKGQpKTtcblx0aWYob3B0cy50eXBlID09ICdiaW5hcnknIHx8IG9wdHMudHlwZSA9PSAnYXJyYXknIHx8IG9wdHMudHlwZSA9PSAnYmFzZTY0Jykge1xuXHRcdGlmKHR5cGVvZiAkY3B0YWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHN0ciA9ICRjcHRhYmxlLnV0aWxzLmRlY29kZSg2NTAwMSwgY2hhcl9jb2RlcyhzdHIpKTtcblx0XHRlbHNlIHN0ciA9IHV0ZjhyZWFkKHN0cik7XG5cdH1cblx0dmFyIG9wZW5pbmcgPSBzdHIuc2xpY2UoMCwgMTAyNCkudG9Mb3dlckNhc2UoKSwgaXNodG1sID0gZmFsc2U7XG5cdG9wZW5pbmcgPSBvcGVuaW5nLnJlcGxhY2UoL1wiLio/XCIvZywgXCJcIik7XG5cdGlmKChvcGVuaW5nLmluZGV4T2YoXCI+XCIpICYgMTAyMykgPiBNYXRoLm1pbigob3BlbmluZy5pbmRleE9mKFwiLFwiKSAmIDEwMjMpLCAob3BlbmluZy5pbmRleE9mKFwiO1wiKSYxMDIzKSkpIHsgdmFyIF9vID0gZHVwKG9wdHMpOyBfby50eXBlID0gXCJzdHJpbmdcIjsgcmV0dXJuIFBSTi50b193b3JrYm9vayhzdHIsIF9vKTsgfVxuXHRpZihvcGVuaW5nLmluZGV4T2YoXCI8P3htbFwiKSA9PSAtMSkgW1wiaHRtbFwiLCBcInRhYmxlXCIsIFwiaGVhZFwiLCBcIm1ldGFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcImRpdlwiXS5mb3JFYWNoKGZ1bmN0aW9uKHRhZykgeyBpZihvcGVuaW5nLmluZGV4T2YoXCI8XCIgKyB0YWcpID49IDApIGlzaHRtbCA9IHRydWU7IH0pO1xuXHRpZihpc2h0bWwpIHJldHVybiBodG1sX3RvX3dvcmtib29rKHN0ciwgb3B0cyk7XG5cblx0WExNTEZvcm1hdE1hcCA9ICh7XG5cdFx0XCJHZW5lcmFsIE51bWJlclwiOiBcIkdlbmVyYWxcIixcblx0XHRcIkdlbmVyYWwgRGF0ZVwiOiB0YWJsZV9mbXRbMjJdLFxuXHRcdFwiTG9uZyBEYXRlXCI6IFwiZGRkZCwgbW1tbSBkZCwgeXl5eVwiLFxuXHRcdFwiTWVkaXVtIERhdGVcIjogdGFibGVfZm10WzE1XSxcblx0XHRcIlNob3J0IERhdGVcIjogdGFibGVfZm10WzE0XSxcblx0XHRcIkxvbmcgVGltZVwiOiB0YWJsZV9mbXRbMTldLFxuXHRcdFwiTWVkaXVtIFRpbWVcIjogdGFibGVfZm10WzE4XSxcblx0XHRcIlNob3J0IFRpbWVcIjogdGFibGVfZm10WzIwXSxcblx0XHRcIkN1cnJlbmN5XCI6ICdcIiRcIiMsIyMwLjAwXyk7W1JlZF1cXFxcKFwiJFwiIywjIzAuMDBcXFxcKScsXG5cdFx0XCJGaXhlZFwiOiB0YWJsZV9mbXRbMl0sXG5cdFx0XCJTdGFuZGFyZFwiOiB0YWJsZV9mbXRbNF0sXG5cdFx0XCJQZXJjZW50XCI6IHRhYmxlX2ZtdFsxMF0sXG5cdFx0XCJTY2llbnRpZmljXCI6IHRhYmxlX2ZtdFsxMV0sXG5cdFx0XCJZZXMvTm9cIjogJ1wiWWVzXCI7XCJZZXNcIjtcIk5vXCI7QCcsXG5cdFx0XCJUcnVlL0ZhbHNlXCI6ICdcIlRydWVcIjtcIlRydWVcIjtcIkZhbHNlXCI7QCcsXG5cdFx0XCJPbi9PZmZcIjogJ1wiWWVzXCI7XCJZZXNcIjtcIk5vXCI7QCdcblx0fS8qOmFueSovKTtcblxuXG5cdHZhciBSbjtcblx0dmFyIHN0YXRlID0gW10sIHRtcDtcblx0aWYoREVOU0UgIT0gbnVsbCAmJiBvcHRzLmRlbnNlID09IG51bGwpIG9wdHMuZGVuc2UgPSBERU5TRTtcblx0dmFyIHNoZWV0cyA9IHt9LCBzaGVldG5hbWVzLyo6QXJyYXk8c3RyaW5nPiovID0gW10sIGN1cnNoZWV0Lyo6V29ya3NoZWV0Ki8gPSAob3B0cy5kZW5zZSA/IFtdIDoge30pLCBzaGVldG5hbWUgPSBcIlwiO1xuXHR2YXIgY2VsbCA9ICh7fS8qOmFueSovKSwgcm93ID0ge307Ly8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXHR2YXIgZHRhZyA9IHhsbWxfcGFyc2V4bWx0YWcoJzxEYXRhIHNzOlR5cGU9XCJTdHJpbmdcIj4nKSwgZGlkeCA9IDA7XG5cdHZhciBjID0gMCwgciA9IDA7XG5cdHZhciByZWZndWVzcy8qOlJhbmdlKi8gPSB7czoge3I6MjAwMDAwMCwgYzoyMDAwMDAwfSwgZToge3I6MCwgYzowfSB9O1xuXHR2YXIgc3R5bGVzID0ge30sIHN0YWcgPSB7fTtcblx0dmFyIHNzID0gXCJcIiwgZmlkeCA9IDA7XG5cdHZhciBtZXJnZXMvKjpBcnJheTxSYW5nZT4qLyA9IFtdO1xuXHR2YXIgUHJvcHMgPSB7fSwgQ3VzdHByb3BzID0ge30sIHBpZHggPSAwLCBjcCA9IFtdO1xuXHR2YXIgY29tbWVudHMvKjpBcnJheTxDb21tZW50PiovID0gW10sIGNvbW1lbnQvKjpDb21tZW50Ki8gPSAoe30vKjphbnkqLyk7XG5cdHZhciBjc3R5cyA9IFtdLCBjc3R5LCBzZWVuY29sID0gZmFsc2U7XG5cdHZhciBhcnJheWYvKjpBcnJheTxbUmFuZ2UsIHN0cmluZ10+Ki8gPSBbXTtcblx0dmFyIHJvd2luZm8vKjpBcnJheTxSb3dJbmZvPiovID0gW10sIHJvd29iaiA9IHt9LCBjYyA9IDAsIHJyID0gMDtcblx0dmFyIFdvcmtib29rLyo6V0JXQlByb3BzKi8gPSAoeyBTaGVldHM6W10sIFdCUHJvcHM6e2RhdGUxOTA0OmZhbHNlfSB9Lyo6YW55Ki8pLCB3c3Byb3BzID0ge307XG5cdHhsbWxyZWdleC5sYXN0SW5kZXggPSAwO1xuXHRzdHIgPSBzdHIucmVwbGFjZSgvPCEtLShbXFxzXFxTXSo/KS0tPi9tZyxcIlwiKTtcblx0dmFyIHJhd19SbjMgPSBcIlwiO1xuXHR3aGlsZSgoUm4gPSB4bG1scmVnZXguZXhlYyhzdHIpKSkgc3dpdGNoKChSblszXSA9IChyYXdfUm4zID0gUm5bM10pLnRvTG93ZXJDYXNlKCkpKSB7XG5cdFx0Y2FzZSAnZGF0YScgLypjYXNlICdEYXRhJyovOlxuXHRcdFx0aWYocmF3X1JuMyA9PSBcImRhdGFcIikge1xuXHRcdFx0XHRpZihSblsxXT09PScvJyl7aWYoKHRtcD1zdGF0ZS5wb3AoKSlbMF0hPT1SblszXSkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHN0YXRlOiBcIit0bXAuam9pbihcInxcIikpO31cblx0XHRcdFx0ZWxzZSBpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpICE9PSAnLycpIHN0YXRlLnB1c2goW1JuWzNdLCB0cnVlXSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYoc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzFdKSBicmVhaztcblx0XHRcdGlmKFJuWzFdPT09Jy8nKSBwYXJzZV94bG1sX2RhdGEoc3RyLnNsaWNlKGRpZHgsIFJuLmluZGV4KSwgc3MsIGR0YWcsIHN0YXRlW3N0YXRlLmxlbmd0aC0xXVswXT09LypcIkNvbW1lbnRcIiovXCJjb21tZW50XCI/Y29tbWVudDpjZWxsLCB7YzpjLHI6cn0sIHN0eWxlcywgY3N0eXNbY10sIHJvdywgYXJyYXlmLCBvcHRzKTtcblx0XHRcdGVsc2UgeyBzcyA9IFwiXCI7IGR0YWcgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTsgZGlkeCA9IFJuLmluZGV4ICsgUm5bMF0ubGVuZ3RoOyB9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdjZWxsJyAvKmNhc2UgJ0NlbGwnKi86XG5cdFx0XHRpZihSblsxXT09PScvJyl7XG5cdFx0XHRcdGlmKGNvbW1lbnRzLmxlbmd0aCA+IDApIGNlbGwuYyA9IGNvbW1lbnRzO1xuXHRcdFx0XHRpZigoIW9wdHMuc2hlZXRSb3dzIHx8IG9wdHMuc2hlZXRSb3dzID4gcikgJiYgY2VsbC52ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZihvcHRzLmRlbnNlKSB7XG5cdFx0XHRcdFx0XHRpZighY3Vyc2hlZXRbcl0pIGN1cnNoZWV0W3JdID0gW107XG5cdFx0XHRcdFx0XHRjdXJzaGVldFtyXVtjXSA9IGNlbGw7XG5cdFx0XHRcdFx0fSBlbHNlIGN1cnNoZWV0W2VuY29kZV9jb2woYykgKyBlbmNvZGVfcm93KHIpXSA9IGNlbGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoY2VsbC5IUmVmKSB7XG5cdFx0XHRcdFx0Y2VsbC5sID0gKHtUYXJnZXQ6dW5lc2NhcGV4bWwoY2VsbC5IUmVmKX0vKjphbnkqLyk7XG5cdFx0XHRcdFx0aWYoY2VsbC5IUmVmU2NyZWVuVGlwKSBjZWxsLmwuVG9vbHRpcCA9IGNlbGwuSFJlZlNjcmVlblRpcDtcblx0XHRcdFx0XHRkZWxldGUgY2VsbC5IUmVmOyBkZWxldGUgY2VsbC5IUmVmU2NyZWVuVGlwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGNlbGwuTWVyZ2VBY3Jvc3MgfHwgY2VsbC5NZXJnZURvd24pIHtcblx0XHRcdFx0XHRjYyA9IGMgKyAocGFyc2VJbnQoY2VsbC5NZXJnZUFjcm9zcywxMCl8MCk7XG5cdFx0XHRcdFx0cnIgPSByICsgKHBhcnNlSW50KGNlbGwuTWVyZ2VEb3duLDEwKXwwKTtcblx0XHRcdFx0XHRtZXJnZXMucHVzaCh7czp7YzpjLHI6cn0sZTp7YzpjYyxyOnJyfX0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFvcHRzLnNoZWV0U3R1YnMpIHsgaWYoY2VsbC5NZXJnZUFjcm9zcykgYyA9IGNjICsgMTsgZWxzZSArK2M7IH1cblx0XHRcdFx0ZWxzZSBpZihjZWxsLk1lcmdlQWNyb3NzIHx8IGNlbGwuTWVyZ2VEb3duKSB7XG5cdFx0XHRcdFx0Lyo6OiBpZighY2MpIGNjID0gMDsgaWYoIXJyKSByciA9IDA7ICovXG5cdFx0XHRcdFx0Zm9yKHZhciBjbWEgPSBjOyBjbWEgPD0gY2M7ICsrY21hKSB7XG5cdFx0XHRcdFx0XHRmb3IodmFyIGNtZCA9IHI7IGNtZCA8PSBycjsgKytjbWQpIHtcblx0XHRcdFx0XHRcdFx0aWYoY21hID4gYyB8fCBjbWQgPiByKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoIWN1cnNoZWV0W2NtZF0pIGN1cnNoZWV0W2NtZF0gPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnNoZWV0W2NtZF1bY21hXSA9IHt0Oid6J307XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGN1cnNoZWV0W2VuY29kZV9jb2woY21hKSArIGVuY29kZV9yb3coY21kKV0gPSB7dDoneid9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGMgPSBjYyArIDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSArK2M7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjZWxsID0geGxtbF9wYXJzZXhtbHRhZ29iaihSblswXSk7XG5cdFx0XHRcdGlmKGNlbGwuSW5kZXgpIGMgPSArY2VsbC5JbmRleCAtIDE7XG5cdFx0XHRcdGlmKGMgPCByZWZndWVzcy5zLmMpIHJlZmd1ZXNzLnMuYyA9IGM7XG5cdFx0XHRcdGlmKGMgPiByZWZndWVzcy5lLmMpIHJlZmd1ZXNzLmUuYyA9IGM7XG5cdFx0XHRcdGlmKFJuWzBdLnNsaWNlKC0yKSA9PT0gXCIvPlwiKSArK2M7XG5cdFx0XHRcdGNvbW1lbnRzID0gW107XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdyb3cnIC8qY2FzZSAnUm93JyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycgfHwgUm5bMF0uc2xpY2UoLTIpID09PSBcIi8+XCIpIHtcblx0XHRcdFx0aWYociA8IHJlZmd1ZXNzLnMucikgcmVmZ3Vlc3Mucy5yID0gcjtcblx0XHRcdFx0aWYociA+IHJlZmd1ZXNzLmUucikgcmVmZ3Vlc3MuZS5yID0gcjtcblx0XHRcdFx0aWYoUm5bMF0uc2xpY2UoLTIpID09PSBcIi8+XCIpIHtcblx0XHRcdFx0XHRyb3cgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0XHRpZihyb3cuSW5kZXgpIHIgPSArcm93LkluZGV4IC0gMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjID0gMDsgKytyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cm93ID0geGxtbF9wYXJzZXhtbHRhZyhSblswXSk7XG5cdFx0XHRcdGlmKHJvdy5JbmRleCkgciA9ICtyb3cuSW5kZXggLSAxO1xuXHRcdFx0XHRyb3dvYmogPSB7fTtcblx0XHRcdFx0aWYocm93LkF1dG9GaXRIZWlnaHQgPT0gXCIwXCIgfHwgcm93LkhlaWdodCkge1xuXHRcdFx0XHRcdHJvd29iai5ocHggPSBwYXJzZUludChyb3cuSGVpZ2h0LCAxMCk7IHJvd29iai5ocHQgPSBweDJwdChyb3dvYmouaHB4KTtcblx0XHRcdFx0XHRyb3dpbmZvW3JdID0gcm93b2JqO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHJvdy5IaWRkZW4gPT0gXCIxXCIpIHsgcm93b2JqLmhpZGRlbiA9IHRydWU7IHJvd2luZm9bcl0gPSByb3dvYmo7IH1cblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3dvcmtzaGVldCcgLypjYXNlICdXb3Jrc2hlZXQnKi86IC8qIFRPRE86IHJlYWQgcmFuZ2UgZnJvbSBGdWxsUm93cy9GdWxsQ29sdW1ucyAqL1xuXHRcdFx0aWYoUm5bMV09PT0nLycpe1xuXHRcdFx0XHRpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgc3RhdGU6IFwiK3RtcC5qb2luKFwifFwiKSk7XG5cdFx0XHRcdHNoZWV0bmFtZXMucHVzaChzaGVldG5hbWUpO1xuXHRcdFx0XHRpZihyZWZndWVzcy5zLnIgPD0gcmVmZ3Vlc3MuZS5yICYmIHJlZmd1ZXNzLnMuYyA8PSByZWZndWVzcy5lLmMpIHtcblx0XHRcdFx0XHRjdXJzaGVldFtcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UocmVmZ3Vlc3MpO1xuXHRcdFx0XHRcdGlmKG9wdHMuc2hlZXRSb3dzICYmIG9wdHMuc2hlZXRSb3dzIDw9IHJlZmd1ZXNzLmUucikge1xuXHRcdFx0XHRcdFx0Y3Vyc2hlZXRbXCIhZnVsbHJlZlwiXSA9IGN1cnNoZWV0W1wiIXJlZlwiXTtcblx0XHRcdFx0XHRcdHJlZmd1ZXNzLmUuciA9IG9wdHMuc2hlZXRSb3dzIC0gMTtcblx0XHRcdFx0XHRcdGN1cnNoZWV0W1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZShyZWZndWVzcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKG1lcmdlcy5sZW5ndGgpIGN1cnNoZWV0W1wiIW1lcmdlc1wiXSA9IG1lcmdlcztcblx0XHRcdFx0aWYoY3N0eXMubGVuZ3RoID4gMCkgY3Vyc2hlZXRbXCIhY29sc1wiXSA9IGNzdHlzO1xuXHRcdFx0XHRpZihyb3dpbmZvLmxlbmd0aCA+IDApIGN1cnNoZWV0W1wiIXJvd3NcIl0gPSByb3dpbmZvO1xuXHRcdFx0XHRzaGVldHNbc2hlZXRuYW1lXSA9IGN1cnNoZWV0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVmZ3Vlc3MgPSB7czoge3I6MjAwMDAwMCwgYzoyMDAwMDAwfSwgZToge3I6MCwgYzowfSB9O1xuXHRcdFx0XHRyID0gYyA9IDA7XG5cdFx0XHRcdHN0YXRlLnB1c2goW1JuWzNdLCBmYWxzZV0pO1xuXHRcdFx0XHR0bXAgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0c2hlZXRuYW1lID0gdW5lc2NhcGV4bWwodG1wLk5hbWUpO1xuXHRcdFx0XHRjdXJzaGVldCA9IChvcHRzLmRlbnNlID8gW10gOiB7fSk7XG5cdFx0XHRcdG1lcmdlcyA9IFtdO1xuXHRcdFx0XHRhcnJheWYgPSBbXTtcblx0XHRcdFx0cm93aW5mbyA9IFtdO1xuXHRcdFx0XHR3c3Byb3BzID0ge25hbWU6c2hlZXRuYW1lLCBIaWRkZW46MH07XG5cdFx0XHRcdFdvcmtib29rLlNoZWV0cy5wdXNoKHdzcHJvcHMpO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAndGFibGUnIC8qY2FzZSAnVGFibGUnKi86XG5cdFx0XHRpZihSblsxXT09PScvJyl7aWYoKHRtcD1zdGF0ZS5wb3AoKSlbMF0hPT1SblszXSkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHN0YXRlOiBcIit0bXAuam9pbihcInxcIikpO31cblx0XHRcdGVsc2UgaWYoUm5bMF0uc2xpY2UoLTIpID09IFwiLz5cIikgYnJlYWs7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0c3RhdGUucHVzaChbUm5bM10sIGZhbHNlXSk7XG5cdFx0XHRcdGNzdHlzID0gW107IHNlZW5jb2wgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnc3R5bGUnIC8qY2FzZSAnU3R5bGUnKi86XG5cdFx0XHRpZihSblsxXT09PScvJykgcHJvY2Vzc19zdHlsZV94bG1sKHN0eWxlcywgc3RhZywgb3B0cyk7XG5cdFx0XHRlbHNlIHN0YWcgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnbnVtYmVyZm9ybWF0JyAvKmNhc2UgJ051bWJlckZvcm1hdCcqLzpcblx0XHRcdHN0YWcubmYgPSB1bmVzY2FwZXhtbCh4bG1sX3BhcnNleG1sdGFnKFJuWzBdKS5Gb3JtYXQgfHwgXCJHZW5lcmFsXCIpO1xuXHRcdFx0aWYoWExNTEZvcm1hdE1hcFtzdGFnLm5mXSkgc3RhZy5uZiA9IFhMTUxGb3JtYXRNYXBbc3RhZy5uZl07XG5cdFx0XHRmb3IodmFyIHNzZmlkeCA9IDA7IHNzZmlkeCAhPSAweDE4ODsgKytzc2ZpZHgpIGlmKHRhYmxlX2ZtdFtzc2ZpZHhdID09IHN0YWcubmYpIGJyZWFrO1xuXHRcdFx0aWYoc3NmaWR4ID09IDB4MTg4KSBmb3Ioc3NmaWR4ID0gMHgzOTsgc3NmaWR4ICE9IDB4MTg4OyArK3NzZmlkeCkgaWYodGFibGVfZm10W3NzZmlkeF0gPT0gbnVsbCkgeyBTU0ZfbG9hZChzdGFnLm5mLCBzc2ZpZHgpOyBicmVhazsgfVxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdjb2x1bW4nIC8qY2FzZSAnQ29sdW1uJyovOlxuXHRcdFx0aWYoc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdICE9PSAvKidUYWJsZScqLyd0YWJsZScpIGJyZWFrO1xuXHRcdFx0Y3N0eSA9IHhsbWxfcGFyc2V4bWx0YWcoUm5bMF0pO1xuXHRcdFx0aWYoY3N0eS5IaWRkZW4pIHsgY3N0eS5oaWRkZW4gPSB0cnVlOyBkZWxldGUgY3N0eS5IaWRkZW47IH1cblx0XHRcdGlmKGNzdHkuV2lkdGgpIGNzdHkud3B4ID0gcGFyc2VJbnQoY3N0eS5XaWR0aCwgMTApO1xuXHRcdFx0aWYoIXNlZW5jb2wgJiYgY3N0eS53cHggPiAxMCkge1xuXHRcdFx0XHRzZWVuY29sID0gdHJ1ZTsgTURXID0gREVGX01EVzsgLy9maW5kX21kd193cHgoY3N0eS53cHgpO1xuXHRcdFx0XHRmb3IodmFyIF9jb2wgPSAwOyBfY29sIDwgY3N0eXMubGVuZ3RoOyArK19jb2wpIGlmKGNzdHlzW19jb2xdKSBwcm9jZXNzX2NvbChjc3R5c1tfY29sXSk7XG5cdFx0XHR9XG5cdFx0XHRpZihzZWVuY29sKSBwcm9jZXNzX2NvbChjc3R5KTtcblx0XHRcdGNzdHlzWyhjc3R5LkluZGV4LTF8fGNzdHlzLmxlbmd0aCldID0gY3N0eTtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCArY3N0eS5TcGFuOyArK2kpIGNzdHlzW2NzdHlzLmxlbmd0aF0gPSBkdXAoY3N0eSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ25hbWVkcmFuZ2UnIC8qY2FzZSAnTmFtZWRSYW5nZScqLzpcblx0XHRcdGlmKFJuWzFdPT09Jy8nKSBicmVhaztcblx0XHRcdGlmKCFXb3JrYm9vay5OYW1lcykgV29ya2Jvb2suTmFtZXMgPSBbXTtcblx0XHRcdHZhciBfTmFtZWRSYW5nZSA9IHBhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdHZhciBfRGVmaW5lZE5hbWUvKjpEZWZpbmVkTmFtZSovID0gKHtcblx0XHRcdFx0TmFtZTogX05hbWVkUmFuZ2UuTmFtZSxcblx0XHRcdFx0UmVmOiByY190b19hMShfTmFtZWRSYW5nZS5SZWZlcnNUby5zbGljZSgxKSwge3I6MCwgYzowfSlcblx0XHRcdH0vKjphbnkqLyk7XG5cdFx0XHRpZihXb3JrYm9vay5TaGVldHMubGVuZ3RoPjApIF9EZWZpbmVkTmFtZS5TaGVldD1Xb3JrYm9vay5TaGVldHMubGVuZ3RoLTE7XG5cdFx0XHQvKjo6IGlmKFdvcmtib29rLk5hbWVzKSAqL1dvcmtib29rLk5hbWVzLnB1c2goX0RlZmluZWROYW1lKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnbmFtZWRjZWxsJyAvKmNhc2UgJ05hbWVkQ2VsbCcqLzogYnJlYWs7XG5cdFx0Y2FzZSAnYicgLypjYXNlICdCJyovOiBicmVhaztcblx0XHRjYXNlICdpJyAvKmNhc2UgJ0knKi86IGJyZWFrO1xuXHRcdGNhc2UgJ3UnIC8qY2FzZSAnVScqLzogYnJlYWs7XG5cdFx0Y2FzZSAncycgLypjYXNlICdTJyovOiBicmVhaztcblx0XHRjYXNlICdlbScgLypjYXNlICdFTScqLzogYnJlYWs7XG5cdFx0Y2FzZSAnaDInIC8qY2FzZSAnSDInKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2gzJyAvKmNhc2UgJ0gzJyovOiBicmVhaztcblx0XHRjYXNlICdzdWInIC8qY2FzZSAnU3ViJyovOiBicmVhaztcblx0XHRjYXNlICdzdXAnIC8qY2FzZSAnU3VwJyovOiBicmVhaztcblx0XHRjYXNlICdzcGFuJyAvKmNhc2UgJ1NwYW4nKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2FsaWdubWVudCcgLypjYXNlICdBbGlnbm1lbnQnKi86XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdib3JkZXJzJyAvKmNhc2UgJ0JvcmRlcnMnKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2JvcmRlcicgLypjYXNlICdCb3JkZXInKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2ZvbnQnIC8qY2FzZSAnRm9udCcqLzpcblx0XHRcdGlmKFJuWzBdLnNsaWNlKC0yKSA9PT0gXCIvPlwiKSBicmVhaztcblx0XHRcdGVsc2UgaWYoUm5bMV09PT1cIi9cIikgc3MgKz0gc3RyLnNsaWNlKGZpZHgsIFJuLmluZGV4KTtcblx0XHRcdGVsc2UgZmlkeCA9IFJuLmluZGV4ICsgUm5bMF0ubGVuZ3RoO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnaW50ZXJpb3InIC8qY2FzZSAnSW50ZXJpb3InKi86XG5cdFx0XHRpZighb3B0cy5jZWxsU3R5bGVzKSBicmVhaztcblx0XHRcdHN0YWcuSW50ZXJpb3IgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3Byb3RlY3Rpb24nIC8qY2FzZSAnUHJvdGVjdGlvbicqLzogYnJlYWs7XG5cblx0XHRjYXNlICdhdXRob3InIC8qY2FzZSAnQXV0aG9yJyovOlxuXHRcdGNhc2UgJ3RpdGxlJyAvKmNhc2UgJ1RpdGxlJyovOlxuXHRcdGNhc2UgJ2Rlc2NyaXB0aW9uJyAvKmNhc2UgJ0Rlc2NyaXB0aW9uJyovOlxuXHRcdGNhc2UgJ2NyZWF0ZWQnIC8qY2FzZSAnQ3JlYXRlZCcqLzpcblx0XHRjYXNlICdrZXl3b3JkcycgLypjYXNlICdLZXl3b3JkcycqLzpcblx0XHRjYXNlICdzdWJqZWN0JyAvKmNhc2UgJ1N1YmplY3QnKi86XG5cdFx0Y2FzZSAnY2F0ZWdvcnknIC8qY2FzZSAnQ2F0ZWdvcnknKi86XG5cdFx0Y2FzZSAnY29tcGFueScgLypjYXNlICdDb21wYW55JyovOlxuXHRcdGNhc2UgJ2xhc3RhdXRob3InIC8qY2FzZSAnTGFzdEF1dGhvcicqLzpcblx0XHRjYXNlICdsYXN0c2F2ZWQnIC8qY2FzZSAnTGFzdFNhdmVkJyovOlxuXHRcdGNhc2UgJ2xhc3RwcmludGVkJyAvKmNhc2UgJ0xhc3RQcmludGVkJyovOlxuXHRcdGNhc2UgJ3ZlcnNpb24nIC8qY2FzZSAnVmVyc2lvbicqLzpcblx0XHRjYXNlICdyZXZpc2lvbicgLypjYXNlICdSZXZpc2lvbicqLzpcblx0XHRjYXNlICd0b3RhbHRpbWUnIC8qY2FzZSAnVG90YWxUaW1lJyovOlxuXHRcdGNhc2UgJ2h5cGVybGlua2Jhc2UnIC8qY2FzZSAnSHlwZXJsaW5rQmFzZScqLzpcblx0XHRjYXNlICdtYW5hZ2VyJyAvKmNhc2UgJ01hbmFnZXInKi86XG5cdFx0Y2FzZSAnY29udGVudHN0YXR1cycgLypjYXNlICdDb250ZW50U3RhdHVzJyovOlxuXHRcdGNhc2UgJ2lkZW50aWZpZXInIC8qY2FzZSAnSWRlbnRpZmllcicqLzpcblx0XHRjYXNlICdsYW5ndWFnZScgLypjYXNlICdMYW5ndWFnZScqLzpcblx0XHRjYXNlICdhcHBuYW1lJyAvKmNhc2UgJ0FwcE5hbWUnKi86XG5cdFx0XHRpZihSblswXS5zbGljZSgtMikgPT09IFwiLz5cIikgYnJlYWs7XG5cdFx0XHRlbHNlIGlmKFJuWzFdPT09XCIvXCIpIHhsbWxfc2V0X3Byb3AoUHJvcHMsIHJhd19SbjMsIHN0ci5zbGljZShwaWR4LCBSbi5pbmRleCkpO1xuXHRcdFx0ZWxzZSBwaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdwYXJhZ3JhcGhzJyAvKmNhc2UgJ1BhcmFncmFwaHMnKi86IGJyZWFrO1xuXG5cdFx0Y2FzZSAnc3R5bGVzJyAvKmNhc2UgJ1N0eWxlcycqLzpcblx0XHRjYXNlICd3b3JrYm9vaycgLypjYXNlICdXb3JrYm9vaycqLzpcblx0XHRcdGlmKFJuWzFdPT09Jy8nKXtpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgc3RhdGU6IFwiK3RtcC5qb2luKFwifFwiKSk7fVxuXHRcdFx0ZWxzZSBzdGF0ZS5wdXNoKFtSblszXSwgZmFsc2VdKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnY29tbWVudCcgLypjYXNlICdDb21tZW50JyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycpe1xuXHRcdFx0XHRpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgc3RhdGU6IFwiK3RtcC5qb2luKFwifFwiKSk7XG5cdFx0XHRcdHhsbWxfY2xlYW5fY29tbWVudChjb21tZW50KTtcblx0XHRcdFx0Y29tbWVudHMucHVzaChjb21tZW50KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0YXRlLnB1c2goW1JuWzNdLCBmYWxzZV0pO1xuXHRcdFx0XHR0bXAgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0Y29tbWVudCA9ICh7YTp0bXAuQXV0aG9yfS8qOmFueSovKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnYXV0b2ZpbHRlcicgLypjYXNlICdBdXRvRmlsdGVyJyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycpe2lmKCh0bXA9c3RhdGUucG9wKCkpWzBdIT09Um5bM10pIHRocm93IG5ldyBFcnJvcihcIkJhZCBzdGF0ZTogXCIrdG1wLmpvaW4oXCJ8XCIpKTt9XG5cdFx0XHRlbHNlIGlmKFJuWzBdLmNoYXJBdChSblswXS5sZW5ndGgtMikgIT09ICcvJykge1xuXHRcdFx0XHR2YXIgQXV0b0ZpbHRlciA9IHhsbWxfcGFyc2V4bWx0YWcoUm5bMF0pO1xuXHRcdFx0XHRjdXJzaGVldFsnIWF1dG9maWx0ZXInXSA9IHsgcmVmOnJjX3RvX2ExKEF1dG9GaWx0ZXIuUmFuZ2UpLnJlcGxhY2UoL1xcJC9nLFwiXCIpIH07XG5cdFx0XHRcdHN0YXRlLnB1c2goW1JuWzNdLCB0cnVlXSk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ25hbWUnIC8qY2FzZSAnTmFtZScqLzogYnJlYWs7XG5cblx0XHRjYXNlICdkYXRhdmFsaWRhdGlvbicgLypjYXNlICdEYXRhVmFsaWRhdGlvbicqLzpcblx0XHRcdGlmKFJuWzFdPT09Jy8nKXtcblx0XHRcdFx0aWYoKHRtcD1zdGF0ZS5wb3AoKSlbMF0hPT1SblszXSkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHN0YXRlOiBcIit0bXAuam9pbihcInxcIikpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSBzdGF0ZS5wdXNoKFtSblszXSwgdHJ1ZV0pO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdwaXhlbHNwZXJpbmNoJyAvKmNhc2UgJ1BpeGVsc1BlckluY2gnKi86XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdjb21wb25lbnRvcHRpb25zJyAvKmNhc2UgJ0NvbXBvbmVudE9wdGlvbnMnKi86XG5cdFx0Y2FzZSAnZG9jdW1lbnRwcm9wZXJ0aWVzJyAvKmNhc2UgJ0RvY3VtZW50UHJvcGVydGllcycqLzpcblx0XHRjYXNlICdjdXN0b21kb2N1bWVudHByb3BlcnRpZXMnIC8qY2FzZSAnQ3VzdG9tRG9jdW1lbnRQcm9wZXJ0aWVzJyovOlxuXHRcdGNhc2UgJ29mZmljZWRvY3VtZW50c2V0dGluZ3MnIC8qY2FzZSAnT2ZmaWNlRG9jdW1lbnRTZXR0aW5ncycqLzpcblx0XHRjYXNlICdwaXZvdHRhYmxlJyAvKmNhc2UgJ1Bpdm90VGFibGUnKi86XG5cdFx0Y2FzZSAncGl2b3RjYWNoZScgLypjYXNlICdQaXZvdENhY2hlJyovOlxuXHRcdGNhc2UgJ25hbWVzJyAvKmNhc2UgJ05hbWVzJyovOlxuXHRcdGNhc2UgJ21hcGluZm8nIC8qY2FzZSAnTWFwSW5mbycqLzpcblx0XHRjYXNlICdwYWdlYnJlYWtzJyAvKmNhc2UgJ1BhZ2VCcmVha3MnKi86XG5cdFx0Y2FzZSAncXVlcnl0YWJsZScgLypjYXNlICdRdWVyeVRhYmxlJyovOlxuXHRcdGNhc2UgJ3NvcnRpbmcnIC8qY2FzZSAnU29ydGluZycqLzpcblx0XHRjYXNlICdzY2hlbWEnIC8qY2FzZSAnU2NoZW1hJyovOiAvL2Nhc2UgJ2RhdGEnIC8qY2FzZSAnZGF0YScqLzpcblx0XHRjYXNlICdjb25kaXRpb25hbGZvcm1hdHRpbmcnIC8qY2FzZSAnQ29uZGl0aW9uYWxGb3JtYXR0aW5nJyovOlxuXHRcdGNhc2UgJ3NtYXJ0dGFndHlwZScgLypjYXNlICdTbWFydFRhZ1R5cGUnKi86XG5cdFx0Y2FzZSAnc21hcnR0YWdzJyAvKmNhc2UgJ1NtYXJ0VGFncycqLzpcblx0XHRjYXNlICdleGNlbHdvcmtib29rJyAvKmNhc2UgJ0V4Y2VsV29ya2Jvb2snKi86XG5cdFx0Y2FzZSAnd29ya2Jvb2tvcHRpb25zJyAvKmNhc2UgJ1dvcmtib29rT3B0aW9ucycqLzpcblx0XHRjYXNlICd3b3Jrc2hlZXRvcHRpb25zJyAvKmNhc2UgJ1dvcmtzaGVldE9wdGlvbnMnKi86XG5cdFx0XHRpZihSblsxXT09PScvJyl7aWYoKHRtcD1zdGF0ZS5wb3AoKSlbMF0hPT1SblszXSkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHN0YXRlOiBcIit0bXAuam9pbihcInxcIikpO31cblx0XHRcdGVsc2UgaWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSBzdGF0ZS5wdXNoKFtSblszXSwgdHJ1ZV0pO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdudWxsJyAvKmNhc2UgJ051bGwnKi86IGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8qIEZPRFMgZmlsZSByb290IGlzIDxvZmZpY2U6ZG9jdW1lbnQ+ICovXG5cdFx0XHRpZihzdGF0ZS5sZW5ndGggPT0gMCAmJiBSblszXSA9PSBcImRvY3VtZW50XCIpIHJldHVybiBwYXJzZV9mb2RzKHN0ciwgb3B0cyk7XG5cdFx0XHQvKiBVT1MgZmlsZSByb290IGlzIDx1b2Y6VU9GPiAqL1xuXHRcdFx0aWYoc3RhdGUubGVuZ3RoID09IDAgJiYgUm5bM10gPT0gXCJ1b2ZcIi8qXCJVT0ZcIiovKSByZXR1cm4gcGFyc2VfZm9kcyhzdHIsIG9wdHMpO1xuXG5cdFx0XHR2YXIgc2VlbiA9IHRydWU7XG5cdFx0XHRzd2l0Y2goc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdKSB7XG5cdFx0XHRcdC8qIE9mZmljZURvY3VtZW50U2V0dGluZ3MgKi9cblx0XHRcdFx0Y2FzZSAnb2ZmaWNlZG9jdW1lbnRzZXR0aW5ncycgLypjYXNlICdPZmZpY2VEb2N1bWVudFNldHRpbmdzJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdhbGxvd3BuZycgLypjYXNlICdBbGxvd1BORycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmVtb3ZlcGVyc29uYWxpbmZvcm1hdGlvbicgLypjYXNlICdSZW1vdmVQZXJzb25hbEluZm9ybWF0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb3dubG9hZGNvbXBvbmVudHMnIC8qY2FzZSAnRG93bmxvYWRDb21wb25lbnRzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsb2NhdGlvbm9mY29tcG9uZW50cycgLypjYXNlICdMb2NhdGlvbk9mQ29tcG9uZW50cycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JzJyAvKmNhc2UgJ0NvbG9ycycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3InIC8qY2FzZSAnQ29sb3InKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2luZGV4JyAvKmNhc2UgJ0luZGV4JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyZ2InIC8qY2FzZSAnUkdCJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0YXJnZXRzY3JlZW5zaXplJyAvKmNhc2UgJ1RhcmdldFNjcmVlblNpemUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlYWRvbmx5cmVjb21tZW5kZWQnIC8qY2FzZSAnUmVhZE9ubHlSZWNvbW1lbmRlZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIENvbXBvbmVudE9wdGlvbnMgKi9cblx0XHRcdFx0Y2FzZSAnY29tcG9uZW50b3B0aW9ucycgLypjYXNlICdDb21wb25lbnRPcHRpb25zJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICd0b29sYmFyJyAvKmNhc2UgJ1Rvb2xiYXInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2hpZGVvZmZpY2Vsb2dvJyAvKmNhc2UgJ0hpZGVPZmZpY2VMb2dvJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzcHJlYWRzaGVldGF1dG9maXQnIC8qY2FzZSAnU3ByZWFkc2hlZXRBdXRvRml0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsYWJlbCcgLypjYXNlICdMYWJlbCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY2FwdGlvbicgLypjYXNlICdDYXB0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXhoZWlnaHQnIC8qY2FzZSAnTWF4SGVpZ2h0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXh3aWR0aCcgLypjYXNlICdNYXhXaWR0aCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbmV4dHNoZWV0bnVtYmVyJyAvKmNhc2UgJ05leHRTaGVldE51bWJlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIEV4Y2VsV29ya2Jvb2sgKi9cblx0XHRcdFx0Y2FzZSAnZXhjZWx3b3JrYm9vaycgLypjYXNlICdFeGNlbFdvcmtib29rJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdkYXRlMTkwNCcgLypjYXNlICdEYXRlMTkwNCcqLzpcblx0XHRcdFx0XHRcdC8qOjogaWYoIVdvcmtib29rLldCUHJvcHMpIFdvcmtib29rLldCUHJvcHMgPSB7fTsgKi9cblx0XHRcdFx0XHRcdFdvcmtib29rLldCUHJvcHMuZGF0ZTE5MDQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2luZG93aGVpZ2h0JyAvKmNhc2UgJ1dpbmRvd0hlaWdodCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2luZG93d2lkdGgnIC8qY2FzZSAnV2luZG93V2lkdGgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3dpbmRvd3RvcHgnIC8qY2FzZSAnV2luZG93VG9wWCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2luZG93dG9weScgLypjYXNlICdXaW5kb3dUb3BZJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0YWJyYXRpbycgLypjYXNlICdUYWJSYXRpbycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHJvdGVjdHN0cnVjdHVyZScgLypjYXNlICdQcm90ZWN0U3RydWN0dXJlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcm90ZWN0d2luZG93JyAvKmNhc2UgJ1Byb3RlY3RXaW5kb3cnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Byb3RlY3R3aW5kb3dzJyAvKmNhc2UgJ1Byb3RlY3RXaW5kb3dzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhY3RpdmVzaGVldCcgLypjYXNlICdBY3RpdmVTaGVldCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGlzcGxheWlua25vdGVzJyAvKmNhc2UgJ0Rpc3BsYXlJbmtOb3RlcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmlyc3R2aXNpYmxlc2hlZXQnIC8qY2FzZSAnRmlyc3RWaXNpYmxlU2hlZXQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3N1cGJvb2snIC8qY2FzZSAnU3VwQm9vaycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hlZXRuYW1lJyAvKmNhc2UgJ1NoZWV0TmFtZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hlZXRpbmRleCcgLypjYXNlICdTaGVldEluZGV4JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaGVldGluZGV4Zmlyc3QnIC8qY2FzZSAnU2hlZXRJbmRleEZpcnN0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaGVldGluZGV4bGFzdCcgLypjYXNlICdTaGVldEluZGV4TGFzdCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGxsJyAvKmNhc2UgJ0RsbCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWNjZXB0bGFiZWxzaW5mb3JtdWxhcycgLypjYXNlICdBY2NlcHRMYWJlbHNJbkZvcm11bGFzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb25vdHNhdmVsaW5rdmFsdWVzJyAvKmNhc2UgJ0RvTm90U2F2ZUxpbmtWYWx1ZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2l0ZXJhdGlvbicgLypjYXNlICdJdGVyYXRpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21heGl0ZXJhdGlvbnMnIC8qY2FzZSAnTWF4SXRlcmF0aW9ucycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWF4Y2hhbmdlJyAvKmNhc2UgJ01heENoYW5nZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGF0aCcgLypjYXNlICdQYXRoJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd4Y3QnIC8qY2FzZSAnWGN0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb3VudCcgLypjYXNlICdDb3VudCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2VsZWN0ZWRzaGVldHMnIC8qY2FzZSAnU2VsZWN0ZWRTaGVldHMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NhbGN1bGF0aW9uJyAvKmNhc2UgJ0NhbGN1bGF0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd1bmNhbGNlZCcgLypjYXNlICdVbmNhbGNlZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3RhcnR1cHByb21wdCcgLypjYXNlICdTdGFydHVwUHJvbXB0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjcm4nIC8qY2FzZSAnQ3JuJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdleHRlcm5uYW1lJyAvKmNhc2UgJ0V4dGVybk5hbWUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Zvcm11bGEnIC8qY2FzZSAnRm9ybXVsYScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sZmlyc3QnIC8qY2FzZSAnQ29sRmlyc3QnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbGxhc3QnIC8qY2FzZSAnQ29sTGFzdCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2FudGFkdmlzZScgLypjYXNlICdXYW50QWR2aXNlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdib29sZWFuJyAvKmNhc2UgJ0Jvb2xlYW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9yJyAvKmNhc2UgJ0Vycm9yJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0ZXh0JyAvKmNhc2UgJ1RleHQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ29sZScgLypjYXNlICdPTEUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25vYXV0b3JlY292ZXInIC8qY2FzZSAnTm9BdXRvUmVjb3ZlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHVibGlzaG9iamVjdHMnIC8qY2FzZSAnUHVibGlzaE9iamVjdHMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Rvbm90Y2FsY3VsYXRlYmVmb3Jlc2F2ZScgLypjYXNlICdEb05vdENhbGN1bGF0ZUJlZm9yZVNhdmUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ251bWJlcicgLypjYXNlICdOdW1iZXInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlZm1vZGVyMWMxJyAvKmNhc2UgJ1JlZk1vZGVSMUMxJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlbWJlZHNhdmVzbWFydHRhZ3MnIC8qY2FzZSAnRW1iZWRTYXZlU21hcnRUYWdzJyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0LyogV29ya2Jvb2tPcHRpb25zICovXG5cdFx0XHRcdGNhc2UgJ3dvcmtib29rb3B0aW9ucycgLypjYXNlICdXb3JrYm9va09wdGlvbnMnKi86IHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ293Y3ZlcnNpb24nIC8qY2FzZSAnT1dDVmVyc2lvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaGVpZ2h0JyAvKmNhc2UgJ0hlaWdodCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2lkdGgnIC8qY2FzZSAnV2lkdGgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHNlZW4gPSBmYWxzZTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHQvKiBXb3Jrc2hlZXRPcHRpb25zICovXG5cdFx0XHRcdGNhc2UgJ3dvcmtzaGVldG9wdGlvbnMnIC8qY2FzZSAnV29ya3NoZWV0T3B0aW9ucycqLzogc3dpdGNoKFJuWzNdKSB7XG5cdFx0XHRcdFx0Y2FzZSAndmlzaWJsZScgLypjYXNlICdWaXNpYmxlJyovOlxuXHRcdFx0XHRcdFx0aWYoUm5bMF0uc2xpY2UoLTIpID09PSBcIi8+XCIpey8qIGVtcHR5ICovfVxuXHRcdFx0XHRcdFx0ZWxzZSBpZihSblsxXT09PVwiL1wiKSBzd2l0Y2goc3RyLnNsaWNlKHBpZHgsIFJuLmluZGV4KSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlIFwiU2hlZXRIaWRkZW5cIjogd3Nwcm9wcy5IaWRkZW4gPSAxOyBicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBcIlNoZWV0VmVyeUhpZGRlblwiOiB3c3Byb3BzLkhpZGRlbiA9IDI7IGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSBwaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdoZWFkZXInIC8qY2FzZSAnSGVhZGVyJyovOlxuXHRcdFx0XHRcdFx0aWYoIWN1cnNoZWV0WychbWFyZ2lucyddKSBkZWZhdWx0X21hcmdpbnMoY3Vyc2hlZXRbJyFtYXJnaW5zJ109e30sICd4bG1sJyk7XG5cdFx0XHRcdFx0XHRpZighaXNOYU4oK3BhcnNleG1sdGFnKFJuWzBdKS5NYXJnaW4pKSBjdXJzaGVldFsnIW1hcmdpbnMnXS5oZWFkZXIgPSArcGFyc2V4bWx0YWcoUm5bMF0pLk1hcmdpbjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Zvb3RlcicgLypjYXNlICdGb290ZXInKi86XG5cdFx0XHRcdFx0XHRpZighY3Vyc2hlZXRbJyFtYXJnaW5zJ10pIGRlZmF1bHRfbWFyZ2lucyhjdXJzaGVldFsnIW1hcmdpbnMnXT17fSwgJ3hsbWwnKTtcblx0XHRcdFx0XHRcdGlmKCFpc05hTigrcGFyc2V4bWx0YWcoUm5bMF0pLk1hcmdpbikpIGN1cnNoZWV0WychbWFyZ2lucyddLmZvb3RlciA9ICtwYXJzZXhtbHRhZyhSblswXSkuTWFyZ2luO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGFnZW1hcmdpbnMnIC8qY2FzZSAnUGFnZU1hcmdpbnMnKi86XG5cdFx0XHRcdFx0XHR2YXIgcGFnZW1hcmdpbnMgPSBwYXJzZXhtbHRhZyhSblswXSk7XG5cdFx0XHRcdFx0XHRpZighY3Vyc2hlZXRbJyFtYXJnaW5zJ10pIGRlZmF1bHRfbWFyZ2lucyhjdXJzaGVldFsnIW1hcmdpbnMnXT17fSwneGxtbCcpO1xuXHRcdFx0XHRcdFx0aWYoIWlzTmFOKCtwYWdlbWFyZ2lucy5Ub3ApKSBjdXJzaGVldFsnIW1hcmdpbnMnXS50b3AgPSArcGFnZW1hcmdpbnMuVG9wO1xuXHRcdFx0XHRcdFx0aWYoIWlzTmFOKCtwYWdlbWFyZ2lucy5MZWZ0KSkgY3Vyc2hlZXRbJyFtYXJnaW5zJ10ubGVmdCA9ICtwYWdlbWFyZ2lucy5MZWZ0O1xuXHRcdFx0XHRcdFx0aWYoIWlzTmFOKCtwYWdlbWFyZ2lucy5SaWdodCkpIGN1cnNoZWV0WychbWFyZ2lucyddLnJpZ2h0ID0gK3BhZ2VtYXJnaW5zLlJpZ2h0O1xuXHRcdFx0XHRcdFx0aWYoIWlzTmFOKCtwYWdlbWFyZ2lucy5Cb3R0b20pKSBjdXJzaGVldFsnIW1hcmdpbnMnXS5ib3R0b20gPSArcGFnZW1hcmdpbnMuQm90dG9tO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGlzcGxheXJpZ2h0dG9sZWZ0JyAvKmNhc2UgJ0Rpc3BsYXlSaWdodFRvTGVmdCcqLzpcblx0XHRcdFx0XHRcdGlmKCFXb3JrYm9vay5WaWV3cykgV29ya2Jvb2suVmlld3MgPSBbXTtcblx0XHRcdFx0XHRcdGlmKCFXb3JrYm9vay5WaWV3c1swXSkgV29ya2Jvb2suVmlld3NbMF0gPSB7fTtcblx0XHRcdFx0XHRcdFdvcmtib29rLlZpZXdzWzBdLlJUTCA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2ZyZWV6ZXBhbmVzJyAvKmNhc2UgJ0ZyZWV6ZVBhbmVzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmcm96ZW5ub3NwbGl0JyAvKmNhc2UgJ0Zyb3plbk5vU3BsaXQnKi86IGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnc3BsaXRob3Jpem9udGFsJyAvKmNhc2UgJ1NwbGl0SG9yaXpvbnRhbCcqLzpcblx0XHRcdFx0XHRjYXNlICdzcGxpdHZlcnRpY2FsJyAvKmNhc2UgJ1NwbGl0VmVydGljYWwnKi86XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2Rvbm90ZGlzcGxheWdyaWRsaW5lcycgLypjYXNlICdEb05vdERpc3BsYXlHcmlkbGluZXMnKi86XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2FjdGl2ZXJvdycgLypjYXNlICdBY3RpdmVSb3cnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2FjdGl2ZWNvbCcgLypjYXNlICdBY3RpdmVDb2wnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RvcHJvd2JvdHRvbXBhbmUnIC8qY2FzZSAnVG9wUm93Qm90dG9tUGFuZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbGVmdGNvbHVtbnJpZ2h0cGFuZScgLypjYXNlICdMZWZ0Q29sdW1uUmlnaHRQYW5lJyovOiBicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ3Vuc3luY2VkJyAvKmNhc2UgJ1Vuc3luY2VkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcmludCcgLypjYXNlICdQcmludCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHJpbnRlcnJvcnMnIC8qY2FzZSAnUHJpbnRFcnJvcnMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BhbmVzJyAvKmNhc2UgJ1BhbmVzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzY2FsZScgLypjYXNlICdTY2FsZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGFuZScgLypjYXNlICdQYW5lJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdudW1iZXInIC8qY2FzZSAnTnVtYmVyJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsYXlvdXQnIC8qY2FzZSAnTGF5b3V0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwYWdlc2V0dXAnIC8qY2FzZSAnUGFnZVNldHVwJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzZWxlY3RlZCcgLypjYXNlICdTZWxlY3RlZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHJvdGVjdG9iamVjdHMnIC8qY2FzZSAnUHJvdGVjdE9iamVjdHMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2VuYWJsZXNlbGVjdGlvbicgLypjYXNlICdFbmFibGVTZWxlY3Rpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Byb3RlY3RzY2VuYXJpb3MnIC8qY2FzZSAnUHJvdGVjdFNjZW5hcmlvcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmFsaWRwcmludGVyaW5mbycgLypjYXNlICdWYWxpZFByaW50ZXJJbmZvJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdob3Jpem9udGFscmVzb2x1dGlvbicgLypjYXNlICdIb3Jpem9udGFsUmVzb2x1dGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVydGljYWxyZXNvbHV0aW9uJyAvKmNhc2UgJ1ZlcnRpY2FsUmVzb2x1dGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbnVtYmVyb2Zjb3BpZXMnIC8qY2FzZSAnTnVtYmVyb2ZDb3BpZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2FjdGl2ZXBhbmUnIC8qY2FzZSAnQWN0aXZlUGFuZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndG9wcm93dmlzaWJsZScgLypjYXNlICdUb3BSb3dWaXNpYmxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsZWZ0Y29sdW1udmlzaWJsZScgLypjYXNlICdMZWZ0Q29sdW1uVmlzaWJsZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZml0dG9wYWdlJyAvKmNhc2UgJ0ZpdFRvUGFnZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmFuZ2VzZWxlY3Rpb24nIC8qY2FzZSAnUmFuZ2VTZWxlY3Rpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BhcGVyc2l6ZWluZGV4JyAvKmNhc2UgJ1BhcGVyU2l6ZUluZGV4JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwYWdlbGF5b3V0em9vbScgLypjYXNlICdQYWdlTGF5b3V0Wm9vbScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGFnZWJyZWFrem9vbScgLypjYXNlICdQYWdlQnJlYWtab29tJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaWx0ZXJvbicgLypjYXNlICdGaWx0ZXJPbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZml0d2lkdGgnIC8qY2FzZSAnRml0V2lkdGgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZpdGhlaWdodCcgLypjYXNlICdGaXRIZWlnaHQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbW1lbnRzbGF5b3V0JyAvKmNhc2UgJ0NvbW1lbnRzTGF5b3V0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd6b29tJyAvKmNhc2UgJ1pvb20nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2xlZnR0b3JpZ2h0JyAvKmNhc2UgJ0xlZnRUb1JpZ2h0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdncmlkbGluZXMnIC8qY2FzZSAnR3JpZGxpbmVzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd3NvcnQnIC8qY2FzZSAnQWxsb3dTb3J0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd2ZpbHRlcicgLypjYXNlICdBbGxvd0ZpbHRlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3dpbnNlcnRyb3dzJyAvKmNhc2UgJ0FsbG93SW5zZXJ0Um93cycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3dkZWxldGVyb3dzJyAvKmNhc2UgJ0FsbG93RGVsZXRlUm93cycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3dpbnNlcnRjb2xzJyAvKmNhc2UgJ0FsbG93SW5zZXJ0Q29scycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3dkZWxldGVjb2xzJyAvKmNhc2UgJ0FsbG93RGVsZXRlQ29scycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3dpbnNlcnRoeXBlcmxpbmtzJyAvKmNhc2UgJ0FsbG93SW5zZXJ0SHlwZXJsaW5rcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3dmb3JtYXRjZWxscycgLypjYXNlICdBbGxvd0Zvcm1hdENlbGxzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd3NpemVjb2xzJyAvKmNhc2UgJ0FsbG93U2l6ZUNvbHMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2FsbG93c2l6ZXJvd3MnIC8qY2FzZSAnQWxsb3dTaXplUm93cycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbm9zdW1tYXJ5cm93c2JlbG93ZGV0YWlsJyAvKmNhc2UgJ05vU3VtbWFyeVJvd3NCZWxvd0RldGFpbCcqLzpcblx0XHRcdFx0XHRcdGlmKCFjdXJzaGVldFtcIiFvdXRsaW5lXCJdKSBjdXJzaGVldFtcIiFvdXRsaW5lXCJdID0ge307XG5cdFx0XHRcdFx0XHRjdXJzaGVldFtcIiFvdXRsaW5lXCJdLmFib3ZlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RhYmNvbG9yaW5kZXgnIC8qY2FzZSAnVGFiQ29sb3JJbmRleCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG9ub3RkaXNwbGF5aGVhZGluZ3MnIC8qY2FzZSAnRG9Ob3REaXNwbGF5SGVhZGluZ3MnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Nob3dwYWdlbGF5b3V0em9vbScgLypjYXNlICdTaG93UGFnZUxheW91dFpvb20nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25vc3VtbWFyeWNvbHVtbnNyaWdodGRldGFpbCcgLypjYXNlICdOb1N1bW1hcnlDb2x1bW5zUmlnaHREZXRhaWwnKi86XG5cdFx0XHRcdFx0XHRpZighY3Vyc2hlZXRbXCIhb3V0bGluZVwiXSkgY3Vyc2hlZXRbXCIhb3V0bGluZVwiXSA9IHt9O1xuXHRcdFx0XHRcdFx0Y3Vyc2hlZXRbXCIhb3V0bGluZVwiXS5sZWZ0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2JsYWNrYW5kd2hpdGUnIC8qY2FzZSAnQmxhY2tBbmRXaGl0ZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG9ub3RkaXNwbGF5emVyb3MnIC8qY2FzZSAnRG9Ob3REaXNwbGF5WmVyb3MnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Rpc3BsYXlwYWdlYnJlYWsnIC8qY2FzZSAnRGlzcGxheVBhZ2VCcmVhaycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncm93Y29saGVhZGluZ3MnIC8qY2FzZSAnUm93Q29sSGVhZGluZ3MnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Rvbm90ZGlzcGxheW91dGxpbmUnIC8qY2FzZSAnRG9Ob3REaXNwbGF5T3V0bGluZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbm9vcmllbnRhdGlvbicgLypjYXNlICdOb09yaWVudGF0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd3VzZXBpdm90dGFibGVzJyAvKmNhc2UgJ0FsbG93VXNlUGl2b3RUYWJsZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3plcm9oZWlnaHQnIC8qY2FzZSAnWmVyb0hlaWdodCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmlld2FibGVyYW5nZScgLypjYXNlICdWaWV3YWJsZVJhbmdlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzZWxlY3Rpb24nIC8qY2FzZSAnU2VsZWN0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcm90ZWN0Y29udGVudHMnIC8qY2FzZSAnUHJvdGVjdENvbnRlbnRzJyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0LyogUGl2b3RUYWJsZSAqL1xuXHRcdFx0XHRjYXNlICdwaXZvdHRhYmxlJyAvKmNhc2UgJ1Bpdm90VGFibGUnKi86IGNhc2UgJ3Bpdm90Y2FjaGUnIC8qY2FzZSAnUGl2b3RDYWNoZScqLzogc3dpdGNoKFJuWzNdKSB7XG5cdFx0XHRcdFx0Y2FzZSAnaW1tZWRpYXRlaXRlbXNvbmRyb3AnIC8qY2FzZSAnSW1tZWRpYXRlSXRlbXNPbkRyb3AnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Nob3dwYWdlbXVsdGlwbGVpdGVtbGFiZWwnIC8qY2FzZSAnU2hvd1BhZ2VNdWx0aXBsZUl0ZW1MYWJlbCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29tcGFjdHJvd2luZGVudCcgLypjYXNlICdDb21wYWN0Um93SW5kZW50JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsb2NhdGlvbicgLypjYXNlICdMb2NhdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGl2b3RmaWVsZCcgLypjYXNlICdQaXZvdEZpZWxkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdvcmllbnRhdGlvbicgLypjYXNlICdPcmllbnRhdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbGF5b3V0Zm9ybScgLypjYXNlICdMYXlvdXRGb3JtJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsYXlvdXRzdWJ0b3RhbGxvY2F0aW9uJyAvKmNhc2UgJ0xheW91dFN1YnRvdGFsTG9jYXRpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2xheW91dGNvbXBhY3Ryb3cnIC8qY2FzZSAnTGF5b3V0Q29tcGFjdFJvdycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncG9zaXRpb24nIC8qY2FzZSAnUG9zaXRpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Bpdm90aXRlbScgLypjYXNlICdQaXZvdEl0ZW0nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RhdGF0eXBlJyAvKmNhc2UgJ0RhdGFUeXBlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkYXRhZmllbGQnIC8qY2FzZSAnRGF0YUZpZWxkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzb3VyY2VuYW1lJyAvKmNhc2UgJ1NvdXJjZU5hbWUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BhcmVudGZpZWxkJyAvKmNhc2UgJ1BhcmVudEZpZWxkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwdGxpbmVpdGVtcycgLypjYXNlICdQVExpbmVJdGVtcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHRsaW5laXRlbScgLypjYXNlICdQVExpbmVJdGVtJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb3VudG9mc2FtZWl0ZW1zJyAvKmNhc2UgJ0NvdW50T2ZTYW1lSXRlbXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2l0ZW0nIC8qY2FzZSAnSXRlbScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaXRlbXR5cGUnIC8qY2FzZSAnSXRlbVR5cGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3B0c291cmNlJyAvKmNhc2UgJ1BUU291cmNlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjYWNoZWluZGV4JyAvKmNhc2UgJ0NhY2hlSW5kZXgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbnNvbGlkYXRpb25yZWZlcmVuY2UnIC8qY2FzZSAnQ29uc29saWRhdGlvblJlZmVyZW5jZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmlsZW5hbWUnIC8qY2FzZSAnRmlsZU5hbWUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlZmVyZW5jZScgLypjYXNlICdSZWZlcmVuY2UnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25vY29sdW1uZ3JhbmQnIC8qY2FzZSAnTm9Db2x1bW5HcmFuZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbm9yb3dncmFuZCcgLypjYXNlICdOb1Jvd0dyYW5kJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdibGFua2xpbmVhZnRlcml0ZW1zJyAvKmNhc2UgJ0JsYW5rTGluZUFmdGVySXRlbXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2hpZGRlbicgLypjYXNlICdIaWRkZW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3N1YnRvdGFsJyAvKmNhc2UgJ1N1YnRvdGFsJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdiYXNlZmllbGQnIC8qY2FzZSAnQmFzZUZpZWxkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBjaGlsZGl0ZW1zJyAvKmNhc2UgJ01hcENoaWxkSXRlbXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Z1bmN0aW9uJyAvKmNhc2UgJ0Z1bmN0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyZWZyZXNob25maWxlb3BlbicgLypjYXNlICdSZWZyZXNoT25GaWxlT3BlbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHJpbnRzZXR0aXRsZXMnIC8qY2FzZSAnUHJpbnRTZXRUaXRsZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21lcmdlbGFiZWxzJyAvKmNhc2UgJ01lcmdlTGFiZWxzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkZWZhdWx0dmVyc2lvbicgLypjYXNlICdEZWZhdWx0VmVyc2lvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmVmcmVzaG5hbWUnIC8qY2FzZSAnUmVmcmVzaE5hbWUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlZnJlc2hkYXRlJyAvKmNhc2UgJ1JlZnJlc2hEYXRlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyZWZyZXNoZGF0ZWNvcHknIC8qY2FzZSAnUmVmcmVzaERhdGVDb3B5JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJzaW9ubGFzdHJlZnJlc2gnIC8qY2FzZSAnVmVyc2lvbkxhc3RSZWZyZXNoJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJzaW9ubGFzdHVwZGF0ZScgLypjYXNlICdWZXJzaW9uTGFzdFVwZGF0ZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVyc2lvbnVwZGF0ZWFibGVtaW4nIC8qY2FzZSAnVmVyc2lvblVwZGF0ZWFibGVNaW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZlcnNpb25yZWZyZXNoYWJsZW1pbicgLypjYXNlICdWZXJzaW9uUmVmcmVzaGFibGVNaW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NhbGN1bGF0aW9uJyAvKmNhc2UgJ0NhbGN1bGF0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0LyogUGFnZUJyZWFrcyAqL1xuXHRcdFx0XHRjYXNlICdwYWdlYnJlYWtzJyAvKmNhc2UgJ1BhZ2VCcmVha3MnKi86IHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ2NvbGJyZWFrcycgLypjYXNlICdDb2xCcmVha3MnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbGJyZWFrJyAvKmNhc2UgJ0NvbEJyZWFrJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyb3dicmVha3MnIC8qY2FzZSAnUm93QnJlYWtzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyb3dicmVhaycgLypjYXNlICdSb3dCcmVhaycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sc3RhcnQnIC8qY2FzZSAnQ29sU3RhcnQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbGVuZCcgLypjYXNlICdDb2xFbmQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Jvd2VuZCcgLypjYXNlICdSb3dFbmQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHNlZW4gPSBmYWxzZTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHQvKiBBdXRvRmlsdGVyICovXG5cdFx0XHRcdGNhc2UgJ2F1dG9maWx0ZXInIC8qY2FzZSAnQXV0b0ZpbHRlcicqLzogc3dpdGNoKFJuWzNdKSB7XG5cdFx0XHRcdFx0Y2FzZSAnYXV0b2ZpbHRlcmNvbHVtbicgLypjYXNlICdBdXRvRmlsdGVyQ29sdW1uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhdXRvZmlsdGVyY29uZGl0aW9uJyAvKmNhc2UgJ0F1dG9GaWx0ZXJDb25kaXRpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2F1dG9maWx0ZXJhbmQnIC8qY2FzZSAnQXV0b0ZpbHRlckFuZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYXV0b2ZpbHRlcm9yJyAvKmNhc2UgJ0F1dG9GaWx0ZXJPcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIFF1ZXJ5VGFibGUgKi9cblx0XHRcdFx0Y2FzZSAncXVlcnl0YWJsZScgLypjYXNlICdRdWVyeVRhYmxlJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdpZCcgLypjYXNlICdJZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYXV0b2Zvcm1hdGZvbnQnIC8qY2FzZSAnQXV0b0Zvcm1hdEZvbnQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2F1dG9mb3JtYXRwYXR0ZXJuJyAvKmNhc2UgJ0F1dG9Gb3JtYXRQYXR0ZXJuJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdxdWVyeXNvdXJjZScgLypjYXNlICdRdWVyeVNvdXJjZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncXVlcnl0eXBlJyAvKmNhc2UgJ1F1ZXJ5VHlwZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZW5hYmxlcmVkaXJlY3Rpb25zJyAvKmNhc2UgJ0VuYWJsZVJlZGlyZWN0aW9ucycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmVmcmVzaGVkaW54bDknIC8qY2FzZSAnUmVmcmVzaGVkSW5YbDknKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3VybHN0cmluZycgLypjYXNlICdVUkxTdHJpbmcnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2h0bWx0YWJsZXMnIC8qY2FzZSAnSFRNTFRhYmxlcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29ubmVjdGlvbicgLypjYXNlICdDb25uZWN0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb21tYW5kdGV4dCcgLypjYXNlICdDb21tYW5kVGV4dCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmVmcmVzaGluZm8nIC8qY2FzZSAnUmVmcmVzaEluZm8nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25vdGl0bGVzJyAvKmNhc2UgJ05vVGl0bGVzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICduZXh0aWQnIC8qY2FzZSAnTmV4dElkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2x1bW5pbmZvJyAvKmNhc2UgJ0NvbHVtbkluZm8nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ292ZXJ3cml0ZWNlbGxzJyAvKmNhc2UgJ092ZXJ3cml0ZUNlbGxzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb25vdHByb21wdGZvcmZpbGUnIC8qY2FzZSAnRG9Ob3RQcm9tcHRGb3JGaWxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0ZXh0d2l6YXJkc2V0dGluZ3MnIC8qY2FzZSAnVGV4dFdpemFyZFNldHRpbmdzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzb3VyY2UnIC8qY2FzZSAnU291cmNlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdudW1iZXInIC8qY2FzZSAnTnVtYmVyJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkZWNpbWFsJyAvKmNhc2UgJ0RlY2ltYWwnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Rob3VzYW5kc2VwYXJhdG9yJyAvKmNhc2UgJ1Rob3VzYW5kU2VwYXJhdG9yJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0cmFpbGluZ21pbnVzbnVtYmVycycgLypjYXNlICdUcmFpbGluZ01pbnVzTnVtYmVycycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZm9ybWF0c2V0dGluZ3MnIC8qY2FzZSAnRm9ybWF0U2V0dGluZ3MnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZpZWxkdHlwZScgLypjYXNlICdGaWVsZFR5cGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RlbGltaXRlcnMnIC8qY2FzZSAnRGVsaW1pdGVycycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndGFiJyAvKmNhc2UgJ1RhYicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29tbWEnIC8qY2FzZSAnQ29tbWEnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2F1dG9mb3JtYXRuYW1lJyAvKmNhc2UgJ0F1dG9Gb3JtYXROYW1lJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJzaW9ubGFzdGVkaXQnIC8qY2FzZSAnVmVyc2lvbkxhc3RFZGl0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJzaW9ubGFzdHJlZnJlc2gnIC8qY2FzZSAnVmVyc2lvbkxhc3RSZWZyZXNoJyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnZGF0YXZhbGlkYXRpb24nIC8qY2FzZSAnRGF0YVZhbGlkYXRpb24nKi86XG5cdFx0XHRcdHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ3JhbmdlJyAvKmNhc2UgJ1JhbmdlJyovOiBicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ3R5cGUnIC8qY2FzZSAnVHlwZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWluJyAvKmNhc2UgJ01pbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWF4JyAvKmNhc2UgJ01heCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc29ydCcgLypjYXNlICdTb3J0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkZXNjZW5kaW5nJyAvKmNhc2UgJ0Rlc2NlbmRpbmcnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ29yZGVyJyAvKmNhc2UgJ09yZGVyJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjYXNlc2Vuc2l0aXZlJyAvKmNhc2UgJ0Nhc2VTZW5zaXRpdmUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZhbHVlJyAvKmNhc2UgJ1ZhbHVlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlcnJvcnN0eWxlJyAvKmNhc2UgJ0Vycm9yU3R5bGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9ybWVzc2FnZScgLypjYXNlICdFcnJvck1lc3NhZ2UnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9ydGl0bGUnIC8qY2FzZSAnRXJyb3JUaXRsZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaW5wdXRtZXNzYWdlJyAvKmNhc2UgJ0lucHV0TWVzc2FnZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaW5wdXR0aXRsZScgLypjYXNlICdJbnB1dFRpdGxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb21ib2hpZGUnIC8qY2FzZSAnQ29tYm9IaWRlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdpbnB1dGhpZGUnIC8qY2FzZSAnSW5wdXRIaWRlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb25kaXRpb24nIC8qY2FzZSAnQ29uZGl0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdxdWFsaWZpZXInIC8qY2FzZSAnUXVhbGlmaWVyJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd1c2VibGFuaycgLypjYXNlICdVc2VCbGFuaycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmFsdWUxJyAvKmNhc2UgJ1ZhbHVlMScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmFsdWUyJyAvKmNhc2UgJ1ZhbHVlMicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZm9ybWF0JyAvKmNhc2UgJ0Zvcm1hdCcqLzogYnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdjZWxscmFuZ2VsaXN0JyAvKmNhc2UgJ0NlbGxSYW5nZUxpc3QnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHNlZW4gPSBmYWxzZTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHRjYXNlICdzb3J0aW5nJyAvKmNhc2UgJ1NvcnRpbmcnKi86XG5cdFx0XHRcdGNhc2UgJ2NvbmRpdGlvbmFsZm9ybWF0dGluZycgLypjYXNlICdDb25kaXRpb25hbEZvcm1hdHRpbmcnKi86XG5cdFx0XHRcdHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ3JhbmdlJyAvKmNhc2UgJ1JhbmdlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0eXBlJyAvKmNhc2UgJ1R5cGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21pbicgLypjYXNlICdNaW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21heCcgLypjYXNlICdNYXgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NvcnQnIC8qY2FzZSAnU29ydCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGVzY2VuZGluZycgLypjYXNlICdEZXNjZW5kaW5nJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdvcmRlcicgLypjYXNlICdPcmRlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY2FzZXNlbnNpdGl2ZScgLypjYXNlICdDYXNlU2Vuc2l0aXZlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2YWx1ZScgLypjYXNlICdWYWx1ZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZXJyb3JzdHlsZScgLypjYXNlICdFcnJvclN0eWxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlcnJvcm1lc3NhZ2UnIC8qY2FzZSAnRXJyb3JNZXNzYWdlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlcnJvcnRpdGxlJyAvKmNhc2UgJ0Vycm9yVGl0bGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NlbGxyYW5nZWxpc3QnIC8qY2FzZSAnQ2VsbFJhbmdlTGlzdCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaW5wdXRtZXNzYWdlJyAvKmNhc2UgJ0lucHV0TWVzc2FnZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaW5wdXR0aXRsZScgLypjYXNlICdJbnB1dFRpdGxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb21ib2hpZGUnIC8qY2FzZSAnQ29tYm9IaWRlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdpbnB1dGhpZGUnIC8qY2FzZSAnSW5wdXRIaWRlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb25kaXRpb24nIC8qY2FzZSAnQ29uZGl0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdxdWFsaWZpZXInIC8qY2FzZSAnUXVhbGlmaWVyJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd1c2VibGFuaycgLypjYXNlICdVc2VCbGFuaycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmFsdWUxJyAvKmNhc2UgJ1ZhbHVlMScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmFsdWUyJyAvKmNhc2UgJ1ZhbHVlMicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZm9ybWF0JyAvKmNhc2UgJ0Zvcm1hdCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIE1hcEluZm8gKHNjaGVtYSkgKi9cblx0XHRcdFx0Y2FzZSAnbWFwaW5mbycgLypjYXNlICdNYXBJbmZvJyovOiBjYXNlICdzY2hlbWEnIC8qY2FzZSAnU2NoZW1hJyovOiBjYXNlICdkYXRhJyAvKmNhc2UgJ2RhdGEnKi86IHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ21hcCcgLypjYXNlICdNYXAnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2VudHJ5JyAvKmNhc2UgJ0VudHJ5JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyYW5nZScgLypjYXNlICdSYW5nZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAneHBhdGgnIC8qY2FzZSAnWFBhdGgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZpZWxkJyAvKmNhc2UgJ0ZpZWxkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd4c2R0eXBlJyAvKmNhc2UgJ1hTRFR5cGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZpbHRlcm9uJyAvKmNhc2UgJ0ZpbHRlck9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhZ2dyZWdhdGUnIC8qY2FzZSAnQWdncmVnYXRlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlbGVtZW50dHlwZScgLypjYXNlICdFbGVtZW50VHlwZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYXR0cmlidXRldHlwZScgLypjYXNlICdBdHRyaWJ1dGVUeXBlJyovOiBicmVhaztcblx0XHRcdFx0LyogVGhlc2UgYXJlIGZyb20geHNkIChYTUwgU2NoZW1hIERlZmluaXRpb24pICovXG5cdFx0XHRcdFx0Y2FzZSAnc2NoZW1hJyAvKmNhc2UgJ3NjaGVtYScqLzpcblx0XHRcdFx0XHRjYXNlICdlbGVtZW50JyAvKmNhc2UgJ2VsZW1lbnQnKi86XG5cdFx0XHRcdFx0Y2FzZSAnY29tcGxleHR5cGUnIC8qY2FzZSAnY29tcGxleFR5cGUnKi86XG5cdFx0XHRcdFx0Y2FzZSAnZGF0YXR5cGUnIC8qY2FzZSAnZGF0YXR5cGUnKi86XG5cdFx0XHRcdFx0Y2FzZSAnYWxsJyAvKmNhc2UgJ2FsbCcqLzpcblx0XHRcdFx0XHRjYXNlICdhdHRyaWJ1dGUnIC8qY2FzZSAnYXR0cmlidXRlJyovOlxuXHRcdFx0XHRcdGNhc2UgJ2V4dGVuZHMnIC8qY2FzZSAnZXh0ZW5kcycqLzogYnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdyb3cnIC8qY2FzZSAncm93JyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0LyogU21hcnRUYWdzIChjYW4gYmUgYW55dGhpbmcpICovXG5cdFx0XHRcdGNhc2UgJ3NtYXJ0dGFncycgLypjYXNlICdTbWFydFRhZ3MnKi86IGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IHNlZW4gPSBmYWxzZTsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZihzZWVuKSBicmVhaztcblx0XHRcdC8qIEN1c3RvbURvY3VtZW50UHJvcGVydGllcyAqL1xuXHRcdFx0aWYoUm5bM10ubWF0Y2goLyFcXFtDREFUQS8pKSBicmVhaztcblx0XHRcdGlmKCFzdGF0ZVtzdGF0ZS5sZW5ndGgtMV1bMV0pIHRocm93ICdVbnJlY29nbml6ZWQgdGFnOiAnICsgUm5bM10gKyBcInxcIiArIHN0YXRlLmpvaW4oXCJ8XCIpO1xuXHRcdFx0aWYoc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdPT09LyonQ3VzdG9tRG9jdW1lbnRQcm9wZXJ0aWVzJyovJ2N1c3RvbWRvY3VtZW50cHJvcGVydGllcycpIHtcblx0XHRcdFx0aWYoUm5bMF0uc2xpY2UoLTIpID09PSBcIi8+XCIpIGJyZWFrO1xuXHRcdFx0XHRlbHNlIGlmKFJuWzFdPT09XCIvXCIpIHhsbWxfc2V0X2N1c3Rwcm9wKEN1c3Rwcm9wcywgcmF3X1JuMywgY3AsIHN0ci5zbGljZShwaWR4LCBSbi5pbmRleCkpO1xuXHRcdFx0XHRlbHNlIHsgY3AgPSBSbjsgcGlkeCA9IFJuLmluZGV4ICsgUm5bMF0ubGVuZ3RoOyB9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYob3B0cy5XVEYpIHRocm93ICdVbnJlY29nbml6ZWQgdGFnOiAnICsgUm5bM10gKyBcInxcIiArIHN0YXRlLmpvaW4oXCJ8XCIpO1xuXHR9XG5cdHZhciBvdXQgPSAoe30vKjphbnkqLyk7XG5cdGlmKCFvcHRzLmJvb2tTaGVldHMgJiYgIW9wdHMuYm9va1Byb3BzKSBvdXQuU2hlZXRzID0gc2hlZXRzO1xuXHRvdXQuU2hlZXROYW1lcyA9IHNoZWV0bmFtZXM7XG5cdG91dC5Xb3JrYm9vayA9IFdvcmtib29rO1xuXHRvdXQuU1NGID0gZHVwKHRhYmxlX2ZtdCk7XG5cdG91dC5Qcm9wcyA9IFByb3BzO1xuXHRvdXQuQ3VzdHByb3BzID0gQ3VzdHByb3BzO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwYXJzZV94bG1sKGRhdGEvKjpSYXdCeXRlc3xzdHJpbmcqLywgb3B0cykvKjpXb3JrYm9vayovIHtcblx0Zml4X3JlYWRfb3B0cyhvcHRzPW9wdHN8fHt9KTtcblx0c3dpdGNoKG9wdHMudHlwZXx8XCJiYXNlNjRcIikge1xuXHRcdGNhc2UgXCJiYXNlNjRcIjogcmV0dXJuIHBhcnNlX3hsbWxfeG1sKEJhc2U2NF9kZWNvZGUoZGF0YSksIG9wdHMpO1xuXHRcdGNhc2UgXCJiaW5hcnlcIjogY2FzZSBcImJ1ZmZlclwiOiBjYXNlIFwiZmlsZVwiOiByZXR1cm4gcGFyc2VfeGxtbF94bWwoZGF0YSwgb3B0cyk7XG5cdFx0Y2FzZSBcImFycmF5XCI6IHJldHVybiBwYXJzZV94bG1sX3htbChhMnMoZGF0YSksIG9wdHMpO1xuXHR9XG5cdC8qOjogdGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgdHlwZSBcIiArIG9wdHMudHlwZSk7ICovXG59XG5cbi8qIFRPRE8gKi9cbmZ1bmN0aW9uIHdyaXRlX3Byb3BzX3hsbWwod2IvKjpXb3JrYm9vayovLCBvcHRzKS8qOnN0cmluZyovIHtcblx0dmFyIG8vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0LyogRG9jdW1lbnRQcm9wZXJ0aWVzICovXG5cdGlmKHdiLlByb3BzKSBvLnB1c2goeGxtbF93cml0ZV9kb2Nwcm9wcyh3Yi5Qcm9wcywgb3B0cykpO1xuXHQvKiBDdXN0b21Eb2N1bWVudFByb3BlcnRpZXMgKi9cblx0aWYod2IuQ3VzdHByb3BzKSBvLnB1c2goeGxtbF93cml0ZV9jdXN0cHJvcHMod2IuUHJvcHMsIHdiLkN1c3Rwcm9wcywgb3B0cykpO1xuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogVE9ETyAqL1xuZnVuY3Rpb24gd3JpdGVfd2JfeGxtbCgvKjo6d2IsIG9wdHMqLykvKjpzdHJpbmcqLyB7XG5cdC8qIE9mZmljZURvY3VtZW50U2V0dGluZ3MgKi9cblx0LyogRXhjZWxXb3JrYm9vayAqL1xuXHRyZXR1cm4gXCJcIjtcbn1cbi8qIFRPRE8gKi9cbmZ1bmN0aW9uIHdyaXRlX3N0eV94bG1sKHdiLCBvcHRzKS8qOnN0cmluZyovIHtcblx0LyogU3R5bGVzICovXG5cdHZhciBzdHlsZXMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbJzxTdHlsZSBzczpJRD1cIkRlZmF1bHRcIiBzczpOYW1lPVwiTm9ybWFsXCI+PE51bWJlckZvcm1hdC8+PC9TdHlsZT4nXTtcblx0b3B0cy5jZWxsWGZzLmZvckVhY2goZnVuY3Rpb24oeGYsIGlkKSB7XG5cdFx0dmFyIHBheWxvYWQvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0XHRwYXlsb2FkLnB1c2god3JpdGV4dGFnKCdOdW1iZXJGb3JtYXQnLCBudWxsLCB7XCJzczpGb3JtYXRcIjogZXNjYXBleG1sKHRhYmxlX2ZtdFt4Zi5udW1GbXRJZF0pfSkpO1xuXG5cdFx0dmFyIG8gPSAvKjo6KCove1wic3M6SURcIjogXCJzXCIgKyAoMjEraWQpfS8qOjogOmFueSkqLztcblx0XHRzdHlsZXMucHVzaCh3cml0ZXh0YWcoJ1N0eWxlJywgcGF5bG9hZC5qb2luKFwiXCIpLCBvKSk7XG5cdH0pO1xuXHRyZXR1cm4gd3JpdGV4dGFnKFwiU3R5bGVzXCIsIHN0eWxlcy5qb2luKFwiXCIpKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX25hbWVfeGxtbChuKSB7IHJldHVybiB3cml0ZXh0YWcoXCJOYW1lZFJhbmdlXCIsIG51bGwsIHtcInNzOk5hbWVcIjogbi5OYW1lLCBcInNzOlJlZmVyc1RvXCI6XCI9XCIgKyBhMV90b19yYyhuLlJlZiwge3I6MCxjOjB9KX0pOyB9XG5mdW5jdGlvbiB3cml0ZV9uYW1lc194bG1sKHdiLyo6Oiwgb3B0cyovKS8qOnN0cmluZyovIHtcblx0aWYoISgod2J8fHt9KS5Xb3JrYm9va3x8e30pLk5hbWVzKSByZXR1cm4gXCJcIjtcblx0Lyo6OiBpZighd2IgfHwgIXdiLldvcmtib29rIHx8ICF3Yi5Xb3JrYm9vay5OYW1lcykgdGhyb3cgbmV3IEVycm9yKFwidW5yZWFjaGFibGVcIik7ICovXG5cdHZhciBuYW1lcy8qOkFycmF5PGFueT4qLyA9IHdiLldvcmtib29rLk5hbWVzO1xuXHR2YXIgb3V0Lyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBuID0gbmFtZXNbaV07XG5cdFx0aWYobi5TaGVldCAhPSBudWxsKSBjb250aW51ZTtcblx0XHRpZihuLk5hbWUubWF0Y2goL15feGxmblxcLi8pKSBjb250aW51ZTtcblx0XHRvdXQucHVzaCh3cml0ZV9uYW1lX3hsbWwobikpO1xuXHR9XG5cdHJldHVybiB3cml0ZXh0YWcoXCJOYW1lc1wiLCBvdXQuam9pbihcIlwiKSk7XG59XG5mdW5jdGlvbiB3cml0ZV93c194bG1sX25hbWVzKHdzLyo6V29ya3NoZWV0Ki8sIG9wdHMsIGlkeC8qOm51bWJlciovLCB3Yi8qOldvcmtib29rKi8pLyo6c3RyaW5nKi8ge1xuXHRpZighd3MpIHJldHVybiBcIlwiO1xuXHRpZighKCh3Ynx8e30pLldvcmtib29rfHx7fSkuTmFtZXMpIHJldHVybiBcIlwiO1xuXHQvKjo6IGlmKCF3YiB8fCAhd2IuV29ya2Jvb2sgfHwgIXdiLldvcmtib29rLk5hbWVzKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTsgKi9cblx0dmFyIG5hbWVzLyo6QXJyYXk8YW55PiovID0gd2IuV29ya2Jvb2suTmFtZXM7XG5cdHZhciBvdXQvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIG4gPSBuYW1lc1tpXTtcblx0XHRpZihuLlNoZWV0ICE9IGlkeCkgY29udGludWU7XG5cdFx0Lypzd2l0Y2gobi5OYW1lKSB7XG5cdFx0XHRjYXNlIFwiX1wiOiBjb250aW51ZTtcblx0XHR9Ki9cblx0XHRpZihuLk5hbWUubWF0Y2goL15feGxmblxcLi8pKSBjb250aW51ZTtcblx0XHRvdXQucHVzaCh3cml0ZV9uYW1lX3hsbWwobikpO1xuXHR9XG5cdHJldHVybiBvdXQuam9pbihcIlwiKTtcbn1cbi8qIFdvcmtzaGVldE9wdGlvbnMgKi9cbmZ1bmN0aW9uIHdyaXRlX3dzX3hsbWxfd3NvcHRzKHdzLyo6V29ya3NoZWV0Ki8sIG9wdHMsIGlkeC8qOm51bWJlciovLCB3Yi8qOldvcmtib29rKi8pLyo6c3RyaW5nKi8ge1xuXHRpZighd3MpIHJldHVybiBcIlwiO1xuXHR2YXIgby8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHQvKiBOT1RFOiBzcGVjIHRlY2huaWNhbGx5IGFsbG93cyBhbnkgb3JkZXIsIGJ1dCBzdGljayB3aXRoIGltcGxpZWQgb3JkZXIgKi9cblxuXHQvKiBGaXRUb1BhZ2UgKi9cblx0LyogRG9Ob3REaXNwbGF5Q29sSGVhZGVycyAqL1xuXHQvKiBEb05vdERpc3BsYXlSb3dIZWFkZXJzICovXG5cdC8qIFZpZXdhYmxlUmFuZ2UgKi9cblx0LyogU2VsZWN0aW9uICovXG5cdC8qIEdyaWRsaW5lQ29sb3IgKi9cblx0LyogTmFtZSAqL1xuXHQvKiBFeGNlbFdvcmtzaGVldFR5cGUgKi9cblx0LyogSW50bE1hY3JvICovXG5cdC8qIFVuc3luY2VkICovXG5cdC8qIFNlbGVjdGVkICovXG5cdC8qIENvZGVOYW1lICovXG5cblx0aWYod3NbJyFtYXJnaW5zJ10pIHtcblx0XHRvLnB1c2goXCI8UGFnZVNldHVwPlwiKTtcblx0XHRpZih3c1snIW1hcmdpbnMnXS5oZWFkZXIpIG8ucHVzaCh3cml0ZXh0YWcoXCJIZWFkZXJcIiwgbnVsbCwgeyd4Ok1hcmdpbic6d3NbJyFtYXJnaW5zJ10uaGVhZGVyfSkpO1xuXHRcdGlmKHdzWychbWFyZ2lucyddLmZvb3Rlcikgby5wdXNoKHdyaXRleHRhZyhcIkZvb3RlclwiLCBudWxsLCB7J3g6TWFyZ2luJzp3c1snIW1hcmdpbnMnXS5mb290ZXJ9KSk7XG5cdFx0by5wdXNoKHdyaXRleHRhZyhcIlBhZ2VNYXJnaW5zXCIsIG51bGwsIHtcblx0XHRcdCd4OkJvdHRvbSc6IHdzWychbWFyZ2lucyddLmJvdHRvbSB8fCBcIjAuNzVcIixcblx0XHRcdCd4OkxlZnQnOiB3c1snIW1hcmdpbnMnXS5sZWZ0IHx8IFwiMC43XCIsXG5cdFx0XHQneDpSaWdodCc6IHdzWychbWFyZ2lucyddLnJpZ2h0IHx8IFwiMC43XCIsXG5cdFx0XHQneDpUb3AnOiB3c1snIW1hcmdpbnMnXS50b3AgfHwgXCIwLjc1XCJcblx0XHR9KSk7XG5cdFx0by5wdXNoKFwiPC9QYWdlU2V0dXA+XCIpO1xuXHR9XG5cblx0LyogUGFnZVNldHVwICovXG5cdC8qIERpc3BsYXlQYWdlQnJlYWsgKi9cblx0LyogVHJhbnNpdGlvbkV4cHJlc3Npb25FdmFsdWF0aW9uICovXG5cdC8qIFRyYW5zaXRpb25Gb3JtdWxhRW50cnkgKi9cblx0LyogUHJpbnQgKi9cblx0LyogWm9vbSAqL1xuXHQvKiBQYWdlTGF5b3V0Wm9vbSAqL1xuXHQvKiBQYWdlQnJlYWtab29tICovXG5cdC8qIFNob3dQYWdlQnJlYWtab29tICovXG5cdC8qIERlZmF1bHRSb3dIZWlnaHQgKi9cblx0LyogRGVmYXVsdENvbHVtbldpZHRoICovXG5cdC8qIFN0YW5kYXJkV2lkdGggKi9cblxuXHRpZih3YiAmJiB3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5TaGVldHMgJiYgd2IuV29ya2Jvb2suU2hlZXRzW2lkeF0pIHtcblx0XHQvKiBWaXNpYmxlICovXG5cdFx0aWYod2IuV29ya2Jvb2suU2hlZXRzW2lkeF0uSGlkZGVuKSBvLnB1c2god3JpdGV4dGFnKFwiVmlzaWJsZVwiLCAod2IuV29ya2Jvb2suU2hlZXRzW2lkeF0uSGlkZGVuID09IDEgPyBcIlNoZWV0SGlkZGVuXCIgOiBcIlNoZWV0VmVyeUhpZGRlblwiKSwge30pKTtcblx0XHRlbHNlIHtcblx0XHRcdC8qIFNlbGVjdGVkICovXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgaWR4OyArK2kpIGlmKHdiLldvcmtib29rLlNoZWV0c1tpXSAmJiAhd2IuV29ya2Jvb2suU2hlZXRzW2ldLkhpZGRlbikgYnJlYWs7XG5cdFx0XHRpZihpID09IGlkeCkgby5wdXNoKFwiPFNlbGVjdGVkLz5cIik7XG5cdFx0fVxuXHR9XG5cblx0LyogTGVmdENvbHVtblZpc2libGUgKi9cblxuXHRpZigoKCgod2J8fHt9KS5Xb3JrYm9va3x8e30pLlZpZXdzfHxbXSlbMF18fHt9KS5SVEwpIG8ucHVzaChcIjxEaXNwbGF5UmlnaHRUb0xlZnQvPlwiKTtcblxuXHQvKiBHcmlkbGluZUNvbG9ySW5kZXggKi9cblx0LyogRGlzcGxheUZvcm11bGFzICovXG5cdC8qIERvTm90RGlzcGxheUdyaWRsaW5lcyAqL1xuXHQvKiBEb05vdERpc3BsYXlIZWFkaW5ncyAqL1xuXHQvKiBEb05vdERpc3BsYXlPdXRsaW5lICovXG5cdC8qIEFwcGx5QXV0b21hdGljT3V0bGluZVN0eWxlcyAqL1xuXHQvKiBOb1N1bW1hcnlSb3dzQmVsb3dEZXRhaWwgKi9cblx0LyogTm9TdW1tYXJ5Q29sdW1uc1JpZ2h0RGV0YWlsICovXG5cdC8qIERvTm90RGlzcGxheVplcm9zICovXG5cdC8qIEFjdGl2ZVJvdyAqL1xuXHQvKiBBY3RpdmVDb2x1bW4gKi9cblx0LyogRmlsdGVyT24gKi9cblx0LyogUmFuZ2VTZWxlY3Rpb24gKi9cblx0LyogVG9wUm93VmlzaWJsZSAqL1xuXHQvKiBUb3BSb3dCb3R0b21QYW5lICovXG5cdC8qIExlZnRDb2x1bW5SaWdodFBhbmUgKi9cblx0LyogQWN0aXZlUGFuZSAqL1xuXHQvKiBTcGxpdEhvcml6b250YWwgKi9cblx0LyogU3BsaXRWZXJ0aWNhbCAqL1xuXHQvKiBGcmVlemVQYW5lcyAqL1xuXHQvKiBGcm96ZW5Ob1NwbGl0ICovXG5cdC8qIFRhYkNvbG9ySW5kZXggKi9cblx0LyogUGFuZXMgKi9cblxuXHQvKiBOT1RFOiBQYXNzd29yZCBub3Qgc3VwcG9ydGVkIGluIFhMTUwgRm9ybWF0ICovXG5cdGlmKHdzWychcHJvdGVjdCddKSB7XG5cdFx0by5wdXNoKHdyaXRldGFnKFwiUHJvdGVjdENvbnRlbnRzXCIsIFwiVHJ1ZVwiKSk7XG5cdFx0aWYod3NbJyFwcm90ZWN0J10ub2JqZWN0cykgby5wdXNoKHdyaXRldGFnKFwiUHJvdGVjdE9iamVjdHNcIiwgXCJUcnVlXCIpKTtcblx0XHRpZih3c1snIXByb3RlY3QnXS5zY2VuYXJpb3MpIG8ucHVzaCh3cml0ZXRhZyhcIlByb3RlY3RTY2VuYXJpb3NcIiwgXCJUcnVlXCIpKTtcblx0XHRpZih3c1snIXByb3RlY3QnXS5zZWxlY3RMb2NrZWRDZWxscyAhPSBudWxsICYmICF3c1snIXByb3RlY3QnXS5zZWxlY3RMb2NrZWRDZWxscykgby5wdXNoKHdyaXRldGFnKFwiRW5hYmxlU2VsZWN0aW9uXCIsIFwiTm9TZWxlY3Rpb25cIikpO1xuXHRcdGVsc2UgaWYod3NbJyFwcm90ZWN0J10uc2VsZWN0VW5sb2NrZWRDZWxscyAhPSBudWxsICYmICF3c1snIXByb3RlY3QnXS5zZWxlY3RVbmxvY2tlZENlbGxzKSBvLnB1c2god3JpdGV0YWcoXCJFbmFibGVTZWxlY3Rpb25cIiwgXCJVbmxvY2tlZENlbGxzXCIpKTtcblx0W1xuXHRcdFsgXCJmb3JtYXRDZWxsc1wiLCBcIkFsbG93Rm9ybWF0Q2VsbHNcIiBdLFxuXHRcdFsgXCJmb3JtYXRDb2x1bW5zXCIsIFwiQWxsb3dTaXplQ29sc1wiIF0sXG5cdFx0WyBcImZvcm1hdFJvd3NcIiwgXCJBbGxvd1NpemVSb3dzXCIgXSxcblx0XHRbIFwiaW5zZXJ0Q29sdW1uc1wiLCBcIkFsbG93SW5zZXJ0Q29sc1wiIF0sXG5cdFx0WyBcImluc2VydFJvd3NcIiwgXCJBbGxvd0luc2VydFJvd3NcIiBdLFxuXHRcdFsgXCJpbnNlcnRIeXBlcmxpbmtzXCIsIFwiQWxsb3dJbnNlcnRIeXBlcmxpbmtzXCIgXSxcblx0XHRbIFwiZGVsZXRlQ29sdW1uc1wiLCBcIkFsbG93RGVsZXRlQ29sc1wiIF0sXG5cdFx0WyBcImRlbGV0ZVJvd3NcIiwgXCJBbGxvd0RlbGV0ZVJvd3NcIiBdLFxuXHRcdFsgXCJzb3J0XCIsIFwiQWxsb3dTb3J0XCIgXSxcblx0XHRbIFwiYXV0b0ZpbHRlclwiLCBcIkFsbG93RmlsdGVyXCIgXSxcblx0XHRbIFwicGl2b3RUYWJsZXNcIiwgXCJBbGxvd1VzZVBpdm90VGFibGVzXCIgXVxuXHRdLmZvckVhY2goZnVuY3Rpb24oeCkgeyBpZih3c1snIXByb3RlY3QnXVt4WzBdXSkgby5wdXNoKFwiPFwiK3hbMV0rXCIvPlwiKTsgfSk7XG5cdH1cblxuXHRpZihvLmxlbmd0aCA9PSAwKSByZXR1cm4gXCJcIjtcblx0cmV0dXJuIHdyaXRleHRhZyhcIldvcmtzaGVldE9wdGlvbnNcIiwgby5qb2luKFwiXCIpLCB7eG1sbnM6WExNTE5TLnh9KTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3hsbWxfY29tbWVudChjb21tZW50cy8qOkFycmF5PGFueT4qLykvKjpzdHJpbmcqLyB7XG5cdHJldHVybiBjb21tZW50cy5tYXAoZnVuY3Rpb24oYykge1xuXHRcdC8vIFRPRE86IGZvcm1hdHRlZCB0ZXh0XG5cdFx0dmFyIHQgPSB4bG1sX3VuZml4c3RyKGMudHx8XCJcIik7XG5cdFx0dmFyIGQgPXdyaXRleHRhZyhcInNzOkRhdGFcIiwgdCwge1wieG1sbnNcIjpcImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDBcIn0pO1xuXHRcdHJldHVybiB3cml0ZXh0YWcoXCJDb21tZW50XCIsIGQsIHtcInNzOkF1dGhvclwiOmMuYX0pO1xuXHR9KS5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gd3JpdGVfd3NfeGxtbF9jZWxsKGNlbGwsIHJlZi8qOnN0cmluZyovLCB3cywgb3B0cywgaWR4Lyo6bnVtYmVyKi8sIHdiLCBhZGRyKS8qOnN0cmluZyove1xuXHRpZighY2VsbCB8fCAoY2VsbC52ID09IHVuZGVmaW5lZCAmJiBjZWxsLmYgPT0gdW5kZWZpbmVkKSkgcmV0dXJuIFwiXCI7XG5cblx0dmFyIGF0dHIgPSB7fTtcblx0aWYoY2VsbC5mKSBhdHRyW1wic3M6Rm9ybXVsYVwiXSA9IFwiPVwiICsgZXNjYXBleG1sKGExX3RvX3JjKGNlbGwuZiwgYWRkcikpO1xuXHRpZihjZWxsLkYgJiYgY2VsbC5GLnNsaWNlKDAsIHJlZi5sZW5ndGgpID09IHJlZikge1xuXHRcdHZhciBlbmQgPSBkZWNvZGVfY2VsbChjZWxsLkYuc2xpY2UocmVmLmxlbmd0aCArIDEpKTtcblx0XHRhdHRyW1wic3M6QXJyYXlSYW5nZVwiXSA9IFwiUkM6UlwiICsgKGVuZC5yID09IGFkZHIuciA/IFwiXCIgOiBcIltcIiArIChlbmQuciAtIGFkZHIucikgKyBcIl1cIikgKyBcIkNcIiArIChlbmQuYyA9PSBhZGRyLmMgPyBcIlwiIDogXCJbXCIgKyAoZW5kLmMgLSBhZGRyLmMpICsgXCJdXCIpO1xuXHR9XG5cblx0aWYoY2VsbC5sICYmIGNlbGwubC5UYXJnZXQpIHtcblx0XHRhdHRyW1wic3M6SFJlZlwiXSA9IGVzY2FwZXhtbChjZWxsLmwuVGFyZ2V0KTtcblx0XHRpZihjZWxsLmwuVG9vbHRpcCkgYXR0cltcIng6SFJlZlNjcmVlblRpcFwiXSA9IGVzY2FwZXhtbChjZWxsLmwuVG9vbHRpcCk7XG5cdH1cblxuXHRpZih3c1snIW1lcmdlcyddKSB7XG5cdFx0dmFyIG1hcnIgPSB3c1snIW1lcmdlcyddO1xuXHRcdGZvcih2YXIgbWkgPSAwOyBtaSAhPSBtYXJyLmxlbmd0aDsgKyttaSkge1xuXHRcdFx0aWYobWFyclttaV0ucy5jICE9IGFkZHIuYyB8fCBtYXJyW21pXS5zLnIgIT0gYWRkci5yKSBjb250aW51ZTtcblx0XHRcdGlmKG1hcnJbbWldLmUuYyA+IG1hcnJbbWldLnMuYykgYXR0clsnc3M6TWVyZ2VBY3Jvc3MnXSA9IG1hcnJbbWldLmUuYyAtIG1hcnJbbWldLnMuYztcblx0XHRcdGlmKG1hcnJbbWldLmUuciA+IG1hcnJbbWldLnMucikgYXR0clsnc3M6TWVyZ2VEb3duJ10gPSBtYXJyW21pXS5lLnIgLSBtYXJyW21pXS5zLnI7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHQgPSBcIlwiLCBwID0gXCJcIjtcblx0c3dpdGNoKGNlbGwudCkge1xuXHRcdGNhc2UgJ3onOiBpZighb3B0cy5zaGVldFN0dWJzKSByZXR1cm4gXCJcIjsgYnJlYWs7XG5cdFx0Y2FzZSAnbic6IHQgPSAnTnVtYmVyJzsgcCA9IFN0cmluZyhjZWxsLnYpOyBicmVhaztcblx0XHRjYXNlICdiJzogdCA9ICdCb29sZWFuJzsgcCA9IChjZWxsLnYgPyBcIjFcIiA6IFwiMFwiKTsgYnJlYWs7XG5cdFx0Y2FzZSAnZSc6IHQgPSAnRXJyb3InOyBwID0gQkVycltjZWxsLnZdOyBicmVhaztcblx0XHRjYXNlICdkJzogdCA9ICdEYXRlVGltZSc7IHAgPSBuZXcgRGF0ZShjZWxsLnYpLnRvSVNPU3RyaW5nKCk7IGlmKGNlbGwueiA9PSBudWxsKSBjZWxsLnogPSBjZWxsLnogfHwgdGFibGVfZm10WzE0XTsgYnJlYWs7XG5cdFx0Y2FzZSAncyc6IHQgPSAnU3RyaW5nJzsgcCA9IGVzY2FwZXhsbWwoY2VsbC52fHxcIlwiKTsgYnJlYWs7XG5cdH1cblx0LyogVE9ETzogY2VsbCBzdHlsZSAqL1xuXHR2YXIgb3MgPSBnZXRfY2VsbF9zdHlsZShvcHRzLmNlbGxYZnMsIGNlbGwsIG9wdHMpO1xuXHRhdHRyW1wic3M6U3R5bGVJRFwiXSA9IFwic1wiICsgKDIxK29zKTtcblx0YXR0cltcInNzOkluZGV4XCJdID0gYWRkci5jICsgMTtcblx0dmFyIF92ID0gKGNlbGwudiAhPSBudWxsID8gcCA6IFwiXCIpO1xuXHR2YXIgbSA9IGNlbGwudCA9PSAneicgPyBcIlwiIDogKCc8RGF0YSBzczpUeXBlPVwiJyArIHQgKyAnXCI+JyArIF92ICsgJzwvRGF0YT4nKTtcblxuXHRpZigoY2VsbC5jfHxbXSkubGVuZ3RoID4gMCkgbSArPSB3cml0ZV93c194bG1sX2NvbW1lbnQoY2VsbC5jKTtcblxuXHRyZXR1cm4gd3JpdGV4dGFnKFwiQ2VsbFwiLCBtLCBhdHRyKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3hsbWxfcm93KFIvKjpudW1iZXIqLywgcm93KS8qOnN0cmluZyovIHtcblx0dmFyIG8gPSAnPFJvdyBzczpJbmRleD1cIicgKyAoUisxKSArICdcIic7XG5cdGlmKHJvdykge1xuXHRcdGlmKHJvdy5ocHQgJiYgIXJvdy5ocHgpIHJvdy5ocHggPSBwdDJweChyb3cuaHB0KTtcblx0XHRpZihyb3cuaHB4KSBvICs9ICcgc3M6QXV0b0ZpdEhlaWdodD1cIjBcIiBzczpIZWlnaHQ9XCInICsgcm93LmhweCArICdcIic7XG5cdFx0aWYocm93LmhpZGRlbikgbyArPSAnIHNzOkhpZGRlbj1cIjFcIic7XG5cdH1cblx0cmV0dXJuIG8gKyAnPic7XG59XG4vKiBUT0RPICovXG5mdW5jdGlvbiB3cml0ZV93c194bG1sX3RhYmxlKHdzLyo6V29ya3NoZWV0Ki8sIG9wdHMsIGlkeC8qOm51bWJlciovLCB3Yi8qOldvcmtib29rKi8pLyo6c3RyaW5nKi8ge1xuXHRpZighd3NbJyFyZWYnXSkgcmV0dXJuIFwiXCI7XG5cdHZhciByYW5nZS8qOlJhbmdlKi8gPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0dmFyIG1hcnIvKjpBcnJheTxSYW5nZT4qLyA9IHdzWychbWVyZ2VzJ10gfHwgW10sIG1pID0gMDtcblx0dmFyIG8vKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0aWYod3NbJyFjb2xzJ10pIHdzWychY29scyddLmZvckVhY2goZnVuY3Rpb24obiwgaSkge1xuXHRcdHByb2Nlc3NfY29sKG4pO1xuXHRcdHZhciB3ID0gISFuLndpZHRoO1xuXHRcdHZhciBwID0gY29sX29ial93KGksIG4pO1xuXHRcdHZhciBrLyo6YW55Ki8gPSB7XCJzczpJbmRleFwiOmkrMX07XG5cdFx0aWYodykga1snc3M6V2lkdGgnXSA9IHdpZHRoMnB4KHAud2lkdGgpO1xuXHRcdGlmKG4uaGlkZGVuKSBrWydzczpIaWRkZW4nXT1cIjFcIjtcblx0XHRvLnB1c2god3JpdGV4dGFnKFwiQ29sdW1uXCIsbnVsbCxrKSk7XG5cdH0pO1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0Zm9yKHZhciBSID0gcmFuZ2Uucy5yOyBSIDw9IHJhbmdlLmUucjsgKytSKSB7XG5cdFx0dmFyIHJvdyA9IFt3cml0ZV93c194bG1sX3JvdyhSLCAod3NbJyFyb3dzJ118fFtdKVtSXSldO1xuXHRcdGZvcih2YXIgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xuXHRcdFx0dmFyIHNraXAgPSBmYWxzZTtcblx0XHRcdGZvcihtaSA9IDA7IG1pICE9IG1hcnIubGVuZ3RoOyArK21pKSB7XG5cdFx0XHRcdGlmKG1hcnJbbWldLnMuYyA+IEMpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZihtYXJyW21pXS5zLnIgPiBSKSBjb250aW51ZTtcblx0XHRcdFx0aWYobWFyclttaV0uZS5jIDwgQykgY29udGludWU7XG5cdFx0XHRcdGlmKG1hcnJbbWldLmUuciA8IFIpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZihtYXJyW21pXS5zLmMgIT0gQyB8fCBtYXJyW21pXS5zLnIgIT0gUikgc2tpcCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYoc2tpcCkgY29udGludWU7XG5cdFx0XHR2YXIgYWRkciA9IHtyOlIsYzpDfTtcblx0XHRcdHZhciByZWYgPSBlbmNvZGVfY2VsbChhZGRyKSwgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tyZWZdO1xuXHRcdFx0cm93LnB1c2god3JpdGVfd3NfeGxtbF9jZWxsKGNlbGwsIHJlZiwgd3MsIG9wdHMsIGlkeCwgd2IsIGFkZHIpKTtcblx0XHR9XG5cdFx0cm93LnB1c2goXCI8L1Jvdz5cIik7XG5cdFx0aWYocm93Lmxlbmd0aCA+IDIpIG8ucHVzaChyb3cuam9pbihcIlwiKSk7XG5cdH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3hsbWwoaWR4Lyo6bnVtYmVyKi8sIG9wdHMsIHdiLyo6V29ya2Jvb2sqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdHZhciBzID0gd2IuU2hlZXROYW1lc1tpZHhdO1xuXHR2YXIgd3MgPSB3Yi5TaGVldHNbc107XG5cblx0dmFyIHQvKjpzdHJpbmcqLyA9IHdzID8gd3JpdGVfd3NfeGxtbF9uYW1lcyh3cywgb3B0cywgaWR4LCB3YikgOiBcIlwiO1xuXHRpZih0Lmxlbmd0aCA+IDApIG8ucHVzaChcIjxOYW1lcz5cIiArIHQgKyBcIjwvTmFtZXM+XCIpO1xuXG5cdC8qIFRhYmxlICovXG5cdHQgPSB3cyA/IHdyaXRlX3dzX3hsbWxfdGFibGUod3MsIG9wdHMsIGlkeCwgd2IpIDogXCJcIjtcblx0aWYodC5sZW5ndGggPiAwKSBvLnB1c2goXCI8VGFibGU+XCIgKyB0ICsgXCI8L1RhYmxlPlwiKTtcblxuXHQvKiBXb3Jrc2hlZXRPcHRpb25zICovXG5cdG8ucHVzaCh3cml0ZV93c194bG1sX3dzb3B0cyh3cywgb3B0cywgaWR4LCB3YikpO1xuXG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiB3cml0ZV94bG1sKHdiLCBvcHRzKS8qOnN0cmluZyovIHtcblx0aWYoIW9wdHMpIG9wdHMgPSB7fTtcblx0aWYoIXdiLlNTRikgd2IuU1NGID0gZHVwKHRhYmxlX2ZtdCk7XG5cdGlmKHdiLlNTRikge1xuXHRcdG1ha2Vfc3NmKCk7IFNTRl9sb2FkX3RhYmxlKHdiLlNTRik7XG5cdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRvcHRzLnJldnNzZiA9IGV2ZXJ0X251bSh3Yi5TU0YpOyBvcHRzLnJldnNzZlt3Yi5TU0ZbNjU1MzVdXSA9IDA7XG5cdFx0b3B0cy5zc2YgPSB3Yi5TU0Y7XG5cdFx0b3B0cy5jZWxsWGZzID0gW107XG5cdFx0Z2V0X2NlbGxfc3R5bGUob3B0cy5jZWxsWGZzLCB7fSwge3JldnNzZjp7XCJHZW5lcmFsXCI6MH19KTtcblx0fVxuXHR2YXIgZC8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHRkLnB1c2god3JpdGVfcHJvcHNfeGxtbCh3Yiwgb3B0cykpO1xuXHRkLnB1c2god3JpdGVfd2JfeGxtbCh3Yiwgb3B0cykpO1xuXHRkLnB1c2goXCJcIik7XG5cdGQucHVzaChcIlwiKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK2kpXG5cdFx0ZC5wdXNoKHdyaXRleHRhZyhcIldvcmtzaGVldFwiLCB3cml0ZV93c194bG1sKGksIG9wdHMsIHdiKSwge1wic3M6TmFtZVwiOmVzY2FwZXhtbCh3Yi5TaGVldE5hbWVzW2ldKX0pKTtcblx0ZFsyXSA9IHdyaXRlX3N0eV94bG1sKHdiLCBvcHRzKTtcblx0ZFszXSA9IHdyaXRlX25hbWVzX3hsbWwod2IsIG9wdHMpO1xuXHRyZXR1cm4gWE1MX0hFQURFUiArIHdyaXRleHRhZyhcIldvcmtib29rXCIsIGQuam9pbihcIlwiKSwge1xuXHRcdCd4bWxucyc6ICAgICAgWExNTE5TLnNzLFxuXHRcdCd4bWxuczpvJzogICAgWExNTE5TLm8sXG5cdFx0J3htbG5zOngnOiAgICBYTE1MTlMueCxcblx0XHQneG1sbnM6c3MnOiAgIFhMTUxOUy5zcyxcblx0XHQneG1sbnM6ZHQnOiAgIFhMTUxOUy5kdCxcblx0XHQneG1sbnM6aHRtbCc6IFhMTUxOUy5odG1sXG5cdH0pO1xufVxuLyogW01TLU9MRURTXSAyLjMuOCBDb21wT2JqU3RyZWFtICovXG5mdW5jdGlvbiBwYXJzZV9jb21wb2JqKG9iai8qOkNGQkVudHJ5Ki8pIHtcblx0dmFyIHYgPSB7fTtcblx0dmFyIG8gPSBvYmouY29udGVudDtcblx0Lyo6OiBpZihvID09IG51bGwpIHJldHVybjsgKi9cblxuXHQvKiBbTVMtT0xFRFNdIDIuMy43IENvbXBPYmpIZWFkZXIgLS0gQWxsIGZpZWxkcyBNVVNUIGJlIGlnbm9yZWQgKi9cblx0by5sID0gMjg7XG5cblx0di5BbnNpVXNlclR5cGUgPSBvLnJlYWRfc2hpZnQoMCwgXCJscHN0ci1hbnNpXCIpO1xuXHR2LkFuc2lDbGlwYm9hcmRGb3JtYXQgPSBwYXJzZV9DbGlwYm9hcmRGb3JtYXRPckFuc2lTdHJpbmcobyk7XG5cblx0aWYoby5sZW5ndGggLSBvLmwgPD0gNCkgcmV0dXJuIHY7XG5cblx0dmFyIG0vKjpudW1iZXIqLyA9IG8ucmVhZF9zaGlmdCg0KTtcblx0aWYobSA9PSAwIHx8IG0gPiA0MCkgcmV0dXJuIHY7XG5cdG8ubC09NDsgdi5SZXNlcnZlZDEgPSBvLnJlYWRfc2hpZnQoMCwgXCJscHN0ci1hbnNpXCIpO1xuXG5cdGlmKG8ubGVuZ3RoIC0gby5sIDw9IDQpIHJldHVybiB2O1xuXHRtID0gby5yZWFkX3NoaWZ0KDQpO1xuXHRpZihtICE9PSAweDcxYjIzOWY0KSByZXR1cm4gdjtcblx0di5Vbmljb2RlQ2xpcGJvYXJkRm9ybWF0ID0gcGFyc2VfQ2xpcGJvYXJkRm9ybWF0T3JVbmljb2RlU3RyaW5nKG8pO1xuXG5cdG0gPSBvLnJlYWRfc2hpZnQoNCk7XG5cdGlmKG0gPT0gMCB8fCBtID4gNDApIHJldHVybiB2O1xuXHRvLmwtPTQ7IHYuUmVzZXJ2ZWQyID0gby5yZWFkX3NoaWZ0KDAsIFwibHB3c3RyXCIpO1xufVxuXG4vKlxuXHRDb250aW51ZSBsb2dpYyBmb3I6XG5cdC0gMi40LjU4IENvbnRpbnVlICAgICAgICAgIDB4MDAzY1xuXHQtIDIuNC41OSBDb250aW51ZUJpZ05hbWUgICAweDA0M2Ncblx0LSAyLjQuNjAgQ29udGludWVGcnQgICAgICAgMHgwODEyXG5cdC0gMi40LjYxIENvbnRpbnVlRnJ0MTEgICAgIDB4MDg3NVxuXHQtIDIuNC42MiBDb250aW51ZUZydDEyICAgICAweDA4N2ZcbiovXG52YXIgQ09OVElOVUVfUlQgPSBbIDB4MDAzYywgMHgwNDNjLCAweDA4MTIsIDB4MDg3NSwgMHgwODdmIF07XG5mdW5jdGlvbiBzbHVycChSZWNvcmRUeXBlLCBSLCBibG9iLCBsZW5ndGgvKjpudW1iZXIqLywgb3B0cykvKjphbnkqLyB7XG5cdHZhciBsID0gbGVuZ3RoO1xuXHR2YXIgYnVmcyA9IFtdO1xuXHR2YXIgZCA9IGJsb2Iuc2xpY2UoYmxvYi5sLGJsb2IubCtsKTtcblx0aWYob3B0cyAmJiBvcHRzLmVuYyAmJiBvcHRzLmVuYy5pbnNpdHUgJiYgZC5sZW5ndGggPiAwKSBzd2l0Y2goUmVjb3JkVHlwZSkge1xuXHRjYXNlIDB4MDAwOTogY2FzZSAweDAyMDk6IGNhc2UgMHgwNDA5OiBjYXNlIDB4MDgwOS8qIEJPRiAqLzogY2FzZSAweDAwMmYgLyogRmlsZVBhc3MgKi86IGNhc2UgMHgwMTk1IC8qIEZpbGVMb2NrICovOiBjYXNlIDB4MDBlMSAvKiBJbnRlcmZhY2VIZHIgKi86IGNhc2UgMHgwMTk2IC8qIFJSREluZm8gKi86IGNhc2UgMHgwMTM4IC8qIFJSREhlYWQgKi86IGNhc2UgMHgwMTk0IC8qIFVzckV4Y2wgKi86IGNhc2UgMHgwMDBhIC8qIEVPRiAqLzpcblx0XHRicmVhaztcblx0Y2FzZSAweDAwODUgLyogQm91bmRTaGVldDggKi86XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0b3B0cy5lbmMuaW5zaXR1KGQpO1xuXHR9XG5cdGJ1ZnMucHVzaChkKTtcblx0YmxvYi5sICs9IGw7XG5cdHZhciBuZXh0cnQgPSBfX3JlYWRVSW50MTZMRShibG9iLGJsb2IubCksIG5leHQgPSBYTFNSZWNvcmRFbnVtW25leHRydF07XG5cdHZhciBzdGFydCA9IDA7XG5cdHdoaWxlKG5leHQgIT0gbnVsbCAmJiBDT05USU5VRV9SVC5pbmRleE9mKG5leHRydCkgPiAtMSkge1xuXHRcdGwgPSBfX3JlYWRVSW50MTZMRShibG9iLGJsb2IubCsyKTtcblx0XHRzdGFydCA9IGJsb2IubCArIDQ7XG5cdFx0aWYobmV4dHJ0ID09IDB4MDgxMiAvKiBDb250aW51ZUZydCAqLykgc3RhcnQgKz0gNDtcblx0XHRlbHNlIGlmKG5leHRydCA9PSAweDA4NzUgfHwgbmV4dHJ0ID09IDB4MDg3Zikge1xuXHRcdFx0c3RhcnQgKz0gMTI7XG5cdFx0fVxuXHRcdGQgPSBibG9iLnNsaWNlKHN0YXJ0LGJsb2IubCs0K2wpO1xuXHRcdGJ1ZnMucHVzaChkKTtcblx0XHRibG9iLmwgKz0gNCtsO1xuXHRcdG5leHQgPSAoWExTUmVjb3JkRW51bVtuZXh0cnQgPSBfX3JlYWRVSW50MTZMRShibG9iLCBibG9iLmwpXSk7XG5cdH1cblx0dmFyIGIgPSAoYmNvbmNhdChidWZzKS8qOmFueSovKTtcblx0cHJlcF9ibG9iKGIsIDApO1xuXHR2YXIgbGwgPSAwOyBiLmxlbnMgPSBbXTtcblx0Zm9yKHZhciBqID0gMDsgaiA8IGJ1ZnMubGVuZ3RoOyArK2opIHsgYi5sZW5zLnB1c2gobGwpOyBsbCArPSBidWZzW2pdLmxlbmd0aDsgfVxuXHRpZihiLmxlbmd0aCA8IGxlbmd0aCkgdGhyb3cgXCJYTFMgUmVjb3JkIDB4XCIgKyBSZWNvcmRUeXBlLnRvU3RyaW5nKDE2KSArIFwiIFRydW5jYXRlZDogXCIgKyBiLmxlbmd0aCArIFwiIDwgXCIgKyBsZW5ndGg7XG5cdHJldHVybiBSLmYoYiwgYi5sZW5ndGgsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBzYWZlX2Zvcm1hdF94ZihwLyo6YW55Ki8sIG9wdHMvKjpQYXJzZU9wdHMqLywgZGF0ZTE5MDQvKjo/Ym9vbGVhbiovKSB7XG5cdGlmKHAudCA9PT0gJ3onKSByZXR1cm47XG5cdGlmKCFwLlhGKSByZXR1cm47XG5cdHZhciBmbXRpZCA9IDA7XG5cdHRyeSB7XG5cdFx0Zm10aWQgPSBwLnogfHwgcC5YRi5udW1GbXRJZCB8fCAwO1xuXHRcdGlmKG9wdHMuY2VsbE5GKSBwLnogPSB0YWJsZV9mbXRbZm10aWRdO1xuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cblx0aWYoIW9wdHMgfHwgb3B0cy5jZWxsVGV4dCAhPT0gZmFsc2UpIHRyeSB7XG5cdFx0aWYocC50ID09PSAnZScpIHsgcC53ID0gcC53IHx8IEJFcnJbcC52XTsgfVxuXHRcdGVsc2UgaWYoZm10aWQgPT09IDAgfHwgZm10aWQgPT0gXCJHZW5lcmFsXCIpIHtcblx0XHRcdGlmKHAudCA9PT0gJ24nKSB7XG5cdFx0XHRcdGlmKChwLnZ8MCkgPT09IHAudikgcC53ID0gcC52LnRvU3RyaW5nKDEwKTtcblx0XHRcdFx0ZWxzZSBwLncgPSBTU0ZfZ2VuZXJhbF9udW0ocC52KTtcblx0XHRcdH1cblx0XHRcdGVsc2UgcC53ID0gU1NGX2dlbmVyYWwocC52KTtcblx0XHR9XG5cdFx0ZWxzZSBwLncgPSBTU0ZfZm9ybWF0KGZtdGlkLHAudiwge2RhdGUxOTA0OiEhZGF0ZTE5MDQsIGRhdGVORjogb3B0cyAmJiBvcHRzLmRhdGVORn0pO1xuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cblx0aWYob3B0cy5jZWxsRGF0ZXMgJiYgZm10aWQgJiYgcC50ID09ICduJyAmJiBmbXRfaXNfZGF0ZSh0YWJsZV9mbXRbZm10aWRdIHx8IFN0cmluZyhmbXRpZCkpKSB7XG5cdFx0dmFyIF9kID0gU1NGX3BhcnNlX2RhdGVfY29kZShwLnYpOyBpZihfZCkgeyBwLnQgPSAnZCc7IHAudiA9IG5ldyBEYXRlKF9kLnksIF9kLm0tMSxfZC5kLF9kLkgsX2QuTSxfZC5TLF9kLnUpOyB9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFrZV9jZWxsKHZhbCwgaXhmZSwgdCkvKjpDZWxsKi8ge1xuXHRyZXR1cm4gKHt2OnZhbCwgaXhmZTppeGZlLCB0OnR9Lyo6YW55Ki8pO1xufVxuXG4vLyAyLjMuMlxuZnVuY3Rpb24gcGFyc2Vfd29ya2Jvb2soYmxvYiwgb3B0aW9ucy8qOlBhcnNlT3B0cyovKS8qOldvcmtib29rKi8ge1xuXHR2YXIgd2IgPSAoe29wdHM6e319Lyo6YW55Ki8pO1xuXHR2YXIgU2hlZXRzID0ge307XG5cdGlmKERFTlNFICE9IG51bGwgJiYgb3B0aW9ucy5kZW5zZSA9PSBudWxsKSBvcHRpb25zLmRlbnNlID0gREVOU0U7XG5cdHZhciBvdXQvKjpXb3Jrc2hlZXQqLyA9ICgob3B0aW9ucy5kZW5zZSA/IFtdIDoge30pLyo6YW55Ki8pO1xuXHR2YXIgRGlyZWN0b3J5ID0ge307XG5cdHZhciByYW5nZS8qOlJhbmdlKi8gPSAoe30vKjphbnkqLyk7XG5cdHZhciBsYXN0X2Zvcm11bGEgPSBudWxsO1xuXHR2YXIgc3N0Lyo6U1NUKi8gPSAoW10vKjphbnkqLyk7XG5cdHZhciBjdXJfc2hlZXQgPSBcIlwiO1xuXHR2YXIgUHJlYW1ibGUgPSB7fTtcblx0dmFyIGxhc3RjZWxsLCBsYXN0X2NlbGwgPSBcIlwiLCBjYy8qOkNlbGwqLywgY21udCwgcm5nQywgcm5nUjtcblx0dmFyIHNoYXJlZGYgPSB7fTtcblx0dmFyIGFycmF5Zi8qOkFycmF5PFtSYW5nZSwgc3RyaW5nXT4qLyA9IFtdO1xuXHR2YXIgdGVtcF92YWwvKjpDZWxsKi87XG5cdHZhciBjb3VudHJ5O1xuXHR2YXIgWEZzID0gW107IC8qIFhGIHJlY29yZHMgKi9cblx0dmFyIHBhbGV0dGUvKjpBcnJheTxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0+Ki8gPSBbXTtcblx0dmFyIFdvcmtib29rLyo6V0JXQlByb3BzKi8gPSAoeyBTaGVldHM6W10sIFdCUHJvcHM6e2RhdGUxOTA0OmZhbHNlfSwgVmlld3M6W3t9XSB9Lyo6YW55Ki8pLCB3c3Byb3BzID0ge307XG5cdHZhciBnZXRfcmdiID0gZnVuY3Rpb24gZ2V0cmdiKGljdi8qOm51bWJlciovKS8qOltudW1iZXIsIG51bWJlciwgbnVtYmVyXSovIHtcblx0XHRpZihpY3YgPCA4KSByZXR1cm4gWExTSWN2W2ljdl07XG5cdFx0aWYoaWN2IDwgNjQpIHJldHVybiBwYWxldHRlW2ljdi04XSB8fCBYTFNJY3ZbaWN2XTtcblx0XHRyZXR1cm4gWExTSWN2W2ljdl07XG5cdH07XG5cdHZhciBwcm9jZXNzX2NlbGxfc3R5bGUgPSBmdW5jdGlvbiBwY3MoY2VsbCwgbGluZS8qOmFueSovLCBvcHRpb25zKSB7XG5cdFx0dmFyIHhmZCA9IGxpbmUuWEYuZGF0YTtcblx0XHRpZigheGZkIHx8ICF4ZmQucGF0dGVyblR5cGUgfHwgIW9wdGlvbnMgfHwgIW9wdGlvbnMuY2VsbFN0eWxlcykgcmV0dXJuO1xuXHRcdGxpbmUucyA9ICh7fS8qOmFueSovKTtcblx0XHRsaW5lLnMucGF0dGVyblR5cGUgPSB4ZmQucGF0dGVyblR5cGU7XG5cdFx0dmFyIHQ7XG5cdFx0aWYoKHQgPSByZ2IySGV4KGdldF9yZ2IoeGZkLmljdkZvcmUpKSkpIHsgbGluZS5zLmZnQ29sb3IgPSB7cmdiOnR9OyB9XG5cdFx0aWYoKHQgPSByZ2IySGV4KGdldF9yZ2IoeGZkLmljdkJhY2spKSkpIHsgbGluZS5zLmJnQ29sb3IgPSB7cmdiOnR9OyB9XG5cdH07XG5cdHZhciBhZGRjZWxsID0gZnVuY3Rpb24gYWRkY2VsbChjZWxsLyo6YW55Ki8sIGxpbmUvKjphbnkqLywgb3B0aW9ucy8qOmFueSovKSB7XG5cdFx0aWYoZmlsZV9kZXB0aCA+IDEpIHJldHVybjtcblx0XHRpZihvcHRpb25zLnNoZWV0Um93cyAmJiBjZWxsLnIgPj0gb3B0aW9ucy5zaGVldFJvd3MpIHJldHVybjtcblx0XHRpZihvcHRpb25zLmNlbGxTdHlsZXMgJiYgbGluZS5YRiAmJiBsaW5lLlhGLmRhdGEpIHByb2Nlc3NfY2VsbF9zdHlsZShjZWxsLCBsaW5lLCBvcHRpb25zKTtcblx0XHRkZWxldGUgbGluZS5peGZlOyBkZWxldGUgbGluZS5YRjtcblx0XHRsYXN0Y2VsbCA9IGNlbGw7XG5cdFx0bGFzdF9jZWxsID0gZW5jb2RlX2NlbGwoY2VsbCk7XG5cdFx0aWYoIXJhbmdlIHx8ICFyYW5nZS5zIHx8ICFyYW5nZS5lKSByYW5nZSA9IHtzOntyOjAsYzowfSxlOntyOjAsYzowfX07XG5cdFx0aWYoY2VsbC5yIDwgcmFuZ2Uucy5yKSByYW5nZS5zLnIgPSBjZWxsLnI7XG5cdFx0aWYoY2VsbC5jIDwgcmFuZ2Uucy5jKSByYW5nZS5zLmMgPSBjZWxsLmM7XG5cdFx0aWYoY2VsbC5yICsgMSA+IHJhbmdlLmUucikgcmFuZ2UuZS5yID0gY2VsbC5yICsgMTtcblx0XHRpZihjZWxsLmMgKyAxID4gcmFuZ2UuZS5jKSByYW5nZS5lLmMgPSBjZWxsLmMgKyAxO1xuXHRcdGlmKG9wdGlvbnMuY2VsbEZvcm11bGEgJiYgbGluZS5mKSB7XG5cdFx0XHRmb3IodmFyIGFmaSA9IDA7IGFmaSA8IGFycmF5Zi5sZW5ndGg7ICsrYWZpKSB7XG5cdFx0XHRcdGlmKGFycmF5ZlthZmldWzBdLnMuYyA+IGNlbGwuYyB8fCBhcnJheWZbYWZpXVswXS5zLnIgPiBjZWxsLnIpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZihhcnJheWZbYWZpXVswXS5lLmMgPCBjZWxsLmMgfHwgYXJyYXlmW2FmaV1bMF0uZS5yIDwgY2VsbC5yKSBjb250aW51ZTtcblx0XHRcdFx0bGluZS5GID0gZW5jb2RlX3JhbmdlKGFycmF5ZlthZmldWzBdKTtcblx0XHRcdFx0aWYoYXJyYXlmW2FmaV1bMF0ucy5jICE9IGNlbGwuYyB8fCBhcnJheWZbYWZpXVswXS5zLnIgIT0gY2VsbC5yKSBkZWxldGUgbGluZS5mO1xuXHRcdFx0XHRpZihsaW5lLmYpIGxpbmUuZiA9IFwiXCIgKyBzdHJpbmdpZnlfZm9ybXVsYShhcnJheWZbYWZpXVsxXSwgcmFuZ2UsIGNlbGwsIHN1cGJvb2tzLCBvcHRzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHtcblx0XHRcdGlmKG9wdGlvbnMuZGVuc2UpIHtcblx0XHRcdFx0aWYoIW91dFtjZWxsLnJdKSBvdXRbY2VsbC5yXSA9IFtdO1xuXHRcdFx0XHRvdXRbY2VsbC5yXVtjZWxsLmNdID0gbGluZTtcblx0XHRcdH0gZWxzZSBvdXRbbGFzdF9jZWxsXSA9IGxpbmU7XG5cdFx0fVxuXHR9O1xuXHR2YXIgb3B0cyA9ICh7XG5cdFx0ZW5jOiBmYWxzZSwgLy8gZW5jcnlwdGVkXG5cdFx0c2JjY2g6IDAsIC8vIGNjaCBpbiB0aGUgcHJlY2VkaW5nIFN1cEJvb2tcblx0XHRzbmFtZXM6IFtdLCAvLyBzaGVldG5hbWVzXG5cdFx0c2hhcmVkZjogc2hhcmVkZiwgLy8gc2hhcmVkIGZvcm11bGFlIGJ5IGFkZHJlc3Ncblx0XHRhcnJheWY6IGFycmF5ZiwgLy8gYXJyYXkgZm9ybXVsYWUgYXJyYXlcblx0XHRycnRhYmlkOiBbXSwgLy8gUlJUYWJJZFxuXHRcdGxhc3R1c2VyOiBcIlwiLCAvLyBMYXN0IFVzZXIgZnJvbSBXcml0ZUFjY2Vzc1xuXHRcdGJpZmY6IDgsIC8vIEJJRkYgdmVyc2lvblxuXHRcdGNvZGVwYWdlOiAwLCAvLyBDUCBmcm9tIENvZGVQYWdlIHJlY29yZFxuXHRcdHdpbmxvY2tlZDogMCwgLy8gZkxvY2tXbiBmcm9tIFdpblByb3RlY3Rcblx0XHRjZWxsU3R5bGVzOiAhIW9wdGlvbnMgJiYgISFvcHRpb25zLmNlbGxTdHlsZXMsXG5cdFx0V1RGOiAhIW9wdGlvbnMgJiYgISFvcHRpb25zLnd0ZlxuXHR9Lyo6YW55Ki8pO1xuXHRpZihvcHRpb25zLnBhc3N3b3JkKSBvcHRzLnBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZDtcblx0dmFyIHRoZW1lcztcblx0dmFyIG1lcmdlcy8qOkFycmF5PFJhbmdlPiovID0gW107XG5cdHZhciBvYmplY3RzID0gW107XG5cdHZhciBjb2xpbmZvLyo6QXJyYXk8Q29sSW5mbz4qLyA9IFtdLCByb3dpbmZvLyo6QXJyYXk8Um93SW5mbz4qLyA9IFtdO1xuXHR2YXIgc2VlbmNvbCA9IGZhbHNlO1xuXHR2YXIgc3VwYm9va3MgPSAoW10vKjphbnkqLyk7IC8vIDEtaW5kZXhlZCwgd2lsbCBob2xkIGV4dGVybiBuYW1lc1xuXHRzdXBib29rcy5TaGVldE5hbWVzID0gb3B0cy5zbmFtZXM7XG5cdHN1cGJvb2tzLnNoYXJlZGYgPSBvcHRzLnNoYXJlZGY7XG5cdHN1cGJvb2tzLmFycmF5ZiA9IG9wdHMuYXJyYXlmO1xuXHRzdXBib29rcy5uYW1lcyA9IFtdO1xuXHRzdXBib29rcy5YVEkgPSBbXTtcblx0dmFyIGxhc3RfUlQgPSAwO1xuXHR2YXIgZmlsZV9kZXB0aCA9IDA7IC8qIFRPRE86IG1ha2UgYSByZWFsIHN0YWNrICovXG5cdHZhciBCSUZGMkZtdCA9IDAsIEJJRkYyRm10VGFibGUvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIEZpbHRlckRhdGFiYXNlcyA9IFtdOyAvKiBUT0RPOiBzb3J0IG91dCBzdXBib29rcyBhbmQgcHJvY2VzcyBlbHNld2hlcmUgKi9cblx0dmFyIGxhc3RfbGJsLyo6P0RlZmluZWROYW1lKi87XG5cblx0LyogZXhwbGljaXQgb3ZlcnJpZGUgZm9yIHNvbWUgYnJva2VuIHdyaXRlcnMgKi9cblx0b3B0cy5jb2RlcGFnZSA9IDEyMDA7XG5cdHNldF9jcCgxMjAwKTtcblx0dmFyIHNlZW5fY29kZXBhZ2UgPSBmYWxzZTtcblx0d2hpbGUoYmxvYi5sIDwgYmxvYi5sZW5ndGggLSAxKSB7XG5cdFx0dmFyIHMgPSBibG9iLmw7XG5cdFx0dmFyIFJlY29yZFR5cGUgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0aWYoUmVjb3JkVHlwZSA9PT0gMCAmJiBsYXN0X1JUID09PSAweDAwMGEgLyogRU9GICovKSBicmVhaztcblx0XHR2YXIgbGVuZ3RoID0gKGJsb2IubCA9PT0gYmxvYi5sZW5ndGggPyAwIDogYmxvYi5yZWFkX3NoaWZ0KDIpKTtcblx0XHR2YXIgUiA9IFhMU1JlY29yZEVudW1bUmVjb3JkVHlwZV07XG5cdFx0Ly9jb25zb2xlLmxvZyhSZWNvcmRUeXBlLnRvU3RyaW5nKDE2KSwgUmVjb3JkVHlwZSwgUiwgYmxvYi5sLCBsZW5ndGgsIGJsb2IubGVuZ3RoKTtcblx0XHQvL2lmKCFSKSBjb25zb2xlLmxvZyhibG9iLnNsaWNlKGJsb2IubCwgYmxvYi5sICsgbGVuZ3RoKSk7XG5cdFx0aWYoUiAmJiBSLmYpIHtcblx0XHRcdGlmKG9wdGlvbnMuYm9va1NoZWV0cykge1xuXHRcdFx0XHRpZihsYXN0X1JUID09PSAweDAwODUgLyogQm91bmRTaGVldDggKi8gJiYgUmVjb3JkVHlwZSAhPT0gMHgwMDg1IC8qIFIubiAhPT0gJ0JvdW5kU2hlZXQ4JyAqLykgYnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRsYXN0X1JUID0gUmVjb3JkVHlwZTtcblx0XHRcdGlmKFIuciA9PT0gMiB8fCBSLnIgPT0gMTIpIHtcblx0XHRcdFx0dmFyIHJ0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpOyBsZW5ndGggLT0gMjtcblx0XHRcdFx0aWYoIW9wdHMuZW5jICYmIHJ0ICE9PSBSZWNvcmRUeXBlICYmICgoKHJ0JjB4RkYpPDw4KXwocnQ+PjgpKSAhPT0gUmVjb3JkVHlwZSkgdGhyb3cgbmV3IEVycm9yKFwicnQgbWlzbWF0Y2g6IFwiICsgcnQgKyBcIiE9XCIgKyBSZWNvcmRUeXBlKTtcblx0XHRcdFx0aWYoUi5yID09IDEyKXtcblx0XHRcdFx0XHRibG9iLmwgKz0gMTA7IGxlbmd0aCAtPSAxMDtcblx0XHRcdFx0fSAvLyBza2lwIEZSVFxuXHRcdFx0fVxuXHRcdFx0Ly9jb25zb2xlLmVycm9yKFIsYmxvYi5sLGxlbmd0aCxibG9iLmxlbmd0aCk7XG5cdFx0XHR2YXIgdmFsLyo6YW55Ki8gPSAoe30vKjphbnkqLyk7XG5cdFx0XHRpZihSZWNvcmRUeXBlID09PSAweDAwMGEgLyogRU9GICovKSB2YWwgPSAvKjo6KCovUi5mKGJsb2IsIGxlbmd0aCwgb3B0cykvKjo6IDphbnkpKi87XG5cdFx0XHRlbHNlIHZhbCA9IC8qOjooKi9zbHVycChSZWNvcmRUeXBlLCBSLCBibG9iLCBsZW5ndGgsIG9wdHMpLyo6OiA6YW55KSovO1xuXHRcdFx0Lyo6OiB2YWwgPSAodmFsOmFueSk7ICovXG5cdFx0XHRpZihmaWxlX2RlcHRoID09IDAgJiYgWzB4MDAwOSwgMHgwMjA5LCAweDA0MDksIDB4MDgwOV0uaW5kZXhPZihsYXN0X1JUKSA9PT0gLTEgLyogJ0JPRicgKi8pIGNvbnRpbnVlO1xuXHRcdFx0c3dpdGNoKFJlY29yZFR5cGUpIHtcblx0XHRcdFx0Y2FzZSAweDAwMjIgLyogRGF0ZTE5MDQgKi86XG5cdFx0XHRcdFx0Lyo6OiBpZighV29ya2Jvb2suV0JQcm9wcykgV29ya2Jvb2suV0JQcm9wcyA9IHt9OyAqL1xuXHRcdFx0XHRcdHdiLm9wdHMuRGF0ZTE5MDQgPSBXb3JrYm9vay5XQlByb3BzLmRhdGUxOTA0ID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwODYgLyogV3JpdGVQcm90ZWN0ICovOiB3Yi5vcHRzLldyaXRlUHJvdGVjdCA9IHRydWU7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAyZiAvKiBGaWxlUGFzcyAqLzpcblx0XHRcdFx0XHRpZighb3B0cy5lbmMpIGJsb2IubCA9IDA7XG5cdFx0XHRcdFx0b3B0cy5lbmMgPSB2YWw7XG5cdFx0XHRcdFx0aWYoIW9wdGlvbnMucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcihcIkZpbGUgaXMgcGFzc3dvcmQtcHJvdGVjdGVkXCIpO1xuXHRcdFx0XHRcdGlmKHZhbC52YWxpZCA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJFbmNyeXB0aW9uIHNjaGVtZSB1bnN1cHBvcnRlZFwiKTtcblx0XHRcdFx0XHRpZighdmFsLnZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzd29yZCBpcyBpbmNvcnJlY3RcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDVjIC8qIFdyaXRlQWNjZXNzICovOiBvcHRzLmxhc3R1c2VyID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwNDIgLyogQ29kZVBhZ2UgKi86XG5cdFx0XHRcdFx0dmFyIGNwdmFsID0gTnVtYmVyKHZhbCk7XG5cdFx0XHRcdFx0Lyogb3ZlcnJpZGVzIGJhc2VkIG9uIHRlc3QgY2FzZXMgKi9cblx0XHRcdFx0XHRzd2l0Y2goY3B2YWwpIHtcblx0XHRcdFx0XHRcdGNhc2UgMHg1MjEyOiBjcHZhbCA9ICAxMjAwOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgMHg4MDAwOiBjcHZhbCA9IDEwMDAwOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgMHg4MDAxOiBjcHZhbCA9ICAxMjUyOyBicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0X2NwKG9wdHMuY29kZXBhZ2UgPSBjcHZhbCk7XG5cdFx0XHRcdFx0c2Vlbl9jb2RlcGFnZSA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMTNkIC8qIFJSVGFiSWQgKi86IG9wdHMucnJ0YWJpZCA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDE5IC8qIFdpblByb3RlY3QgKi86IG9wdHMud2lubG9ja2VkID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAxYjcgLyogUmVmcmVzaEFsbCAqLzogd2Iub3B0c1tcIlJlZnJlc2hBbGxcIl0gPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAwYyAvKiBDYWxjQ291bnQgKi86IHdiLm9wdHNbXCJDYWxjQ291bnRcIl0gPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAxMCAvKiBDYWxjRGVsdGEgKi86IHdiLm9wdHNbXCJDYWxjRGVsdGFcIl0gPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAxMSAvKiBDYWxjSXRlciAqLzogd2Iub3B0c1tcIkNhbGNJdGVyXCJdID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMGQgLyogQ2FsY01vZGUgKi86IHdiLm9wdHNbXCJDYWxjTW9kZVwiXSA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDBlIC8qIENhbGNQcmVjaXNpb24gKi86IHdiLm9wdHNbXCJDYWxjUHJlY2lzaW9uXCJdID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwNWYgLyogQ2FsY1NhdmVSZWNhbGMgKi86IHdiLm9wdHNbXCJDYWxjU2F2ZVJlY2FsY1wiXSA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDBmIC8qIENhbGNSZWZNb2RlICovOiBvcHRzLkNhbGNSZWZNb2RlID0gdmFsOyBicmVhazsgLy8gVE9ETzogaW1wbGVtZW50IFIxQzFcblx0XHRcdFx0Y2FzZSAweDA4YTMgLyogRm9yY2VGdWxsQ2FsY3VsYXRpb24gKi86IHdiLm9wdHMuRnVsbENhbGMgPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDA4MSAvKiBXc0Jvb2wgKi86XG5cdFx0XHRcdFx0aWYodmFsLmZEaWFsb2cpIG91dFtcIiF0eXBlXCJdID0gXCJkaWFsb2dcIjtcblx0XHRcdFx0XHRpZighdmFsLmZCZWxvdykgKG91dFtcIiFvdXRsaW5lXCJdIHx8IChvdXRbXCIhb3V0bGluZVwiXSA9IHt9KSkuYWJvdmUgPSB0cnVlO1xuXHRcdFx0XHRcdGlmKCF2YWwuZlJpZ2h0KSAob3V0W1wiIW91dGxpbmVcIl0gfHwgKG91dFtcIiFvdXRsaW5lXCJdID0ge30pKS5sZWZ0ID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlIDB4MDBlMCAvKiBYRiAqLzpcblx0XHRcdFx0XHRYRnMucHVzaCh2YWwpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAxYWUgLyogU3VwQm9vayAqLzpcblx0XHRcdFx0XHRzdXBib29rcy5wdXNoKFt2YWxdKTtcblx0XHRcdFx0XHRzdXBib29rc1tzdXBib29rcy5sZW5ndGgtMV0uWFRJID0gW107XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDIzOiBjYXNlIDB4MDIyMyAvKiBFeHRlcm5OYW1lICovOlxuXHRcdFx0XHRcdHN1cGJvb2tzW3N1cGJvb2tzLmxlbmd0aC0xXS5wdXNoKHZhbCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDE4OiBjYXNlIDB4MDIxOCAvKiBMYmwgKi86XG5cdFx0XHRcdFx0bGFzdF9sYmwgPSAoe1xuXHRcdFx0XHRcdFx0TmFtZTogdmFsLk5hbWUsXG5cdFx0XHRcdFx0XHRSZWY6IHN0cmluZ2lmeV9mb3JtdWxhKHZhbC5yZ2NlLHJhbmdlLG51bGwsc3VwYm9va3Msb3B0cylcblx0XHRcdFx0XHR9Lyo6RGVmaW5lZE5hbWUqLyk7XG5cdFx0XHRcdFx0aWYodmFsLml0YWIgPiAwKSBsYXN0X2xibC5TaGVldCA9IHZhbC5pdGFiIC0gMTtcblx0XHRcdFx0XHRzdXBib29rcy5uYW1lcy5wdXNoKGxhc3RfbGJsKTtcblx0XHRcdFx0XHRpZighc3VwYm9va3NbMF0pIHsgc3VwYm9va3NbMF0gPSBbXTsgc3VwYm9va3NbMF0uWFRJID0gW107IH1cblx0XHRcdFx0XHRzdXBib29rc1tzdXBib29rcy5sZW5ndGgtMV0ucHVzaCh2YWwpO1xuXHRcdFx0XHRcdGlmKHZhbC5OYW1lID09IFwiX3hsbm0uX0ZpbHRlckRhdGFiYXNlXCIgJiYgdmFsLml0YWIgPiAwKVxuXHRcdFx0XHRcdFx0aWYodmFsLnJnY2UgJiYgdmFsLnJnY2VbMF0gJiYgdmFsLnJnY2VbMF1bMF0gJiYgdmFsLnJnY2VbMF1bMF1bMF0gPT0gJ1B0Z0FyZWEzZCcpXG5cdFx0XHRcdFx0XHRcdEZpbHRlckRhdGFiYXNlc1t2YWwuaXRhYiAtIDFdID0geyByZWY6IGVuY29kZV9yYW5nZSh2YWwucmdjZVswXVswXVsxXVsyXSkgfTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMTYgLyogRXh0ZXJuQ291bnQgKi86IG9wdHMuRXh0ZXJuQ291bnQgPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAxNyAvKiBFeHRlcm5TaGVldCAqLzpcblx0XHRcdFx0XHRpZihzdXBib29rcy5sZW5ndGggPT0gMCkgeyBzdXBib29rc1swXSA9IFtdOyBzdXBib29rc1swXS5YVEkgPSBbXTsgfVxuXHRcdFx0XHRcdHN1cGJvb2tzW3N1cGJvb2tzLmxlbmd0aCAtIDFdLlhUSSA9IHN1cGJvb2tzW3N1cGJvb2tzLmxlbmd0aCAtIDFdLlhUSS5jb25jYXQodmFsKTsgc3VwYm9va3MuWFRJID0gc3VwYm9va3MuWFRJLmNvbmNhdCh2YWwpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDA4OTQgLyogTmFtZUNtdCAqLzpcblx0XHRcdFx0XHQvKiBUT0RPOiBzZWFyY2ggZm9yIGNvcnJlY3QgbmFtZSAqL1xuXHRcdFx0XHRcdGlmKG9wdHMuYmlmZiA8IDgpIGJyZWFrO1xuXHRcdFx0XHRcdGlmKGxhc3RfbGJsICE9IG51bGwpIGxhc3RfbGJsLkNvbW1lbnQgPSB2YWxbMV07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDEyIC8qIFByb3RlY3QgKi86IG91dFtcIiFwcm90ZWN0XCJdID0gdmFsOyBicmVhazsgLyogZm9yIHNoZWV0IG9yIGJvb2sgKi9cblx0XHRcdFx0Y2FzZSAweDAwMTMgLyogUGFzc3dvcmQgKi86IGlmKHZhbCAhPT0gMCAmJiBvcHRzLldURikgY29uc29sZS5lcnJvcihcIlBhc3N3b3JkIHZlcmlmaWVyOiBcIiArIHZhbCk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDA4NSAvKiBCb3VuZFNoZWV0OCAqLzoge1xuXHRcdFx0XHRcdERpcmVjdG9yeVt2YWwucG9zXSA9IHZhbDtcblx0XHRcdFx0XHRvcHRzLnNuYW1lcy5wdXNoKHZhbC5uYW1lKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMGEgLyogRU9GICovOiB7XG5cdFx0XHRcdFx0aWYoLS1maWxlX2RlcHRoKSBicmVhaztcblx0XHRcdFx0XHRpZihyYW5nZS5lKSB7XG5cdFx0XHRcdFx0XHRpZihyYW5nZS5lLnIgPiAwICYmIHJhbmdlLmUuYyA+IDApIHtcblx0XHRcdFx0XHRcdFx0cmFuZ2UuZS5yLS07IHJhbmdlLmUuYy0tO1xuXHRcdFx0XHRcdFx0XHRvdXRbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0XHRcdFx0XHRcdFx0aWYob3B0aW9ucy5zaGVldFJvd3MgJiYgb3B0aW9ucy5zaGVldFJvd3MgPD0gcmFuZ2UuZS5yKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHRtcHJpID0gcmFuZ2UuZS5yO1xuXHRcdFx0XHRcdFx0XHRcdHJhbmdlLmUuciA9IG9wdGlvbnMuc2hlZXRSb3dzIC0gMTtcblx0XHRcdFx0XHRcdFx0XHRvdXRbXCIhZnVsbHJlZlwiXSA9IG91dFtcIiFyZWZcIl07XG5cdFx0XHRcdFx0XHRcdFx0b3V0W1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdFx0XHRcdFx0XHRcdFx0cmFuZ2UuZS5yID0gdG1wcmk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmFuZ2UuZS5yKys7IHJhbmdlLmUuYysrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYobWVyZ2VzLmxlbmd0aCA+IDApIG91dFtcIiFtZXJnZXNcIl0gPSBtZXJnZXM7XG5cdFx0XHRcdFx0XHRpZihvYmplY3RzLmxlbmd0aCA+IDApIG91dFtcIiFvYmplY3RzXCJdID0gb2JqZWN0cztcblx0XHRcdFx0XHRcdGlmKGNvbGluZm8ubGVuZ3RoID4gMCkgb3V0W1wiIWNvbHNcIl0gPSBjb2xpbmZvO1xuXHRcdFx0XHRcdFx0aWYocm93aW5mby5sZW5ndGggPiAwKSBvdXRbXCIhcm93c1wiXSA9IHJvd2luZm87XG5cdFx0XHRcdFx0XHRXb3JrYm9vay5TaGVldHMucHVzaCh3c3Byb3BzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoY3VyX3NoZWV0ID09PSBcIlwiKSBQcmVhbWJsZSA9IG91dDsgZWxzZSBTaGVldHNbY3VyX3NoZWV0XSA9IG91dDtcblx0XHRcdFx0XHRvdXQgPSAoKG9wdGlvbnMuZGVuc2UgPyBbXSA6IHt9KS8qOmFueSovKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMDk6IGNhc2UgMHgwMjA5OiBjYXNlIDB4MDQwOTogY2FzZSAweDA4MDkgLyogQk9GICovOiB7XG5cdFx0XHRcdFx0aWYob3B0cy5iaWZmID09PSA4KSBvcHRzLmJpZmYgPSB7XG5cdFx0XHRcdFx0XHQvKjo6WyovMHgwMDA5Lyo6Ol0qLzoyLFxuXHRcdFx0XHRcdFx0Lyo6OlsqLzB4MDIwOS8qOjpdKi86Myxcblx0XHRcdFx0XHRcdC8qOjpbKi8weDA0MDkvKjo6XSovOjRcblx0XHRcdFx0XHR9W1JlY29yZFR5cGVdIHx8IHtcblx0XHRcdFx0XHRcdC8qOjpbKi8weDAyMDAvKjo6XSovOjIsXG5cdFx0XHRcdFx0XHQvKjo6WyovMHgwMzAwLyo6Ol0qLzozLFxuXHRcdFx0XHRcdFx0Lyo6OlsqLzB4MDQwMC8qOjpdKi86NCxcblx0XHRcdFx0XHRcdC8qOjpbKi8weDA1MDAvKjo6XSovOjUsXG5cdFx0XHRcdFx0XHQvKjo6WyovMHgwNjAwLyo6Ol0qLzo4LFxuXHRcdFx0XHRcdFx0Lyo6OlsqLzB4MDAwMi8qOjpdKi86Mixcblx0XHRcdFx0XHRcdC8qOjpbKi8weDAwMDcvKjo6XSovOjJcblx0XHRcdFx0XHR9W3ZhbC5CSUZGVmVyXSB8fCA4O1xuXHRcdFx0XHRcdG9wdHMuYmlmZmd1ZXNzID0gdmFsLkJJRkZWZXIgPT0gMDtcblx0XHRcdFx0XHRpZih2YWwuQklGRlZlciA9PSAwICYmIHZhbC5kdCA9PSAweDEwMDApIHsgb3B0cy5iaWZmID0gNTsgc2Vlbl9jb2RlcGFnZSA9IHRydWU7IHNldF9jcChvcHRzLmNvZGVwYWdlID0gMjg1OTEpOyB9XG5cdFx0XHRcdFx0aWYob3B0cy5iaWZmID09IDggJiYgdmFsLkJJRkZWZXIgPT0gMCAmJiB2YWwuZHQgPT0gMTYpIG9wdHMuYmlmZiA9IDI7XG5cdFx0XHRcdFx0aWYoZmlsZV9kZXB0aCsrKSBicmVhaztcblx0XHRcdFx0XHRvdXQgPSAoKG9wdGlvbnMuZGVuc2UgPyBbXSA6IHt9KS8qOmFueSovKTtcblxuXHRcdFx0XHRcdGlmKG9wdHMuYmlmZiA8IDggJiYgIXNlZW5fY29kZXBhZ2UpIHsgc2Vlbl9jb2RlcGFnZSA9IHRydWU7IHNldF9jcChvcHRzLmNvZGVwYWdlID0gb3B0aW9ucy5jb2RlcGFnZSB8fCAxMjUyKTsgfVxuXG5cdFx0XHRcdFx0aWYob3B0cy5iaWZmIDwgNSB8fCB2YWwuQklGRlZlciA9PSAwICYmIHZhbC5kdCA9PSAweDEwMDApIHtcblx0XHRcdFx0XHRcdGlmKGN1cl9zaGVldCA9PT0gXCJcIikgY3VyX3NoZWV0ID0gXCJTaGVldDFcIjtcblx0XHRcdFx0XHRcdHJhbmdlID0ge3M6e3I6MCxjOjB9LGU6e3I6MCxjOjB9fTtcblx0XHRcdFx0XHRcdC8qIGZha2UgQm91bmRTaGVldDggKi9cblx0XHRcdFx0XHRcdHZhciBmYWtlYnM4ID0ge3BvczogYmxvYi5sIC0gbGVuZ3RoLCBuYW1lOmN1cl9zaGVldH07XG5cdFx0XHRcdFx0XHREaXJlY3RvcnlbZmFrZWJzOC5wb3NdID0gZmFrZWJzODtcblx0XHRcdFx0XHRcdG9wdHMuc25hbWVzLnB1c2goY3VyX3NoZWV0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBjdXJfc2hlZXQgPSAoRGlyZWN0b3J5W3NdIHx8IHtuYW1lOlwiXCJ9KS5uYW1lO1xuXHRcdFx0XHRcdGlmKHZhbC5kdCA9PSAweDIwKSBvdXRbXCIhdHlwZVwiXSA9IFwiY2hhcnRcIjtcblx0XHRcdFx0XHRpZih2YWwuZHQgPT0gMHg0MCkgb3V0W1wiIXR5cGVcIl0gPSBcIm1hY3JvXCI7XG5cdFx0XHRcdFx0bWVyZ2VzID0gW107XG5cdFx0XHRcdFx0b2JqZWN0cyA9IFtdO1xuXHRcdFx0XHRcdG9wdHMuYXJyYXlmID0gYXJyYXlmID0gW107XG5cdFx0XHRcdFx0Y29saW5mbyA9IFtdOyByb3dpbmZvID0gW107XG5cdFx0XHRcdFx0c2VlbmNvbCA9IGZhbHNlO1xuXHRcdFx0XHRcdHdzcHJvcHMgPSB7SGlkZGVuOihEaXJlY3Rvcnlbc118fHtoczowfSkuaHMsIG5hbWU6Y3VyX3NoZWV0IH07XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMjAzIC8qIE51bWJlciAqLzogY2FzZSAweDAwMDMgLyogQklGRjJOVU0gKi86IGNhc2UgMHgwMDAyIC8qIEJJRkYySU5UICovOiB7XG5cdFx0XHRcdFx0aWYob3V0W1wiIXR5cGVcIl0gPT0gXCJjaGFydFwiKSBpZihvcHRpb25zLmRlbnNlID8gKG91dFt2YWwucl18fFtdKVt2YWwuY106IG91dFtlbmNvZGVfY2VsbCh7Yzp2YWwuYywgcjp2YWwucn0pXSkgKyt2YWwuYztcblx0XHRcdFx0XHR0ZW1wX3ZhbCA9ICh7aXhmZTogdmFsLml4ZmUsIFhGOiBYRnNbdmFsLml4ZmVdfHx7fSwgdjp2YWwudmFsLCB0OiduJ30vKjphbnkqLyk7XG5cdFx0XHRcdFx0aWYoQklGRjJGbXQgPiAwKSB0ZW1wX3ZhbC56ID0gQklGRjJGbXRUYWJsZVsodGVtcF92YWwuaXhmZT4+OCkgJiAweDNGXTtcblx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0YWRkY2VsbCh7Yzp2YWwuYywgcjp2YWwucn0sIHRlbXBfdmFsLCBvcHRpb25zKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMDU6IGNhc2UgMHgwMjA1IC8qIEJvb2xFcnIgKi86IHtcblx0XHRcdFx0XHR0ZW1wX3ZhbCA9ICh7aXhmZTogdmFsLml4ZmUsIFhGOiBYRnNbdmFsLml4ZmVdLCB2OnZhbC52YWwsIHQ6dmFsLnR9Lyo6YW55Ki8pO1xuXHRcdFx0XHRcdGlmKEJJRkYyRm10ID4gMCkgdGVtcF92YWwueiA9IEJJRkYyRm10VGFibGVbKHRlbXBfdmFsLml4ZmU+PjgpICYgMHgzRl07XG5cdFx0XHRcdFx0c2FmZV9mb3JtYXRfeGYodGVtcF92YWwsIG9wdGlvbnMsIHdiLm9wdHMuRGF0ZTE5MDQpO1xuXHRcdFx0XHRcdGFkZGNlbGwoe2M6dmFsLmMsIHI6dmFsLnJ9LCB0ZW1wX3ZhbCwgb3B0aW9ucyk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMjdlIC8qIFJLICovOiB7XG5cdFx0XHRcdFx0dGVtcF92YWwgPSAoe2l4ZmU6IHZhbC5peGZlLCBYRjogWEZzW3ZhbC5peGZlXSwgdjp2YWwucmtudW0sIHQ6J24nfS8qOmFueSovKTtcblx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4M0ZdO1xuXHRcdFx0XHRcdHNhZmVfZm9ybWF0X3hmKHRlbXBfdmFsLCBvcHRpb25zLCB3Yi5vcHRzLkRhdGUxOTA0KTtcblx0XHRcdFx0XHRhZGRjZWxsKHtjOnZhbC5jLCByOnZhbC5yfSwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDBiZCAvKiBNdWxSayAqLzoge1xuXHRcdFx0XHRcdGZvcih2YXIgaiA9IHZhbC5jOyBqIDw9IHZhbC5DOyArK2opIHtcblx0XHRcdFx0XHRcdHZhciBpeGZlID0gdmFsLnJrcmVjW2otdmFsLmNdWzBdO1xuXHRcdFx0XHRcdFx0dGVtcF92YWw9ICh7aXhmZTppeGZlLCBYRjpYRnNbaXhmZV0sIHY6dmFsLnJrcmVjW2otdmFsLmNdWzFdLCB0OiduJ30vKjphbnkqLyk7XG5cdFx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4M0ZdO1xuXHRcdFx0XHRcdFx0c2FmZV9mb3JtYXRfeGYodGVtcF92YWwsIG9wdGlvbnMsIHdiLm9wdHMuRGF0ZTE5MDQpO1xuXHRcdFx0XHRcdFx0YWRkY2VsbCh7YzpqLCByOnZhbC5yfSwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMDY6IGNhc2UgMHgwMjA2OiBjYXNlIDB4MDQwNiAvKiBGb3JtdWxhICovOiB7XG5cdFx0XHRcdFx0aWYodmFsLnZhbCA9PSAnU3RyaW5nJykgeyBsYXN0X2Zvcm11bGEgPSB2YWw7IGJyZWFrOyB9XG5cdFx0XHRcdFx0dGVtcF92YWwgPSBtYWtlX2NlbGwodmFsLnZhbCwgdmFsLmNlbGwuaXhmZSwgdmFsLnR0KTtcblx0XHRcdFx0XHR0ZW1wX3ZhbC5YRiA9IFhGc1t0ZW1wX3ZhbC5peGZlXTtcblx0XHRcdFx0XHRpZihvcHRpb25zLmNlbGxGb3JtdWxhKSB7XG5cdFx0XHRcdFx0XHR2YXIgX2YgPSB2YWwuZm9ybXVsYTtcblx0XHRcdFx0XHRcdGlmKF9mICYmIF9mWzBdICYmIF9mWzBdWzBdICYmIF9mWzBdWzBdWzBdID09ICdQdGdFeHAnKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBfZnIgPSBfZlswXVswXVsxXVswXSwgX2ZjID0gX2ZbMF1bMF1bMV1bMV07XG5cdFx0XHRcdFx0XHRcdHZhciBfZmUgPSBlbmNvZGVfY2VsbCh7cjpfZnIsIGM6X2ZjfSk7XG5cdFx0XHRcdFx0XHRcdGlmKHNoYXJlZGZbX2ZlXSkgdGVtcF92YWwuZiA9IFwiXCIrc3RyaW5naWZ5X2Zvcm11bGEodmFsLmZvcm11bGEscmFuZ2UsdmFsLmNlbGwsc3VwYm9va3MsIG9wdHMpO1xuXHRcdFx0XHRcdFx0XHRlbHNlIHRlbXBfdmFsLkYgPSAoKG9wdGlvbnMuZGVuc2UgPyAob3V0W19mcl18fFtdKVtfZmNdOiBvdXRbX2ZlXSkgfHwge30pLkY7XG5cdFx0XHRcdFx0XHR9IGVsc2UgdGVtcF92YWwuZiA9IFwiXCIrc3RyaW5naWZ5X2Zvcm11bGEodmFsLmZvcm11bGEscmFuZ2UsdmFsLmNlbGwsc3VwYm9va3MsIG9wdHMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4M0ZdO1xuXHRcdFx0XHRcdHNhZmVfZm9ybWF0X3hmKHRlbXBfdmFsLCBvcHRpb25zLCB3Yi5vcHRzLkRhdGUxOTA0KTtcblx0XHRcdFx0XHRhZGRjZWxsKHZhbC5jZWxsLCB0ZW1wX3ZhbCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0bGFzdF9mb3JtdWxhID0gdmFsO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAwNzogY2FzZSAweDAyMDcgLyogU3RyaW5nICovOiB7XG5cdFx0XHRcdFx0aWYobGFzdF9mb3JtdWxhKSB7IC8qIHRlY2huaWNhbGx5IGFsd2F5cyB0cnVlICovXG5cdFx0XHRcdFx0XHRsYXN0X2Zvcm11bGEudmFsID0gdmFsO1xuXHRcdFx0XHRcdFx0dGVtcF92YWwgPSBtYWtlX2NlbGwodmFsLCBsYXN0X2Zvcm11bGEuY2VsbC5peGZlLCAncycpO1xuXHRcdFx0XHRcdFx0dGVtcF92YWwuWEYgPSBYRnNbdGVtcF92YWwuaXhmZV07XG5cdFx0XHRcdFx0XHRpZihvcHRpb25zLmNlbGxGb3JtdWxhKSB7XG5cdFx0XHRcdFx0XHRcdHRlbXBfdmFsLmYgPSBcIlwiK3N0cmluZ2lmeV9mb3JtdWxhKGxhc3RfZm9ybXVsYS5mb3JtdWxhLCByYW5nZSwgbGFzdF9mb3JtdWxhLmNlbGwsIHN1cGJvb2tzLCBvcHRzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmKEJJRkYyRm10ID4gMCkgdGVtcF92YWwueiA9IEJJRkYyRm10VGFibGVbKHRlbXBfdmFsLml4ZmU+PjgpICYgMHgzRl07XG5cdFx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0XHRhZGRjZWxsKGxhc3RfZm9ybXVsYS5jZWxsLCB0ZW1wX3ZhbCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRsYXN0X2Zvcm11bGEgPSBudWxsO1xuXHRcdFx0XHRcdH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJTdHJpbmcgcmVjb3JkIGV4cGVjdHMgRm9ybXVsYVwiKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMjE6IGNhc2UgMHgwMjIxIC8qIEFycmF5ICovOiB7XG5cdFx0XHRcdFx0YXJyYXlmLnB1c2godmFsKTtcblx0XHRcdFx0XHR2YXIgX2FycmF5c3RhcnQgPSBlbmNvZGVfY2VsbCh2YWxbMF0ucyk7XG5cdFx0XHRcdFx0Y2MgPSBvcHRpb25zLmRlbnNlID8gKG91dFt2YWxbMF0ucy5yXXx8W10pW3ZhbFswXS5zLmNdIDogb3V0W19hcnJheXN0YXJ0XTtcblx0XHRcdFx0XHRpZihvcHRpb25zLmNlbGxGb3JtdWxhICYmIGNjKSB7XG5cdFx0XHRcdFx0XHRpZighbGFzdF9mb3JtdWxhKSBicmVhazsgLyogdGVjaG5pY2FsbHkgdW5yZWFjaGFibGUgKi9cblx0XHRcdFx0XHRcdGlmKCFfYXJyYXlzdGFydCB8fCAhY2MpIGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2MuZiA9IFwiXCIrc3RyaW5naWZ5X2Zvcm11bGEodmFsWzFdLCByYW5nZSwgdmFsWzBdLCBzdXBib29rcywgb3B0cyk7XG5cdFx0XHRcdFx0XHRjYy5GID0gZW5jb2RlX3JhbmdlKHZhbFswXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDRiYyAvKiBTaHJGbWxhICovOiB7XG5cdFx0XHRcdFx0aWYoIW9wdGlvbnMuY2VsbEZvcm11bGEpIGJyZWFrO1xuXHRcdFx0XHRcdGlmKGxhc3RfY2VsbCkge1xuXHRcdFx0XHRcdFx0LyogVE9ETzogY2FwdHVyZSByYW5nZSAqL1xuXHRcdFx0XHRcdFx0aWYoIWxhc3RfZm9ybXVsYSkgYnJlYWs7IC8qIHRlY2huaWNhbGx5IHVucmVhY2hhYmxlICovXG5cdFx0XHRcdFx0XHRzaGFyZWRmW2VuY29kZV9jZWxsKGxhc3RfZm9ybXVsYS5jZWxsKV09IHZhbFswXTtcblx0XHRcdFx0XHRcdGNjID0gb3B0aW9ucy5kZW5zZSA/IChvdXRbbGFzdF9mb3JtdWxhLmNlbGwucl18fFtdKVtsYXN0X2Zvcm11bGEuY2VsbC5jXSA6IG91dFtlbmNvZGVfY2VsbChsYXN0X2Zvcm11bGEuY2VsbCldO1xuXHRcdFx0XHRcdFx0KGNjfHx7fSkuZiA9IFwiXCIrc3RyaW5naWZ5X2Zvcm11bGEodmFsWzBdLCByYW5nZSwgbGFzdGNlbGwsIHN1cGJvb2tzLCBvcHRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMGZkIC8qIExhYmVsU3N0ICovOlxuXHRcdFx0XHRcdHRlbXBfdmFsPW1ha2VfY2VsbChzc3RbdmFsLmlzc3RdLnQsIHZhbC5peGZlLCAncycpO1xuXHRcdFx0XHRcdGlmKHNzdFt2YWwuaXNzdF0uaCkgdGVtcF92YWwuaCA9IHNzdFt2YWwuaXNzdF0uaDtcblx0XHRcdFx0XHR0ZW1wX3ZhbC5YRiA9IFhGc1t0ZW1wX3ZhbC5peGZlXTtcblx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4M0ZdO1xuXHRcdFx0XHRcdHNhZmVfZm9ybWF0X3hmKHRlbXBfdmFsLCBvcHRpb25zLCB3Yi5vcHRzLkRhdGUxOTA0KTtcblx0XHRcdFx0XHRhZGRjZWxsKHtjOnZhbC5jLCByOnZhbC5yfSwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDIwMSAvKiBCbGFuayAqLzogaWYob3B0aW9ucy5zaGVldFN0dWJzKSB7XG5cdFx0XHRcdFx0dGVtcF92YWwgPSAoe2l4ZmU6IHZhbC5peGZlLCBYRjogWEZzW3ZhbC5peGZlXSwgdDoneid9Lyo6YW55Ki8pO1xuXHRcdFx0XHRcdGlmKEJJRkYyRm10ID4gMCkgdGVtcF92YWwueiA9IEJJRkYyRm10VGFibGVbKHRlbXBfdmFsLml4ZmU+PjgpICYgMHgzRl07XG5cdFx0XHRcdFx0c2FmZV9mb3JtYXRfeGYodGVtcF92YWwsIG9wdGlvbnMsIHdiLm9wdHMuRGF0ZTE5MDQpO1xuXHRcdFx0XHRcdGFkZGNlbGwoe2M6dmFsLmMsIHI6dmFsLnJ9LCB0ZW1wX3ZhbCwgb3B0aW9ucyk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMGJlIC8qIE11bEJsYW5rICovOiBpZihvcHRpb25zLnNoZWV0U3R1YnMpIHtcblx0XHRcdFx0XHRmb3IodmFyIF9qID0gdmFsLmM7IF9qIDw9IHZhbC5DOyArK19qKSB7XG5cdFx0XHRcdFx0XHR2YXIgX2l4ZmUgPSB2YWwuaXhmZVtfai12YWwuY107XG5cdFx0XHRcdFx0XHR0ZW1wX3ZhbD0gKHtpeGZlOl9peGZlLCBYRjpYRnNbX2l4ZmVdLCB0Oid6J30vKjphbnkqLyk7XG5cdFx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4M0ZdO1xuXHRcdFx0XHRcdFx0c2FmZV9mb3JtYXRfeGYodGVtcF92YWwsIG9wdGlvbnMsIHdiLm9wdHMuRGF0ZTE5MDQpO1xuXHRcdFx0XHRcdFx0YWRkY2VsbCh7Yzpfaiwgcjp2YWwucn0sIHRlbXBfdmFsLCBvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMGQ2IC8qIFJTdHJpbmcgKi86XG5cdFx0XHRcdGNhc2UgMHgwMjA0IC8qIExhYmVsICovOiBjYXNlIDB4MDAwNCAvKiBCSUZGMlNUUiAqLzpcblx0XHRcdFx0XHR0ZW1wX3ZhbD1tYWtlX2NlbGwodmFsLnZhbCwgdmFsLml4ZmUsICdzJyk7XG5cdFx0XHRcdFx0dGVtcF92YWwuWEYgPSBYRnNbdGVtcF92YWwuaXhmZV07XG5cdFx0XHRcdFx0aWYoQklGRjJGbXQgPiAwKSB0ZW1wX3ZhbC56ID0gQklGRjJGbXRUYWJsZVsodGVtcF92YWwuaXhmZT4+OCkgJiAweDNGXTtcblx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0YWRkY2VsbCh7Yzp2YWwuYywgcjp2YWwucn0sIHRlbXBfdmFsLCBvcHRpb25zKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIDB4MDAwMDogY2FzZSAweDAyMDAgLyogRGltZW5zaW9ucyAqLzoge1xuXHRcdFx0XHRcdGlmKGZpbGVfZGVwdGggPT09IDEpIHJhbmdlID0gdmFsOyAvKiBUT0RPOiBzdGFjayAqL1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDBmYyAvKiBTU1QgKi86IHtcblx0XHRcdFx0XHRzc3QgPSB2YWw7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwNDFlIC8qIEZvcm1hdCAqLzogeyAvKiB2YWwgPSBbaWQsIGZtdF0gKi9cblx0XHRcdFx0XHRpZihvcHRzLmJpZmYgPT0gNCkge1xuXHRcdFx0XHRcdFx0QklGRjJGbXRUYWJsZVtCSUZGMkZtdCsrXSA9IHZhbFsxXTtcblx0XHRcdFx0XHRcdGZvcih2YXIgYjRpZHggPSAwOyBiNGlkeCA8IEJJRkYyRm10ICsgMTYzOyArK2I0aWR4KSBpZih0YWJsZV9mbXRbYjRpZHhdID09IHZhbFsxXSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRpZihiNGlkeCA+PSAxNjMpIFNTRl9sb2FkKHZhbFsxXSwgQklGRjJGbXQgKyAxNjMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIFNTRl9sb2FkKHZhbFsxXSwgdmFsWzBdKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwMWUgLyogQklGRjJGT1JNQVQgKi86IHtcblx0XHRcdFx0XHRCSUZGMkZtdFRhYmxlW0JJRkYyRm10KytdID0gdmFsO1xuXHRcdFx0XHRcdGZvcih2YXIgYjJpZHggPSAwOyBiMmlkeCA8IEJJRkYyRm10ICsgMTYzOyArK2IyaWR4KSBpZih0YWJsZV9mbXRbYjJpZHhdID09IHZhbCkgYnJlYWs7XG5cdFx0XHRcdFx0aWYoYjJpZHggPj0gMTYzKSBTU0ZfbG9hZCh2YWwsIEJJRkYyRm10ICsgMTYzKTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHRjYXNlIDB4MDBlNSAvKiBNZXJnZUNlbGxzICovOiBtZXJnZXMgPSBtZXJnZXMuY29uY2F0KHZhbCk7IGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgMHgwMDVkIC8qIE9iaiAqLzogb2JqZWN0c1t2YWwuY21vWzBdXSA9IG9wdHMubGFzdG9iaiA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMWI2IC8qIFR4TyAqLzogb3B0cy5sYXN0b2JqLlR4TyA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDdmIC8qIEltRGF0YSAqLzogb3B0cy5sYXN0b2JqLkltRGF0YSA9IHZhbDsgYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAweDAxYjggLyogSExpbmsgKi86IHtcblx0XHRcdFx0XHRmb3Iocm5nUiA9IHZhbFswXS5zLnI7IHJuZ1IgPD0gdmFsWzBdLmUucjsgKytybmdSKVxuXHRcdFx0XHRcdFx0Zm9yKHJuZ0MgPSB2YWxbMF0ucy5jOyBybmdDIDw9IHZhbFswXS5lLmM7ICsrcm5nQykge1xuXHRcdFx0XHRcdFx0XHRjYyA9IG9wdGlvbnMuZGVuc2UgPyAob3V0W3JuZ1JdfHxbXSlbcm5nQ10gOiBvdXRbZW5jb2RlX2NlbGwoe2M6cm5nQyxyOnJuZ1J9KV07XG5cdFx0XHRcdFx0XHRcdGlmKGNjKSBjYy5sID0gdmFsWzFdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDgwMCAvKiBITGlua1Rvb2x0aXAgKi86IHtcblx0XHRcdFx0XHRmb3Iocm5nUiA9IHZhbFswXS5zLnI7IHJuZ1IgPD0gdmFsWzBdLmUucjsgKytybmdSKVxuXHRcdFx0XHRcdFx0Zm9yKHJuZ0MgPSB2YWxbMF0ucy5jOyBybmdDIDw9IHZhbFswXS5lLmM7ICsrcm5nQykge1xuXHRcdFx0XHRcdFx0XHRjYyA9IG9wdGlvbnMuZGVuc2UgPyAob3V0W3JuZ1JdfHxbXSlbcm5nQ10gOiBvdXRbZW5jb2RlX2NlbGwoe2M6cm5nQyxyOnJuZ1J9KV07XG5cdFx0XHRcdFx0XHRcdGlmKGNjICYmIGNjLmwpIGNjLmwuVG9vbHRpcCA9IHZhbFsxXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAxYyAvKiBOb3RlICovOiB7XG5cdFx0XHRcdFx0aWYob3B0cy5iaWZmIDw9IDUgJiYgb3B0cy5iaWZmID49IDIpIGJyZWFrOyAvKiBUT0RPOiBCSUZGNSAqL1xuXHRcdFx0XHRcdGNjID0gb3B0aW9ucy5kZW5zZSA/IChvdXRbdmFsWzBdLnJdfHxbXSlbdmFsWzBdLmNdIDogb3V0W2VuY29kZV9jZWxsKHZhbFswXSldO1xuXHRcdFx0XHRcdHZhciBub3Rlb2JqID0gb2JqZWN0c1t2YWxbMl1dO1xuXHRcdFx0XHRcdGlmKCFjYykge1xuXHRcdFx0XHRcdFx0aWYob3B0aW9ucy5kZW5zZSkge1xuXHRcdFx0XHRcdFx0XHRpZighb3V0W3ZhbFswXS5yXSkgb3V0W3ZhbFswXS5yXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRjYyA9IG91dFt2YWxbMF0ucl1bdmFsWzBdLmNdID0gKHt0OlwielwifS8qOmFueSovKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNjID0gb3V0W2VuY29kZV9jZWxsKHZhbFswXSldID0gKHt0OlwielwifS8qOmFueSovKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJhbmdlLmUuciA9IE1hdGgubWF4KHJhbmdlLmUuciwgdmFsWzBdLnIpO1xuXHRcdFx0XHRcdFx0cmFuZ2Uucy5yID0gTWF0aC5taW4ocmFuZ2Uucy5yLCB2YWxbMF0ucik7XG5cdFx0XHRcdFx0XHRyYW5nZS5lLmMgPSBNYXRoLm1heChyYW5nZS5lLmMsIHZhbFswXS5jKTtcblx0XHRcdFx0XHRcdHJhbmdlLnMuYyA9IE1hdGgubWluKHJhbmdlLnMuYywgdmFsWzBdLmMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZighY2MuYykgY2MuYyA9IFtdO1xuXHRcdFx0XHRcdGNtbnQgPSB7YTp2YWxbMV0sdDpub3Rlb2JqLlR4Ty50fTtcblx0XHRcdFx0XHRjYy5jLnB1c2goY21udCk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwODdkIC8qIFhGRXh0ICovOiB1cGRhdGVfeGZleHQoWEZzW3ZhbC5peGZlXSwgdmFsLmV4dCk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDA3ZCAvKiBDb2xJbmZvICovOiB7XG5cdFx0XHRcdFx0aWYoIW9wdHMuY2VsbFN0eWxlcykgYnJlYWs7XG5cdFx0XHRcdFx0d2hpbGUodmFsLmUgPj0gdmFsLnMpIHtcblx0XHRcdFx0XHRcdGNvbGluZm9bdmFsLmUtLV0gPSB7IHdpZHRoOiB2YWwudy8yNTYsIGxldmVsOiAodmFsLmxldmVsIHx8IDApLCBoaWRkZW46ICEhKHZhbC5mbGFncyAmIDEpIH07XG5cdFx0XHRcdFx0XHRpZighc2VlbmNvbCkgeyBzZWVuY29sID0gdHJ1ZTsgZmluZF9tZHdfY29sdyh2YWwudy8yNTYpOyB9XG5cdFx0XHRcdFx0XHRwcm9jZXNzX2NvbChjb2xpbmZvW3ZhbC5lKzFdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMjA4IC8qIFJvdyAqLzoge1xuXHRcdFx0XHRcdHZhciByb3dvYmogPSB7fTtcblx0XHRcdFx0XHRpZih2YWwubGV2ZWwgIT0gbnVsbCkgeyByb3dpbmZvW3ZhbC5yXSA9IHJvd29iajsgcm93b2JqLmxldmVsID0gdmFsLmxldmVsOyB9XG5cdFx0XHRcdFx0aWYodmFsLmhpZGRlbikgeyByb3dpbmZvW3ZhbC5yXSA9IHJvd29iajsgcm93b2JqLmhpZGRlbiA9IHRydWU7IH1cblx0XHRcdFx0XHRpZih2YWwuaHB0KSB7XG5cdFx0XHRcdFx0XHRyb3dpbmZvW3ZhbC5yXSA9IHJvd29iajtcblx0XHRcdFx0XHRcdHJvd29iai5ocHQgPSB2YWwuaHB0OyByb3dvYmouaHB4ID0gcHQycHgodmFsLmhwdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDAyNiAvKiBMZWZ0TWFyZ2luICovOlxuXHRcdFx0XHRjYXNlIDB4MDAyNyAvKiBSaWdodE1hcmdpbiAqLzpcblx0XHRcdFx0Y2FzZSAweDAwMjggLyogVG9wTWFyZ2luICovOlxuXHRcdFx0XHRjYXNlIDB4MDAyOSAvKiBCb3R0b21NYXJnaW4gKi86XG5cdFx0XHRcdFx0aWYoIW91dFsnIW1hcmdpbnMnXSkgZGVmYXVsdF9tYXJnaW5zKG91dFsnIW1hcmdpbnMnXSA9IHt9KTtcblx0XHRcdFx0XHRvdXRbJyFtYXJnaW5zJ11bKHsweDI2OiBcImxlZnRcIiwgMHgyNzpcInJpZ2h0XCIsIDB4Mjg6XCJ0b3BcIiwgMHgyOTpcImJvdHRvbVwifSlbUmVjb3JkVHlwZV1dID0gdmFsO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDBhMSAvKiBTZXR1cCAqLzogLy8gVE9ET1xuXHRcdFx0XHRcdGlmKCFvdXRbJyFtYXJnaW5zJ10pIGRlZmF1bHRfbWFyZ2lucyhvdXRbJyFtYXJnaW5zJ10gPSB7fSk7XG5cdFx0XHRcdFx0b3V0WychbWFyZ2lucyddLmhlYWRlciA9IHZhbC5oZWFkZXI7XG5cdFx0XHRcdFx0b3V0WychbWFyZ2lucyddLmZvb3RlciA9IHZhbC5mb290ZXI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMjNlIC8qIFdpbmRvdzIgKi86IC8vIFRPRE9cblx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdGlmKHZhbC5SVEwpIFdvcmtib29rLlZpZXdzWzBdLlJUTCA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMDkyIC8qIFBhbGV0dGUgKi86IHBhbGV0dGUgPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDg5NiAvKiBUaGVtZSAqLzogdGhlbWVzID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAweDAwOGMgLyogQ291bnRyeSAqLzogY291bnRyeSA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMHgwMWJhIC8qIENvZGVOYW1lICovOiB7XG5cdFx0XHRcdFx0Lyo6OiBpZighV29ya2Jvb2suV0JQcm9wcykgV29ya2Jvb2suV0JQcm9wcyA9IHt9OyAqL1xuXHRcdFx0XHRcdGlmKCFjdXJfc2hlZXQpIFdvcmtib29rLldCUHJvcHMuQ29kZU5hbWUgPSB2YWwgfHwgXCJUaGlzV29ya2Jvb2tcIjtcblx0XHRcdFx0XHRlbHNlIHdzcHJvcHMuQ29kZU5hbWUgPSB2YWwgfHwgd3Nwcm9wcy5uYW1lO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZighUikgY29uc29sZS5lcnJvcihcIk1pc3NpbmcgSW5mbyBmb3IgWExTIFJlY29yZCAweFwiICsgUmVjb3JkVHlwZS50b1N0cmluZygxNikpO1xuXHRcdFx0YmxvYi5sICs9IGxlbmd0aDtcblx0XHR9XG5cdH1cblx0d2IuU2hlZXROYW1lcz1rZXlzKERpcmVjdG9yeSkuc29ydChmdW5jdGlvbihhLGIpIHsgcmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTsgfSkubWFwKGZ1bmN0aW9uKHgpe3JldHVybiBEaXJlY3RvcnlbeF0ubmFtZTt9KTtcblx0aWYoIW9wdGlvbnMuYm9va1NoZWV0cykgd2IuU2hlZXRzPVNoZWV0cztcblx0aWYoIXdiLlNoZWV0TmFtZXMubGVuZ3RoICYmIFByZWFtYmxlW1wiIXJlZlwiXSkge1xuXHRcdHdiLlNoZWV0TmFtZXMucHVzaChcIlNoZWV0MVwiKTtcblx0XHQvKmpzaGludCAtVzA2OSAqL1xuXHRcdGlmKHdiLlNoZWV0cykgd2IuU2hlZXRzW1wiU2hlZXQxXCJdID0gUHJlYW1ibGU7XG5cdFx0Lypqc2hpbnQgK1cwNjkgKi9cblx0fSBlbHNlIHdiLlByZWFtYmxlPVByZWFtYmxlO1xuXHRpZih3Yi5TaGVldHMpIEZpbHRlckRhdGFiYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKHIsaSkgeyB3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpXV1bJyFhdXRvZmlsdGVyJ10gPSByOyB9KTtcblx0d2IuU3RyaW5ncyA9IHNzdDtcblx0d2IuU1NGID0gZHVwKHRhYmxlX2ZtdCk7XG5cdGlmKG9wdHMuZW5jKSB3Yi5FbmNyeXB0aW9uID0gb3B0cy5lbmM7XG5cdGlmKHRoZW1lcykgd2IuVGhlbWVzID0gdGhlbWVzO1xuXHR3Yi5NZXRhZGF0YSA9IHt9O1xuXHRpZihjb3VudHJ5ICE9PSB1bmRlZmluZWQpIHdiLk1ldGFkYXRhLkNvdW50cnkgPSBjb3VudHJ5O1xuXHRpZihzdXBib29rcy5uYW1lcy5sZW5ndGggPiAwKSBXb3JrYm9vay5OYW1lcyA9IHN1cGJvb2tzLm5hbWVzO1xuXHR3Yi5Xb3JrYm9vayA9IFdvcmtib29rO1xuXHRyZXR1cm4gd2I7XG59XG5cbi8qIFRPRE86IHNwbGl0IHByb3BzKi9cbnZhciBQU0NMU0lEID0ge1xuXHRTSTogXCJlMDg1OWZmMmY5NGY2ODEwYWI5MTA4MDAyYjI3YjNkOVwiLFxuXHREU0k6IFwiMDJkNWNkZDU5YzJlMWIxMDkzOTcwODAwMmIyY2Y5YWVcIixcblx0VURJOiBcIjA1ZDVjZGQ1OWMyZTFiMTA5Mzk3MDgwMDJiMmNmOWFlXCJcbn07XG5mdW5jdGlvbiBwYXJzZV94bHNfcHJvcHMoY2ZiLyo6Q0ZCQ29udGFpbmVyKi8sIHByb3BzLCBvKSB7XG5cdC8qIFtNUy1PU0hBUkVEXSAyLjMuMy4yLjIgRG9jdW1lbnQgU3VtbWFyeSBJbmZvcm1hdGlvbiBQcm9wZXJ0eSBTZXQgKi9cblx0dmFyIERTSSA9IENGQi5maW5kKGNmYiwgJy8hRG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb24nKTtcblx0aWYoRFNJICYmIERTSS5zaXplID4gMCkgdHJ5IHtcblx0XHR2YXIgRG9jU3VtbWFyeSA9IHBhcnNlX1Byb3BlcnR5U2V0U3RyZWFtKERTSSwgRG9jU3VtbWFyeVBJRERTSSwgUFNDTFNJRC5EU0kpO1xuXHRcdGZvcih2YXIgZCBpbiBEb2NTdW1tYXJ5KSBwcm9wc1tkXSA9IERvY1N1bW1hcnlbZF07XG5cdH0gY2F0Y2goZSkge2lmKG8uV1RGKSB0aHJvdyBlOy8qIGVtcHR5ICovfVxuXG5cdC8qIFtNUy1PU0hBUkVEXSAyLjMuMy4yLjEgU3VtbWFyeSBJbmZvcm1hdGlvbiBQcm9wZXJ0eSBTZXQqL1xuXHR2YXIgU0kgPSBDRkIuZmluZChjZmIsICcvIVN1bW1hcnlJbmZvcm1hdGlvbicpO1xuXHRpZihTSSAmJiBTSS5zaXplID4gMCkgdHJ5IHtcblx0XHR2YXIgU3VtbWFyeSA9IHBhcnNlX1Byb3BlcnR5U2V0U3RyZWFtKFNJLCBTdW1tYXJ5UElEU0ksIFBTQ0xTSUQuU0kpO1xuXHRcdGZvcih2YXIgcyBpbiBTdW1tYXJ5KSBpZihwcm9wc1tzXSA9PSBudWxsKSBwcm9wc1tzXSA9IFN1bW1hcnlbc107XG5cdH0gY2F0Y2goZSkge2lmKG8uV1RGKSB0aHJvdyBlOy8qIGVtcHR5ICovfVxuXG5cdGlmKHByb3BzLkhlYWRpbmdQYWlycyAmJiBwcm9wcy5UaXRsZXNPZlBhcnRzKSB7XG5cdFx0bG9hZF9wcm9wc19wYWlycyhwcm9wcy5IZWFkaW5nUGFpcnMsIHByb3BzLlRpdGxlc09mUGFydHMsIHByb3BzLCBvKTtcblx0XHRkZWxldGUgcHJvcHMuSGVhZGluZ1BhaXJzOyBkZWxldGUgcHJvcHMuVGl0bGVzT2ZQYXJ0cztcblx0fVxufVxuZnVuY3Rpb24gd3JpdGVfeGxzX3Byb3BzKHdiLyo6V29ya2Jvb2sqLywgY2ZiLyo6Q0ZCQ29udGFpbmVyKi8pIHtcblx0dmFyIERTRW50cmllcyA9IFtdLCBTRW50cmllcyA9IFtdLCBDRW50cmllcyA9IFtdO1xuXHR2YXIgaSA9IDAsIEtleXM7XG5cdHZhciBEb2NTdW1tYXJ5UkUvKjp7W2tleTpzdHJpbmddOnN0cmluZ30qLyA9IGV2ZXJ0X2tleShEb2NTdW1tYXJ5UElERFNJLCBcIm5cIik7XG5cdHZhciBTdW1tYXJ5UkUvKjp7W2tleTpzdHJpbmddOnN0cmluZ30qLyA9IGV2ZXJ0X2tleShTdW1tYXJ5UElEU0ksIFwiblwiKTtcblx0aWYod2IuUHJvcHMpIHtcblx0XHRLZXlzID0ga2V5cyh3Yi5Qcm9wcyk7XG5cdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRmb3IoaSA9IDA7IGkgPCBLZXlzLmxlbmd0aDsgKytpKSAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKERvY1N1bW1hcnlSRSwgS2V5c1tpXSkgPyBEU0VudHJpZXMgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoU3VtbWFyeVJFLCBLZXlzW2ldKSA/IFNFbnRyaWVzIDogQ0VudHJpZXMpLnB1c2goW0tleXNbaV0sIHdiLlByb3BzW0tleXNbaV1dXSk7XG5cdH1cblx0aWYod2IuQ3VzdHByb3BzKSB7XG5cdFx0S2V5cyA9IGtleXMod2IuQ3VzdHByb3BzKTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdGZvcihpID0gMDsgaSA8IEtleXMubGVuZ3RoOyArK2kpIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoKHdiLlByb3BzfHx7fSksIEtleXNbaV0pKSAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKERvY1N1bW1hcnlSRSwgS2V5c1tpXSkgPyBEU0VudHJpZXMgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoU3VtbWFyeVJFLCBLZXlzW2ldKSA/IFNFbnRyaWVzIDogQ0VudHJpZXMpLnB1c2goW0tleXNbaV0sIHdiLkN1c3Rwcm9wc1tLZXlzW2ldXV0pO1xuXHR9XG5cdHZhciBDRW50cmllczIgPSBbXTtcblx0Zm9yKGkgPSAwOyBpIDwgQ0VudHJpZXMubGVuZ3RoOyArK2kpIHtcblx0XHRpZihYTFNQU1NraXAuaW5kZXhPZihDRW50cmllc1tpXVswXSkgPiAtMSB8fCBQc2V1ZG9Qcm9wc1BhaXJzLmluZGV4T2YoQ0VudHJpZXNbaV1bMF0pID4gLTEpIGNvbnRpbnVlO1xuXHRcdGlmKENFbnRyaWVzW2ldWzFdID09IG51bGwpIGNvbnRpbnVlO1xuXHRcdENFbnRyaWVzMi5wdXNoKENFbnRyaWVzW2ldKTtcblx0fVxuXHRpZihTRW50cmllcy5sZW5ndGgpIENGQi51dGlscy5jZmJfYWRkKGNmYiwgXCIvXFx1MDAwNVN1bW1hcnlJbmZvcm1hdGlvblwiLCB3cml0ZV9Qcm9wZXJ0eVNldFN0cmVhbShTRW50cmllcywgUFNDTFNJRC5TSSwgU3VtbWFyeVJFLCBTdW1tYXJ5UElEU0kpKTtcblx0aWYoRFNFbnRyaWVzLmxlbmd0aCB8fCBDRW50cmllczIubGVuZ3RoKSBDRkIudXRpbHMuY2ZiX2FkZChjZmIsIFwiL1xcdTAwMDVEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvblwiLCB3cml0ZV9Qcm9wZXJ0eVNldFN0cmVhbShEU0VudHJpZXMsIFBTQ0xTSUQuRFNJLCBEb2NTdW1tYXJ5UkUsIERvY1N1bW1hcnlQSUREU0ksIENFbnRyaWVzMi5sZW5ndGggPyBDRW50cmllczIgOiBudWxsLCBQU0NMU0lELlVESSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV94bHNjZmIoY2ZiLyo6YW55Ki8sIG9wdGlvbnMvKjo/UGFyc2VPcHRzKi8pLyo6V29ya2Jvb2sqLyB7XG5pZighb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuZml4X3JlYWRfb3B0cyhvcHRpb25zKTtcbnJlc2V0X2NwKCk7XG5pZihvcHRpb25zLmNvZGVwYWdlKSBzZXRfYW5zaShvcHRpb25zLmNvZGVwYWdlKTtcbnZhciBDb21wT2JqLyo6P0NGQkVudHJ5Ki8sIFdCLyo6P2FueSovO1xuaWYoY2ZiLkZ1bGxQYXRocykge1xuXHRpZihDRkIuZmluZChjZmIsICcvZW5jcnlwdGlvbicpKSB0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGlzIHBhc3N3b3JkLXByb3RlY3RlZFwiKTtcblx0Q29tcE9iaiA9IENGQi5maW5kKGNmYiwgJyFDb21wT2JqJyk7XG5cdFdCID0gQ0ZCLmZpbmQoY2ZiLCAnL1dvcmtib29rJykgfHwgQ0ZCLmZpbmQoY2ZiLCAnL0Jvb2snKTtcbn0gZWxzZSB7XG5cdHN3aXRjaChvcHRpb25zLnR5cGUpIHtcblx0XHRjYXNlICdiYXNlNjQnOiBjZmIgPSBzMmEoQmFzZTY0X2RlY29kZShjZmIpKTsgYnJlYWs7XG5cdFx0Y2FzZSAnYmluYXJ5JzogY2ZiID0gczJhKGNmYik7IGJyZWFrO1xuXHRcdGNhc2UgJ2J1ZmZlcic6IGJyZWFrO1xuXHRcdGNhc2UgJ2FycmF5JzogaWYoIUFycmF5LmlzQXJyYXkoY2ZiKSkgY2ZiID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY2ZiKTsgYnJlYWs7XG5cdH1cblx0cHJlcF9ibG9iKGNmYiwgMCk7XG5cdFdCID0gKHtjb250ZW50OiBjZmJ9Lyo6YW55Ki8pO1xufVxudmFyIC8qOjpDb21wT2JqUCwgKi9Xb3JrYm9va1AvKjo6IDpXb3JrYm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTsgKi87XG5cbnZhciBfZGF0YS8qOj9hbnkqLztcbmlmKENvbXBPYmopIC8qOjpDb21wT2JqUCA9ICovcGFyc2VfY29tcG9iaihDb21wT2JqKTtcbmlmKG9wdGlvbnMuYm9va1Byb3BzICYmICFvcHRpb25zLmJvb2tTaGVldHMpIFdvcmtib29rUCA9ICh7fS8qOmFueSovKTtcbmVsc2UvKjo6IGlmKGNmYiBpbnN0YW5jZW9mIENGQkNvbnRhaW5lcikgKi8ge1xuXHR2YXIgVCA9IGhhc19idWYgPyAnYnVmZmVyJyA6ICdhcnJheSc7XG5cdGlmKFdCICYmIFdCLmNvbnRlbnQpIFdvcmtib29rUCA9IHBhcnNlX3dvcmtib29rKFdCLmNvbnRlbnQsIG9wdGlvbnMpO1xuXHQvKiBRdWF0dHJvIFBybyA3LTggKi9cblx0ZWxzZSBpZigoX2RhdGE9Q0ZCLmZpbmQoY2ZiLCAnUGVyZmVjdE9mZmljZV9NQUlOJykpICYmIF9kYXRhLmNvbnRlbnQpIFdvcmtib29rUCA9IFdLXy50b193b3JrYm9vayhfZGF0YS5jb250ZW50LCAob3B0aW9ucy50eXBlID0gVCwgb3B0aW9ucykpO1xuXHQvKiBRdWF0dHJvIFBybyA5ICovXG5cdGVsc2UgaWYoKF9kYXRhPUNGQi5maW5kKGNmYiwgJ05hdGl2ZUNvbnRlbnRfTUFJTicpKSAmJiBfZGF0YS5jb250ZW50KSBXb3JrYm9va1AgPSBXS18udG9fd29ya2Jvb2soX2RhdGEuY29udGVudCwgKG9wdGlvbnMudHlwZSA9IFQsIG9wdGlvbnMpKTtcblx0LyogV29ya3MgNCBmb3IgTWFjICovXG5cdGVsc2UgaWYoKF9kYXRhPUNGQi5maW5kKGNmYiwgJ01OMCcpKSAmJiBfZGF0YS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBXb3JrcyA0IGZvciBNYWMgZmlsZVwiKTtcblx0ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBXb3JrYm9vayBzdHJlYW1cIik7XG5cdGlmKG9wdGlvbnMuYm9va1ZCQSAmJiBjZmIuRnVsbFBhdGhzICYmIENGQi5maW5kKGNmYiwgJy9fVkJBX1BST0pFQ1RfQ1VSL1ZCQS9kaXInKSkgV29ya2Jvb2tQLnZiYXJhdyA9IG1ha2VfdmJhX3hscyhjZmIpO1xufVxuXG52YXIgcHJvcHMgPSB7fTtcbmlmKGNmYi5GdWxsUGF0aHMpIHBhcnNlX3hsc19wcm9wcygvKjo6KCgqL2NmYi8qOjogOmFueSk6Q0ZCQ29udGFpbmVyKSovLCBwcm9wcywgb3B0aW9ucyk7XG5cbldvcmtib29rUC5Qcm9wcyA9IFdvcmtib29rUC5DdXN0cHJvcHMgPSBwcm9wczsgLyogVE9ETzogc3BsaXQgdXAgcHJvcGVydGllcyAqL1xuaWYob3B0aW9ucy5ib29rRmlsZXMpIFdvcmtib29rUC5jZmIgPSBjZmI7XG4vKldvcmtib29rUC5Db21wT2JqUCA9IENvbXBPYmpQOyAvLyBUT0RPOiBzdG9yYWdlPyAqL1xucmV0dXJuIFdvcmtib29rUDtcbn1cblxuXG5mdW5jdGlvbiB3cml0ZV94bHNjZmIod2IvKjpXb3JrYm9vayovLCBvcHRzLyo6V3JpdGVPcHRzKi8pLyo6Q0ZCQ29udGFpbmVyKi8ge1xuXHR2YXIgbyA9IG9wdHMgfHwge307XG5cdHZhciBjZmIgPSBDRkIudXRpbHMuY2ZiX25ldyh7cm9vdDpcIlJcIn0pO1xuXHR2YXIgd2JwYXRoID0gXCIvV29ya2Jvb2tcIjtcblx0c3dpdGNoKG8uYm9va1R5cGUgfHwgXCJ4bHNcIikge1xuXHRcdGNhc2UgXCJ4bHNcIjogby5ib29rVHlwZSA9IFwiYmlmZjhcIjtcblx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSBcInhsYVwiOiBpZighby5ib29rVHlwZSkgby5ib29rVHlwZSA9IFwieGxhXCI7XG5cdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgXCJiaWZmOFwiOiB3YnBhdGggPSBcIi9Xb3JrYm9va1wiOyBvLmJpZmYgPSA4OyBicmVhaztcblx0XHRjYXNlIFwiYmlmZjVcIjogd2JwYXRoID0gXCIvQm9va1wiOyBvLmJpZmYgPSA1OyBicmVhaztcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHR5cGUgXCIgKyBvLmJvb2tUeXBlICsgXCIgZm9yIFhMUyBDRkJcIik7XG5cdH1cblx0Q0ZCLnV0aWxzLmNmYl9hZGQoY2ZiLCB3YnBhdGgsIHdyaXRlX2JpZmZfYnVmKHdiLCBvKSk7XG5cdGlmKG8uYmlmZiA9PSA4ICYmICh3Yi5Qcm9wcyB8fCB3Yi5DdXN0cHJvcHMpKSB3cml0ZV94bHNfcHJvcHMod2IsIGNmYik7XG5cdC8vIFRPRE86IFNJLCBEU0ksIENPXG5cdGlmKG8uYmlmZiA9PSA4ICYmIHdiLnZiYXJhdykgZmlsbF92YmFfeGxzKGNmYiwgQ0ZCLnJlYWQod2IudmJhcmF3LCB7dHlwZTogdHlwZW9mIHdiLnZiYXJhdyA9PSBcInN0cmluZ1wiID8gXCJiaW5hcnlcIiA6IFwiYnVmZmVyXCJ9KSk7XG5cdHJldHVybiBjZmI7XG59XG4vKiBbTVMtWExTQl0gMi4zIFJlY29yZCBFbnVtZXJhdGlvbiAqL1xudmFyIFhMU0JSZWNvcmRFbnVtID0ge1xuXHQvKjo6WyovMHgwMDAwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Um93SGRyXCIsICovIGY6cGFyc2VfQnJ0Um93SGRyIH0sXG5cdC8qOjpbKi8weDAwMDEvKjo6XSovOiB7IC8qIG46XCJCcnRDZWxsQmxhbmtcIiwgKi8gZjpwYXJzZV9CcnRDZWxsQmxhbmsgfSxcblx0Lyo6OlsqLzB4MDAwMi8qOjpdKi86IHsgLyogbjpcIkJydENlbGxSa1wiLCAqLyBmOnBhcnNlX0JydENlbGxSayB9LFxuXHQvKjo6WyovMHgwMDAzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q2VsbEVycm9yXCIsICovIGY6cGFyc2VfQnJ0Q2VsbEVycm9yIH0sXG5cdC8qOjpbKi8weDAwMDQvKjo6XSovOiB7IC8qIG46XCJCcnRDZWxsQm9vbFwiLCAqLyBmOnBhcnNlX0JydENlbGxCb29sIH0sXG5cdC8qOjpbKi8weDAwMDUvKjo6XSovOiB7IC8qIG46XCJCcnRDZWxsUmVhbFwiLCAqLyBmOnBhcnNlX0JydENlbGxSZWFsIH0sXG5cdC8qOjpbKi8weDAwMDYvKjo6XSovOiB7IC8qIG46XCJCcnRDZWxsU3RcIiwgKi8gZjpwYXJzZV9CcnRDZWxsU3QgfSxcblx0Lyo6OlsqLzB4MDAwNy8qOjpdKi86IHsgLyogbjpcIkJydENlbGxJc3N0XCIsICovIGY6cGFyc2VfQnJ0Q2VsbElzc3QgfSxcblx0Lyo6OlsqLzB4MDAwOC8qOjpdKi86IHsgLyogbjpcIkJydEZtbGFTdHJpbmdcIiwgKi8gZjpwYXJzZV9CcnRGbWxhU3RyaW5nIH0sXG5cdC8qOjpbKi8weDAwMDkvKjo6XSovOiB7IC8qIG46XCJCcnRGbWxhTnVtXCIsICovIGY6cGFyc2VfQnJ0Rm1sYU51bSB9LFxuXHQvKjo6WyovMHgwMDBBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Rm1sYUJvb2xcIiwgKi8gZjpwYXJzZV9CcnRGbWxhQm9vbCB9LFxuXHQvKjo6WyovMHgwMDBCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Rm1sYUVycm9yXCIsICovIGY6cGFyc2VfQnJ0Rm1sYUVycm9yIH0sXG5cdC8qOjpbKi8weDAwMEMvKjo6XSovOiB7IC8qIG46XCJCcnRTaG9ydEJsYW5rXCIsICovIGY6cGFyc2VfQnJ0U2hvcnRCbGFuayB9LFxuXHQvKjo6WyovMHgwMDBELyo6Ol0qLzogeyAvKiBuOlwiQnJ0U2hvcnRSa1wiLCAqLyBmOnBhcnNlX0JydFNob3J0UmsgfSxcblx0Lyo6OlsqLzB4MDAwRS8qOjpdKi86IHsgLyogbjpcIkJydFNob3J0RXJyb3JcIiwgKi8gZjpwYXJzZV9CcnRTaG9ydEVycm9yIH0sXG5cdC8qOjpbKi8weDAwMEYvKjo6XSovOiB7IC8qIG46XCJCcnRTaG9ydEJvb2xcIiwgKi8gZjpwYXJzZV9CcnRTaG9ydEJvb2wgfSxcblx0Lyo6OlsqLzB4MDAxMC8qOjpdKi86IHsgLyogbjpcIkJydFNob3J0UmVhbFwiLCAqLyBmOnBhcnNlX0JydFNob3J0UmVhbCB9LFxuXHQvKjo6WyovMHgwMDExLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U2hvcnRTdFwiLCAqLyBmOnBhcnNlX0JydFNob3J0U3QgfSxcblx0Lyo6OlsqLzB4MDAxMi8qOjpdKi86IHsgLyogbjpcIkJydFNob3J0SXNzdFwiLCAqLyBmOnBhcnNlX0JydFNob3J0SXNzdCB9LFxuXHQvKjo6WyovMHgwMDEzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U1NUSXRlbVwiLCAqLyBmOnBhcnNlX1JpY2hTdHIgfSxcblx0Lyo6OlsqLzB4MDAxNC8qOjpdKi86IHsgLyogbjpcIkJydFBDRElNaXNzaW5nXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDAxNS8qOjpdKi86IHsgLyogbjpcIkJydFBDRElOdW1iZXJcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDE2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESUJvb2xlYW5cIiAqLyB9LFxuXHQvKjo6WyovMHgwMDE3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESUVycm9yXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDAxOC8qOjpdKi86IHsgLyogbjpcIkJydFBDRElTdHJpbmdcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDE5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESURhdGV0aW1lXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDAxQS8qOjpdKi86IHsgLyogbjpcIkJydFBDRElJbmRleFwiICovIH0sXG5cdC8qOjpbKi8weDAwMUIvKjo6XSovOiB7IC8qIG46XCJCcnRQQ0RJQU1pc3NpbmdcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDFDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESUFOdW1iZXJcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDFELyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESUFCb29sZWFuXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDAxRS8qOjpdKi86IHsgLyogbjpcIkJydFBDRElBRXJyb3JcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDFGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESUFTdHJpbmdcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDIwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESUFEYXRldGltZVwiICovIH0sXG5cdC8qOjpbKi8weDAwMjEvKjo6XSovOiB7IC8qIG46XCJCcnRQQ1JSZWNvcmRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDIyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENSUmVjb3JkRHRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDIzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RlJUQmVnaW5cIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwMjQvKjo6XSovOiB7IC8qIG46XCJCcnRGUlRFbmRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMDI1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QUNCZWdpblwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDAyNi8qOjpdKi86IHsgLyogbjpcIkJydEFDRW5kXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDAyNy8qOjpdKi86IHsgLyogbjpcIkJydE5hbWVcIiwgKi8gZjpwYXJzZV9CcnROYW1lIH0sXG5cdC8qOjpbKi8weDAwMjgvKjo6XSovOiB7IC8qIG46XCJCcnRJbmRleFJvd0Jsb2NrXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDAyQS8qOjpdKi86IHsgLyogbjpcIkJydEluZGV4QmxvY2tcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDJCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Rm9udFwiLCAqLyBmOnBhcnNlX0JydEZvbnQgfSxcblx0Lyo6OlsqLzB4MDAyQy8qOjpdKi86IHsgLyogbjpcIkJydEZtdFwiLCAqLyBmOnBhcnNlX0JydEZtdCB9LFxuXHQvKjo6WyovMHgwMDJELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RmlsbFwiLCAqLyBmOnBhcnNlX0JydEZpbGwgfSxcblx0Lyo6OlsqLzB4MDAyRS8qOjpdKi86IHsgLyogbjpcIkJydEJvcmRlclwiLCAqLyBmOnBhcnNlX0JydEJvcmRlciB9LFxuXHQvKjo6WyovMHgwMDJGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0WEZcIiwgKi8gZjpwYXJzZV9CcnRYRiB9LFxuXHQvKjo6WyovMHgwMDMwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U3R5bGVcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDMxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q2VsbE1ldGFcIiwgKi8gZjpwYXJzZV9JbnQzMkxFIH0sXG5cdC8qOjpbKi8weDAwMzIvKjo6XSovOiB7IC8qIG46XCJCcnRWYWx1ZU1ldGFcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDMzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0TWRiXCIgKi8gZjpwYXJzZV9CcnRNZGIgfSxcblx0Lyo6OlsqLzB4MDAzNC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRm1kXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMDM1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRm1kXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDAzNi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTWR4XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMDM3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTWR4XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDAzOC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTWR4VHVwbGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwMzkvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRNZHhUdXBsZVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwM0EvKjo6XSovOiB7IC8qIG46XCJCcnRNZHhNYnJJc3RyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDAzQi8qOjpdKi86IHsgLyogbjpcIkJydFN0clwiICovIH0sXG5cdC8qOjpbKi8weDAwM0MvKjo6XSovOiB7IC8qIG46XCJCcnRDb2xJbmZvXCIsICovIGY6cGFyc2VfQ29sSW5mbyB9LFxuXHQvKjo6WyovMHgwMDNFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q2VsbFJTdHJpbmdcIiwgKi8gZjpwYXJzZV9CcnRDZWxsUlN0cmluZyB9LFxuXHQvKjo6WyovMHgwMDNGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q2FsY0NoYWluSXRlbSRcIiwgKi8gZjpwYXJzZV9CcnRDYWxjQ2hhaW5JdGVtJCB9LFxuXHQvKjo6WyovMHgwMDQwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RFZhbFwiLCAqLyBmOnBhcnNlX0JydERWYWwgfSxcblx0Lyo6OlsqLzB4MDA0MS8qOjpdKi86IHsgLyogbjpcIkJydFN4dmNlbGxOdW1cIiAqLyB9LFxuXHQvKjo6WyovMHgwMDQyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U3h2Y2VsbFN0clwiICovIH0sXG5cdC8qOjpbKi8weDAwNDMvKjo6XSovOiB7IC8qIG46XCJCcnRTeHZjZWxsQm9vbFwiICovIH0sXG5cdC8qOjpbKi8weDAwNDQvKjo6XSovOiB7IC8qIG46XCJCcnRTeHZjZWxsRXJyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDA0NS8qOjpdKi86IHsgLyogbjpcIkJydFN4dmNlbGxEYXRlXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDA0Ni8qOjpdKi86IHsgLyogbjpcIkJydFN4dmNlbGxOaWxcIiAqLyB9LFxuXHQvKjo6WyovMHgwMDgwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RmlsZVZlcnNpb25cIiAqLyB9LFxuXHQvKjo6WyovMHgwMDgxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TaGVldFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDA4Mi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNoZWV0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDA4My8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQm9va1wiLCAqLyBUOjEsIGY6cGFyc2Vub29wLCBwOjAgfSxcblx0Lyo6OlsqLzB4MDA4NC8qOjpdKi86IHsgLyogbjpcIkJydEVuZEJvb2tcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMDg1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Xc1ZpZXdzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMDg2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kV3NWaWV3c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwODcvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkJvb2tWaWV3c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDA4OC8qOjpdKi86IHsgLyogbjpcIkJydEVuZEJvb2tWaWV3c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwODkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbldzVmlld1wiLCAqLyBUOjEsIGY6cGFyc2VfQnJ0QmVnaW5Xc1ZpZXcgfSxcblx0Lyo6OlsqLzB4MDA4QS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFdzVmlld1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwOEIvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkNzVmlld3NcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwOEMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDc1ZpZXdzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDA4RC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ3NWaWV3XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMDhFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQ3NWaWV3XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDA4Ri8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQnVuZGxlU2hzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMDkwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQnVuZGxlU2hzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDA5MS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU2hlZXREYXRhXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMDkyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2hlZXREYXRhXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDA5My8qOjpdKi86IHsgLyogbjpcIkJydFdzUHJvcFwiLCAqLyBmOnBhcnNlX0JydFdzUHJvcCB9LFxuXHQvKjo6WyovMHgwMDk0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0V3NEaW1cIiwgKi8gZjpwYXJzZV9CcnRXc0RpbSwgcDoxNiB9LFxuXHQvKjo6WyovMHgwMDk3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UGFuZVwiLCAqLyBmOnBhcnNlX0JydFBhbmUgfSxcblx0Lyo6OlsqLzB4MDA5OC8qOjpdKi86IHsgLyogbjpcIkJydFNlbFwiICovIH0sXG5cdC8qOjpbKi8weDAwOTkvKjo6XSovOiB7IC8qIG46XCJCcnRXYlByb3BcIiwgKi8gZjpwYXJzZV9CcnRXYlByb3AgfSxcblx0Lyo6OlsqLzB4MDA5QS8qOjpdKi86IHsgLyogbjpcIkJydFdiRmFjdG9pZFwiICovIH0sXG5cdC8qOjpbKi8weDAwOUIvKjo6XSovOiB7IC8qIG46XCJCcnRGaWxlUmVjb3ZlclwiICovIH0sXG5cdC8qOjpbKi8weDAwOUMvKjo6XSovOiB7IC8qIG46XCJCcnRCdW5kbGVTaFwiLCAqLyBmOnBhcnNlX0JydEJ1bmRsZVNoIH0sXG5cdC8qOjpbKi8weDAwOUQvKjo6XSovOiB7IC8qIG46XCJCcnRDYWxjUHJvcFwiICovIH0sXG5cdC8qOjpbKi8weDAwOUUvKjo6XSovOiB7IC8qIG46XCJCcnRCb29rVmlld1wiICovIH0sXG5cdC8qOjpbKi8weDAwOUYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNzdFwiLCAqLyBUOjEsIGY6cGFyc2VfQnJ0QmVnaW5Tc3QgfSxcblx0Lyo6OlsqLzB4MDBBMC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNzdFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQTEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkFGaWx0ZXJcIiwgKi8gVDoxLCBmOnBhcnNlX1VuY2hlY2tlZFJmWCB9LFxuXHQvKjo6WyovMHgwMEEyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQUZpbHRlclwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQTMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkZpbHRlckNvbHVtblwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBBNC8qOjpdKi86IHsgLyogbjpcIkJydEVuZEZpbHRlckNvbHVtblwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQTUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkZpbHRlcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQTYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRGaWx0ZXJzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBBNy8qOjpdKi86IHsgLyogbjpcIkJydEZpbHRlclwiICovIH0sXG5cdC8qOjpbKi8weDAwQTgvKjo6XSovOiB7IC8qIG46XCJCcnRDb2xvckZpbHRlclwiICovIH0sXG5cdC8qOjpbKi8weDAwQTkvKjo6XSovOiB7IC8qIG46XCJCcnRJY29uRmlsdGVyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDBBQS8qOjpdKi86IHsgLyogbjpcIkJydFRvcDEwRmlsdGVyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDBBQi8qOjpdKi86IHsgLyogbjpcIkJydER5bmFtaWNGaWx0ZXJcIiAqLyB9LFxuXHQvKjo6WyovMHgwMEFDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DdXN0b21GaWx0ZXJzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEFELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQ3VzdG9tRmlsdGVyc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQUUvKjo6XSovOiB7IC8qIG46XCJCcnRDdXN0b21GaWx0ZXJcIiAqLyB9LFxuXHQvKjo6WyovMHgwMEFGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QUZpbHRlckRhdGVHcm91cEl0ZW1cIiAqLyB9LFxuXHQvKjo6WyovMHgwMEIwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0TWVyZ2VDZWxsXCIsICovIGY6cGFyc2VfQnJ0TWVyZ2VDZWxsIH0sXG5cdC8qOjpbKi8weDAwQjEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbk1lcmdlQ2VsbHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQjIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRNZXJnZUNlbGxzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBCMy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUGl2b3RDYWNoZURlZlwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBCNC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBpdm90Q2FjaGVEZWZcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEI1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RGaWVsZHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQjYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RGaWVsZHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEI3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RGaWVsZFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBCOC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDREZpZWxkXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBCOS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU291cmNlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEJBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU291cmNlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBCQi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU1JhbmdlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEJDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU1JhbmdlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBCRC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENERkF0YmxcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQkUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RGQXRibFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQkYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDRElSdW5cIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQzAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RJUnVuXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBDMS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUGl2b3RDYWNoZVJlY29yZHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQzIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQaXZvdENhY2hlUmVjb3Jkc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQzMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDREhpZXJhcmNoaWVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEM0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENESGllcmFyY2hpZXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEM1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RIaWVyYXJjaHlcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQzYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RIaWVyYXJjaHlcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEM3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RIRmllbGRzVXNhZ2VcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwQzgvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RIRmllbGRzVXNhZ2VcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEM5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5FeHRDb25uZWN0aW9uXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMENBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRXh0Q29ubmVjdGlvblwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQ0IvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkVDRGJQcm9wc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBDQy8qOjpdKi86IHsgLyogbjpcIkJydEVuZEVDRGJQcm9wc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwQ0QvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkVDT2xhcFByb3BzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMENFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRUNPbGFwUHJvcHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMENGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RTQ29uc29sXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEQwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU0NvbnNvbFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwRDEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDRFNDUGFnZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRDIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RTQ1BhZ2VzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBEMy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU0NQYWdlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEQ0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU0NQYWdlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBENS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU0NQSXRlbVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBENi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDRFNDUEl0ZW1cIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEQ3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RTQ1NldHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRDgvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RTQ1NldHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEQ5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RTQ1NldFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBEQS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDRFNDU2V0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBEQi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENERkdyb3VwXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMERDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENERkdyb3VwXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBERC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENERkdJdGVtc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBERS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDREZHSXRlbXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMERGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RGR1JhbmdlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEUwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENERkdSYW5nZVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwRTEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDREZHRGlzY3JldGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRTIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RGR0Rpc2NyZXRlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBFMy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU0RUdXBsZUNhY2hlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEU0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU0RUdXBsZUNhY2hlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBFNS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU0RUQ0VudHJpZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRTYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RTRFRDRW50cmllc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwRTcvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDRFNEVENFTWVtYmVyc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBFOC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDRFNEVENFTWVtYmVyc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwRTkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDRFNEVENFTWVtYmVyXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEVBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU0RUQ0VNZW1iZXJcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEVCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RTRFRDUXVlcmllc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBFQy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDRFNEVENRdWVyaWVzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBFRC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU0RUQ1F1ZXJ5XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEVFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU0RUQ1F1ZXJ5XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBFRi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU0RUQ1NldHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRjAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RTRFRDU2V0c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwRjEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDRFNEVENTZXRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRjIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RTRFRDU2V0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBGMy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEQ2FsY0l0ZW1zXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEY0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEQ2FsY0l0ZW1zXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBGNS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEQ2FsY0l0ZW1cIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRjYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RDYWxjSXRlbVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAwRjcvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBSdWxlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEY4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUFJ1bGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEY5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QUkZpbHRlcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAwRkEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQUkZpbHRlcnNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMEZCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QUkZpbHRlclwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDBGQy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBSRmlsdGVyXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBGRC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUE5hbWVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMEZFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUE5hbWVzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDBGRi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUE5hbWVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMDAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQTmFtZVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMDEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBOUGFpcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMDIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQTlBhaXJzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEwMy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUE5QYWlyXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTA0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUE5QYWlyXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEwNS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRUNXZWJQcm9wc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDEwNi8qOjpdKi86IHsgLyogbjpcIkJydEVuZEVDV2ViUHJvcHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTA3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5FY1dwVGFibGVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTA4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRUNXUFRhYmxlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMDkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkVDUGFyYW1zXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTBBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRUNQYXJhbXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTBCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5FQ1BhcmFtXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTBDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRUNQYXJhbVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMEQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDREtQSXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMEUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RLUElzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEwRi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENES1BJXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTEwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENES1BJXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDExMS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRGltc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDExMi8qOjpdKi86IHsgLyogbjpcIkJydEVuZERpbXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTEzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5EaW1cIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMTQvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREaW1cIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTE1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0SW5kZXhQYXJ0RW5kXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDExNi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU3R5bGVTaGVldFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDExNy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFN0eWxlU2hlZXRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTE4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWFZpZXdcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMTkvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFZJXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDExQS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hWSVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDExQi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hWSXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMUMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFZJc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMUQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYVkRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMUUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFZEXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDExRi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hWRHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMjAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFZEc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMjEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYUElcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMjIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFBJXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEyMy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hQSXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMjQvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFBJc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMjUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYRElcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMjYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWERJXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEyNy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hESXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMjgvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWERJc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMjkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYTElcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMkEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWExJXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEyQi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hMSVJ3c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDEyQy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYTElSd3NcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTJELyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWExJQ29sc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDEyRS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYTElDb2xzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEyRi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hGb3JtYXRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxMzAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWEZvcm1hdFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMzEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYRm9ybWF0c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDEzMi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFN4Rm9ybWF0c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxMzMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblN4U2VsZWN0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTM0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU3hTZWxlY3RcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTM1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5JU1hWRFJ3c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDEzNi8qOjpdKi86IHsgLyogbjpcIkJydEVuZElTWFZEUndzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEzNy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luSVNYVkRDb2xzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTM4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kSVNYVkRDb2xzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEzOS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYTG9jYXRpb25cIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTNBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWExvY2F0aW9uXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTNCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hWaWV3XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDEzQy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hUSHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxM0QvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFRIc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxM0UvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYVEhcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxM0YvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFRIXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE0MC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luSVNYVEhSd3NcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxNDEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRJU1hUSFJ3c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxNDIvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbklTWFRIQ29sc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDE0My8qOjpdKi86IHsgLyogbjpcIkJydEVuZElTWFRIQ29sc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxNDQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYVERNUFNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxNDUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFRETVBzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE0Ni8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hURE1QXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTQ3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hURE1QXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE0OC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hUSEl0ZW1zXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTQ5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hUSEl0ZW1zXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE0QS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hUSEl0ZW1cIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxNEIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWFRISXRlbVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxNEMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbk1ldGFkYXRhXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTRELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTWV0YWRhdGFcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTRFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Fc21kdGluZm9cIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxNEYvKjo6XSovOiB7IC8qIG46XCJCcnRNZHRpbmZvXCIsICovIGY6cGFyc2VfQnJ0TWR0aW5mbyB9LFxuXHQvKjo6WyovMHgwMTUwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRXNtZHRpbmZvXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE1MS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRXNtZGJcIiwgKi8gZjpwYXJzZV9CcnRCZWdpbkVzbWRiLCBUOjEgfSxcblx0Lyo6OlsqLzB4MDE1Mi8qOjpdKi86IHsgLyogbjpcIkJydEVuZEVzbWRiXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE1My8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRXNmbWRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxNTQvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRFc2ZtZFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxNTUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNpbmdsZUNlbGxzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTU2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2luZ2xlQ2VsbHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTU3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5MaXN0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTU4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTGlzdFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxNTkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkxpc3RDb2xzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTVBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTGlzdENvbHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTVCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5MaXN0Q29sXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTVDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTGlzdENvbFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxNUQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkxpc3RYbWxDUHJcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxNUUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRMaXN0WG1sQ1ByXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE1Ri8qOjpdKi86IHsgLyogbjpcIkJydExpc3RDQ0ZtbGFcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTYwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0TGlzdFRyRm1sYVwiICovIH0sXG5cdC8qOjpbKi8weDAxNjEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkV4dGVybmFsc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDE2Mi8qOjpdKi86IHsgLyogbjpcIkJydEVuZEV4dGVybmFsc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxNjMvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBCb29rU3JjXCIsICovIGY6cGFyc2VfUmVsSUR9LFxuXHQvKjo6WyovMHgwMTY1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0U3VwU2VsZlwiICovIH0sXG5cdC8qOjpbKi8weDAxNjYvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBTYW1lXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE2Ny8qOjpdKi86IHsgLyogbjpcIkJydFN1cFRhYnNcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTY4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TdXBCb29rXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTY5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UGxhY2Vob2xkZXJOYW1lXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE2QS8qOjpdKi86IHsgLyogbjpcIkJydEV4dGVyblNoZWV0XCIsICovIGY6cGFyc2VfRXh0ZXJuU2hlZXQgfSxcblx0Lyo6OlsqLzB4MDE2Qi8qOjpdKi86IHsgLyogbjpcIkJydEV4dGVyblRhYmxlU3RhcnRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTZDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RXh0ZXJuVGFibGVFbmRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTZFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RXh0ZXJuUm93SGRyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE2Ri8qOjpdKi86IHsgLyogbjpcIkJydEV4dGVybkNlbGxCbGFua1wiICovIH0sXG5cdC8qOjpbKi8weDAxNzAvKjo6XSovOiB7IC8qIG46XCJCcnRFeHRlcm5DZWxsUmVhbFwiICovIH0sXG5cdC8qOjpbKi8weDAxNzEvKjo6XSovOiB7IC8qIG46XCJCcnRFeHRlcm5DZWxsQm9vbFwiICovIH0sXG5cdC8qOjpbKi8weDAxNzIvKjo6XSovOiB7IC8qIG46XCJCcnRFeHRlcm5DZWxsRXJyb3JcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTczLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RXh0ZXJuQ2VsbFN0cmluZ1wiICovIH0sXG5cdC8qOjpbKi8weDAxNzQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkVzbWR4XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTc1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRXNtZHhcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTc2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5NZHhTZXRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxNzcvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRNZHhTZXRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTc4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5NZHhNYnJQcm9wXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTc5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTWR4TWJyUHJvcFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxN0EvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbk1keEtQSVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDE3Qi8qOjpdKi86IHsgLyogbjpcIkJydEVuZE1keEtQSVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxN0MvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkVzc3RyXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTdELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRXNzdHJcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMTdFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QUkZJdGVtXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTdGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUFJGSXRlbVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxODAvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBpdm90Q2FjaGVJRHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxODEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQaXZvdENhY2hlSURzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE4Mi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUGl2b3RDYWNoZUlEXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTgzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUGl2b3RDYWNoZUlEXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE4NC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luSVNYVklzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTg1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kSVNYVklzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDE4Ni8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ29sSW5mb3NcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxODcvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDb2xJbmZvc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxODgvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblJ3QnJrXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMTg5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUndCcmtcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMThBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Db2xCcmtcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxOEIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDb2xCcmtcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMThDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QnJrXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE4RC8qOjpdKi86IHsgLyogbjpcIkJydFVzZXJCb29rVmlld1wiICovIH0sXG5cdC8qOjpbKi8weDAxOEUvKjo6XSovOiB7IC8qIG46XCJCcnRJbmZvXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE4Ri8qOjpdKi86IHsgLyogbjpcIkJydENVc3JcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTkwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0VXNyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE5MS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luVXNlcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxOTMvKjo6XSovOiB7IC8qIG46XCJCcnRFT0ZcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTk0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0VUNSXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE5NS8qOjpdKi86IHsgLyogbjpcIkJydFJSSW5zRGVsXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE5Ni8qOjpdKi86IHsgLyogbjpcIkJydFJSRW5kSW5zRGVsXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE5Ny8qOjpdKi86IHsgLyogbjpcIkJydFJSTW92ZVwiICovIH0sXG5cdC8qOjpbKi8weDAxOTgvKjo6XSovOiB7IC8qIG46XCJCcnRSUkVuZE1vdmVcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTk5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UlJDaGdDZWxsXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE5QS8qOjpdKi86IHsgLyogbjpcIkJydFJSRW5kQ2hnQ2VsbFwiICovIH0sXG5cdC8qOjpbKi8weDAxOUIvKjo6XSovOiB7IC8qIG46XCJCcnRSUkhlYWRlclwiICovIH0sXG5cdC8qOjpbKi8weDAxOUMvKjo6XSovOiB7IC8qIG46XCJCcnRSUlVzZXJWaWV3XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDE5RC8qOjpdKi86IHsgLyogbjpcIkJydFJSUmVuU2hlZXRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMTlFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UlJJbnNlcnRTaFwiICovIH0sXG5cdC8qOjpbKi8weDAxOUYvKjo6XSovOiB7IC8qIG46XCJCcnRSUkRlZk5hbWVcIiAqLyB9LFxuXHQvKjo6WyovMHgwMUEwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UlJOb3RlXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDFBMS8qOjpdKi86IHsgLyogbjpcIkJydFJSQ29uZmxpY3RcIiAqLyB9LFxuXHQvKjo6WyovMHgwMUEyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UlJUUVNJRlwiICovIH0sXG5cdC8qOjpbKi8weDAxQTMvKjo6XSovOiB7IC8qIG46XCJCcnRSUkZvcm1hdFwiICovIH0sXG5cdC8qOjpbKi8weDAxQTQvKjo6XSovOiB7IC8qIG46XCJCcnRSUkVuZEZvcm1hdFwiICovIH0sXG5cdC8qOjpbKi8weDAxQTUvKjo6XSovOiB7IC8qIG46XCJCcnRSUkF1dG9GbXRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMUE2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Vc2VyU2hWaWV3c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFBNy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luVXNlclNoVmlld1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFBOC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFVzZXJTaFZpZXdcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUE5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kVXNlclNoVmlld3NcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUFBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QXJyRm1sYVwiLCAqLyBmOnBhcnNlX0JydEFyckZtbGEgfSxcblx0Lyo6OlsqLzB4MDFBQi8qOjpdKi86IHsgLyogbjpcIkJydFNockZtbGFcIiwgKi8gZjpwYXJzZV9CcnRTaHJGbWxhIH0sXG5cdC8qOjpbKi8weDAxQUMvKjo6XSovOiB7IC8qIG46XCJCcnRUYWJsZVwiICovIH0sXG5cdC8qOjpbKi8weDAxQUQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkV4dENvbm5lY3Rpb25zXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMUFFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRXh0Q29ubmVjdGlvbnNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUFGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RDYWxjTWVtc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFCMC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDRENhbGNNZW1zXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFCMS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEQ2FsY01lbVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFCMi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDRENhbGNNZW1cIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUIzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RIR0xldmVsc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFCNC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDREhHTGV2ZWxzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFCNS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENESEdMZXZlbFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFCNi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDREhHTGV2ZWxcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUI3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RIR0xHcm91cHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxQjgvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RIR0xHcm91cHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUI5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RIR0xHcm91cFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFCQS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDREhHTEdyb3VwXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFCQi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENESEdMR01lbWJlcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxQkMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RIR0xHTWVtYmVyc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxQkQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDREhHTEdNZW1iZXJcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxQkUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0RIR0xHTWVtYmVyXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFCRi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUVNJXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMUMwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUVNJXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFDMS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUVNJUlwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFDMi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFFTSVJcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUMzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5EZWxldGVkTmFtZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxQzQvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREZWxldGVkTmFtZXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUM1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5EZWxldGVkTmFtZVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFDNi8qOjpdKi86IHsgLyogbjpcIkJydEVuZERlbGV0ZWROYW1lXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFDNy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUVNJRnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxQzgvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRRU0lGc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxQzkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblFTSUZcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxQ0EvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRRU0lGXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFDQi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQXV0b1NvcnRTY29wZVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFDQy8qOjpdKi86IHsgLyogbjpcIkJydEVuZEF1dG9Tb3J0U2NvcGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUNELyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Db25kaXRpb25hbEZvcm1hdHRpbmdcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxQ0UvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDb25kaXRpb25hbEZvcm1hdHRpbmdcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUNGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DRlJ1bGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRDAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDRlJ1bGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUQxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5JY29uU2V0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMUQyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kSWNvblNldFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxRDMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkRhdGFiYXJcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRDQvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREYXRhYmFyXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFENS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ29sb3JTY2FsZVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFENi8qOjpdKi86IHsgLyogbjpcIkJydEVuZENvbG9yU2NhbGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUQ3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q0ZWT1wiICovIH0sXG5cdC8qOjpbKi8weDAxRDgvKjo6XSovOiB7IC8qIG46XCJCcnRFeHRlcm5WYWx1ZU1ldGFcIiAqLyB9LFxuXHQvKjo6WyovMHgwMUQ5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Db2xvclBhbGV0dGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxREEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDb2xvclBhbGV0dGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMURCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0SW5kZXhlZENvbG9yXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDFEQy8qOjpdKi86IHsgLyogbjpcIkJydE1hcmdpbnNcIiwgKi8gZjpwYXJzZV9CcnRNYXJnaW5zIH0sXG5cdC8qOjpbKi8weDAxREQvKjo6XSovOiB7IC8qIG46XCJCcnRQcmludE9wdGlvbnNcIiAqLyB9LFxuXHQvKjo6WyovMHgwMURFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UGFnZVNldHVwXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDFERi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luSGVhZGVyRm9vdGVyXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMUUwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kSGVhZGVyRm9vdGVyXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFFMS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hDcnRGb3JtYXRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRTIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWENydEZvcm1hdFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxRTMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYQ3J0Rm9ybWF0c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFFNC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYQ3J0Rm9ybWF0c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxRTUvKjo6XSovOiB7IC8qIG46XCJCcnRXc0ZtdEluZm9cIiwgKi8gZjpwYXJzZV9CcnRXc0ZtdEluZm8gfSxcblx0Lyo6OlsqLzB4MDFFNi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTWdzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMUU3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTUdzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFFOC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTUdNYXBzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMUU5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTUdNYXBzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFFQS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTUdcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRUIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRNR1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxRUMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbk1hcFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFFRC8qOjpdKi86IHsgLyogbjpcIkJydEVuZE1hcFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxRUUvKjo6XSovOiB7IC8qIG46XCJCcnRITGlua1wiLCAqLyBmOnBhcnNlX0JydEhMaW5rIH0sXG5cdC8qOjpbKi8weDAxRUYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkRDb25cIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRjAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREQ29uXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDFGMS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRFJlZnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRjIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREUmVmc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxRjMvKjo6XSovOiB7IC8qIG46XCJCcnREUmVmXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDFGNC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU2Nlbk1hblwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFGNS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNjZW5NYW5cIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUY2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TY3RcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRjcvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTY3RcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUY4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0U2xjXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDFGOS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRFhGc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDFGQS8qOjpdKi86IHsgLyogbjpcIkJydEVuZERYRnNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMUZCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RFhGXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDFGQy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luVGFibGVTdHlsZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRkQvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRUYWJsZVN0eWxlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAxRkUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblRhYmxlU3R5bGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAxRkYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRUYWJsZVN0eWxlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDIwMC8qOjpdKi86IHsgLyogbjpcIkJydFRhYmxlU3R5bGVFbGVtZW50XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIwMS8qOjpdKi86IHsgLyogbjpcIkJydFRhYmxlU3R5bGVDbGllbnRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjAyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Wb2xEZXBzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjAzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kVm9sRGVwc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyMDQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblZvbFR5cGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyMDUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRWb2xUeXBlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDIwNi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luVm9sTWFpblwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDIwNy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFZvbE1haW5cIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjA4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Wb2xUb3BpY1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDIwOS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFZvbFRvcGljXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDIwQS8qOjpdKi86IHsgLyogbjpcIkJydFZvbFN1YnRvcGljXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIwQi8qOjpdKi86IHsgLyogbjpcIkJydFZvbFJlZlwiICovIH0sXG5cdC8qOjpbKi8weDAyMEMvKjo6XSovOiB7IC8qIG46XCJCcnRWb2xOdW1cIiAqLyB9LFxuXHQvKjo6WyovMHgwMjBELyo6Ol0qLzogeyAvKiBuOlwiQnJ0Vm9sRXJyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIwRS8qOjpdKi86IHsgLyogbjpcIkJydFZvbFN0clwiICovIH0sXG5cdC8qOjpbKi8weDAyMEYvKjo6XSovOiB7IC8qIG46XCJCcnRWb2xCb29sXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIxMC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ2FsY0NoYWluJFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDIxMS8qOjpdKi86IHsgLyogbjpcIkJydEVuZENhbGNDaGFpbiRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjEyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Tb3J0U3RhdGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyMTMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTb3J0U3RhdGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjE0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Tb3J0Q29uZFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDIxNS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNvcnRDb25kXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDIxNi8qOjpdKi86IHsgLyogbjpcIkJydEJvb2tQcm90ZWN0aW9uXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIxNy8qOjpdKi86IHsgLyogbjpcIkJydFNoZWV0UHJvdGVjdGlvblwiICovIH0sXG5cdC8qOjpbKi8weDAyMTgvKjo6XSovOiB7IC8qIG46XCJCcnRSYW5nZVByb3RlY3Rpb25cIiAqLyB9LFxuXHQvKjo6WyovMHgwMjE5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UGhvbmV0aWNJbmZvXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIxQS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRUNUeHRXaXpcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyMUIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRFQ1R4dFdpelwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyMUMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkVDVFdGbGRJbmZvTHN0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjFELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRUNUV0ZsZEluZm9Mc3RcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjFFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5FQ1R3RmxkSW5mb1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDIyNC8qOjpdKi86IHsgLyogbjpcIkJydEZpbGVTaGFyaW5nXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIyNS8qOjpdKi86IHsgLyogbjpcIkJydE9sZVNpemVcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjI2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RHJhd2luZ1wiLCAqLyBmOnBhcnNlX1JlbElEIH0sXG5cdC8qOjpbKi8weDAyMjcvKjo6XSovOiB7IC8qIG46XCJCcnRMZWdhY3lEcmF3aW5nXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIyOC8qOjpdKi86IHsgLyogbjpcIkJydExlZ2FjeURyYXdpbmdIRlwiICovIH0sXG5cdC8qOjpbKi8weDAyMjkvKjo6XSovOiB7IC8qIG46XCJCcnRXZWJPcHRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjJBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5XZWJQdWJJdGVtc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDIyQi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFdlYlB1Ykl0ZW1zXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDIyQy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luV2ViUHViSXRlbVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDIyRC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFdlYlB1Ykl0ZW1cIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjJFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWENvbmRGbXRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyMkYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWENvbmRGbXRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjMwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWENvbmRGbXRzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjMxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hDb25kRm10c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyMzIvKjo6XSovOiB7IC8qIG46XCJCcnRCa0hpbVwiICovIH0sXG5cdC8qOjpbKi8weDAyMzQvKjo6XSovOiB7IC8qIG46XCJCcnRDb2xvclwiICovIH0sXG5cdC8qOjpbKi8weDAyMzUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkluZGV4ZWRDb2xvcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyMzYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRJbmRleGVkQ29sb3JzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDIzOS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTVJVQ29sb3JzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjNBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTVJVQ29sb3JzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDIzQy8qOjpdKi86IHsgLyogbjpcIkJydE1SVUNvbG9yXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDIzRC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRFZhbHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyM0UvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREVmFsc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNDEvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBOYW1lU3RhcnRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjQyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U3VwTmFtZVZhbHVlU3RhcnRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjQzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U3VwTmFtZVZhbHVlRW5kXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDI0NC8qOjpdKi86IHsgLyogbjpcIkJydFN1cE5hbWVOdW1cIiAqLyB9LFxuXHQvKjo6WyovMHgwMjQ1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0U3VwTmFtZUVyclwiICovIH0sXG5cdC8qOjpbKi8weDAyNDYvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBOYW1lU3RcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjQ3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0U3VwTmFtZU5pbFwiICovIH0sXG5cdC8qOjpbKi8weDAyNDgvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBOYW1lQm9vbFwiICovIH0sXG5cdC8qOjpbKi8weDAyNDkvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBOYW1lRm1sYVwiICovIH0sXG5cdC8qOjpbKi8weDAyNEEvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBOYW1lQml0c1wiICovIH0sXG5cdC8qOjpbKi8weDAyNEIvKjo6XSovOiB7IC8qIG46XCJCcnRTdXBOYW1lRW5kXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDI0Qy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFN1cEJvb2tcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjRELyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q2VsbFNtYXJ0VGFnUHJvcGVydHlcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjRFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DZWxsU21hcnRUYWdcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyNEYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDZWxsU21hcnRUYWdcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjUwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DZWxsU21hcnRUYWdzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjUxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQ2VsbFNtYXJ0VGFnc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNTIvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNtYXJ0VGFnc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI1My8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNtYXJ0VGFnc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNTQvKjo6XSovOiB7IC8qIG46XCJCcnRTbWFydFRhZ1R5cGVcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjU1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TbWFydFRhZ1R5cGVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjU2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU21hcnRUYWdUeXBlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNTcvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYRmlsdGVyc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI1OC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYRmlsdGVyc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNTkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYRklMVEVSXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjVBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hGaWx0ZXJcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjVCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5GaWxsc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI1Qy8qOjpdKi86IHsgLyogbjpcIkJydEVuZEZpbGxzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI1RC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ2VsbFdhdGNoZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyNUUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDZWxsV2F0Y2hlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNUYvKjo6XSovOiB7IC8qIG46XCJCcnRDZWxsV2F0Y2hcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjYwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DUkVycnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyNjEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDUkVycnNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjYyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q3Jhc2hSZWNFcnJcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjYzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Gb250c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI2NC8qOjpdKi86IHsgLyogbjpcIkJydEVuZEZvbnRzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI2NS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQm9yZGVyc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI2Ni8qOjpdKi86IHsgLyogbjpcIkJydEVuZEJvcmRlcnNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjY3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5GbXRzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjY4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRm10c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNjkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkNlbGxYRnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyNkEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDZWxsWEZzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI2Qi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU3R5bGVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjZDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU3R5bGVzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI3MS8qOjpdKi86IHsgLyogbjpcIkJydEJpZ05hbWVcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjcyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DZWxsU3R5bGVYRnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyNzMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDZWxsU3R5bGVYRnNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjc0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Db21tZW50c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI3NS8qOjpdKi86IHsgLyogbjpcIkJydEVuZENvbW1lbnRzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI3Ni8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ29tbWVudEF1dGhvcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDAyNzcvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDb21tZW50QXV0aG9yc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyNzgvKjo6XSovOiB7IC8qIG46XCJCcnRDb21tZW50QXV0aG9yXCIsICovIGY6cGFyc2VfQnJ0Q29tbWVudEF1dGhvciB9LFxuXHQvKjo6WyovMHgwMjc5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Db21tZW50TGlzdFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI3QS8qOjpdKi86IHsgLyogbjpcIkJydEVuZENvbW1lbnRMaXN0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI3Qi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ29tbWVudFwiLCAqLyBUOjEsIGY6cGFyc2VfQnJ0QmVnaW5Db21tZW50fSxcblx0Lyo6OlsqLzB4MDI3Qy8qOjpdKi86IHsgLyogbjpcIkJydEVuZENvbW1lbnRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjdELyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q29tbWVudFRleHRcIiwgKi8gZjpwYXJzZV9CcnRDb21tZW50VGV4dCB9LFxuXHQvKjo6WyovMHgwMjdFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5PbGVPYmplY3RzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjdGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0T2xlT2JqZWN0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDI4MC8qOjpdKi86IHsgLyogbjpcIkJydEVuZE9sZU9iamVjdHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjgxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TeHJ1bGVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjgyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU3hSdWxlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyODMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkFjdGl2ZVhDb250cm9sc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDI4NC8qOjpdKi86IHsgLyogbjpcIkJydEFjdGl2ZVhcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjg1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQWN0aXZlWENvbnRyb2xzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI4Ni8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEU0RUQ0VNZW1iZXJzU29ydEJ5XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjg4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DZWxsSWdub3JlRUNzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjg5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q2VsbElnbm9yZUVDXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDI4QS8qOjpdKi86IHsgLyogbjpcIkJydEVuZENlbGxJZ25vcmVFQ3NcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjhCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q3NQcm9wXCIsICovIGY6cGFyc2VfQnJ0Q3NQcm9wIH0sXG5cdC8qOjpbKi8weDAyOEMvKjo6XSovOiB7IC8qIG46XCJCcnRDc1BhZ2VTZXR1cFwiICovIH0sXG5cdC8qOjpbKi8weDAyOEQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblVzZXJDc1ZpZXdzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjhFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kVXNlckNzVmlld3NcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjhGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Vc2VyQ3NWaWV3XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjkwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kVXNlckNzVmlld1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyOTEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBjZFNGQ0lFbnRyaWVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjkyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEU0ZDSUVudHJpZXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwMjkzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENEU0ZDSUVudHJ5XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDI5NC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTGlzdFBhcnRzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjk1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0TGlzdFBhcnRcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjk2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTGlzdFBhcnRzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI5Ny8qOjpdKi86IHsgLyogbjpcIkJydFNoZWV0Q2FsY1Byb3BcIiAqLyB9LFxuXHQvKjo6WyovMHgwMjk4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Gbkdyb3VwXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwMjk5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0Rm5Hcm91cFwiICovIH0sXG5cdC8qOjpbKi8weDAyOUEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRGbkdyb3VwXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDI5Qi8qOjpdKi86IHsgLyogbjpcIkJydFN1cEFkZGluXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDI5Qy8qOjpdKi86IHsgLyogbjpcIkJydFNYVERNUE9yZGVyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDI5RC8qOjpdKi86IHsgLyogbjpcIkJydENzUHJvdGVjdGlvblwiICovIH0sXG5cdC8qOjpbKi8weDAyOUYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbldzU29ydE1hcFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDJBMC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFdzU29ydE1hcFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyQTEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblJSU29ydFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDJBMi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFJSU29ydFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDAyQTMvKjo6XSovOiB7IC8qIG46XCJCcnRSUlNvcnRJdGVtXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDJBNC8qOjpdKi86IHsgLyogbjpcIkJydEZpbGVTaGFyaW5nSXNvXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDJBNS8qOjpdKi86IHsgLyogbjpcIkJydEJvb2tQcm90ZWN0aW9uSXNvXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDJBNi8qOjpdKi86IHsgLyogbjpcIkJydFNoZWV0UHJvdGVjdGlvbklzb1wiICovIH0sXG5cdC8qOjpbKi8weDAyQTcvKjo6XSovOiB7IC8qIG46XCJCcnRDc1Byb3RlY3Rpb25Jc29cIiAqLyB9LFxuXHQvKjo6WyovMHgwMkE4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UmFuZ2VQcm90ZWN0aW9uSXNvXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDJBOS8qOjpdKi86IHsgLyogbjpcIkJydERWYWxMaXN0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQwMC8qOjpdKi86IHsgLyogbjpcIkJydFJ3RGVzY2VudFwiICovIH0sXG5cdC8qOjpbKi8weDA0MDEvKjo6XSovOiB7IC8qIG46XCJCcnRLbm93bkZvbnRzXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQwMi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hUdXBsZVNldFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQwMy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYVHVwbGVTZXRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDA0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWFR1cGxlU2V0SGVhZGVyXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDA1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hUdXBsZVNldEhlYWRlclwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0MDYvKjo6XSovOiB7IC8qIG46XCJCcnRTWFR1cGxlU2V0SGVhZGVySXRlbVwiICovIH0sXG5cdC8qOjpbKi8weDA0MDcvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYVHVwbGVTZXREYXRhXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDA4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hUdXBsZVNldERhdGFcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDA5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWFR1cGxlU2V0Um93XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDBBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hUdXBsZVNldFJvd1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0MEIvKjo6XSovOiB7IC8qIG46XCJCcnRTWFR1cGxlU2V0Um93SXRlbVwiICovIH0sXG5cdC8qOjpbKi8weDA0MEMvKjo6XSovOiB7IC8qIG46XCJCcnROYW1lRXh0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQwRC8qOjpdKi86IHsgLyogbjpcIkJydFBDREgxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0MEUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDRENhbGNNZW0xNFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQwRi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBDRENhbGNNZW0xNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0MTAvKjo6XSovOiB7IC8qIG46XCJCcnRTWFRIMTRcIiAqLyB9LFxuXHQvKjo6WyovMHgwNDExLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TcGFya2xpbmVHcm91cFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQxMi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNwYXJrbGluZUdyb3VwXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQxMy8qOjpdKi86IHsgLyogbjpcIkJydFNwYXJrbGluZVwiICovIH0sXG5cdC8qOjpbKi8weDA0MTQvKjo6XSovOiB7IC8qIG46XCJCcnRTWERJMTRcIiAqLyB9LFxuXHQvKjo6WyovMHgwNDE1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0V3NGbXRJbmZvRXgxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0MTYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkNvbmRpdGlvbmFsRm9ybWF0dGluZzE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDE3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQ29uZGl0aW9uYWxGb3JtYXR0aW5nMTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDE4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5DRlJ1bGUxNFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQxOS8qOjpdKi86IHsgLyogbjpcIkJydEVuZENGUnVsZTE0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQxQS8qOjpdKi86IHsgLyogbjpcIkJydENGVk8xNFwiICovIH0sXG5cdC8qOjpbKi8weDA0MUIvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkRhdGFiYXIxNFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQxQy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luSWNvblNldDE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDFELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RFZhbDE0XCIsICovIGY6IHBhcnNlX0JydERWYWwxNCB9LFxuXHQvKjo6WyovMHgwNDFFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5EVmFsczE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDFGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q29sb3IxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0MjAvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNwYXJrbGluZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0MjEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTcGFya2xpbmVzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQyMi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU3BhcmtsaW5lR3JvdXBzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDIzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU3BhcmtsaW5lR3JvdXBzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQyNS8qOjpdKi86IHsgLyogbjpcIkJydFNYVkQxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0MjYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYVmlldzE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDI3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hWaWV3MTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDI4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWFZpZXcxNlwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQyOS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYVmlldzE2XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQyQS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUENEMTRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0MkIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQQ0QxNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0MkMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkV4dENvbm4xNFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQyRC8qOjpdKi86IHsgLyogbjpcIkJydEVuZEV4dENvbm4xNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0MkUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlckNhY2hlSURzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDJGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVJRHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDMwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZUlEXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDMxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVJRFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0MzMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlckNhY2hlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDM0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDM1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZURlZlwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQzNi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNsaWNlckNhY2hlRGVmXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQzNy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU2xpY2Vyc0V4XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDM4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2Vyc0V4XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQzOS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU2xpY2VyRXhcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0M0EvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTbGljZXJFeFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0M0IvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlclwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQzQy8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNsaWNlclwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0M0QvKjo6XSovOiB7IC8qIG46XCJCcnRTbGljZXJDYWNoZVBpdm90VGFibGVzXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQzRS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU2xpY2VyQ2FjaGVPbGFwSW1wbFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQzRi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNsaWNlckNhY2hlT2xhcEltcGxcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDQwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZUxldmVsc0RhdGFcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0NDEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTbGljZXJDYWNoZUxldmVsc0RhdGFcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDQyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZUxldmVsRGF0YVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ0My8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNsaWNlckNhY2hlTGV2ZWxEYXRhXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ0NC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU2xpY2VyQ2FjaGVTaVJhbmdlc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ0NS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNsaWNlckNhY2hlU2lSYW5nZXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDQ2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZVNpUmFuZ2VcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0NDcvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTbGljZXJDYWNoZVNpUmFuZ2VcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDQ4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0U2xpY2VyQ2FjaGVPbGFwSXRlbVwiICovIH0sXG5cdC8qOjpbKi8weDA0NDkvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlckNhY2hlU2VsZWN0aW9uc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ0QS8qOjpdKi86IHsgLyogbjpcIkJydFNsaWNlckNhY2hlU2VsZWN0aW9uXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ0Qi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNsaWNlckNhY2hlU2VsZWN0aW9uc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0NEMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlckNhY2hlTmF0aXZlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDRELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVOYXRpdmVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDRFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U2xpY2VyQ2FjaGVOYXRpdmVJdGVtXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ0Ri8qOjpdKi86IHsgLyogbjpcIkJydFJhbmdlUHJvdGVjdGlvbjE0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ1MC8qOjpdKi86IHsgLyogbjpcIkJydFJhbmdlUHJvdGVjdGlvbklzbzE0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ1MS8qOjpdKi86IHsgLyogbjpcIkJydENlbGxJZ25vcmVFQzE0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ1Ny8qOjpdKi86IHsgLyogbjpcIkJydExpc3QxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0NTgvKjo6XSovOiB7IC8qIG46XCJCcnRDRkljb25cIiAqLyB9LFxuXHQvKjo6WyovMHgwNDU5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZXNQaXZvdENhY2hlSURzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDVBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVzUGl2b3RDYWNoZUlEc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0NUIvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlcnNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0NUMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTbGljZXJzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ1RC8qOjpdKi86IHsgLyogbjpcIkJydFdiUHJvcDE0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ1RS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hFZGl0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDVGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hFZGl0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ2MC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hFZGl0c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ2MS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYRWRpdHNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDYyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWENoYW5nZVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ2My8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNYQ2hhbmdlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ2NC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU1hDaGFuZ2VzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDY1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hDaGFuZ2VzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ2Ni8qOjpdKi86IHsgLyogbjpcIkJydFNYVHVwbGVJdGVtc1wiICovIH0sXG5cdC8qOjpbKi8weDA0NjgvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlclN0eWxlXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDY5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2VyU3R5bGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDZBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0U2xpY2VyU3R5bGVFbGVtZW50XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ2Qi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU3R5bGVTaGVldEV4dDE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDZDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU3R5bGVTaGVldEV4dDE0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ2RC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU2xpY2VyQ2FjaGVzUGl2b3RDYWNoZUlEXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDZFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVzUGl2b3RDYWNoZUlEXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ2Ri8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ29uZGl0aW9uYWxGb3JtYXR0aW5nc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ3MC8qOjpdKi86IHsgLyogbjpcIkJydEVuZENvbmRpdGlvbmFsRm9ybWF0dGluZ3NcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDcxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QQ0RDYWxjTWVtRXh0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDcyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEQ2FsY01lbUV4dFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0NzMvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBDRENhbGNNZW1zRXh0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDc0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUENEQ2FsY01lbXNFeHRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDc1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENERmllbGQxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0NzYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlclN0eWxlc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ3Ny8qOjpdKi86IHsgLyogbjpcIkJydEVuZFNsaWNlclN0eWxlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0NzgvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNsaWNlclN0eWxlRWxlbWVudHNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0NzkvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTbGljZXJTdHlsZUVsZW1lbnRzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ3QS8qOjpdKi86IHsgLyogbjpcIkJydENGUnVsZUV4dFwiICovIH0sXG5cdC8qOjpbKi8weDA0N0IvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblNYQ29uZEZtdDE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDdDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU1hDb25kRm10MTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDdELyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TWENvbmRGbXRzMTRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0N0UvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTWENvbmRGbXRzMTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDgwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Tb3J0Q29uZDE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDgxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kU29ydENvbmQxNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0ODIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREVmFsczE0XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDQ4My8qOjpdKi86IHsgLyogbjpcIkJydEVuZEljb25TZXQxNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0ODQvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREYXRhYmFyMTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDg1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5Db2xvclNjYWxlMTRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0ODYvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRDb2xvclNjYWxlMTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDg3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TeHJ1bGVzMTRcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA0ODgvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTeHJ1bGVzMTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDg5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QUnVsZTE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDhBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUFJ1bGUxNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0OEIvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBSRmlsdGVyczE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDhDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUFJGaWx0ZXJzMTRcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwNDhELyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QUkZpbHRlcjE0XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwNDhFLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUFJGaWx0ZXIxNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0OEYvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblBSRkl0ZW0xNFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ5MC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBSRkl0ZW0xNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0OTEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkNlbGxJZ25vcmVFQ3MxNFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ5Mi8qOjpdKi86IHsgLyogbjpcIkJydEVuZENlbGxJZ25vcmVFQ3MxNFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0OTMvKjo6XSovOiB7IC8qIG46XCJCcnREeGYxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0OTQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkR4RjE0c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ5NS8qOjpdKi86IHsgLyogbjpcIkJydEVuZER4ZjE0c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA0OTkvKjo6XSovOiB7IC8qIG46XCJCcnRGaWx0ZXIxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0OUEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkN1c3RvbUZpbHRlcnMxNFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDQ5Qy8qOjpdKi86IHsgLyogbjpcIkJydEN1c3RvbUZpbHRlcjE0XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDQ5RC8qOjpdKi86IHsgLyogbjpcIkJydEljb25GaWx0ZXIxNFwiICovIH0sXG5cdC8qOjpbKi8weDA0OUUvKjo6XSovOiB7IC8qIG46XCJCcnRQaXZvdENhY2hlQ29ubmVjdGlvbk5hbWVcIiAqLyB9LFxuXHQvKjo6WyovMHgwODAwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5EZWNvdXBsZWRQaXZvdENhY2hlSURzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODAxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRGVjb3VwbGVkUGl2b3RDYWNoZUlEc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MDIvKjo6XSovOiB7IC8qIG46XCJCcnREZWNvdXBsZWRQaXZvdENhY2hlSURcIiAqLyB9LFxuXHQvKjo6WyovMHgwODAzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5QaXZvdFRhYmxlUmVmc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgwNC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFBpdm90VGFibGVSZWZzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDgwNS8qOjpdKi86IHsgLyogbjpcIkJydFBpdm90VGFibGVSZWZcIiAqLyB9LFxuXHQvKjo6WyovMHgwODA2Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0U2xpY2VyQ2FjaGVCb29rUGl2b3RUYWJsZXNcIiAqLyB9LFxuXHQvKjo6WyovMHgwODA3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5TeHZjZWxsc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgwOC8qOjpdKi86IHsgLyogbjpcIkJydEVuZFN4dmNlbGxzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDgwOS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luU3hSb3dcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4MEEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRTeFJvd1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MEMvKjo6XSovOiB7IC8qIG46XCJCcnRQY2RDYWxjTWVtMTVcIiAqLyB9LFxuXHQvKjo6WyovMHgwODEzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UXNpMTVcIiAqLyB9LFxuXHQvKjo6WyovMHgwODE0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5XZWJFeHRlbnNpb25zXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODE1Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kV2ViRXh0ZW5zaW9uc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MTYvKjo6XSovOiB7IC8qIG46XCJCcnRXZWJFeHRlbnNpb25cIiAqLyB9LFxuXHQvKjo6WyovMHgwODE3Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QWJzUGF0aDE1XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDgxOC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luUGl2b3RUYWJsZVVJU2V0dGluZ3NcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4MTkvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRQaXZvdFRhYmxlVUlTZXR0aW5nc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MUIvKjo6XSovOiB7IC8qIG46XCJCcnRUYWJsZVNsaWNlckNhY2hlSURzXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDgxQy8qOjpdKi86IHsgLyogbjpcIkJydFRhYmxlU2xpY2VyQ2FjaGVJRFwiICovIH0sXG5cdC8qOjpbKi8weDA4MUQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblRhYmxlU2xpY2VyQ2FjaGVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4MUUvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRUYWJsZVNsaWNlckNhY2hlXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDgxRi8qOjpdKi86IHsgLyogbjpcIkJydFN4RmlsdGVyMTVcIiAqLyB9LFxuXHQvKjo6WyovMHgwODIwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5UaW1lbGluZUNhY2hlUGl2b3RDYWNoZUlEc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgyMS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFRpbWVsaW5lQ2FjaGVQaXZvdENhY2hlSURzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDgyMi8qOjpdKi86IHsgLyogbjpcIkJydFRpbWVsaW5lQ2FjaGVQaXZvdENhY2hlSURcIiAqLyB9LFxuXHQvKjo6WyovMHgwODIzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5UaW1lbGluZUNhY2hlSURzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODI0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kVGltZWxpbmVDYWNoZUlEc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MjUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblRpbWVsaW5lQ2FjaGVJRFwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgyNi8qOjpdKi86IHsgLyogbjpcIkJydEVuZFRpbWVsaW5lQ2FjaGVJRFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MjcvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblRpbWVsaW5lc0V4XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODI4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kVGltZWxpbmVzRXhcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODI5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5UaW1lbGluZUV4XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODJBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kVGltZWxpbmVFeFwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MkIvKjo6XSovOiB7IC8qIG46XCJCcnRXb3JrQm9va1ByMTVcIiAqLyB9LFxuXHQvKjo6WyovMHgwODJDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0UENESDE1XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDgyRC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luVGltZWxpbmVTdHlsZVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgyRS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFRpbWVsaW5lU3R5bGVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODJGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0VGltZWxpbmVTdHlsZUVsZW1lbnRcIiAqLyB9LFxuXHQvKjo6WyovMHgwODMwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5UaW1lbGluZVN0eWxlc2hlZXRFeHQxNVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgzMS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFRpbWVsaW5lU3R5bGVzaGVldEV4dDE1XCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDgzMi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luVGltZWxpbmVTdHlsZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4MzMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRUaW1lbGluZVN0eWxlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MzQvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblRpbWVsaW5lU3R5bGVFbGVtZW50c1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgzNS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFRpbWVsaW5lU3R5bGVFbGVtZW50c1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MzYvKjo6XSovOiB7IC8qIG46XCJCcnREeGYxNVwiICovIH0sXG5cdC8qOjpbKi8weDA4MzcvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkR4ZnMxNVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDgzOC8qOjpdKi86IHsgLyogbjpcIkJydEVuZER4ZnMxNVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4MzkvKjo6XSovOiB7IC8qIG46XCJCcnRTbGljZXJDYWNoZUhpZGVJdGVtc1dpdGhOb0RhdGFcIiAqLyB9LFxuXHQvKjo6WyovMHgwODNBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5JdGVtVW5pcXVlTmFtZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4M0IvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRJdGVtVW5pcXVlTmFtZXNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODNDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0SXRlbVVuaXF1ZU5hbWVcIiAqLyB9LFxuXHQvKjo6WyovMHgwODNELyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5FeHRDb25uMTVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4M0UvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRFeHRDb25uMTVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODNGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5PbGVkYlByMTVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4NDAvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRPbGVkYlByMTVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODQxLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5EYXRhRmVlZFByMTVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4NDIvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREYXRhRmVlZFByMTVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODQzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0VGV4dFByMTVcIiAqLyB9LFxuXHQvKjo6WyovMHgwODQ0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0UmFuZ2VQcjE1XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDg0NS8qOjpdKi86IHsgLyogbjpcIkJydERiQ29tbWFuZDE1XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDg0Ni8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRGJUYWJsZXMxNVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDg0Ny8qOjpdKi86IHsgLyogbjpcIkJydEVuZERiVGFibGVzMTVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODQ4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RGJUYWJsZTE1XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDg0OS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRGF0YU1vZGVsXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODRBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRGF0YU1vZGVsXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDg0Qi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTW9kZWxUYWJsZXNcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4NEMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRNb2RlbFRhYmxlc1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4NEQvKjo6XSovOiB7IC8qIG46XCJCcnRNb2RlbFRhYmxlXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDg0RS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTW9kZWxSZWxhdGlvbnNoaXBzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODRGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTW9kZWxSZWxhdGlvbnNoaXBzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDg1MC8qOjpdKi86IHsgLyogbjpcIkJydE1vZGVsUmVsYXRpb25zaGlwXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDg1MS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRUNUeHRXaXoxNVwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MDg1Mi8qOjpdKi86IHsgLyogbjpcIkJydEVuZEVDVHh0V2l6MTVcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgwODUzLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5FQ1RXRmxkSW5mb0xzdDE1XCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODU0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kRUNUV0ZsZEluZm9Mc3QxNVwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4NTUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkVDVFdGbGRJbmZvMTVcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4NTYvKjo6XSovOiB7IC8qIG46XCJCcnRGaWVsZExpc3RBY3RpdmVJdGVtXCIgKi8gfSxcblx0Lyo6OlsqLzB4MDg1Ny8qOjpdKi86IHsgLyogbjpcIkJydFBpdm90Q2FjaGVJZFZlcnNpb25cIiAqLyB9LFxuXHQvKjo6WyovMHgwODU4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0U1hESTE1XCIgKi8gfSxcblx0Lyo6OlsqLzB4MDg1OS8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTW9kZWxUaW1lR3JvdXBpbmdzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgwODVBLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kTW9kZWxUaW1lR3JvdXBpbmdzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MDg1Qi8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luTW9kZWxUaW1lR3JvdXBpbmdcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDA4NUMvKjo6XSovOiB7IC8qIG46XCJCcnRFbmRNb2RlbFRpbWVHcm91cGluZ1wiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDA4NUQvKjo6XSovOiB7IC8qIG46XCJCcnRNb2RlbFRpbWVHcm91cGluZ0NhbGNDb2xcIiAqLyB9LFxuXHQvKjo6WyovMHgwQzAwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0VWlkXCIgKi8gfSxcblx0Lyo6OlsqLzB4MEMwMS8qOjpdKi86IHsgLyogbjpcIkJydFJldmlzaW9uUHRyXCIgKi8gfSxcblx0Lyo6OlsqLzB4MTAwMC8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luRHluYW1pY0FycmF5UHJcIiwgKi8gVDoxIH0sXG5cdC8qOjpbKi8weDEwMDEvKjo6XSovOiB7IC8qIG46XCJCcnRFbmREeW5hbWljQXJyYXlQclwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDEzOEEvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpblJpY2hWYWx1ZUJsb2NrXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgxMzhCLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUmljaFZhbHVlQmxvY2tcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgxM0Q5Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5SaWNoRmlsdGVyc1wiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MTNEQS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFJpY2hGaWx0ZXJzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MTNEQi8qOjpdKi86IHsgLyogbjpcIkJydFJpY2hGaWx0ZXJcIiAqLyB9LFxuXHQvKjo6WyovMHgxM0RDLyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5SaWNoRmlsdGVyQ29sdW1uXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgxM0RELyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kUmljaEZpbHRlckNvbHVtblwiLCAqLyBUOi0xIH0sXG5cdC8qOjpbKi8weDEzREUvKjo6XSovOiB7IC8qIG46XCJCcnRCZWdpbkN1c3RvbVJpY2hGaWx0ZXJzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgxM0RGLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQ3VzdG9tUmljaEZpbHRlcnNcIiwgKi8gVDotMSB9LFxuXHQvKjo6WyovMHgxM0UwLyo6Ol0qLzogeyAvKiBuOlwiQnJ0Q3VzdG9tUmljaEZpbHRlclwiICovIH0sXG5cdC8qOjpbKi8weDEzRTEvKjo6XSovOiB7IC8qIG46XCJCcnRUb3AxMFJpY2hGaWx0ZXJcIiAqLyB9LFxuXHQvKjo6WyovMHgxM0UyLyo6Ol0qLzogeyAvKiBuOlwiQnJ0RHluYW1pY1JpY2hGaWx0ZXJcIiAqLyB9LFxuXHQvKjo6WyovMHgxM0U0Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0QmVnaW5SaWNoU29ydENvbmRpdGlvblwiLCAqLyBUOjEgfSxcblx0Lyo6OlsqLzB4MTNFNS8qOjpdKi86IHsgLyogbjpcIkJydEVuZFJpY2hTb3J0Q29uZGl0aW9uXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MTNFNi8qOjpdKi86IHsgLyogbjpcIkJydFJpY2hGaWx0ZXJEYXRlR3JvdXBJdGVtXCIgKi8gfSxcblx0Lyo6OlsqLzB4MTNFNy8qOjpdKi86IHsgLyogbjpcIkJydEJlZ2luQ2FsY0ZlYXR1cmVzXCIsICovIFQ6MSB9LFxuXHQvKjo6WyovMHgxM0U4Lyo6Ol0qLzogeyAvKiBuOlwiQnJ0RW5kQ2FsY0ZlYXR1cmVzXCIsICovIFQ6LTEgfSxcblx0Lyo6OlsqLzB4MTNFOS8qOjpdKi86IHsgLyogbjpcIkJydENhbGNGZWF0dXJlXCIgKi8gfSxcblx0Lyo6OlsqLzB4MTNFQi8qOjpdKi86IHsgLyogbjpcIkJydEV4dGVybmFsTGlua3NQclwiICovIH0sXG5cdC8qOjpbKi8weEZGRkYvKjo6XSovOiB7IG46XCJcIiB9XG59O1xuXG4vKiBbTVMtWExTXSAyLjMgUmVjb3JkIEVudW1lcmF0aW9uIChhbmQgb3RoZXIgc291cmNlcykgKi9cbnZhciBYTFNSZWNvcmRFbnVtID0ge1xuXHQvKiBbTVMtWExTXSAyLjMgUmVjb3JkIEVudW1lcmF0aW9uIDIwMjEtMDgtMTcgKi9cblx0Lyo6OlsqLzB4MDAwNi8qOjpdKi86IHsgLyogbjpcIkZvcm11bGFcIiwgKi8gZjpwYXJzZV9Gb3JtdWxhIH0sXG5cdC8qOjpbKi8weDAwMGEvKjo6XSovOiB7IC8qIG46XCJFT0ZcIiwgKi8gZjpwYXJzZW5vb3AyIH0sXG5cdC8qOjpbKi8weDAwMGMvKjo6XSovOiB7IC8qIG46XCJDYWxjQ291bnRcIiwgKi8gZjpwYXJzZXVpbnQxNiB9LCAvL1xuXHQvKjo6WyovMHgwMDBkLyo6Ol0qLzogeyAvKiBuOlwiQ2FsY01vZGVcIiwgKi8gZjpwYXJzZXVpbnQxNiB9LCAvL1xuXHQvKjo6WyovMHgwMDBlLyo6Ol0qLzogeyAvKiBuOlwiQ2FsY1ByZWNpc2lvblwiLCAqLyBmOnBhcnNlYm9vbCB9LCAvL1xuXHQvKjo6WyovMHgwMDBmLyo6Ol0qLzogeyAvKiBuOlwiQ2FsY1JlZk1vZGVcIiwgKi8gZjpwYXJzZWJvb2wgfSwgLy9cblx0Lyo6OlsqLzB4MDAxMC8qOjpdKi86IHsgLyogbjpcIkNhbGNEZWx0YVwiLCAqLyBmOnBhcnNlX1hudW0gfSwgLy9cblx0Lyo6OlsqLzB4MDAxMS8qOjpdKi86IHsgLyogbjpcIkNhbGNJdGVyXCIsICovIGY6cGFyc2Vib29sIH0sIC8vXG5cdC8qOjpbKi8weDAwMTIvKjo6XSovOiB7IC8qIG46XCJQcm90ZWN0XCIsICovIGY6cGFyc2Vib29sIH0sXG5cdC8qOjpbKi8weDAwMTMvKjo6XSovOiB7IC8qIG46XCJQYXNzd29yZFwiLCAqLyBmOnBhcnNldWludDE2IH0sXG5cdC8qOjpbKi8weDAwMTQvKjo6XSovOiB7IC8qIG46XCJIZWFkZXJcIiwgKi8gZjpwYXJzZV9YTEhlYWRlckZvb3RlciB9LFxuXHQvKjo6WyovMHgwMDE1Lyo6Ol0qLzogeyAvKiBuOlwiRm9vdGVyXCIsICovIGY6cGFyc2VfWExIZWFkZXJGb290ZXIgfSxcblx0Lyo6OlsqLzB4MDAxNy8qOjpdKi86IHsgLyogbjpcIkV4dGVyblNoZWV0XCIsICovIGY6cGFyc2VfRXh0ZXJuU2hlZXQgfSxcblx0Lyo6OlsqLzB4MDAxOC8qOjpdKi86IHsgLyogbjpcIkxibFwiLCAqLyBmOnBhcnNlX0xibCB9LFxuXHQvKjo6WyovMHgwMDE5Lyo6Ol0qLzogeyAvKiBuOlwiV2luUHJvdGVjdFwiLCAqLyBmOnBhcnNlYm9vbCB9LFxuXHQvKjo6WyovMHgwMDFhLyo6Ol0qLzogeyAvKiBuOlwiVmVydGljYWxQYWdlQnJlYWtzXCIsICovIH0sXG5cdC8qOjpbKi8weDAwMWIvKjo6XSovOiB7IC8qIG46XCJIb3Jpem9udGFsUGFnZUJyZWFrc1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDFjLyo6Ol0qLzogeyAvKiBuOlwiTm90ZVwiLCAqLyBmOnBhcnNlX05vdGUgfSxcblx0Lyo6OlsqLzB4MDAxZC8qOjpdKi86IHsgLyogbjpcIlNlbGVjdGlvblwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDIyLyo6Ol0qLzogeyAvKiBuOlwiRGF0ZTE5MDRcIiwgKi8gZjpwYXJzZWJvb2wgfSxcblx0Lyo6OlsqLzB4MDAyMy8qOjpdKi86IHsgLyogbjpcIkV4dGVybk5hbWVcIiwgKi8gZjpwYXJzZV9FeHRlcm5OYW1lIH0sXG5cdC8qOjpbKi8weDAwMjYvKjo6XSovOiB7IC8qIG46XCJMZWZ0TWFyZ2luXCIsICovIGY6cGFyc2VfWG51bSB9LCAvLyAqXG5cdC8qOjpbKi8weDAwMjcvKjo6XSovOiB7IC8qIG46XCJSaWdodE1hcmdpblwiLCAqLyBmOnBhcnNlX1hudW0gfSwgLy8gKlxuXHQvKjo6WyovMHgwMDI4Lyo6Ol0qLzogeyAvKiBuOlwiVG9wTWFyZ2luXCIsICovIGY6cGFyc2VfWG51bSB9LCAvLyAqXG5cdC8qOjpbKi8weDAwMjkvKjo6XSovOiB7IC8qIG46XCJCb3R0b21NYXJnaW5cIiwgKi8gZjpwYXJzZV9YbnVtIH0sIC8vICpcblx0Lyo6OlsqLzB4MDAyYS8qOjpdKi86IHsgLyogbjpcIlByaW50Um93Q29sXCIsICovIGY6cGFyc2Vib29sIH0sXG5cdC8qOjpbKi8weDAwMmIvKjo6XSovOiB7IC8qIG46XCJQcmludEdyaWRcIiwgKi8gZjpwYXJzZWJvb2wgfSxcblx0Lyo6OlsqLzB4MDAyZi8qOjpdKi86IHsgLyogbjpcIkZpbGVQYXNzXCIsICovIGY6cGFyc2VfRmlsZVBhc3MgfSxcblx0Lyo6OlsqLzB4MDAzMS8qOjpdKi86IHsgLyogbjpcIkZvbnRcIiwgKi8gZjpwYXJzZV9Gb250IH0sXG5cdC8qOjpbKi8weDAwMzMvKjo6XSovOiB7IC8qIG46XCJQcmludFNpemVcIiwgKi8gZjpwYXJzZXVpbnQxNiB9LFxuXHQvKjo6WyovMHgwMDNjLyo6Ol0qLzogeyAvKiBuOlwiQ29udGludWVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDAzZC8qOjpdKi86IHsgLyogbjpcIldpbmRvdzFcIiwgKi8gZjpwYXJzZV9XaW5kb3cxIH0sXG5cdC8qOjpbKi8weDAwNDAvKjo6XSovOiB7IC8qIG46XCJCYWNrdXBcIiwgKi8gZjpwYXJzZWJvb2wgfSxcblx0Lyo6OlsqLzB4MDA0MS8qOjpdKi86IHsgLyogbjpcIlBhbmVcIiwgKi8gZjpwYXJzZV9QYW5lIH0sXG5cdC8qOjpbKi8weDAwNDIvKjo6XSovOiB7IC8qIG46XCJDb2RlUGFnZVwiLCAqLyBmOnBhcnNldWludDE2IH0sXG5cdC8qOjpbKi8weDAwNGQvKjo6XSovOiB7IC8qIG46XCJQbHNcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA1MC8qOjpdKi86IHsgLyogbjpcIkRDb25cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA1MS8qOjpdKi86IHsgLyogbjpcIkRDb25SZWZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA1Mi8qOjpdKi86IHsgLyogbjpcIkRDb25OYW1lXCIsICovIH0sXG5cdC8qOjpbKi8weDAwNTUvKjo6XSovOiB7IC8qIG46XCJEZWZDb2xXaWR0aFwiLCAqLyBmOnBhcnNldWludDE2IH0sXG5cdC8qOjpbKi8weDAwNTkvKjo6XSovOiB7IC8qIG46XCJYQ1RcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA1YS8qOjpdKi86IHsgLyogbjpcIkNSTlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDViLyo6Ol0qLzogeyAvKiBuOlwiRmlsZVNoYXJpbmdcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA1Yy8qOjpdKi86IHsgLyogbjpcIldyaXRlQWNjZXNzXCIsICovIGY6cGFyc2VfV3JpdGVBY2Nlc3MgfSxcblx0Lyo6OlsqLzB4MDA1ZC8qOjpdKi86IHsgLyogbjpcIk9ialwiLCAqLyBmOnBhcnNlX09iaiB9LFxuXHQvKjo6WyovMHgwMDVlLyo6Ol0qLzogeyAvKiBuOlwiVW5jYWxjZWRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA1Zi8qOjpdKi86IHsgLyogbjpcIkNhbGNTYXZlUmVjYWxjXCIsICovIGY6cGFyc2Vib29sIH0sIC8vXG5cdC8qOjpbKi8weDAwNjAvKjo6XSovOiB7IC8qIG46XCJUZW1wbGF0ZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDYxLyo6Ol0qLzogeyAvKiBuOlwiSW50bFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDYzLyo6Ol0qLzogeyAvKiBuOlwiT2JqUHJvdGVjdFwiLCAqLyBmOnBhcnNlYm9vbCB9LFxuXHQvKjo6WyovMHgwMDdkLyo6Ol0qLzogeyAvKiBuOlwiQ29sSW5mb1wiLCAqLyBmOnBhcnNlX0NvbEluZm8gfSxcblx0Lyo6OlsqLzB4MDA4MC8qOjpdKi86IHsgLyogbjpcIkd1dHNcIiwgKi8gZjpwYXJzZV9HdXRzIH0sXG5cdC8qOjpbKi8weDAwODEvKjo6XSovOiB7IC8qIG46XCJXc0Jvb2xcIiwgKi8gZjpwYXJzZV9Xc0Jvb2wgfSxcblx0Lyo6OlsqLzB4MDA4Mi8qOjpdKi86IHsgLyogbjpcIkdyaWRTZXRcIiwgKi8gZjpwYXJzZXVpbnQxNiB9LFxuXHQvKjo6WyovMHgwMDgzLyo6Ol0qLzogeyAvKiBuOlwiSENlbnRlclwiLCAqLyBmOnBhcnNlYm9vbCB9LFxuXHQvKjo6WyovMHgwMDg0Lyo6Ol0qLzogeyAvKiBuOlwiVkNlbnRlclwiLCAqLyBmOnBhcnNlYm9vbCB9LFxuXHQvKjo6WyovMHgwMDg1Lyo6Ol0qLzogeyAvKiBuOlwiQm91bmRTaGVldDhcIiwgKi8gZjpwYXJzZV9Cb3VuZFNoZWV0OCB9LFxuXHQvKjo6WyovMHgwMDg2Lyo6Ol0qLzogeyAvKiBuOlwiV3JpdGVQcm90ZWN0XCIsICovIH0sXG5cdC8qOjpbKi8weDAwOGMvKjo6XSovOiB7IC8qIG46XCJDb3VudHJ5XCIsICovIGY6cGFyc2VfQ291bnRyeSB9LFxuXHQvKjo6WyovMHgwMDhkLyo6Ol0qLzogeyAvKiBuOlwiSGlkZU9ialwiLCAqLyBmOnBhcnNldWludDE2IH0sXG5cdC8qOjpbKi8weDAwOTAvKjo6XSovOiB7IC8qIG46XCJTb3J0XCIsICovIH0sXG5cdC8qOjpbKi8weDAwOTIvKjo6XSovOiB7IC8qIG46XCJQYWxldHRlXCIsICovIGY6cGFyc2VfUGFsZXR0ZSB9LFxuXHQvKjo6WyovMHgwMDk3Lyo6Ol0qLzogeyAvKiBuOlwiU3luY1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDk4Lyo6Ol0qLzogeyAvKiBuOlwiTFByXCIsICovIH0sXG5cdC8qOjpbKi8weDAwOTkvKjo6XSovOiB7IC8qIG46XCJEeEdDb2xcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA5YS8qOjpdKi86IHsgLyogbjpcIkZuR3JvdXBOYW1lXCIsICovIH0sXG5cdC8qOjpbKi8weDAwOWIvKjo6XSovOiB7IC8qIG46XCJGaWx0ZXJNb2RlXCIsICovIH0sXG5cdC8qOjpbKi8weDAwOWMvKjo6XSovOiB7IC8qIG46XCJCdWlsdEluRm5Hcm91cENvdW50XCIsICovIGY6cGFyc2V1aW50MTYgfSxcblx0Lyo6OlsqLzB4MDA5ZC8qOjpdKi86IHsgLyogbjpcIkF1dG9GaWx0ZXJJbmZvXCIsICovIH0sXG5cdC8qOjpbKi8weDAwOWUvKjo6XSovOiB7IC8qIG46XCJBdXRvRmlsdGVyXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYTAvKjo6XSovOiB7IC8qIG46XCJTY2xcIiwgKi8gZjpwYXJzZV9TY2wgfSxcblx0Lyo6OlsqLzB4MDBhMS8qOjpdKi86IHsgLyogbjpcIlNldHVwXCIsICovIGY6cGFyc2VfU2V0dXAgfSxcblx0Lyo6OlsqLzB4MDBhZS8qOjpdKi86IHsgLyogbjpcIlNjZW5NYW5cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBhZi8qOjpdKi86IHsgLyogbjpcIlNDRU5BUklPXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYjAvKjo6XSovOiB7IC8qIG46XCJTeFZpZXdcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBiMS8qOjpdKi86IHsgLyogbjpcIlN4dmRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBiMi8qOjpdKi86IHsgLyogbjpcIlNYVklcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBiNC8qOjpdKi86IHsgLyogbjpcIlN4SXZkXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYjUvKjo6XSovOiB7IC8qIG46XCJTWExJXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYjYvKjo6XSovOiB7IC8qIG46XCJTWFBJXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYjgvKjo6XSovOiB7IC8qIG46XCJEb2NSb3V0ZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGI5Lyo6Ol0qLzogeyAvKiBuOlwiUmVjaXBOYW1lXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYmQvKjo6XSovOiB7IC8qIG46XCJNdWxSa1wiLCAqLyBmOnBhcnNlX011bFJrIH0sXG5cdC8qOjpbKi8weDAwYmUvKjo6XSovOiB7IC8qIG46XCJNdWxCbGFua1wiLCAqLyBmOnBhcnNlX011bEJsYW5rIH0sXG5cdC8qOjpbKi8weDAwYzEvKjo6XSovOiB7IC8qIG46XCJNbXNcIiwgKi8gZjpwYXJzZW5vb3AyIH0sXG5cdC8qOjpbKi8weDAwYzUvKjo6XSovOiB7IC8qIG46XCJTWERJXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYzYvKjo6XSovOiB7IC8qIG46XCJTWERCXCIsICovIH0sXG5cdC8qOjpbKi8weDAwYzcvKjo6XSovOiB7IC8qIG46XCJTWEZEQlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGM4Lyo6Ol0qLzogeyAvKiBuOlwiU1hEQkJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBjOS8qOjpdKi86IHsgLyogbjpcIlNYTnVtXCIsICovIH0sXG5cdC8qOjpbKi8weDAwY2EvKjo6XSovOiB7IC8qIG46XCJTeEJvb2xcIiwgKi8gZjpwYXJzZWJvb2wgfSxcblx0Lyo6OlsqLzB4MDBjYi8qOjpdKi86IHsgLyogbjpcIlN4RXJyXCIsICovIH0sXG5cdC8qOjpbKi8weDAwY2MvKjo6XSovOiB7IC8qIG46XCJTWEludFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGNkLyo6Ol0qLzogeyAvKiBuOlwiU1hTdHJpbmdcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBjZS8qOjpdKi86IHsgLyogbjpcIlNYRHRyXCIsICovIH0sXG5cdC8qOjpbKi8weDAwY2YvKjo6XSovOiB7IC8qIG46XCJTeE5pbFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGQwLyo6Ol0qLzogeyAvKiBuOlwiU1hUYmxcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBkMS8qOjpdKi86IHsgLyogbjpcIlNYVEJSR0lJVE1cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBkMi8qOjpdKi86IHsgLyogbjpcIlN4VGJwZ1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGQzLyo6Ol0qLzogeyAvKiBuOlwiT2JQcm9qXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZDUvKjo6XSovOiB7IC8qIG46XCJTWFN0cmVhbUlEXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZDcvKjo6XSovOiB7IC8qIG46XCJEQkNlbGxcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBkOC8qOjpdKi86IHsgLyogbjpcIlNYUm5nXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZDkvKjo6XSovOiB7IC8qIG46XCJTeElzeG9wZXJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBkYS8qOjpdKi86IHsgLyogbjpcIkJvb2tCb29sXCIsICovIGY6cGFyc2V1aW50MTYgfSxcblx0Lyo6OlsqLzB4MDBkYy8qOjpdKi86IHsgLyogbjpcIkRiT3JQYXJhbVFyeVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGRkLyo6Ol0qLzogeyAvKiBuOlwiU2NlbmFyaW9Qcm90ZWN0XCIsICovIGY6cGFyc2Vib29sIH0sXG5cdC8qOjpbKi8weDAwZGUvKjo6XSovOiB7IC8qIG46XCJPbGVPYmplY3RTaXplXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZTAvKjo6XSovOiB7IC8qIG46XCJYRlwiLCAqLyBmOnBhcnNlX1hGIH0sXG5cdC8qOjpbKi8weDAwZTEvKjo6XSovOiB7IC8qIG46XCJJbnRlcmZhY2VIZHJcIiwgKi8gZjpwYXJzZV9JbnRlcmZhY2VIZHIgfSxcblx0Lyo6OlsqLzB4MDBlMi8qOjpdKi86IHsgLyogbjpcIkludGVyZmFjZUVuZFwiLCAqLyBmOnBhcnNlbm9vcDIgfSxcblx0Lyo6OlsqLzB4MDBlMy8qOjpdKi86IHsgLyogbjpcIlNYVlNcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBlNS8qOjpdKi86IHsgLyogbjpcIk1lcmdlQ2VsbHNcIiwgKi8gZjpwYXJzZV9NZXJnZUNlbGxzIH0sXG5cdC8qOjpbKi8weDAwZTkvKjo6XSovOiB7IC8qIG46XCJCa0hpbVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGViLyo6Ol0qLzogeyAvKiBuOlwiTXNvRHJhd2luZ0dyb3VwXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZWMvKjo6XSovOiB7IC8qIG46XCJNc29EcmF3aW5nXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZWQvKjo6XSovOiB7IC8qIG46XCJNc29EcmF3aW5nU2VsZWN0aW9uXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZWYvKjo6XSovOiB7IC8qIG46XCJQaG9uZXRpY0luZm9cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBmMC8qOjpdKi86IHsgLyogbjpcIlN4UnVsZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGYxLyo6Ol0qLzogeyAvKiBuOlwiU1hFeFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGYyLyo6Ol0qLzogeyAvKiBuOlwiU3hGaWx0XCIsICovIH0sXG5cdC8qOjpbKi8weDAwZjQvKjo6XSovOiB7IC8qIG46XCJTeERYRlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGY1Lyo6Ol0qLzogeyAvKiBuOlwiU3hJdG1cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBmNi8qOjpdKi86IHsgLyogbjpcIlN4TmFtZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGY3Lyo6Ol0qLzogeyAvKiBuOlwiU3hTZWxlY3RcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBmOC8qOjpdKi86IHsgLyogbjpcIlNYUGFpclwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGY5Lyo6Ol0qLzogeyAvKiBuOlwiU3hGbWxhXCIsICovIH0sXG5cdC8qOjpbKi8weDAwZmIvKjo6XSovOiB7IC8qIG46XCJTeEZvcm1hdFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGZjLyo6Ol0qLzogeyAvKiBuOlwiU1NUXCIsICovIGY6cGFyc2VfU1NUIH0sXG5cdC8qOjpbKi8weDAwZmQvKjo6XSovOiB7IC8qIG46XCJMYWJlbFNzdFwiLCAqLyBmOnBhcnNlX0xhYmVsU3N0IH0sXG5cdC8qOjpbKi8weDAwZmYvKjo6XSovOiB7IC8qIG46XCJFeHRTU1RcIiwgKi8gZjpwYXJzZV9FeHRTU1QgfSxcblx0Lyo6OlsqLzB4MDEwMC8qOjpdKi86IHsgLyogbjpcIlNYVkRFeFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTAzLyo6Ol0qLzogeyAvKiBuOlwiU1hGb3JtdWxhXCIsICovIH0sXG5cdC8qOjpbKi8weDAxMjIvKjo6XSovOiB7IC8qIG46XCJTWERCRXhcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDEzNy8qOjpdKi86IHsgLyogbjpcIlJSREluc0RlbFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTM4Lyo6Ol0qLzogeyAvKiBuOlwiUlJESGVhZFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTNiLyo6Ol0qLzogeyAvKiBuOlwiUlJEQ2hnQ2VsbFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTNkLyo6Ol0qLzogeyAvKiBuOlwiUlJUYWJJZFwiLCAqLyBmOnBhcnNldWludDE2YSB9LFxuXHQvKjo6WyovMHgwMTNlLyo6Ol0qLzogeyAvKiBuOlwiUlJEUmVuU2hlZXRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDEzZi8qOjpdKi86IHsgLyogbjpcIlJSU29ydFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTQwLyo6Ol0qLzogeyAvKiBuOlwiUlJETW92ZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTRhLyo6Ol0qLzogeyAvKiBuOlwiUlJGb3JtYXRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDE0Yi8qOjpdKi86IHsgLyogbjpcIlJSQXV0b0ZtdFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTRkLyo6Ol0qLzogeyAvKiBuOlwiUlJJbnNlcnRTaFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTRlLyo6Ol0qLzogeyAvKiBuOlwiUlJETW92ZUJlZ2luXCIsICovIH0sXG5cdC8qOjpbKi8weDAxNGYvKjo6XSovOiB7IC8qIG46XCJSUkRNb3ZlRW5kXCIsICovIH0sXG5cdC8qOjpbKi8weDAxNTAvKjo6XSovOiB7IC8qIG46XCJSUkRJbnNEZWxCZWdpblwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTUxLyo6Ol0qLzogeyAvKiBuOlwiUlJESW5zRGVsRW5kXCIsICovIH0sXG5cdC8qOjpbKi8weDAxNTIvKjo6XSovOiB7IC8qIG46XCJSUkRDb25mbGljdFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTUzLyo6Ol0qLzogeyAvKiBuOlwiUlJERGVmTmFtZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTU0Lyo6Ol0qLzogeyAvKiBuOlwiUlJEUnN0RXR4cFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTVmLyo6Ol0qLzogeyAvKiBuOlwiTFJuZ1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTYwLyo6Ol0qLzogeyAvKiBuOlwiVXNlc0VMRnNcIiwgKi8gZjpwYXJzZWJvb2wgfSxcblx0Lyo6OlsqLzB4MDE2MS8qOjpdKi86IHsgLyogbjpcIkRTRlwiLCAqLyBmOnBhcnNlbm9vcDIgfSxcblx0Lyo6OlsqLzB4MDE5MS8qOjpdKi86IHsgLyogbjpcIkNVc3JcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDE5Mi8qOjpdKi86IHsgLyogbjpcIkNiVXNyXCIsICovIH0sXG5cdC8qOjpbKi8weDAxOTMvKjo6XSovOiB7IC8qIG46XCJVc3JJbmZvXCIsICovIH0sXG5cdC8qOjpbKi8weDAxOTQvKjo6XSovOiB7IC8qIG46XCJVc3JFeGNsXCIsICovIH0sXG5cdC8qOjpbKi8weDAxOTUvKjo6XSovOiB7IC8qIG46XCJGaWxlTG9ja1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTk2Lyo6Ol0qLzogeyAvKiBuOlwiUlJESW5mb1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTk3Lyo6Ol0qLzogeyAvKiBuOlwiQkNVc3JzXCIsICovIH0sXG5cdC8qOjpbKi8weDAxOTgvKjo6XSovOiB7IC8qIG46XCJVc3JDaGtcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDFhOS8qOjpdKi86IHsgLyogbjpcIlVzZXJCVmlld1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMWFhLyo6Ol0qLzogeyAvKiBuOlwiVXNlclNWaWV3QmVnaW5cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDFhYi8qOjpdKi86IHsgLyogbjpcIlVzZXJTVmlld0VuZFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMWFjLyo6Ol0qLzogeyAvKiBuOlwiUlJEVXNlclZpZXdcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDFhZC8qOjpdKi86IHsgLyogbjpcIlFzaVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMWFlLyo6Ol0qLzogeyAvKiBuOlwiU3VwQm9va1wiLCAqLyBmOnBhcnNlX1N1cEJvb2sgfSxcblx0Lyo6OlsqLzB4MDFhZi8qOjpdKi86IHsgLyogbjpcIlByb3Q0UmV2XCIsICovIGY6cGFyc2Vib29sIH0sXG5cdC8qOjpbKi8weDAxYjAvKjo6XSovOiB7IC8qIG46XCJDb25kRm10XCIsICovIH0sXG5cdC8qOjpbKi8weDAxYjEvKjo6XSovOiB7IC8qIG46XCJDRlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMWIyLyo6Ol0qLzogeyAvKiBuOlwiRFZhbFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMWI1Lyo6Ol0qLzogeyAvKiBuOlwiRENvbkJpblwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMWI2Lyo6Ol0qLzogeyAvKiBuOlwiVHhPXCIsICovIGY6cGFyc2VfVHhPIH0sXG5cdC8qOjpbKi8weDAxYjcvKjo6XSovOiB7IC8qIG46XCJSZWZyZXNoQWxsXCIsICovIGY6cGFyc2Vib29sIH0sIC8vXG5cdC8qOjpbKi8weDAxYjgvKjo6XSovOiB7IC8qIG46XCJITGlua1wiLCAqLyBmOnBhcnNlX0hMaW5rIH0sXG5cdC8qOjpbKi8weDAxYjkvKjo6XSovOiB7IC8qIG46XCJMZWxcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDFiYS8qOjpdKi86IHsgLyogbjpcIkNvZGVOYW1lXCIsICovIGY6cGFyc2VfWExVbmljb2RlU3RyaW5nIH0sXG5cdC8qOjpbKi8weDAxYmIvKjo6XSovOiB7IC8qIG46XCJTWEZEQlR5cGVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDFiYy8qOjpdKi86IHsgLyogbjpcIlByb3Q0UmV2UGFzc1wiLCAqLyBmOnBhcnNldWludDE2IH0sXG5cdC8qOjpbKi8weDAxYmQvKjo6XSovOiB7IC8qIG46XCJPYk5vTWFjcm9zXCIsICovIH0sXG5cdC8qOjpbKi8weDAxYmUvKjo6XSovOiB7IC8qIG46XCJEdlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMWMwLyo6Ol0qLzogeyAvKiBuOlwiRXhjZWw5RmlsZVwiLCAqLyBmOnBhcnNlbm9vcDIgfSxcblx0Lyo6OlsqLzB4MDFjMS8qOjpdKi86IHsgLyogbjpcIlJlY2FsY0lkXCIsICovIGY6cGFyc2VfUmVjYWxjSWQsIHI6Mn0sXG5cdC8qOjpbKi8weDAxYzIvKjo6XSovOiB7IC8qIG46XCJFbnRFeFUyXCIsICovIGY6cGFyc2Vub29wMiB9LFxuXHQvKjo6WyovMHgwMjAwLyo6Ol0qLzogeyAvKiBuOlwiRGltZW5zaW9uc1wiLCAqLyBmOnBhcnNlX0RpbWVuc2lvbnMgfSxcblx0Lyo6OlsqLzB4MDIwMS8qOjpdKi86IHsgLyogbjpcIkJsYW5rXCIsICovIGY6cGFyc2VfQmxhbmsgfSxcblx0Lyo6OlsqLzB4MDIwMy8qOjpdKi86IHsgLyogbjpcIk51bWJlclwiLCAqLyBmOnBhcnNlX051bWJlciB9LFxuXHQvKjo6WyovMHgwMjA0Lyo6Ol0qLzogeyAvKiBuOlwiTGFiZWxcIiwgKi8gZjpwYXJzZV9MYWJlbCB9LFxuXHQvKjo6WyovMHgwMjA1Lyo6Ol0qLzogeyAvKiBuOlwiQm9vbEVyclwiLCAqLyBmOnBhcnNlX0Jvb2xFcnIgfSxcblx0Lyo6OlsqLzB4MDIwNy8qOjpdKi86IHsgLyogbjpcIlN0cmluZ1wiLCAqLyBmOnBhcnNlX1N0cmluZyB9LFxuXHQvKjo6WyovMHgwMjA4Lyo6Ol0qLzogeyAvKiBuOlwiUm93XCIsICovIGY6cGFyc2VfUm93IH0sXG5cdC8qOjpbKi8weDAyMGIvKjo6XSovOiB7IC8qIG46XCJJbmRleFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMjIxLyo6Ol0qLzogeyAvKiBuOlwiQXJyYXlcIiwgKi8gZjpwYXJzZV9BcnJheSB9LFxuXHQvKjo6WyovMHgwMjI1Lyo6Ol0qLzogeyAvKiBuOlwiRGVmYXVsdFJvd0hlaWdodFwiLCAqLyBmOnBhcnNlX0RlZmF1bHRSb3dIZWlnaHQgfSxcblx0Lyo6OlsqLzB4MDIzNi8qOjpdKi86IHsgLyogbjpcIlRhYmxlXCIsICovIH0sXG5cdC8qOjpbKi8weDAyM2UvKjo6XSovOiB7IC8qIG46XCJXaW5kb3cyXCIsICovIGY6cGFyc2VfV2luZG93MiB9LFxuXHQvKjo6WyovMHgwMjdlLyo6Ol0qLzogeyAvKiBuOlwiUktcIiwgKi8gZjpwYXJzZV9SSyB9LFxuXHQvKjo6WyovMHgwMjkzLyo6Ol0qLzogeyAvKiBuOlwiU3R5bGVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDQxOC8qOjpdKi86IHsgLyogbjpcIkJpZ05hbWVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDQxZS8qOjpdKi86IHsgLyogbjpcIkZvcm1hdFwiLCAqLyBmOnBhcnNlX0Zvcm1hdCB9LFxuXHQvKjo6WyovMHgwNDNjLyo6Ol0qLzogeyAvKiBuOlwiQ29udGludWVCaWdOYW1lXCIsICovIH0sXG5cdC8qOjpbKi8weDA0YmMvKjo6XSovOiB7IC8qIG46XCJTaHJGbWxhXCIsICovIGY6cGFyc2VfU2hyRm1sYSB9LFxuXHQvKjo6WyovMHgwODAwLyo6Ol0qLzogeyAvKiBuOlwiSExpbmtUb29sdGlwXCIsICovIGY6cGFyc2VfSExpbmtUb29sdGlwIH0sXG5cdC8qOjpbKi8weDA4MDEvKjo6XSovOiB7IC8qIG46XCJXZWJQdWJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDgwMi8qOjpdKi86IHsgLyogbjpcIlFzaVNYVGFnXCIsICovIH0sXG5cdC8qOjpbKi8weDA4MDMvKjo6XSovOiB7IC8qIG46XCJEQlF1ZXJ5RXh0XCIsICovIH0sXG5cdC8qOjpbKi8weDA4MDQvKjo6XSovOiB7IC8qIG46XCJFeHRTdHJpbmdcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDgwNS8qOjpdKi86IHsgLyogbjpcIlR4dFFyeVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODA2Lyo6Ol0qLzogeyAvKiBuOlwiUXNpclwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODA3Lyo6Ol0qLzogeyAvKiBuOlwiUXNpZlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODA4Lyo6Ol0qLzogeyAvKiBuOlwiUlJEVFFTSUZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDgwOS8qOjpdKi86IHsgLyogbjpcIkJPRlwiLCAqLyBmOnBhcnNlX0JPRiB9LFxuXHQvKjo6WyovMHgwODBhLyo6Ol0qLzogeyAvKiBuOlwiT2xlRGJDb25uXCIsICovIH0sXG5cdC8qOjpbKi8weDA4MGIvKjo6XSovOiB7IC8qIG46XCJXT3B0XCIsICovIH0sXG5cdC8qOjpbKi8weDA4MGMvKjo6XSovOiB7IC8qIG46XCJTWFZpZXdFeFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODBkLyo6Ol0qLzogeyAvKiBuOlwiU1hUSFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODBlLyo6Ol0qLzogeyAvKiBuOlwiU1hQSUV4XCIsICovIH0sXG5cdC8qOjpbKi8weDA4MGYvKjo6XSovOiB7IC8qIG46XCJTWFZEVEV4XCIsICovIH0sXG5cdC8qOjpbKi8weDA4MTAvKjo6XSovOiB7IC8qIG46XCJTWFZpZXdFeDlcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDgxMi8qOjpdKi86IHsgLyogbjpcIkNvbnRpbnVlRnJ0XCIsICovIH0sXG5cdC8qOjpbKi8weDA4MTMvKjo6XSovOiB7IC8qIG46XCJSZWFsVGltZURhdGFcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg1MC8qOjpdKi86IHsgLyogbjpcIkNoYXJ0RnJ0SW5mb1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwODUxLyo6Ol0qLzogeyAvKiBuOlwiRnJ0V3JhcHBlclwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODUyLyo6Ol0qLzogeyAvKiBuOlwiU3RhcnRCbG9ja1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwODUzLyo6Ol0qLzogeyAvKiBuOlwiRW5kQmxvY2tcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg1NC8qOjpdKi86IHsgLyogbjpcIlN0YXJ0T2JqZWN0XCIsICovIH0sXG5cdC8qOjpbKi8weDA4NTUvKjo6XSovOiB7IC8qIG46XCJFbmRPYmplY3RcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg1Ni8qOjpdKi86IHsgLyogbjpcIkNhdExhYlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODU3Lyo6Ol0qLzogeyAvKiBuOlwiWU11bHRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg1OC8qOjpdKi86IHsgLyogbjpcIlNYVmlld0xpbmtcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg1OS8qOjpdKi86IHsgLyogbjpcIlBpdm90Q2hhcnRCaXRzXCIsICovIH0sXG5cdC8qOjpbKi8weDA4NWEvKjo6XSovOiB7IC8qIG46XCJGcnRGb250TGlzdFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODYyLyo6Ol0qLzogeyAvKiBuOlwiU2hlZXRFeHRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg2My8qOjpdKi86IHsgLyogbjpcIkJvb2tFeHRcIiwgKi8gcjoxMn0sXG5cdC8qOjpbKi8weDA4NjQvKjo6XSovOiB7IC8qIG46XCJTWEFkZGxcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg2NS8qOjpdKi86IHsgLyogbjpcIkNyRXJyXCIsICovIH0sXG5cdC8qOjpbKi8weDA4NjYvKjo6XSovOiB7IC8qIG46XCJIRlBpY3R1cmVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg2Ny8qOjpdKi86IHsgLyogbjpcIkZlYXRIZHJcIiwgKi8gZjpwYXJzZW5vb3AyIH0sXG5cdC8qOjpbKi8weDA4NjgvKjo6XSovOiB7IC8qIG46XCJGZWF0XCIsICovIH0sXG5cdC8qOjpbKi8weDA4NmEvKjo6XSovOiB7IC8qIG46XCJEYXRhTGFiRXh0XCIsICovIH0sXG5cdC8qOjpbKi8weDA4NmIvKjo6XSovOiB7IC8qIG46XCJEYXRhTGFiRXh0Q29udGVudHNcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg2Yy8qOjpdKi86IHsgLyogbjpcIkNlbGxXYXRjaFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODcxLyo6Ol0qLzogeyAvKiBuOlwiRmVhdEhkcjExXCIsICovIH0sXG5cdC8qOjpbKi8weDA4NzIvKjo6XSovOiB7IC8qIG46XCJGZWF0dXJlMTFcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg3NC8qOjpdKi86IHsgLyogbjpcIkRyb3BEb3duT2JqSWRzXCIsICovIH0sXG5cdC8qOjpbKi8weDA4NzUvKjo6XSovOiB7IC8qIG46XCJDb250aW51ZUZydDExXCIsICovIH0sXG5cdC8qOjpbKi8weDA4NzYvKjo6XSovOiB7IC8qIG46XCJEQ29ublwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODc3Lyo6Ol0qLzogeyAvKiBuOlwiTGlzdDEyXCIsICovIH0sXG5cdC8qOjpbKi8weDA4NzgvKjo6XSovOiB7IC8qIG46XCJGZWF0dXJlMTJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg3OS8qOjpdKi86IHsgLyogbjpcIkNvbmRGbXQxMlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODdhLyo6Ol0qLzogeyAvKiBuOlwiQ0YxMlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODdiLyo6Ol0qLzogeyAvKiBuOlwiQ0ZFeFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODdjLyo6Ol0qLzogeyAvKiBuOlwiWEZDUkNcIiwgKi8gZjpwYXJzZV9YRkNSQywgcjoxMiB9LFxuXHQvKjo6WyovMHgwODdkLyo6Ol0qLzogeyAvKiBuOlwiWEZFeHRcIiwgKi8gZjpwYXJzZV9YRkV4dCwgcjoxMiB9LFxuXHQvKjo6WyovMHgwODdlLyo6Ol0qLzogeyAvKiBuOlwiQXV0b0ZpbHRlcjEyXCIsICovIH0sXG5cdC8qOjpbKi8weDA4N2YvKjo6XSovOiB7IC8qIG46XCJDb250aW51ZUZydDEyXCIsICovIH0sXG5cdC8qOjpbKi8weDA4ODQvKjo6XSovOiB7IC8qIG46XCJNRFRJbmZvXCIsICovIH0sXG5cdC8qOjpbKi8weDA4ODUvKjo6XSovOiB7IC8qIG46XCJNRFhTdHJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg4Ni8qOjpdKi86IHsgLyogbjpcIk1EWFR1cGxlXCIsICovIH0sXG5cdC8qOjpbKi8weDA4ODcvKjo6XSovOiB7IC8qIG46XCJNRFhTZXRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg4OC8qOjpdKi86IHsgLyogbjpcIk1EWFByb3BcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg4OS8qOjpdKi86IHsgLyogbjpcIk1EWEtQSVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODhhLyo6Ol0qLzogeyAvKiBuOlwiTURCXCIsICovIH0sXG5cdC8qOjpbKi8weDA4OGIvKjo6XSovOiB7IC8qIG46XCJQTFZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg4Yy8qOjpdKi86IHsgLyogbjpcIkNvbXBhdDEyXCIsICovIGY6cGFyc2Vib29sLCByOjEyIH0sXG5cdC8qOjpbKi8weDA4OGQvKjo6XSovOiB7IC8qIG46XCJEWEZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg4ZS8qOjpdKi86IHsgLyogbjpcIlRhYmxlU3R5bGVzXCIsICovIHI6MTIgfSxcblx0Lyo6OlsqLzB4MDg4Zi8qOjpdKi86IHsgLyogbjpcIlRhYmxlU3R5bGVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg5MC8qOjpdKi86IHsgLyogbjpcIlRhYmxlU3R5bGVFbGVtZW50XCIsICovIH0sXG5cdC8qOjpbKi8weDA4OTIvKjo6XSovOiB7IC8qIG46XCJTdHlsZUV4dFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODkzLyo6Ol0qLzogeyAvKiBuOlwiTmFtZVB1Ymxpc2hcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg5NC8qOjpdKi86IHsgLyogbjpcIk5hbWVDbXRcIiwgKi8gZjpwYXJzZV9OYW1lQ210LCByOjEyIH0sXG5cdC8qOjpbKi8weDA4OTUvKjo6XSovOiB7IC8qIG46XCJTb3J0RGF0YVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODk2Lyo6Ol0qLzogeyAvKiBuOlwiVGhlbWVcIiwgKi8gZjpwYXJzZV9UaGVtZSwgcjoxMiB9LFxuXHQvKjo6WyovMHgwODk3Lyo6Ol0qLzogeyAvKiBuOlwiR1VJRFR5cGVMaWJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg5OC8qOjpdKi86IHsgLyogbjpcIkZuR3JwMTJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg5OS8qOjpdKi86IHsgLyogbjpcIk5hbWVGbkdycDEyXCIsICovIH0sXG5cdC8qOjpbKi8weDA4OWEvKjo6XSovOiB7IC8qIG46XCJNVFJTZXR0aW5nc1wiLCAqLyBmOnBhcnNlX01UUlNldHRpbmdzLCByOjEyIH0sXG5cdC8qOjpbKi8weDA4OWIvKjo6XSovOiB7IC8qIG46XCJDb21wcmVzc1BpY3R1cmVzXCIsICovIGY6cGFyc2Vub29wMiB9LFxuXHQvKjo6WyovMHgwODljLyo6Ol0qLzogeyAvKiBuOlwiSGVhZGVyRm9vdGVyXCIsICovIH0sXG5cdC8qOjpbKi8weDA4OWQvKjo6XSovOiB7IC8qIG46XCJDcnRMYXlvdXQxMlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwODllLyo6Ol0qLzogeyAvKiBuOlwiQ3J0TWxGcnRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg5Zi8qOjpdKi86IHsgLyogbjpcIkNydE1sRnJ0Q29udGludWVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhhMy8qOjpdKi86IHsgLyogbjpcIkZvcmNlRnVsbENhbGN1bGF0aW9uXCIsICovIGY6cGFyc2VfRm9yY2VGdWxsQ2FsY3VsYXRpb24gfSxcblx0Lyo6OlsqLzB4MDhhNC8qOjpdKi86IHsgLyogbjpcIlNoYXBlUHJvcHNTdHJlYW1cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhhNS8qOjpdKi86IHsgLyogbjpcIlRleHRQcm9wc1N0cmVhbVwiLCAqLyB9LFxuXHQvKjo6WyovMHgwOGE2Lyo6Ol0qLzogeyAvKiBuOlwiUmljaFRleHRTdHJlYW1cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhhNy8qOjpdKi86IHsgLyogbjpcIkNydExheW91dDEyQVwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDAxLyo6Ol0qLzogeyAvKiBuOlwiVW5pdHNcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAwMi8qOjpdKi86IHsgLyogbjpcIkNoYXJ0XCIsICovIH0sXG5cdC8qOjpbKi8weDEwMDMvKjo6XSovOiB7IC8qIG46XCJTZXJpZXNcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAwNi8qOjpdKi86IHsgLyogbjpcIkRhdGFGb3JtYXRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAwNy8qOjpdKi86IHsgLyogbjpcIkxpbmVGb3JtYXRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAwOS8qOjpdKi86IHsgLyogbjpcIk1hcmtlckZvcm1hdFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDBhLyo6Ol0qLzogeyAvKiBuOlwiQXJlYUZvcm1hdFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDBiLyo6Ol0qLzogeyAvKiBuOlwiUGllRm9ybWF0XCIsICovIH0sXG5cdC8qOjpbKi8weDEwMGMvKjo6XSovOiB7IC8qIG46XCJBdHRhY2hlZExhYmVsXCIsICovIH0sXG5cdC8qOjpbKi8weDEwMGQvKjo6XSovOiB7IC8qIG46XCJTZXJpZXNUZXh0XCIsICovIH0sXG5cdC8qOjpbKi8weDEwMTQvKjo6XSovOiB7IC8qIG46XCJDaGFydEZvcm1hdFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDE1Lyo6Ol0qLzogeyAvKiBuOlwiTGVnZW5kXCIsICovIH0sXG5cdC8qOjpbKi8weDEwMTYvKjo6XSovOiB7IC8qIG46XCJTZXJpZXNMaXN0XCIsICovIH0sXG5cdC8qOjpbKi8weDEwMTcvKjo6XSovOiB7IC8qIG46XCJCYXJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAxOC8qOjpdKi86IHsgLyogbjpcIkxpbmVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAxOS8qOjpdKi86IHsgLyogbjpcIlBpZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDFhLyo6Ol0qLzogeyAvKiBuOlwiQXJlYVwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDFiLyo6Ol0qLzogeyAvKiBuOlwiU2NhdHRlclwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDFjLyo6Ol0qLzogeyAvKiBuOlwiQ3J0TGluZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDFkLyo6Ol0qLzogeyAvKiBuOlwiQXhpc1wiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDFlLyo6Ol0qLzogeyAvKiBuOlwiVGlja1wiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDFmLyo6Ol0qLzogeyAvKiBuOlwiVmFsdWVSYW5nZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDIwLyo6Ol0qLzogeyAvKiBuOlwiQ2F0U2VyUmFuZ2VcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAyMS8qOjpdKi86IHsgLyogbjpcIkF4aXNMaW5lXCIsICovIH0sXG5cdC8qOjpbKi8weDEwMjIvKjo6XSovOiB7IC8qIG46XCJDcnRMaW5rXCIsICovIH0sXG5cdC8qOjpbKi8weDEwMjQvKjo6XSovOiB7IC8qIG46XCJEZWZhdWx0VGV4dFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDI1Lyo6Ol0qLzogeyAvKiBuOlwiVGV4dFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDI2Lyo6Ol0qLzogeyAvKiBuOlwiRm9udFhcIiwgKi8gZjpwYXJzZXVpbnQxNiB9LFxuXHQvKjo6WyovMHgxMDI3Lyo6Ol0qLzogeyAvKiBuOlwiT2JqZWN0TGlua1wiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDMyLyo6Ol0qLzogeyAvKiBuOlwiRnJhbWVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAzMy8qOjpdKi86IHsgLyogbjpcIkJlZ2luXCIsICovIH0sXG5cdC8qOjpbKi8weDEwMzQvKjo6XSovOiB7IC8qIG46XCJFbmRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTAzNS8qOjpdKi86IHsgLyogbjpcIlBsb3RBcmVhXCIsICovIH0sXG5cdC8qOjpbKi8weDEwM2EvKjo6XSovOiB7IC8qIG46XCJDaGFydDNkXCIsICovIH0sXG5cdC8qOjpbKi8weDEwM2MvKjo6XSovOiB7IC8qIG46XCJQaWNGXCIsICovIH0sXG5cdC8qOjpbKi8weDEwM2QvKjo6XSovOiB7IC8qIG46XCJEcm9wQmFyXCIsICovIH0sXG5cdC8qOjpbKi8weDEwM2UvKjo6XSovOiB7IC8qIG46XCJSYWRhclwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDNmLyo6Ol0qLzogeyAvKiBuOlwiU3VyZlwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDQwLyo6Ol0qLzogeyAvKiBuOlwiUmFkYXJBcmVhXCIsICovIH0sXG5cdC8qOjpbKi8weDEwNDEvKjo6XSovOiB7IC8qIG46XCJBeGlzUGFyZW50XCIsICovIH0sXG5cdC8qOjpbKi8weDEwNDMvKjo6XSovOiB7IC8qIG46XCJMZWdlbmRFeGNlcHRpb25cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTA0NC8qOjpdKi86IHsgLyogbjpcIlNodFByb3BzXCIsICovIGY6cGFyc2VfU2h0UHJvcHMgfSxcblx0Lyo6OlsqLzB4MTA0NS8qOjpdKi86IHsgLyogbjpcIlNlclRvQ3J0XCIsICovIH0sXG5cdC8qOjpbKi8weDEwNDYvKjo6XSovOiB7IC8qIG46XCJBeGVzVXNlZFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDQ4Lyo6Ol0qLzogeyAvKiBuOlwiU0Jhc2VSZWZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTA0YS8qOjpdKi86IHsgLyogbjpcIlNlclBhcmVudFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDRiLyo6Ol0qLzogeyAvKiBuOlwiU2VyQXV4VHJlbmRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTA0ZS8qOjpdKi86IHsgLyogbjpcIklGbXRSZWNvcmRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTA0Zi8qOjpdKi86IHsgLyogbjpcIlBvc1wiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDUwLyo6Ol0qLzogeyAvKiBuOlwiQWxSdW5zXCIsICovIH0sXG5cdC8qOjpbKi8weDEwNTEvKjo6XSovOiB7IC8qIG46XCJCUkFJXCIsICovIH0sXG5cdC8qOjpbKi8weDEwNWIvKjo6XSovOiB7IC8qIG46XCJTZXJBdXhFcnJCYXJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTA1Yy8qOjpdKi86IHsgLyogbjpcIkNscnRDbGllbnRcIiwgKi8gZjpwYXJzZV9DbHJ0Q2xpZW50IH0sXG5cdC8qOjpbKi8weDEwNWQvKjo6XSovOiB7IC8qIG46XCJTZXJGbXRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTA1Zi8qOjpdKi86IHsgLyogbjpcIkNoYXJ0M0RCYXJTaGFwZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDYwLyo6Ol0qLzogeyAvKiBuOlwiRmJpXCIsICovIH0sXG5cdC8qOjpbKi8weDEwNjEvKjo6XSovOiB7IC8qIG46XCJCb3BQb3BcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MTA2Mi8qOjpdKi86IHsgLyogbjpcIkF4Y0V4dFwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDYzLyo6Ol0qLzogeyAvKiBuOlwiRGF0XCIsICovIH0sXG5cdC8qOjpbKi8weDEwNjQvKjo6XSovOiB7IC8qIG46XCJQbG90R3Jvd3RoXCIsICovIH0sXG5cdC8qOjpbKi8weDEwNjUvKjo6XSovOiB7IC8qIG46XCJTSUluZGV4XCIsICovIH0sXG5cdC8qOjpbKi8weDEwNjYvKjo6XSovOiB7IC8qIG46XCJHZWxGcmFtZVwiLCAqLyB9LFxuXHQvKjo6WyovMHgxMDY3Lyo6Ol0qLzogeyAvKiBuOlwiQm9wUG9wQ3VzdG9tXCIsICovIH0sXG5cdC8qOjpbKi8weDEwNjgvKjo6XSovOiB7IC8qIG46XCJGYmkyXCIsICovIH0sXG5cblx0Lyo6OlsqLzB4MDAwMC8qOjpdKi86IHsgLyogbjpcIkRpbWVuc2lvbnNcIiwgKi8gZjpwYXJzZV9EaW1lbnNpb25zIH0sXG5cdC8qOjpbKi8weDAwMDEvKjo6XSovOiB7IC8qIG46XCJCSUZGMkJMQU5LXCIsICovIH0sXG5cdC8qOjpbKi8weDAwMDIvKjo6XSovOiB7IC8qIG46XCJCSUZGMklOVFwiLCAqLyBmOnBhcnNlX0JJRkYySU5UIH0sXG5cdC8qOjpbKi8weDAwMDMvKjo6XSovOiB7IC8qIG46XCJCSUZGMk5VTVwiLCAqLyBmOnBhcnNlX0JJRkYyTlVNIH0sXG5cdC8qOjpbKi8weDAwMDQvKjo6XSovOiB7IC8qIG46XCJCSUZGMlNUUlwiLCAqLyBmOnBhcnNlX0JJRkYyU1RSIH0sXG5cdC8qOjpbKi8weDAwMDUvKjo6XSovOiB7IC8qIG46XCJCb29sRXJyXCIsICovIGY6cGFyc2VfQm9vbEVyciB9LFxuXHQvKjo6WyovMHgwMDA3Lyo6Ol0qLzogeyAvKiBuOlwiU3RyaW5nXCIsICovIGY6cGFyc2VfQklGRjJTVFJJTkcgfSxcblx0Lyo6OlsqLzB4MDAwOC8qOjpdKi86IHsgLyogbjpcIkJJRkYyUk9XXCIsICovIH0sXG5cdC8qOjpbKi8weDAwMDkvKjo6XSovOiB7IC8qIG46XCJCT0ZcIiwgKi8gZjpwYXJzZV9CT0YgfSxcblx0Lyo6OlsqLzB4MDAwYi8qOjpdKi86IHsgLyogbjpcIkluZGV4XCIsICovIH0sXG5cdC8qOjpbKi8weDAwMTYvKjo6XSovOiB7IC8qIG46XCJFeHRlcm5Db3VudFwiLCAqLyBmOnBhcnNldWludDE2IH0sXG5cdC8qOjpbKi8weDAwMWUvKjo6XSovOiB7IC8qIG46XCJCSUZGMkZPUk1BVFwiLCAqLyBmOnBhcnNlX0JJRkYyRm9ybWF0IH0sXG5cdC8qOjpbKi8weDAwMWYvKjo6XSovOiB7IC8qIG46XCJCSUZGMkZNVENOVFwiLCAqLyB9LCAvKiAxNi1iaXQgY250IG9mIEJJRkYyRk9STUFUIHJlY29yZHMgKi9cblx0Lyo6OlsqLzB4MDAyMC8qOjpdKi86IHsgLyogbjpcIkJJRkYyQ09MSU5GT1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDIxLyo6Ol0qLzogeyAvKiBuOlwiQXJyYXlcIiwgKi8gZjpwYXJzZV9BcnJheSB9LFxuXHQvKjo6WyovMHgwMDI0Lyo6Ol0qLzogeyAvKiBuOlwiQ09MV0lEVEhcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDAyNS8qOjpdKi86IHsgLyogbjpcIkRlZmF1bHRSb3dIZWlnaHRcIiwgKi8gZjpwYXJzZV9EZWZhdWx0Um93SGVpZ2h0IH0sXG5cdC8vIDB4MmMgPz9cblx0Ly8gMHgyZCA/P1xuXHQvLyAweDJlID8/XG5cdC8vIDB4MzAgRk9OVENPVU5UOiBudW1iZXIgb2YgZm9udHNcblx0Lyo6OlsqLzB4MDAzMi8qOjpdKi86IHsgLyogbjpcIkJJRkYyRk9OVFhUUkFcIiwgKi8gZjpwYXJzZV9CSUZGMkZPTlRYVFJBIH0sXG5cdC8vIDB4MzU6IElORk9PUFRTXG5cdC8vIDB4MzY6IFRBQkxFIChCSUZGMiBvbmx5KVxuXHQvLyAweDM3OiBUQUJMRTIgKEJJRkYyIG9ubHkpXG5cdC8vIDB4Mzg6IFdOREVTS1xuXHQvLyAweDM5ID8/XG5cdC8vIDB4M2E6IEJFR0lOUFJFRlxuXHQvLyAweDNiOiBFTkRQUkVGXG5cdC8qOjpbKi8weDAwM2UvKjo6XSovOiB7IC8qIG46XCJCSUZGMldJTkRPVzJcIiwgKi8gfSxcblx0Ly8gMHgzZiA/P1xuXHQvLyAweDQ2OiBTSE9XU0NST0xMXG5cdC8vIDB4NDc6IFNIT1dGT1JNVUxBXG5cdC8vIDB4NDg6IFNUQVRVU0JBUlxuXHQvLyAweDQ5OiBTSE9SVE1FTlVTXG5cdC8vIDB4NEE6XG5cdC8vIDB4NEI6XG5cdC8vIDB4NEM6XG5cdC8vIDB4NEU6XG5cdC8vIDB4NEY6XG5cdC8vIDB4NTg6IFRPT0xCQVIgKEJJRkYzKVxuXG5cdC8qIC0gLSAtICovXG5cdC8qOjpbKi8weDAwMzQvKjo6XSovOiB7IC8qIG46XCJEREVPYmpOYW1lXCIsICovIH0sXG5cdC8qOjpbKi8weDAwNDMvKjo6XSovOiB7IC8qIG46XCJCSUZGMlhGXCIsICovIH0sXG5cdC8qOjpbKi8weDAwNDQvKjo6XSovOiB7IC8qIG46XCJCSUZGMlhGSU5ERVhcIiwgKi8gZjpwYXJzZXVpbnQxNiB9LFxuXHQvKjo6WyovMHgwMDQ1Lyo6Ol0qLzogeyAvKiBuOlwiQklGRjJGT05UQ0xSXCIsICovIH0sXG5cdC8qOjpbKi8weDAwNTYvKjo6XSovOiB7IC8qIG46XCJCSUZGNEZNVENOVFwiLCAqLyB9LCAvKiAxNi1iaXQgY250LCBzaW1pbGFyIHRvIEJJRkYyICovXG5cdC8qOjpbKi8weDAwN2UvKjo6XSovOiB7IC8qIG46XCJSS1wiLCAqLyB9LCAvKiBOb3QgbmVjZXNzYXJpbHkgc2FtZSBhcyAweDAyN2UgKi9cblx0Lyo6OlsqLzB4MDA3Zi8qOjpdKi86IHsgLyogbjpcIkltRGF0YVwiLCAqLyBmOnBhcnNlX0ltRGF0YSB9LFxuXHQvKjo6WyovMHgwMDg3Lyo6Ol0qLzogeyAvKiBuOlwiQWRkaW5cIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDA4OC8qOjpdKi86IHsgLyogbjpcIkVkZ1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDg5Lyo6Ol0qLzogeyAvKiBuOlwiUHViXCIsICovIH0sXG5cdC8vIDB4OEFcblx0Ly8gMHg4QiBMSDogYWx0ZXJuYXRlIG1lbnUga2V5IGZsYWcgKEJJRkYzLzQpXG5cdC8vIDB4OEVcblx0Ly8gMHg4RlxuXHQvKjo6WyovMHgwMDkxLyo6Ol0qLzogeyAvKiBuOlwiU3ViXCIsICovIH0sXG5cdC8vIDB4OTMgU1RZTEVcblx0Lyo6OlsqLzB4MDA5NC8qOjpdKi86IHsgLyogbjpcIkxIUmVjb3JkXCIsICovIH0sXG5cdC8qOjpbKi8weDAwOTUvKjo6XSovOiB7IC8qIG46XCJMSE5HcmFwaFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMDk2Lyo6Ol0qLzogeyAvKiBuOlwiU291bmRcIiwgKi8gfSxcblx0Ly8gMHhBMiBGTlBST1RPOiBmdW5jdGlvbiBwcm90b3R5cGVzIChCSUZGNClcblx0Ly8gMHhBM1xuXHQvLyAweEE4XG5cdC8qOjpbKi8weDAwYTkvKjo6XSovOiB7IC8qIG46XCJDb29yZExpc3RcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBhYi8qOjpdKi86IHsgLyogbjpcIkdDV1wiLCAqLyB9LFxuXHQvKjo6WyovMHgwMGJjLyo6Ol0qLzogeyAvKiBuOlwiU2hyRm1sYVwiLCAqLyB9LCAvKiBOb3QgbmVjZXNzYXJpbHkgc2FtZSBhcyAweDA0YmMgKi9cblx0Lyo6OlsqLzB4MDBiZi8qOjpdKi86IHsgLyogbjpcIlRvb2xiYXJIZHJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBjMC8qOjpdKi86IHsgLyogbjpcIlRvb2xiYXJFbmRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBjMi8qOjpdKi86IHsgLyogbjpcIkFkZE1lbnVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBjMy8qOjpdKi86IHsgLyogbjpcIkRlbE1lbnVcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBkNi8qOjpdKi86IHsgLyogbjpcIlJTdHJpbmdcIiwgKi8gZjpwYXJzZV9SU3RyaW5nIH0sXG5cdC8qOjpbKi8weDAwZGYvKjo6XSovOiB7IC8qIG46XCJVRERlc2NcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDBlYS8qOjpdKi86IHsgLyogbjpcIlRhYklkQ29uZlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwMTYyLyo6Ol0qLzogeyAvKiBuOlwiWEw1TW9kaWZ5XCIsICovIH0sXG5cdC8qOjpbKi8weDAxYTUvKjo6XSovOiB7IC8qIG46XCJGaWxlU2hhcmluZzJcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDIwNi8qOjpdKi86IHsgLyogbjpcIkZvcm11bGFcIiwgKi8gZjpwYXJzZV9Gb3JtdWxhIH0sXG5cdC8qOjpbKi8weDAyMDkvKjo6XSovOiB7IC8qIG46XCJCT0ZcIiwgKi8gZjpwYXJzZV9CT0YgfSxcblx0Lyo6OlsqLzB4MDIxOC8qOjpdKi86IHsgLyogbjpcIkxibFwiLCAqLyBmOnBhcnNlX0xibCB9LFxuXHQvKjo6WyovMHgwMjIzLyo6Ol0qLzogeyAvKiBuOlwiRXh0ZXJuTmFtZVwiLCAqLyBmOnBhcnNlX0V4dGVybk5hbWUgfSxcblx0Lyo6OlsqLzB4MDIzMS8qOjpdKi86IHsgLyogbjpcIkZvbnRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDI0My8qOjpdKi86IHsgLyogbjpcIkJJRkYzWEZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDQwNi8qOjpdKi86IHsgLyogbjpcIkZvcm11bGFcIiwgKi8gZjpwYXJzZV9Gb3JtdWxhIH0sXG5cdC8qOjpbKi8weDA0MDkvKjo6XSovOiB7IC8qIG46XCJCT0ZcIiwgKi8gZjpwYXJzZV9CT0YgfSxcblx0Lyo6OlsqLzB4MDQ0My8qOjpdKi86IHsgLyogbjpcIkJJRkY0WEZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDg2ZC8qOjpdKi86IHsgLyogbjpcIkZlYXRJbmZvXCIsICovIH0sXG5cdC8qOjpbKi8weDA4NzMvKjo6XSovOiB7IC8qIG46XCJGZWF0SW5mbzExXCIsICovIH0sXG5cdC8qOjpbKi8weDA4ODEvKjo6XSovOiB7IC8qIG46XCJTWEFkZGwxMlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwOGMwLyo6Ol0qLzogeyAvKiBuOlwiQXV0b1dlYlB1YlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwOGMxLyo6Ol0qLzogeyAvKiBuOlwiTGlzdE9ialwiLCAqLyB9LFxuXHQvKjo6WyovMHgwOGMyLyo6Ol0qLzogeyAvKiBuOlwiTGlzdEZpZWxkXCIsICovIH0sXG5cdC8qOjpbKi8weDA4YzMvKjo6XSovOiB7IC8qIG46XCJMaXN0RFZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhjNC8qOjpdKi86IHsgLyogbjpcIkxpc3RDb25kRm10XCIsICovIH0sXG5cdC8qOjpbKi8weDA4YzUvKjo6XSovOiB7IC8qIG46XCJMaXN0Q0ZcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhjNi8qOjpdKi86IHsgLyogbjpcIkZNUXJ5XCIsICovIH0sXG5cdC8qOjpbKi8weDA4YzcvKjo6XSovOiB7IC8qIG46XCJGTVNRcnlcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhjOC8qOjpdKi86IHsgLyogbjpcIlBMVlwiLCAqLyB9LFxuXHQvKjo6WyovMHgwOGM5Lyo6Ol0qLzogeyAvKiBuOlwiTG5FeHRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhjYS8qOjpdKi86IHsgLyogbjpcIk1rckV4dFwiLCAqLyB9LFxuXHQvKjo6WyovMHgwOGNiLyo6Ol0qLzogeyAvKiBuOlwiQ3J0Q29vcHRcIiwgKi8gfSxcblx0Lyo6OlsqLzB4MDhkNi8qOjpdKi86IHsgLyogbjpcIkZSVEFyY2hJZCRcIiwgKi8gcjoxMiB9LFxuXG5cdC8qOjpbKi8weDcyNjIvKjo6XSovOiB7fVxufTtcblxuZnVuY3Rpb24gd3JpdGVfYmlmZl9yZWMoYmEvKjpCdWZBcnJheSovLCB0eXBlLyo6bnVtYmVyKi8sIHBheWxvYWQsIGxlbmd0aC8qOj9udW1iZXIqLykvKjp2b2lkKi8ge1xuXHR2YXIgdC8qOm51bWJlciovID0gdHlwZTtcblx0aWYoaXNOYU4odCkpIHJldHVybjtcblx0dmFyIGxlbiA9IGxlbmd0aCB8fCAocGF5bG9hZHx8W10pLmxlbmd0aCB8fCAwO1xuXHR2YXIgbyA9IGJhLm5leHQoNCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgdCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgbGVuKTtcblx0aWYoLyo6OiBsZW4gIT0gbnVsbCAmJiovbGVuID4gMCAmJiBpc19idWYocGF5bG9hZCkpIGJhLnB1c2gocGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2JpZmZfY29udGludWUoYmEvKjpCdWZBcnJheSovLCB0eXBlLyo6bnVtYmVyKi8sIHBheWxvYWQsIGxlbmd0aC8qOj9udW1iZXIqLykvKjp2b2lkKi8ge1xuXHR2YXIgbGVuID0gbGVuZ3RoIHx8IChwYXlsb2FkfHxbXSkubGVuZ3RoIHx8IDA7XG5cdGlmKGxlbiA8PSA4MjI0KSByZXR1cm4gd3JpdGVfYmlmZl9yZWMoYmEsIHR5cGUsIHBheWxvYWQsIGxlbik7XG5cdHZhciB0ID0gdHlwZTtcblx0aWYoaXNOYU4odCkpIHJldHVybjtcblx0dmFyIHBhcnRzID0gcGF5bG9hZC5wYXJ0cyB8fCBbXSwgc2lkeCA9IDA7XG5cdHZhciBpID0gMCwgdyA9IDA7XG5cdHdoaWxlKHcgKyAocGFydHNbc2lkeF0gfHwgODIyNCkgPD0gODIyNCkgeyB3Kz0gKHBhcnRzW3NpZHhdIHx8IDgyMjQpOyBzaWR4Kys7IH1cblx0dmFyIG8gPSBiYS5uZXh0KDQpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHQpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHcpO1xuXHRiYS5wdXNoKHBheWxvYWQuc2xpY2UoaSwgaSArIHcpKTtcblx0aSArPSB3O1xuXHR3aGlsZShpIDwgbGVuKSB7XG5cdFx0byA9IGJhLm5leHQoNCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAweDNjKTsgLy8gVE9ETzogZmlndXJlIG91dCBjb3JyZWN0IGNvbnRpbnVlIHR5cGVcblx0XHR3ID0gMDtcblx0XHR3aGlsZSh3ICsgKHBhcnRzW3NpZHhdIHx8IDgyMjQpIDw9IDgyMjQpIHsgdys9IChwYXJ0c1tzaWR4XSB8fCA4MjI0KTsgc2lkeCsrOyB9XG5cdFx0by53cml0ZV9zaGlmdCgyLCB3KTtcblx0XHRiYS5wdXNoKHBheWxvYWQuc2xpY2UoaSwgaSt3KSk7IGkrPSB3O1xuXHR9XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0JJRkYyQ2VsbChvdXQsIHIvKjpudW1iZXIqLywgYy8qOm51bWJlciovKSB7XG5cdGlmKCFvdXQpIG91dCA9IG5ld19idWYoNyk7XG5cdG91dC53cml0ZV9zaGlmdCgyLCByKTtcblx0b3V0LndyaXRlX3NoaWZ0KDIsIGMpO1xuXHRvdXQud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG91dC53cml0ZV9zaGlmdCgxLCAwKTtcblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gd3JpdGVfQklGRjJCRVJSKHIvKjpudW1iZXIqLywgYy8qOm51bWJlciovLCB2YWwsIHQvKjo/c3RyaW5nKi8pIHtcblx0dmFyIG91dCA9IG5ld19idWYoOSk7XG5cdHdyaXRlX0JJRkYyQ2VsbChvdXQsIHIsIGMpO1xuXHR3cml0ZV9CZXModmFsLCB0IHx8ICdiJywgb3V0KTtcblx0cmV0dXJuIG91dDtcbn1cblxuLyogVE9ETzogY29kZXBhZ2UsIGxhcmdlIHN0cmluZ3MgKi9cbmZ1bmN0aW9uIHdyaXRlX0JJRkYyTEFCRUwoci8qOm51bWJlciovLCBjLyo6bnVtYmVyKi8sIHZhbCkge1xuXHR2YXIgb3V0ID0gbmV3X2J1Zig4ICsgMip2YWwubGVuZ3RoKTtcblx0d3JpdGVfQklGRjJDZWxsKG91dCwgciwgYyk7XG5cdG91dC53cml0ZV9zaGlmdCgxLCB2YWwubGVuZ3RoKTtcblx0b3V0LndyaXRlX3NoaWZ0KHZhbC5sZW5ndGgsIHZhbCwgJ3NiY3MnKTtcblx0cmV0dXJuIG91dC5sIDwgb3V0Lmxlbmd0aCA/IG91dC5zbGljZSgwLCBvdXQubCkgOiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3dzX2JpZmYyX2NlbGwoYmEvKjpCdWZBcnJheSovLCBjZWxsLyo6Q2VsbCovLCBSLyo6bnVtYmVyKi8sIEMvKjpudW1iZXIqLy8qOjosIG9wdHMqLykge1xuXHRpZihjZWxsLnYgIT0gbnVsbCkgc3dpdGNoKGNlbGwudCkge1xuXHRcdGNhc2UgJ2QnOiBjYXNlICduJzpcblx0XHRcdHZhciB2ID0gY2VsbC50ID09ICdkJyA/IGRhdGVudW0ocGFyc2VEYXRlKGNlbGwudikpIDogY2VsbC52O1xuXHRcdFx0aWYoKHYgPT0gKHZ8MCkpICYmICh2ID49IDApICYmICh2IDwgNjU1MzYpKVxuXHRcdFx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDAyLCB3cml0ZV9CSUZGMklOVChSLCBDLCB2KSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwMDMsIHdyaXRlX0JJRkYyTlVNKFIsQywgdikpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdGNhc2UgJ2InOiBjYXNlICdlJzogd3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwNSwgd3JpdGVfQklGRjJCRVJSKFIsIEMsIGNlbGwudiwgY2VsbC50KSk7IHJldHVybjtcblx0XHQvKiBUT0RPOiBjb2RlcGFnZSwgc3N0ICovXG5cdFx0Y2FzZSAncyc6IGNhc2UgJ3N0cic6XG5cdFx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDA0LCB3cml0ZV9CSUZGMkxBQkVMKFIsIEMsIChjZWxsLnZ8fFwiXCIpLnNsaWNlKDAsMjU1KSkpO1xuXHRcdFx0cmV0dXJuO1xuXHR9XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwMDEsIHdyaXRlX0JJRkYyQ2VsbChudWxsLCBSLCBDKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3dzX2JpZmYyKGJhLyo6QnVmQXJyYXkqLywgd3MvKjpXb3Jrc2hlZXQqLywgaWR4Lyo6bnVtYmVyKi8sIG9wdHMvKjo6LCB3YjpXb3JrYm9vayovKSB7XG5cdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddIHx8IFwiQTFcIiksIHJlZi8qOnN0cmluZyovLCByciA9IFwiXCIsIGNvbHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0aWYocmFuZ2UuZS5jID4gMHhGRiB8fCByYW5nZS5lLnIgPiAweDNGRkYpIHtcblx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2UgXCIgKyAod3NbJyFyZWYnXSB8fCBcIkExXCIpICsgXCIgZXhjZWVkcyBmb3JtYXQgbGltaXQgQTE6SVYxNjM4NFwiKTtcblx0XHRyYW5nZS5lLmMgPSBNYXRoLm1pbihyYW5nZS5lLmMsIDB4RkYpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWluKHJhbmdlLmUuYywgMHgzRkZGKTtcblx0XHRyZWYgPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHR9XG5cdGZvcih2YXIgUiA9IHJhbmdlLnMucjsgUiA8PSByYW5nZS5lLnI7ICsrUikge1xuXHRcdHJyID0gZW5jb2RlX3JvdyhSKTtcblx0XHRmb3IodmFyIEMgPSByYW5nZS5zLmM7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIHtcblx0XHRcdGlmKFIgPT09IHJhbmdlLnMucikgY29sc1tDXSA9IGVuY29kZV9jb2woQyk7XG5cdFx0XHRyZWYgPSBjb2xzW0NdICsgcnI7XG5cdFx0XHR2YXIgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tyZWZdO1xuXHRcdFx0aWYoIWNlbGwpIGNvbnRpbnVlO1xuXHRcdFx0Lyogd3JpdGUgY2VsbCAqL1xuXHRcdFx0d3JpdGVfd3NfYmlmZjJfY2VsbChiYSwgY2VsbCwgUiwgQywgb3B0cyk7XG5cdFx0fVxuXHR9XG59XG5cbi8qIEJhc2VkIG9uIHRlc3QgZmlsZXMgKi9cbmZ1bmN0aW9uIHdyaXRlX2JpZmYyX2J1Zih3Yi8qOldvcmtib29rKi8sIG9wdHMvKjpXcml0ZU9wdHMqLykge1xuXHR2YXIgbyA9IG9wdHMgfHwge307XG5cdGlmKERFTlNFICE9IG51bGwgJiYgby5kZW5zZSA9PSBudWxsKSBvLmRlbnNlID0gREVOU0U7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR2YXIgaWR4ID0gMDtcblx0Zm9yKHZhciBpPTA7aTx3Yi5TaGVldE5hbWVzLmxlbmd0aDsrK2kpIGlmKHdiLlNoZWV0TmFtZXNbaV0gPT0gby5zaGVldCkgaWR4PWk7XG5cdGlmKGlkeCA9PSAwICYmICEhby5zaGVldCAmJiB3Yi5TaGVldE5hbWVzWzBdICE9IG8uc2hlZXQpIHRocm93IG5ldyBFcnJvcihcIlNoZWV0IG5vdCBmb3VuZDogXCIgKyBvLnNoZWV0KTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIChvLmJpZmYgPT0gNCA/IDB4MDQwOSA6IChvLmJpZmYgPT0gMyA/IDB4MDIwOSA6IDB4MDAwOSkpLCB3cml0ZV9CT0Yod2IsIDB4MTAsIG8pKTtcblx0LyogLi4uICovXG5cdHdyaXRlX3dzX2JpZmYyKGJhLCB3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgaWR4LCBvLCB3Yik7XG5cdC8qIC4uLiAqL1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDBBKTtcblx0cmV0dXJuIGJhLmVuZCgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9GT05UU19iaWZmOChiYSwgZGF0YSwgb3B0cykge1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDMxIC8qIEZvbnQgKi8sIHdyaXRlX0ZvbnQoe1xuXHRcdHN6OjEyLFxuXHRcdGNvbG9yOiB7dGhlbWU6MX0sXG5cdFx0bmFtZTogXCJBcmlhbFwiLFxuXHRcdGZhbWlseTogMixcblx0XHRzY2hlbWU6IFwibWlub3JcIlxuXHR9LCBvcHRzKSk7XG59XG5cblxuZnVuY3Rpb24gd3JpdGVfRk1UU19iaWZmOChiYSwgTkYvKjo/U1NGVGFibGUqLywgb3B0cykge1xuXHRpZighTkYpIHJldHVybjtcblx0W1s1LDhdLFsyMywyNl0sWzQxLDQ0XSxbLyo2MyovNTAsLyo2Nl0sWzE2NCwqLzM5Ml1dLmZvckVhY2goZnVuY3Rpb24ocikge1xuXHRcdC8qOjogaWYoIU5GKSByZXR1cm47ICovXG5cdFx0Zm9yKHZhciBpID0gclswXTsgaSA8PSByWzFdOyArK2kpIGlmKE5GW2ldICE9IG51bGwpIHdyaXRlX2JpZmZfcmVjKGJhLCAweDA0MUUgLyogRm9ybWF0ICovLCB3cml0ZV9Gb3JtYXQoaSwgTkZbaV0sIG9wdHMpKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0ZFQVQoYmEsIHdzKSB7XG5cdC8qIFtNUy1YTFNdIDIuNC4xMTIgKi9cblx0dmFyIG8gPSBuZXdfYnVmKDE5KTtcblx0by53cml0ZV9zaGlmdCg0LCAweDg2Nyk7IG8ud3JpdGVfc2hpZnQoNCwgMCk7IG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMyk7IG8ud3JpdGVfc2hpZnQoMSwgMSk7IG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDA4NjcgLyogRmVhdEhkciAqLywgbyk7XG5cdC8qIFtNUy1YTFNdIDIuNC4xMTEgKi9cblx0byA9IG5ld19idWYoMzkpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDB4ODY4KTsgby53cml0ZV9zaGlmdCg0LCAwKTsgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAzKTsgby53cml0ZV9zaGlmdCgxLCAwKTsgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAxKTsgby53cml0ZV9zaGlmdCg0LCA0KTsgby53cml0ZV9zaGlmdCgyLCAwKTtcblx0d3JpdGVfUmVmOFUoc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXXx8XCJBMVwiKSwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgNCk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDA4NjggLyogRmVhdCAqLywgbyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0NFTExYRlNfYmlmZjgoYmEsIG9wdHMpIHtcblx0Zm9yKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwZTAgLyogWEYgKi8sIHdyaXRlX1hGKHtudW1GbXRJZDowLCBzdHlsZTp0cnVlfSwgMCwgb3B0cykpO1xuXHRvcHRzLmNlbGxYZnMuZm9yRWFjaChmdW5jdGlvbihjKSB7XG5cdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDBlMCAvKiBYRiAqLywgd3JpdGVfWEYoYywgMCwgb3B0cykpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfd3NfYmlmZjhfaGxpbmtzKGJhLyo6QnVmQXJyYXkqLywgd3MpIHtcblx0Zm9yKHZhciBSPTA7IFI8d3NbJyFsaW5rcyddLmxlbmd0aDsgKytSKSB7XG5cdFx0dmFyIEhMID0gd3NbJyFsaW5rcyddW1JdO1xuXHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAxYjggLyogSExpbmsgKi8sIHdyaXRlX0hMaW5rKEhMKSk7XG5cdFx0aWYoSExbMV0uVG9vbHRpcCkgd3JpdGVfYmlmZl9yZWMoYmEsIDB4MDgwMCAvKiBITGlua1Rvb2x0aXAgKi8sIHdyaXRlX0hMaW5rVG9vbHRpcChITCkpO1xuXHR9XG5cdGRlbGV0ZSB3c1snIWxpbmtzJ107XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3dzX2NvbHNfYmlmZjgoYmEsIGNvbHMpIHtcblx0aWYoIWNvbHMpIHJldHVybjtcblx0dmFyIGNudCA9IDA7XG5cdGNvbHMuZm9yRWFjaChmdW5jdGlvbihjb2wsIGlkeCkge1xuXHRcdGlmKCsrY250IDw9IDI1NiAmJiBjb2wpIHtcblx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwN2QgLyogQ29sSW5mbyAqLywgd3JpdGVfQ29sSW5mbyhjb2xfb2JqX3coaWR4LCBjb2wpLCBpZHgpKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93c19iaWZmOF9jZWxsKGJhLyo6QnVmQXJyYXkqLywgY2VsbC8qOkNlbGwqLywgUi8qOm51bWJlciovLCBDLyo6bnVtYmVyKi8sIG9wdHMpIHtcblx0dmFyIG9zID0gMTYgKyBnZXRfY2VsbF9zdHlsZShvcHRzLmNlbGxYZnMsIGNlbGwsIG9wdHMpO1xuXHRpZihjZWxsLnYgPT0gbnVsbCAmJiAhY2VsbC5iZikge1xuXHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAyMDEgLyogQmxhbmsgKi8sIHdyaXRlX1hMU0NlbGwoUiwgQywgb3MpKTtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYoY2VsbC5iZikgd3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwNiAvKiBGb3JtdWxhICovLCB3cml0ZV9Gb3JtdWxhKGNlbGwsIFIsIEMsIG9wdHMsIG9zKSk7XG5cdGVsc2Ugc3dpdGNoKGNlbGwudCkge1xuXHRcdGNhc2UgJ2QnOiBjYXNlICduJzpcblx0XHRcdHZhciB2ID0gY2VsbC50ID09ICdkJyA/IGRhdGVudW0ocGFyc2VEYXRlKGNlbGwudikpIDogY2VsbC52O1xuXHRcdFx0LyogVE9ETzogZW1pdCBSSyBhcyBhcHByb3ByaWF0ZSAqL1xuXHRcdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDIwMyAvKiBOdW1iZXIgKi8sIHdyaXRlX051bWJlcihSLCBDLCB2LCBvcywgb3B0cykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnYic6IGNhc2UgJ2UnOlxuXHRcdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDIwNSAvKiBCb29sRXJyICovLCB3cml0ZV9Cb29sRXJyKFIsIEMsIGNlbGwudiwgb3MsIG9wdHMsIGNlbGwudCkpO1xuXHRcdFx0YnJlYWs7XG5cdFx0LyogVE9ETzogY29kZXBhZ2UsIHNzdCAqL1xuXHRcdGNhc2UgJ3MnOiBjYXNlICdzdHInOlxuXHRcdFx0aWYob3B0cy5ib29rU1NUKSB7XG5cdFx0XHRcdHZhciBpc3N0ID0gZ2V0X3NzdF9pZChvcHRzLlN0cmluZ3MsIGNlbGwudiwgb3B0cy5yZXZTdHJpbmdzKTtcblx0XHRcdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDBmZCAvKiBMYWJlbFNzdCAqLywgd3JpdGVfTGFiZWxTc3QoUiwgQywgaXNzdCwgb3MsIG9wdHMpKTtcblx0XHRcdH0gZWxzZSB3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMjA0IC8qIExhYmVsICovLCB3cml0ZV9MYWJlbChSLCBDLCAoY2VsbC52fHxcIlwiKS5zbGljZSgwLDI1NSksIG9zLCBvcHRzKSk7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDIwMSAvKiBCbGFuayAqLywgd3JpdGVfWExTQ2VsbChSLCBDLCBvcykpO1xuXHR9XG59XG5cbi8qIFtNUy1YTFNdIDIuMS43LjIwLjUgKi9cbmZ1bmN0aW9uIHdyaXRlX3dzX2JpZmY4KGlkeC8qOm51bWJlciovLCBvcHRzLCB3Yi8qOldvcmtib29rKi8pIHtcblx0dmFyIGJhID0gYnVmX2FycmF5KCk7XG5cdHZhciBzID0gd2IuU2hlZXROYW1lc1tpZHhdLCB3cyA9IHdiLlNoZWV0c1tzXSB8fCB7fTtcblx0dmFyIF9XQi8qOldCV0JQcm9wcyovID0gKCh3Ynx8e30pLldvcmtib29rfHx7fS8qOmFueSovKTtcblx0dmFyIF9zaGVldC8qOldCV1NQcm9wKi8gPSAoKF9XQi5TaGVldHN8fFtdKVtpZHhdfHx7fS8qOmFueSovKTtcblx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdHZhciBiOCA9IG9wdHMuYmlmZiA9PSA4O1xuXHR2YXIgcmVmLyo6c3RyaW5nKi8sIHJyID0gXCJcIiwgY29scy8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddIHx8IFwiQTFcIik7XG5cdHZhciBNQVhfUk9XUyA9IGI4ID8gNjU1MzYgOiAxNjM4NDtcblx0aWYocmFuZ2UuZS5jID4gMHhGRiB8fCByYW5nZS5lLnIgPj0gTUFYX1JPV1MpIHtcblx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2UgXCIgKyAod3NbJyFyZWYnXSB8fCBcIkExXCIpICsgXCIgZXhjZWVkcyBmb3JtYXQgbGltaXQgQTE6SVYxNjM4NFwiKTtcblx0XHRyYW5nZS5lLmMgPSBNYXRoLm1pbihyYW5nZS5lLmMsIDB4RkYpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWluKHJhbmdlLmUuYywgTUFYX1JPV1MtMSk7XG5cdH1cblxuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwODA5LCB3cml0ZV9CT0Yod2IsIDB4MTAsIG9wdHMpKTtcblx0LyogW1VuY2FsY2VkXSBJbmRleCAqL1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDBkIC8qIENhbGNNb2RlICovLCB3cml0ZXVpbnQxNigxKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwMGMgLyogQ2FsY0NvdW50ICovLCB3cml0ZXVpbnQxNigxMDApKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwZiAvKiBDYWxjUmVmTW9kZSAqLywgd3JpdGVib29sKHRydWUpKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAxMSAvKiBDYWxjSXRlciAqLywgd3JpdGVib29sKGZhbHNlKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwMTAgLyogQ2FsY0RlbHRhICovLCB3cml0ZV9YbnVtKDAuMDAxKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwNWYgLyogQ2FsY1NhdmVSZWNhbGMgKi8sIHdyaXRlYm9vbCh0cnVlKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwMmEgLyogUHJpbnRSb3dDb2wgKi8sIHdyaXRlYm9vbChmYWxzZSkpO1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDJiIC8qIFByaW50R3JpZCAqLywgd3JpdGVib29sKGZhbHNlKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwODIgLyogR3JpZFNldCAqLywgd3JpdGV1aW50MTYoMSkpO1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDgwIC8qIEd1dHMgKi8sIHdyaXRlX0d1dHMoWzAsMF0pKTtcblx0LyogRGVmYXVsdFJvd0hlaWdodCBXc0Jvb2wgW1N5bmNdIFtMUHJdIFtIb3Jpem9udGFsUGFnZUJyZWFrc10gW1ZlcnRpY2FsUGFnZUJyZWFrc10gKi9cblx0LyogSGVhZGVyIChzdHJpbmcpICovXG5cdC8qIEZvb3RlciAoc3RyaW5nKSAqL1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDgzIC8qIEhDZW50ZXIgKi8sIHdyaXRlYm9vbChmYWxzZSkpO1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDg0IC8qIFZDZW50ZXIgKi8sIHdyaXRlYm9vbChmYWxzZSkpO1xuXHQvKiAuLi4gKi9cblx0aWYoYjgpIHdyaXRlX3dzX2NvbHNfYmlmZjgoYmEsIHdzW1wiIWNvbHNcIl0pO1xuXHQvKiAuLi4gKi9cblx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MjAwLCB3cml0ZV9EaW1lbnNpb25zKHJhbmdlLCBvcHRzKSk7XG5cdC8qIC4uLiAqL1xuXG5cdGlmKGI4KSB3c1snIWxpbmtzJ10gPSBbXTtcblx0Zm9yKHZhciBSID0gcmFuZ2Uucy5yOyBSIDw9IHJhbmdlLmUucjsgKytSKSB7XG5cdFx0cnIgPSBlbmNvZGVfcm93KFIpO1xuXHRcdGZvcih2YXIgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xuXHRcdFx0aWYoUiA9PT0gcmFuZ2Uucy5yKSBjb2xzW0NdID0gZW5jb2RlX2NvbChDKTtcblx0XHRcdHJlZiA9IGNvbHNbQ10gKyBycjtcblx0XHRcdHZhciBjZWxsID0gZGVuc2UgPyAod3NbUl18fFtdKVtDXSA6IHdzW3JlZl07XG5cdFx0XHRpZighY2VsbCkgY29udGludWU7XG5cdFx0XHQvKiB3cml0ZSBjZWxsICovXG5cdFx0XHR3cml0ZV93c19iaWZmOF9jZWxsKGJhLCBjZWxsLCBSLCBDLCBvcHRzKTtcblx0XHRcdGlmKGI4ICYmIGNlbGwubCkgd3NbJyFsaW5rcyddLnB1c2goW3JlZiwgY2VsbC5sXSk7XG5cdFx0fVxuXHR9XG5cdHZhciBjbmFtZS8qOnN0cmluZyovID0gX3NoZWV0LkNvZGVOYW1lIHx8IF9zaGVldC5uYW1lIHx8IHM7XG5cdC8qIC4uLiAqL1xuXHRpZihiOCkgd3JpdGVfYmlmZl9yZWMoYmEsIDB4MDIzZSAvKiBXaW5kb3cyICovLCB3cml0ZV9XaW5kb3cyKChfV0IuVmlld3N8fFtdKVswXSkpO1xuXHQvKiAuLi4gKi9cblx0aWYoYjggJiYgKHdzWychbWVyZ2VzJ118fFtdKS5sZW5ndGgpIHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwZTUgLyogTWVyZ2VDZWxscyAqLywgd3JpdGVfTWVyZ2VDZWxscyh3c1snIW1lcmdlcyddKSk7XG5cdC8qIFtMUm5nXSAqUVVFUllUQUJMRSBbUEhPTkVUSUNJTkZPXSBDT05ERk1UUyAqL1xuXHRpZihiOCkgd3JpdGVfd3NfYmlmZjhfaGxpbmtzKGJhLCB3cyk7XG5cdC8qIFtEVkFMXSAqL1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMWJhIC8qIENvZGVOYW1lICovLCB3cml0ZV9YTFVuaWNvZGVTdHJpbmcoY25hbWUsIG9wdHMpKTtcblx0LyogKldlYlB1YiAqQ2VsbFdhdGNoIFtTaGVldEV4dF0gKi9cblx0aWYoYjgpIHdyaXRlX0ZFQVQoYmEsIHdzKTtcblx0LyogKkZFQVQxMSAqUkVDT1JEMTIgKi9cblx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwYSAvKiBFT0YgKi8pO1xuXHRyZXR1cm4gYmEuZW5kKCk7XG59XG5cbi8qIFtNUy1YTFNdIDIuMS43LjIwLjMgKi9cbmZ1bmN0aW9uIHdyaXRlX2JpZmY4X2dsb2JhbCh3Yi8qOldvcmtib29rKi8sIGJ1ZnMsIG9wdHMvKjpXcml0ZU9wdHMqLykge1xuXHR2YXIgQSA9IGJ1Zl9hcnJheSgpO1xuXHR2YXIgX1dCLyo6V0JXQlByb3BzKi8gPSAoKHdifHx7fSkuV29ya2Jvb2t8fHt9Lyo6YW55Ki8pO1xuXHR2YXIgX3NoZWV0cy8qOkFycmF5PFdCV1NQcm9wPiovID0gKF9XQi5TaGVldHN8fFtdKTtcblx0dmFyIF93Yi8qOldCUHJvcHMqLyA9IC8qOjooKCovX1dCLldCUHJvcHN8fHsvKjo6Q29kZU5hbWU6XCJUaGlzV29ya2Jvb2tcIiovfS8qOjogKTphbnkpKi87XG5cdHZhciBiOCA9IG9wdHMuYmlmZiA9PSA4LCBiNSA9IG9wdHMuYmlmZiA9PSA1O1xuXHR3cml0ZV9iaWZmX3JlYyhBLCAweDA4MDksIHdyaXRlX0JPRih3YiwgMHgwNSwgb3B0cykpO1xuXHRpZihvcHRzLmJvb2tUeXBlID09IFwieGxhXCIpIHdyaXRlX2JpZmZfcmVjKEEsIDB4MDA4NyAvKiBBZGRpbiAqLyk7XG5cdHdyaXRlX2JpZmZfcmVjKEEsIDB4MDBlMSAvKiBJbnRlcmZhY2VIZHIgKi8sIGI4ID8gd3JpdGV1aW50MTYoMHgwNGIwKSA6IG51bGwpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCAweDAwYzEgLyogTW1zICovLCB3cml0ZXplcm9lcygyKSk7XG5cdGlmKGI1KSB3cml0ZV9iaWZmX3JlYyhBLCAweDAwYmYgLyogVG9vbGJhckhkciAqLyk7XG5cdGlmKGI1KSB3cml0ZV9iaWZmX3JlYyhBLCAweDAwYzAgLyogVG9vbGJhckVuZCAqLyk7XG5cdHdyaXRlX2JpZmZfcmVjKEEsIDB4MDBlMiAvKiBJbnRlcmZhY2VFbmQgKi8pO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCAweDAwNWMgLyogV3JpdGVBY2Nlc3MgKi8sIHdyaXRlX1dyaXRlQWNjZXNzKFwiU2hlZXRKU1wiLCBvcHRzKSk7XG5cdC8qIFtGaWxlU2hhcmluZ10gKi9cblx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMDQyIC8qIENvZGVQYWdlICovLCB3cml0ZXVpbnQxNihiOCA/IDB4MDRiMCA6IDB4MDRFNCkpO1xuXHQvKiAqMjA0NyBMZWwgKi9cblx0aWYoYjgpIHdyaXRlX2JpZmZfcmVjKEEsIDB4MDE2MSAvKiBEU0YgKi8sIHdyaXRldWludDE2KDApKTtcblx0aWYoYjgpIHdyaXRlX2JpZmZfcmVjKEEsIDB4MDFjMCAvKiBFeGNlbDlGaWxlICovKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMTNkIC8qIFJSVGFiSWQgKi8sIHdyaXRlX1JSVGFiSWQod2IuU2hlZXROYW1lcy5sZW5ndGgpKTtcblx0aWYoYjggJiYgd2IudmJhcmF3KSB3cml0ZV9iaWZmX3JlYyhBLCAweDAwZDMgLyogT2JQcm9qICovKTtcblx0LyogW09iTm9NYWNyb3NdICovXG5cdGlmKGI4ICYmIHdiLnZiYXJhdykge1xuXHRcdHZhciBjbmFtZS8qOnN0cmluZyovID0gX3diLkNvZGVOYW1lIHx8IFwiVGhpc1dvcmtib29rXCI7XG5cdFx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMWJhIC8qIENvZGVOYW1lICovLCB3cml0ZV9YTFVuaWNvZGVTdHJpbmcoY25hbWUsIG9wdHMpKTtcblx0fVxuXHR3cml0ZV9iaWZmX3JlYyhBLCAweDAwOWMgLyogQnVpbHRJbkZuR3JvdXBDb3VudCAqLywgd3JpdGV1aW50MTYoMHgxMSkpO1xuXHQvKiAqRm5Hcm91cE5hbWUgKkZuR3JwMTIgKi9cblx0LyogKkxibCAqL1xuXHQvKiBbT2xlT2JqZWN0U2l6ZV0gKi9cblx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMDE5IC8qIFdpblByb3RlY3QgKi8sIHdyaXRlYm9vbChmYWxzZSkpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCAweDAwMTIgLyogUHJvdGVjdCAqLywgd3JpdGVib29sKGZhbHNlKSk7XG5cdHdyaXRlX2JpZmZfcmVjKEEsIDB4MDAxMyAvKiBQYXNzd29yZCAqLywgd3JpdGV1aW50MTYoMCkpO1xuXHRpZihiOCkgd3JpdGVfYmlmZl9yZWMoQSwgMHgwMWFmIC8qIFByb3Q0UmV2ICovLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0aWYoYjgpIHdyaXRlX2JpZmZfcmVjKEEsIDB4MDFiYyAvKiBQcm90NFJldlBhc3MgKi8sIHdyaXRldWludDE2KDApKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMDNkIC8qIFdpbmRvdzEgKi8sIHdyaXRlX1dpbmRvdzEob3B0cykpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCAweDAwNDAgLyogQmFja3VwICovLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMDhkIC8qIEhpZGVPYmogKi8sIHdyaXRldWludDE2KDApKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMDIyIC8qIERhdGUxOTA0ICovLCB3cml0ZWJvb2woc2FmZTE5MDQod2IpPT1cInRydWVcIikpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCAweDAwMGUgLyogQ2FsY1ByZWNpc2lvbiAqLywgd3JpdGVib29sKHRydWUpKTtcblx0aWYoYjgpIHdyaXRlX2JpZmZfcmVjKEEsIDB4MDFiNyAvKiBSZWZyZXNoQWxsICovLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgMHgwMERBIC8qIEJvb2tCb29sICovLCB3cml0ZXVpbnQxNigwKSk7XG5cdC8qIC4uLiAqL1xuXHR3cml0ZV9GT05UU19iaWZmOChBLCB3Yiwgb3B0cyk7XG5cdHdyaXRlX0ZNVFNfYmlmZjgoQSwgd2IuU1NGLCBvcHRzKTtcblx0d3JpdGVfQ0VMTFhGU19iaWZmOChBLCBvcHRzKTtcblx0LyogLi4uICovXG5cdGlmKGI4KSB3cml0ZV9iaWZmX3JlYyhBLCAweDAxNjAgLyogVXNlc0VMRnMgKi8sIHdyaXRlYm9vbChmYWxzZSkpO1xuXHR2YXIgYSA9IEEuZW5kKCk7XG5cblx0dmFyIEMgPSBidWZfYXJyYXkoKTtcblx0LyogTUVUQURBVEEgW01UUlNldHRpbmdzXSBbRm9yY2VGdWxsQ2FsY3VsYXRpb25dICovXG5cdGlmKGI4KSB3cml0ZV9iaWZmX3JlYyhDLCAweDAwOEMsIHdyaXRlX0NvdW50cnkoKSk7XG5cdC8qICpTVVBCT09LICpMQkwgKlJURCBbUmVjYWxjSWRdICpIRlBpY3R1cmUgKk1TT0RSQVdJTkdHUk9VUCAqL1xuXG5cdC8qIEJJRkY4OiBbU1NUICpDb250aW51ZV0gRXh0U1NUICovXG5cdGlmKGI4ICYmIG9wdHMuU3RyaW5ncykgd3JpdGVfYmlmZl9jb250aW51ZShDLCAweDAwRkMsIHdyaXRlX1NTVChvcHRzLlN0cmluZ3MsIG9wdHMpKTtcblxuXHQvKiAqV2ViUHViIFtXT3B0XSBbQ3JFcnJdIFtCb29rRXh0XSAqRmVhdEhkciAqRENvbm4gW1RIRU1FXSBbQ29tcHJlc3NQaWN0dXJlc10gW0NvbXBhdDEyXSBbR1VJRFR5cGVMaWJdICovXG5cdHdyaXRlX2JpZmZfcmVjKEMsIDB4MDAwQSAvKiBFT0YgKi8pO1xuXHR2YXIgYyA9IEMuZW5kKCk7XG5cblx0dmFyIEIgPSBidWZfYXJyYXkoKTtcblx0dmFyIGJsZW4gPSAwLCBqID0gMDtcblx0Zm9yKGogPSAwOyBqIDwgd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraikgYmxlbiArPSAoYjggPyAxMiA6IDExKSArIChiOCA/IDIgOiAxKSAqIHdiLlNoZWV0TmFtZXNbal0ubGVuZ3RoO1xuXHR2YXIgc3RhcnQgPSBhLmxlbmd0aCArIGJsZW4gKyBjLmxlbmd0aDtcblx0Zm9yKGogPSAwOyBqIDwgd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraikge1xuXHRcdHZhciBfc2hlZXQvKjpXQldTUHJvcCovID0gX3NoZWV0c1tqXSB8fCAoe30vKjphbnkqLyk7XG5cdFx0d3JpdGVfYmlmZl9yZWMoQiwgMHgwMDg1IC8qIEJvdW5kU2hlZXQ4ICovLCB3cml0ZV9Cb3VuZFNoZWV0OCh7cG9zOnN0YXJ0LCBoczpfc2hlZXQuSGlkZGVufHwwLCBkdDowLCBuYW1lOndiLlNoZWV0TmFtZXNbal19LCBvcHRzKSk7XG5cdFx0c3RhcnQgKz0gYnVmc1tqXS5sZW5ndGg7XG5cdH1cblx0LyogMSpCb3VuZFNoZWV0OCAqL1xuXHR2YXIgYiA9IEIuZW5kKCk7XG5cdGlmKGJsZW4gIT0gYi5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcIkJTOCBcIiArIGJsZW4gKyBcIiAhPSBcIiArIGIubGVuZ3RoKTtcblxuXHR2YXIgb3V0ID0gW107XG5cdGlmKGEubGVuZ3RoKSBvdXQucHVzaChhKTtcblx0aWYoYi5sZW5ndGgpIG91dC5wdXNoKGIpO1xuXHRpZihjLmxlbmd0aCkgb3V0LnB1c2goYyk7XG5cdHJldHVybiBiY29uY2F0KG91dCk7XG59XG5cbi8qIFtNUy1YTFNdIDIuMS43LjIwIFdvcmtib29rIFN0cmVhbSAqL1xuZnVuY3Rpb24gd3JpdGVfYmlmZjhfYnVmKHdiLyo6V29ya2Jvb2sqLywgb3B0cy8qOldyaXRlT3B0cyovKSB7XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0dmFyIGJ1ZnMgPSBbXTtcblxuXHRpZih3YiAmJiAhd2IuU1NGKSB7XG5cdFx0d2IuU1NGID0gZHVwKHRhYmxlX2ZtdCk7XG5cdH1cblx0aWYod2IgJiYgd2IuU1NGKSB7XG5cdFx0bWFrZV9zc2YoKTsgU1NGX2xvYWRfdGFibGUod2IuU1NGKTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdG8ucmV2c3NmID0gZXZlcnRfbnVtKHdiLlNTRik7IG8ucmV2c3NmW3diLlNTRls2NTUzNV1dID0gMDtcblx0XHRvLnNzZiA9IHdiLlNTRjtcblx0fVxuXG5cdG8uU3RyaW5ncyA9IC8qOjooKCovW10vKjo6IDphbnkpOlNTVCkqLzsgby5TdHJpbmdzLkNvdW50ID0gMDsgby5TdHJpbmdzLlVuaXF1ZSA9IDA7XG5cdGZpeF93cml0ZV9vcHRzKG8pO1xuXG5cdG8uY2VsbFhmcyA9IFtdO1xuXHRnZXRfY2VsbF9zdHlsZShvLmNlbGxYZnMsIHt9LCB7cmV2c3NmOntcIkdlbmVyYWxcIjowfX0pO1xuXG5cdGlmKCF3Yi5Qcm9wcykgd2IuUHJvcHMgPSB7fTtcblxuXHRmb3IodmFyIGkgPSAwOyBpIDwgd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkgYnVmc1tidWZzLmxlbmd0aF0gPSB3cml0ZV93c19iaWZmOChpLCBvLCB3Yik7XG5cdGJ1ZnMudW5zaGlmdCh3cml0ZV9iaWZmOF9nbG9iYWwod2IsIGJ1ZnMsIG8pKTtcblx0cmV0dXJuIGJjb25jYXQoYnVmcyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2JpZmZfYnVmKHdiLyo6V29ya2Jvb2sqLywgb3B0cy8qOldyaXRlT3B0cyovKSB7XG5cdGZvcih2YXIgaSA9IDA7IGkgPD0gd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciB3cyA9IHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW2ldXTtcblx0XHRpZighd3MgfHwgIXdzW1wiIXJlZlwiXSkgY29udGludWU7XG5cdFx0dmFyIHJhbmdlID0gZGVjb2RlX3JhbmdlKHdzW1wiIXJlZlwiXSk7XG5cdFx0aWYocmFuZ2UuZS5jID4gMjU1KSB7IC8vIG5vdGU6IDI1NSBpcyBJVlxuXHRcdGlmKHR5cGVvZiBjb25zb2xlICE9IFwidW5kZWZpbmVkXCIgJiYgY29uc29sZS5lcnJvcikgY29uc29sZS5lcnJvcihcIldvcmtzaGVldCAnXCIgKyB3Yi5TaGVldE5hbWVzW2ldICsgXCInIGV4dGVuZHMgYmV5b25kIGNvbHVtbiBJViAoMjU1KS4gIERhdGEgbWF5IGJlIGxvc3QuXCIpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0c3dpdGNoKG8uYmlmZiB8fCAyKSB7XG5cdFx0Y2FzZSA4OiBjYXNlIDU6IHJldHVybiB3cml0ZV9iaWZmOF9idWYod2IsIG9wdHMpO1xuXHRcdGNhc2UgNDogY2FzZSAzOiBjYXNlIDI6IHJldHVybiB3cml0ZV9iaWZmMl9idWYod2IsIG9wdHMpO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdHlwZSBcIiArIG8uYm9va1R5cGUgKyBcIiBmb3IgQklGRlwiKTtcbn1cbi8qIG5vdGU6IGJyb3dzZXIgRE9NIGVsZW1lbnQgY2Fubm90IHNlZSBtc28tIHN0eWxlIGF0dHJzLCBtdXN0IHBhcnNlICovXG5mdW5jdGlvbiBodG1sX3RvX3NoZWV0KHN0ci8qOnN0cmluZyovLCBfb3B0cykvKjpXb3JrYm9vayovIHtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0aWYoREVOU0UgIT0gbnVsbCAmJiBvcHRzLmRlbnNlID09IG51bGwpIG9wdHMuZGVuc2UgPSBERU5TRTtcblx0dmFyIHdzLyo6V29ya3NoZWV0Ki8gPSBvcHRzLmRlbnNlID8gKFtdLyo6YW55Ki8pIDogKHt9Lyo6YW55Ki8pO1xuXHRzdHIgPSBzdHIucmVwbGFjZSgvPCEtLS4qPy0tPi9nLCBcIlwiKTtcblx0dmFyIG10Y2gvKjphbnkqLyA9IHN0ci5tYXRjaCgvPHRhYmxlL2kpO1xuXHRpZighbXRjaCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBIVE1MOiBjb3VsZCBub3QgZmluZCA8dGFibGU+XCIpO1xuXHR2YXIgbXRjaDIvKjphbnkqLyA9IHN0ci5tYXRjaCgvPFxcL3RhYmxlL2kpO1xuXHR2YXIgaS8qOm51bWJlciovID0gbXRjaC5pbmRleCwgai8qOm51bWJlciovID0gbXRjaDIgJiYgbXRjaDIuaW5kZXggfHwgc3RyLmxlbmd0aDtcblx0dmFyIHJvd3MgPSBzcGxpdF9yZWdleChzdHIuc2xpY2UoaSwgaiksIC8oOj88dHJbXj5dKj4pL2ksIFwiPHRyPlwiKTtcblx0dmFyIFIgPSAtMSwgQyA9IDAsIFJTID0gMCwgQ1MgPSAwO1xuXHR2YXIgcmFuZ2UvKjpSYW5nZSovID0ge3M6e3I6MTAwMDAwMDAsIGM6MTAwMDAwMDB9LGU6e3I6MCxjOjB9fTtcblx0dmFyIG1lcmdlcy8qOkFycmF5PFJhbmdlPiovID0gW107XG5cdGZvcihpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgcm93ID0gcm93c1tpXS50cmltKCk7XG5cdFx0dmFyIGhkID0gcm93LnNsaWNlKDAsMykudG9Mb3dlckNhc2UoKTtcblx0XHRpZihoZCA9PSBcIjx0clwiKSB7ICsrUjsgaWYob3B0cy5zaGVldFJvd3MgJiYgb3B0cy5zaGVldFJvd3MgPD0gUikgeyAtLVI7IGJyZWFrOyB9IEMgPSAwOyBjb250aW51ZTsgfVxuXHRcdGlmKGhkICE9IFwiPHRkXCIgJiYgaGQgIT0gXCI8dGhcIikgY29udGludWU7XG5cdFx0dmFyIGNlbGxzID0gcm93LnNwbGl0KC88XFwvdFtkaF0+L2kpO1xuXHRcdGZvcihqID0gMDsgaiA8IGNlbGxzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHR2YXIgY2VsbCA9IGNlbGxzW2pdLnRyaW0oKTtcblx0XHRcdGlmKCFjZWxsLm1hdGNoKC88dFtkaF0vaSkpIGNvbnRpbnVlO1xuXHRcdFx0dmFyIG0gPSBjZWxsLCBjYyA9IDA7XG5cdFx0XHQvKiBUT0RPOiBwYXJzZSBzdHlsZXMgZXRjICovXG5cdFx0XHR3aGlsZShtLmNoYXJBdCgwKSA9PSBcIjxcIiAmJiAoY2MgPSBtLmluZGV4T2YoXCI+XCIpKSA+IC0xKSBtID0gbS5zbGljZShjYysxKTtcblx0XHRcdGZvcih2YXIgbWlkeCA9IDA7IG1pZHggPCBtZXJnZXMubGVuZ3RoOyArK21pZHgpIHtcblx0XHRcdFx0dmFyIF9tZXJnZS8qOlJhbmdlKi8gPSBtZXJnZXNbbWlkeF07XG5cdFx0XHRcdGlmKF9tZXJnZS5zLmMgPT0gQyAmJiBfbWVyZ2Uucy5yIDwgUiAmJiBSIDw9IF9tZXJnZS5lLnIpIHsgQyA9IF9tZXJnZS5lLmMgKyAxOyBtaWR4ID0gLTE7IH1cblx0XHRcdH1cblx0XHRcdHZhciB0YWcgPSBwYXJzZXhtbHRhZyhjZWxsLnNsaWNlKDAsIGNlbGwuaW5kZXhPZihcIj5cIikpKTtcblx0XHRcdENTID0gdGFnLmNvbHNwYW4gPyArdGFnLmNvbHNwYW4gOiAxO1xuXHRcdFx0aWYoKFJTID0gK3RhZy5yb3dzcGFuKT4xIHx8IENTPjEpIG1lcmdlcy5wdXNoKHtzOntyOlIsYzpDfSxlOntyOlIgKyAoUlN8fDEpIC0gMSwgYzpDICsgQ1MgLSAxfX0pO1xuXHRcdFx0dmFyIF90Lyo6c3RyaW5nKi8gPSB0YWcudCB8fCB0YWdbXCJkYXRhLXRcIl0gfHwgXCJcIjtcblx0XHRcdC8qIFRPRE86IGdlbmVyYXRlIHN0dWIgY2VsbHMgKi9cblx0XHRcdGlmKCFtLmxlbmd0aCkgeyBDICs9IENTOyBjb250aW51ZTsgfVxuXHRcdFx0bSA9IGh0bWxkZWNvZGUobSk7XG5cdFx0XHRpZihyYW5nZS5zLnIgPiBSKSByYW5nZS5zLnIgPSBSOyBpZihyYW5nZS5lLnIgPCBSKSByYW5nZS5lLnIgPSBSO1xuXHRcdFx0aWYocmFuZ2Uucy5jID4gQykgcmFuZ2Uucy5jID0gQzsgaWYocmFuZ2UuZS5jIDwgQykgcmFuZ2UuZS5jID0gQztcblx0XHRcdGlmKCFtLmxlbmd0aCkgeyBDICs9IENTOyBjb250aW51ZTsgfVxuXHRcdFx0dmFyIG8vKjpDZWxsKi8gPSB7dDoncycsIHY6bX07XG5cdFx0XHRpZihvcHRzLnJhdyB8fCAhbS50cmltKCkubGVuZ3RoIHx8IF90ID09ICdzJyl7fVxuXHRcdFx0ZWxzZSBpZihtID09PSAnVFJVRScpIG8gPSB7dDonYicsIHY6dHJ1ZX07XG5cdFx0XHRlbHNlIGlmKG0gPT09ICdGQUxTRScpIG8gPSB7dDonYicsIHY6ZmFsc2V9O1xuXHRcdFx0ZWxzZSBpZighaXNOYU4oZnV6enludW0obSkpKSBvID0ge3Q6J24nLCB2OmZ1enp5bnVtKG0pfTtcblx0XHRcdGVsc2UgaWYoIWlzTmFOKGZ1enp5ZGF0ZShtKS5nZXREYXRlKCkpKSB7XG5cdFx0XHRcdG8gPSAoe3Q6J2QnLCB2OnBhcnNlRGF0ZShtKX0vKjphbnkqLyk7XG5cdFx0XHRcdGlmKCFvcHRzLmNlbGxEYXRlcykgbyA9ICh7dDonbicsIHY6ZGF0ZW51bShvLnYpfS8qOmFueSovKTtcblx0XHRcdFx0by56ID0gb3B0cy5kYXRlTkYgfHwgdGFibGVfZm10WzE0XTtcblx0XHRcdH1cblx0XHRcdGlmKG9wdHMuZGVuc2UpIHsgaWYoIXdzW1JdKSB3c1tSXSA9IFtdOyB3c1tSXVtDXSA9IG87IH1cblx0XHRcdGVsc2Ugd3NbZW5jb2RlX2NlbGwoe3I6UiwgYzpDfSldID0gbztcblx0XHRcdEMgKz0gQ1M7XG5cdFx0fVxuXHR9XG5cdHdzWychcmVmJ10gPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRpZihtZXJnZXMubGVuZ3RoKSB3c1tcIiFtZXJnZXNcIl0gPSBtZXJnZXM7XG5cdHJldHVybiB3cztcbn1cbmZ1bmN0aW9uIG1ha2VfaHRtbF9yb3cod3MvKjpXb3Jrc2hlZXQqLywgci8qOlJhbmdlKi8sIFIvKjpudW1iZXIqLywgby8qOlNoZWV0MkhUTUxPcHRzKi8pLyo6c3RyaW5nKi8ge1xuXHR2YXIgTS8qOkFycmF5PFJhbmdlPiovID0gKHdzWychbWVyZ2VzJ10gfHxbXSk7XG5cdHZhciBvby8qOkFycmF5PHN0cmluZz4qLyA9IFtdO1xuXHRmb3IodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0dmFyIFJTID0gMCwgQ1MgPSAwO1xuXHRcdGZvcih2YXIgaiA9IDA7IGogPCBNLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRpZihNW2pdLnMuciA+IFIgfHwgTVtqXS5zLmMgPiBDKSBjb250aW51ZTtcblx0XHRcdGlmKE1bal0uZS5yIDwgUiB8fCBNW2pdLmUuYyA8IEMpIGNvbnRpbnVlO1xuXHRcdFx0aWYoTVtqXS5zLnIgPCBSIHx8IE1bal0ucy5jIDwgQykgeyBSUyA9IC0xOyBicmVhazsgfVxuXHRcdFx0UlMgPSBNW2pdLmUuciAtIE1bal0ucy5yICsgMTsgQ1MgPSBNW2pdLmUuYyAtIE1bal0ucy5jICsgMTsgYnJlYWs7XG5cdFx0fVxuXHRcdGlmKFJTIDwgMCkgY29udGludWU7XG5cdFx0dmFyIGNvb3JkID0gZW5jb2RlX2NlbGwoe3I6UixjOkN9KTtcblx0XHR2YXIgY2VsbCA9IG8uZGVuc2UgPyAod3NbUl18fFtdKVtDXSA6IHdzW2Nvb3JkXTtcblx0XHQvKiBUT0RPOiBodG1sIGVudGl0aWVzICovXG5cdFx0dmFyIHcgPSAoY2VsbCAmJiBjZWxsLnYgIT0gbnVsbCkgJiYgKGNlbGwuaCB8fCBlc2NhcGVodG1sKGNlbGwudyB8fCAoZm9ybWF0X2NlbGwoY2VsbCksIGNlbGwudykgfHwgXCJcIikpIHx8IFwiXCI7XG5cdFx0dmFyIHNwID0gKHt9Lyo6YW55Ki8pO1xuXHRcdGlmKFJTID4gMSkgc3Aucm93c3BhbiA9IFJTO1xuXHRcdGlmKENTID4gMSkgc3AuY29sc3BhbiA9IENTO1xuXHRcdGlmKG8uZWRpdGFibGUpIHcgPSAnPHNwYW4gY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiPicgKyB3ICsgJzwvc3Bhbj4nO1xuXHRcdGVsc2UgaWYoY2VsbCkge1xuXHRcdFx0c3BbXCJkYXRhLXRcIl0gPSBjZWxsICYmIGNlbGwudCB8fCAneic7XG5cdFx0XHRpZihjZWxsLnYgIT0gbnVsbCkgc3BbXCJkYXRhLXZcIl0gPSBjZWxsLnY7XG5cdFx0XHRpZihjZWxsLnogIT0gbnVsbCkgc3BbXCJkYXRhLXpcIl0gPSBjZWxsLno7XG5cdFx0XHRpZihjZWxsLmwgJiYgKGNlbGwubC5UYXJnZXQgfHwgXCIjXCIpLmNoYXJBdCgwKSAhPSBcIiNcIikgdyA9ICc8YSBocmVmPVwiJyArIGNlbGwubC5UYXJnZXQgKydcIj4nICsgdyArICc8L2E+Jztcblx0XHR9XG5cdFx0c3AuaWQgPSAoby5pZCB8fCBcInNqc1wiKSArIFwiLVwiICsgY29vcmQ7XG5cdFx0b28ucHVzaCh3cml0ZXh0YWcoJ3RkJywgdywgc3ApKTtcblx0fVxuXHR2YXIgcHJlYW1ibGUgPSBcIjx0cj5cIjtcblx0cmV0dXJuIHByZWFtYmxlICsgb28uam9pbihcIlwiKSArIFwiPC90cj5cIjtcbn1cblxudmFyIEhUTUxfQkVHSU4gPSAnPGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD1cInV0Zi04XCIvPjx0aXRsZT5TaGVldEpTIFRhYmxlIEV4cG9ydDwvdGl0bGU+PC9oZWFkPjxib2R5Pic7XG52YXIgSFRNTF9FTkQgPSAnPC9ib2R5PjwvaHRtbD4nO1xuXG5mdW5jdGlvbiBodG1sX3RvX3dvcmtib29rKHN0ci8qOnN0cmluZyovLCBvcHRzKS8qOldvcmtib29rKi8ge1xuXHR2YXIgbXRjaCA9IHN0ci5tYXRjaCgvPHRhYmxlW1xcc1xcU10qPz5bXFxzXFxTXSo/PFxcL3RhYmxlPi9naSk7XG5cdGlmKCFtdGNoIHx8IG10Y2gubGVuZ3RoID09IDApIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSFRNTDogY291bGQgbm90IGZpbmQgPHRhYmxlPlwiKTtcblx0aWYobXRjaC5sZW5ndGggPT0gMSkgcmV0dXJuIHNoZWV0X3RvX3dvcmtib29rKGh0bWxfdG9fc2hlZXQobXRjaFswXSwgb3B0cyksIG9wdHMpO1xuXHR2YXIgd2IgPSBib29rX25ldygpO1xuXHRtdGNoLmZvckVhY2goZnVuY3Rpb24ocywgaWR4KSB7IGJvb2tfYXBwZW5kX3NoZWV0KHdiLCBodG1sX3RvX3NoZWV0KHMsIG9wdHMpLCBcIlNoZWV0XCIgKyAoaWR4KzEpKTsgfSk7XG5cdHJldHVybiB3Yjtcbn1cblxuZnVuY3Rpb24gbWFrZV9odG1sX3ByZWFtYmxlKHdzLyo6V29ya3NoZWV0Ki8sIFIvKjpSYW5nZSovLCBvLyo6U2hlZXQySFRNTE9wdHMqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvdXQvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0cmV0dXJuIG91dC5qb2luKFwiXCIpICsgJzx0YWJsZScgKyAobyAmJiBvLmlkID8gJyBpZD1cIicgKyBvLmlkICsgJ1wiJyA6IFwiXCIpICsgJz4nO1xufVxuXG5mdW5jdGlvbiBzaGVldF90b19odG1sKHdzLyo6V29ya3NoZWV0Ki8sIG9wdHMvKjo/U2hlZXQySFRNTE9wdHMqLy8qLCB3Yjo/V29ya2Jvb2sqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0dmFyIGhlYWRlciA9IG8uaGVhZGVyICE9IG51bGwgPyBvLmhlYWRlciA6IEhUTUxfQkVHSU47XG5cdHZhciBmb290ZXIgPSBvLmZvb3RlciAhPSBudWxsID8gby5mb290ZXIgOiBIVE1MX0VORDtcblx0dmFyIG91dC8qOkFycmF5PHN0cmluZz4qLyA9IFtoZWFkZXJdO1xuXHR2YXIgciA9IGRlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0by5kZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHRvdXQucHVzaChtYWtlX2h0bWxfcHJlYW1ibGUod3MsIHIsIG8pKTtcblx0Zm9yKHZhciBSID0gci5zLnI7IFIgPD0gci5lLnI7ICsrUikgb3V0LnB1c2gobWFrZV9odG1sX3Jvdyh3cywgciwgUiwgbykpO1xuXHRvdXQucHVzaChcIjwvdGFibGU+XCIgKyBmb290ZXIpO1xuXHRyZXR1cm4gb3V0LmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIHNoZWV0X2FkZF9kb20od3MvKjpXb3Jrc2hlZXQqLywgdGFibGUvKjpIVE1MRWxlbWVudCovLCBfb3B0cy8qOj9hbnkqLykvKjpXb3Jrc2hlZXQqLyB7XG5cdHZhciBvcHRzID0gX29wdHMgfHwge307XG5cdGlmKERFTlNFICE9IG51bGwpIG9wdHMuZGVuc2UgPSBERU5TRTtcblx0dmFyIG9yX1IgPSAwLCBvcl9DID0gMDtcblx0aWYob3B0cy5vcmlnaW4gIT0gbnVsbCkge1xuXHRcdGlmKHR5cGVvZiBvcHRzLm9yaWdpbiA9PSAnbnVtYmVyJykgb3JfUiA9IG9wdHMub3JpZ2luO1xuXHRcdGVsc2Uge1xuXHRcdFx0dmFyIF9vcmlnaW4vKjpDZWxsQWRkcmVzcyovID0gdHlwZW9mIG9wdHMub3JpZ2luID09IFwic3RyaW5nXCIgPyBkZWNvZGVfY2VsbChvcHRzLm9yaWdpbikgOiBvcHRzLm9yaWdpbjtcblx0XHRcdG9yX1IgPSBfb3JpZ2luLnI7IG9yX0MgPSBfb3JpZ2luLmM7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHJvd3MvKjpIVE1MQ29sbGVjdGlvbjxIVE1MVGFibGVSb3dFbGVtZW50PiovID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJyk7XG5cdHZhciBzaGVldFJvd3MgPSBNYXRoLm1pbihvcHRzLnNoZWV0Um93c3x8MTAwMDAwMDAsIHJvd3MubGVuZ3RoKTtcblx0dmFyIHJhbmdlLyo6UmFuZ2UqLyA9IHtzOntyOjAsYzowfSxlOntyOm9yX1IsYzpvcl9DfX07XG5cdGlmKHdzW1wiIXJlZlwiXSkge1xuXHRcdHZhciBfcmFuZ2UvKjpSYW5nZSovID0gZGVjb2RlX3JhbmdlKHdzW1wiIXJlZlwiXSk7XG5cdFx0cmFuZ2Uucy5yID0gTWF0aC5taW4ocmFuZ2Uucy5yLCBfcmFuZ2Uucy5yKTtcblx0XHRyYW5nZS5zLmMgPSBNYXRoLm1pbihyYW5nZS5zLmMsIF9yYW5nZS5zLmMpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWF4KHJhbmdlLmUuciwgX3JhbmdlLmUucik7XG5cdFx0cmFuZ2UuZS5jID0gTWF0aC5tYXgocmFuZ2UuZS5jLCBfcmFuZ2UuZS5jKTtcblx0XHRpZihvcl9SID09IC0xKSByYW5nZS5lLnIgPSBvcl9SID0gX3JhbmdlLmUuciArIDE7XG5cdH1cblx0dmFyIG1lcmdlcy8qOkFycmF5PFJhbmdlPiovID0gW10sIG1pZHggPSAwO1xuXHR2YXIgcm93aW5mby8qOkFycmF5PFJvd0luZm8+Ki8gPSB3c1tcIiFyb3dzXCJdIHx8ICh3c1tcIiFyb3dzXCJdID0gW10pO1xuXHR2YXIgX1IgPSAwLCBSID0gMCwgX0MgPSAwLCBDID0gMCwgUlMgPSAwLCBDUyA9IDA7XG5cdGlmKCF3c1tcIiFjb2xzXCJdKSB3c1snIWNvbHMnXSA9IFtdO1xuXHRmb3IoOyBfUiA8IHJvd3MubGVuZ3RoICYmIFIgPCBzaGVldFJvd3M7ICsrX1IpIHtcblx0XHR2YXIgcm93Lyo6SFRNTFRhYmxlUm93RWxlbWVudCovID0gcm93c1tfUl07XG5cdFx0aWYgKGlzX2RvbV9lbGVtZW50X2hpZGRlbihyb3cpKSB7XG5cdFx0XHRpZiAob3B0cy5kaXNwbGF5KSBjb250aW51ZTtcblx0XHRcdHJvd2luZm9bUl0gPSB7aGlkZGVuOiB0cnVlfTtcblx0XHR9XG5cdFx0dmFyIGVsdHMvKjpIVE1MQ29sbGVjdGlvbjxIVE1MVGFibGVDZWxsRWxlbWVudD4qLyA9IChyb3cuY2hpbGRyZW4vKjphbnkqLyk7XG5cdFx0Zm9yKF9DID0gQyA9IDA7IF9DIDwgZWx0cy5sZW5ndGg7ICsrX0MpIHtcblx0XHRcdHZhciBlbHQvKjpIVE1MVGFibGVDZWxsRWxlbWVudCovID0gZWx0c1tfQ107XG5cdFx0XHRpZiAob3B0cy5kaXNwbGF5ICYmIGlzX2RvbV9lbGVtZW50X2hpZGRlbihlbHQpKSBjb250aW51ZTtcblx0XHRcdHZhciB2Lyo6P3N0cmluZyovID0gZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS12JykgPyBlbHQuZ2V0QXR0cmlidXRlKCdkYXRhLXYnKSA6IGVsdC5oYXNBdHRyaWJ1dGUoJ3YnKSA/IGVsdC5nZXRBdHRyaWJ1dGUoJ3YnKSA6IGh0bWxkZWNvZGUoZWx0LmlubmVySFRNTCk7XG5cdFx0XHR2YXIgei8qOj9zdHJpbmcqLyA9IGVsdC5nZXRBdHRyaWJ1dGUoJ2RhdGEteicpIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ3onKTtcblx0XHRcdGZvcihtaWR4ID0gMDsgbWlkeCA8IG1lcmdlcy5sZW5ndGg7ICsrbWlkeCkge1xuXHRcdFx0XHR2YXIgbS8qOlJhbmdlKi8gPSBtZXJnZXNbbWlkeF07XG5cdFx0XHRcdGlmKG0ucy5jID09IEMgKyBvcl9DICYmIG0ucy5yIDwgUiArIG9yX1IgJiYgUiArIG9yX1IgPD0gbS5lLnIpIHsgQyA9IG0uZS5jKzEgLSBvcl9DOyBtaWR4ID0gLTE7IH1cblx0XHRcdH1cblx0XHRcdC8qIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIGV4dHJhY3Qgbm9uc3RhbmRhcmQgbXNvLSBzdHlsZSAqL1xuXHRcdFx0Q1MgPSArZWx0LmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIikgfHwgMTtcblx0XHRcdGlmKCAoKFJTID0gKCtlbHQuZ2V0QXR0cmlidXRlKFwicm93c3BhblwiKSB8fCAxKSkpPjEgfHwgQ1M+MSkgbWVyZ2VzLnB1c2goe3M6e3I6UiArIG9yX1IsYzpDICsgb3JfQ30sZTp7cjpSICsgb3JfUiArIChSU3x8MSkgLSAxLCBjOkMgKyBvcl9DICsgKENTfHwxKSAtIDF9fSk7XG5cdFx0XHR2YXIgby8qOkNlbGwqLyA9IHt0OidzJywgdjp2fTtcblx0XHRcdHZhciBfdC8qOnN0cmluZyovID0gZWx0LmdldEF0dHJpYnV0ZShcImRhdGEtdFwiKSB8fCBlbHQuZ2V0QXR0cmlidXRlKFwidFwiKSB8fCBcIlwiO1xuXHRcdFx0aWYodiAhPSBudWxsKSB7XG5cdFx0XHRcdGlmKHYubGVuZ3RoID09IDApIG8udCA9IF90IHx8ICd6Jztcblx0XHRcdFx0ZWxzZSBpZihvcHRzLnJhdyB8fCB2LnRyaW0oKS5sZW5ndGggPT0gMCB8fCBfdCA9PSBcInNcIil7fVxuXHRcdFx0XHRlbHNlIGlmKHYgPT09ICdUUlVFJykgbyA9IHt0OidiJywgdjp0cnVlfTtcblx0XHRcdFx0ZWxzZSBpZih2ID09PSAnRkFMU0UnKSBvID0ge3Q6J2InLCB2OmZhbHNlfTtcblx0XHRcdFx0ZWxzZSBpZighaXNOYU4oZnV6enludW0odikpKSBvID0ge3Q6J24nLCB2OmZ1enp5bnVtKHYpfTtcblx0XHRcdFx0ZWxzZSBpZighaXNOYU4oZnV6enlkYXRlKHYpLmdldERhdGUoKSkpIHtcblx0XHRcdFx0XHRvID0gKHt0OidkJywgdjpwYXJzZURhdGUodil9Lyo6YW55Ki8pO1xuXHRcdFx0XHRcdGlmKCFvcHRzLmNlbGxEYXRlcykgbyA9ICh7dDonbicsIHY6ZGF0ZW51bShvLnYpfS8qOmFueSovKTtcblx0XHRcdFx0XHRvLnogPSBvcHRzLmRhdGVORiB8fCB0YWJsZV9mbXRbMTRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihvLnogPT09IHVuZGVmaW5lZCAmJiB6ICE9IG51bGwpIG8ueiA9IHo7XG5cdFx0XHQvKiBUaGUgZmlyc3QgbGluayBpcyB1c2VkLiAgTGlua3MgYXJlIGFzc3VtZWQgdG8gYmUgZnVsbHkgc3BlY2lmaWVkLlxuXHRcdFx0ICogVE9ETzogVGhlIHJpZ2h0IHdheSB0byBwcm9jZXNzIHJlbGF0aXZlIGxpbmtzIGlzIHRvIG1ha2UgYSBuZXcgPGE+ICovXG5cdFx0XHR2YXIgbCA9IFwiXCIsIEFlbHRzID0gZWx0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiQVwiKTtcblx0XHRcdGlmKEFlbHRzICYmIEFlbHRzLmxlbmd0aCkgZm9yKHZhciBBZWx0aSA9IDA7IEFlbHRpIDwgQWVsdHMubGVuZ3RoOyArK0FlbHRpKVx0aWYoQWVsdHNbQWVsdGldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcblx0XHRcdFx0bCA9IEFlbHRzW0FlbHRpXS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpOyBpZihsLmNoYXJBdCgwKSAhPSBcIiNcIikgYnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZihsICYmIGwuY2hhckF0KDApICE9IFwiI1wiKSBvLmwgPSAoeyBUYXJnZXQ6IGwgfSk7XG5cdFx0XHRpZihvcHRzLmRlbnNlKSB7IGlmKCF3c1tSICsgb3JfUl0pIHdzW1IgKyBvcl9SXSA9IFtdOyB3c1tSICsgb3JfUl1bQyArIG9yX0NdID0gbzsgfVxuXHRcdFx0ZWxzZSB3c1tlbmNvZGVfY2VsbCh7YzpDICsgb3JfQywgcjpSICsgb3JfUn0pXSA9IG87XG5cdFx0XHRpZihyYW5nZS5lLmMgPCBDICsgb3JfQykgcmFuZ2UuZS5jID0gQyArIG9yX0M7XG5cdFx0XHRDICs9IENTO1xuXHRcdH1cblx0XHQrK1I7XG5cdH1cblx0aWYobWVyZ2VzLmxlbmd0aCkgd3NbJyFtZXJnZXMnXSA9ICh3c1tcIiFtZXJnZXNcIl0gfHwgW10pLmNvbmNhdChtZXJnZXMpO1xuXHRyYW5nZS5lLnIgPSBNYXRoLm1heChyYW5nZS5lLnIsIFIgLSAxICsgb3JfUik7XG5cdHdzWychcmVmJ10gPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRpZihSID49IHNoZWV0Um93cykgd3NbJyFmdWxscmVmJ10gPSBlbmNvZGVfcmFuZ2UoKHJhbmdlLmUuciA9IHJvd3MubGVuZ3RoLV9SK1ItMSArIG9yX1IscmFuZ2UpKTsgLy8gV2UgY2FuIGNvdW50IHRoZSByZWFsIG51bWJlciBvZiByb3dzIHRvIHBhcnNlIGJ1dCB3ZSBkb24ndCB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZVxuXHRyZXR1cm4gd3M7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2RvbV90YWJsZSh0YWJsZS8qOkhUTUxFbGVtZW50Ki8sIF9vcHRzLyo6P2FueSovKS8qOldvcmtzaGVldCovIHtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0dmFyIHdzLyo6V29ya3NoZWV0Ki8gPSBvcHRzLmRlbnNlID8gKFtdLyo6YW55Ki8pIDogKHt9Lyo6YW55Ki8pO1xuXHRyZXR1cm4gc2hlZXRfYWRkX2RvbSh3cywgdGFibGUsIF9vcHRzKTtcbn1cblxuZnVuY3Rpb24gdGFibGVfdG9fYm9vayh0YWJsZS8qOkhUTUxFbGVtZW50Ki8sIG9wdHMvKjo/YW55Ki8pLyo6V29ya2Jvb2sqLyB7XG5cdHJldHVybiBzaGVldF90b193b3JrYm9vayhwYXJzZV9kb21fdGFibGUodGFibGUsIG9wdHMpLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gaXNfZG9tX2VsZW1lbnRfaGlkZGVuKGVsZW1lbnQvKjpIVE1MRWxlbWVudCovKS8qOmJvb2xlYW4qLyB7XG5cdHZhciBkaXNwbGF5Lyo6c3RyaW5nKi8gPSAnJztcblx0dmFyIGdldF9jb21wdXRlZF9zdHlsZS8qOj9mdW5jdGlvbiovID0gZ2V0X2dldF9jb21wdXRlZF9zdHlsZV9mdW5jdGlvbihlbGVtZW50KTtcblx0aWYoZ2V0X2NvbXB1dGVkX3N0eWxlKSBkaXNwbGF5ID0gZ2V0X2NvbXB1dGVkX3N0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKTtcblx0aWYoIWRpc3BsYXkpIGRpc3BsYXkgPSBlbGVtZW50LnN0eWxlICYmIGVsZW1lbnQuc3R5bGUuZGlzcGxheTtcblx0cmV0dXJuIGRpc3BsYXkgPT09ICdub25lJztcbn1cblxuLyogZ2xvYmFsIGdldENvbXB1dGVkU3R5bGUgKi9cbmZ1bmN0aW9uIGdldF9nZXRfY29tcHV0ZWRfc3R5bGVfZnVuY3Rpb24oZWxlbWVudC8qOkhUTUxFbGVtZW50Ki8pLyo6P2Z1bmN0aW9uKi8ge1xuXHQvLyBUaGUgcHJvcGVyIGdldENvbXB1dGVkU3R5bGUgaW1wbGVtZW50YXRpb24gaXMgdGhlIG9uZSBkZWZpbmVkIGluIHRoZSBlbGVtZW50IHdpbmRvd1xuXHRpZihlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgdHlwZW9mIGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGU7XG5cdC8vIElmIGl0IGlzIG5vdCBhdmFpbGFibGUsIHRyeSB0byBnZXQgb25lIGZyb20gdGhlIGdsb2JhbCBuYW1lc3BhY2Vcblx0aWYodHlwZW9mIGdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHJldHVybiBnZXRDb21wdXRlZFN0eWxlO1xuXHRyZXR1cm4gbnVsbDtcbn1cbi8qIE9wZW5Eb2N1bWVudCAqL1xuZnVuY3Rpb24gcGFyc2VfdGV4dF9wKHRleHQvKjpzdHJpbmcqLy8qOjosIHRhZyovKS8qOkFycmF5PGFueT4qLyB7XG5cdC8qIDYuMS4yIFdoaXRlIFNwYWNlIENoYXJhY3RlcnMgKi9cblx0dmFyIGZpeGVkID0gdGV4dFxuXHRcdC5yZXBsYWNlKC9bXFx0XFxyXFxuXS9nLCBcIiBcIikudHJpbSgpLnJlcGxhY2UoLyArL2csIFwiIFwiKVxuXHRcdC5yZXBsYWNlKC88dGV4dDpzXFwvPi9nLFwiIFwiKVxuXHRcdC5yZXBsYWNlKC88dGV4dDpzIHRleHQ6Yz1cIihcXGQrKVwiXFwvPi9nLCBmdW5jdGlvbigkJCwkMSkgeyByZXR1cm4gQXJyYXkocGFyc2VJbnQoJDEsMTApKzEpLmpvaW4oXCIgXCIpOyB9KVxuXHRcdC5yZXBsYWNlKC88dGV4dDp0YWJbXj5dKlxcLz4vZyxcIlxcdFwiKVxuXHRcdC5yZXBsYWNlKC88dGV4dDpsaW5lLWJyZWFrXFwvPi9nLFwiXFxuXCIpO1xuXHR2YXIgdiA9IHVuZXNjYXBleG1sKGZpeGVkLnJlcGxhY2UoLzxbXj5dKj4vZyxcIlwiKSk7XG5cblx0cmV0dXJuIFt2XTtcbn1cblxudmFyIG51bWJlcl9mb3JtYXRzX29kcyA9IHtcblx0Lyogb2RzIG5hbWU6IFtzaG9ydCBzc2YgZm10LCBsb25nIHNzZiBmbXRdICovXG5cdGRheTogICAgICAgICAgIFtcImRcIiwgICBcImRkXCJdLFxuXHRtb250aDogICAgICAgICBbXCJtXCIsICAgXCJtbVwiXSxcblx0eWVhcjogICAgICAgICAgW1wieVwiLCAgIFwieXlcIl0sXG5cdGhvdXJzOiAgICAgICAgIFtcImhcIiwgICBcImhoXCJdLFxuXHRtaW51dGVzOiAgICAgICBbXCJtXCIsICAgXCJtbVwiXSxcblx0c2Vjb25kczogICAgICAgW1wic1wiLCAgIFwic3NcIl0sXG5cdFwiYW0tcG1cIjogICAgICAgW1wiQS9QXCIsIFwiQU0vUE1cIl0sXG5cdFwiZGF5LW9mLXdlZWtcIjogW1wiZGRkXCIsIFwiZGRkZFwiXSxcblx0ZXJhOiAgICAgICAgICAgW1wiZVwiLCAgIFwiZWVcIl0sXG5cdC8qIHRoZXJlIGlzIG5vIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBMTyBcIlFcIiBmb3JtYXQgKi9cblx0cXVhcnRlcjogICAgICAgW1wiXFxcXFFtXCIsIFwibVxcXFxcXFwidGggcXVhcnRlclxcXCJcIl1cbn07XG5cblxuZnVuY3Rpb24gcGFyc2VfY29udGVudF94bWwoZC8qOnN0cmluZyovLCBfb3B0cykvKjpXb3JrYm9vayovIHtcblx0XHR2YXIgb3B0cyA9IF9vcHRzIHx8IHt9O1xuXHRcdGlmKERFTlNFICE9IG51bGwgJiYgb3B0cy5kZW5zZSA9PSBudWxsKSBvcHRzLmRlbnNlID0gREVOU0U7XG5cdFx0dmFyIHN0ciA9IHhsbWxfbm9ybWFsaXplKGQpO1xuXHRcdHZhciBzdGF0ZS8qOkFycmF5PGFueT4qLyA9IFtdLCB0bXA7XG5cdFx0dmFyIHRhZy8qOjogPSB7fSovO1xuXHRcdHZhciBORnRhZyA9IHtuYW1lOlwiXCJ9LCBORiA9IFwiXCIsIHBpZHggPSAwO1xuXHRcdHZhciBzaGVldGFnLyo6OiA9IHtuYW1lOlwiXCIsICflkI3np7AnOlwiXCJ9Ki87XG5cdFx0dmFyIHJvd3RhZy8qOjogPSB7J+ihjOWPtyc6XCJcIn0qLztcblx0XHR2YXIgU2hlZXRzID0ge30sIFNoZWV0TmFtZXMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0XHR2YXIgd3MgPSBvcHRzLmRlbnNlID8gKFtdLyo6YW55Ki8pIDogKHt9Lyo6YW55Ki8pO1xuXHRcdHZhciBSbiwgcS8qOjogOmFueSA9ICh7dDpcIlwiLCB2Om51bGwsIHo6bnVsbCwgdzpcIlwiLGM6W10sfTphbnkpKi87XG5cdFx0dmFyIGN0YWcgPSAoe3ZhbHVlOlwiXCJ9Lyo6YW55Ki8pO1xuXHRcdHZhciB0ZXh0cCA9IFwiXCIsIHRleHRwaWR4ID0gMCwgdGV4dHB0YWcvKjo6ID0ge30qLztcblx0XHR2YXIgdGV4dFIgPSBbXTtcblx0XHR2YXIgUiA9IC0xLCBDID0gLTEsIHJhbmdlID0ge3M6IHtyOjEwMDAwMDAsYzoxMDAwMDAwMH0sIGU6IHtyOjAsIGM6MH19O1xuXHRcdHZhciByb3dfb2wgPSAwO1xuXHRcdHZhciBudW1iZXJfZm9ybWF0X21hcCA9IHt9O1xuXHRcdHZhciBtZXJnZXMvKjpBcnJheTxSYW5nZT4qLyA9IFtdLCBtcmFuZ2UgPSB7fSwgbVIgPSAwLCBtQyA9IDA7XG5cdFx0dmFyIHJvd2luZm8vKjpBcnJheTxSb3dJbmZvPiovID0gW10sIHJvd3BlYXQgPSAxLCBjb2xwZWF0ID0gMTtcblx0XHR2YXIgYXJyYXlmLyo6QXJyYXk8W1JhbmdlLCBzdHJpbmddPiovID0gW107XG5cdFx0dmFyIFdCID0ge05hbWVzOltdfTtcblx0XHR2YXIgYXRhZyA9ICh7fS8qOmFueSovKTtcblx0XHR2YXIgX1JlZi8qOltzdHJpbmcsIHN0cmluZ10qLyA9IFtcIlwiLCBcIlwiXTtcblx0XHR2YXIgY29tbWVudHMvKjpBcnJheTxDb21tZW50PiovID0gW10sIGNvbW1lbnQvKjpDb21tZW50Ki8gPSAoe30vKjphbnkqLyk7XG5cdFx0dmFyIGNyZWF0b3IgPSBcIlwiLCBjcmVhdG9yaWR4ID0gMDtcblx0XHR2YXIgaXNzdHViID0gZmFsc2UsIGludGFibGUgPSBmYWxzZTtcblx0XHR2YXIgaSA9IDA7XG5cdFx0eGxtbHJlZ2V4Lmxhc3RJbmRleCA9IDA7XG5cdFx0c3RyID0gc3RyLnJlcGxhY2UoLzwhLS0oW1xcc1xcU10qPyktLT4vbWcsXCJcIikucmVwbGFjZSgvPCFET0NUWVBFW15cXFtdKlxcW1teXFxdXSpcXF0+L2dtLFwiXCIpO1xuXHRcdHdoaWxlKChSbiA9IHhsbWxyZWdleC5leGVjKHN0cikpKSBzd2l0Y2goKFJuWzNdPVJuWzNdLnJlcGxhY2UoL18uKiQvLFwiXCIpKSkge1xuXG5cdFx0XHRjYXNlICd0YWJsZSc6IGNhc2UgJ+W3peS9nOihqCc6IC8vIDkuMS4yIDx0YWJsZTp0YWJsZT5cblx0XHRcdFx0aWYoUm5bMV09PT0nLycpIHtcblx0XHRcdFx0XHRpZihyYW5nZS5lLmMgPj0gcmFuZ2Uucy5jICYmIHJhbmdlLmUuciA+PSByYW5nZS5zLnIpIHdzWychcmVmJ10gPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRcdFx0XHRcdGVsc2Ugd3NbJyFyZWYnXSA9IFwiQTE6QTFcIjtcblx0XHRcdFx0XHRpZihvcHRzLnNoZWV0Um93cyA+IDAgJiYgb3B0cy5zaGVldFJvd3MgPD0gcmFuZ2UuZS5yKSB7XG5cdFx0XHRcdFx0XHR3c1snIWZ1bGxyZWYnXSA9IHdzWychcmVmJ107XG5cdFx0XHRcdFx0XHRyYW5nZS5lLnIgPSBvcHRzLnNoZWV0Um93cyAtIDE7XG5cdFx0XHRcdFx0XHR3c1snIXJlZiddID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYobWVyZ2VzLmxlbmd0aCkgd3NbJyFtZXJnZXMnXSA9IG1lcmdlcztcblx0XHRcdFx0XHRpZihyb3dpbmZvLmxlbmd0aCkgd3NbXCIhcm93c1wiXSA9IHJvd2luZm87XG5cdFx0XHRcdFx0c2hlZXRhZy5uYW1lID0gc2hlZXRhZ1sn5ZCN56ewJ10gfHwgc2hlZXRhZy5uYW1lO1xuXHRcdFx0XHRcdGlmKHR5cGVvZiBKU09OICE9PSAndW5kZWZpbmVkJykgSlNPTi5zdHJpbmdpZnkoc2hlZXRhZyk7XG5cdFx0XHRcdFx0U2hlZXROYW1lcy5wdXNoKHNoZWV0YWcubmFtZSk7XG5cdFx0XHRcdFx0U2hlZXRzW3NoZWV0YWcubmFtZV0gPSB3cztcblx0XHRcdFx0XHRpbnRhYmxlID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpICE9PSAnLycpIHtcblx0XHRcdFx0XHRzaGVldGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTtcblx0XHRcdFx0XHRSID0gQyA9IC0xO1xuXHRcdFx0XHRcdHJhbmdlLnMuciA9IHJhbmdlLnMuYyA9IDEwMDAwMDAwOyByYW5nZS5lLnIgPSByYW5nZS5lLmMgPSAwO1xuXHRcdFx0XHRcdHdzID0gb3B0cy5kZW5zZSA/IChbXS8qOmFueSovKSA6ICh7fS8qOmFueSovKTsgbWVyZ2VzID0gW107XG5cdFx0XHRcdFx0cm93aW5mbyA9IFtdO1xuXHRcdFx0XHRcdGludGFibGUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICd0YWJsZS1yb3ctZ3JvdXAnOiAvLyA5LjEuOSA8dGFibGU6dGFibGUtcm93LWdyb3VwPlxuXHRcdFx0XHRpZihSblsxXSA9PT0gXCIvXCIpIC0tcm93X29sOyBlbHNlICsrcm93X29sO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RhYmxlLXJvdyc6IGNhc2UgJ+ihjCc6IC8vIDkuMS4zIDx0YWJsZTp0YWJsZS1yb3c+XG5cdFx0XHRcdGlmKFJuWzFdID09PSAnLycpIHsgUis9cm93cGVhdDsgcm93cGVhdCA9IDE7IGJyZWFrOyB9XG5cdFx0XHRcdHJvd3RhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdGlmKHJvd3RhZ1sn6KGM5Y+3J10pIFIgPSByb3d0YWdbJ+ihjOWPtyddIC0gMTsgZWxzZSBpZihSID09IC0xKSBSID0gMDtcblx0XHRcdFx0cm93cGVhdCA9ICtyb3d0YWdbJ251bWJlci1yb3dzLXJlcGVhdGVkJ10gfHwgMTtcblx0XHRcdFx0LyogVE9ETzogcmVtb3ZlIG1hZ2ljICovXG5cdFx0XHRcdGlmKHJvd3BlYXQgPCAxMCkgZm9yKGkgPSAwOyBpIDwgcm93cGVhdDsgKytpKSBpZihyb3dfb2wgPiAwKSByb3dpbmZvW1IgKyBpXSA9IHtsZXZlbDogcm93X29sfTtcblx0XHRcdFx0QyA9IC0xOyBicmVhaztcblx0XHRcdGNhc2UgJ2NvdmVyZWQtdGFibGUtY2VsbCc6IC8vIDkuMS41IDx0YWJsZTpjb3ZlcmVkLXRhYmxlLWNlbGw+XG5cdFx0XHRcdGlmKFJuWzFdICE9PSAnLycpICsrQztcblx0XHRcdFx0aWYob3B0cy5zaGVldFN0dWJzKSB7XG5cdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkgeyBpZighd3NbUl0pIHdzW1JdID0gW107IHdzW1JdW0NdID0ge3Q6J3onfTsgfVxuXHRcdFx0XHRcdGVsc2Ugd3NbZW5jb2RlX2NlbGwoe3I6UixjOkN9KV0gPSB7dDoneid9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHRwID0gXCJcIjsgdGV4dFIgPSBbXTtcblx0XHRcdFx0YnJlYWs7IC8qIHN0dWIgKi9cblx0XHRcdGNhc2UgJ3RhYmxlLWNlbGwnOiBjYXNlICfmlbDmja4nOlxuXHRcdFx0XHRpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpID09PSAnLycpIHtcblx0XHRcdFx0XHQrK0M7XG5cdFx0XHRcdFx0Y3RhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdFx0Y29scGVhdCA9IHBhcnNlSW50KGN0YWdbJ251bWJlci1jb2x1bW5zLXJlcGVhdGVkJ118fFwiMVwiLCAxMCk7XG5cdFx0XHRcdFx0cSA9ICh7dDoneicsIHY6bnVsbC8qOjogLCB6Om51bGwsIHc6XCJcIixjOltdKi99Lyo6YW55Ki8pO1xuXHRcdFx0XHRcdGlmKGN0YWcuZm9ybXVsYSAmJiBvcHRzLmNlbGxGb3JtdWxhICE9IGZhbHNlKSBxLmYgPSBvZHNfdG9fY3NmX2Zvcm11bGEodW5lc2NhcGV4bWwoY3RhZy5mb3JtdWxhKSk7XG5cdFx0XHRcdFx0aWYoKGN0YWdbJ+aVsOaNruexu+WeiyddIHx8IGN0YWdbJ3ZhbHVlLXR5cGUnXSkgPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdFx0cS50ID0gXCJzXCI7IHEudiA9IHVuZXNjYXBleG1sKGN0YWdbJ3N0cmluZy12YWx1ZSddIHx8IFwiXCIpO1xuXHRcdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkge1xuXHRcdFx0XHRcdFx0XHRpZighd3NbUl0pIHdzW1JdID0gW107XG5cdFx0XHRcdFx0XHRcdHdzW1JdW0NdID0gcTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHdzW2VuY29kZV9jZWxsKHtyOlIsYzpDfSldID0gcTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Qys9IGNvbHBlYXQtMTtcblx0XHRcdFx0fSBlbHNlIGlmKFJuWzFdIT09Jy8nKSB7XG5cdFx0XHRcdFx0KytDO1xuXHRcdFx0XHRcdHRleHRwID0gXCJcIjsgdGV4dHBpZHggPSAwOyB0ZXh0UiA9IFtdO1xuXHRcdFx0XHRcdGNvbHBlYXQgPSAxO1xuXHRcdFx0XHRcdHZhciBycHRSID0gcm93cGVhdCA/IFIgKyByb3dwZWF0IC0gMSA6IFI7XG5cdFx0XHRcdFx0aWYoQyA+IHJhbmdlLmUuYykgcmFuZ2UuZS5jID0gQztcblx0XHRcdFx0XHRpZihDIDwgcmFuZ2Uucy5jKSByYW5nZS5zLmMgPSBDO1xuXHRcdFx0XHRcdGlmKFIgPCByYW5nZS5zLnIpIHJhbmdlLnMuciA9IFI7XG5cdFx0XHRcdFx0aWYocnB0UiA+IHJhbmdlLmUucikgcmFuZ2UuZS5yID0gcnB0Ujtcblx0XHRcdFx0XHRjdGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTtcblx0XHRcdFx0XHRjb21tZW50cyA9IFtdOyBjb21tZW50ID0gKHt9Lyo6YW55Ki8pO1xuXHRcdFx0XHRcdHEgPSAoe3Q6Y3RhZ1sn5pWw5o2u57G75Z6LJ10gfHwgY3RhZ1sndmFsdWUtdHlwZSddLCB2Om51bGwvKjo6ICwgejpudWxsLCB3OlwiXCIsYzpbXSovfS8qOmFueSovKTtcblx0XHRcdFx0XHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0XHRcdFx0XHRpZihjdGFnLmZvcm11bGEpIGN0YWcuZm9ybXVsYSA9IHVuZXNjYXBleG1sKGN0YWcuZm9ybXVsYSk7XG5cdFx0XHRcdFx0XHRpZihjdGFnWydudW1iZXItbWF0cml4LWNvbHVtbnMtc3Bhbm5lZCddICYmIGN0YWdbJ251bWJlci1tYXRyaXgtcm93cy1zcGFubmVkJ10pIHtcblx0XHRcdFx0XHRcdFx0bVIgPSBwYXJzZUludChjdGFnWydudW1iZXItbWF0cml4LXJvd3Mtc3Bhbm5lZCddLDEwKSB8fCAwO1xuXHRcdFx0XHRcdFx0XHRtQyA9IHBhcnNlSW50KGN0YWdbJ251bWJlci1tYXRyaXgtY29sdW1ucy1zcGFubmVkJ10sMTApIHx8IDA7XG5cdFx0XHRcdFx0XHRcdG1yYW5nZSA9IHtzOiB7cjpSLGM6Q30sIGU6e3I6UiArIG1SLTEsYzpDICsgbUMtMX19O1xuXHRcdFx0XHRcdFx0XHRxLkYgPSBlbmNvZGVfcmFuZ2UobXJhbmdlKTtcblx0XHRcdFx0XHRcdFx0YXJyYXlmLnB1c2goW21yYW5nZSwgcS5GXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZihjdGFnLmZvcm11bGEpIHEuZiA9IG9kc190b19jc2ZfZm9ybXVsYShjdGFnLmZvcm11bGEpO1xuXHRcdFx0XHRcdFx0ZWxzZSBmb3IoaSA9IDA7IGkgPCBhcnJheWYubGVuZ3RoOyArK2kpXG5cdFx0XHRcdFx0XHRcdGlmKFIgPj0gYXJyYXlmW2ldWzBdLnMuciAmJiBSIDw9IGFycmF5ZltpXVswXS5lLnIpXG5cdFx0XHRcdFx0XHRcdFx0aWYoQyA+PSBhcnJheWZbaV1bMF0ucy5jICYmIEMgPD0gYXJyYXlmW2ldWzBdLmUuYylcblx0XHRcdFx0XHRcdFx0XHRcdHEuRiA9IGFycmF5ZltpXVsxXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoY3RhZ1snbnVtYmVyLWNvbHVtbnMtc3Bhbm5lZCddIHx8IGN0YWdbJ251bWJlci1yb3dzLXNwYW5uZWQnXSkge1xuXHRcdFx0XHRcdFx0bVIgPSBwYXJzZUludChjdGFnWydudW1iZXItcm93cy1zcGFubmVkJ10sMTApIHx8IDA7XG5cdFx0XHRcdFx0XHRtQyA9IHBhcnNlSW50KGN0YWdbJ251bWJlci1jb2x1bW5zLXNwYW5uZWQnXSwxMCkgfHwgMDtcblx0XHRcdFx0XHRcdG1yYW5nZSA9IHtzOiB7cjpSLGM6Q30sIGU6e3I6UiArIG1SLTEsYzpDICsgbUMtMX19O1xuXHRcdFx0XHRcdFx0bWVyZ2VzLnB1c2gobXJhbmdlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvKiAxOS42NzUuMiB0YWJsZTpudW1iZXItY29sdW1ucy1yZXBlYXRlZCAqL1xuXHRcdFx0XHRcdGlmKGN0YWdbJ251bWJlci1jb2x1bW5zLXJlcGVhdGVkJ10pIGNvbHBlYXQgPSBwYXJzZUludChjdGFnWydudW1iZXItY29sdW1ucy1yZXBlYXRlZCddLCAxMCk7XG5cblx0XHRcdFx0XHQvKiAxOS4zODUgb2ZmaWNlOnZhbHVlLXR5cGUgKi9cblx0XHRcdFx0XHRzd2l0Y2gocS50KSB7XG5cdFx0XHRcdFx0XHRjYXNlICdib29sZWFuJzogcS50ID0gJ2InOyBxLnYgPSBwYXJzZXhtbGJvb2woY3RhZ1snYm9vbGVhbi12YWx1ZSddKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdmbG9hdCc6IHEudCA9ICduJzsgcS52ID0gcGFyc2VGbG9hdChjdGFnLnZhbHVlKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdwZXJjZW50YWdlJzogcS50ID0gJ24nOyBxLnYgPSBwYXJzZUZsb2F0KGN0YWcudmFsdWUpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2N1cnJlbmN5JzogcS50ID0gJ24nOyBxLnYgPSBwYXJzZUZsb2F0KGN0YWcudmFsdWUpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2RhdGUnOiBxLnQgPSAnZCc7IHEudiA9IHBhcnNlRGF0ZShjdGFnWydkYXRlLXZhbHVlJ10pO1xuXHRcdFx0XHRcdFx0XHRpZighb3B0cy5jZWxsRGF0ZXMpIHsgcS50ID0gJ24nOyBxLnYgPSBkYXRlbnVtKHEudik7IH1cblx0XHRcdFx0XHRcdFx0cS56ID0gJ20vZC95eSc7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAndGltZSc6IHEudCA9ICduJzsgcS52ID0gcGFyc2VfaXNvZHVyKGN0YWdbJ3RpbWUtdmFsdWUnXSkvODY0MDA7XG5cdFx0XHRcdFx0XHRcdGlmKG9wdHMuY2VsbERhdGVzKSB7IHEudCA9ICdkJzsgcS52ID0gbnVtZGF0ZShxLnYpOyB9XG5cdFx0XHRcdFx0XHRcdHEueiA9ICdISDpNTTpTUyc7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnbnVtYmVyJzogcS50ID0gJ24nOyBxLnYgPSBwYXJzZUZsb2F0KGN0YWdbJ+aVsOaNruaVsOWAvCddKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRpZihxLnQgPT09ICdzdHJpbmcnIHx8IHEudCA9PT0gJ3RleHQnIHx8ICFxLnQpIHtcblx0XHRcdFx0XHRcdFx0XHRxLnQgPSAncyc7XG5cdFx0XHRcdFx0XHRcdFx0aWYoY3RhZ1snc3RyaW5nLXZhbHVlJ10gIT0gbnVsbCkgeyB0ZXh0cCA9IHVuZXNjYXBleG1sKGN0YWdbJ3N0cmluZy12YWx1ZSddKTsgdGV4dFIgPSBbXTsgfVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2YWx1ZSB0eXBlICcgKyBxLnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpc3N0dWIgPSBmYWxzZTtcblx0XHRcdFx0XHRpZihxLnQgPT09ICdzJykge1xuXHRcdFx0XHRcdFx0cS52ID0gdGV4dHAgfHwgJyc7XG5cdFx0XHRcdFx0XHRpZih0ZXh0Ui5sZW5ndGgpIHEuUiA9IHRleHRSO1xuXHRcdFx0XHRcdFx0aXNzdHViID0gdGV4dHBpZHggPT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoYXRhZy5UYXJnZXQpIHEubCA9IGF0YWc7XG5cdFx0XHRcdFx0aWYoY29tbWVudHMubGVuZ3RoID4gMCkgeyBxLmMgPSBjb21tZW50czsgY29tbWVudHMgPSBbXTsgfVxuXHRcdFx0XHRcdGlmKHRleHRwICYmIG9wdHMuY2VsbFRleHQgIT09IGZhbHNlKSBxLncgPSB0ZXh0cDtcblx0XHRcdFx0XHRpZihpc3N0dWIpIHsgcS50ID0gXCJ6XCI7IGRlbGV0ZSBxLnY7IH1cblx0XHRcdFx0XHRpZighaXNzdHViIHx8IG9wdHMuc2hlZXRTdHVicykge1xuXHRcdFx0XHRcdFx0aWYoIShvcHRzLnNoZWV0Um93cyAmJiBvcHRzLnNoZWV0Um93cyA8PSBSKSkge1xuXHRcdFx0XHRcdFx0XHRmb3IodmFyIHJwdCA9IDA7IHJwdCA8IHJvd3BlYXQ7ICsrcnB0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29scGVhdCA9IHBhcnNlSW50KGN0YWdbJ251bWJlci1jb2x1bW5zLXJlcGVhdGVkJ118fFwiMVwiLCAxMCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoIXdzW1IgKyBycHRdKSB3c1tSICsgcnB0XSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0d3NbUiArIHJwdF1bQ10gPSBycHQgPT0gMCA/IHEgOiBkdXAocSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR3aGlsZSgtLWNvbHBlYXQgPiAwKSB3c1tSICsgcnB0XVtDICsgY29scGVhdF0gPSBkdXAocSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdzW2VuY29kZV9jZWxsKHtyOlIgKyBycHQsYzpDfSldID0gcTtcblx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlKC0tY29scGVhdCA+IDApIHdzW2VuY29kZV9jZWxsKHtyOlIgKyBycHQsYzpDICsgY29scGVhdH0pXSA9IGR1cChxKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYocmFuZ2UuZS5jIDw9IEMpIHJhbmdlLmUuYyA9IEM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29scGVhdCA9IHBhcnNlSW50KGN0YWdbJ251bWJlci1jb2x1bW5zLXJlcGVhdGVkJ118fFwiMVwiLCAxMCk7XG5cdFx0XHRcdFx0QyArPSBjb2xwZWF0LTE7IGNvbHBlYXQgPSAwO1xuXHRcdFx0XHRcdHEgPSB7Lyo6OiB0OlwiXCIsIHY6bnVsbCwgejpudWxsLCB3OlwiXCIsYzpbXSovfTtcblx0XHRcdFx0XHR0ZXh0cCA9IFwiXCI7IHRleHRSID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0YXRhZyA9ICh7fS8qOmFueSovKTtcblx0XHRcdFx0YnJlYWs7IC8vIDkuMS40IDx0YWJsZTp0YWJsZS1jZWxsPlxuXG5cdFx0XHQvKiBwdXJlIHN0YXRlICovXG5cdFx0XHRjYXNlICdkb2N1bWVudCc6IC8vIFRPRE86IDxvZmZpY2U6ZG9jdW1lbnQ+IGlzIHRoZSByb290IGZvciBGT0RTXG5cdFx0XHRjYXNlICdkb2N1bWVudC1jb250ZW50JzogY2FzZSAn55S15a2Q6KGo5qC85paH5qGjJzogLy8gMy4xLjMuMiA8b2ZmaWNlOmRvY3VtZW50LWNvbnRlbnQ+XG5cdFx0XHRjYXNlICdzcHJlYWRzaGVldCc6IGNhc2UgJ+S4u+S9kyc6IC8vIDMuNyA8b2ZmaWNlOnNwcmVhZHNoZWV0PlxuXHRcdFx0Y2FzZSAnc2NyaXB0cyc6IC8vIDMuMTIgPG9mZmljZTpzY3JpcHRzPlxuXHRcdFx0Y2FzZSAnc3R5bGVzJzogLy8gVE9ETyA8b2ZmaWNlOnN0eWxlcz5cblx0XHRcdGNhc2UgJ2ZvbnQtZmFjZS1kZWNscyc6IC8vIDMuMTQgPG9mZmljZTpmb250LWZhY2UtZGVjbHM+XG5cdFx0XHRjYXNlICdtYXN0ZXItc3R5bGVzJzogLy8gMy4xNS40IDxvZmZpY2U6bWFzdGVyLXN0eWxlcz4gLS0gcmVsZXZhbnQgZm9yIEZPRFNcblx0XHRcdFx0aWYoUm5bMV09PT0nLycpe2lmKCh0bXA9c3RhdGUucG9wKCkpWzBdIT09Um5bM10pIHRocm93IFwiQmFkIHN0YXRlOiBcIit0bXA7fVxuXHRcdFx0XHRlbHNlIGlmKFJuWzBdLmNoYXJBdChSblswXS5sZW5ndGgtMikgIT09ICcvJykgc3RhdGUucHVzaChbUm5bM10sIHRydWVdKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ2Fubm90YXRpb24nOiAvLyAxNC4xIDxvZmZpY2U6YW5ub3RhdGlvbj5cblx0XHRcdFx0aWYoUm5bMV09PT0nLycpe1xuXHRcdFx0XHRcdGlmKCh0bXA9c3RhdGUucG9wKCkpWzBdIT09Um5bM10pIHRocm93IFwiQmFkIHN0YXRlOiBcIit0bXA7XG5cdFx0XHRcdFx0Y29tbWVudC50ID0gdGV4dHA7XG5cdFx0XHRcdFx0aWYodGV4dFIubGVuZ3RoKSAvKjo6KCovY29tbWVudC8qOjogOmFueSkqLy5SID0gdGV4dFI7XG5cdFx0XHRcdFx0Y29tbWVudC5hID0gY3JlYXRvcjtcblx0XHRcdFx0XHRjb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSB7c3RhdGUucHVzaChbUm5bM10sIGZhbHNlXSk7fVxuXHRcdFx0XHRjcmVhdG9yID0gXCJcIjsgY3JlYXRvcmlkeCA9IDA7XG5cdFx0XHRcdHRleHRwID0gXCJcIjsgdGV4dHBpZHggPSAwOyB0ZXh0UiA9IFtdO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnY3JlYXRvcic6IC8vIDQuMy4yLjcgPGRjOmNyZWF0b3I+XG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nKSB7IGNyZWF0b3IgPSBzdHIuc2xpY2UoY3JlYXRvcmlkeCxSbi5pbmRleCk7IH1cblx0XHRcdFx0ZWxzZSBjcmVhdG9yaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiBpZ25vcmUgc3RhdGUgKi9cblx0XHRcdGNhc2UgJ21ldGEnOiBjYXNlICflhYPmlbDmja4nOiAvLyBUT0RPOiA8b2ZmaWNlOm1ldGE+IDx1b2Y65YWD5pWw5o2uPiBGT0RTL1VPRlxuXHRcdFx0Y2FzZSAnc2V0dGluZ3MnOiAvLyBUT0RPOiA8b2ZmaWNlOnNldHRpbmdzPlxuXHRcdFx0Y2FzZSAnY29uZmlnLWl0ZW0tc2V0JzogLy8gVE9ETzogPG9mZmljZTpjb25maWctaXRlbS1zZXQ+XG5cdFx0XHRjYXNlICdjb25maWctaXRlbS1tYXAtaW5kZXhlZCc6IC8vIFRPRE86IDxvZmZpY2U6Y29uZmlnLWl0ZW0tbWFwLWluZGV4ZWQ+XG5cdFx0XHRjYXNlICdjb25maWctaXRlbS1tYXAtZW50cnknOiAvLyBUT0RPOiA8b2ZmaWNlOmNvbmZpZy1pdGVtLW1hcC1lbnRyeT5cblx0XHRcdGNhc2UgJ2NvbmZpZy1pdGVtLW1hcC1uYW1lZCc6IC8vIFRPRE86IDxvZmZpY2U6Y29uZmlnLWl0ZW0tbWFwLWVudHJ5PlxuXHRcdFx0Y2FzZSAnc2hhcGVzJzogLy8gOS4yLjggPHRhYmxlOnNoYXBlcz5cblx0XHRcdGNhc2UgJ2ZyYW1lJzogLy8gMTAuNC4yIDxkcmF3OmZyYW1lPlxuXHRcdFx0Y2FzZSAndGV4dC1ib3gnOiAvLyAxMC40LjMgPGRyYXc6dGV4dC1ib3g+XG5cdFx0XHRjYXNlICdpbWFnZSc6IC8vIDEwLjQuNCA8ZHJhdzppbWFnZT5cblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtdGFibGVzJzogLy8gOS42LjIgPHRhYmxlOmRhdGEtcGlsb3QtdGFibGVzPlxuXHRcdFx0Y2FzZSAnbGlzdC1zdHlsZSc6IC8vIDE2LjMwIDx0ZXh0Omxpc3Qtc3R5bGU+XG5cdFx0XHRjYXNlICdmb3JtJzogLy8gMTMuMTMgPGZvcm06Zm9ybT5cblx0XHRcdGNhc2UgJ2RkZS1saW5rcyc6IC8vIDkuOCA8dGFibGU6ZGRlLWxpbmtzPlxuXHRcdFx0Y2FzZSAnZXZlbnQtbGlzdGVuZXJzJzogLy8gVE9ET1xuXHRcdFx0Y2FzZSAnY2hhcnQnOiAvLyBUT0RPXG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nKXtpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBcIkJhZCBzdGF0ZTogXCIrdG1wO31cblx0XHRcdFx0ZWxzZSBpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpICE9PSAnLycpIHN0YXRlLnB1c2goW1JuWzNdLCBmYWxzZV0pO1xuXHRcdFx0XHR0ZXh0cCA9IFwiXCI7IHRleHRwaWR4ID0gMDsgdGV4dFIgPSBbXTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3NjaWVudGlmaWMtbnVtYmVyJzogLy8gVE9ETzogPG51bWJlcjpzY2llbnRpZmljLW51bWJlcj5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjdXJyZW5jeS1zeW1ib2wnOiAvLyBUT0RPOiA8bnVtYmVyOmN1cnJlbmN5LXN5bWJvbD5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjdXJyZW5jeS1zdHlsZSc6IC8vIFRPRE86IDxudW1iZXI6Y3VycmVuY3ktc3R5bGU+XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbnVtYmVyLXN0eWxlJzogLy8gMTYuMjcuMiA8bnVtYmVyOm51bWJlci1zdHlsZT5cblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2Utc3R5bGUnOiAvLyAxNi4yNy45IDxudW1iZXI6cGVyY2VudGFnZS1zdHlsZT5cblx0XHRcdGNhc2UgJ2RhdGUtc3R5bGUnOiAvLyAxNi4yNy4xMCA8bnVtYmVyOmRhdGUtc3R5bGU+XG5cdFx0XHRjYXNlICd0aW1lLXN0eWxlJzogLy8gMTYuMjcuMTggPG51bWJlcjp0aW1lLXN0eWxlPlxuXHRcdFx0XHRpZihSblsxXT09PScvJyl7XG5cdFx0XHRcdFx0bnVtYmVyX2Zvcm1hdF9tYXBbTkZ0YWcubmFtZV0gPSBORjtcblx0XHRcdFx0XHRpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBcIkJhZCBzdGF0ZTogXCIrdG1wO1xuXHRcdFx0XHR9IGVsc2UgaWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSB7XG5cdFx0XHRcdFx0TkYgPSBcIlwiO1xuXHRcdFx0XHRcdE5GdGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTtcblx0XHRcdFx0XHRzdGF0ZS5wdXNoKFtSblszXSwgdHJ1ZV0pO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRjYXNlICdzY3JpcHQnOiBicmVhazsgLy8gMy4xMyA8b2ZmaWNlOnNjcmlwdD5cblx0XHRcdGNhc2UgJ2xpYnJhcmllcyc6IGJyZWFrOyAvLyBUT0RPOiA8b29vOmxpYnJhcmllcz5cblx0XHRcdGNhc2UgJ2F1dG9tYXRpYy1zdHlsZXMnOiBicmVhazsgLy8gMy4xNS4zIDxvZmZpY2U6YXV0b21hdGljLXN0eWxlcz5cblxuXHRcdFx0Y2FzZSAnZGVmYXVsdC1zdHlsZSc6IC8vIFRPRE86IDxzdHlsZTpkZWZhdWx0LXN0eWxlPlxuXHRcdFx0Y2FzZSAncGFnZS1sYXlvdXQnOiBicmVhazsgLy8gVE9ETzogPHN0eWxlOnBhZ2UtbGF5b3V0PlxuXHRcdFx0Y2FzZSAnc3R5bGUnOiAvLyAxNi4yIDxzdHlsZTpzdHlsZT5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdtYXAnOiBicmVhazsgLy8gMTYuMyA8c3R5bGU6bWFwPlxuXHRcdFx0Y2FzZSAnZm9udC1mYWNlJzogYnJlYWs7IC8vIDE2LjIxIDxzdHlsZTpmb250LWZhY2U+XG5cblx0XHRcdGNhc2UgJ3BhcmFncmFwaC1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjYgPHN0eWxlOnBhcmFncmFwaC1wcm9wZXJ0aWVzPlxuXHRcdFx0Y2FzZSAndGFibGUtcHJvcGVydGllcyc6IGJyZWFrOyAvLyAxNy4xNSA8c3R5bGU6dGFibGUtcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ3RhYmxlLWNvbHVtbi1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjE2IDxzdHlsZTp0YWJsZS1jb2x1bW4tcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ3RhYmxlLXJvdy1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjE3IDxzdHlsZTp0YWJsZS1yb3ctcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ3RhYmxlLWNlbGwtcHJvcGVydGllcyc6IGJyZWFrOyAvLyAxNy4xOCA8c3R5bGU6dGFibGUtY2VsbC1wcm9wZXJ0aWVzPlxuXG5cdFx0XHRjYXNlICdudW1iZXInOiAvLyAxNi4yNy4zIDxudW1iZXI6bnVtYmVyPlxuXHRcdFx0XHRzd2l0Y2goc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdKSB7XG5cdFx0XHRcdFx0Y2FzZSAndGltZS1zdHlsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnZGF0ZS1zdHlsZSc6XG5cdFx0XHRcdFx0XHR0YWcgPSBwYXJzZXhtbHRhZyhSblswXSwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0TkYgKz0gbnVtYmVyX2Zvcm1hdHNfb2RzW1JuWzNdXVt0YWcuc3R5bGU9PT0nbG9uZyc/MTowXTsgYnJlYWs7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdGNhc2UgJ2ZyYWN0aW9uJzogYnJlYWs7IC8vIFRPRE8gMTYuMjcuNiA8bnVtYmVyOmZyYWN0aW9uPlxuXG5cdFx0XHRjYXNlICdkYXknOiAvLyAxNi4yNy4xMSA8bnVtYmVyOmRheT5cblx0XHRcdGNhc2UgJ21vbnRoJzogLy8gMTYuMjcuMTIgPG51bWJlcjptb250aD5cblx0XHRcdGNhc2UgJ3llYXInOiAvLyAxNi4yNy4xMyA8bnVtYmVyOnllYXI+XG5cdFx0XHRjYXNlICdlcmEnOiAvLyAxNi4yNy4xNCA8bnVtYmVyOmVyYT5cblx0XHRcdGNhc2UgJ2RheS1vZi13ZWVrJzogLy8gMTYuMjcuMTUgPG51bWJlcjpkYXktb2Ytd2Vlaz5cblx0XHRcdGNhc2UgJ3dlZWstb2YteWVhcic6IC8vIDE2LjI3LjE2IDxudW1iZXI6d2Vlay1vZi15ZWFyPlxuXHRcdFx0Y2FzZSAncXVhcnRlcic6IC8vIDE2LjI3LjE3IDxudW1iZXI6cXVhcnRlcj5cblx0XHRcdGNhc2UgJ2hvdXJzJzogLy8gMTYuMjcuMTkgPG51bWJlcjpob3Vycz5cblx0XHRcdGNhc2UgJ21pbnV0ZXMnOiAvLyAxNi4yNy4yMCA8bnVtYmVyOm1pbnV0ZXM+XG5cdFx0XHRjYXNlICdzZWNvbmRzJzogLy8gMTYuMjcuMjEgPG51bWJlcjpzZWNvbmRzPlxuXHRcdFx0Y2FzZSAnYW0tcG0nOiAvLyAxNi4yNy4yMiA8bnVtYmVyOmFtLXBtPlxuXHRcdFx0XHRzd2l0Y2goc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdKSB7XG5cdFx0XHRcdFx0Y2FzZSAndGltZS1zdHlsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnZGF0ZS1zdHlsZSc6XG5cdFx0XHRcdFx0XHR0YWcgPSBwYXJzZXhtbHRhZyhSblswXSwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0TkYgKz0gbnVtYmVyX2Zvcm1hdHNfb2RzW1JuWzNdXVt0YWcuc3R5bGU9PT0nbG9uZyc/MTowXTsgYnJlYWs7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdGNhc2UgJ2Jvb2xlYW4tc3R5bGUnOiBicmVhazsgLy8gMTYuMjcuMjMgPG51bWJlcjpib29sZWFuLXN0eWxlPlxuXHRcdFx0Y2FzZSAnYm9vbGVhbic6IGJyZWFrOyAvLyAxNi4yNy4yNCA8bnVtYmVyOmJvb2xlYW4+XG5cdFx0XHRjYXNlICd0ZXh0LXN0eWxlJzogYnJlYWs7IC8vIDE2LjI3LjI1IDxudW1iZXI6dGV4dC1zdHlsZT5cblx0XHRcdGNhc2UgJ3RleHQnOiAvLyAxNi4yNy4yNiA8bnVtYmVyOnRleHQ+XG5cdFx0XHRcdGlmKFJuWzBdLnNsaWNlKC0yKSA9PT0gXCIvPlwiKSBicmVhaztcblx0XHRcdFx0ZWxzZSBpZihSblsxXT09PVwiL1wiKSBzd2l0Y2goc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdKSB7XG5cdFx0XHRcdFx0Y2FzZSAnbnVtYmVyLXN0eWxlJzpcblx0XHRcdFx0XHRjYXNlICdkYXRlLXN0eWxlJzpcblx0XHRcdFx0XHRjYXNlICd0aW1lLXN0eWxlJzpcblx0XHRcdFx0XHRcdE5GICs9IHN0ci5zbGljZShwaWR4LCBSbi5pbmRleCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHBpZHggPSBSbi5pbmRleCArIFJuWzBdLmxlbmd0aDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ25hbWVkLXJhbmdlJzogLy8gOS40LjEyIDx0YWJsZTpuYW1lZC1yYW5nZT5cblx0XHRcdFx0dGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTtcblx0XHRcdFx0X1JlZiA9IG9kc190b19jc2ZfM0QodGFnWydjZWxsLXJhbmdlLWFkZHJlc3MnXSk7XG5cdFx0XHRcdHZhciBucmFuZ2UgPSAoe05hbWU6dGFnLm5hbWUsIFJlZjpfUmVmWzBdICsgJyEnICsgX1JlZlsxXX0vKjphbnkqLyk7XG5cdFx0XHRcdGlmKGludGFibGUpIG5yYW5nZS5TaGVldCA9IFNoZWV0TmFtZXMubGVuZ3RoO1xuXHRcdFx0XHRXQi5OYW1lcy5wdXNoKG5yYW5nZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICd0ZXh0LWNvbnRlbnQnOiBicmVhazsgLy8gMTYuMjcuMjcgPG51bWJlcjp0ZXh0LWNvbnRlbnQ+XG5cdFx0XHRjYXNlICd0ZXh0LXByb3BlcnRpZXMnOiBicmVhazsgLy8gMTYuMjcuMjcgPHN0eWxlOnRleHQtcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ2VtYmVkZGVkLXRleHQnOiBicmVhazsgLy8gMTYuMjcuNCA8bnVtYmVyOmVtYmVkZGVkLXRleHQ+XG5cblx0XHRcdGNhc2UgJ2JvZHknOiBjYXNlICfnlLXlrZDooajmoLwnOiBicmVhazsgLy8gMy4zIDE2LjkuNiAxOS43MjYuM1xuXG5cdFx0XHRjYXNlICdmb3Jtcyc6IGJyZWFrOyAvLyAxMi4yNS4yIDEzLjJcblx0XHRcdGNhc2UgJ3RhYmxlLWNvbHVtbic6IGJyZWFrOyAvLyA5LjEuNiA8dGFibGU6dGFibGUtY29sdW1uPlxuXHRcdFx0Y2FzZSAndGFibGUtaGVhZGVyLXJvd3MnOiBicmVhazsgLy8gOS4xLjcgPHRhYmxlOnRhYmxlLWhlYWRlci1yb3dzPlxuXHRcdFx0Y2FzZSAndGFibGUtcm93cyc6IGJyZWFrOyAvLyA5LjEuMTIgPHRhYmxlOnRhYmxlLXJvd3M+XG5cdFx0XHQvKiBUT0RPOiBvdXRsaW5lIGxldmVscyAqL1xuXHRcdFx0Y2FzZSAndGFibGUtY29sdW1uLWdyb3VwJzogYnJlYWs7IC8vIDkuMS4xMCA8dGFibGU6dGFibGUtY29sdW1uLWdyb3VwPlxuXHRcdFx0Y2FzZSAndGFibGUtaGVhZGVyLWNvbHVtbnMnOiBicmVhazsgLy8gOS4xLjExIDx0YWJsZTp0YWJsZS1oZWFkZXItY29sdW1ucz5cblx0XHRcdGNhc2UgJ3RhYmxlLWNvbHVtbnMnOiBicmVhazsgLy8gOS4xLjEyIDx0YWJsZTp0YWJsZS1jb2x1bW5zPlxuXG5cdFx0XHRjYXNlICdudWxsLWRhdGUnOiBicmVhazsgLy8gOS40LjIgPHRhYmxlOm51bGwtZGF0ZT4gVE9ETzogZGF0ZTE5MDRcblxuXHRcdFx0Y2FzZSAnZ3JhcGhpYy1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjIxIDxzdHlsZTpncmFwaGljLXByb3BlcnRpZXM+XG5cdFx0XHRjYXNlICdjYWxjdWxhdGlvbi1zZXR0aW5ncyc6IGJyZWFrOyAvLyA5LjQuMSA8dGFibGU6Y2FsY3VsYXRpb24tc2V0dGluZ3M+XG5cdFx0XHRjYXNlICduYW1lZC1leHByZXNzaW9ucyc6IGJyZWFrOyAvLyA5LjQuMTEgPHRhYmxlOm5hbWVkLWV4cHJlc3Npb25zPlxuXHRcdFx0Y2FzZSAnbGFiZWwtcmFuZ2UnOiBicmVhazsgLy8gOS40LjkgPHRhYmxlOmxhYmVsLXJhbmdlPlxuXHRcdFx0Y2FzZSAnbGFiZWwtcmFuZ2VzJzogYnJlYWs7IC8vIDkuNC4xMCA8dGFibGU6bGFiZWwtcmFuZ2VzPlxuXHRcdFx0Y2FzZSAnbmFtZWQtZXhwcmVzc2lvbic6IGJyZWFrOyAvLyA5LjQuMTMgPHRhYmxlOm5hbWVkLWV4cHJlc3Npb24+XG5cdFx0XHRjYXNlICdzb3J0JzogYnJlYWs7IC8vIDkuNC4xOSA8dGFibGU6c29ydD5cblx0XHRcdGNhc2UgJ3NvcnQtYnknOiBicmVhazsgLy8gOS40LjIwIDx0YWJsZTpzb3J0LWJ5PlxuXHRcdFx0Y2FzZSAnc29ydC1ncm91cHMnOiBicmVhazsgLy8gOS40LjIyIDx0YWJsZTpzb3J0LWdyb3Vwcz5cblxuXHRcdFx0Y2FzZSAndGFiJzogYnJlYWs7IC8vIDYuMS40IDx0ZXh0OnRhYj5cblx0XHRcdGNhc2UgJ2xpbmUtYnJlYWsnOiBicmVhazsgLy8gNi4xLjUgPHRleHQ6bGluZS1icmVhaz5cblx0XHRcdGNhc2UgJ3NwYW4nOiBicmVhazsgLy8gNi4xLjcgPHRleHQ6c3Bhbj5cblx0XHRcdGNhc2UgJ3AnOiBjYXNlICfmlofmnKzkuLInOiAvLyA1LjEuMyA8dGV4dDpwPlxuXHRcdFx0XHRpZihbJ21hc3Rlci1zdHlsZXMnXS5pbmRleE9mKHN0YXRlW3N0YXRlLmxlbmd0aC0xXVswXSkgPiAtMSkgYnJlYWs7XG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nICYmICghY3RhZyB8fCAhY3RhZ1snc3RyaW5nLXZhbHVlJ10pKSB7XG5cdFx0XHRcdFx0dmFyIHB0cCA9IHBhcnNlX3RleHRfcChzdHIuc2xpY2UodGV4dHBpZHgsUm4uaW5kZXgpLCB0ZXh0cHRhZyk7XG5cdFx0XHRcdFx0dGV4dHAgPSAodGV4dHAubGVuZ3RoID4gMCA/IHRleHRwICsgXCJcXG5cIiA6IFwiXCIpICsgcHRwWzBdO1xuXHRcdFx0XHR9IGVsc2UgeyB0ZXh0cHRhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7IHRleHRwaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7IH1cblx0XHRcdFx0YnJlYWs7IC8vIDx0ZXh0OnA+XG5cdFx0XHRjYXNlICdzJzogYnJlYWs7IC8vIDx0ZXh0OnM+XG5cblx0XHRcdGNhc2UgJ2RhdGFiYXNlLXJhbmdlJzogLy8gOS40LjE1IDx0YWJsZTpkYXRhYmFzZS1yYW5nZT5cblx0XHRcdFx0aWYoUm5bMV09PT0nLycpIGJyZWFrO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdF9SZWYgPSBvZHNfdG9fY3NmXzNEKHBhcnNleG1sdGFnKFJuWzBdKVsndGFyZ2V0LXJhbmdlLWFkZHJlc3MnXSk7XG5cdFx0XHRcdFx0U2hlZXRzW19SZWZbMF1dWychYXV0b2ZpbHRlciddID0geyByZWY6X1JlZlsxXSB9O1xuXHRcdFx0XHR9IGNhdGNoKGUpIHsvKiBlbXB0eSAqL31cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ2RhdGUnOiBicmVhazsgLy8gPCo6ZGF0ZT5cblxuXHRcdFx0Y2FzZSAnb2JqZWN0JzogYnJlYWs7IC8vIDEwLjQuNi4yIDxkcmF3Om9iamVjdD5cblx0XHRcdGNhc2UgJ3RpdGxlJzogY2FzZSAn5qCH6aKYJzogYnJlYWs7IC8vIDwqOnRpdGxlPiBPUiA8dW9mOuagh+mimD5cblx0XHRcdGNhc2UgJ2Rlc2MnOiBicmVhazsgLy8gPCo6ZGVzYz5cblx0XHRcdGNhc2UgJ2JpbmFyeS1kYXRhJzogYnJlYWs7IC8vIDEwLjQuNSBUT0RPOiBiNjQgYmxvYlxuXG5cdFx0XHQvKiA5LjIgQWR2YW5jZWQgVGFibGVzICovXG5cdFx0XHRjYXNlICd0YWJsZS1zb3VyY2UnOiBicmVhazsgLy8gOS4yLjZcblx0XHRcdGNhc2UgJ3NjZW5hcmlvJzogYnJlYWs7IC8vIDkuMi42XG5cblx0XHRcdGNhc2UgJ2l0ZXJhdGlvbic6IGJyZWFrOyAvLyA5LjQuMyA8dGFibGU6aXRlcmF0aW9uPlxuXHRcdFx0Y2FzZSAnY29udGVudC12YWxpZGF0aW9ucyc6IGJyZWFrOyAvLyA5LjQuNCA8dGFibGU6XG5cdFx0XHRjYXNlICdjb250ZW50LXZhbGlkYXRpb24nOiBicmVhazsgLy8gOS40LjUgPHRhYmxlOlxuXHRcdFx0Y2FzZSAnaGVscC1tZXNzYWdlJzogYnJlYWs7IC8vIDkuNC42IDx0YWJsZTpcblx0XHRcdGNhc2UgJ2Vycm9yLW1lc3NhZ2UnOiBicmVhazsgLy8gOS40LjcgPHRhYmxlOlxuXHRcdFx0Y2FzZSAnZGF0YWJhc2UtcmFuZ2VzJzogYnJlYWs7IC8vIDkuNC4xNCA8dGFibGU6ZGF0YWJhc2UtcmFuZ2VzPlxuXHRcdFx0Y2FzZSAnZmlsdGVyJzogYnJlYWs7IC8vIDkuNS4yIDx0YWJsZTpmaWx0ZXI+XG5cdFx0XHRjYXNlICdmaWx0ZXItYW5kJzogYnJlYWs7IC8vIDkuNS4zIDx0YWJsZTpmaWx0ZXItYW5kPlxuXHRcdFx0Y2FzZSAnZmlsdGVyLW9yJzogYnJlYWs7IC8vIDkuNS40IDx0YWJsZTpmaWx0ZXItb3I+XG5cdFx0XHRjYXNlICdmaWx0ZXItY29uZGl0aW9uJzogYnJlYWs7IC8vIDkuNS41IDx0YWJsZTpmaWx0ZXItY29uZGl0aW9uPlxuXG5cdFx0XHRjYXNlICdsaXN0LWxldmVsLXN0eWxlLWJ1bGxldCc6IGJyZWFrOyAvLyAxNi4zMSA8dGV4dDpcblx0XHRcdGNhc2UgJ2xpc3QtbGV2ZWwtc3R5bGUtbnVtYmVyJzogYnJlYWs7IC8vIDE2LjMyIDx0ZXh0OlxuXHRcdFx0Y2FzZSAnbGlzdC1sZXZlbC1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjE5IDxzdHlsZTpcblxuXHRcdFx0LyogNy4zIERvY3VtZW50IEZpZWxkcyAqL1xuXHRcdFx0Y2FzZSAnc2VuZGVyLWZpcnN0bmFtZSc6IC8vIDcuMy42LjJcblx0XHRcdGNhc2UgJ3NlbmRlci1sYXN0bmFtZSc6IC8vIDcuMy42LjNcblx0XHRcdGNhc2UgJ3NlbmRlci1pbml0aWFscyc6IC8vIDcuMy42LjRcblx0XHRcdGNhc2UgJ3NlbmRlci10aXRsZSc6IC8vIDcuMy42LjVcblx0XHRcdGNhc2UgJ3NlbmRlci1wb3NpdGlvbic6IC8vIDcuMy42LjZcblx0XHRcdGNhc2UgJ3NlbmRlci1lbWFpbCc6IC8vIDcuMy42Ljdcblx0XHRcdGNhc2UgJ3NlbmRlci1waG9uZS1wcml2YXRlJzogLy8gNy4zLjYuOFxuXHRcdFx0Y2FzZSAnc2VuZGVyLWZheCc6IC8vIDcuMy42Ljlcblx0XHRcdGNhc2UgJ3NlbmRlci1jb21wYW55JzogLy8gNy4zLjYuMTBcblx0XHRcdGNhc2UgJ3NlbmRlci1waG9uZS13b3JrJzogLy8gNy4zLjYuMTFcblx0XHRcdGNhc2UgJ3NlbmRlci1zdHJlZXQnOiAvLyA3LjMuNi4xMlxuXHRcdFx0Y2FzZSAnc2VuZGVyLWNpdHknOiAvLyA3LjMuNi4xM1xuXHRcdFx0Y2FzZSAnc2VuZGVyLXBvc3RhbC1jb2RlJzogLy8gNy4zLjYuMTRcblx0XHRcdGNhc2UgJ3NlbmRlci1jb3VudHJ5JzogLy8gNy4zLjYuMTVcblx0XHRcdGNhc2UgJ3NlbmRlci1zdGF0ZS1vci1wcm92aW5jZSc6IC8vIDcuMy42LjE2XG5cdFx0XHRjYXNlICdhdXRob3ItbmFtZSc6IC8vIDcuMy43LjFcblx0XHRcdGNhc2UgJ2F1dGhvci1pbml0aWFscyc6IC8vIDcuMy43LjJcblx0XHRcdGNhc2UgJ2NoYXB0ZXInOiAvLyA3LjMuOFxuXHRcdFx0Y2FzZSAnZmlsZS1uYW1lJzogLy8gNy4zLjlcblx0XHRcdGNhc2UgJ3RlbXBsYXRlLW5hbWUnOiAvLyA3LjMuOVxuXHRcdFx0Y2FzZSAnc2hlZXQtbmFtZSc6IC8vIDcuMy45XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdldmVudC1saXN0ZW5lcic6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0LyogVE9ETzogRk9EUyBQcm9wZXJ0aWVzICovXG5cdFx0XHRjYXNlICdpbml0aWFsLWNyZWF0b3InOlxuXHRcdFx0Y2FzZSAnY3JlYXRpb24tZGF0ZSc6XG5cdFx0XHRjYXNlICdwcmludC1kYXRlJzpcblx0XHRcdGNhc2UgJ2dlbmVyYXRvcic6XG5cdFx0XHRjYXNlICdkb2N1bWVudC1zdGF0aXN0aWMnOlxuXHRcdFx0Y2FzZSAndXNlci1kZWZpbmVkJzpcblx0XHRcdGNhc2UgJ2VkaXRpbmctZHVyYXRpb24nOlxuXHRcdFx0Y2FzZSAnZWRpdGluZy1jeWNsZXMnOlxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogVE9ETzogRk9EUyBDb25maWcgKi9cblx0XHRcdGNhc2UgJ2NvbmZpZy1pdGVtJzpcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdC8qIFRPRE86IHN0eWxlIHRva2VucyAqL1xuXHRcdFx0Y2FzZSAncGFnZS1udW1iZXInOiBicmVhazsgLy8gVE9ETyA8dGV4dDpwYWdlLW51bWJlcj5cblx0XHRcdGNhc2UgJ3BhZ2UtY291bnQnOiBicmVhazsgLy8gVE9ETyA8dGV4dDpwYWdlLWNvdW50PlxuXHRcdFx0Y2FzZSAndGltZSc6IGJyZWFrOyAvLyBUT0RPIDx0ZXh0OnRpbWU+XG5cblx0XHRcdC8qIDkuMyBBZHZhbmNlZCBUYWJsZSBDZWxscyAqL1xuXHRcdFx0Y2FzZSAnY2VsbC1yYW5nZS1zb3VyY2UnOiBicmVhazsgLy8gOS4zLjEgPHRhYmxlOlxuXHRcdFx0Y2FzZSAnZGV0ZWN0aXZlJzogYnJlYWs7IC8vIDkuMy4yIDx0YWJsZTpcblx0XHRcdGNhc2UgJ29wZXJhdGlvbic6IGJyZWFrOyAvLyA5LjMuMyA8dGFibGU6XG5cdFx0XHRjYXNlICdoaWdobGlnaHRlZC1yYW5nZSc6IGJyZWFrOyAvLyA5LjMuNCA8dGFibGU6XG5cblx0XHRcdC8qIDkuNiBEYXRhIFBpbG90IFRhYmxlcyA8dGFibGU6ICovXG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LXRhYmxlJzogLy8gOS42LjNcblx0XHRcdGNhc2UgJ3NvdXJjZS1jZWxsLXJhbmdlJzogLy8gOS42LjVcblx0XHRcdGNhc2UgJ3NvdXJjZS1zZXJ2aWNlJzogLy8gOS42LjZcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtZmllbGQnOiAvLyA5LjYuN1xuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1sZXZlbCc6IC8vIDkuNi44XG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LXN1YnRvdGFscyc6IC8vIDkuNi45XG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LXN1YnRvdGFsJzogLy8gOS42LjEwXG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LW1lbWJlcnMnOiAvLyA5LjYuMTFcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtbWVtYmVyJzogLy8gOS42LjEyXG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LWRpc3BsYXktaW5mbyc6IC8vIDkuNi4xM1xuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1zb3J0LWluZm8nOiAvLyA5LjYuMTRcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtbGF5b3V0LWluZm8nOiAvLyA5LjYuMTVcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtZmllbGQtcmVmZXJlbmNlJzogLy8gOS42LjE2XG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LWdyb3Vwcyc6IC8vIDkuNi4xN1xuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1ncm91cCc6IC8vIDkuNi4xOFxuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1ncm91cC1tZW1iZXInOiAvLyA5LjYuMTlcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdC8qIDEwLjMgRHJhd2luZyBTaGFwZXMgKi9cblx0XHRcdGNhc2UgJ3JlY3QnOiAvLyAxMC4zLjJcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdC8qIDE0LjYgRERFIENvbm5lY3Rpb25zICovXG5cdFx0XHRjYXNlICdkZGUtY29ubmVjdGlvbi1kZWNscyc6IC8vIDE0LjYuMiA8dGV4dDpcblx0XHRcdGNhc2UgJ2RkZS1jb25uZWN0aW9uLWRlY2wnOiAvLyAxNC42LjMgPHRleHQ6XG5cdFx0XHRjYXNlICdkZGUtbGluayc6IC8vIDE0LjYuNCA8dGFibGU6XG5cdFx0XHRjYXNlICdkZGUtc291cmNlJzogLy8gMTQuNi41IDxvZmZpY2U6XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdwcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDEzLjcgPGZvcm06cHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ3Byb3BlcnR5JzogYnJlYWs7IC8vIDEzLjggPGZvcm06cHJvcGVydHk+XG5cblx0XHRcdGNhc2UgJ2EnOiAvLyA2LjEuOCBoeXBlcmxpbmtcblx0XHRcdFx0aWYoUm5bMV0hPT0gJy8nKSB7XG5cdFx0XHRcdFx0YXRhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdFx0aWYoIWF0YWcuaHJlZikgYnJlYWs7XG5cdFx0XHRcdFx0YXRhZy5UYXJnZXQgPSB1bmVzY2FwZXhtbChhdGFnLmhyZWYpOyBkZWxldGUgYXRhZy5ocmVmO1xuXHRcdFx0XHRcdGlmKGF0YWcuVGFyZ2V0LmNoYXJBdCgwKSA9PSBcIiNcIiAmJiBhdGFnLlRhcmdldC5pbmRleE9mKFwiLlwiKSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRfUmVmID0gb2RzX3RvX2NzZl8zRChhdGFnLlRhcmdldC5zbGljZSgxKSk7XG5cdFx0XHRcdFx0XHRhdGFnLlRhcmdldCA9IFwiI1wiICsgX1JlZlswXSArIFwiIVwiICsgX1JlZlsxXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoYXRhZy5UYXJnZXQubWF0Y2goL15cXC5cXC5bXFxcXFxcL10vKSkgYXRhZy5UYXJnZXQgPSBhdGFnLlRhcmdldC5zbGljZSgzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Lyogbm9uLXN0YW5kYXJkICovXG5cdFx0XHRjYXNlICd0YWJsZS1wcm90ZWN0aW9uJzogYnJlYWs7XG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LWdyYW5kLXRvdGFsJzogYnJlYWs7IC8vIDx0YWJsZTpcblx0XHRcdGNhc2UgJ29mZmljZS1kb2N1bWVudC1jb21tb24tYXR0cnMnOiBicmVhazsgLy8gYmFyZVxuXHRcdFx0ZGVmYXVsdDogc3dpdGNoKFJuWzJdKSB7XG5cdFx0XHRcdGNhc2UgJ2RjOic6ICAgICAgIC8vIFRPRE86IHByb3BlcnRpZXNcblx0XHRcdFx0Y2FzZSAnY2FsY2V4dDonOiAgLy8gaWdub3JlIHVuZG9jdW1lbnRlZCBleHRlbnNpb25zXG5cdFx0XHRcdGNhc2UgJ2xvZXh0Oic6ICAgIC8vIGlnbm9yZSB1bmRvY3VtZW50ZWQgZXh0ZW5zaW9uc1xuXHRcdFx0XHRjYXNlICdvb286JzogICAgICAvLyBpZ25vcmUgdW5kb2N1bWVudGVkIGV4dGVuc2lvbnNcblx0XHRcdFx0Y2FzZSAnY2hhcnRvb286JzogLy8gaWdub3JlIHVuZG9jdW1lbnRlZCBleHRlbnNpb25zXG5cdFx0XHRcdGNhc2UgJ2RyYXc6JzogICAgIC8vIFRPRE86IGRyYXdpbmdcblx0XHRcdFx0Y2FzZSAnc3R5bGU6JzogICAgLy8gVE9ETzogc3R5bGVzXG5cdFx0XHRcdGNhc2UgJ2NoYXJ0Oic6ICAgIC8vIFRPRE86IGNoYXJ0c1xuXHRcdFx0XHRjYXNlICdmb3JtOic6ICAgICAvLyBUT0RPOiBmb3Jtc1xuXHRcdFx0XHRjYXNlICd1b2Y6JzogICAgICAvLyBUT0RPOiB1b2Zcblx0XHRcdFx0Y2FzZSAn6KGoOic6ICAgICAgIC8vIFRPRE86IHVvZlxuXHRcdFx0XHRjYXNlICflrZc6JzogICAgICAgLy8gVE9ETzogdW9mXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoUm4pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YXIgb3V0Lyo6V29ya2Jvb2sqLyA9ICh7XG5cdFx0XHRTaGVldHM6IFNoZWV0cyxcblx0XHRcdFNoZWV0TmFtZXM6IFNoZWV0TmFtZXMsXG5cdFx0XHRXb3JrYm9vazogV0Jcblx0XHR9Lyo6YW55Ki8pO1xuXHRcdGlmKG9wdHMuYm9va1NoZWV0cykgZGVsZXRlIC8qOjooKi9vdXQvKjo6IDphbnkpKi8uU2hlZXRzO1xuXHRcdHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX29kcyh6aXAvKjpaSVBGaWxlKi8sIG9wdHMvKjo/UGFyc2VPcHRzKi8pLyo6V29ya2Jvb2sqLyB7XG5cdG9wdHMgPSBvcHRzIHx8ICh7fS8qOmFueSovKTtcblx0aWYoc2FmZWdldHppcGZpbGUoemlwLCAnTUVUQS1JTkYvbWFuaWZlc3QueG1sJykpIHBhcnNlX21hbmlmZXN0KGdldHppcGRhdGEoemlwLCAnTUVUQS1JTkYvbWFuaWZlc3QueG1sJyksIG9wdHMpO1xuXHR2YXIgY29udGVudCA9IGdldHppcHN0cih6aXAsICdjb250ZW50LnhtbCcpO1xuXHRpZighY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBjb250ZW50LnhtbCBpbiBPRFMgLyBVT0YgZmlsZVwiKTtcblx0dmFyIHdiID0gcGFyc2VfY29udGVudF94bWwodXRmOHJlYWQoY29udGVudCksIG9wdHMpO1xuXHRpZihzYWZlZ2V0emlwZmlsZSh6aXAsICdtZXRhLnhtbCcpKSB3Yi5Qcm9wcyA9IHBhcnNlX2NvcmVfcHJvcHMoZ2V0emlwZGF0YSh6aXAsICdtZXRhLnhtbCcpKTtcblx0cmV0dXJuIHdiO1xufVxuZnVuY3Rpb24gcGFyc2VfZm9kcyhkYXRhLyo6c3RyaW5nKi8sIG9wdHMvKjo/UGFyc2VPcHRzKi8pLyo6V29ya2Jvb2sqLyB7XG5cdHJldHVybiBwYXJzZV9jb250ZW50X3htbChkYXRhLCBvcHRzKTtcbn1cblxuLyogT3BlbkRvY3VtZW50ICovXG52YXIgd3JpdGVfc3R5bGVzX29kcy8qOnsod2I6YW55LCBvcHRzOmFueSk6c3RyaW5nfSovID0gLyogQF9fUFVSRV9fICovKGZ1bmN0aW9uKCkge1xuXHR2YXIgbWFzdGVyX3N0eWxlcyA9IFtcblx0XHQnPG9mZmljZTptYXN0ZXItc3R5bGVzPicsXG5cdFx0XHQnPHN0eWxlOm1hc3Rlci1wYWdlIHN0eWxlOm5hbWU9XCJtcDFcIiBzdHlsZTpwYWdlLWxheW91dC1uYW1lPVwibXAxXCI+Jyxcblx0XHRcdFx0JzxzdHlsZTpoZWFkZXIvPicsXG5cdFx0XHRcdCc8c3R5bGU6aGVhZGVyLWxlZnQgc3R5bGU6ZGlzcGxheT1cImZhbHNlXCIvPicsXG5cdFx0XHRcdCc8c3R5bGU6Zm9vdGVyLz4nLFxuXHRcdFx0XHQnPHN0eWxlOmZvb3Rlci1sZWZ0IHN0eWxlOmRpc3BsYXk9XCJmYWxzZVwiLz4nLFxuXHRcdFx0Jzwvc3R5bGU6bWFzdGVyLXBhZ2U+Jyxcblx0XHQnPC9vZmZpY2U6bWFzdGVyLXN0eWxlcz4nXG5cdF0uam9pbihcIlwiKTtcblxuXHR2YXIgcGF5bG9hZCA9ICc8b2ZmaWNlOmRvY3VtZW50LXN0eWxlcyAnICsgd3h0X2hlbHBlcih7XG5cdFx0J3htbG5zOm9mZmljZSc6ICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm9mZmljZToxLjBcIixcblx0XHQneG1sbnM6dGFibGUnOiAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6dGFibGU6MS4wXCIsXG5cdFx0J3htbG5zOnN0eWxlJzogICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnN0eWxlOjEuMFwiLFxuXHRcdCd4bWxuczp0ZXh0JzogICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp0ZXh0OjEuMFwiLFxuXHRcdCd4bWxuczpkcmF3JzogICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpkcmF3aW5nOjEuMFwiLFxuXHRcdCd4bWxuczpmbyc6ICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp4c2wtZm8tY29tcGF0aWJsZToxLjBcIixcblx0XHQneG1sbnM6eGxpbmsnOiAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcblx0XHQneG1sbnM6ZGMnOiAgICAgICBcImh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvXCIsXG5cdFx0J3htbG5zOm51bWJlcic6ICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRhdGFzdHlsZToxLjBcIixcblx0XHQneG1sbnM6c3ZnJzogICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6c3ZnLWNvbXBhdGlibGU6MS4wXCIsXG5cdFx0J3htbG5zOm9mJzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm9mOjEuMlwiLFxuXHRcdCdvZmZpY2U6dmVyc2lvbic6IFwiMS4yXCJcblx0fSkgKyAnPicgKyBtYXN0ZXJfc3R5bGVzICsgJzwvb2ZmaWNlOmRvY3VtZW50LXN0eWxlcz4nO1xuXG5cdHJldHVybiBmdW5jdGlvbiB3c28oLyo6OndiLCBvcHRzKi8pIHtcblx0XHRyZXR1cm4gWE1MX0hFQURFUiArIHBheWxvYWQ7XG5cdH07XG59KSgpO1xudmFyIHdyaXRlX2NvbnRlbnRfb2RzLyo6eyh3YjphbnksIG9wdHM6YW55KTpzdHJpbmd9Ki8gPSAvKiBAX19QVVJFX18gKi8oZnVuY3Rpb24oKSB7XG5cdC8qIDYuMS4yIFdoaXRlIFNwYWNlIENoYXJhY3RlcnMgKi9cblx0dmFyIHdyaXRlX3RleHRfcCA9IGZ1bmN0aW9uKHRleHQvKjpzdHJpbmcqLykvKjpzdHJpbmcqLyB7XG5cdFx0cmV0dXJuIGVzY2FwZXhtbCh0ZXh0KVxuXHRcdFx0LnJlcGxhY2UoLyAgKy9nLCBmdW5jdGlvbigkJCl7cmV0dXJuICc8dGV4dDpzIHRleHQ6Yz1cIicrJCQubGVuZ3RoKydcIi8+Jzt9KVxuXHRcdFx0LnJlcGxhY2UoL1xcdC9nLCBcIjx0ZXh0OnRhYi8+XCIpXG5cdFx0XHQucmVwbGFjZSgvXFxuL2csIFwiPC90ZXh0OnA+PHRleHQ6cD5cIilcblx0XHRcdC5yZXBsYWNlKC9eIC8sIFwiPHRleHQ6cy8+XCIpLnJlcGxhY2UoLyAkLywgXCI8dGV4dDpzLz5cIik7XG5cdH07XG5cblx0dmFyIG51bGxfY2VsbF94bWwgPSAnICAgICAgICAgIDx0YWJsZTp0YWJsZS1jZWxsIC8+XFxuJztcblx0dmFyIGNvdmVyZWRfY2VsbF94bWwgPSAnICAgICAgICAgIDx0YWJsZTpjb3ZlcmVkLXRhYmxlLWNlbGwvPlxcbic7XG5cdHZhciB3cml0ZV93cyA9IGZ1bmN0aW9uKHdzLCB3Yi8qOldvcmtib29rKi8sIGkvKjpudW1iZXIqLy8qOjosIG9wdHMqLykvKjpzdHJpbmcqLyB7XG5cdFx0LyogU2VjdGlvbiA5IFRhYmxlcyAqL1xuXHRcdHZhciBvLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdFx0by5wdXNoKCcgICAgICA8dGFibGU6dGFibGUgdGFibGU6bmFtZT1cIicgKyBlc2NhcGV4bWwod2IuU2hlZXROYW1lc1tpXSkgKyAnXCIgdGFibGU6c3R5bGUtbmFtZT1cInRhMVwiPlxcbicpO1xuXHRcdHZhciBSPTAsQz0wLCByYW5nZSA9IGRlY29kZV9yYW5nZSh3c1snIXJlZiddfHxcIkExXCIpO1xuXHRcdHZhciBtYXJyLyo6QXJyYXk8UmFuZ2U+Ki8gPSB3c1snIW1lcmdlcyddIHx8IFtdLCBtaSA9IDA7XG5cdFx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdFx0aWYod3NbXCIhY29sc1wiXSkge1xuXHRcdFx0Zm9yKEMgPSAwOyBDIDw9IHJhbmdlLmUuYzsgKytDKSBvLnB1c2goJyAgICAgICAgPHRhYmxlOnRhYmxlLWNvbHVtbicgKyAod3NbXCIhY29sc1wiXVtDXSA/ICcgdGFibGU6c3R5bGUtbmFtZT1cImNvJyArIHdzW1wiIWNvbHNcIl1bQ10ub2RzICsgJ1wiJyA6ICcnKSArICc+PC90YWJsZTp0YWJsZS1jb2x1bW4+XFxuJyk7XG5cdFx0fVxuXHRcdHZhciBIID0gXCJcIiwgUk9XUyA9IHdzW1wiIXJvd3NcIl18fFtdO1xuXHRcdGZvcihSID0gMDsgUiA8IHJhbmdlLnMucjsgKytSKSB7XG5cdFx0XHRIID0gUk9XU1tSXSA/ICcgdGFibGU6c3R5bGUtbmFtZT1cInJvJyArIFJPV1NbUl0ub2RzICsgJ1wiJyA6IFwiXCI7XG5cdFx0XHRvLnB1c2goJyAgICAgICAgPHRhYmxlOnRhYmxlLXJvdycgKyBIICsgJz48L3RhYmxlOnRhYmxlLXJvdz5cXG4nKTtcblx0XHR9XG5cdFx0Zm9yKDsgUiA8PSByYW5nZS5lLnI7ICsrUikge1xuXHRcdFx0SCA9IFJPV1NbUl0gPyAnIHRhYmxlOnN0eWxlLW5hbWU9XCJybycgKyBST1dTW1JdLm9kcyArICdcIicgOiBcIlwiO1xuXHRcdFx0by5wdXNoKCcgICAgICAgIDx0YWJsZTp0YWJsZS1yb3cnICsgSCArICc+XFxuJyk7XG5cdFx0XHRmb3IoQz0wOyBDIDwgcmFuZ2Uucy5jOyArK0MpIG8ucHVzaChudWxsX2NlbGxfeG1sKTtcblx0XHRcdGZvcig7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIHtcblx0XHRcdFx0dmFyIHNraXAgPSBmYWxzZSwgY3QgPSB7fSwgdGV4dHAgPSBcIlwiO1xuXHRcdFx0XHRmb3IobWkgPSAwOyBtaSAhPSBtYXJyLmxlbmd0aDsgKyttaSkge1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLnMuYyA+IEMpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLnMuciA+IFIpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLmUuYyA8IEMpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLmUuciA8IFIpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLnMuYyAhPSBDIHx8IG1hcnJbbWldLnMuciAhPSBSKSBza2lwID0gdHJ1ZTtcblx0XHRcdFx0XHRjdFsndGFibGU6bnVtYmVyLWNvbHVtbnMtc3Bhbm5lZCddID0gKG1hcnJbbWldLmUuYyAtIG1hcnJbbWldLnMuYyArIDEpO1xuXHRcdFx0XHRcdGN0Wyd0YWJsZTpudW1iZXItcm93cy1zcGFubmVkJ10gPSAgICAobWFyclttaV0uZS5yIC0gbWFyclttaV0ucy5yICsgMSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoc2tpcCkgeyBvLnB1c2goY292ZXJlZF9jZWxsX3htbCk7IGNvbnRpbnVlOyB9XG5cdFx0XHRcdHZhciByZWYgPSBlbmNvZGVfY2VsbCh7cjpSLCBjOkN9KSwgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ106IHdzW3JlZl07XG5cdFx0XHRcdGlmKGNlbGwgJiYgY2VsbC5mKSB7XG5cdFx0XHRcdFx0Y3RbJ3RhYmxlOmZvcm11bGEnXSA9IGVzY2FwZXhtbChjc2ZfdG9fb2RzX2Zvcm11bGEoY2VsbC5mKSk7XG5cdFx0XHRcdFx0aWYoY2VsbC5GKSB7XG5cdFx0XHRcdFx0XHRpZihjZWxsLkYuc2xpY2UoMCwgcmVmLmxlbmd0aCkgPT0gcmVmKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBfRnJlZiA9IGRlY29kZV9yYW5nZShjZWxsLkYpO1xuXHRcdFx0XHRcdFx0XHRjdFsndGFibGU6bnVtYmVyLW1hdHJpeC1jb2x1bW5zLXNwYW5uZWQnXSA9IChfRnJlZi5lLmMgLSBfRnJlZi5zLmMgKyAxKTtcblx0XHRcdFx0XHRcdFx0Y3RbJ3RhYmxlOm51bWJlci1tYXRyaXgtcm93cy1zcGFubmVkJ10gPSAgICAoX0ZyZWYuZS5yIC0gX0ZyZWYucy5yICsgMSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFjZWxsKSB7IG8ucHVzaChudWxsX2NlbGxfeG1sKTsgY29udGludWU7IH1cblx0XHRcdFx0c3dpdGNoKGNlbGwudCkge1xuXHRcdFx0XHRcdGNhc2UgJ2InOlxuXHRcdFx0XHRcdFx0dGV4dHAgPSAoY2VsbC52ID8gJ1RSVUUnIDogJ0ZBTFNFJyk7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOnZhbHVlLXR5cGUnXSA9IFwiYm9vbGVhblwiO1xuXHRcdFx0XHRcdFx0Y3RbJ29mZmljZTpib29sZWFuLXZhbHVlJ10gPSAoY2VsbC52ID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICduJzpcblx0XHRcdFx0XHRcdHRleHRwID0gKGNlbGwud3x8U3RyaW5nKGNlbGwudnx8MCkpO1xuXHRcdFx0XHRcdFx0Y3RbJ29mZmljZTp2YWx1ZS10eXBlJ10gPSBcImZsb2F0XCI7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOnZhbHVlJ10gPSAoY2VsbC52fHwwKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3MnOiBjYXNlICdzdHInOlxuXHRcdFx0XHRcdFx0dGV4dHAgPSBjZWxsLnYgPT0gbnVsbCA/IFwiXCIgOiBjZWxsLnY7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOnZhbHVlLXR5cGUnXSA9IFwic3RyaW5nXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0XHRcdHRleHRwID0gKGNlbGwud3x8KHBhcnNlRGF0ZShjZWxsLnYpLnRvSVNPU3RyaW5nKCkpKTtcblx0XHRcdFx0XHRcdGN0WydvZmZpY2U6dmFsdWUtdHlwZSddID0gXCJkYXRlXCI7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOmRhdGUtdmFsdWUnXSA9IChwYXJzZURhdGUoY2VsbC52KS50b0lTT1N0cmluZygpKTtcblx0XHRcdFx0XHRcdGN0Wyd0YWJsZTpzdHlsZS1uYW1lJ10gPSBcImNlMVwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Ly9jYXNlICdlJzpcblx0XHRcdFx0XHRkZWZhdWx0OiBvLnB1c2gobnVsbF9jZWxsX3htbCk7IGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciB0ZXh0X3AgPSB3cml0ZV90ZXh0X3AodGV4dHApO1xuXHRcdFx0XHRpZihjZWxsLmwgJiYgY2VsbC5sLlRhcmdldCkge1xuXHRcdFx0XHRcdHZhciBfdGd0ID0gY2VsbC5sLlRhcmdldDtcblx0XHRcdFx0XHRfdGd0ID0gX3RndC5jaGFyQXQoMCkgPT0gXCIjXCIgPyBcIiNcIiArIGNzZl90b19vZHNfM0QoX3RndC5zbGljZSgxKSkgOiBfdGd0O1xuXHRcdFx0XHRcdC8vIFRPRE86IGNob29zZSBjb3JyZWN0IHBhcmVudCBwYXRoIGZvcm1hdCBiYXNlZCBvbiBsaW5rIGRlbGltaXRlcnNcblx0XHRcdFx0XHRpZihfdGd0LmNoYXJBdCgwKSAhPSBcIiNcIiAmJiAhX3RndC5tYXRjaCgvXlxcdys6LykpIF90Z3QgPSAnLi4vJyArIF90Z3Q7XG5cdFx0XHRcdFx0dGV4dF9wID0gd3JpdGV4dGFnKCd0ZXh0OmEnLCB0ZXh0X3AsIHsneGxpbms6aHJlZic6IF90Z3QucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0by5wdXNoKCcgICAgICAgICAgJyArIHdyaXRleHRhZygndGFibGU6dGFibGUtY2VsbCcsIHdyaXRleHRhZygndGV4dDpwJywgdGV4dF9wLCB7fSksIGN0KSArICdcXG4nKTtcblx0XHRcdH1cblx0XHRcdG8ucHVzaCgnICAgICAgICA8L3RhYmxlOnRhYmxlLXJvdz5cXG4nKTtcblx0XHR9XG5cdFx0by5wdXNoKCcgICAgICA8L3RhYmxlOnRhYmxlPlxcbicpO1xuXHRcdHJldHVybiBvLmpvaW4oXCJcIik7XG5cdH07XG5cblx0dmFyIHdyaXRlX2F1dG9tYXRpY19zdHlsZXNfb2RzID0gZnVuY3Rpb24oby8qOkFycmF5PHN0cmluZz4qLywgd2IpIHtcblx0XHRvLnB1c2goJyA8b2ZmaWNlOmF1dG9tYXRpYy1zdHlsZXM+XFxuJyk7XG5cblx0XHRvLnB1c2goJyAgPG51bWJlcjpkYXRlLXN0eWxlIHN0eWxlOm5hbWU9XCJOMzdcIiBudW1iZXI6YXV0b21hdGljLW9yZGVyPVwidHJ1ZVwiPlxcbicpO1xuXHRcdG8ucHVzaCgnICAgPG51bWJlcjptb250aCBudW1iZXI6c3R5bGU9XCJsb25nXCIvPlxcbicpO1xuXHRcdG8ucHVzaCgnICAgPG51bWJlcjp0ZXh0Pi88L251bWJlcjp0ZXh0PlxcbicpO1xuXHRcdG8ucHVzaCgnICAgPG51bWJlcjpkYXkgbnVtYmVyOnN0eWxlPVwibG9uZ1wiLz5cXG4nKTtcblx0XHRvLnB1c2goJyAgIDxudW1iZXI6dGV4dD4vPC9udW1iZXI6dGV4dD5cXG4nKTtcblx0XHRvLnB1c2goJyAgIDxudW1iZXI6eWVhci8+XFxuJyk7XG5cdFx0by5wdXNoKCcgIDwvbnVtYmVyOmRhdGUtc3R5bGU+XFxuJyk7XG5cblx0XHQvKiBjb2x1bW4gc3R5bGVzICovXG5cdFx0dmFyIGNpZHggPSAwO1xuXHRcdHdiLlNoZWV0TmFtZXMubWFwKGZ1bmN0aW9uKG4pIHsgcmV0dXJuIHdiLlNoZWV0c1tuXTsgfSkuZm9yRWFjaChmdW5jdGlvbih3cykge1xuXHRcdFx0aWYoIXdzKSByZXR1cm47XG5cdFx0XHRpZih3c1tcIiFjb2xzXCJdKSB7XG5cdFx0XHRcdGZvcih2YXIgQyA9IDA7IEMgPCB3c1tcIiFjb2xzXCJdLmxlbmd0aDsgKytDKSBpZih3c1tcIiFjb2xzXCJdW0NdKSB7XG5cdFx0XHRcdFx0dmFyIGNvbG9iaiA9IHdzW1wiIWNvbHNcIl1bQ107XG5cdFx0XHRcdFx0aWYoY29sb2JqLndpZHRoID09IG51bGwgJiYgY29sb2JqLndweCA9PSBudWxsICYmIGNvbG9iai53Y2ggPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRcdFx0cHJvY2Vzc19jb2woY29sb2JqKTtcblx0XHRcdFx0XHRjb2xvYmoub2RzID0gY2lkeDtcblx0XHRcdFx0XHR2YXIgdyA9IHdzW1wiIWNvbHNcIl1bQ10ud3B4ICsgXCJweFwiO1xuXHRcdFx0XHRcdG8ucHVzaCgnICA8c3R5bGU6c3R5bGUgc3R5bGU6bmFtZT1cImNvJyArIGNpZHggKyAnXCIgc3R5bGU6ZmFtaWx5PVwidGFibGUtY29sdW1uXCI+XFxuJyk7XG5cdFx0XHRcdFx0by5wdXNoKCcgICA8c3R5bGU6dGFibGUtY29sdW1uLXByb3BlcnRpZXMgZm86YnJlYWstYmVmb3JlPVwiYXV0b1wiIHN0eWxlOmNvbHVtbi13aWR0aD1cIicgKyB3ICsgJ1wiLz5cXG4nKTtcblx0XHRcdFx0XHRvLnB1c2goJyAgPC9zdHlsZTpzdHlsZT5cXG4nKTtcblx0XHRcdFx0XHQrK2NpZHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8qIHJvdyBzdHlsZXMgKi9cblx0XHR2YXIgcmlkeCA9IDA7XG5cdFx0d2IuU2hlZXROYW1lcy5tYXAoZnVuY3Rpb24obikgeyByZXR1cm4gd2IuU2hlZXRzW25dOyB9KS5mb3JFYWNoKGZ1bmN0aW9uKHdzKSB7XG5cdFx0XHRpZighd3MpIHJldHVybjtcblx0XHRcdGlmKHdzW1wiIXJvd3NcIl0pIHtcblx0XHRcdFx0Zm9yKHZhciBSID0gMDsgUiA8IHdzW1wiIXJvd3NcIl0ubGVuZ3RoOyArK1IpIGlmKHdzW1wiIXJvd3NcIl1bUl0pIHtcblx0XHRcdFx0XHR3c1tcIiFyb3dzXCJdW1JdLm9kcyA9IHJpZHg7XG5cdFx0XHRcdFx0dmFyIGggPSB3c1tcIiFyb3dzXCJdW1JdLmhweCArIFwicHhcIjtcblx0XHRcdFx0XHRvLnB1c2goJyAgPHN0eWxlOnN0eWxlIHN0eWxlOm5hbWU9XCJybycgKyByaWR4ICsgJ1wiIHN0eWxlOmZhbWlseT1cInRhYmxlLXJvd1wiPlxcbicpO1xuXHRcdFx0XHRcdG8ucHVzaCgnICAgPHN0eWxlOnRhYmxlLXJvdy1wcm9wZXJ0aWVzIGZvOmJyZWFrLWJlZm9yZT1cImF1dG9cIiBzdHlsZTpyb3ctaGVpZ2h0PVwiJyArIGggKyAnXCIvPlxcbicpO1xuXHRcdFx0XHRcdG8ucHVzaCgnICA8L3N0eWxlOnN0eWxlPlxcbicpO1xuXHRcdFx0XHRcdCsrcmlkeDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0LyogdGFibGUgKi9cblx0XHRvLnB1c2goJyAgPHN0eWxlOnN0eWxlIHN0eWxlOm5hbWU9XCJ0YTFcIiBzdHlsZTpmYW1pbHk9XCJ0YWJsZVwiIHN0eWxlOm1hc3Rlci1wYWdlLW5hbWU9XCJtcDFcIj5cXG4nKTtcblx0XHRvLnB1c2goJyAgIDxzdHlsZTp0YWJsZS1wcm9wZXJ0aWVzIHRhYmxlOmRpc3BsYXk9XCJ0cnVlXCIgc3R5bGU6d3JpdGluZy1tb2RlPVwibHItdGJcIi8+XFxuJyk7XG5cdFx0by5wdXNoKCcgIDwvc3R5bGU6c3R5bGU+XFxuJyk7XG5cblx0XHQvKiB0YWJsZSBjZWxscywgdGV4dCAqL1xuXHRcdG8ucHVzaCgnICA8c3R5bGU6c3R5bGUgc3R5bGU6bmFtZT1cImNlMVwiIHN0eWxlOmZhbWlseT1cInRhYmxlLWNlbGxcIiBzdHlsZTpwYXJlbnQtc3R5bGUtbmFtZT1cIkRlZmF1bHRcIiBzdHlsZTpkYXRhLXN0eWxlLW5hbWU9XCJOMzdcIi8+XFxuJyk7XG5cblx0XHQvKiBwYWdlLWxheW91dCAqL1xuXG5cdFx0by5wdXNoKCcgPC9vZmZpY2U6YXV0b21hdGljLXN0eWxlcz5cXG4nKTtcblx0fTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gd2N4KHdiLCBvcHRzKSB7XG5cdFx0dmFyIG8gPSBbWE1MX0hFQURFUl07XG5cdFx0LyogMy4xLjMuMiAqL1xuXHRcdHZhciBhdHRyID0gd3h0X2hlbHBlcih7XG5cdFx0XHQneG1sbnM6b2ZmaWNlJzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm9mZmljZToxLjBcIixcblx0XHRcdCd4bWxuczp0YWJsZSc6ICAgICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6dGFibGU6MS4wXCIsXG5cdFx0XHQneG1sbnM6c3R5bGUnOiAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnN0eWxlOjEuMFwiLFxuXHRcdFx0J3htbG5zOnRleHQnOiAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp0ZXh0OjEuMFwiLFxuXHRcdFx0J3htbG5zOmRyYXcnOiAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpkcmF3aW5nOjEuMFwiLFxuXHRcdFx0J3htbG5zOmZvJzogICAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp4c2wtZm8tY29tcGF0aWJsZToxLjBcIixcblx0XHRcdCd4bWxuczp4bGluayc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcblx0XHRcdCd4bWxuczpkYyc6ICAgICAgICAgICBcImh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvXCIsXG5cdFx0XHQneG1sbnM6bWV0YSc6ICAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm1ldGE6MS4wXCIsXG5cdFx0XHQneG1sbnM6bnVtYmVyJzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRhdGFzdHlsZToxLjBcIixcblx0XHRcdCd4bWxuczpwcmVzZW50YXRpb24nOiBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6cHJlc2VudGF0aW9uOjEuMFwiLFxuXHRcdFx0J3htbG5zOnN2Zyc6ICAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpzdmctY29tcGF0aWJsZToxLjBcIixcblx0XHRcdCd4bWxuczpjaGFydCc6ICAgICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6Y2hhcnQ6MS4wXCIsXG5cdFx0XHQneG1sbnM6ZHIzZCc6ICAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRyM2Q6MS4wXCIsXG5cdFx0XHQneG1sbnM6bWF0aCc6ICAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIsXG5cdFx0XHQneG1sbnM6Zm9ybSc6ICAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmZvcm06MS4wXCIsXG5cdFx0XHQneG1sbnM6c2NyaXB0JzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnNjcmlwdDoxLjBcIixcblx0XHRcdCd4bWxuczpvb28nOiAgICAgICAgICBcImh0dHA6Ly9vcGVub2ZmaWNlLm9yZy8yMDA0L29mZmljZVwiLFxuXHRcdFx0J3htbG5zOm9vb3cnOiAgICAgICAgIFwiaHR0cDovL29wZW5vZmZpY2Uub3JnLzIwMDQvd3JpdGVyXCIsXG5cdFx0XHQneG1sbnM6b29vYyc6ICAgICAgICAgXCJodHRwOi8vb3Blbm9mZmljZS5vcmcvMjAwNC9jYWxjXCIsXG5cdFx0XHQneG1sbnM6ZG9tJzogICAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC1ldmVudHNcIixcblx0XHRcdCd4bWxuczp4Zm9ybXMnOiAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDIveGZvcm1zXCIsXG5cdFx0XHQneG1sbnM6eHNkJzogICAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiLFxuXHRcdFx0J3htbG5zOnhzaSc6ICAgICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIixcblx0XHRcdCd4bWxuczpzaGVldCc6ICAgICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6c2gzM3RqczoxLjBcIixcblx0XHRcdCd4bWxuczpycHQnOiAgICAgICAgICBcImh0dHA6Ly9vcGVub2ZmaWNlLm9yZy8yMDA1L3JlcG9ydFwiLFxuXHRcdFx0J3htbG5zOm9mJzogICAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpvZjoxLjJcIixcblx0XHRcdCd4bWxuczp4aHRtbCc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIixcblx0XHRcdCd4bWxuczpncmRkbCc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDMvZy9kYXRhLXZpZXcjXCIsXG5cdFx0XHQneG1sbnM6dGFibGVvb28nOiAgICAgXCJodHRwOi8vb3Blbm9mZmljZS5vcmcvMjAwOS90YWJsZVwiLFxuXHRcdFx0J3htbG5zOmRyYXdvb28nOiAgICAgIFwiaHR0cDovL29wZW5vZmZpY2Uub3JnLzIwMTAvZHJhd1wiLFxuXHRcdFx0J3htbG5zOmNhbGNleHQnOiAgICAgIFwidXJuOm9yZzpkb2N1bWVudGZvdW5kYXRpb246bmFtZXM6ZXhwZXJpbWVudGFsOmNhbGM6eG1sbnM6Y2FsY2V4dDoxLjBcIixcblx0XHRcdCd4bWxuczpsb2V4dCc6ICAgICAgICBcInVybjpvcmc6ZG9jdW1lbnRmb3VuZGF0aW9uOm5hbWVzOmV4cGVyaW1lbnRhbDpvZmZpY2U6eG1sbnM6bG9leHQ6MS4wXCIsXG5cdFx0XHQneG1sbnM6ZmllbGQnOiAgICAgICAgXCJ1cm46b3Blbm9mZmljZTpuYW1lczpleHBlcmltZW50YWw6b29vLW1zLWludGVyb3A6eG1sbnM6ZmllbGQ6MS4wXCIsXG5cdFx0XHQneG1sbnM6Zm9ybXgnOiAgICAgICAgXCJ1cm46b3Blbm9mZmljZTpuYW1lczpleHBlcmltZW50YWw6b294bWwtb2RmLWludGVyb3A6eG1sbnM6Zm9ybToxLjBcIixcblx0XHRcdCd4bWxuczpjc3MzdCc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtdGV4dC9cIixcblx0XHRcdCdvZmZpY2U6dmVyc2lvbic6ICAgICBcIjEuMlwiXG5cdFx0fSk7XG5cblx0XHR2YXIgZm9kcyA9IHd4dF9oZWxwZXIoe1xuXHRcdFx0J3htbG5zOmNvbmZpZyc6ICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpjb25maWc6MS4wXCIsXG5cdFx0XHQnb2ZmaWNlOm1pbWV0eXBlJzogXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0XCJcblx0XHR9KTtcblxuXHRcdGlmKG9wdHMuYm9va1R5cGUgPT0gXCJmb2RzXCIpIHtcblx0XHRcdG8ucHVzaCgnPG9mZmljZTpkb2N1bWVudCcgKyBhdHRyICsgZm9kcyArICc+XFxuJyk7XG5cdFx0XHRvLnB1c2god3JpdGVfbWV0YV9vZHMoKS5yZXBsYWNlKC9vZmZpY2U6ZG9jdW1lbnQtbWV0YS9nLCBcIm9mZmljZTptZXRhXCIpKTtcblx0XHRcdC8vIFRPRE86IHNldHRpbmdzIChlcXVpdiBvZiBzZXR0aW5ncy54bWwgZm9yIE9EUylcblx0XHR9IGVsc2Ugby5wdXNoKCc8b2ZmaWNlOmRvY3VtZW50LWNvbnRlbnQnICsgYXR0ciAgKyAnPlxcbicpO1xuXHRcdC8vIG8ucHVzaCgnICA8b2ZmaWNlOnNjcmlwdHMvPlxcbicpO1xuXHRcdHdyaXRlX2F1dG9tYXRpY19zdHlsZXNfb2RzKG8sIHdiKTtcblx0XHRvLnB1c2goJyAgPG9mZmljZTpib2R5PlxcbicpO1xuXHRcdG8ucHVzaCgnICAgIDxvZmZpY2U6c3ByZWFkc2hlZXQ+XFxuJyk7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSAhPSB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgKytpKSBvLnB1c2god3JpdGVfd3Mod2IuU2hlZXRzW3diLlNoZWV0TmFtZXNbaV1dLCB3YiwgaSwgb3B0cykpO1xuXHRcdG8ucHVzaCgnICAgIDwvb2ZmaWNlOnNwcmVhZHNoZWV0PlxcbicpO1xuXHRcdG8ucHVzaCgnICA8L29mZmljZTpib2R5PlxcbicpO1xuXHRcdGlmKG9wdHMuYm9va1R5cGUgPT0gXCJmb2RzXCIpIG8ucHVzaCgnPC9vZmZpY2U6ZG9jdW1lbnQ+Jyk7XG5cdFx0ZWxzZSBvLnB1c2goJzwvb2ZmaWNlOmRvY3VtZW50LWNvbnRlbnQ+Jyk7XG5cdFx0cmV0dXJuIG8uam9pbihcIlwiKTtcblx0fTtcbn0pKCk7XG5cbmZ1bmN0aW9uIHdyaXRlX29kcyh3Yi8qOmFueSovLCBvcHRzLyo6YW55Ki8pIHtcblx0aWYob3B0cy5ib29rVHlwZSA9PSBcImZvZHNcIikgcmV0dXJuIHdyaXRlX2NvbnRlbnRfb2RzKHdiLCBvcHRzKTtcblxuXHR2YXIgemlwID0gemlwX25ldygpO1xuXHR2YXIgZiA9IFwiXCI7XG5cblx0dmFyIG1hbmlmZXN0Lyo6QXJyYXk8QXJyYXk8c3RyaW5nPiA+Ki8gPSBbXTtcblx0dmFyIHJkZi8qOkFycmF5PFtzdHJpbmcsIHN0cmluZ10+Ki8gPSBbXTtcblxuXHQvKiBQYXJ0IDMgU2VjdGlvbiAzLjMgTUlNRSBNZWRpYSBUeXBlICovXG5cdGYgPSBcIm1pbWV0eXBlXCI7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldFwiKTtcblxuXHQvKiBQYXJ0IDEgU2VjdGlvbiAyLjIgRG9jdW1lbnRzICovXG5cdGYgPSBcImNvbnRlbnQueG1sXCI7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX2NvbnRlbnRfb2RzKHdiLCBvcHRzKSk7XG5cdG1hbmlmZXN0LnB1c2goW2YsIFwidGV4dC94bWxcIl0pO1xuXHRyZGYucHVzaChbZiwgXCJDb250ZW50RmlsZVwiXSk7XG5cblx0LyogVE9ETzogdGhlc2UgYXJlIGhhcmQtY29kZWQgc3R5bGVzIHRvIHNhdGlhdGUgZXhjZWwgKi9cblx0ZiA9IFwic3R5bGVzLnhtbFwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9zdHlsZXNfb2RzKHdiLCBvcHRzKSk7XG5cdG1hbmlmZXN0LnB1c2goW2YsIFwidGV4dC94bWxcIl0pO1xuXHRyZGYucHVzaChbZiwgXCJTdHlsZXNGaWxlXCJdKTtcblxuXHQvKiBUT0RPOiB0aGlzIGlzIGhhcmQtY29kZWQgdG8gc2F0aWF0ZSBleGNlbCAqL1xuXHRmID0gXCJtZXRhLnhtbFwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCBYTUxfSEVBREVSICsgd3JpdGVfbWV0YV9vZHMoLyo6OndiLCBvcHRzKi8pKTtcblx0bWFuaWZlc3QucHVzaChbZiwgXCJ0ZXh0L3htbFwiXSk7XG5cdHJkZi5wdXNoKFtmLCBcIk1ldGFkYXRhRmlsZVwiXSk7XG5cblx0LyogUGFydCAzIFNlY3Rpb24gNiBNZXRhZGF0YSBNYW5pZmVzdCBGaWxlICovXG5cdGYgPSBcIm1hbmlmZXN0LnJkZlwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9yZGYocmRmLyosIG9wdHMqLykpO1xuXHRtYW5pZmVzdC5wdXNoKFtmLCBcImFwcGxpY2F0aW9uL3JkZit4bWxcIl0pO1xuXG5cdC8qIFBhcnQgMyBTZWN0aW9uIDQgTWFuaWZlc3QgRmlsZSAqL1xuXHRmID0gXCJNRVRBLUlORi9tYW5pZmVzdC54bWxcIjtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfbWFuaWZlc3QobWFuaWZlc3QvKiwgb3B0cyovKSk7XG5cblx0cmV0dXJuIHppcDtcbn1cblxuLyohIHNoZWV0anMgKEMpIDIwMTMtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqL1xuZnVuY3Rpb24gdThfdG9fZGF0YXZpZXcoYXJyYXkpIHtcbiAgcmV0dXJuIG5ldyBEYXRhVmlldyhhcnJheS5idWZmZXIsIGFycmF5LmJ5dGVPZmZzZXQsIGFycmF5LmJ5dGVMZW5ndGgpO1xufVxuZnVuY3Rpb24gdThzdHIodTgpIHtcbiAgcmV0dXJuIHR5cGVvZiBUZXh0RGVjb2RlciAhPSBcInVuZGVmaW5lZFwiID8gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHU4KSA6IHV0ZjhyZWFkKGEycyh1OCkpO1xufVxuZnVuY3Rpb24gc3RydTgoc3RyKSB7XG4gIHJldHVybiB0eXBlb2YgVGV4dEVuY29kZXIgIT0gXCJ1bmRlZmluZWRcIiA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpIDogczJhKHV0Zjh3cml0ZShzdHIpKTtcbn1cbmZ1bmN0aW9uIHU4Y29udGFpbnMoYm9keSwgc2VhcmNoKSB7XG4gIG91dGVyOlxuICAgIGZvciAodmFyIEwgPSAwOyBMIDw9IGJvZHkubGVuZ3RoIC0gc2VhcmNoLmxlbmd0aDsgKytMKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNlYXJjaC5sZW5ndGg7ICsrailcbiAgICAgICAgaWYgKGJvZHlbTCArIGpdICE9IHNlYXJjaFtqXSlcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdThjb25jYXQodThhKSB7XG4gIHZhciBsZW4gPSB1OGEucmVkdWNlKGZ1bmN0aW9uKGFjYywgeCkge1xuICAgIHJldHVybiBhY2MgKyB4Lmxlbmd0aDtcbiAgfSwgMCk7XG4gIHZhciBvdXQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICB2YXIgb2ZmID0gMDtcbiAgdThhLmZvckVhY2goZnVuY3Rpb24odTgpIHtcbiAgICBvdXQuc2V0KHU4LCBvZmYpO1xuICAgIG9mZiArPSB1OC5sZW5ndGg7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gcG9wY250KHgpIHtcbiAgeCAtPSB4ID4+IDEgJiAxNDMxNjU1NzY1O1xuICB4ID0gKHggJiA4NTg5OTM0NTkpICsgKHggPj4gMiAmIDg1ODk5MzQ1OSk7XG4gIHJldHVybiAoeCArICh4ID4+IDQpICYgMjUyNjQ1MTM1KSAqIDE2ODQzMDA5ID4+PiAyNDtcbn1cbmZ1bmN0aW9uIHJlYWREZWNpbWFsMTI4TEUoYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGV4cCA9IChidWZbb2Zmc2V0ICsgMTVdICYgMTI3KSA8PCA3IHwgYnVmW29mZnNldCArIDE0XSA+PiAxO1xuICB2YXIgbWFudGlzc2EgPSBidWZbb2Zmc2V0ICsgMTRdICYgMTtcbiAgZm9yICh2YXIgaiA9IG9mZnNldCArIDEzOyBqID49IG9mZnNldDsgLS1qKVxuICAgIG1hbnRpc3NhID0gbWFudGlzc2EgKiAyNTYgKyBidWZbal07XG4gIHJldHVybiAoYnVmW29mZnNldCArIDE1XSAmIDEyOCA/IC1tYW50aXNzYSA6IG1hbnRpc3NhKSAqIE1hdGgucG93KDEwLCBleHAgLSA2MTc2KTtcbn1cbmZ1bmN0aW9uIHdyaXRlRGVjaW1hbDEyOExFKGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkge1xuICB2YXIgZXhwID0gTWF0aC5mbG9vcih2YWx1ZSA9PSAwID8gMCA6IE1hdGguTE9HMTBFICogTWF0aC5sb2coTWF0aC5hYnModmFsdWUpKSkgKyA2MTc2IC0gMjA7XG4gIHZhciBtYW50aXNzYSA9IHZhbHVlIC8gTWF0aC5wb3coMTAsIGV4cCAtIDYxNzYpO1xuICBidWZbb2Zmc2V0ICsgMTVdIHw9IGV4cCA+PiA3O1xuICBidWZbb2Zmc2V0ICsgMTRdIHw9IChleHAgJiAxMjcpIDw8IDE7XG4gIGZvciAodmFyIGkgPSAwOyBtYW50aXNzYSA+PSAxOyArK2ksIG1hbnRpc3NhIC89IDI1NilcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBtYW50aXNzYSAmIDI1NTtcbiAgYnVmW29mZnNldCArIDE1XSB8PSB2YWx1ZSA+PSAwID8gMCA6IDEyODtcbn1cbmZ1bmN0aW9uIHBhcnNlX3ZhcmludDQ5KGJ1ZiwgcHRyKSB7XG4gIHZhciBsID0gcHRyID8gcHRyWzBdIDogMDtcbiAgdmFyIHVzeiA9IGJ1ZltsXSAmIDEyNztcbiAgdmFyaW50OlxuICAgIGlmIChidWZbbCsrXSA+PSAxMjgpIHtcbiAgICAgIHVzeiB8PSAoYnVmW2xdICYgMTI3KSA8PCA3O1xuICAgICAgaWYgKGJ1ZltsKytdIDwgMTI4KVxuICAgICAgICBicmVhayB2YXJpbnQ7XG4gICAgICB1c3ogfD0gKGJ1ZltsXSAmIDEyNykgPDwgMTQ7XG4gICAgICBpZiAoYnVmW2wrK10gPCAxMjgpXG4gICAgICAgIGJyZWFrIHZhcmludDtcbiAgICAgIHVzeiB8PSAoYnVmW2xdICYgMTI3KSA8PCAyMTtcbiAgICAgIGlmIChidWZbbCsrXSA8IDEyOClcbiAgICAgICAgYnJlYWsgdmFyaW50O1xuICAgICAgdXN6ICs9IChidWZbbF0gJiAxMjcpICogTWF0aC5wb3coMiwgMjgpO1xuICAgICAgKytsO1xuICAgICAgaWYgKGJ1ZltsKytdIDwgMTI4KVxuICAgICAgICBicmVhayB2YXJpbnQ7XG4gICAgICB1c3ogKz0gKGJ1ZltsXSAmIDEyNykgKiBNYXRoLnBvdygyLCAzNSk7XG4gICAgICArK2w7XG4gICAgICBpZiAoYnVmW2wrK10gPCAxMjgpXG4gICAgICAgIGJyZWFrIHZhcmludDtcbiAgICAgIHVzeiArPSAoYnVmW2xdICYgMTI3KSAqIE1hdGgucG93KDIsIDQyKTtcbiAgICAgICsrbDtcbiAgICAgIGlmIChidWZbbCsrXSA8IDEyOClcbiAgICAgICAgYnJlYWsgdmFyaW50O1xuICAgIH1cbiAgaWYgKHB0cilcbiAgICBwdHJbMF0gPSBsO1xuICByZXR1cm4gdXN6O1xufVxuZnVuY3Rpb24gd3JpdGVfdmFyaW50NDkodikge1xuICB2YXIgdXN6ID0gbmV3IFVpbnQ4QXJyYXkoNyk7XG4gIHVzelswXSA9IHYgJiAxMjc7XG4gIHZhciBMID0gMTtcbiAgc3o6XG4gICAgaWYgKHYgPiAxMjcpIHtcbiAgICAgIHVzeltMIC0gMV0gfD0gMTI4O1xuICAgICAgdXN6W0xdID0gdiA+PiA3ICYgMTI3O1xuICAgICAgKytMO1xuICAgICAgaWYgKHYgPD0gMTYzODMpXG4gICAgICAgIGJyZWFrIHN6O1xuICAgICAgdXN6W0wgLSAxXSB8PSAxMjg7XG4gICAgICB1c3pbTF0gPSB2ID4+IDE0ICYgMTI3O1xuICAgICAgKytMO1xuICAgICAgaWYgKHYgPD0gMjA5NzE1MSlcbiAgICAgICAgYnJlYWsgc3o7XG4gICAgICB1c3pbTCAtIDFdIHw9IDEyODtcbiAgICAgIHVzeltMXSA9IHYgPj4gMjEgJiAxMjc7XG4gICAgICArK0w7XG4gICAgICBpZiAodiA8PSAyNjg0MzU0NTUpXG4gICAgICAgIGJyZWFrIHN6O1xuICAgICAgdXN6W0wgLSAxXSB8PSAxMjg7XG4gICAgICB1c3pbTF0gPSB2IC8gMjU2ID4+PiAyMSAmIDEyNztcbiAgICAgICsrTDtcbiAgICAgIGlmICh2IDw9IDM0MzU5NzM4MzY3KVxuICAgICAgICBicmVhayBzejtcbiAgICAgIHVzeltMIC0gMV0gfD0gMTI4O1xuICAgICAgdXN6W0xdID0gdiAvIDY1NTM2ID4+PiAyMSAmIDEyNztcbiAgICAgICsrTDtcbiAgICAgIGlmICh2IDw9IDQzOTgwNDY1MTExMDMpXG4gICAgICAgIGJyZWFrIHN6O1xuICAgICAgdXN6W0wgLSAxXSB8PSAxMjg7XG4gICAgICB1c3pbTF0gPSB2IC8gMTY3NzcyMTYgPj4+IDIxICYgMTI3O1xuICAgICAgKytMO1xuICAgIH1cbiAgcmV0dXJuIHVzei5zbGljZSgwLCBMKTtcbn1cbmZ1bmN0aW9uIHZhcmludF90b19pMzIoYnVmKSB7XG4gIHZhciBsID0gMCwgaTMyID0gYnVmW2xdICYgMTI3O1xuICB2YXJpbnQ6XG4gICAgaWYgKGJ1ZltsKytdID49IDEyOCkge1xuICAgICAgaTMyIHw9IChidWZbbF0gJiAxMjcpIDw8IDc7XG4gICAgICBpZiAoYnVmW2wrK10gPCAxMjgpXG4gICAgICAgIGJyZWFrIHZhcmludDtcbiAgICAgIGkzMiB8PSAoYnVmW2xdICYgMTI3KSA8PCAxNDtcbiAgICAgIGlmIChidWZbbCsrXSA8IDEyOClcbiAgICAgICAgYnJlYWsgdmFyaW50O1xuICAgICAgaTMyIHw9IChidWZbbF0gJiAxMjcpIDw8IDIxO1xuICAgICAgaWYgKGJ1ZltsKytdIDwgMTI4KVxuICAgICAgICBicmVhayB2YXJpbnQ7XG4gICAgICBpMzIgfD0gKGJ1ZltsXSAmIDEyNykgPDwgMjg7XG4gICAgfVxuICByZXR1cm4gaTMyO1xufVxuZnVuY3Rpb24gcGFyc2Vfc2hhbGxvdyhidWYpIHtcbiAgdmFyIG91dCA9IFtdLCBwdHIgPSBbMF07XG4gIHdoaWxlIChwdHJbMF0gPCBidWYubGVuZ3RoKSB7XG4gICAgdmFyIG9mZiA9IHB0clswXTtcbiAgICB2YXIgbnVtID0gcGFyc2VfdmFyaW50NDkoYnVmLCBwdHIpO1xuICAgIHZhciB0eXBlID0gbnVtICYgNztcbiAgICBudW0gPSBNYXRoLmZsb29yKG51bSAvIDgpO1xuICAgIHZhciBsZW4gPSAwO1xuICAgIHZhciByZXM7XG4gICAgaWYgKG51bSA9PSAwKVxuICAgICAgYnJlYWs7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbCA9IHB0clswXTtcbiAgICAgICAgICB3aGlsZSAoYnVmW3B0clswXSsrXSA+PSAxMjgpXG4gICAgICAgICAgICA7XG4gICAgICAgICAgcmVzID0gYnVmLnNsaWNlKGwsIHB0clswXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIGxlbiA9IDQ7XG4gICAgICAgIHJlcyA9IGJ1Zi5zbGljZShwdHJbMF0sIHB0clswXSArIGxlbik7XG4gICAgICAgIHB0clswXSArPSBsZW47XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBsZW4gPSA4O1xuICAgICAgICByZXMgPSBidWYuc2xpY2UocHRyWzBdLCBwdHJbMF0gKyBsZW4pO1xuICAgICAgICBwdHJbMF0gKz0gbGVuO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgbGVuID0gcGFyc2VfdmFyaW50NDkoYnVmLCBwdHIpO1xuICAgICAgICByZXMgPSBidWYuc2xpY2UocHRyWzBdLCBwdHJbMF0gKyBsZW4pO1xuICAgICAgICBwdHJbMF0gKz0gbGVuO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgIGNhc2UgNDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBCIFR5cGUgXCIuY29uY2F0KHR5cGUsIFwiIGZvciBGaWVsZCBcIikuY29uY2F0KG51bSwgXCIgYXQgb2Zmc2V0IFwiKS5jb25jYXQob2ZmKSk7XG4gICAgfVxuICAgIHZhciB2ID0geyBkYXRhOiByZXMsIHR5cGU6IHR5cGUgfTtcbiAgICBpZiAob3V0W251bV0gPT0gbnVsbClcbiAgICAgIG91dFtudW1dID0gW3ZdO1xuICAgIGVsc2VcbiAgICAgIG91dFtudW1dLnB1c2godik7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHdyaXRlX3NoYWxsb3cocHJvdG8pIHtcbiAgdmFyIG91dCA9IFtdO1xuICBwcm90by5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkLCBpZHgpIHtcbiAgICBmaWVsZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGlmICghaXRlbS5kYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgICBvdXQucHVzaCh3cml0ZV92YXJpbnQ0OShpZHggKiA4ICsgaXRlbS50eXBlKSk7XG4gICAgICBpZiAoaXRlbS50eXBlID09IDIpXG4gICAgICAgIG91dC5wdXNoKHdyaXRlX3ZhcmludDQ5KGl0ZW0uZGF0YS5sZW5ndGgpKTtcbiAgICAgIG91dC5wdXNoKGl0ZW0uZGF0YSk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdThjb25jYXQob3V0KTtcbn1cbmZ1bmN0aW9uIG1hcHBhKGRhdGEsIGNiKSB7XG4gIHJldHVybiAoZGF0YSA9PSBudWxsID8gdm9pZCAwIDogZGF0YS5tYXAoZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBjYihkLmRhdGEpO1xuICB9KSkgfHwgW107XG59XG5mdW5jdGlvbiBwYXJzZV9pd2FfZmlsZShidWYpIHtcbiAgdmFyIF9hO1xuICB2YXIgb3V0ID0gW10sIHB0ciA9IFswXTtcbiAgd2hpbGUgKHB0clswXSA8IGJ1Zi5sZW5ndGgpIHtcbiAgICB2YXIgbGVuID0gcGFyc2VfdmFyaW50NDkoYnVmLCBwdHIpO1xuICAgIHZhciBhaSA9IHBhcnNlX3NoYWxsb3coYnVmLnNsaWNlKHB0clswXSwgcHRyWzBdICsgbGVuKSk7XG4gICAgcHRyWzBdICs9IGxlbjtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgaWQ6IHZhcmludF90b19pMzIoYWlbMV1bMF0uZGF0YSksXG4gICAgICBtZXNzYWdlczogW11cbiAgICB9O1xuICAgIGFpWzJdLmZvckVhY2goZnVuY3Rpb24oYikge1xuICAgICAgdmFyIG1pID0gcGFyc2Vfc2hhbGxvdyhiLmRhdGEpO1xuICAgICAgdmFyIGZsID0gdmFyaW50X3RvX2kzMihtaVszXVswXS5kYXRhKTtcbiAgICAgIHJlcy5tZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgbWV0YTogbWksXG4gICAgICAgIGRhdGE6IGJ1Zi5zbGljZShwdHJbMF0sIHB0clswXSArIGZsKVxuICAgICAgfSk7XG4gICAgICBwdHJbMF0gKz0gZmw7XG4gICAgfSk7XG4gICAgaWYgKChfYSA9IGFpWzNdKSA9PSBudWxsID8gdm9pZCAwIDogX2FbMF0pXG4gICAgICByZXMubWVyZ2UgPSB2YXJpbnRfdG9faTMyKGFpWzNdWzBdLmRhdGEpID4+PiAwID4gMDtcbiAgICBvdXQucHVzaChyZXMpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9pd2FfZmlsZShpYXMpIHtcbiAgdmFyIGJ1ZnMgPSBbXTtcbiAgaWFzLmZvckVhY2goZnVuY3Rpb24oaWEpIHtcbiAgICB2YXIgYWkgPSBbXTtcbiAgICBhaVsxXSA9IFt7IGRhdGE6IHdyaXRlX3ZhcmludDQ5KGlhLmlkKSwgdHlwZTogMCB9XTtcbiAgICBhaVsyXSA9IFtdO1xuICAgIGlmIChpYS5tZXJnZSAhPSBudWxsKVxuICAgICAgYWlbM10gPSBbeyBkYXRhOiB3cml0ZV92YXJpbnQ0OSgrISFpYS5tZXJnZSksIHR5cGU6IDAgfV07XG4gICAgdmFyIG1pZGF0YSA9IFtdO1xuICAgIGlhLm1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24obWkpIHtcbiAgICAgIG1pZGF0YS5wdXNoKG1pLmRhdGEpO1xuICAgICAgbWkubWV0YVszXSA9IFt7IHR5cGU6IDAsIGRhdGE6IHdyaXRlX3ZhcmludDQ5KG1pLmRhdGEubGVuZ3RoKSB9XTtcbiAgICAgIGFpWzJdLnB1c2goeyBkYXRhOiB3cml0ZV9zaGFsbG93KG1pLm1ldGEpLCB0eXBlOiAyIH0pO1xuICAgIH0pO1xuICAgIHZhciBhaXBheWxvYWQgPSB3cml0ZV9zaGFsbG93KGFpKTtcbiAgICBidWZzLnB1c2god3JpdGVfdmFyaW50NDkoYWlwYXlsb2FkLmxlbmd0aCkpO1xuICAgIGJ1ZnMucHVzaChhaXBheWxvYWQpO1xuICAgIG1pZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG1pZCkge1xuICAgICAgcmV0dXJuIGJ1ZnMucHVzaChtaWQpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHU4Y29uY2F0KGJ1ZnMpO1xufVxuZnVuY3Rpb24gcGFyc2Vfc25hcHB5X2NodW5rKHR5cGUsIGJ1Zikge1xuICBpZiAodHlwZSAhPSAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgU25hcHB5IGNodW5rIHR5cGUgXCIuY29uY2F0KHR5cGUpKTtcbiAgdmFyIHB0ciA9IFswXTtcbiAgdmFyIHVzeiA9IHBhcnNlX3ZhcmludDQ5KGJ1ZiwgcHRyKTtcbiAgdmFyIGNodW5rcyA9IFtdO1xuICB3aGlsZSAocHRyWzBdIDwgYnVmLmxlbmd0aCkge1xuICAgIHZhciB0YWcgPSBidWZbcHRyWzBdXSAmIDM7XG4gICAgaWYgKHRhZyA9PSAwKSB7XG4gICAgICB2YXIgbGVuID0gYnVmW3B0clswXSsrXSA+PiAyO1xuICAgICAgaWYgKGxlbiA8IDYwKVxuICAgICAgICArK2xlbjtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgYyA9IGxlbiAtIDU5O1xuICAgICAgICBsZW4gPSBidWZbcHRyWzBdXTtcbiAgICAgICAgaWYgKGMgPiAxKVxuICAgICAgICAgIGxlbiB8PSBidWZbcHRyWzBdICsgMV0gPDwgODtcbiAgICAgICAgaWYgKGMgPiAyKVxuICAgICAgICAgIGxlbiB8PSBidWZbcHRyWzBdICsgMl0gPDwgMTY7XG4gICAgICAgIGlmIChjID4gMylcbiAgICAgICAgICBsZW4gfD0gYnVmW3B0clswXSArIDNdIDw8IDI0O1xuICAgICAgICBsZW4gPj4+PSAwO1xuICAgICAgICBsZW4rKztcbiAgICAgICAgcHRyWzBdICs9IGM7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaChidWYuc2xpY2UocHRyWzBdLCBwdHJbMF0gKyBsZW4pKTtcbiAgICAgIHB0clswXSArPSBsZW47XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9mZnNldCA9IDAsIGxlbmd0aCA9IDA7XG4gICAgICBpZiAodGFnID09IDEpIHtcbiAgICAgICAgbGVuZ3RoID0gKGJ1ZltwdHJbMF1dID4+IDIgJiA3KSArIDQ7XG4gICAgICAgIG9mZnNldCA9IChidWZbcHRyWzBdKytdICYgMjI0KSA8PCAzO1xuICAgICAgICBvZmZzZXQgfD0gYnVmW3B0clswXSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbmd0aCA9IChidWZbcHRyWzBdKytdID4+IDIpICsgMTtcbiAgICAgICAgaWYgKHRhZyA9PSAyKSB7XG4gICAgICAgICAgb2Zmc2V0ID0gYnVmW3B0clswXV0gfCBidWZbcHRyWzBdICsgMV0gPDwgODtcbiAgICAgICAgICBwdHJbMF0gKz0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgPSAoYnVmW3B0clswXV0gfCBidWZbcHRyWzBdICsgMV0gPDwgOCB8IGJ1ZltwdHJbMF0gKyAyXSA8PCAxNiB8IGJ1ZltwdHJbMF0gKyAzXSA8PCAyNCkgPj4+IDA7XG4gICAgICAgICAgcHRyWzBdICs9IDQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNodW5rcyA9IFt1OGNvbmNhdChjaHVua3MpXTtcbiAgICAgIGlmIChvZmZzZXQgPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvZmZzZXQgMFwiKTtcbiAgICAgIGlmIChvZmZzZXQgPiBjaHVua3NbMF0ubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9mZnNldCBiZXlvbmQgbGVuZ3RoXCIpO1xuICAgICAgaWYgKGxlbmd0aCA+PSBvZmZzZXQpIHtcbiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmtzWzBdLnNsaWNlKC1vZmZzZXQpKTtcbiAgICAgICAgbGVuZ3RoIC09IG9mZnNldDtcbiAgICAgICAgd2hpbGUgKGxlbmd0aCA+PSBjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdLmxlbmd0aCkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgIGxlbmd0aCAtPSBjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2goY2h1bmtzWzBdLnNsaWNlKC1vZmZzZXQsIC1vZmZzZXQgKyBsZW5ndGgpKTtcbiAgICB9XG4gIH1cbiAgdmFyIG8gPSB1OGNvbmNhdChjaHVua3MpO1xuICBpZiAoby5sZW5ndGggIT0gdXN6KVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgbGVuZ3RoOiBcIi5jb25jYXQoby5sZW5ndGgsIFwiICE9IFwiKS5jb25jYXQodXN6KSk7XG4gIHJldHVybiBvO1xufVxuZnVuY3Rpb24gZGVjb21wcmVzc19pd2FfZmlsZShidWYpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgbCA9IDA7XG4gIHdoaWxlIChsIDwgYnVmLmxlbmd0aCkge1xuICAgIHZhciB0ID0gYnVmW2wrK107XG4gICAgdmFyIGxlbiA9IGJ1ZltsXSB8IGJ1ZltsICsgMV0gPDwgOCB8IGJ1ZltsICsgMl0gPDwgMTY7XG4gICAgbCArPSAzO1xuICAgIG91dC5wdXNoKHBhcnNlX3NuYXBweV9jaHVuayh0LCBidWYuc2xpY2UobCwgbCArIGxlbikpKTtcbiAgICBsICs9IGxlbjtcbiAgfVxuICBpZiAobCAhPT0gYnVmLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJkYXRhIGlzIG5vdCBhIHZhbGlkIGZyYW1lZCBzdHJlYW0hXCIpO1xuICByZXR1cm4gdThjb25jYXQob3V0KTtcbn1cbmZ1bmN0aW9uIGNvbXByZXNzX2l3YV9maWxlKGJ1Zikge1xuICB2YXIgb3V0ID0gW107XG4gIHZhciBsID0gMDtcbiAgd2hpbGUgKGwgPCBidWYubGVuZ3RoKSB7XG4gICAgdmFyIGMgPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gbCwgMjY4NDM1NDU1KTtcbiAgICB2YXIgZnJhbWUgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICBvdXQucHVzaChmcmFtZSk7XG4gICAgdmFyIHVzeiA9IHdyaXRlX3ZhcmludDQ5KGMpO1xuICAgIHZhciBMID0gdXN6Lmxlbmd0aDtcbiAgICBvdXQucHVzaCh1c3opO1xuICAgIGlmIChjIDw9IDYwKSB7XG4gICAgICBMKys7XG4gICAgICBvdXQucHVzaChuZXcgVWludDhBcnJheShbYyAtIDEgPDwgMl0pKTtcbiAgICB9IGVsc2UgaWYgKGMgPD0gMjU2KSB7XG4gICAgICBMICs9IDI7XG4gICAgICBvdXQucHVzaChuZXcgVWludDhBcnJheShbMjQwLCBjIC0gMSAmIDI1NV0pKTtcbiAgICB9IGVsc2UgaWYgKGMgPD0gNjU1MzYpIHtcbiAgICAgIEwgKz0gMztcbiAgICAgIG91dC5wdXNoKG5ldyBVaW50OEFycmF5KFsyNDQsIGMgLSAxICYgMjU1LCBjIC0gMSA+PiA4ICYgMjU1XSkpO1xuICAgIH0gZWxzZSBpZiAoYyA8PSAxNjc3NzIxNikge1xuICAgICAgTCArPSA0O1xuICAgICAgb3V0LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzI0OCwgYyAtIDEgJiAyNTUsIGMgLSAxID4+IDggJiAyNTUsIGMgLSAxID4+IDE2ICYgMjU1XSkpO1xuICAgIH0gZWxzZSBpZiAoYyA8PSA0Mjk0OTY3Mjk2KSB7XG4gICAgICBMICs9IDU7XG4gICAgICBvdXQucHVzaChuZXcgVWludDhBcnJheShbMjUyLCBjIC0gMSAmIDI1NSwgYyAtIDEgPj4gOCAmIDI1NSwgYyAtIDEgPj4gMTYgJiAyNTUsIGMgLSAxID4+PiAyNCAmIDI1NV0pKTtcbiAgICB9XG4gICAgb3V0LnB1c2goYnVmLnNsaWNlKGwsIGwgKyBjKSk7XG4gICAgTCArPSBjO1xuICAgIGZyYW1lWzBdID0gMDtcbiAgICBmcmFtZVsxXSA9IEwgJiAyNTU7XG4gICAgZnJhbWVbMl0gPSBMID4+IDggJiAyNTU7XG4gICAgZnJhbWVbM10gPSBMID4+IDE2ICYgMjU1O1xuICAgIGwgKz0gYztcbiAgfVxuICByZXR1cm4gdThjb25jYXQob3V0KTtcbn1cbmZ1bmN0aW9uIHBhcnNlX29sZF9zdG9yYWdlKGJ1Ziwgc3N0LCByc3N0LCB2KSB7XG4gIHZhciBkdiA9IHU4X3RvX2RhdGF2aWV3KGJ1Zik7XG4gIHZhciBmbGFncyA9IGR2LmdldFVpbnQzMig0LCB0cnVlKTtcbiAgdmFyIGRhdGFfb2Zmc2V0ID0gKHYgPiAxID8gMTIgOiA4KSArIHBvcGNudChmbGFncyAmICh2ID4gMSA/IDM0NzAgOiAzOTgpKSAqIDQ7XG4gIHZhciByaWR4ID0gLTEsIHNpZHggPSAtMSwgaWVlZSA9IE5hTiwgZHQgPSBuZXcgRGF0ZSgyMDAxLCAwLCAxKTtcbiAgaWYgKGZsYWdzICYgNTEyKSB7XG4gICAgcmlkeCA9IGR2LmdldFVpbnQzMihkYXRhX29mZnNldCwgdHJ1ZSk7XG4gICAgZGF0YV9vZmZzZXQgKz0gNDtcbiAgfVxuICBkYXRhX29mZnNldCArPSBwb3BjbnQoZmxhZ3MgJiAodiA+IDEgPyAxMjI4OCA6IDQwOTYpKSAqIDQ7XG4gIGlmIChmbGFncyAmIDE2KSB7XG4gICAgc2lkeCA9IGR2LmdldFVpbnQzMihkYXRhX29mZnNldCwgdHJ1ZSk7XG4gICAgZGF0YV9vZmZzZXQgKz0gNDtcbiAgfVxuICBpZiAoZmxhZ3MgJiAzMikge1xuICAgIGllZWUgPSBkdi5nZXRGbG9hdDY0KGRhdGFfb2Zmc2V0LCB0cnVlKTtcbiAgICBkYXRhX29mZnNldCArPSA4O1xuICB9XG4gIGlmIChmbGFncyAmIDY0KSB7XG4gICAgZHQuc2V0VGltZShkdC5nZXRUaW1lKCkgKyBkdi5nZXRGbG9hdDY0KGRhdGFfb2Zmc2V0LCB0cnVlKSAqIDFlMyk7XG4gICAgZGF0YV9vZmZzZXQgKz0gODtcbiAgfVxuICB2YXIgcmV0O1xuICBzd2l0Y2ggKGJ1ZlsyXSkge1xuICAgIGNhc2UgMDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldCA9IHsgdDogXCJuXCIsIHY6IGllZWUgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldCA9IHsgdDogXCJzXCIsIHY6IHNzdFtzaWR4XSB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0ID0geyB0OiBcImRcIiwgdjogZHQgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldCA9IHsgdDogXCJiXCIsIHY6IGllZWUgPiAwIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6XG4gICAgICByZXQgPSB7IHQ6IFwiblwiLCB2OiBpZWVlIC8gODY0MDAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHJldCA9IHsgdDogXCJlXCIsIHY6IDAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIHtcbiAgICAgICAgaWYgKHJpZHggPiAtMSlcbiAgICAgICAgICByZXQgPSB7IHQ6IFwic1wiLCB2OiByc3N0W3JpZHhdIH07XG4gICAgICAgIGVsc2UgaWYgKHNpZHggPiAtMSlcbiAgICAgICAgICByZXQgPSB7IHQ6IFwic1wiLCB2OiBzc3Rbc2lkeF0gfTtcbiAgICAgICAgZWxzZSBpZiAoIWlzTmFOKGllZWUpKVxuICAgICAgICAgIHJldCA9IHsgdDogXCJuXCIsIHY6IGllZWUgfTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGNlbGwgdHlwZSBcIi5jb25jYXQoYnVmLnNsaWNlKDAsIDQpKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgY2VsbCB0eXBlIFwiLmNvbmNhdChidWYuc2xpY2UoMCwgNCkpKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gcGFyc2VfbmV3X3N0b3JhZ2UoYnVmLCBzc3QsIHJzc3QpIHtcbiAgdmFyIGR2ID0gdThfdG9fZGF0YXZpZXcoYnVmKTtcbiAgdmFyIGZsYWdzID0gZHYuZ2V0VWludDMyKDgsIHRydWUpO1xuICB2YXIgZGF0YV9vZmZzZXQgPSAxMjtcbiAgdmFyIHJpZHggPSAtMSwgc2lkeCA9IC0xLCBkMTI4ID0gTmFOLCBpZWVlID0gTmFOLCBkdCA9IG5ldyBEYXRlKDIwMDEsIDAsIDEpO1xuICBpZiAoZmxhZ3MgJiAxKSB7XG4gICAgZDEyOCA9IHJlYWREZWNpbWFsMTI4TEUoYnVmLCBkYXRhX29mZnNldCk7XG4gICAgZGF0YV9vZmZzZXQgKz0gMTY7XG4gIH1cbiAgaWYgKGZsYWdzICYgMikge1xuICAgIGllZWUgPSBkdi5nZXRGbG9hdDY0KGRhdGFfb2Zmc2V0LCB0cnVlKTtcbiAgICBkYXRhX29mZnNldCArPSA4O1xuICB9XG4gIGlmIChmbGFncyAmIDQpIHtcbiAgICBkdC5zZXRUaW1lKGR0LmdldFRpbWUoKSArIGR2LmdldEZsb2F0NjQoZGF0YV9vZmZzZXQsIHRydWUpICogMWUzKTtcbiAgICBkYXRhX29mZnNldCArPSA4O1xuICB9XG4gIGlmIChmbGFncyAmIDgpIHtcbiAgICBzaWR4ID0gZHYuZ2V0VWludDMyKGRhdGFfb2Zmc2V0LCB0cnVlKTtcbiAgICBkYXRhX29mZnNldCArPSA0O1xuICB9XG4gIGlmIChmbGFncyAmIDE2KSB7XG4gICAgcmlkeCA9IGR2LmdldFVpbnQzMihkYXRhX29mZnNldCwgdHJ1ZSk7XG4gICAgZGF0YV9vZmZzZXQgKz0gNDtcbiAgfVxuICB2YXIgcmV0O1xuICBzd2l0Y2ggKGJ1ZlsxXSkge1xuICAgIGNhc2UgMDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldCA9IHsgdDogXCJuXCIsIHY6IGQxMjggfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldCA9IHsgdDogXCJzXCIsIHY6IHNzdFtzaWR4XSB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0ID0geyB0OiBcImRcIiwgdjogZHQgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldCA9IHsgdDogXCJiXCIsIHY6IGllZWUgPiAwIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6XG4gICAgICByZXQgPSB7IHQ6IFwiblwiLCB2OiBpZWVlIC8gODY0MDAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHJldCA9IHsgdDogXCJlXCIsIHY6IDAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIHtcbiAgICAgICAgaWYgKHJpZHggPiAtMSlcbiAgICAgICAgICByZXQgPSB7IHQ6IFwic1wiLCB2OiByc3N0W3JpZHhdIH07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBjZWxsIHR5cGUgXCIuY29uY2F0KGJ1ZlsxXSwgXCIgOiBcIikuY29uY2F0KGZsYWdzICYgMzEsIFwiIDogXCIpLmNvbmNhdChidWYuc2xpY2UoMCwgNCkpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6XG4gICAgICByZXQgPSB7IHQ6IFwiblwiLCB2OiBkMTI4IH07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgY2VsbCB0eXBlIFwiLmNvbmNhdChidWZbMV0sIFwiIDogXCIpLmNvbmNhdChmbGFncyAmIDMxLCBcIiA6IFwiKS5jb25jYXQoYnVmLnNsaWNlKDAsIDQpKSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIHdyaXRlX25ld19zdG9yYWdlKGNlbGwsIHNzdCkge1xuICB2YXIgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMzIpLCBkdiA9IHU4X3RvX2RhdGF2aWV3KG91dCksIGwgPSAxMiwgZmxhZ3MgPSAwO1xuICBvdXRbMF0gPSA1O1xuICBzd2l0Y2ggKGNlbGwudCkge1xuICAgIGNhc2UgXCJuXCI6XG4gICAgICBvdXRbMV0gPSAyO1xuICAgICAgd3JpdGVEZWNpbWFsMTI4TEUob3V0LCBsLCBjZWxsLnYpO1xuICAgICAgZmxhZ3MgfD0gMTtcbiAgICAgIGwgKz0gMTY7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYlwiOlxuICAgICAgb3V0WzFdID0gNjtcbiAgICAgIGR2LnNldEZsb2F0NjQobCwgY2VsbC52ID8gMSA6IDAsIHRydWUpO1xuICAgICAgZmxhZ3MgfD0gMjtcbiAgICAgIGwgKz0gODtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJzXCI6XG4gICAgICBpZiAoc3N0LmluZGV4T2YoY2VsbC52KSA9PSAtMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVmFsdWUgXCIuY29uY2F0KGNlbGwudiwgXCIgbWlzc2luZyBmcm9tIFNTVCFcIikpO1xuICAgICAgb3V0WzFdID0gMztcbiAgICAgIGR2LnNldFVpbnQzMihsLCBzc3QuaW5kZXhPZihjZWxsLnYpLCB0cnVlKTtcbiAgICAgIGZsYWdzIHw9IDg7XG4gICAgICBsICs9IDQ7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgXCJ1bnN1cHBvcnRlZCBjZWxsIHR5cGUgXCIgKyBjZWxsLnQ7XG4gIH1cbiAgZHYuc2V0VWludDMyKDgsIGZsYWdzLCB0cnVlKTtcbiAgcmV0dXJuIG91dC5zbGljZSgwLCBsKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX29sZF9zdG9yYWdlKGNlbGwsIHNzdCkge1xuICB2YXIgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMzIpLCBkdiA9IHU4X3RvX2RhdGF2aWV3KG91dCksIGwgPSAxMiwgZmxhZ3MgPSAwO1xuICBvdXRbMF0gPSAzO1xuICBzd2l0Y2ggKGNlbGwudCkge1xuICAgIGNhc2UgXCJuXCI6XG4gICAgICBvdXRbMl0gPSAyO1xuICAgICAgZHYuc2V0RmxvYXQ2NChsLCBjZWxsLnYsIHRydWUpO1xuICAgICAgZmxhZ3MgfD0gMzI7XG4gICAgICBsICs9IDg7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYlwiOlxuICAgICAgb3V0WzJdID0gNjtcbiAgICAgIGR2LnNldEZsb2F0NjQobCwgY2VsbC52ID8gMSA6IDAsIHRydWUpO1xuICAgICAgZmxhZ3MgfD0gMzI7XG4gICAgICBsICs9IDg7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic1wiOlxuICAgICAgaWYgKHNzdC5pbmRleE9mKGNlbGwudikgPT0gLTEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZhbHVlIFwiLmNvbmNhdChjZWxsLnYsIFwiIG1pc3NpbmcgZnJvbSBTU1QhXCIpKTtcbiAgICAgIG91dFsyXSA9IDM7XG4gICAgICBkdi5zZXRVaW50MzIobCwgc3N0LmluZGV4T2YoY2VsbC52KSwgdHJ1ZSk7XG4gICAgICBmbGFncyB8PSAxNjtcbiAgICAgIGwgKz0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBcInVuc3VwcG9ydGVkIGNlbGwgdHlwZSBcIiArIGNlbGwudDtcbiAgfVxuICBkdi5zZXRVaW50MzIoNCwgZmxhZ3MsIHRydWUpO1xuICByZXR1cm4gb3V0LnNsaWNlKDAsIGwpO1xufVxuZnVuY3Rpb24gcGFyc2VfY2VsbF9zdG9yYWdlKGJ1Ziwgc3N0LCByc3N0KSB7XG4gIHN3aXRjaCAoYnVmWzBdKSB7XG4gICAgY2FzZSAwOlxuICAgIGNhc2UgMTpcbiAgICBjYXNlIDI6XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHBhcnNlX29sZF9zdG9yYWdlKGJ1Ziwgc3N0LCByc3N0LCBidWZbMF0pO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBwYXJzZV9uZXdfc3RvcmFnZShidWYsIHNzdCwgcnNzdCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHBheWxvYWQgdmVyc2lvbiBcIi5jb25jYXQoYnVmWzBdKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcnNlX1RTUF9SZWZlcmVuY2UoYnVmKSB7XG4gIHZhciBwYiA9IHBhcnNlX3NoYWxsb3coYnVmKTtcbiAgcmV0dXJuIHBhcnNlX3ZhcmludDQ5KHBiWzFdWzBdLmRhdGEpO1xufVxuZnVuY3Rpb24gd3JpdGVfVFNQX1JlZmVyZW5jZShpZHgpIHtcbiAgdmFyIG91dCA9IFtdO1xuICBvdXRbMV0gPSBbeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OShpZHgpIH1dO1xuICByZXR1cm4gd3JpdGVfc2hhbGxvdyhvdXQpO1xufVxuZnVuY3Rpb24gcGFyc2VfVFNUX1RhYmxlRGF0YUxpc3QoTSwgcm9vdCkge1xuICB2YXIgcGIgPSBwYXJzZV9zaGFsbG93KHJvb3QuZGF0YSk7XG4gIHZhciB0eXBlID0gdmFyaW50X3RvX2kzMihwYlsxXVswXS5kYXRhKTtcbiAgdmFyIGVudHJpZXMgPSBwYlszXTtcbiAgdmFyIGRhdGEgPSBbXTtcbiAgKGVudHJpZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24oZW50cnkpIHtcbiAgICB2YXIgbGUgPSBwYXJzZV9zaGFsbG93KGVudHJ5LmRhdGEpO1xuICAgIHZhciBrZXkgPSB2YXJpbnRfdG9faTMyKGxlWzFdWzBdLmRhdGEpID4+PiAwO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBkYXRhW2tleV0gPSB1OHN0cihsZVszXVswXS5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcnQgPSBNW3BhcnNlX1RTUF9SZWZlcmVuY2UobGVbOV1bMF0uZGF0YSldWzBdO1xuICAgICAgICAgIHZhciBydHAgPSBwYXJzZV9zaGFsbG93KHJ0LmRhdGEpO1xuICAgICAgICAgIHZhciBydHByZWYgPSBNW3BhcnNlX1RTUF9SZWZlcmVuY2UocnRwWzFdWzBdLmRhdGEpXVswXTtcbiAgICAgICAgICB2YXIgbXR5cGUgPSB2YXJpbnRfdG9faTMyKHJ0cHJlZi5tZXRhWzFdWzBdLmRhdGEpO1xuICAgICAgICAgIGlmIChtdHlwZSAhPSAyMDAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiMjAwMCB1bmV4cGVjdGVkIHJlZmVyZW5jZSB0byBcIi5jb25jYXQobXR5cGUpKTtcbiAgICAgICAgICB2YXIgdHN3cHNhID0gcGFyc2Vfc2hhbGxvdyhydHByZWYuZGF0YSk7XG4gICAgICAgICAgZGF0YVtrZXldID0gdHN3cHNhWzNdLm1hcChmdW5jdGlvbih4KSB7XG4gICAgICAgICAgICByZXR1cm4gdThzdHIoeC5kYXRhKTtcbiAgICAgICAgICB9KS5qb2luKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufVxuZnVuY3Rpb24gcGFyc2VfVFNUX1RpbGVSb3dJbmZvKHU4LCB0eXBlKSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sLCBfbSwgX247XG4gIHZhciBwYiA9IHBhcnNlX3NoYWxsb3codTgpO1xuICB2YXIgUiA9IHZhcmludF90b19pMzIocGJbMV1bMF0uZGF0YSkgPj4+IDA7XG4gIHZhciBjbnQgPSB2YXJpbnRfdG9faTMyKHBiWzJdWzBdLmRhdGEpID4+PiAwO1xuICB2YXIgd2lkZV9vZmZzZXRzID0gKChfYiA9IChfYSA9IHBiWzhdKSA9PSBudWxsID8gdm9pZCAwIDogX2FbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfYi5kYXRhKSAmJiB2YXJpbnRfdG9faTMyKHBiWzhdWzBdLmRhdGEpID4gMCB8fCBmYWxzZTtcbiAgdmFyIHVzZWRfc3RvcmFnZV91OCwgdXNlZF9zdG9yYWdlO1xuICBpZiAoKChfZCA9IChfYyA9IHBiWzddKSA9PSBudWxsID8gdm9pZCAwIDogX2NbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfZC5kYXRhKSAmJiB0eXBlICE9IDApIHtcbiAgICB1c2VkX3N0b3JhZ2VfdTggPSAoX2YgPSAoX2UgPSBwYls3XSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX2YuZGF0YTtcbiAgICB1c2VkX3N0b3JhZ2UgPSAoX2ggPSAoX2cgPSBwYls2XSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9nWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX2guZGF0YTtcbiAgfSBlbHNlIGlmICgoKF9qID0gKF9pID0gcGJbNF0pID09IG51bGwgPyB2b2lkIDAgOiBfaVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9qLmRhdGEpICYmIHR5cGUgIT0gMSkge1xuICAgIHVzZWRfc3RvcmFnZV91OCA9IChfbCA9IChfayA9IHBiWzRdKSA9PSBudWxsID8gdm9pZCAwIDogX2tbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfbC5kYXRhO1xuICAgIHVzZWRfc3RvcmFnZSA9IChfbiA9IChfbSA9IHBiWzNdKSA9PSBudWxsID8gdm9pZCAwIDogX21bMF0pID09IG51bGwgPyB2b2lkIDAgOiBfbi5kYXRhO1xuICB9IGVsc2VcbiAgICB0aHJvdyBcIk5VTUJFUlMgVGlsZSBtaXNzaW5nIFwiLmNvbmNhdCh0eXBlLCBcIiBjZWxsIHN0b3JhZ2VcIik7XG4gIHZhciB3aWR0aCA9IHdpZGVfb2Zmc2V0cyA/IDQgOiAxO1xuICB2YXIgdXNlZF9zdG9yYWdlX29mZnNldHMgPSB1OF90b19kYXRhdmlldyh1c2VkX3N0b3JhZ2VfdTgpO1xuICB2YXIgb2Zmc2V0cyA9IFtdO1xuICBmb3IgKHZhciBDID0gMDsgQyA8IHVzZWRfc3RvcmFnZV91OC5sZW5ndGggLyAyOyArK0MpIHtcbiAgICB2YXIgb2ZmID0gdXNlZF9zdG9yYWdlX29mZnNldHMuZ2V0VWludDE2KEMgKiAyLCB0cnVlKTtcbiAgICBpZiAob2ZmIDwgNjU1MzUpXG4gICAgICBvZmZzZXRzLnB1c2goW0MsIG9mZl0pO1xuICB9XG4gIGlmIChvZmZzZXRzLmxlbmd0aCAhPSBjbnQpXG4gICAgdGhyb3cgXCJFeHBlY3RlZCBcIi5jb25jYXQoY250LCBcIiBjZWxscywgZm91bmQgXCIpLmNvbmNhdChvZmZzZXRzLmxlbmd0aCk7XG4gIHZhciBjZWxscyA9IFtdO1xuICBmb3IgKEMgPSAwOyBDIDwgb2Zmc2V0cy5sZW5ndGggLSAxOyArK0MpXG4gICAgY2VsbHNbb2Zmc2V0c1tDXVswXV0gPSB1c2VkX3N0b3JhZ2Uuc3ViYXJyYXkob2Zmc2V0c1tDXVsxXSAqIHdpZHRoLCBvZmZzZXRzW0MgKyAxXVsxXSAqIHdpZHRoKTtcbiAgaWYgKG9mZnNldHMubGVuZ3RoID49IDEpXG4gICAgY2VsbHNbb2Zmc2V0c1tvZmZzZXRzLmxlbmd0aCAtIDFdWzBdXSA9IHVzZWRfc3RvcmFnZS5zdWJhcnJheShvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV1bMV0gKiB3aWR0aCk7XG4gIHJldHVybiB7IFI6IFIsIGNlbGxzOiBjZWxscyB9O1xufVxuZnVuY3Rpb24gcGFyc2VfVFNUX1RpbGUoTSwgcm9vdCkge1xuICB2YXIgX2E7XG4gIHZhciBwYiA9IHBhcnNlX3NoYWxsb3cocm9vdC5kYXRhKTtcbiAgdmFyIHN0b3JhZ2UgPSAoKF9hID0gcGIgPT0gbnVsbCA/IHZvaWQgMCA6IHBiWzddKSA9PSBudWxsID8gdm9pZCAwIDogX2FbMF0pID8gdmFyaW50X3RvX2kzMihwYls3XVswXS5kYXRhKSA+Pj4gMCA+IDAgPyAxIDogMCA6IC0xO1xuICB2YXIgcmkgPSBtYXBwYShwYls1XSwgZnVuY3Rpb24odTgpIHtcbiAgICByZXR1cm4gcGFyc2VfVFNUX1RpbGVSb3dJbmZvKHU4LCBzdG9yYWdlKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbnJvd3M6IHZhcmludF90b19pMzIocGJbNF1bMF0uZGF0YSkgPj4+IDAsXG4gICAgZGF0YTogcmkucmVkdWNlKGZ1bmN0aW9uKGFjYywgeCkge1xuICAgICAgaWYgKCFhY2NbeC5SXSlcbiAgICAgICAgYWNjW3guUl0gPSBbXTtcbiAgICAgIHguY2VsbHMuZm9yRWFjaChmdW5jdGlvbihjZWxsLCBDKSB7XG4gICAgICAgIGlmIChhY2NbeC5SXVtDXSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEdXBsaWNhdGUgY2VsbCByPVwiLmNvbmNhdCh4LlIsIFwiIGM9XCIpLmNvbmNhdChDKSk7XG4gICAgICAgIGFjY1t4LlJdW0NdID0gY2VsbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1RTVF9UYWJsZU1vZGVsQXJjaGl2ZShNLCByb290LCB3cykge1xuICB2YXIgX2E7XG4gIHZhciBwYiA9IHBhcnNlX3NoYWxsb3cocm9vdC5kYXRhKTtcbiAgdmFyIHJhbmdlID0geyBzOiB7IHI6IDAsIGM6IDAgfSwgZTogeyByOiAwLCBjOiAwIH0gfTtcbiAgcmFuZ2UuZS5yID0gKHZhcmludF90b19pMzIocGJbNl1bMF0uZGF0YSkgPj4+IDApIC0gMTtcbiAgaWYgKHJhbmdlLmUuciA8IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3cgdmFyaW50IFwiLmNvbmNhdChwYls2XVswXS5kYXRhKSk7XG4gIHJhbmdlLmUuYyA9ICh2YXJpbnRfdG9faTMyKHBiWzddWzBdLmRhdGEpID4+PiAwKSAtIDE7XG4gIGlmIChyYW5nZS5lLmMgPCAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29sIHZhcmludCBcIi5jb25jYXQocGJbN11bMF0uZGF0YSkpO1xuICB3c1tcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuICB2YXIgc3RvcmUgPSBwYXJzZV9zaGFsbG93KHBiWzRdWzBdLmRhdGEpO1xuICB2YXIgc3N0ID0gcGFyc2VfVFNUX1RhYmxlRGF0YUxpc3QoTSwgTVtwYXJzZV9UU1BfUmVmZXJlbmNlKHN0b3JlWzRdWzBdLmRhdGEpXVswXSk7XG4gIHZhciByc3N0ID0gKChfYSA9IHN0b3JlWzE3XSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hWzBdKSA/IHBhcnNlX1RTVF9UYWJsZURhdGFMaXN0KE0sIE1bcGFyc2VfVFNQX1JlZmVyZW5jZShzdG9yZVsxN11bMF0uZGF0YSldWzBdKSA6IFtdO1xuICB2YXIgdGlsZSA9IHBhcnNlX3NoYWxsb3coc3RvcmVbM11bMF0uZGF0YSk7XG4gIHZhciBfUiA9IDA7XG4gIHRpbGVbMV0uZm9yRWFjaChmdW5jdGlvbih0KSB7XG4gICAgdmFyIHRsID0gcGFyc2Vfc2hhbGxvdyh0LmRhdGEpO1xuICAgIHZhciByZWYgPSBNW3BhcnNlX1RTUF9SZWZlcmVuY2UodGxbMl1bMF0uZGF0YSldWzBdO1xuICAgIHZhciBtdHlwZSA9IHZhcmludF90b19pMzIocmVmLm1ldGFbMV1bMF0uZGF0YSk7XG4gICAgaWYgKG10eXBlICE9IDYwMDIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCI2MDAxIHVuZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIFwiLmNvbmNhdChtdHlwZSkpO1xuICAgIHZhciBfdGlsZSA9IHBhcnNlX1RTVF9UaWxlKE0sIHJlZik7XG4gICAgX3RpbGUuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKHJvdywgUikge1xuICAgICAgcm93LmZvckVhY2goZnVuY3Rpb24oYnVmLCBDKSB7XG4gICAgICAgIHZhciBhZGRyID0gZW5jb2RlX2NlbGwoeyByOiBfUiArIFIsIGM6IEMgfSk7XG4gICAgICAgIHZhciByZXMgPSBwYXJzZV9jZWxsX3N0b3JhZ2UoYnVmLCBzc3QsIHJzc3QpO1xuICAgICAgICBpZiAocmVzKVxuICAgICAgICAgIHdzW2FkZHJdID0gcmVzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX1IgKz0gX3RpbGUubnJvd3M7XG4gIH0pO1xufVxuZnVuY3Rpb24gcGFyc2VfVFNUX1RhYmxlSW5mb0FyY2hpdmUoTSwgcm9vdCkge1xuICB2YXIgcGIgPSBwYXJzZV9zaGFsbG93KHJvb3QuZGF0YSk7XG4gIHZhciBvdXQgPSB7IFwiIXJlZlwiOiBcIkExXCIgfTtcbiAgdmFyIHRhYmxlcmVmID0gTVtwYXJzZV9UU1BfUmVmZXJlbmNlKHBiWzJdWzBdLmRhdGEpXTtcbiAgdmFyIG10eXBlID0gdmFyaW50X3RvX2kzMih0YWJsZXJlZlswXS5tZXRhWzFdWzBdLmRhdGEpO1xuICBpZiAobXR5cGUgIT0gNjAwMSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCI2MDAwIHVuZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIFwiLmNvbmNhdChtdHlwZSkpO1xuICBwYXJzZV9UU1RfVGFibGVNb2RlbEFyY2hpdmUoTSwgdGFibGVyZWZbMF0sIG91dCk7XG4gIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBwYXJzZV9UTl9TaGVldEFyY2hpdmUoTSwgcm9vdCkge1xuICB2YXIgX2E7XG4gIHZhciBwYiA9IHBhcnNlX3NoYWxsb3cocm9vdC5kYXRhKTtcbiAgdmFyIG91dCA9IHtcbiAgICBuYW1lOiAoKF9hID0gcGJbMV0pID09IG51bGwgPyB2b2lkIDAgOiBfYVswXSkgPyB1OHN0cihwYlsxXVswXS5kYXRhKSA6IFwiXCIsXG4gICAgc2hlZXRzOiBbXVxuICB9O1xuICB2YXIgc2hhcGVvZmZzID0gbWFwcGEocGJbMl0sIHBhcnNlX1RTUF9SZWZlcmVuY2UpO1xuICBzaGFwZW9mZnMuZm9yRWFjaChmdW5jdGlvbihvZmYpIHtcbiAgICBNW29mZl0uZm9yRWFjaChmdW5jdGlvbihtKSB7XG4gICAgICB2YXIgbXR5cGUgPSB2YXJpbnRfdG9faTMyKG0ubWV0YVsxXVswXS5kYXRhKTtcbiAgICAgIGlmIChtdHlwZSA9PSA2ZTMpXG4gICAgICAgIG91dC5zaGVldHMucHVzaChwYXJzZV9UU1RfVGFibGVJbmZvQXJjaGl2ZShNLCBtKSk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gcGFyc2VfVE5fRG9jdW1lbnRBcmNoaXZlKE0sIHJvb3QpIHtcbiAgdmFyIG91dCA9IGJvb2tfbmV3KCk7XG4gIHZhciBwYiA9IHBhcnNlX3NoYWxsb3cocm9vdC5kYXRhKTtcbiAgdmFyIHNoZWV0b2ZmcyA9IG1hcHBhKHBiWzFdLCBwYXJzZV9UU1BfUmVmZXJlbmNlKTtcbiAgc2hlZXRvZmZzLmZvckVhY2goZnVuY3Rpb24ob2ZmKSB7XG4gICAgTVtvZmZdLmZvckVhY2goZnVuY3Rpb24obSkge1xuICAgICAgdmFyIG10eXBlID0gdmFyaW50X3RvX2kzMihtLm1ldGFbMV1bMF0uZGF0YSk7XG4gICAgICBpZiAobXR5cGUgPT0gMikge1xuICAgICAgICB2YXIgcm9vdDIgPSBwYXJzZV9UTl9TaGVldEFyY2hpdmUoTSwgbSk7XG4gICAgICAgIHJvb3QyLnNoZWV0cy5mb3JFYWNoKGZ1bmN0aW9uKHNoZWV0LCBpZHgpIHtcbiAgICAgICAgICBib29rX2FwcGVuZF9zaGVldChvdXQsIHNoZWV0LCBpZHggPT0gMCA/IHJvb3QyLm5hbWUgOiByb290Mi5uYW1lICsgXCJfXCIgKyBpZHgsIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChvdXQuU2hlZXROYW1lcy5sZW5ndGggPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBOVU1CRVJTIGZpbGVcIik7XG4gIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBwYXJzZV9udW1iZXJzX2l3YShjZmIpIHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICB2YXIgTSA9IHt9LCBpbmRpY2VzID0gW107XG4gIGNmYi5GdWxsUGF0aHMuZm9yRWFjaChmdW5jdGlvbihwKSB7XG4gICAgaWYgKHAubWF0Y2goL1xcLml3cHYyLykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBwYXNzd29yZCBwcm90ZWN0aW9uXCIpO1xuICB9KTtcbiAgY2ZiLkZpbGVJbmRleC5mb3JFYWNoKGZ1bmN0aW9uKHMpIHtcbiAgICBpZiAoIXMubmFtZS5tYXRjaCgvXFwuaXdhJC8pKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBvO1xuICAgIHRyeSB7XG4gICAgICBvID0gZGVjb21wcmVzc19pd2FfZmlsZShzLmNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZyhcIj8/IFwiICsgcy5jb250ZW50Lmxlbmd0aCArIFwiIFwiICsgKGUubWVzc2FnZSB8fCBlKSk7XG4gICAgfVxuICAgIHZhciBwYWNrZXRzO1xuICAgIHRyeSB7XG4gICAgICBwYWNrZXRzID0gcGFyc2VfaXdhX2ZpbGUobyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiIyMgXCIgKyAoZS5tZXNzYWdlIHx8IGUpKTtcbiAgICB9XG4gICAgcGFja2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHBhY2tldCkge1xuICAgICAgTVtwYWNrZXQuaWRdID0gcGFja2V0Lm1lc3NhZ2VzO1xuICAgICAgaW5kaWNlcy5wdXNoKHBhY2tldC5pZCk7XG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIWluZGljZXMubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgaGFzIG5vIG1lc3NhZ2VzXCIpO1xuICB2YXIgZG9jcm9vdCA9ICgoX2QgPSAoX2MgPSAoX2IgPSAoX2EgPSBNID09IG51bGwgPyB2b2lkIDAgOiBNWzFdKSA9PSBudWxsID8gdm9pZCAwIDogX2FbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfYi5tZXRhKSA9PSBudWxsID8gdm9pZCAwIDogX2NbMV0pID09IG51bGwgPyB2b2lkIDAgOiBfZFswXS5kYXRhKSAmJiB2YXJpbnRfdG9faTMyKE1bMV1bMF0ubWV0YVsxXVswXS5kYXRhKSA9PSAxICYmIE1bMV1bMF07XG4gIGlmICghZG9jcm9vdClcbiAgICBpbmRpY2VzLmZvckVhY2goZnVuY3Rpb24oaWR4KSB7XG4gICAgICBNW2lkeF0uZm9yRWFjaChmdW5jdGlvbihpd2FtKSB7XG4gICAgICAgIHZhciBtdHlwZSA9IHZhcmludF90b19pMzIoaXdhbS5tZXRhWzFdWzBdLmRhdGEpID4+PiAwO1xuICAgICAgICBpZiAobXR5cGUgPT0gMSkge1xuICAgICAgICAgIGlmICghZG9jcm9vdClcbiAgICAgICAgICAgIGRvY3Jvb3QgPSBpd2FtO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRvY3VtZW50IGhhcyBtdWx0aXBsZSByb290c1wiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIGlmICghZG9jcm9vdClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBEb2N1bWVudCByb290XCIpO1xuICByZXR1cm4gcGFyc2VfVE5fRG9jdW1lbnRBcmNoaXZlKE0sIGRvY3Jvb3QpO1xufVxuZnVuY3Rpb24gd3JpdGVfdGlsZV9yb3codHJpLCBkYXRhLCBTU1QpIHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICBpZiAoISgoX2EgPSB0cmlbNl0pID09IG51bGwgPyB2b2lkIDAgOiBfYVswXSkgfHwgISgoX2IgPSB0cmlbN10pID09IG51bGwgPyB2b2lkIDAgOiBfYlswXSkpXG4gICAgdGhyb3cgXCJNdXRhdGlvbiBvbmx5IHdvcmtzIG9uIHBvc3QtQk5DIHN0b3JhZ2VzIVwiO1xuICB2YXIgd2lkZV9vZmZzZXRzID0gKChfZCA9IChfYyA9IHRyaVs4XSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9jWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX2QuZGF0YSkgJiYgdmFyaW50X3RvX2kzMih0cmlbOF1bMF0uZGF0YSkgPiAwIHx8IGZhbHNlO1xuICBpZiAod2lkZV9vZmZzZXRzKVxuICAgIHRocm93IFwiTWF0aCBvbmx5IHdvcmtzIHdpdGggbm9ybWFsIG9mZnNldHNcIjtcbiAgdmFyIGNudCA9IDA7XG4gIHZhciBkdiA9IHU4X3RvX2RhdGF2aWV3KHRyaVs3XVswXS5kYXRhKSwgbGFzdF9vZmZzZXQgPSAwLCBjZWxsX3N0b3JhZ2UgPSBbXTtcbiAgdmFyIF9kdiA9IHU4X3RvX2RhdGF2aWV3KHRyaVs0XVswXS5kYXRhKSwgX2xhc3Rfb2Zmc2V0ID0gMCwgX2NlbGxfc3RvcmFnZSA9IFtdO1xuICBmb3IgKHZhciBDID0gMDsgQyA8IGRhdGEubGVuZ3RoOyArK0MpIHtcbiAgICBpZiAoZGF0YVtDXSA9PSBudWxsKSB7XG4gICAgICBkdi5zZXRVaW50MTYoQyAqIDIsIDY1NTM1LCB0cnVlKTtcbiAgICAgIF9kdi5zZXRVaW50MTYoQyAqIDIsIDY1NTM1KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBkdi5zZXRVaW50MTYoQyAqIDIsIGxhc3Rfb2Zmc2V0LCB0cnVlKTtcbiAgICBfZHYuc2V0VWludDE2KEMgKiAyLCBfbGFzdF9vZmZzZXQsIHRydWUpO1xuICAgIHZhciBjZWxsb2FkLCBfY2VsbG9hZDtcbiAgICBzd2l0Y2ggKHR5cGVvZiBkYXRhW0NdKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIGNlbGxvYWQgPSB3cml0ZV9uZXdfc3RvcmFnZSh7IHQ6IFwic1wiLCB2OiBkYXRhW0NdIH0sIFNTVCk7XG4gICAgICAgIF9jZWxsb2FkID0gd3JpdGVfb2xkX3N0b3JhZ2UoeyB0OiBcInNcIiwgdjogZGF0YVtDXSB9LCBTU1QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgY2VsbG9hZCA9IHdyaXRlX25ld19zdG9yYWdlKHsgdDogXCJuXCIsIHY6IGRhdGFbQ10gfSwgU1NUKTtcbiAgICAgICAgX2NlbGxvYWQgPSB3cml0ZV9vbGRfc3RvcmFnZSh7IHQ6IFwiblwiLCB2OiBkYXRhW0NdIH0sIFNTVCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgY2VsbG9hZCA9IHdyaXRlX25ld19zdG9yYWdlKHsgdDogXCJiXCIsIHY6IGRhdGFbQ10gfSwgU1NUKTtcbiAgICAgICAgX2NlbGxvYWQgPSB3cml0ZV9vbGRfc3RvcmFnZSh7IHQ6IFwiYlwiLCB2OiBkYXRhW0NdIH0sIFNTVCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdmFsdWUgXCIgKyBkYXRhW0NdKTtcbiAgICB9XG4gICAgY2VsbF9zdG9yYWdlLnB1c2goY2VsbG9hZCk7XG4gICAgbGFzdF9vZmZzZXQgKz0gY2VsbG9hZC5sZW5ndGg7XG4gICAgX2NlbGxfc3RvcmFnZS5wdXNoKF9jZWxsb2FkKTtcbiAgICBfbGFzdF9vZmZzZXQgKz0gX2NlbGxvYWQubGVuZ3RoO1xuICAgICsrY250O1xuICB9XG4gIHRyaVsyXVswXS5kYXRhID0gd3JpdGVfdmFyaW50NDkoY250KTtcbiAgZm9yICg7IEMgPCB0cmlbN11bMF0uZGF0YS5sZW5ndGggLyAyOyArK0MpIHtcbiAgICBkdi5zZXRVaW50MTYoQyAqIDIsIDY1NTM1LCB0cnVlKTtcbiAgICBfZHYuc2V0VWludDE2KEMgKiAyLCA2NTUzNSwgdHJ1ZSk7XG4gIH1cbiAgdHJpWzZdWzBdLmRhdGEgPSB1OGNvbmNhdChjZWxsX3N0b3JhZ2UpO1xuICB0cmlbM11bMF0uZGF0YSA9IHU4Y29uY2F0KF9jZWxsX3N0b3JhZ2UpO1xuICByZXR1cm4gY250O1xufVxuZnVuY3Rpb24gd3JpdGVfbnVtYmVyc19pd2Eod2IsIG9wdHMpIHtcbiAgaWYgKCFvcHRzIHx8ICFvcHRzLm51bWJlcnMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBwYXNzIGEgYG51bWJlcnNgIG9wdGlvbiAtLSBjaGVjayB0aGUgUkVBRE1FXCIpO1xuICB2YXIgd3MgPSB3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1swXV07XG4gIGlmICh3Yi5TaGVldE5hbWVzLmxlbmd0aCA+IDEpXG4gICAgY29uc29sZS5lcnJvcihcIlRoZSBOdW1iZXJzIHdyaXRlciBjdXJyZW50bHkgd3JpdGVzIG9ubHkgdGhlIGZpcnN0IHRhYmxlXCIpO1xuICB2YXIgcmFuZ2UgPSBkZWNvZGVfcmFuZ2Uod3NbXCIhcmVmXCJdKTtcbiAgcmFuZ2Uucy5yID0gcmFuZ2Uucy5jID0gMDtcbiAgdmFyIHRydW5jID0gZmFsc2U7XG4gIGlmIChyYW5nZS5lLmMgPiA5KSB7XG4gICAgdHJ1bmMgPSB0cnVlO1xuICAgIHJhbmdlLmUuYyA9IDk7XG4gIH1cbiAgaWYgKHJhbmdlLmUuciA+IDQ5KSB7XG4gICAgdHJ1bmMgPSB0cnVlO1xuICAgIHJhbmdlLmUuciA9IDQ5O1xuICB9XG4gIGlmICh0cnVuYylcbiAgICBjb25zb2xlLmVycm9yKFwiVGhlIE51bWJlcnMgd3JpdGVyIGlzIGN1cnJlbnRseSBsaW1pdGVkIHRvIFwiLmNvbmNhdChlbmNvZGVfcmFuZ2UocmFuZ2UpKSk7XG4gIHZhciBkYXRhID0gc2hlZXRfdG9fanNvbih3cywgeyByYW5nZTogcmFuZ2UsIGhlYWRlcjogMSB9KTtcbiAgdmFyIFNTVCA9IFtcIn5TaDMzdEo1flwiXTtcbiAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xuICAgIHJldHVybiByb3cuZm9yRWFjaChmdW5jdGlvbihjZWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGNlbGwgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgU1NULnB1c2goY2VsbCk7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgZGVwZW5kZW50cyA9IHt9O1xuICB2YXIgaW5kaWNlcyA9IFtdO1xuICB2YXIgY2ZiID0gQ0ZCLnJlYWQob3B0cy5udW1iZXJzLCB7IHR5cGU6IFwiYmFzZTY0XCIgfSk7XG4gIGNmYi5GaWxlSW5kZXgubWFwKGZ1bmN0aW9uKGZpLCBpZHgpIHtcbiAgICByZXR1cm4gW2ZpLCBjZmIuRnVsbFBhdGhzW2lkeF1dO1xuICB9KS5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xuICAgIHZhciBmaSA9IHJvd1swXSwgZnAgPSByb3dbMV07XG4gICAgaWYgKGZpLnR5cGUgIT0gMilcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIWZpLm5hbWUubWF0Y2goL1xcLml3YS8pKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBvbGRfY29udGVudCA9IGZpLmNvbnRlbnQ7XG4gICAgdmFyIHJhdzEgPSBkZWNvbXByZXNzX2l3YV9maWxlKG9sZF9jb250ZW50KTtcbiAgICB2YXIgeDIgPSBwYXJzZV9pd2FfZmlsZShyYXcxKTtcbiAgICB4Mi5mb3JFYWNoKGZ1bmN0aW9uKHBhY2tldDIpIHtcbiAgICAgIGluZGljZXMucHVzaChwYWNrZXQyLmlkKTtcbiAgICAgIGRlcGVuZGVudHNbcGFja2V0Mi5pZF0gPSB7IGRlcHM6IFtdLCBsb2NhdGlvbjogZnAsIHR5cGU6IHZhcmludF90b19pMzIocGFja2V0Mi5tZXNzYWdlc1swXS5tZXRhWzFdWzBdLmRhdGEpIH07XG4gICAgfSk7XG4gIH0pO1xuICBpbmRpY2VzLnNvcnQoZnVuY3Rpb24oeDIsIHkyKSB7XG4gICAgcmV0dXJuIHgyIC0geTI7XG4gIH0pO1xuICB2YXIgaW5kaWNlc192YXJpbnQgPSBpbmRpY2VzLmZpbHRlcihmdW5jdGlvbih4Mikge1xuICAgIHJldHVybiB4MiA+IDE7XG4gIH0pLm1hcChmdW5jdGlvbih4Mikge1xuICAgIHJldHVybiBbeDIsIHdyaXRlX3ZhcmludDQ5KHgyKV07XG4gIH0pO1xuICBjZmIuRmlsZUluZGV4Lm1hcChmdW5jdGlvbihmaSwgaWR4KSB7XG4gICAgcmV0dXJuIFtmaSwgY2ZiLkZ1bGxQYXRoc1tpZHhdXTtcbiAgfSkuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICB2YXIgZmkgPSByb3dbMF0sIGZwID0gcm93WzFdO1xuICAgIGlmICghZmkubmFtZS5tYXRjaCgvXFwuaXdhLykpXG4gICAgICByZXR1cm47XG4gICAgdmFyIHgyID0gcGFyc2VfaXdhX2ZpbGUoZGVjb21wcmVzc19pd2FfZmlsZShmaS5jb250ZW50KSk7XG4gICAgeDIuZm9yRWFjaChmdW5jdGlvbihpYSkge1xuICAgICAgaWEubWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtKSB7XG4gICAgICAgIGluZGljZXNfdmFyaW50LmZvckVhY2goZnVuY3Rpb24oaXZpKSB7XG4gICAgICAgICAgaWYgKGlhLm1lc3NhZ2VzLnNvbWUoZnVuY3Rpb24obWVzcykge1xuICAgICAgICAgICAgcmV0dXJuIHZhcmludF90b19pMzIobWVzcy5tZXRhWzFdWzBdLmRhdGEpICE9IDExMDA2ICYmIHU4Y29udGFpbnMobWVzcy5kYXRhLCBpdmlbMV0pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBkZXBlbmRlbnRzW2l2aVswXV0uZGVwcy5wdXNoKGlhLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBmdW5jdGlvbiBnZXRfdW5pcXVlX21zZ2lkKCkge1xuICAgIGZvciAodmFyIGkgPSA5MjcyNjI7IGkgPCAyZTY7ICsraSlcbiAgICAgIGlmICghZGVwZW5kZW50c1tpXSlcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVG9vIG1hbnkgbWVzc2FnZXNcIik7XG4gIH1cbiAgdmFyIGVudHJ5ID0gQ0ZCLmZpbmQoY2ZiLCBkZXBlbmRlbnRzWzFdLmxvY2F0aW9uKTtcbiAgdmFyIHggPSBwYXJzZV9pd2FfZmlsZShkZWNvbXByZXNzX2l3YV9maWxlKGVudHJ5LmNvbnRlbnQpKTtcbiAgdmFyIGRvY3Jvb3Q7XG4gIGZvciAodmFyIHhpID0gMDsgeGkgPCB4Lmxlbmd0aDsgKyt4aSkge1xuICAgIHZhciBwYWNrZXQgPSB4W3hpXTtcbiAgICBpZiAocGFja2V0LmlkID09IDEpXG4gICAgICBkb2Nyb290ID0gcGFja2V0O1xuICB9XG4gIHZhciBzaGVldHJvb3RyZWYgPSBwYXJzZV9UU1BfUmVmZXJlbmNlKHBhcnNlX3NoYWxsb3coZG9jcm9vdC5tZXNzYWdlc1swXS5kYXRhKVsxXVswXS5kYXRhKTtcbiAgZW50cnkgPSBDRkIuZmluZChjZmIsIGRlcGVuZGVudHNbc2hlZXRyb290cmVmXS5sb2NhdGlvbik7XG4gIHggPSBwYXJzZV9pd2FfZmlsZShkZWNvbXByZXNzX2l3YV9maWxlKGVudHJ5LmNvbnRlbnQpKTtcbiAgZm9yICh4aSA9IDA7IHhpIDwgeC5sZW5ndGg7ICsreGkpIHtcbiAgICBwYWNrZXQgPSB4W3hpXTtcbiAgICBpZiAocGFja2V0LmlkID09IHNoZWV0cm9vdHJlZilcbiAgICAgIGRvY3Jvb3QgPSBwYWNrZXQ7XG4gIH1cbiAgc2hlZXRyb290cmVmID0gcGFyc2VfVFNQX1JlZmVyZW5jZShwYXJzZV9zaGFsbG93KGRvY3Jvb3QubWVzc2FnZXNbMF0uZGF0YSlbMl1bMF0uZGF0YSk7XG4gIGVudHJ5ID0gQ0ZCLmZpbmQoY2ZiLCBkZXBlbmRlbnRzW3NoZWV0cm9vdHJlZl0ubG9jYXRpb24pO1xuICB4ID0gcGFyc2VfaXdhX2ZpbGUoZGVjb21wcmVzc19pd2FfZmlsZShlbnRyeS5jb250ZW50KSk7XG4gIGZvciAoeGkgPSAwOyB4aSA8IHgubGVuZ3RoOyArK3hpKSB7XG4gICAgcGFja2V0ID0geFt4aV07XG4gICAgaWYgKHBhY2tldC5pZCA9PSBzaGVldHJvb3RyZWYpXG4gICAgICBkb2Nyb290ID0gcGFja2V0O1xuICB9XG4gIHNoZWV0cm9vdHJlZiA9IHBhcnNlX1RTUF9SZWZlcmVuY2UocGFyc2Vfc2hhbGxvdyhkb2Nyb290Lm1lc3NhZ2VzWzBdLmRhdGEpWzJdWzBdLmRhdGEpO1xuICBlbnRyeSA9IENGQi5maW5kKGNmYiwgZGVwZW5kZW50c1tzaGVldHJvb3RyZWZdLmxvY2F0aW9uKTtcbiAgeCA9IHBhcnNlX2l3YV9maWxlKGRlY29tcHJlc3NfaXdhX2ZpbGUoZW50cnkuY29udGVudCkpO1xuICBmb3IgKHhpID0gMDsgeGkgPCB4Lmxlbmd0aDsgKyt4aSkge1xuICAgIHBhY2tldCA9IHhbeGldO1xuICAgIGlmIChwYWNrZXQuaWQgPT0gc2hlZXRyb290cmVmKVxuICAgICAgZG9jcm9vdCA9IHBhY2tldDtcbiAgfVxuICB2YXIgcGIgPSBwYXJzZV9zaGFsbG93KGRvY3Jvb3QubWVzc2FnZXNbMF0uZGF0YSk7XG4gIHtcbiAgICBwYls2XVswXS5kYXRhID0gd3JpdGVfdmFyaW50NDkocmFuZ2UuZS5yICsgMSk7XG4gICAgcGJbN11bMF0uZGF0YSA9IHdyaXRlX3ZhcmludDQ5KHJhbmdlLmUuYyArIDEpO1xuICAgIHZhciBjcnVpZHNyZWYgPSBwYXJzZV9UU1BfUmVmZXJlbmNlKHBiWzQ2XVswXS5kYXRhKTtcbiAgICB2YXIgb2xkYnVja2V0ID0gQ0ZCLmZpbmQoY2ZiLCBkZXBlbmRlbnRzW2NydWlkc3JlZl0ubG9jYXRpb24pO1xuICAgIHZhciBfeCA9IHBhcnNlX2l3YV9maWxlKGRlY29tcHJlc3NfaXdhX2ZpbGUob2xkYnVja2V0LmNvbnRlbnQpKTtcbiAgICB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IF94Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGlmIChfeFtqXS5pZCA9PSBjcnVpZHNyZWYpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoX3hbal0uaWQgIT0gY3J1aWRzcmVmKVxuICAgICAgICB0aHJvdyBcIkJhZCBDb2x1bW5Sb3dVSURNYXBBcmNoaXZlXCI7XG4gICAgICB2YXIgY3J1aWRzID0gcGFyc2Vfc2hhbGxvdyhfeFtqXS5tZXNzYWdlc1swXS5kYXRhKTtcbiAgICAgIGNydWlkc1sxXSA9IFtdO1xuICAgICAgY3J1aWRzWzJdID0gW10sIGNydWlkc1szXSA9IFtdO1xuICAgICAgZm9yICh2YXIgQyA9IDA7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIHtcbiAgICAgICAgdmFyIHV1aWQgPSBbXTtcbiAgICAgICAgdXVpZFsxXSA9IHV1aWRbMl0gPSBbeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OShDICsgNDIwNjkwKSB9XTtcbiAgICAgICAgY3J1aWRzWzFdLnB1c2goeyB0eXBlOiAyLCBkYXRhOiB3cml0ZV9zaGFsbG93KHV1aWQpIH0pO1xuICAgICAgICBjcnVpZHNbMl0ucHVzaCh7IHR5cGU6IDAsIGRhdGE6IHdyaXRlX3ZhcmludDQ5KEMpIH0pO1xuICAgICAgICBjcnVpZHNbM10ucHVzaCh7IHR5cGU6IDAsIGRhdGE6IHdyaXRlX3ZhcmludDQ5KEMpIH0pO1xuICAgICAgfVxuICAgICAgY3J1aWRzWzRdID0gW107XG4gICAgICBjcnVpZHNbNV0gPSBbXSwgY3J1aWRzWzZdID0gW107XG4gICAgICBmb3IgKHZhciBSID0gMDsgUiA8PSByYW5nZS5lLnI7ICsrUikge1xuICAgICAgICB1dWlkID0gW107XG4gICAgICAgIHV1aWRbMV0gPSB1dWlkWzJdID0gW3sgdHlwZTogMCwgZGF0YTogd3JpdGVfdmFyaW50NDkoUiArIDcyNjI3MCkgfV07XG4gICAgICAgIGNydWlkc1s0XS5wdXNoKHsgdHlwZTogMiwgZGF0YTogd3JpdGVfc2hhbGxvdyh1dWlkKSB9KTtcbiAgICAgICAgY3J1aWRzWzVdLnB1c2goeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OShSKSB9KTtcbiAgICAgICAgY3J1aWRzWzZdLnB1c2goeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OShSKSB9KTtcbiAgICAgIH1cbiAgICAgIF94W2pdLm1lc3NhZ2VzWzBdLmRhdGEgPSB3cml0ZV9zaGFsbG93KGNydWlkcyk7XG4gICAgfVxuICAgIG9sZGJ1Y2tldC5jb250ZW50ID0gY29tcHJlc3NfaXdhX2ZpbGUod3JpdGVfaXdhX2ZpbGUoX3gpKTtcbiAgICBvbGRidWNrZXQuc2l6ZSA9IG9sZGJ1Y2tldC5jb250ZW50Lmxlbmd0aDtcbiAgICBkZWxldGUgcGJbNDZdO1xuICAgIHZhciBzdG9yZSA9IHBhcnNlX3NoYWxsb3cocGJbNF1bMF0uZGF0YSk7XG4gICAge1xuICAgICAgc3RvcmVbN11bMF0uZGF0YSA9IHdyaXRlX3ZhcmludDQ5KHJhbmdlLmUuciArIDEpO1xuICAgICAgdmFyIHJvd19oZWFkZXJzID0gcGFyc2Vfc2hhbGxvdyhzdG9yZVsxXVswXS5kYXRhKTtcbiAgICAgIHZhciByb3dfaGVhZGVyX3JlZiA9IHBhcnNlX1RTUF9SZWZlcmVuY2Uocm93X2hlYWRlcnNbMl1bMF0uZGF0YSk7XG4gICAgICBvbGRidWNrZXQgPSBDRkIuZmluZChjZmIsIGRlcGVuZGVudHNbcm93X2hlYWRlcl9yZWZdLmxvY2F0aW9uKTtcbiAgICAgIF94ID0gcGFyc2VfaXdhX2ZpbGUoZGVjb21wcmVzc19pd2FfZmlsZShvbGRidWNrZXQuY29udGVudCkpO1xuICAgICAge1xuICAgICAgICBpZiAoX3hbMF0uaWQgIT0gcm93X2hlYWRlcl9yZWYpXG4gICAgICAgICAgdGhyb3cgXCJCYWQgSGVhZGVyU3RvcmFnZUJ1Y2tldFwiO1xuICAgICAgICB2YXIgYmFzZV9idWNrZXQgPSBwYXJzZV9zaGFsbG93KF94WzBdLm1lc3NhZ2VzWzBdLmRhdGEpO1xuICAgICAgICBmb3IgKFIgPSAwOyBSIDwgZGF0YS5sZW5ndGg7ICsrUikge1xuICAgICAgICAgIHZhciBfYnVja2V0ID0gcGFyc2Vfc2hhbGxvdyhiYXNlX2J1Y2tldFsyXVswXS5kYXRhKTtcbiAgICAgICAgICBfYnVja2V0WzFdWzBdLmRhdGEgPSB3cml0ZV92YXJpbnQ0OShSKTtcbiAgICAgICAgICBfYnVja2V0WzRdWzBdLmRhdGEgPSB3cml0ZV92YXJpbnQ0OShkYXRhW1JdLmxlbmd0aCk7XG4gICAgICAgICAgYmFzZV9idWNrZXRbMl1bUl0gPSB7IHR5cGU6IGJhc2VfYnVja2V0WzJdWzBdLnR5cGUsIGRhdGE6IHdyaXRlX3NoYWxsb3coX2J1Y2tldCkgfTtcbiAgICAgICAgfVxuICAgICAgICBfeFswXS5tZXNzYWdlc1swXS5kYXRhID0gd3JpdGVfc2hhbGxvdyhiYXNlX2J1Y2tldCk7XG4gICAgICB9XG4gICAgICBvbGRidWNrZXQuY29udGVudCA9IGNvbXByZXNzX2l3YV9maWxlKHdyaXRlX2l3YV9maWxlKF94KSk7XG4gICAgICBvbGRidWNrZXQuc2l6ZSA9IG9sZGJ1Y2tldC5jb250ZW50Lmxlbmd0aDtcbiAgICAgIHZhciBjb2xfaGVhZGVyX3JlZiA9IHBhcnNlX1RTUF9SZWZlcmVuY2Uoc3RvcmVbMl1bMF0uZGF0YSk7XG4gICAgICBvbGRidWNrZXQgPSBDRkIuZmluZChjZmIsIGRlcGVuZGVudHNbY29sX2hlYWRlcl9yZWZdLmxvY2F0aW9uKTtcbiAgICAgIF94ID0gcGFyc2VfaXdhX2ZpbGUoZGVjb21wcmVzc19pd2FfZmlsZShvbGRidWNrZXQuY29udGVudCkpO1xuICAgICAge1xuICAgICAgICBpZiAoX3hbMF0uaWQgIT0gY29sX2hlYWRlcl9yZWYpXG4gICAgICAgICAgdGhyb3cgXCJCYWQgSGVhZGVyU3RvcmFnZUJ1Y2tldFwiO1xuICAgICAgICBiYXNlX2J1Y2tldCA9IHBhcnNlX3NoYWxsb3coX3hbMF0ubWVzc2FnZXNbMF0uZGF0YSk7XG4gICAgICAgIGZvciAoQyA9IDA7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIHtcbiAgICAgICAgICBfYnVja2V0ID0gcGFyc2Vfc2hhbGxvdyhiYXNlX2J1Y2tldFsyXVswXS5kYXRhKTtcbiAgICAgICAgICBfYnVja2V0WzFdWzBdLmRhdGEgPSB3cml0ZV92YXJpbnQ0OShDKTtcbiAgICAgICAgICBfYnVja2V0WzRdWzBdLmRhdGEgPSB3cml0ZV92YXJpbnQ0OShyYW5nZS5lLnIgKyAxKTtcbiAgICAgICAgICBiYXNlX2J1Y2tldFsyXVtDXSA9IHsgdHlwZTogYmFzZV9idWNrZXRbMl1bMF0udHlwZSwgZGF0YTogd3JpdGVfc2hhbGxvdyhfYnVja2V0KSB9O1xuICAgICAgICB9XG4gICAgICAgIF94WzBdLm1lc3NhZ2VzWzBdLmRhdGEgPSB3cml0ZV9zaGFsbG93KGJhc2VfYnVja2V0KTtcbiAgICAgIH1cbiAgICAgIG9sZGJ1Y2tldC5jb250ZW50ID0gY29tcHJlc3NfaXdhX2ZpbGUod3JpdGVfaXdhX2ZpbGUoX3gpKTtcbiAgICAgIG9sZGJ1Y2tldC5zaXplID0gb2xkYnVja2V0LmNvbnRlbnQubGVuZ3RoO1xuICAgICAgdmFyIHNzdHJlZiA9IHBhcnNlX1RTUF9SZWZlcmVuY2Uoc3RvcmVbNF1bMF0uZGF0YSk7XG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzZW50cnkgPSBDRkIuZmluZChjZmIsIGRlcGVuZGVudHNbc3N0cmVmXS5sb2NhdGlvbik7XG4gICAgICAgIHZhciBzeCA9IHBhcnNlX2l3YV9maWxlKGRlY29tcHJlc3NfaXdhX2ZpbGUoc2VudHJ5LmNvbnRlbnQpKTtcbiAgICAgICAgdmFyIHNzdHJvb3Q7XG4gICAgICAgIGZvciAodmFyIHN4aSA9IDA7IHN4aSA8IHN4Lmxlbmd0aDsgKytzeGkpIHtcbiAgICAgICAgICB2YXIgcGFja2V0MiA9IHN4W3N4aV07XG4gICAgICAgICAgaWYgKHBhY2tldDIuaWQgPT0gc3N0cmVmKVxuICAgICAgICAgICAgc3N0cm9vdCA9IHBhY2tldDI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNzdGRhdGEgPSBwYXJzZV9zaGFsbG93KHNzdHJvb3QubWVzc2FnZXNbMF0uZGF0YSk7XG4gICAgICAgIHtcbiAgICAgICAgICBzc3RkYXRhWzNdID0gW107XG4gICAgICAgICAgdmFyIG5ld3NzdCA9IFtdO1xuICAgICAgICAgIFNTVC5mb3JFYWNoKGZ1bmN0aW9uKHN0ciwgaSkge1xuICAgICAgICAgICAgbmV3c3N0WzFdID0gW3sgdHlwZTogMCwgZGF0YTogd3JpdGVfdmFyaW50NDkoaSkgfV07XG4gICAgICAgICAgICBuZXdzc3RbMl0gPSBbeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OSgxKSB9XTtcbiAgICAgICAgICAgIG5ld3NzdFszXSA9IFt7IHR5cGU6IDIsIGRhdGE6IHN0cnU4KHN0cikgfV07XG4gICAgICAgICAgICBzc3RkYXRhWzNdLnB1c2goeyB0eXBlOiAyLCBkYXRhOiB3cml0ZV9zaGFsbG93KG5ld3NzdCkgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3N0cm9vdC5tZXNzYWdlc1swXS5kYXRhID0gd3JpdGVfc2hhbGxvdyhzc3RkYXRhKTtcbiAgICAgICAgdmFyIHN5ID0gd3JpdGVfaXdhX2ZpbGUoc3gpO1xuICAgICAgICB2YXIgcmF3MzIgPSBjb21wcmVzc19pd2FfZmlsZShzeSk7XG4gICAgICAgIHNlbnRyeS5jb250ZW50ID0gcmF3MzI7XG4gICAgICAgIHNlbnRyeS5zaXplID0gc2VudHJ5LmNvbnRlbnQubGVuZ3RoO1xuICAgICAgfSkoKTtcbiAgICAgIHZhciB0aWxlID0gcGFyc2Vfc2hhbGxvdyhzdG9yZVszXVswXS5kYXRhKTtcbiAgICAgIHtcbiAgICAgICAgdmFyIHQgPSB0aWxlWzFdWzBdO1xuICAgICAgICBkZWxldGUgdGlsZVsyXTtcbiAgICAgICAgdmFyIHRsID0gcGFyc2Vfc2hhbGxvdyh0LmRhdGEpO1xuICAgICAgICB7XG4gICAgICAgICAgdmFyIHRpbGVyZWYgPSBwYXJzZV9UU1BfUmVmZXJlbmNlKHRsWzJdWzBdLmRhdGEpO1xuICAgICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0ZW50cnkgPSBDRkIuZmluZChjZmIsIGRlcGVuZGVudHNbdGlsZXJlZl0ubG9jYXRpb24pO1xuICAgICAgICAgICAgdmFyIHR4ID0gcGFyc2VfaXdhX2ZpbGUoZGVjb21wcmVzc19pd2FfZmlsZSh0ZW50cnkuY29udGVudCkpO1xuICAgICAgICAgICAgdmFyIHRpbGVyb290O1xuICAgICAgICAgICAgZm9yICh2YXIgc3hpID0gMDsgc3hpIDwgdHgubGVuZ3RoOyArK3N4aSkge1xuICAgICAgICAgICAgICB2YXIgcGFja2V0MiA9IHR4W3N4aV07XG4gICAgICAgICAgICAgIGlmIChwYWNrZXQyLmlkID09IHRpbGVyZWYpXG4gICAgICAgICAgICAgICAgdGlsZXJvb3QgPSBwYWNrZXQyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRpbGVkYXRhID0gcGFyc2Vfc2hhbGxvdyh0aWxlcm9vdC5tZXNzYWdlc1swXS5kYXRhKTtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHRpbGVkYXRhWzZdO1xuICAgICAgICAgICAgICBkZWxldGUgdGlsZVs3XTtcbiAgICAgICAgICAgICAgdmFyIHJvd2xvYWQgPSBuZXcgVWludDhBcnJheSh0aWxlZGF0YVs1XVswXS5kYXRhKTtcbiAgICAgICAgICAgICAgdGlsZWRhdGFbNV0gPSBbXTtcbiAgICAgICAgICAgICAgdmFyIGNudCA9IDA7XG4gICAgICAgICAgICAgIGZvciAodmFyIFIyID0gMDsgUjIgPD0gcmFuZ2UuZS5yOyArK1IyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRpbGVyb3cgPSBwYXJzZV9zaGFsbG93KHJvd2xvYWQpO1xuICAgICAgICAgICAgICAgIGNudCArPSB3cml0ZV90aWxlX3Jvdyh0aWxlcm93LCBkYXRhW1IyXSwgU1NUKTtcbiAgICAgICAgICAgICAgICB0aWxlcm93WzFdWzBdLmRhdGEgPSB3cml0ZV92YXJpbnQ0OShSMik7XG4gICAgICAgICAgICAgICAgdGlsZWRhdGFbNV0ucHVzaCh7IGRhdGE6IHdyaXRlX3NoYWxsb3codGlsZXJvdyksIHR5cGU6IDIgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGlsZWRhdGFbMV0gPSBbeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OShyYW5nZS5lLmMgKyAxKSB9XTtcbiAgICAgICAgICAgICAgdGlsZWRhdGFbMl0gPSBbeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OShyYW5nZS5lLnIgKyAxKSB9XTtcbiAgICAgICAgICAgICAgdGlsZWRhdGFbM10gPSBbeyB0eXBlOiAwLCBkYXRhOiB3cml0ZV92YXJpbnQ0OShjbnQpIH1dO1xuICAgICAgICAgICAgICB0aWxlZGF0YVs0XSA9IFt7IHR5cGU6IDAsIGRhdGE6IHdyaXRlX3ZhcmludDQ5KHJhbmdlLmUuciArIDEpIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlsZXJvb3QubWVzc2FnZXNbMF0uZGF0YSA9IHdyaXRlX3NoYWxsb3codGlsZWRhdGEpO1xuICAgICAgICAgICAgdmFyIHR5ID0gd3JpdGVfaXdhX2ZpbGUodHgpO1xuICAgICAgICAgICAgdmFyIHJhdzMyID0gY29tcHJlc3NfaXdhX2ZpbGUodHkpO1xuICAgICAgICAgICAgdGVudHJ5LmNvbnRlbnQgPSByYXczMjtcbiAgICAgICAgICAgIHRlbnRyeS5zaXplID0gdGVudHJ5LmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgICAgdC5kYXRhID0gd3JpdGVfc2hhbGxvdyh0bCk7XG4gICAgICB9XG4gICAgICBzdG9yZVszXVswXS5kYXRhID0gd3JpdGVfc2hhbGxvdyh0aWxlKTtcbiAgICB9XG4gICAgcGJbNF1bMF0uZGF0YSA9IHdyaXRlX3NoYWxsb3coc3RvcmUpO1xuICB9XG4gIGRvY3Jvb3QubWVzc2FnZXNbMF0uZGF0YSA9IHdyaXRlX3NoYWxsb3cocGIpO1xuICB2YXIgeSA9IHdyaXRlX2l3YV9maWxlKHgpO1xuICB2YXIgcmF3MyA9IGNvbXByZXNzX2l3YV9maWxlKHkpO1xuICBlbnRyeS5jb250ZW50ID0gcmF3MztcbiAgZW50cnkuc2l6ZSA9IGVudHJ5LmNvbnRlbnQubGVuZ3RoO1xuICByZXR1cm4gY2ZiO1xufVxuZnVuY3Rpb24gZml4X29wdHNfZnVuYyhkZWZhdWx0cy8qOkFycmF5PEFycmF5PGFueT4gPiovKS8qOnsobzphbnkpOnZvaWR9Ki8ge1xuXHRyZXR1cm4gZnVuY3Rpb24gZml4X29wdHMob3B0cykge1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgIT0gZGVmYXVsdHMubGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhciBkID0gZGVmYXVsdHNbaV07XG5cdFx0XHRpZihvcHRzW2RbMF1dID09PSB1bmRlZmluZWQpIG9wdHNbZFswXV0gPSBkWzFdO1xuXHRcdFx0aWYoZFsyXSA9PT0gJ24nKSBvcHRzW2RbMF1dID0gTnVtYmVyKG9wdHNbZFswXV0pO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gZml4X3JlYWRfb3B0cyhvcHRzKSB7XG5maXhfb3B0c19mdW5jKFtcblx0WydjZWxsTkYnLCBmYWxzZV0sIC8qIGVtaXQgY2VsbCBudW1iZXIgZm9ybWF0IHN0cmluZyBhcyAueiAqL1xuXHRbJ2NlbGxIVE1MJywgdHJ1ZV0sIC8qIGVtaXQgaHRtbCBzdHJpbmcgYXMgLmggKi9cblx0WydjZWxsRm9ybXVsYScsIHRydWVdLCAvKiBlbWl0IGZvcm11bGFlIGFzIC5mICovXG5cdFsnY2VsbFN0eWxlcycsIGZhbHNlXSwgLyogZW1pdHMgc3R5bGUvdGhlbWUgYXMgLnMgKi9cblx0WydjZWxsVGV4dCcsIHRydWVdLCAvKiBlbWl0IGZvcm1hdHRlZCB0ZXh0IGFzIC53ICovXG5cdFsnY2VsbERhdGVzJywgZmFsc2VdLCAvKiBlbWl0IGRhdGUgY2VsbHMgd2l0aCB0eXBlIGBkYCAqL1xuXG5cdFsnc2hlZXRTdHVicycsIGZhbHNlXSwgLyogZW1pdCBlbXB0eSBjZWxscyAqL1xuXHRbJ3NoZWV0Um93cycsIDAsICduJ10sIC8qIHJlYWQgbiByb3dzICgwID0gcmVhZCBhbGwgcm93cykgKi9cblxuXHRbJ2Jvb2tEZXBzJywgZmFsc2VdLCAvKiBwYXJzZSBjYWxjdWxhdGlvbiBjaGFpbnMgKi9cblx0Wydib29rU2hlZXRzJywgZmFsc2VdLCAvKiBvbmx5IHRyeSB0byBnZXQgc2hlZXQgbmFtZXMgKG5vIFNoZWV0cykgKi9cblx0Wydib29rUHJvcHMnLCBmYWxzZV0sIC8qIG9ubHkgdHJ5IHRvIGdldCBwcm9wZXJ0aWVzIChubyBTaGVldHMpICovXG5cdFsnYm9va0ZpbGVzJywgZmFsc2VdLCAvKiBpbmNsdWRlIHJhdyBmaWxlIHN0cnVjdHVyZSAoa2V5cywgZmlsZXMsIGNmYikgKi9cblx0Wydib29rVkJBJywgZmFsc2VdLCAvKiBpbmNsdWRlIHZiYSByYXcgZGF0YSAodmJhcmF3KSAqL1xuXG5cdFsncGFzc3dvcmQnLCcnXSwgLyogcGFzc3dvcmQgKi9cblx0WydXVEYnLCBmYWxzZV0gLyogV1RGIG1vZGUgKHRocm93cyBlcnJvcnMpICovXG5dKShvcHRzKTtcbn1cblxuZnVuY3Rpb24gZml4X3dyaXRlX29wdHMob3B0cykge1xuZml4X29wdHNfZnVuYyhbXG5cdFsnY2VsbERhdGVzJywgZmFsc2VdLCAvKiB3cml0ZSBkYXRlIGNlbGxzIHdpdGggdHlwZSBgZGAgKi9cblxuXHRbJ2Jvb2tTU1QnLCBmYWxzZV0sIC8qIEdlbmVyYXRlIFNoYXJlZCBTdHJpbmcgVGFibGUgKi9cblxuXHRbJ2Jvb2tUeXBlJywgJ3hsc3gnXSwgLyogVHlwZSBvZiB3b3JrYm9vayAoeGxzeC9tL2IpICovXG5cblx0Wydjb21wcmVzc2lvbicsIGZhbHNlXSwgLyogVXNlIGZpbGUgY29tcHJlc3Npb24gKi9cblxuXHRbJ1dURicsIGZhbHNlXSAvKiBXVEYgbW9kZSAodGhyb3dzIGVycm9ycykgKi9cbl0pKG9wdHMpO1xufVxuZnVuY3Rpb24gZ2V0X3NoZWV0X3R5cGUobi8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0aWYoUkVMUy5XUy5pbmRleE9mKG4pID4gLTEpIHJldHVybiBcInNoZWV0XCI7XG5cdGlmKFJFTFMuQ1MgJiYgbiA9PSBSRUxTLkNTKSByZXR1cm4gXCJjaGFydFwiO1xuXHRpZihSRUxTLkRTICYmIG4gPT0gUkVMUy5EUykgcmV0dXJuIFwiZGlhbG9nXCI7XG5cdGlmKFJFTFMuTVMgJiYgbiA9PSBSRUxTLk1TKSByZXR1cm4gXCJtYWNyb1wiO1xuXHRyZXR1cm4gKG4gJiYgbi5sZW5ndGgpID8gbiA6IFwic2hlZXRcIjtcbn1cbmZ1bmN0aW9uIHNhZmVfcGFyc2Vfd2JyZWxzKHdicmVscywgc2hlZXRzKSB7XG5cdGlmKCF3YnJlbHMpIHJldHVybiAwO1xuXHR0cnkge1xuXHRcdHdicmVscyA9IHNoZWV0cy5tYXAoZnVuY3Rpb24gcHdicih3KSB7IGlmKCF3LmlkKSB3LmlkID0gdy5zdHJSZWxJRDsgcmV0dXJuIFt3Lm5hbWUsIHdicmVsc1snIWlkJ11bdy5pZF0uVGFyZ2V0LCBnZXRfc2hlZXRfdHlwZSh3YnJlbHNbJyFpZCddW3cuaWRdLlR5cGUpXTsgfSk7XG5cdH0gY2F0Y2goZSkgeyByZXR1cm4gbnVsbDsgfVxuXHRyZXR1cm4gIXdicmVscyB8fCB3YnJlbHMubGVuZ3RoID09PSAwID8gbnVsbCA6IHdicmVscztcbn1cblxuZnVuY3Rpb24gc2FmZV9wYXJzZV9zaGVldCh6aXAsIHBhdGgvKjpzdHJpbmcqLywgcmVsc1BhdGgvKjpzdHJpbmcqLywgc2hlZXQsIGlkeC8qOm51bWJlciovLCBzaGVldFJlbHMsIHNoZWV0cywgc3R5cGUvKjpzdHJpbmcqLywgb3B0cywgd2IsIHRoZW1lcywgc3R5bGVzKSB7XG5cdHRyeSB7XG5cdFx0c2hlZXRSZWxzW3NoZWV0XT1wYXJzZV9yZWxzKGdldHppcHN0cih6aXAsIHJlbHNQYXRoLCB0cnVlKSwgcGF0aCk7XG5cdFx0dmFyIGRhdGEgPSBnZXR6aXBkYXRhKHppcCwgcGF0aCk7XG5cdFx0dmFyIF93cztcblx0XHRzd2l0Y2goc3R5cGUpIHtcblx0XHRcdGNhc2UgJ3NoZWV0JzogIF93cyA9IHBhcnNlX3dzKGRhdGEsIHBhdGgsIGlkeCwgb3B0cywgc2hlZXRSZWxzW3NoZWV0XSwgd2IsIHRoZW1lcywgc3R5bGVzKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdjaGFydCc6ICBfd3MgPSBwYXJzZV9jcyhkYXRhLCBwYXRoLCBpZHgsIG9wdHMsIHNoZWV0UmVsc1tzaGVldF0sIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG5cdFx0XHRcdGlmKCFfd3MgfHwgIV93c1snIWRyYXdlbCddKSBicmVhaztcblx0XHRcdFx0dmFyIGRmaWxlID0gcmVzb2x2ZV9wYXRoKF93c1snIWRyYXdlbCddLlRhcmdldCwgcGF0aCk7XG5cdFx0XHRcdHZhciBkcmVsc3AgPSBnZXRfcmVsc19wYXRoKGRmaWxlKTtcblx0XHRcdFx0dmFyIGRyYXcgPSBwYXJzZV9kcmF3aW5nKGdldHppcHN0cih6aXAsIGRmaWxlLCB0cnVlKSwgcGFyc2VfcmVscyhnZXR6aXBzdHIoemlwLCBkcmVsc3AsIHRydWUpLCBkZmlsZSkpO1xuXHRcdFx0XHR2YXIgY2hhcnRwID0gcmVzb2x2ZV9wYXRoKGRyYXcsIGRmaWxlKTtcblx0XHRcdFx0dmFyIGNyZWxzcCA9IGdldF9yZWxzX3BhdGgoY2hhcnRwKTtcblx0XHRcdFx0X3dzID0gcGFyc2VfY2hhcnQoZ2V0emlwc3RyKHppcCwgY2hhcnRwLCB0cnVlKSwgY2hhcnRwLCBvcHRzLCBwYXJzZV9yZWxzKGdldHppcHN0cih6aXAsIGNyZWxzcCwgdHJ1ZSksIGNoYXJ0cCksIHdiLCBfd3MpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21hY3JvJzogIF93cyA9IHBhcnNlX21zKGRhdGEsIHBhdGgsIGlkeCwgb3B0cywgc2hlZXRSZWxzW3NoZWV0XSwgd2IsIHRoZW1lcywgc3R5bGVzKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdkaWFsb2cnOiBfd3MgPSBwYXJzZV9kcyhkYXRhLCBwYXRoLCBpZHgsIG9wdHMsIHNoZWV0UmVsc1tzaGVldF0sIHdiLCB0aGVtZXMsIHN0eWxlcyk7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHNoZWV0IHR5cGUgXCIgKyBzdHlwZSk7XG5cdFx0fVxuXHRcdHNoZWV0c1tzaGVldF0gPSBfd3M7XG5cblx0XHQvKiBzY2FuIHJlbHMgZm9yIGNvbW1lbnRzIGFuZCB0aHJlYWRlZCBjb21tZW50cyAqL1xuXHRcdHZhciB0Y29tbWVudHMgPSBbXTtcblx0XHRpZihzaGVldFJlbHMgJiYgc2hlZXRSZWxzW3NoZWV0XSkga2V5cyhzaGVldFJlbHNbc2hlZXRdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcblx0XHRcdHZhciBkZmlsZSA9IFwiXCI7XG5cdFx0XHRpZihzaGVldFJlbHNbc2hlZXRdW25dLlR5cGUgPT0gUkVMUy5DTU5UKSB7XG5cdFx0XHRcdGRmaWxlID0gcmVzb2x2ZV9wYXRoKHNoZWV0UmVsc1tzaGVldF1bbl0uVGFyZ2V0LCBwYXRoKTtcblx0XHRcdFx0dmFyIGNvbW1lbnRzID0gcGFyc2VfY21udChnZXR6aXBkYXRhKHppcCwgZGZpbGUsIHRydWUpLCBkZmlsZSwgb3B0cyk7XG5cdFx0XHRcdGlmKCFjb21tZW50cyB8fCAhY29tbWVudHMubGVuZ3RoKSByZXR1cm47XG5cdFx0XHRcdHNoZWV0X2luc2VydF9jb21tZW50cyhfd3MsIGNvbW1lbnRzLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZihzaGVldFJlbHNbc2hlZXRdW25dLlR5cGUgPT0gUkVMUy5UQ01OVCkge1xuXHRcdFx0XHRkZmlsZSA9IHJlc29sdmVfcGF0aChzaGVldFJlbHNbc2hlZXRdW25dLlRhcmdldCwgcGF0aCk7XG5cdFx0XHRcdHRjb21tZW50cyA9IHRjb21tZW50cy5jb25jYXQocGFyc2VfdGNtbnRfeG1sKGdldHppcGRhdGEoemlwLCBkZmlsZSwgdHJ1ZSksIG9wdHMpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZih0Y29tbWVudHMgJiYgdGNvbW1lbnRzLmxlbmd0aCkgc2hlZXRfaW5zZXJ0X2NvbW1lbnRzKF93cywgdGNvbW1lbnRzLCB0cnVlLCBvcHRzLnBlb3BsZSB8fCBbXSk7XG5cdH0gY2F0Y2goZSkgeyBpZihvcHRzLldURikgdGhyb3cgZTsgfVxufVxuXG5mdW5jdGlvbiBzdHJpcF9mcm9udF9zbGFzaCh4Lyo6c3RyaW5nKi8pLyo6c3RyaW5nKi8geyByZXR1cm4geC5jaGFyQXQoMCkgPT0gJy8nID8geC5zbGljZSgxKSA6IHg7IH1cblxuZnVuY3Rpb24gcGFyc2VfemlwKHppcC8qOlpJUCovLCBvcHRzLyo6P1BhcnNlT3B0cyovKS8qOldvcmtib29rKi8ge1xuXHRtYWtlX3NzZigpO1xuXHRvcHRzID0gb3B0cyB8fCB7fTtcblx0Zml4X3JlYWRfb3B0cyhvcHRzKTtcblxuXHQvKiBPcGVuRG9jdW1lbnQgUGFydCAzIFNlY3Rpb24gMi4yLjEgT3BlbkRvY3VtZW50IFBhY2thZ2UgKi9cblx0aWYoc2FmZWdldHppcGZpbGUoemlwLCAnTUVUQS1JTkYvbWFuaWZlc3QueG1sJykpIHJldHVybiBwYXJzZV9vZHMoemlwLCBvcHRzKTtcblx0LyogVU9DICovXG5cdGlmKHNhZmVnZXR6aXBmaWxlKHppcCwgJ29iamVjdGRhdGEueG1sJykpIHJldHVybiBwYXJzZV9vZHMoemlwLCBvcHRzKTtcblx0LyogTnVtYmVycyAqL1xuXHRpZihzYWZlZ2V0emlwZmlsZSh6aXAsICdJbmRleC9Eb2N1bWVudC5pd2EnKSkge1xuXHRcdGlmKHR5cGVvZiBVaW50OEFycmF5ID09IFwidW5kZWZpbmVkXCIpIHRocm93IG5ldyBFcnJvcignTlVNQkVSUyBmaWxlIHBhcnNpbmcgcmVxdWlyZXMgVWludDhBcnJheSBzdXBwb3J0Jyk7XG5cdFx0aWYodHlwZW9mIHBhcnNlX251bWJlcnNfaXdhICE9IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdGlmKHppcC5GaWxlSW5kZXgpIHJldHVybiBwYXJzZV9udW1iZXJzX2l3YSh6aXApO1xuXHRcdFx0dmFyIF96aXAgPSBDRkIudXRpbHMuY2ZiX25ldygpO1xuXHRcdFx0emlwZW50cmllcyh6aXApLmZvckVhY2goZnVuY3Rpb24oZSkgeyB6aXBfYWRkX2ZpbGUoX3ppcCwgZSwgZ2V0emlwYmluKHppcCwgZSkpOyB9KTtcblx0XHRcdHJldHVybiBwYXJzZV9udW1iZXJzX2l3YShfemlwKTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBOVU1CRVJTIGZpbGUnKTtcblx0fVxuXHRpZighc2FmZWdldHppcGZpbGUoemlwLCAnW0NvbnRlbnRfVHlwZXNdLnhtbCcpKSB7XG5cdFx0aWYoc2FmZWdldHppcGZpbGUoemlwLCAnaW5kZXgueG1sLmd6JykpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgTlVNQkVSUyAwOCBmaWxlJyk7XG5cdFx0aWYoc2FmZWdldHppcGZpbGUoemlwLCAnaW5kZXgueG1sJykpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgTlVNQkVSUyAwOSBmaWxlJyk7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBaSVAgZmlsZScpO1xuXHR9XG5cblx0dmFyIGVudHJpZXMgPSB6aXBlbnRyaWVzKHppcCk7XG5cdHZhciBkaXIgPSBwYXJzZV9jdCgoZ2V0emlwc3RyKHppcCwgJ1tDb250ZW50X1R5cGVzXS54bWwnKS8qOj9hbnkqLykpO1xuXHR2YXIgeGxzYiA9IGZhbHNlO1xuXHR2YXIgc2hlZXRzLCBiaW5uYW1lO1xuXHRpZihkaXIud29ya2Jvb2tzLmxlbmd0aCA9PT0gMCkge1xuXHRcdGJpbm5hbWUgPSBcInhsL3dvcmtib29rLnhtbFwiO1xuXHRcdGlmKGdldHppcGRhdGEoemlwLGJpbm5hbWUsIHRydWUpKSBkaXIud29ya2Jvb2tzLnB1c2goYmlubmFtZSk7XG5cdH1cblx0aWYoZGlyLndvcmtib29rcy5sZW5ndGggPT09IDApIHtcblx0XHRiaW5uYW1lID0gXCJ4bC93b3JrYm9vay5iaW5cIjtcblx0XHRpZighZ2V0emlwZGF0YSh6aXAsYmlubmFtZSx0cnVlKSkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgd29ya2Jvb2tcIik7XG5cdFx0ZGlyLndvcmtib29rcy5wdXNoKGJpbm5hbWUpO1xuXHRcdHhsc2IgPSB0cnVlO1xuXHR9XG5cdGlmKGRpci53b3JrYm9va3NbMF0uc2xpY2UoLTMpID09IFwiYmluXCIpIHhsc2IgPSB0cnVlO1xuXG5cdHZhciB0aGVtZXMgPSAoe30vKjphbnkqLyk7XG5cdHZhciBzdHlsZXMgPSAoe30vKjphbnkqLyk7XG5cdGlmKCFvcHRzLmJvb2tTaGVldHMgJiYgIW9wdHMuYm9va1Byb3BzKSB7XG5cdFx0c3RycyA9IFtdO1xuXHRcdGlmKGRpci5zc3QpIHRyeSB7IHN0cnM9cGFyc2Vfc3N0KGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChkaXIuc3N0KSksIGRpci5zc3QsIG9wdHMpOyB9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cblxuXHRcdGlmKG9wdHMuY2VsbFN0eWxlcyAmJiBkaXIudGhlbWVzLmxlbmd0aCkgdGhlbWVzID0gcGFyc2VfdGhlbWUoZ2V0emlwc3RyKHppcCwgZGlyLnRoZW1lc1swXS5yZXBsYWNlKC9eXFwvLywnJyksIHRydWUpfHxcIlwiLGRpci50aGVtZXNbMF0sIG9wdHMpO1xuXG5cdFx0aWYoZGlyLnN0eWxlKSBzdHlsZXMgPSBwYXJzZV9zdHkoZ2V0emlwZGF0YSh6aXAsIHN0cmlwX2Zyb250X3NsYXNoKGRpci5zdHlsZSkpLCBkaXIuc3R5bGUsIHRoZW1lcywgb3B0cyk7XG5cdH1cblxuXHQvKnZhciBleHRlcm5ib29rcyA9ICovZGlyLmxpbmtzLm1hcChmdW5jdGlvbihsaW5rKSB7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciByZWxzID0gcGFyc2VfcmVscyhnZXR6aXBzdHIoemlwLCBnZXRfcmVsc19wYXRoKHN0cmlwX2Zyb250X3NsYXNoKGxpbmspKSksIGxpbmspO1xuXHRcdFx0cmV0dXJuIHBhcnNlX3hsaW5rKGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChsaW5rKSksIHJlbHMsIGxpbmssIG9wdHMpO1xuXHRcdH0gY2F0Y2goZSkge31cblx0fSk7XG5cblx0dmFyIHdiID0gcGFyc2Vfd2IoZ2V0emlwZGF0YSh6aXAsIHN0cmlwX2Zyb250X3NsYXNoKGRpci53b3JrYm9va3NbMF0pKSwgZGlyLndvcmtib29rc1swXSwgb3B0cyk7XG5cblx0dmFyIHByb3BzID0ge30sIHByb3BkYXRhID0gXCJcIjtcblxuXHRpZihkaXIuY29yZXByb3BzLmxlbmd0aCkge1xuXHRcdHByb3BkYXRhID0gZ2V0emlwZGF0YSh6aXAsIHN0cmlwX2Zyb250X3NsYXNoKGRpci5jb3JlcHJvcHNbMF0pLCB0cnVlKTtcblx0XHRpZihwcm9wZGF0YSkgcHJvcHMgPSBwYXJzZV9jb3JlX3Byb3BzKHByb3BkYXRhKTtcblx0XHRpZihkaXIuZXh0cHJvcHMubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRwcm9wZGF0YSA9IGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChkaXIuZXh0cHJvcHNbMF0pLCB0cnVlKTtcblx0XHRcdGlmKHByb3BkYXRhKSBwYXJzZV9leHRfcHJvcHMocHJvcGRhdGEsIHByb3BzLCBvcHRzKTtcblx0XHR9XG5cdH1cblxuXHR2YXIgY3VzdHByb3BzID0ge307XG5cdGlmKCFvcHRzLmJvb2tTaGVldHMgfHwgb3B0cy5ib29rUHJvcHMpIHtcblx0XHRpZiAoZGlyLmN1c3Rwcm9wcy5sZW5ndGggIT09IDApIHtcblx0XHRcdHByb3BkYXRhID0gZ2V0emlwc3RyKHppcCwgc3RyaXBfZnJvbnRfc2xhc2goZGlyLmN1c3Rwcm9wc1swXSksIHRydWUpO1xuXHRcdFx0aWYocHJvcGRhdGEpIGN1c3Rwcm9wcyA9IHBhcnNlX2N1c3RfcHJvcHMocHJvcGRhdGEsIG9wdHMpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBvdXQgPSAoe30vKjphbnkqLyk7XG5cdGlmKG9wdHMuYm9va1NoZWV0cyB8fCBvcHRzLmJvb2tQcm9wcykge1xuXHRcdGlmKHdiLlNoZWV0cykgc2hlZXRzID0gd2IuU2hlZXRzLm1hcChmdW5jdGlvbiBwbHVjayh4KXsgcmV0dXJuIHgubmFtZTsgfSk7XG5cdFx0ZWxzZSBpZihwcm9wcy5Xb3Jrc2hlZXRzICYmIHByb3BzLlNoZWV0TmFtZXMubGVuZ3RoID4gMCkgc2hlZXRzPXByb3BzLlNoZWV0TmFtZXM7XG5cdFx0aWYob3B0cy5ib29rUHJvcHMpIHsgb3V0LlByb3BzID0gcHJvcHM7IG91dC5DdXN0cHJvcHMgPSBjdXN0cHJvcHM7IH1cblx0XHRpZihvcHRzLmJvb2tTaGVldHMgJiYgdHlwZW9mIHNoZWV0cyAhPT0gJ3VuZGVmaW5lZCcpIG91dC5TaGVldE5hbWVzID0gc2hlZXRzO1xuXHRcdGlmKG9wdHMuYm9va1NoZWV0cyA/IG91dC5TaGVldE5hbWVzIDogb3B0cy5ib29rUHJvcHMpIHJldHVybiBvdXQ7XG5cdH1cblx0c2hlZXRzID0ge307XG5cblx0dmFyIGRlcHMgPSB7fTtcblx0aWYob3B0cy5ib29rRGVwcyAmJiBkaXIuY2FsY2NoYWluKSBkZXBzPXBhcnNlX2NjKGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChkaXIuY2FsY2NoYWluKSksZGlyLmNhbGNjaGFpbixvcHRzKTtcblxuXHR2YXIgaT0wO1xuXHR2YXIgc2hlZXRSZWxzID0gKHt9Lyo6YW55Ki8pO1xuXHR2YXIgcGF0aCwgcmVsc1BhdGg7XG5cblx0e1xuXHRcdHZhciB3YnNoZWV0cyA9IHdiLlNoZWV0cztcblx0XHRwcm9wcy5Xb3Jrc2hlZXRzID0gd2JzaGVldHMubGVuZ3RoO1xuXHRcdHByb3BzLlNoZWV0TmFtZXMgPSBbXTtcblx0XHRmb3IodmFyIGogPSAwOyBqICE9IHdic2hlZXRzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRwcm9wcy5TaGVldE5hbWVzW2pdID0gd2JzaGVldHNbal0ubmFtZTtcblx0XHR9XG5cdH1cblxuXHR2YXIgd2JleHQgPSB4bHNiID8gXCJiaW5cIiA6IFwieG1sXCI7XG5cdHZhciB3YnJlbHNpID0gZGlyLndvcmtib29rc1swXS5sYXN0SW5kZXhPZihcIi9cIik7XG5cdHZhciB3YnJlbHNmaWxlID0gKGRpci53b3JrYm9va3NbMF0uc2xpY2UoMCwgd2JyZWxzaSsxKSArIFwiX3JlbHMvXCIgKyBkaXIud29ya2Jvb2tzWzBdLnNsaWNlKHdicmVsc2krMSkgKyBcIi5yZWxzXCIpLnJlcGxhY2UoL15cXC8vLFwiXCIpO1xuXHRpZighc2FmZWdldHppcGZpbGUoemlwLCB3YnJlbHNmaWxlKSkgd2JyZWxzZmlsZSA9ICd4bC9fcmVscy93b3JrYm9vay4nICsgd2JleHQgKyAnLnJlbHMnO1xuXHR2YXIgd2JyZWxzID0gcGFyc2VfcmVscyhnZXR6aXBzdHIoemlwLCB3YnJlbHNmaWxlLCB0cnVlKSwgd2JyZWxzZmlsZS5yZXBsYWNlKC9fcmVscy4qLywgXCJzNXNcIikpO1xuXG5cdGlmKChkaXIubWV0YWRhdGEgfHwgW10pLmxlbmd0aCA+PSAxKSB7XG5cdFx0LyogVE9ETzogTURYIGFuZCBvdGhlciB0eXBlcyBvZiBtZXRhZGF0YSAqL1xuXHRcdG9wdHMueGxtZXRhID0gcGFyc2VfeGxtZXRhKGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChkaXIubWV0YWRhdGFbMF0pKSxkaXIubWV0YWRhdGFbMF0sb3B0cyk7XG5cdH1cblxuXHRpZigoZGlyLnBlb3BsZSB8fCBbXSkubGVuZ3RoID49IDEpIHtcblx0XHRvcHRzLnBlb3BsZSA9IHBhcnNlX3Blb3BsZV94bWwoZ2V0emlwZGF0YSh6aXAsIHN0cmlwX2Zyb250X3NsYXNoKGRpci5wZW9wbGVbMF0pKSxvcHRzKTtcblx0fVxuXG5cdGlmKHdicmVscykgd2JyZWxzID0gc2FmZV9wYXJzZV93YnJlbHMod2JyZWxzLCB3Yi5TaGVldHMpO1xuXG5cdC8qIE51bWJlcnMgaU9TIGhhY2sgKi9cblx0dmFyIG5tb2RlID0gKGdldHppcGRhdGEoemlwLFwieGwvd29ya3NoZWV0cy9zaGVldC54bWxcIix0cnVlKSk/MTowO1xuXHR3c2xvb3A6IGZvcihpID0gMDsgaSAhPSBwcm9wcy5Xb3Jrc2hlZXRzOyArK2kpIHtcblx0XHR2YXIgc3R5cGUgPSBcInNoZWV0XCI7XG5cdFx0aWYod2JyZWxzICYmIHdicmVsc1tpXSkge1xuXHRcdFx0cGF0aCA9ICd4bC8nICsgKHdicmVsc1tpXVsxXSkucmVwbGFjZSgvW1xcL10/eGxcXC8vLCBcIlwiKTtcblx0XHRcdGlmKCFzYWZlZ2V0emlwZmlsZSh6aXAsIHBhdGgpKSBwYXRoID0gd2JyZWxzW2ldWzFdO1xuXHRcdFx0aWYoIXNhZmVnZXR6aXBmaWxlKHppcCwgcGF0aCkpIHBhdGggPSB3YnJlbHNmaWxlLnJlcGxhY2UoL19yZWxzXFwvLiokLyxcIlwiKSArIHdicmVsc1tpXVsxXTtcblx0XHRcdHN0eXBlID0gd2JyZWxzW2ldWzJdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoID0gJ3hsL3dvcmtzaGVldHMvc2hlZXQnKyhpKzEtbm1vZGUpK1wiLlwiICsgd2JleHQ7XG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKC9zaGVldDBcXC4vLFwic2hlZXQuXCIpO1xuXHRcdH1cblx0XHRyZWxzUGF0aCA9IHBhdGgucmVwbGFjZSgvXiguKikoXFwvKShbXlxcL10qKSQvLCBcIiQxL19yZWxzLyQzLnJlbHNcIik7XG5cdFx0aWYob3B0cyAmJiBvcHRzLnNoZWV0cyAhPSBudWxsKSBzd2l0Y2godHlwZW9mIG9wdHMuc2hlZXRzKSB7XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6IGlmKGkgIT0gb3B0cy5zaGVldHMpIGNvbnRpbnVlIHdzbG9vcDsgYnJlYWs7XG5cdFx0XHRjYXNlIFwic3RyaW5nXCI6IGlmKHByb3BzLlNoZWV0TmFtZXNbaV0udG9Mb3dlckNhc2UoKSAhPSBvcHRzLnNoZWV0cy50b0xvd2VyQ2FzZSgpKSBjb250aW51ZSB3c2xvb3A7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYoQXJyYXkuaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KG9wdHMuc2hlZXRzKSkge1xuXHRcdFx0XHR2YXIgc25qc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHRmb3IodmFyIHNuaiA9IDA7IHNuaiAhPSBvcHRzLnNoZWV0cy5sZW5ndGg7ICsrc25qKSB7XG5cdFx0XHRcdFx0aWYodHlwZW9mIG9wdHMuc2hlZXRzW3Nual0gPT0gXCJudW1iZXJcIiAmJiBvcHRzLnNoZWV0c1tzbmpdID09IGkpIHNuanNlZW49MTtcblx0XHRcdFx0XHRpZih0eXBlb2Ygb3B0cy5zaGVldHNbc25qXSA9PSBcInN0cmluZ1wiICYmIG9wdHMuc2hlZXRzW3Nual0udG9Mb3dlckNhc2UoKSA9PSBwcm9wcy5TaGVldE5hbWVzW2ldLnRvTG93ZXJDYXNlKCkpIHNuanNlZW4gPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFzbmpzZWVuKSBjb250aW51ZSB3c2xvb3A7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNhZmVfcGFyc2Vfc2hlZXQoemlwLCBwYXRoLCByZWxzUGF0aCwgcHJvcHMuU2hlZXROYW1lc1tpXSwgaSwgc2hlZXRSZWxzLCBzaGVldHMsIHN0eXBlLCBvcHRzLCB3YiwgdGhlbWVzLCBzdHlsZXMpO1xuXHR9XG5cblx0b3V0ID0gKHtcblx0XHREaXJlY3Rvcnk6IGRpcixcblx0XHRXb3JrYm9vazogd2IsXG5cdFx0UHJvcHM6IHByb3BzLFxuXHRcdEN1c3Rwcm9wczogY3VzdHByb3BzLFxuXHRcdERlcHM6IGRlcHMsXG5cdFx0U2hlZXRzOiBzaGVldHMsXG5cdFx0U2hlZXROYW1lczogcHJvcHMuU2hlZXROYW1lcyxcblx0XHRTdHJpbmdzOiBzdHJzLFxuXHRcdFN0eWxlczogc3R5bGVzLFxuXHRcdFRoZW1lczogdGhlbWVzLFxuXHRcdFNTRjogZHVwKHRhYmxlX2ZtdClcblx0fS8qOmFueSovKTtcblx0aWYob3B0cyAmJiBvcHRzLmJvb2tGaWxlcykge1xuXHRcdGlmKHppcC5maWxlcykge1xuXHRcdFx0b3V0LmtleXMgPSBlbnRyaWVzO1xuXHRcdFx0b3V0LmZpbGVzID0gemlwLmZpbGVzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXQua2V5cyA9IFtdO1xuXHRcdFx0b3V0LmZpbGVzID0ge307XG5cdFx0XHR6aXAuRnVsbFBhdGhzLmZvckVhY2goZnVuY3Rpb24ocCwgaWR4KSB7XG5cdFx0XHRcdHAgPSBwLnJlcGxhY2UoL15Sb290IEVudHJ5W1xcL10vLCBcIlwiKTtcblx0XHRcdFx0b3V0LmtleXMucHVzaChwKTtcblx0XHRcdFx0b3V0LmZpbGVzW3BdID0gemlwLkZpbGVJbmRleFtpZHhdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdGlmKG9wdHMgJiYgb3B0cy5ib29rVkJBKSB7XG5cdFx0aWYoZGlyLnZiYS5sZW5ndGggPiAwKSBvdXQudmJhcmF3ID0gZ2V0emlwZGF0YSh6aXAsc3RyaXBfZnJvbnRfc2xhc2goZGlyLnZiYVswXSksdHJ1ZSk7XG5cdFx0ZWxzZSBpZihkaXIuZGVmYXVsdHMgJiYgZGlyLmRlZmF1bHRzLmJpbiA9PT0gQ1RfVkJBKSBvdXQudmJhcmF3ID0gZ2V0emlwZGF0YSh6aXAsICd4bC92YmFQcm9qZWN0LmJpbicsdHJ1ZSk7XG5cdH1cblx0cmV0dXJuIG91dDtcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4xLjEgKi9cbmZ1bmN0aW9uIHBhcnNlX3hsc3hjZmIoY2ZiLCBfb3B0cy8qOj9QYXJzZU9wdHMqLykvKjpXb3JrYm9vayovIHtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0dmFyIGYgPSAnV29ya2Jvb2snLCBkYXRhID0gQ0ZCLmZpbmQoY2ZiLCBmKTtcblx0dHJ5IHtcblx0ZiA9ICcvIURhdGFTcGFjZXMvVmVyc2lvbic7XG5cdGRhdGEgPSBDRkIuZmluZChjZmIsIGYpOyBpZighZGF0YSB8fCAhZGF0YS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nIFwiICsgZik7XG5cdC8qdmFyIHZlcnNpb24gPSAqL3BhcnNlX0RhdGFTcGFjZVZlcnNpb25JbmZvKGRhdGEuY29udGVudCk7XG5cblx0LyogMi4zLjQuMSAqL1xuXHRmID0gJy8hRGF0YVNwYWNlcy9EYXRhU3BhY2VNYXAnO1xuXHRkYXRhID0gQ0ZCLmZpbmQoY2ZiLCBmKTsgaWYoIWRhdGEgfHwgIWRhdGEuY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFwiRUNNQS0zNzYgRW5jcnlwdGVkIGZpbGUgbWlzc2luZyBcIiArIGYpO1xuXHR2YXIgZHNtID0gcGFyc2VfRGF0YVNwYWNlTWFwKGRhdGEuY29udGVudCk7XG5cdGlmKGRzbS5sZW5ndGggIT09IDEgfHwgZHNtWzBdLmNvbXBzLmxlbmd0aCAhPT0gMSB8fCBkc21bMF0uY29tcHNbMF0udCAhPT0gMCB8fCBkc21bMF0ubmFtZSAhPT0gXCJTdHJvbmdFbmNyeXB0aW9uRGF0YVNwYWNlXCIgfHwgZHNtWzBdLmNvbXBzWzBdLnYgIT09IFwiRW5jcnlwdGVkUGFja2FnZVwiKVxuXHRcdHRocm93IG5ldyBFcnJvcihcIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIGJhZCBcIiArIGYpO1xuXG5cdC8qIDIuMy40LjIgKi9cblx0ZiA9ICcvIURhdGFTcGFjZXMvRGF0YVNwYWNlSW5mby9TdHJvbmdFbmNyeXB0aW9uRGF0YVNwYWNlJztcblx0ZGF0YSA9IENGQi5maW5kKGNmYiwgZik7IGlmKCFkYXRhIHx8ICFkYXRhLmNvbnRlbnQpIHRocm93IG5ldyBFcnJvcihcIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIG1pc3NpbmcgXCIgKyBmKTtcblx0dmFyIHNlZHMgPSBwYXJzZV9EYXRhU3BhY2VEZWZpbml0aW9uKGRhdGEuY29udGVudCk7XG5cdGlmKHNlZHMubGVuZ3RoICE9IDEgfHwgc2Vkc1swXSAhPSBcIlN0cm9uZ0VuY3J5cHRpb25UcmFuc2Zvcm1cIilcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBiYWQgXCIgKyBmKTtcblxuXHQvKiAyLjMuNC4zICovXG5cdGYgPSAnLyFEYXRhU3BhY2VzL1RyYW5zZm9ybUluZm8vU3Ryb25nRW5jcnlwdGlvblRyYW5zZm9ybS8hUHJpbWFyeSc7XG5cdGRhdGEgPSBDRkIuZmluZChjZmIsIGYpOyBpZighZGF0YSB8fCAhZGF0YS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nIFwiICsgZik7XG5cdC8qdmFyIGhkciA9ICovcGFyc2VfUHJpbWFyeShkYXRhLmNvbnRlbnQpO1xuXHR9IGNhdGNoKGUpIHt9XG5cblx0ZiA9ICcvRW5jcnlwdGlvbkluZm8nO1xuXHRkYXRhID0gQ0ZCLmZpbmQoY2ZiLCBmKTsgaWYoIWRhdGEgfHwgIWRhdGEuY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFwiRUNNQS0zNzYgRW5jcnlwdGVkIGZpbGUgbWlzc2luZyBcIiArIGYpO1xuXHR2YXIgZWluZm8gPSBwYXJzZV9FbmNyeXB0aW9uSW5mbyhkYXRhLmNvbnRlbnQpO1xuXG5cdC8qIDIuMy40LjQgKi9cblx0ZiA9ICcvRW5jcnlwdGVkUGFja2FnZSc7XG5cdGRhdGEgPSBDRkIuZmluZChjZmIsIGYpOyBpZighZGF0YSB8fCAhZGF0YS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nIFwiICsgZik7XG5cbi8qZ2xvYmFsIGRlY3J5cHRfYWdpbGUgKi9cbi8qOjogZGVjbGFyZSB2YXIgZGVjcnlwdF9hZ2lsZTphbnk7ICovXG5cdGlmKGVpbmZvWzBdID09IDB4MDQgJiYgdHlwZW9mIGRlY3J5cHRfYWdpbGUgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZGVjcnlwdF9hZ2lsZShlaW5mb1sxXSwgZGF0YS5jb250ZW50LCBvcHRzLnBhc3N3b3JkIHx8IFwiXCIsIG9wdHMpO1xuLypnbG9iYWwgZGVjcnlwdF9zdGQ3NiAqL1xuLyo6OiBkZWNsYXJlIHZhciBkZWNyeXB0X3N0ZDc2OmFueTsgKi9cblx0aWYoZWluZm9bMF0gPT0gMHgwMiAmJiB0eXBlb2YgZGVjcnlwdF9zdGQ3NiAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBkZWNyeXB0X3N0ZDc2KGVpbmZvWzFdLCBkYXRhLmNvbnRlbnQsIG9wdHMucGFzc3dvcmQgfHwgXCJcIiwgb3B0cyk7XG5cdHRocm93IG5ldyBFcnJvcihcIkZpbGUgaXMgcGFzc3dvcmQtcHJvdGVjdGVkXCIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV96aXAod2IvKjpXb3JrYm9vayovLCBvcHRzLyo6V3JpdGVPcHRzKi8pLyo6WklQKi8ge1xuXHRpZihvcHRzLmJvb2tUeXBlID09IFwib2RzXCIpIHJldHVybiB3cml0ZV9vZHMod2IsIG9wdHMpO1xuXHRpZihvcHRzLmJvb2tUeXBlID09IFwibnVtYmVyc1wiKSByZXR1cm4gd3JpdGVfbnVtYmVyc19pd2Eod2IsIG9wdHMpO1xuXHRpZihvcHRzLmJvb2tUeXBlID09IFwieGxzYlwiKSByZXR1cm4gd3JpdGVfemlwX3hsc3hiKHdiLCBvcHRzKTtcblx0cmV0dXJuIHdyaXRlX3ppcF94bHN4KHdiLCBvcHRzKTtcbn1cblxuLyogWExTWCBhbmQgWExTQiB3cml0aW5nIGFyZSB2ZXJ5IHNpbWlsYXIuICBPcmlnaW5hbGx5IHRoZXkgd2VyZSB1bmlmaWVkIGluIG9uZVxuICAgZXhwb3J0IGZ1bmN0aW9uLiAgVGhpcyBpcyBob3JyaWJsZSBmb3IgdHJlZSBzaGFraW5nIGluIHRoZSBjb21tb24gY2FzZSAobW9zdFxuICAgYXBwbGljYXRpb25zIG5lZWQgdG8gZXhwb3J0IGZpbGVzIGluIG9uZSBmb3JtYXQpIHNvIHRoaXMgZnVuY3Rpb24gc3VwcG9ydHNcbiAgIGJvdGggZm9ybWF0cyB3aGlsZSB3cml0ZV96aXBfeGxzeCBvbmx5IGhhbmRsZXMgWExTWCAqL1xuZnVuY3Rpb24gd3JpdGVfemlwX3hsc3hiKHdiLyo6V29ya2Jvb2sqLywgb3B0cy8qOldyaXRlT3B0cyovKS8qOlpJUCovIHtcblx0X3NoYXBlaWQgPSAxMDI0O1xuXHRpZih3YiAmJiAhd2IuU1NGKSB7XG5cdFx0d2IuU1NGID0gZHVwKHRhYmxlX2ZtdCk7XG5cdH1cblx0aWYod2IgJiYgd2IuU1NGKSB7XG5cdFx0bWFrZV9zc2YoKTsgU1NGX2xvYWRfdGFibGUod2IuU1NGKTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdG9wdHMucmV2c3NmID0gZXZlcnRfbnVtKHdiLlNTRik7IG9wdHMucmV2c3NmW3diLlNTRls2NTUzNV1dID0gMDtcblx0XHRvcHRzLnNzZiA9IHdiLlNTRjtcblx0fVxuXHRvcHRzLnJlbHMgPSB7fTsgb3B0cy53YnJlbHMgPSB7fTtcblx0b3B0cy5TdHJpbmdzID0gLyo6OigoKi9bXS8qOjogOmFueSk6U1NUKSovOyBvcHRzLlN0cmluZ3MuQ291bnQgPSAwOyBvcHRzLlN0cmluZ3MuVW5pcXVlID0gMDtcblx0aWYoYnJvd3Nlcl9oYXNfTWFwKSBvcHRzLnJldlN0cmluZ3MgPSBuZXcgTWFwKCk7XG5cdGVsc2UgeyBvcHRzLnJldlN0cmluZ3MgPSB7fTsgb3B0cy5yZXZTdHJpbmdzLmZvbyA9IFtdOyBkZWxldGUgb3B0cy5yZXZTdHJpbmdzLmZvbzsgfVxuXHR2YXIgd2JleHQgPSBvcHRzLmJvb2tUeXBlID09IFwieGxzYlwiID8gXCJiaW5cIiA6IFwieG1sXCI7XG5cdHZhciB2YmFmbXQgPSBWQkFGTVRTLmluZGV4T2Yob3B0cy5ib29rVHlwZSkgPiAtMTtcblx0dmFyIGN0ID0gbmV3X2N0KCk7XG5cdGZpeF93cml0ZV9vcHRzKG9wdHMgPSBvcHRzIHx8IHt9KTtcblx0dmFyIHppcCA9IHppcF9uZXcoKTtcblx0dmFyIGYgPSBcIlwiLCBySWQgPSAwO1xuXG5cdG9wdHMuY2VsbFhmcyA9IFtdO1xuXHRnZXRfY2VsbF9zdHlsZShvcHRzLmNlbGxYZnMsIHt9LCB7cmV2c3NmOntcIkdlbmVyYWxcIjowfX0pO1xuXG5cdGlmKCF3Yi5Qcm9wcykgd2IuUHJvcHMgPSB7fTtcblxuXHRmID0gXCJkb2NQcm9wcy9jb3JlLnhtbFwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9jb3JlX3Byb3BzKHdiLlByb3BzLCBvcHRzKSk7XG5cdGN0LmNvcmVwcm9wcy5wdXNoKGYpO1xuXHRhZGRfcmVscyhvcHRzLnJlbHMsIDIsIGYsIFJFTFMuQ09SRV9QUk9QUyk7XG5cblx0Lyo6OmlmKCF3Yi5Qcm9wcykgdGhyb3cgXCJ1bnJlYWNoYWJsZVwiOyAqL1xuXHRmID0gXCJkb2NQcm9wcy9hcHAueG1sXCI7XG5cdGlmKHdiLlByb3BzICYmIHdiLlByb3BzLlNoZWV0TmFtZXMpey8qIGVtcHR5ICovfVxuXHRlbHNlIGlmKCF3Yi5Xb3JrYm9vayB8fCAhd2IuV29ya2Jvb2suU2hlZXRzKSB3Yi5Qcm9wcy5TaGVldE5hbWVzID0gd2IuU2hlZXROYW1lcztcblx0ZWxzZSB7XG5cdFx0dmFyIF9zbiA9IFtdO1xuXHRcdGZvcih2YXIgX2kgPSAwOyBfaSA8IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK19pKVxuXHRcdFx0aWYoKHdiLldvcmtib29rLlNoZWV0c1tfaV18fHt9KS5IaWRkZW4gIT0gMikgX3NuLnB1c2god2IuU2hlZXROYW1lc1tfaV0pO1xuXHRcdHdiLlByb3BzLlNoZWV0TmFtZXMgPSBfc247XG5cdH1cblx0d2IuUHJvcHMuV29ya3NoZWV0cyA9IHdiLlByb3BzLlNoZWV0TmFtZXMubGVuZ3RoO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9leHRfcHJvcHMod2IuUHJvcHMsIG9wdHMpKTtcblx0Y3QuZXh0cHJvcHMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy5yZWxzLCAzLCBmLCBSRUxTLkVYVF9QUk9QUyk7XG5cblx0aWYod2IuQ3VzdHByb3BzICE9PSB3Yi5Qcm9wcyAmJiBrZXlzKHdiLkN1c3Rwcm9wc3x8e30pLmxlbmd0aCA+IDApIHtcblx0XHRmID0gXCJkb2NQcm9wcy9jdXN0b20ueG1sXCI7XG5cdFx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfY3VzdF9wcm9wcyh3Yi5DdXN0cHJvcHMsIG9wdHMpKTtcblx0XHRjdC5jdXN0cHJvcHMucHVzaChmKTtcblx0XHRhZGRfcmVscyhvcHRzLnJlbHMsIDQsIGYsIFJFTFMuQ1VTVF9QUk9QUyk7XG5cdH1cblxuXHRmb3IocklkPTE7cklkIDw9IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK3JJZCkge1xuXHRcdHZhciB3c3JlbHMgPSB7JyFpZCc6e319O1xuXHRcdHZhciB3cyA9IHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW3JJZC0xXV07XG5cdFx0dmFyIF90eXBlID0gKHdzIHx8IHt9KVtcIiF0eXBlXCJdIHx8IFwic2hlZXRcIjtcblx0XHRzd2l0Y2goX3R5cGUpIHtcblx0XHRjYXNlIFwiY2hhcnRcIjpcblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZiA9IFwieGwvd29ya3NoZWV0cy9zaGVldFwiICsgcklkICsgXCIuXCIgKyB3YmV4dDtcblx0XHRcdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3dzKHJJZC0xLCBmLCBvcHRzLCB3Yiwgd3NyZWxzKSk7XG5cdFx0XHRjdC5zaGVldHMucHVzaChmKTtcblx0XHRcdGFkZF9yZWxzKG9wdHMud2JyZWxzLCAtMSwgXCJ3b3Jrc2hlZXRzL3NoZWV0XCIgKyBySWQgKyBcIi5cIiArIHdiZXh0LCBSRUxTLldTWzBdKTtcblx0XHR9XG5cblx0XHRpZih3cykge1xuXHRcdFx0dmFyIGNvbW1lbnRzID0gd3NbJyFjb21tZW50cyddO1xuXHRcdFx0dmFyIG5lZWRfdm1sID0gZmFsc2U7XG5cdFx0XHR2YXIgY2YgPSBcIlwiO1xuXHRcdFx0aWYoY29tbWVudHMgJiYgY29tbWVudHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjZiA9IFwieGwvY29tbWVudHNcIiArIHJJZCArIFwiLlwiICsgd2JleHQ7XG5cdFx0XHRcdHppcF9hZGRfZmlsZSh6aXAsIGNmLCB3cml0ZV9jbW50KGNvbW1lbnRzLCBjZiwgb3B0cykpO1xuXHRcdFx0XHRjdC5jb21tZW50cy5wdXNoKGNmKTtcblx0XHRcdFx0YWRkX3JlbHMod3NyZWxzLCAtMSwgXCIuLi9jb21tZW50c1wiICsgcklkICsgXCIuXCIgKyB3YmV4dCwgUkVMUy5DTU5UKTtcblx0XHRcdFx0bmVlZF92bWwgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYod3NbJyFsZWdhY3knXSkge1xuXHRcdFx0XHRpZihuZWVkX3ZtbCkgemlwX2FkZF9maWxlKHppcCwgXCJ4bC9kcmF3aW5ncy92bWxEcmF3aW5nXCIgKyAocklkKSArIFwiLnZtbFwiLCB3cml0ZV9jb21tZW50c192bWwocklkLCB3c1snIWNvbW1lbnRzJ10pKTtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSB3c1snIWNvbW1lbnRzJ107XG5cdFx0XHRkZWxldGUgd3NbJyFsZWdhY3knXTtcblx0XHR9XG5cblx0XHRpZih3c3JlbHNbJyFpZCddLnJJZDEpIHppcF9hZGRfZmlsZSh6aXAsIGdldF9yZWxzX3BhdGgoZiksIHdyaXRlX3JlbHMod3NyZWxzKSk7XG5cdH1cblxuXHRpZihvcHRzLlN0cmluZ3MgIT0gbnVsbCAmJiBvcHRzLlN0cmluZ3MubGVuZ3RoID4gMCkge1xuXHRcdGYgPSBcInhsL3NoYXJlZFN0cmluZ3MuXCIgKyB3YmV4dDtcblx0XHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9zc3Qob3B0cy5TdHJpbmdzLCBmLCBvcHRzKSk7XG5cdFx0Y3Quc3Rycy5wdXNoKGYpO1xuXHRcdGFkZF9yZWxzKG9wdHMud2JyZWxzLCAtMSwgXCJzaGFyZWRTdHJpbmdzLlwiICsgd2JleHQsIFJFTFMuU1NUKTtcblx0fVxuXG5cdGYgPSBcInhsL3dvcmtib29rLlwiICsgd2JleHQ7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3diKHdiLCBmLCBvcHRzKSk7XG5cdGN0Lndvcmtib29rcy5wdXNoKGYpO1xuXHRhZGRfcmVscyhvcHRzLnJlbHMsIDEsIGYsIFJFTFMuV0IpO1xuXG5cdC8qIFRPRE86IHNvbWV0aGluZyBtb3JlIGludGVsbGlnZW50IHdpdGggdGhlbWVzICovXG5cblx0ZiA9IFwieGwvdGhlbWUvdGhlbWUxLnhtbFwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV90aGVtZSh3Yi5UaGVtZXMsIG9wdHMpKTtcblx0Y3QudGhlbWVzLnB1c2goZik7XG5cdGFkZF9yZWxzKG9wdHMud2JyZWxzLCAtMSwgXCJ0aGVtZS90aGVtZTEueG1sXCIsIFJFTFMuVEhFTUUpO1xuXG5cdC8qIFRPRE86IHNvbWV0aGluZyBtb3JlIGludGVsbGlnZW50IHdpdGggc3R5bGVzICovXG5cblx0ZiA9IFwieGwvc3R5bGVzLlwiICsgd2JleHQ7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3N0eSh3YiwgZiwgb3B0cykpO1xuXHRjdC5zdHlsZXMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy53YnJlbHMsIC0xLCBcInN0eWxlcy5cIiArIHdiZXh0LCBSRUxTLlNUWSk7XG5cblx0aWYod2IudmJhcmF3ICYmIHZiYWZtdCkge1xuXHRcdGYgPSBcInhsL3ZiYVByb2plY3QuYmluXCI7XG5cdFx0emlwX2FkZF9maWxlKHppcCwgZiwgd2IudmJhcmF3KTtcblx0XHRjdC52YmEucHVzaChmKTtcblx0XHRhZGRfcmVscyhvcHRzLndicmVscywgLTEsIFwidmJhUHJvamVjdC5iaW5cIiwgUkVMUy5WQkEpO1xuXHR9XG5cblx0ZiA9IFwieGwvbWV0YWRhdGEuXCIgKyB3YmV4dDtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfeGxtZXRhKGYpKTtcblx0Y3QubWV0YWRhdGEucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy53YnJlbHMsIC0xLCBcIm1ldGFkYXRhLlwiICsgd2JleHQsIFJFTFMuWExNRVRBKTtcblxuXHR6aXBfYWRkX2ZpbGUoemlwLCBcIltDb250ZW50X1R5cGVzXS54bWxcIiwgd3JpdGVfY3QoY3QsIG9wdHMpKTtcblx0emlwX2FkZF9maWxlKHppcCwgJ19yZWxzLy5yZWxzJywgd3JpdGVfcmVscyhvcHRzLnJlbHMpKTtcblx0emlwX2FkZF9maWxlKHppcCwgJ3hsL19yZWxzL3dvcmtib29rLicgKyB3YmV4dCArICcucmVscycsIHdyaXRlX3JlbHMob3B0cy53YnJlbHMpKTtcblxuXHRkZWxldGUgb3B0cy5yZXZzc2Y7IGRlbGV0ZSBvcHRzLnNzZjtcblx0cmV0dXJuIHppcDtcbn1cblxuZnVuY3Rpb24gd3JpdGVfemlwX3hsc3god2IvKjpXb3JrYm9vayovLCBvcHRzLyo6V3JpdGVPcHRzKi8pLyo6WklQKi8ge1xuXHRfc2hhcGVpZCA9IDEwMjQ7XG5cdGlmKHdiICYmICF3Yi5TU0YpIHtcblx0XHR3Yi5TU0YgPSBkdXAodGFibGVfZm10KTtcblx0fVxuXHRpZih3YiAmJiB3Yi5TU0YpIHtcblx0XHRtYWtlX3NzZigpOyBTU0ZfbG9hZF90YWJsZSh3Yi5TU0YpO1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0b3B0cy5yZXZzc2YgPSBldmVydF9udW0od2IuU1NGKTsgb3B0cy5yZXZzc2Zbd2IuU1NGWzY1NTM1XV0gPSAwO1xuXHRcdG9wdHMuc3NmID0gd2IuU1NGO1xuXHR9XG5cdG9wdHMucmVscyA9IHt9OyBvcHRzLndicmVscyA9IHt9O1xuXHRvcHRzLlN0cmluZ3MgPSAvKjo6KCgqL1tdLyo6OiA6YW55KTpTU1QpKi87IG9wdHMuU3RyaW5ncy5Db3VudCA9IDA7IG9wdHMuU3RyaW5ncy5VbmlxdWUgPSAwO1xuXHRpZihicm93c2VyX2hhc19NYXApIG9wdHMucmV2U3RyaW5ncyA9IG5ldyBNYXAoKTtcblx0ZWxzZSB7IG9wdHMucmV2U3RyaW5ncyA9IHt9OyBvcHRzLnJldlN0cmluZ3MuZm9vID0gW107IGRlbGV0ZSBvcHRzLnJldlN0cmluZ3MuZm9vOyB9XG5cdHZhciB3YmV4dCA9IFwieG1sXCI7XG5cdHZhciB2YmFmbXQgPSBWQkFGTVRTLmluZGV4T2Yob3B0cy5ib29rVHlwZSkgPiAtMTtcblx0dmFyIGN0ID0gbmV3X2N0KCk7XG5cdGZpeF93cml0ZV9vcHRzKG9wdHMgPSBvcHRzIHx8IHt9KTtcblx0dmFyIHppcCA9IHppcF9uZXcoKTtcblx0dmFyIGYgPSBcIlwiLCBySWQgPSAwO1xuXG5cdG9wdHMuY2VsbFhmcyA9IFtdO1xuXHRnZXRfY2VsbF9zdHlsZShvcHRzLmNlbGxYZnMsIHt9LCB7cmV2c3NmOntcIkdlbmVyYWxcIjowfX0pO1xuXG5cdGlmKCF3Yi5Qcm9wcykgd2IuUHJvcHMgPSB7fTtcblxuXHRmID0gXCJkb2NQcm9wcy9jb3JlLnhtbFwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9jb3JlX3Byb3BzKHdiLlByb3BzLCBvcHRzKSk7XG5cdGN0LmNvcmVwcm9wcy5wdXNoKGYpO1xuXHRhZGRfcmVscyhvcHRzLnJlbHMsIDIsIGYsIFJFTFMuQ09SRV9QUk9QUyk7XG5cblx0Lyo6OmlmKCF3Yi5Qcm9wcykgdGhyb3cgXCJ1bnJlYWNoYWJsZVwiOyAqL1xuXHRmID0gXCJkb2NQcm9wcy9hcHAueG1sXCI7XG5cdGlmKHdiLlByb3BzICYmIHdiLlByb3BzLlNoZWV0TmFtZXMpey8qIGVtcHR5ICovfVxuXHRlbHNlIGlmKCF3Yi5Xb3JrYm9vayB8fCAhd2IuV29ya2Jvb2suU2hlZXRzKSB3Yi5Qcm9wcy5TaGVldE5hbWVzID0gd2IuU2hlZXROYW1lcztcblx0ZWxzZSB7XG5cdFx0dmFyIF9zbiA9IFtdO1xuXHRcdGZvcih2YXIgX2kgPSAwOyBfaSA8IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK19pKVxuXHRcdFx0aWYoKHdiLldvcmtib29rLlNoZWV0c1tfaV18fHt9KS5IaWRkZW4gIT0gMikgX3NuLnB1c2god2IuU2hlZXROYW1lc1tfaV0pO1xuXHRcdHdiLlByb3BzLlNoZWV0TmFtZXMgPSBfc247XG5cdH1cblx0d2IuUHJvcHMuV29ya3NoZWV0cyA9IHdiLlByb3BzLlNoZWV0TmFtZXMubGVuZ3RoO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9leHRfcHJvcHMod2IuUHJvcHMsIG9wdHMpKTtcblx0Y3QuZXh0cHJvcHMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy5yZWxzLCAzLCBmLCBSRUxTLkVYVF9QUk9QUyk7XG5cblx0aWYod2IuQ3VzdHByb3BzICE9PSB3Yi5Qcm9wcyAmJiBrZXlzKHdiLkN1c3Rwcm9wc3x8e30pLmxlbmd0aCA+IDApIHtcblx0XHRmID0gXCJkb2NQcm9wcy9jdXN0b20ueG1sXCI7XG5cdFx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfY3VzdF9wcm9wcyh3Yi5DdXN0cHJvcHMsIG9wdHMpKTtcblx0XHRjdC5jdXN0cHJvcHMucHVzaChmKTtcblx0XHRhZGRfcmVscyhvcHRzLnJlbHMsIDQsIGYsIFJFTFMuQ1VTVF9QUk9QUyk7XG5cdH1cblxuXHR2YXIgcGVvcGxlID0gW1wiU2hlZXRKNVwiXTtcblx0b3B0cy50Y2lkID0gMDtcblxuXHRmb3IocklkPTE7cklkIDw9IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK3JJZCkge1xuXHRcdHZhciB3c3JlbHMgPSB7JyFpZCc6e319O1xuXHRcdHZhciB3cyA9IHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW3JJZC0xXV07XG5cdFx0dmFyIF90eXBlID0gKHdzIHx8IHt9KVtcIiF0eXBlXCJdIHx8IFwic2hlZXRcIjtcblx0XHRzd2l0Y2goX3R5cGUpIHtcblx0XHRjYXNlIFwiY2hhcnRcIjpcblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZiA9IFwieGwvd29ya3NoZWV0cy9zaGVldFwiICsgcklkICsgXCIuXCIgKyB3YmV4dDtcblx0XHRcdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3dzX3htbChySWQtMSwgb3B0cywgd2IsIHdzcmVscykpO1xuXHRcdFx0Y3Quc2hlZXRzLnB1c2goZik7XG5cdFx0XHRhZGRfcmVscyhvcHRzLndicmVscywgLTEsIFwid29ya3NoZWV0cy9zaGVldFwiICsgcklkICsgXCIuXCIgKyB3YmV4dCwgUkVMUy5XU1swXSk7XG5cdFx0fVxuXG5cdFx0aWYod3MpIHtcblx0XHRcdHZhciBjb21tZW50cyA9IHdzWychY29tbWVudHMnXTtcblx0XHRcdHZhciBuZWVkX3ZtbCA9IGZhbHNlO1xuXHRcdFx0dmFyIGNmID0gXCJcIjtcblx0XHRcdGlmKGNvbW1lbnRzICYmIGNvbW1lbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dmFyIG5lZWR0YyA9IGZhbHNlO1xuXHRcdFx0XHRjb21tZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGNhcnIpIHtcblx0XHRcdFx0XHRjYXJyWzFdLmZvckVhY2goZnVuY3Rpb24oYykgeyBpZihjLlQgPT0gdHJ1ZSkgbmVlZHRjID0gdHJ1ZTsgfSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZihuZWVkdGMpIHtcblx0XHRcdFx0XHRjZiA9IFwieGwvdGhyZWFkZWRDb21tZW50cy90aHJlYWRlZENvbW1lbnRcIiArIHJJZCArIFwiLlwiICsgd2JleHQ7XG5cdFx0XHRcdFx0emlwX2FkZF9maWxlKHppcCwgY2YsIHdyaXRlX3RjbW50X3htbChjb21tZW50cywgcGVvcGxlLCBvcHRzKSk7XG5cdFx0XHRcdFx0Y3QudGhyZWFkZWRjb21tZW50cy5wdXNoKGNmKTtcblx0XHRcdFx0XHRhZGRfcmVscyh3c3JlbHMsIC0xLCBcIi4uL3RocmVhZGVkQ29tbWVudHMvdGhyZWFkZWRDb21tZW50XCIgKyBySWQgKyBcIi5cIiArIHdiZXh0LCBSRUxTLlRDTU5UKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNmID0gXCJ4bC9jb21tZW50c1wiICsgcklkICsgXCIuXCIgKyB3YmV4dDtcblx0XHRcdFx0emlwX2FkZF9maWxlKHppcCwgY2YsIHdyaXRlX2NvbW1lbnRzX3htbChjb21tZW50cywgb3B0cykpO1xuXHRcdFx0XHRjdC5jb21tZW50cy5wdXNoKGNmKTtcblx0XHRcdFx0YWRkX3JlbHMod3NyZWxzLCAtMSwgXCIuLi9jb21tZW50c1wiICsgcklkICsgXCIuXCIgKyB3YmV4dCwgUkVMUy5DTU5UKTtcblx0XHRcdFx0bmVlZF92bWwgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYod3NbJyFsZWdhY3knXSkge1xuXHRcdFx0XHRpZihuZWVkX3ZtbCkgemlwX2FkZF9maWxlKHppcCwgXCJ4bC9kcmF3aW5ncy92bWxEcmF3aW5nXCIgKyAocklkKSArIFwiLnZtbFwiLCB3cml0ZV9jb21tZW50c192bWwocklkLCB3c1snIWNvbW1lbnRzJ10pKTtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSB3c1snIWNvbW1lbnRzJ107XG5cdFx0XHRkZWxldGUgd3NbJyFsZWdhY3knXTtcblx0XHR9XG5cblx0XHRpZih3c3JlbHNbJyFpZCddLnJJZDEpIHppcF9hZGRfZmlsZSh6aXAsIGdldF9yZWxzX3BhdGgoZiksIHdyaXRlX3JlbHMod3NyZWxzKSk7XG5cdH1cblxuXHRpZihvcHRzLlN0cmluZ3MgIT0gbnVsbCAmJiBvcHRzLlN0cmluZ3MubGVuZ3RoID4gMCkge1xuXHRcdGYgPSBcInhsL3NoYXJlZFN0cmluZ3MuXCIgKyB3YmV4dDtcblx0XHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9zc3RfeG1sKG9wdHMuU3RyaW5ncywgb3B0cykpO1xuXHRcdGN0LnN0cnMucHVzaChmKTtcblx0XHRhZGRfcmVscyhvcHRzLndicmVscywgLTEsIFwic2hhcmVkU3RyaW5ncy5cIiArIHdiZXh0LCBSRUxTLlNTVCk7XG5cdH1cblxuXHRmID0gXCJ4bC93b3JrYm9vay5cIiArIHdiZXh0O1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV93Yl94bWwod2IsIG9wdHMpKTtcblx0Y3Qud29ya2Jvb2tzLnB1c2goZik7XG5cdGFkZF9yZWxzKG9wdHMucmVscywgMSwgZiwgUkVMUy5XQik7XG5cblx0LyogVE9ETzogc29tZXRoaW5nIG1vcmUgaW50ZWxsaWdlbnQgd2l0aCB0aGVtZXMgKi9cblxuXHRmID0gXCJ4bC90aGVtZS90aGVtZTEueG1sXCI7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3RoZW1lKHdiLlRoZW1lcywgb3B0cykpO1xuXHRjdC50aGVtZXMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy53YnJlbHMsIC0xLCBcInRoZW1lL3RoZW1lMS54bWxcIiwgUkVMUy5USEVNRSk7XG5cblx0LyogVE9ETzogc29tZXRoaW5nIG1vcmUgaW50ZWxsaWdlbnQgd2l0aCBzdHlsZXMgKi9cblxuXHRmID0gXCJ4bC9zdHlsZXMuXCIgKyB3YmV4dDtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfc3R5X3htbCh3Yiwgb3B0cykpO1xuXHRjdC5zdHlsZXMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy53YnJlbHMsIC0xLCBcInN0eWxlcy5cIiArIHdiZXh0LCBSRUxTLlNUWSk7XG5cblx0aWYod2IudmJhcmF3ICYmIHZiYWZtdCkge1xuXHRcdGYgPSBcInhsL3ZiYVByb2plY3QuYmluXCI7XG5cdFx0emlwX2FkZF9maWxlKHppcCwgZiwgd2IudmJhcmF3KTtcblx0XHRjdC52YmEucHVzaChmKTtcblx0XHRhZGRfcmVscyhvcHRzLndicmVscywgLTEsIFwidmJhUHJvamVjdC5iaW5cIiwgUkVMUy5WQkEpO1xuXHR9XG5cblx0ZiA9IFwieGwvbWV0YWRhdGEuXCIgKyB3YmV4dDtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfeGxtZXRhX3htbCgpKTtcblx0Y3QubWV0YWRhdGEucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy53YnJlbHMsIC0xLCBcIm1ldGFkYXRhLlwiICsgd2JleHQsIFJFTFMuWExNRVRBKTtcblxuXHRpZihwZW9wbGUubGVuZ3RoID4gMSkge1xuXHRcdGYgPSBcInhsL3BlcnNvbnMvcGVyc29uLnhtbFwiO1xuXHRcdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3Blb3BsZV94bWwocGVvcGxlLCBvcHRzKSk7XG5cdFx0Y3QucGVvcGxlLnB1c2goZik7XG5cdFx0YWRkX3JlbHMob3B0cy53YnJlbHMsIC0xLCBcInBlcnNvbnMvcGVyc29uLnhtbFwiLCBSRUxTLlBFT1BMRSk7XG5cdH1cblxuXHR6aXBfYWRkX2ZpbGUoemlwLCBcIltDb250ZW50X1R5cGVzXS54bWxcIiwgd3JpdGVfY3QoY3QsIG9wdHMpKTtcblx0emlwX2FkZF9maWxlKHppcCwgJ19yZWxzLy5yZWxzJywgd3JpdGVfcmVscyhvcHRzLnJlbHMpKTtcblx0emlwX2FkZF9maWxlKHppcCwgJ3hsL19yZWxzL3dvcmtib29rLicgKyB3YmV4dCArICcucmVscycsIHdyaXRlX3JlbHMob3B0cy53YnJlbHMpKTtcblxuXHRkZWxldGUgb3B0cy5yZXZzc2Y7IGRlbGV0ZSBvcHRzLnNzZjtcblx0cmV0dXJuIHppcDtcbn1cblxuZnVuY3Rpb24gZmlyc3RieXRlKGYvKjpSYXdEYXRhKi8sby8qOj9UeXBlT3B0cyovKS8qOkFycmF5PG51bWJlcj4qLyB7XG5cdHZhciB4ID0gXCJcIjtcblx0c3dpdGNoKChvfHx7fSkudHlwZSB8fCBcImJhc2U2NFwiKSB7XG5cdFx0Y2FzZSAnYnVmZmVyJzogcmV0dXJuIFtmWzBdLCBmWzFdLCBmWzJdLCBmWzNdLCBmWzRdLCBmWzVdLCBmWzZdLCBmWzddXTtcblx0XHRjYXNlICdiYXNlNjQnOiB4ID0gQmFzZTY0X2RlY29kZShmLnNsaWNlKDAsMTIpKTsgYnJlYWs7XG5cdFx0Y2FzZSAnYmluYXJ5JzogeCA9IGY7IGJyZWFrO1xuXHRcdGNhc2UgJ2FycmF5JzogIHJldHVybiBbZlswXSwgZlsxXSwgZlsyXSwgZlszXSwgZls0XSwgZls1XSwgZls2XSwgZls3XV07XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHR5cGUgXCIgKyAobyAmJiBvLnR5cGUgfHwgXCJ1bmRlZmluZWRcIikpO1xuXHR9XG5cdHJldHVybiBbeC5jaGFyQ29kZUF0KDApLCB4LmNoYXJDb2RlQXQoMSksIHguY2hhckNvZGVBdCgyKSwgeC5jaGFyQ29kZUF0KDMpLCB4LmNoYXJDb2RlQXQoNCksIHguY2hhckNvZGVBdCg1KSwgeC5jaGFyQ29kZUF0KDYpLCB4LmNoYXJDb2RlQXQoNyldO1xufVxuXG5mdW5jdGlvbiByZWFkX2NmYihjZmIvKjpDRkJDb250YWluZXIqLywgb3B0cy8qOj9QYXJzZU9wdHMqLykvKjpXb3JrYm9vayovIHtcblx0aWYoQ0ZCLmZpbmQoY2ZiLCBcIkVuY3J5cHRlZFBhY2thZ2VcIikpIHJldHVybiBwYXJzZV94bHN4Y2ZiKGNmYiwgb3B0cyk7XG5cdHJldHVybiBwYXJzZV94bHNjZmIoY2ZiLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gcmVhZF96aXAoZGF0YS8qOlJhd0RhdGEqLywgb3B0cy8qOj9QYXJzZU9wdHMqLykvKjpXb3JrYm9vayovIHtcblx0dmFyIHppcCwgZCA9IGRhdGE7XG5cdHZhciBvID0gb3B0c3x8e307XG5cdGlmKCFvLnR5cGUpIG8udHlwZSA9IChoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgPyBcImJ1ZmZlclwiIDogXCJiYXNlNjRcIjtcblx0emlwID0gemlwX3JlYWQoZCwgbyk7XG5cdHJldHVybiBwYXJzZV96aXAoemlwLCBvKTtcbn1cblxuZnVuY3Rpb24gcmVhZF9wbGFpbnRleHQoZGF0YS8qOnN0cmluZyovLCBvLyo6UGFyc2VPcHRzKi8pLyo6V29ya2Jvb2sqLyB7XG5cdHZhciBpID0gMDtcblx0bWFpbjogd2hpbGUoaSA8IGRhdGEubGVuZ3RoKSBzd2l0Y2goZGF0YS5jaGFyQ29kZUF0KGkpKSB7XG5cdFx0Y2FzZSAweDBBOiBjYXNlIDB4MEQ6IGNhc2UgMHgyMDogKytpOyBicmVhaztcblx0XHRjYXNlIDB4M0M6IHJldHVybiBwYXJzZV94bG1sKGRhdGEuc2xpY2UoaSksbyk7XG5cdFx0ZGVmYXVsdDogYnJlYWsgbWFpbjtcblx0fVxuXHRyZXR1cm4gUFJOLnRvX3dvcmtib29rKGRhdGEsIG8pO1xufVxuXG5mdW5jdGlvbiByZWFkX3BsYWludGV4dF9yYXcoZGF0YS8qOlJhd0RhdGEqLywgby8qOlBhcnNlT3B0cyovKS8qOldvcmtib29rKi8ge1xuXHR2YXIgc3RyID0gXCJcIiwgYnl0ZXMgPSBmaXJzdGJ5dGUoZGF0YSwgbyk7XG5cdHN3aXRjaChvLnR5cGUpIHtcblx0XHRjYXNlICdiYXNlNjQnOiBzdHIgPSBCYXNlNjRfZGVjb2RlKGRhdGEpOyBicmVhaztcblx0XHRjYXNlICdiaW5hcnknOiBzdHIgPSBkYXRhOyBicmVhaztcblx0XHRjYXNlICdidWZmZXInOiBzdHIgPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknKTsgYnJlYWs7XG5cdFx0Y2FzZSAnYXJyYXknOiBzdHIgPSBjYzJzdHIoZGF0YSk7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgby50eXBlKTtcblx0fVxuXHRpZihieXRlc1swXSA9PSAweEVGICYmIGJ5dGVzWzFdID09IDB4QkIgJiYgYnl0ZXNbMl0gPT0gMHhCRikgc3RyID0gdXRmOHJlYWQoc3RyKTtcblx0by50eXBlID0gXCJiaW5hcnlcIjtcblx0cmV0dXJuIHJlYWRfcGxhaW50ZXh0KHN0ciwgbyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRfdXRmMTYoZGF0YS8qOlJhd0RhdGEqLywgby8qOlBhcnNlT3B0cyovKS8qOldvcmtib29rKi8ge1xuXHR2YXIgZCA9IGRhdGE7XG5cdGlmKG8udHlwZSA9PSAnYmFzZTY0JykgZCA9IEJhc2U2NF9kZWNvZGUoZCk7XG5cdGQgPSAkY3B0YWJsZS51dGlscy5kZWNvZGUoMTIwMCwgZC5zbGljZSgyKSwgJ3N0cicpO1xuXHRvLnR5cGUgPSBcImJpbmFyeVwiO1xuXHRyZXR1cm4gcmVhZF9wbGFpbnRleHQoZCwgbyk7XG59XG5cbmZ1bmN0aW9uIGJzdHJpZnkoZGF0YS8qOnN0cmluZyovKS8qOnN0cmluZyovIHtcblx0cmV0dXJuICFkYXRhLm1hdGNoKC9bXlxceDAwLVxceDdGXS8pID8gZGF0YSA6IHV0Zjh3cml0ZShkYXRhKTtcbn1cblxuZnVuY3Rpb24gcmVhZF9wcm4oZGF0YSwgZCwgbywgc3RyKSB7XG5cdGlmKHN0cikgeyBvLnR5cGUgPSBcInN0cmluZ1wiOyByZXR1cm4gUFJOLnRvX3dvcmtib29rKGRhdGEsIG8pOyB9XG5cdHJldHVybiBQUk4udG9fd29ya2Jvb2soZCwgbyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTeW5jKGRhdGEvKjpSYXdEYXRhKi8sIG9wdHMvKjo/UGFyc2VPcHRzKi8pLyo6V29ya2Jvb2sqLyB7XG5cdHJlc2V0X2NwKCk7XG5cdHZhciBvID0gb3B0c3x8e307XG5cdGlmKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gcmVhZFN5bmMobmV3IFVpbnQ4QXJyYXkoZGF0YSksIChvID0gZHVwKG8pLCBvLnR5cGUgPSBcImFycmF5XCIsIG8pKTtcblx0aWYodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmICFvLnR5cGUpIG8udHlwZSA9IHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiID8gXCJidWZmZXJcIiA6IFwiYXJyYXlcIjtcblx0dmFyIGQgPSBkYXRhLCBuID0gWzAsMCwwLDBdLCBzdHIgPSBmYWxzZTtcblx0aWYoby5jZWxsU3R5bGVzKSB7IG8uY2VsbE5GID0gdHJ1ZTsgby5zaGVldFN0dWJzID0gdHJ1ZTsgfVxuXHRfc3Nmb3B0cyA9IHt9O1xuXHRpZihvLmRhdGVORikgX3NzZm9wdHMuZGF0ZU5GID0gby5kYXRlTkY7XG5cdGlmKCFvLnR5cGUpIG8udHlwZSA9IChoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgPyBcImJ1ZmZlclwiIDogXCJiYXNlNjRcIjtcblx0aWYoby50eXBlID09IFwiZmlsZVwiKSB7IG8udHlwZSA9IGhhc19idWYgPyBcImJ1ZmZlclwiIDogXCJiaW5hcnlcIjsgZCA9IHJlYWRfYmluYXJ5KGRhdGEpOyBpZih0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWhhc19idWYpIG8udHlwZSA9IFwiYXJyYXlcIjsgfVxuXHRpZihvLnR5cGUgPT0gXCJzdHJpbmdcIikgeyBzdHIgPSB0cnVlOyBvLnR5cGUgPSBcImJpbmFyeVwiOyBvLmNvZGVwYWdlID0gNjUwMDE7IGQgPSBic3RyaWZ5KGRhdGEpOyB9XG5cdGlmKG8udHlwZSA9PSAnYXJyYXknICYmIHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHR2YXIgYWI9bmV3IEFycmF5QnVmZmVyKDMpLCB2dT1uZXcgVWludDhBcnJheShhYik7IHZ1LmZvbz1cImJhclwiO1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0aWYoIXZ1LmZvbykge289ZHVwKG8pOyBvLnR5cGU9J2FycmF5JzsgcmV0dXJuIHJlYWRTeW5jKGFiMmEoZCksIG8pO31cblx0fVxuXHRzd2l0Y2goKG4gPSBmaXJzdGJ5dGUoZCwgbykpWzBdKSB7XG5cdFx0Y2FzZSAweEQwOiBpZihuWzFdID09PSAweENGICYmIG5bMl0gPT09IDB4MTEgJiYgblszXSA9PT0gMHhFMCAmJiBuWzRdID09PSAweEExICYmIG5bNV0gPT09IDB4QjEgJiYgbls2XSA9PT0gMHgxQSAmJiBuWzddID09PSAweEUxKSByZXR1cm4gcmVhZF9jZmIoQ0ZCLnJlYWQoZCwgbyksIG8pOyBicmVhaztcblx0XHRjYXNlIDB4MDk6IGlmKG5bMV0gPD0gMHgwOCkgcmV0dXJuIHBhcnNlX3hsc2NmYihkLCBvKTsgYnJlYWs7XG5cdFx0Y2FzZSAweDNDOiByZXR1cm4gcGFyc2VfeGxtbChkLCBvKTtcblx0XHRjYXNlIDB4NDk6XG5cdFx0XHRpZihuWzFdID09PSAweDQ5ICYmIG5bMl0gPT09IDB4MmEgJiYgblszXSA9PT0gMHgwMCkgdGhyb3cgbmV3IEVycm9yKFwiVElGRiBJbWFnZSBGaWxlIGlzIG5vdCBhIHNwcmVhZHNoZWV0XCIpO1xuXHRcdFx0aWYoblsxXSA9PT0gMHg0NCkgcmV0dXJuIHJlYWRfd2JfSUQoZCwgbyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDB4NTQ6IGlmKG5bMV0gPT09IDB4NDEgJiYgblsyXSA9PT0gMHg0MiAmJiBuWzNdID09PSAweDRDKSByZXR1cm4gRElGLnRvX3dvcmtib29rKGQsIG8pOyBicmVhaztcblx0XHRjYXNlIDB4NTA6IHJldHVybiAoblsxXSA9PT0gMHg0QiAmJiBuWzJdIDwgMHgwOSAmJiBuWzNdIDwgMHgwOSkgPyByZWFkX3ppcChkLCBvKSA6IHJlYWRfcHJuKGRhdGEsIGQsIG8sIHN0cik7XG5cdFx0Y2FzZSAweEVGOiByZXR1cm4gblszXSA9PT0gMHgzQyA/IHBhcnNlX3hsbWwoZCwgbykgOiByZWFkX3BybihkYXRhLCBkLCBvLCBzdHIpO1xuXHRcdGNhc2UgMHhGRjpcblx0XHRcdGlmKG5bMV0gPT09IDB4RkUpIHsgcmV0dXJuIHJlYWRfdXRmMTYoZCwgbyk7IH1cblx0XHRcdGVsc2UgaWYoblsxXSA9PT0gMHgwMCAmJiBuWzJdID09PSAweDAyICYmIG5bM10gPT09IDB4MDApIHJldHVybiBXS18udG9fd29ya2Jvb2soZCwgbyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDB4MDA6XG5cdFx0XHRpZihuWzFdID09PSAweDAwKSB7XG5cdFx0XHRcdGlmKG5bMl0gPj0gMHgwMiAmJiBuWzNdID09PSAweDAwKSByZXR1cm4gV0tfLnRvX3dvcmtib29rKGQsIG8pO1xuXHRcdFx0XHRpZihuWzJdID09PSAweDAwICYmIChuWzNdID09PSAweDA4IHx8IG5bM10gPT09IDB4MDkpKSByZXR1cm4gV0tfLnRvX3dvcmtib29rKGQsIG8pO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAweDAzOiBjYXNlIDB4ODM6IGNhc2UgMHg4QjogY2FzZSAweDhDOiByZXR1cm4gREJGLnRvX3dvcmtib29rKGQsIG8pO1xuXHRcdGNhc2UgMHg3QjogaWYoblsxXSA9PT0gMHg1QyAmJiBuWzJdID09PSAweDcyICYmIG5bM10gPT09IDB4NzQpIHJldHVybiBSVEYudG9fd29ya2Jvb2soZCwgbyk7IGJyZWFrO1xuXHRcdGNhc2UgMHgwQTogY2FzZSAweDBEOiBjYXNlIDB4MjA6IHJldHVybiByZWFkX3BsYWludGV4dF9yYXcoZCwgbyk7XG5cdFx0Y2FzZSAweDg5OiBpZihuWzFdID09PSAweDUwICYmIG5bMl0gPT09IDB4NEUgJiYgblszXSA9PT0gMHg0NykgdGhyb3cgbmV3IEVycm9yKFwiUE5HIEltYWdlIEZpbGUgaXMgbm90IGEgc3ByZWFkc2hlZXRcIik7IGJyZWFrO1xuXHR9XG5cdGlmKERCRl9TVVBQT1JURURfVkVSU0lPTlMuaW5kZXhPZihuWzBdKSA+IC0xICYmIG5bMl0gPD0gMTIgJiYgblszXSA8PSAzMSkgcmV0dXJuIERCRi50b193b3JrYm9vayhkLCBvKTtcblx0cmV0dXJuIHJlYWRfcHJuKGRhdGEsIGQsIG8sIHN0cik7XG59XG5cbmZ1bmN0aW9uIHJlYWRGaWxlU3luYyhmaWxlbmFtZS8qOnN0cmluZyovLCBvcHRzLyo6P1BhcnNlT3B0cyovKS8qOldvcmtib29rKi8ge1xuXHR2YXIgbyA9IG9wdHN8fHt9OyBvLnR5cGUgPSAnZmlsZSc7XG5cdHJldHVybiByZWFkU3luYyhmaWxlbmFtZSwgbyk7XG59XG5mdW5jdGlvbiB3cml0ZV9jZmJfY3RyKGNmYi8qOkNGQkNvbnRhaW5lciovLCBvLyo6V3JpdGVPcHRzKi8pLyo6YW55Ki8ge1xuXHRzd2l0Y2goby50eXBlKSB7XG5cdFx0Y2FzZSBcImJhc2U2NFwiOiBjYXNlIFwiYmluYXJ5XCI6IGJyZWFrO1xuXHRcdGNhc2UgXCJidWZmZXJcIjogY2FzZSBcImFycmF5XCI6IG8udHlwZSA9IFwiXCI7IGJyZWFrO1xuXHRcdGNhc2UgXCJmaWxlXCI6IHJldHVybiB3cml0ZV9kbChvLmZpbGUsIENGQi53cml0ZShjZmIsIHt0eXBlOmhhc19idWYgPyAnYnVmZmVyJyA6IFwiXCJ9KSk7XG5cdFx0Y2FzZSBcInN0cmluZ1wiOiB0aHJvdyBuZXcgRXJyb3IoXCInc3RyaW5nJyBvdXRwdXQgdHlwZSBpbnZhbGlkIGZvciAnXCIgKyBvLmJvb2tUeXBlICsgXCInIGZpbGVzXCIpO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgby50eXBlKTtcblx0fVxuXHRyZXR1cm4gQ0ZCLndyaXRlKGNmYiwgbyk7XG59XG5cbi8qOjogZGVjbGFyZSB2YXIgZW5jcnlwdF9hZ2lsZTphbnk7ICovXG5mdW5jdGlvbiB3cml0ZV96aXBfdHlwZSh3Yi8qOldvcmtib29rKi8sIG9wdHMvKjo/V3JpdGVPcHRzKi8pLyo6YW55Ki8ge1xuXHR2YXIgbyA9IGR1cChvcHRzfHx7fSk7XG5cdHZhciB6ID0gd3JpdGVfemlwKHdiLCBvKTtcblx0cmV0dXJuIHdyaXRlX3ppcF9kZW5vdWVtZW50KHosIG8pO1xufVxuZnVuY3Rpb24gd3JpdGVfemlwX3R5cGVYTFNYKHdiLyo6V29ya2Jvb2sqLywgb3B0cy8qOj9Xcml0ZU9wdHMqLykvKjphbnkqLyB7XG5cdHZhciBvID0gZHVwKG9wdHN8fHt9KTtcblx0dmFyIHogPSB3cml0ZV96aXBfeGxzeCh3Yiwgbyk7XG5cdHJldHVybiB3cml0ZV96aXBfZGVub3VlbWVudCh6LCBvKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3ppcF9kZW5vdWVtZW50KHovKjphbnkqLywgby8qOj9Xcml0ZU9wdHMqLykvKjphbnkqLyB7XG5cdHZhciBvb3B0cyA9IHt9O1xuXHR2YXIgZnR5cGUgPSBoYXNfYnVmID8gXCJub2RlYnVmZmVyXCIgOiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCIgPyBcImFycmF5XCIgOiBcInN0cmluZ1wiKTtcblx0aWYoby5jb21wcmVzc2lvbikgb29wdHMuY29tcHJlc3Npb24gPSAnREVGTEFURSc7XG5cdGlmKG8ucGFzc3dvcmQpIG9vcHRzLnR5cGUgPSBmdHlwZTtcblx0ZWxzZSBzd2l0Y2goby50eXBlKSB7XG5cdFx0Y2FzZSBcImJhc2U2NFwiOiBvb3B0cy50eXBlID0gXCJiYXNlNjRcIjsgYnJlYWs7XG5cdFx0Y2FzZSBcImJpbmFyeVwiOiBvb3B0cy50eXBlID0gXCJzdHJpbmdcIjsgYnJlYWs7XG5cdFx0Y2FzZSBcInN0cmluZ1wiOiB0aHJvdyBuZXcgRXJyb3IoXCInc3RyaW5nJyBvdXRwdXQgdHlwZSBpbnZhbGlkIGZvciAnXCIgKyBvLmJvb2tUeXBlICsgXCInIGZpbGVzXCIpO1xuXHRcdGNhc2UgXCJidWZmZXJcIjpcblx0XHRjYXNlIFwiZmlsZVwiOiBvb3B0cy50eXBlID0gZnR5cGU7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgby50eXBlKTtcblx0fVxuXHR2YXIgb3V0ID0gei5GdWxsUGF0aHMgPyBDRkIud3JpdGUoeiwge2ZpbGVUeXBlOlwiemlwXCIsIHR5cGU6IC8qOjooKi97XCJub2RlYnVmZmVyXCI6IFwiYnVmZmVyXCIsIFwic3RyaW5nXCI6IFwiYmluYXJ5XCJ9Lyo6OiA6YW55KSovW29vcHRzLnR5cGVdIHx8IG9vcHRzLnR5cGUsIGNvbXByZXNzaW9uOiAhIW8uY29tcHJlc3Npb259KSA6IHouZ2VuZXJhdGUob29wdHMpO1xuXHRpZih0eXBlb2YgRGVubyAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdGlmKHR5cGVvZiBvdXQgPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYoby50eXBlID09IFwiYmluYXJ5XCIgfHwgby50eXBlID09IFwiYmFzZTY0XCIpIHJldHVybiBvdXQ7XG5cdFx0XHRvdXQgPSBuZXcgVWludDhBcnJheShzMmFiKG91dCkpO1xuXHRcdH1cblx0fVxuLypqc2hpbnQgLVcwODMgKi9cblx0aWYoby5wYXNzd29yZCAmJiB0eXBlb2YgZW5jcnlwdF9hZ2lsZSAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiB3cml0ZV9jZmJfY3RyKGVuY3J5cHRfYWdpbGUob3V0LCBvLnBhc3N3b3JkKSwgbyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbi8qanNoaW50ICtXMDgzICovXG5cdGlmKG8udHlwZSA9PT0gXCJmaWxlXCIpIHJldHVybiB3cml0ZV9kbChvLmZpbGUsIG91dCk7XG5cdHJldHVybiBvLnR5cGUgPT0gXCJzdHJpbmdcIiA/IHV0ZjhyZWFkKC8qOjooKi9vdXQvKjo6IDphbnkpKi8pIDogb3V0O1xufVxuXG5mdW5jdGlvbiB3cml0ZV9jZmJfdHlwZSh3Yi8qOldvcmtib29rKi8sIG9wdHMvKjo/V3JpdGVPcHRzKi8pLyo6YW55Ki8ge1xuXHR2YXIgbyA9IG9wdHN8fHt9O1xuXHR2YXIgY2ZiLyo6Q0ZCQ29udGFpbmVyKi8gPSB3cml0ZV94bHNjZmIod2IsIG8pO1xuXHRyZXR1cm4gd3JpdGVfY2ZiX2N0cihjZmIsIG8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9zdHJpbmdfdHlwZShvdXQvKjpzdHJpbmcqLywgb3B0cy8qOldyaXRlT3B0cyovLCBib20vKjo/c3RyaW5nKi8pLyo6YW55Ki8ge1xuXHRpZighYm9tKSBib20gPSBcIlwiO1xuXHR2YXIgbyA9IGJvbSArIG91dDtcblx0c3dpdGNoKG9wdHMudHlwZSkge1xuXHRcdGNhc2UgXCJiYXNlNjRcIjogcmV0dXJuIEJhc2U2NF9lbmNvZGUodXRmOHdyaXRlKG8pKTtcblx0XHRjYXNlIFwiYmluYXJ5XCI6IHJldHVybiB1dGY4d3JpdGUobyk7XG5cdFx0Y2FzZSBcInN0cmluZ1wiOiByZXR1cm4gb3V0O1xuXHRcdGNhc2UgXCJmaWxlXCI6IHJldHVybiB3cml0ZV9kbChvcHRzLmZpbGUsIG8sICd1dGY4Jyk7XG5cdFx0Y2FzZSBcImJ1ZmZlclwiOiB7XG5cdFx0XHRpZihoYXNfYnVmKSByZXR1cm4gQnVmZmVyX2Zyb20obywgJ3V0ZjgnKTtcblx0XHRcdGVsc2UgaWYodHlwZW9mIFRleHRFbmNvZGVyICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG8pO1xuXHRcdFx0ZWxzZSByZXR1cm4gd3JpdGVfc3RyaW5nX3R5cGUobywge3R5cGU6J2JpbmFyeSd9KS5zcGxpdChcIlwiKS5tYXAoZnVuY3Rpb24oYykgeyByZXR1cm4gYy5jaGFyQ29kZUF0KDApOyB9KTtcblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHR5cGUgXCIgKyBvcHRzLnR5cGUpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9zdHh0X3R5cGUob3V0Lyo6c3RyaW5nKi8sIG9wdHMvKjpXcml0ZU9wdHMqLykvKjphbnkqLyB7XG5cdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRjYXNlIFwiYmFzZTY0XCI6IHJldHVybiBCYXNlNjRfZW5jb2RlKG91dCk7XG5cdFx0Y2FzZSBcImJpbmFyeVwiOiByZXR1cm4gb3V0O1xuXHRcdGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIG91dDsgLyogb3ZlcnJpZGUgaW4gc2hlZXRfdG9fdHh0ICovXG5cdFx0Y2FzZSBcImZpbGVcIjogcmV0dXJuIHdyaXRlX2RsKG9wdHMuZmlsZSwgb3V0LCAnYmluYXJ5Jyk7XG5cdFx0Y2FzZSBcImJ1ZmZlclwiOiB7XG5cdFx0XHRpZihoYXNfYnVmKSByZXR1cm4gQnVmZmVyX2Zyb20ob3V0LCAnYmluYXJ5Jyk7XG5cdFx0XHRlbHNlIHJldHVybiBvdXQuc3BsaXQoXCJcIikubWFwKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGMuY2hhckNvZGVBdCgwKTsgfSk7XG5cdFx0fVxuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcbn1cblxuLyogVE9ETzogdGVzdCBjb25zaXN0ZW5jeSAqL1xuZnVuY3Rpb24gd3JpdGVfYmluYXJ5X3R5cGUob3V0LCBvcHRzLyo6V3JpdGVPcHRzKi8pLyo6YW55Ki8ge1xuXHRzd2l0Y2gob3B0cy50eXBlKSB7XG5cdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdGNhc2UgXCJiYXNlNjRcIjpcblx0XHRjYXNlIFwiYmluYXJ5XCI6XG5cdFx0XHR2YXIgYnN0ciA9IFwiXCI7XG5cdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IG91dC5sZW5ndGg7ICsraSkgYnN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG91dFtpXSk7XG5cdFx0XHRyZXR1cm4gb3B0cy50eXBlID09ICdiYXNlNjQnID8gQmFzZTY0X2VuY29kZShic3RyKSA6IG9wdHMudHlwZSA9PSAnc3RyaW5nJyA/IHV0ZjhyZWFkKGJzdHIpIDogYnN0cjtcblx0XHRjYXNlIFwiZmlsZVwiOiByZXR1cm4gd3JpdGVfZGwob3B0cy5maWxlLCBvdXQpO1xuXHRcdGNhc2UgXCJidWZmZXJcIjogcmV0dXJuIG91dDtcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgdHlwZSBcIiArIG9wdHMudHlwZSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gd3JpdGVTeW5jWExTWCh3Yi8qOldvcmtib29rKi8sIG9wdHMvKjo/V3JpdGVPcHRzKi8pIHtcblx0cmVzZXRfY3AoKTtcblx0Y2hlY2tfd2Iod2IpO1xuXHR2YXIgbyA9IGR1cChvcHRzfHx7fSk7XG5cdGlmKG8uY2VsbFN0eWxlcykgeyBvLmNlbGxORiA9IHRydWU7IG8uc2hlZXRTdHVicyA9IHRydWU7IH1cblx0aWYoby50eXBlID09IFwiYXJyYXlcIikgeyBvLnR5cGUgPSBcImJpbmFyeVwiOyB2YXIgb3V0Lyo6c3RyaW5nKi8gPSAod3JpdGVTeW5jWExTWCh3YiwgbykvKjphbnkqLyk7IG8udHlwZSA9IFwiYXJyYXlcIjsgcmV0dXJuIHMyYWIob3V0KTsgfVxuXHRyZXR1cm4gd3JpdGVfemlwX3R5cGVYTFNYKHdiLCBvKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVTeW5jKHdiLyo6V29ya2Jvb2sqLywgb3B0cy8qOj9Xcml0ZU9wdHMqLykge1xuXHRyZXNldF9jcCgpO1xuXHRjaGVja193Yih3Yik7XG5cdHZhciBvID0gZHVwKG9wdHN8fHt9KTtcblx0aWYoby5jZWxsU3R5bGVzKSB7IG8uY2VsbE5GID0gdHJ1ZTsgby5zaGVldFN0dWJzID0gdHJ1ZTsgfVxuXHRpZihvLnR5cGUgPT0gXCJhcnJheVwiKSB7IG8udHlwZSA9IFwiYmluYXJ5XCI7IHZhciBvdXQvKjpzdHJpbmcqLyA9ICh3cml0ZVN5bmMod2IsIG8pLyo6YW55Ki8pOyBvLnR5cGUgPSBcImFycmF5XCI7IHJldHVybiBzMmFiKG91dCk7IH1cblx0dmFyIGlkeCA9IDA7XG5cdGlmKG8uc2hlZXQpIHtcblx0XHRpZih0eXBlb2Ygby5zaGVldCA9PSBcIm51bWJlclwiKSBpZHggPSBvLnNoZWV0O1xuXHRcdGVsc2UgaWR4ID0gd2IuU2hlZXROYW1lcy5pbmRleE9mKG8uc2hlZXQpO1xuXHRcdGlmKCF3Yi5TaGVldE5hbWVzW2lkeF0pIHRocm93IG5ldyBFcnJvcihcIlNoZWV0IG5vdCBmb3VuZDogXCIgKyBvLnNoZWV0ICsgXCIgOiBcIiArICh0eXBlb2Ygby5zaGVldCkpO1xuXHR9XG5cdHN3aXRjaChvLmJvb2tUeXBlIHx8ICd4bHNiJykge1xuXHRcdGNhc2UgJ3htbCc6XG5cdFx0Y2FzZSAneGxtbCc6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZSh3cml0ZV94bG1sKHdiLCBvKSwgbyk7XG5cdFx0Y2FzZSAnc2xrJzpcblx0XHRjYXNlICdzeWxrJzogcmV0dXJuIHdyaXRlX3N0cmluZ190eXBlKFNZTEsuZnJvbV9zaGVldCh3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgbyksIG8pO1xuXHRcdGNhc2UgJ2h0bSc6XG5cdFx0Y2FzZSAnaHRtbCc6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZShzaGVldF90b19odG1sKHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW2lkeF1dLCBvKSwgbyk7XG5cdFx0Y2FzZSAndHh0JzogcmV0dXJuIHdyaXRlX3N0eHRfdHlwZShzaGVldF90b190eHQod2IuU2hlZXRzW3diLlNoZWV0TmFtZXNbaWR4XV0sIG8pLCBvKTtcblx0XHRjYXNlICdjc3YnOiByZXR1cm4gd3JpdGVfc3RyaW5nX3R5cGUoc2hlZXRfdG9fY3N2KHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW2lkeF1dLCBvKSwgbywgXCJcXHVmZWZmXCIpO1xuXHRcdGNhc2UgJ2RpZic6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZShESUYuZnJvbV9zaGVldCh3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgbyksIG8pO1xuXHRcdGNhc2UgJ2RiZic6IHJldHVybiB3cml0ZV9iaW5hcnlfdHlwZShEQkYuZnJvbV9zaGVldCh3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgbyksIG8pO1xuXHRcdGNhc2UgJ3Bybic6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZShQUk4uZnJvbV9zaGVldCh3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgbyksIG8pO1xuXHRcdGNhc2UgJ3J0Zic6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZShSVEYuZnJvbV9zaGVldCh3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgbyksIG8pO1xuXHRcdGNhc2UgJ2V0aCc6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZShFVEguZnJvbV9zaGVldCh3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgbyksIG8pO1xuXHRcdGNhc2UgJ2ZvZHMnOiByZXR1cm4gd3JpdGVfc3RyaW5nX3R5cGUod3JpdGVfb2RzKHdiLCBvKSwgbyk7XG5cdFx0Y2FzZSAnd2sxJzogcmV0dXJuIHdyaXRlX2JpbmFyeV90eXBlKFdLXy5zaGVldF90b193azEod2IuU2hlZXRzW3diLlNoZWV0TmFtZXNbaWR4XV0sIG8pLCBvKTtcblx0XHRjYXNlICd3azMnOiByZXR1cm4gd3JpdGVfYmluYXJ5X3R5cGUoV0tfLmJvb2tfdG9fd2szKHdiLCBvKSwgbyk7XG5cdFx0Y2FzZSAnYmlmZjInOiBpZighby5iaWZmKSBvLmJpZmYgPSAyOyAvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAnYmlmZjMnOiBpZighby5iaWZmKSBvLmJpZmYgPSAzOyAvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAnYmlmZjQnOiBpZighby5iaWZmKSBvLmJpZmYgPSA0OyByZXR1cm4gd3JpdGVfYmluYXJ5X3R5cGUod3JpdGVfYmlmZl9idWYod2IsIG8pLCBvKTtcblx0XHRjYXNlICdiaWZmNSc6IGlmKCFvLmJpZmYpIG8uYmlmZiA9IDU7IC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRjYXNlICdiaWZmOCc6XG5cdFx0Y2FzZSAneGxhJzpcblx0XHRjYXNlICd4bHMnOiBpZighby5iaWZmKSBvLmJpZmYgPSA4OyByZXR1cm4gd3JpdGVfY2ZiX3R5cGUod2IsIG8pO1xuXHRcdGNhc2UgJ3hsc3gnOlxuXHRcdGNhc2UgJ3hsc20nOlxuXHRcdGNhc2UgJ3hsYW0nOlxuXHRcdGNhc2UgJ3hsc2InOlxuXHRcdGNhc2UgJ251bWJlcnMnOlxuXHRcdGNhc2UgJ29kcyc6IHJldHVybiB3cml0ZV96aXBfdHlwZSh3Yiwgbyk7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yIChcIlVucmVjb2duaXplZCBib29rVHlwZSB8XCIgKyBvLmJvb2tUeXBlICsgXCJ8XCIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVfYm9va190eXBlKG8vKjpXcml0ZUZpbGVPcHRzKi8pIHtcblx0aWYoby5ib29rVHlwZSkgcmV0dXJuO1xuXHR2YXIgX0JUID0ge1xuXHRcdFwieGxzXCI6IFwiYmlmZjhcIixcblx0XHRcImh0bVwiOiBcImh0bWxcIixcblx0XHRcInNsa1wiOiBcInN5bGtcIixcblx0XHRcInNvY2lhbGNhbGNcIjogXCJldGhcIixcblx0XHRcIlNoMzN0SlNcIjogXCJXVEZcIlxuXHR9O1xuXHR2YXIgZXh0ID0gby5maWxlLnNsaWNlKG8uZmlsZS5sYXN0SW5kZXhPZihcIi5cIikpLnRvTG93ZXJDYXNlKCk7XG5cdGlmKGV4dC5tYXRjaCgvXlxcLlthLXpdKyQvKSkgby5ib29rVHlwZSA9IGV4dC5zbGljZSgxKTtcblx0by5ib29rVHlwZSA9IF9CVFtvLmJvb2tUeXBlXSB8fCBvLmJvb2tUeXBlO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZpbGVTeW5jKHdiLyo6V29ya2Jvb2sqLywgZmlsZW5hbWUvKjpzdHJpbmcqLywgb3B0cy8qOj9Xcml0ZUZpbGVPcHRzKi8pIHtcblx0dmFyIG8gPSBvcHRzfHx7fTsgby50eXBlID0gJ2ZpbGUnO1xuXHRvLmZpbGUgPSBmaWxlbmFtZTtcblx0cmVzb2x2ZV9ib29rX3R5cGUobyk7XG5cdHJldHVybiB3cml0ZVN5bmMod2IsIG8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZpbGVTeW5jWExTWCh3Yi8qOldvcmtib29rKi8sIGZpbGVuYW1lLyo6c3RyaW5nKi8sIG9wdHMvKjo/V3JpdGVGaWxlT3B0cyovKSB7XG5cdHZhciBvID0gb3B0c3x8e307IG8udHlwZSA9ICdmaWxlJztcblx0by5maWxlID0gZmlsZW5hbWU7XG5cdHJlc29sdmVfYm9va190eXBlKG8pO1xuXHRyZXR1cm4gd3JpdGVTeW5jWExTWCh3Yiwgbyk7XG59XG5cblxuZnVuY3Rpb24gd3JpdGVGaWxlQXN5bmMoZmlsZW5hbWUvKjpzdHJpbmcqLywgd2IvKjpXb3JrYm9vayovLCBvcHRzLyo6P1dyaXRlRmlsZU9wdHMqLywgY2IvKjo/KGU/OkVycm5vRXJyb3IpPT52b2lkKi8pIHtcblx0dmFyIG8gPSBvcHRzfHx7fTsgby50eXBlID0gJ2ZpbGUnO1xuXHRvLmZpbGUgPSBmaWxlbmFtZTtcblx0cmVzb2x2ZV9ib29rX3R5cGUobyk7XG5cdG8udHlwZSA9ICdidWZmZXInO1xuXHR2YXIgX2NiID0gY2I7IGlmKCEoX2NiIGluc3RhbmNlb2YgRnVuY3Rpb24pKSBfY2IgPSAob3B0cy8qOmFueSovKTtcblx0cmV0dXJuIF9mcy53cml0ZUZpbGUoZmlsZW5hbWUsIHdyaXRlU3luYyh3YiwgbyksIF9jYik7XG59XG4vKjo6XG50eXBlIE1KUk9iamVjdCA9IHtcblx0cm93OiBhbnk7XG5cdGlzZW1wdHk6IGJvb2xlYW47XG59O1xuKi9cbmZ1bmN0aW9uIG1ha2VfanNvbl9yb3coc2hlZXQvKjpXb3Jrc2hlZXQqLywgci8qOlJhbmdlKi8sIFIvKjpudW1iZXIqLywgY29scy8qOkFycmF5PHN0cmluZz4qLywgaGVhZGVyLyo6bnVtYmVyKi8sIGhkci8qOkFycmF5PGFueT4qLywgZGVuc2UvKjpib29sZWFuKi8sIG8vKjpTaGVldDJKU09OT3B0cyovKS8qOk1KUk9iamVjdCovIHtcblx0dmFyIHJyID0gZW5jb2RlX3JvdyhSKTtcblx0dmFyIGRlZnZhbCA9IG8uZGVmdmFsLCByYXcgPSBvLnJhdyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIFwicmF3XCIpO1xuXHR2YXIgaXNlbXB0eSA9IHRydWU7XG5cdHZhciByb3cvKjphbnkqLyA9IChoZWFkZXIgPT09IDEpID8gW10gOiB7fTtcblx0aWYoaGVhZGVyICE9PSAxKSB7XG5cdFx0aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB0cnkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkocm93LCAnX19yb3dOdW1fXycsIHt2YWx1ZTpSLCBlbnVtZXJhYmxlOmZhbHNlfSk7IH0gY2F0Y2goZSkgeyByb3cuX19yb3dOdW1fXyA9IFI7IH1cblx0XHRlbHNlIHJvdy5fX3Jvd051bV9fID0gUjtcblx0fVxuXHRpZighZGVuc2UgfHwgc2hlZXRbUl0pIGZvciAodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0dmFyIHZhbCA9IGRlbnNlID8gc2hlZXRbUl1bQ10gOiBzaGVldFtjb2xzW0NdICsgcnJdO1xuXHRcdGlmKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbC50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmKGRlZnZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblx0XHRcdGlmKGhkcltDXSAhPSBudWxsKSB7IHJvd1toZHJbQ11dID0gZGVmdmFsOyB9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0dmFyIHYgPSB2YWwudjtcblx0XHRzd2l0Y2godmFsLnQpe1xuXHRcdFx0Y2FzZSAneic6IGlmKHYgPT0gbnVsbCkgYnJlYWs7IGNvbnRpbnVlO1xuXHRcdFx0Y2FzZSAnZSc6IHYgPSAodiA9PSAwID8gbnVsbCA6IHZvaWQgMCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAncyc6IGNhc2UgJ2QnOiBjYXNlICdiJzogY2FzZSAnbic6IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgdHlwZSAnICsgdmFsLnQpO1xuXHRcdH1cblx0XHRpZihoZHJbQ10gIT0gbnVsbCkge1xuXHRcdFx0aWYodiA9PSBudWxsKSB7XG5cdFx0XHRcdGlmKHZhbC50ID09IFwiZVwiICYmIHYgPT09IG51bGwpIHJvd1toZHJbQ11dID0gbnVsbDtcblx0XHRcdFx0ZWxzZSBpZihkZWZ2YWwgIT09IHVuZGVmaW5lZCkgcm93W2hkcltDXV0gPSBkZWZ2YWw7XG5cdFx0XHRcdGVsc2UgaWYocmF3ICYmIHYgPT09IG51bGwpIHJvd1toZHJbQ11dID0gbnVsbDtcblx0XHRcdFx0ZWxzZSBjb250aW51ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJvd1toZHJbQ11dID0gcmF3ICYmICh2YWwudCAhPT0gXCJuXCIgfHwgKHZhbC50ID09PSBcIm5cIiAmJiBvLnJhd051bWJlcnMgIT09IGZhbHNlKSkgPyB2IDogZm9ybWF0X2NlbGwodmFsLHYsbyk7XG5cdFx0XHR9XG5cdFx0XHRpZih2ICE9IG51bGwpIGlzZW1wdHkgPSBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgcm93OiByb3csIGlzZW1wdHk6IGlzZW1wdHkgfTtcbn1cblxuXG5mdW5jdGlvbiBzaGVldF90b19qc29uKHNoZWV0Lyo6V29ya3NoZWV0Ki8sIG9wdHMvKjo/U2hlZXQySlNPTk9wdHMqLykge1xuXHRpZihzaGVldCA9PSBudWxsIHx8IHNoZWV0W1wiIXJlZlwiXSA9PSBudWxsKSByZXR1cm4gW107XG5cdHZhciB2YWwgPSB7dDonbicsdjowfSwgaGVhZGVyID0gMCwgb2Zmc2V0ID0gMSwgaGRyLyo6QXJyYXk8YW55PiovID0gW10sIHY9MCwgdnY9XCJcIjtcblx0dmFyIHIgPSB7czp7cjowLGM6MH0sZTp7cjowLGM6MH19O1xuXHR2YXIgbyA9IG9wdHMgfHwge307XG5cdHZhciByYW5nZSA9IG8ucmFuZ2UgIT0gbnVsbCA/IG8ucmFuZ2UgOiBzaGVldFtcIiFyZWZcIl07XG5cdGlmKG8uaGVhZGVyID09PSAxKSBoZWFkZXIgPSAxO1xuXHRlbHNlIGlmKG8uaGVhZGVyID09PSBcIkFcIikgaGVhZGVyID0gMjtcblx0ZWxzZSBpZihBcnJheS5pc0FycmF5KG8uaGVhZGVyKSkgaGVhZGVyID0gMztcblx0ZWxzZSBpZihvLmhlYWRlciA9PSBudWxsKSBoZWFkZXIgPSAwO1xuXHRzd2l0Y2godHlwZW9mIHJhbmdlKSB7XG5cdFx0Y2FzZSAnc3RyaW5nJzogciA9IHNhZmVfZGVjb2RlX3JhbmdlKHJhbmdlKTsgYnJlYWs7XG5cdFx0Y2FzZSAnbnVtYmVyJzogciA9IHNhZmVfZGVjb2RlX3JhbmdlKHNoZWV0W1wiIXJlZlwiXSk7IHIucy5yID0gcmFuZ2U7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHIgPSByYW5nZTtcblx0fVxuXHRpZihoZWFkZXIgPiAwKSBvZmZzZXQgPSAwO1xuXHR2YXIgcnIgPSBlbmNvZGVfcm93KHIucy5yKTtcblx0dmFyIGNvbHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIG91dC8qOkFycmF5PGFueT4qLyA9IFtdO1xuXHR2YXIgb3V0aSA9IDAsIGNvdW50ZXIgPSAwO1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHNoZWV0KTtcblx0dmFyIFIgPSByLnMuciwgQyA9IDA7XG5cdHZhciBoZWFkZXJfY250ID0ge307XG5cdGlmKGRlbnNlICYmICFzaGVldFtSXSkgc2hlZXRbUl0gPSBbXTtcblx0dmFyIGNvbGluZm8vKjpBcnJheTxDb2xJbmZvPiovID0gby5za2lwSGlkZGVuICYmIHNoZWV0W1wiIWNvbHNcIl0gfHwgW107XG5cdHZhciByb3dpbmZvLyo6QXJyYXk8Q29sSW5mbz4qLyA9IG8uc2tpcEhpZGRlbiAmJiBzaGVldFtcIiFyb3dzXCJdIHx8IFtdO1xuXHRmb3IoQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRpZigoKGNvbGluZm9bQ118fHt9KS5oaWRkZW4pKSBjb250aW51ZTtcblx0XHRjb2xzW0NdID0gZW5jb2RlX2NvbChDKTtcblx0XHR2YWwgPSBkZW5zZSA/IHNoZWV0W1JdW0NdIDogc2hlZXRbY29sc1tDXSArIHJyXTtcblx0XHRzd2l0Y2goaGVhZGVyKSB7XG5cdFx0XHRjYXNlIDE6IGhkcltDXSA9IEMgLSByLnMuYzsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IGhkcltDXSA9IGNvbHNbQ107IGJyZWFrO1xuXHRcdFx0Y2FzZSAzOiBoZHJbQ10gPSBvLmhlYWRlcltDIC0gci5zLmNdOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKHZhbCA9PSBudWxsKSB2YWwgPSB7dzogXCJfX0VNUFRZXCIsIHQ6IFwic1wifTtcblx0XHRcdFx0dnYgPSB2ID0gZm9ybWF0X2NlbGwodmFsLCBudWxsLCBvKTtcblx0XHRcdFx0Y291bnRlciA9IGhlYWRlcl9jbnRbdl0gfHwgMDtcblx0XHRcdFx0aWYoIWNvdW50ZXIpIGhlYWRlcl9jbnRbdl0gPSAxO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRkbyB7IHZ2ID0gdiArIFwiX1wiICsgKGNvdW50ZXIrKyk7IH0gd2hpbGUoaGVhZGVyX2NudFt2dl0pOyBoZWFkZXJfY250W3ZdID0gY291bnRlcjtcblx0XHRcdFx0XHRoZWFkZXJfY250W3Z2XSA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGRyW0NdID0gdnY7XG5cdFx0fVxuXHR9XG5cdGZvciAoUiA9IHIucy5yICsgb2Zmc2V0OyBSIDw9IHIuZS5yOyArK1IpIHtcblx0XHRpZiAoKHJvd2luZm9bUl18fHt9KS5oaWRkZW4pIGNvbnRpbnVlO1xuXHRcdHZhciByb3cgPSBtYWtlX2pzb25fcm93KHNoZWV0LCByLCBSLCBjb2xzLCBoZWFkZXIsIGhkciwgZGVuc2UsIG8pO1xuXHRcdGlmKChyb3cuaXNlbXB0eSA9PT0gZmFsc2UpIHx8IChoZWFkZXIgPT09IDEgPyBvLmJsYW5rcm93cyAhPT0gZmFsc2UgOiAhIW8uYmxhbmtyb3dzKSkgb3V0W291dGkrK10gPSByb3cucm93O1xuXHR9XG5cdG91dC5sZW5ndGggPSBvdXRpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG52YXIgcXJlZyA9IC9cIi9nO1xuZnVuY3Rpb24gbWFrZV9jc3Zfcm93KHNoZWV0Lyo6V29ya3NoZWV0Ki8sIHIvKjpSYW5nZSovLCBSLyo6bnVtYmVyKi8sIGNvbHMvKjpBcnJheTxzdHJpbmc+Ki8sIGZzLyo6bnVtYmVyKi8sIHJzLyo6bnVtYmVyKi8sIEZTLyo6c3RyaW5nKi8sIG8vKjpTaGVldDJDU1ZPcHRzKi8pLyo6P3N0cmluZyovIHtcblx0dmFyIGlzZW1wdHkgPSB0cnVlO1xuXHR2YXIgcm93Lyo6QXJyYXk8c3RyaW5nPiovID0gW10sIHR4dCA9IFwiXCIsIHJyID0gZW5jb2RlX3JvdyhSKTtcblx0Zm9yKHZhciBDID0gci5zLmM7IEMgPD0gci5lLmM7ICsrQykge1xuXHRcdGlmICghY29sc1tDXSkgY29udGludWU7XG5cdFx0dmFyIHZhbCA9IG8uZGVuc2UgPyAoc2hlZXRbUl18fFtdKVtDXTogc2hlZXRbY29sc1tDXSArIHJyXTtcblx0XHRpZih2YWwgPT0gbnVsbCkgdHh0ID0gXCJcIjtcblx0XHRlbHNlIGlmKHZhbC52ICE9IG51bGwpIHtcblx0XHRcdGlzZW1wdHkgPSBmYWxzZTtcblx0XHRcdHR4dCA9ICcnKyhvLnJhd051bWJlcnMgJiYgdmFsLnQgPT0gXCJuXCIgPyB2YWwudiA6IGZvcm1hdF9jZWxsKHZhbCwgbnVsbCwgbykpO1xuXHRcdFx0Zm9yKHZhciBpID0gMCwgY2MgPSAwOyBpICE9PSB0eHQubGVuZ3RoOyArK2kpIGlmKChjYyA9IHR4dC5jaGFyQ29kZUF0KGkpKSA9PT0gZnMgfHwgY2MgPT09IHJzIHx8IGNjID09PSAzNCB8fCBvLmZvcmNlUXVvdGVzKSB7dHh0ID0gXCJcXFwiXCIgKyB0eHQucmVwbGFjZShxcmVnLCAnXCJcIicpICsgXCJcXFwiXCI7IGJyZWFrOyB9XG5cdFx0XHRpZih0eHQgPT0gXCJJRFwiKSB0eHQgPSAnXCJJRFwiJztcblx0XHR9IGVsc2UgaWYodmFsLmYgIT0gbnVsbCAmJiAhdmFsLkYpIHtcblx0XHRcdGlzZW1wdHkgPSBmYWxzZTtcblx0XHRcdHR4dCA9ICc9JyArIHZhbC5mOyBpZih0eHQuaW5kZXhPZihcIixcIikgPj0gMCkgdHh0ID0gJ1wiJyArIHR4dC5yZXBsYWNlKHFyZWcsICdcIlwiJykgKyAnXCInO1xuXHRcdH0gZWxzZSB0eHQgPSBcIlwiO1xuXHRcdC8qIE5PVEU6IEV4Y2VsIENTViBkb2VzIG5vdCBzdXBwb3J0IGFycmF5IGZvcm11bGFlICovXG5cdFx0cm93LnB1c2godHh0KTtcblx0fVxuXHRpZihvLmJsYW5rcm93cyA9PT0gZmFsc2UgJiYgaXNlbXB0eSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiByb3cuam9pbihGUyk7XG59XG5cbmZ1bmN0aW9uIHNoZWV0X3RvX2NzdihzaGVldC8qOldvcmtzaGVldCovLCBvcHRzLyo6P1NoZWV0MkNTVk9wdHMqLykvKjpzdHJpbmcqLyB7XG5cdHZhciBvdXQvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIG8gPSBvcHRzID09IG51bGwgPyB7fSA6IG9wdHM7XG5cdGlmKHNoZWV0ID09IG51bGwgfHwgc2hlZXRbXCIhcmVmXCJdID09IG51bGwpIHJldHVybiBcIlwiO1xuXHR2YXIgciA9IHNhZmVfZGVjb2RlX3JhbmdlKHNoZWV0W1wiIXJlZlwiXSk7XG5cdHZhciBGUyA9IG8uRlMgIT09IHVuZGVmaW5lZCA/IG8uRlMgOiBcIixcIiwgZnMgPSBGUy5jaGFyQ29kZUF0KDApO1xuXHR2YXIgUlMgPSBvLlJTICE9PSB1bmRlZmluZWQgPyBvLlJTIDogXCJcXG5cIiwgcnMgPSBSUy5jaGFyQ29kZUF0KDApO1xuXHR2YXIgZW5kcmVnZXggPSBuZXcgUmVnRXhwKChGUz09XCJ8XCIgPyBcIlxcXFx8XCIgOiBGUykrXCIrJFwiKTtcblx0dmFyIHJvdyA9IFwiXCIsIGNvbHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0by5kZW5zZSA9IEFycmF5LmlzQXJyYXkoc2hlZXQpO1xuXHR2YXIgY29saW5mby8qOkFycmF5PENvbEluZm8+Ki8gPSBvLnNraXBIaWRkZW4gJiYgc2hlZXRbXCIhY29sc1wiXSB8fCBbXTtcblx0dmFyIHJvd2luZm8vKjpBcnJheTxDb2xJbmZvPiovID0gby5za2lwSGlkZGVuICYmIHNoZWV0W1wiIXJvd3NcIl0gfHwgW107XG5cdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIGlmICghKChjb2xpbmZvW0NdfHx7fSkuaGlkZGVuKSkgY29sc1tDXSA9IGVuY29kZV9jb2woQyk7XG5cdHZhciB3ID0gMDtcblx0Zm9yKHZhciBSID0gci5zLnI7IFIgPD0gci5lLnI7ICsrUikge1xuXHRcdGlmICgocm93aW5mb1tSXXx8e30pLmhpZGRlbikgY29udGludWU7XG5cdFx0cm93ID0gbWFrZV9jc3Zfcm93KHNoZWV0LCByLCBSLCBjb2xzLCBmcywgcnMsIEZTLCBvKTtcblx0XHRpZihyb3cgPT0gbnVsbCkgeyBjb250aW51ZTsgfVxuXHRcdGlmKG8uc3RyaXApIHJvdyA9IHJvdy5yZXBsYWNlKGVuZHJlZ2V4LFwiXCIpO1xuXHRcdGlmKHJvdyB8fCAoby5ibGFua3Jvd3MgIT09IGZhbHNlKSkgb3V0LnB1c2goKHcrKyA/IFJTIDogXCJcIikgKyByb3cpO1xuXHR9XG5cdGRlbGV0ZSBvLmRlbnNlO1xuXHRyZXR1cm4gb3V0LmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIHNoZWV0X3RvX3R4dChzaGVldC8qOldvcmtzaGVldCovLCBvcHRzLyo6P1NoZWV0MkNTVk9wdHMqLykge1xuXHRpZighb3B0cykgb3B0cyA9IHt9OyBvcHRzLkZTID0gXCJcXHRcIjsgb3B0cy5SUyA9IFwiXFxuXCI7XG5cdHZhciBzID0gc2hlZXRfdG9fY3N2KHNoZWV0LCBvcHRzKTtcblx0aWYodHlwZW9mICRjcHRhYmxlID09ICd1bmRlZmluZWQnIHx8IG9wdHMudHlwZSA9PSAnc3RyaW5nJykgcmV0dXJuIHM7XG5cdHZhciBvID0gJGNwdGFibGUudXRpbHMuZW5jb2RlKDEyMDAsIHMsICdzdHInKTtcblx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1KSArIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU0KSArIG87XG59XG5cbmZ1bmN0aW9uIHNoZWV0X3RvX2Zvcm11bGFlKHNoZWV0Lyo6V29ya3NoZWV0Ki8pLyo6QXJyYXk8c3RyaW5nPiovIHtcblx0dmFyIHkgPSBcIlwiLCB4LCB2YWw9XCJcIjtcblx0aWYoc2hlZXQgPT0gbnVsbCB8fCBzaGVldFtcIiFyZWZcIl0gPT0gbnVsbCkgcmV0dXJuIFtdO1xuXHR2YXIgciA9IHNhZmVfZGVjb2RlX3JhbmdlKHNoZWV0WychcmVmJ10pLCByciA9IFwiXCIsIGNvbHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXSwgQztcblx0dmFyIGNtZHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheShzaGVldCk7XG5cdGZvcihDID0gci5zLmM7IEMgPD0gci5lLmM7ICsrQykgY29sc1tDXSA9IGVuY29kZV9jb2woQyk7XG5cdGZvcih2YXIgUiA9IHIucy5yOyBSIDw9IHIuZS5yOyArK1IpIHtcblx0XHRyciA9IGVuY29kZV9yb3coUik7XG5cdFx0Zm9yKEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0XHR5ID0gY29sc1tDXSArIHJyO1xuXHRcdFx0eCA9IGRlbnNlID8gKHNoZWV0W1JdfHxbXSlbQ10gOiBzaGVldFt5XTtcblx0XHRcdHZhbCA9IFwiXCI7XG5cdFx0XHRpZih4ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXHRcdFx0ZWxzZSBpZih4LkYgIT0gbnVsbCkge1xuXHRcdFx0XHR5ID0geC5GO1xuXHRcdFx0XHRpZigheC5mKSBjb250aW51ZTtcblx0XHRcdFx0dmFsID0geC5mO1xuXHRcdFx0XHRpZih5LmluZGV4T2YoXCI6XCIpID09IC0xKSB5ID0geSArIFwiOlwiICsgeTtcblx0XHRcdH1cblx0XHRcdGlmKHguZiAhPSBudWxsKSB2YWwgPSB4LmY7XG5cdFx0XHRlbHNlIGlmKHgudCA9PSAneicpIGNvbnRpbnVlO1xuXHRcdFx0ZWxzZSBpZih4LnQgPT0gJ24nICYmIHgudiAhPSBudWxsKSB2YWwgPSBcIlwiICsgeC52O1xuXHRcdFx0ZWxzZSBpZih4LnQgPT0gJ2InKSB2YWwgPSB4LnYgPyBcIlRSVUVcIiA6IFwiRkFMU0VcIjtcblx0XHRcdGVsc2UgaWYoeC53ICE9PSB1bmRlZmluZWQpIHZhbCA9IFwiJ1wiICsgeC53O1xuXHRcdFx0ZWxzZSBpZih4LnYgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cdFx0XHRlbHNlIGlmKHgudCA9PSAncycpIHZhbCA9IFwiJ1wiICsgeC52O1xuXHRcdFx0ZWxzZSB2YWwgPSBcIlwiK3gudjtcblx0XHRcdGNtZHNbY21kcy5sZW5ndGhdID0geSArIFwiPVwiICsgdmFsO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gY21kcztcbn1cblxuZnVuY3Rpb24gc2hlZXRfYWRkX2pzb24oX3dzLyo6P1dvcmtzaGVldCovLCBqcy8qOkFycmF5PGFueT4qLywgb3B0cykvKjpXb3Jrc2hlZXQqLyB7XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0dmFyIG9mZnNldCA9ICshby5za2lwSGVhZGVyO1xuXHR2YXIgd3MvKjpXb3Jrc2hlZXQqLyA9IF93cyB8fCAoe30vKjphbnkqLyk7XG5cdHZhciBfUiA9IDAsIF9DID0gMDtcblx0aWYod3MgJiYgby5vcmlnaW4gIT0gbnVsbCkge1xuXHRcdGlmKHR5cGVvZiBvLm9yaWdpbiA9PSAnbnVtYmVyJykgX1IgPSBvLm9yaWdpbjtcblx0XHRlbHNlIHtcblx0XHRcdHZhciBfb3JpZ2luLyo6Q2VsbEFkZHJlc3MqLyA9IHR5cGVvZiBvLm9yaWdpbiA9PSBcInN0cmluZ1wiID8gZGVjb2RlX2NlbGwoby5vcmlnaW4pIDogby5vcmlnaW47XG5cdFx0XHRfUiA9IF9vcmlnaW4ucjsgX0MgPSBfb3JpZ2luLmM7XG5cdFx0fVxuXHR9XG5cdHZhciBjZWxsLyo6Q2VsbCovO1xuXHR2YXIgcmFuZ2UvKjpSYW5nZSovID0gKHtzOiB7YzowLCByOjB9LCBlOiB7YzpfQywgcjpfUiArIGpzLmxlbmd0aCAtIDEgKyBvZmZzZXR9fS8qOmFueSovKTtcblx0aWYod3NbJyFyZWYnXSkge1xuXHRcdHZhciBfcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0XHRyYW5nZS5lLmMgPSBNYXRoLm1heChyYW5nZS5lLmMsIF9yYW5nZS5lLmMpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWF4KHJhbmdlLmUuciwgX3JhbmdlLmUucik7XG5cdFx0aWYoX1IgPT0gLTEpIHsgX1IgPSBfcmFuZ2UuZS5yICsgMTsgcmFuZ2UuZS5yID0gX1IgKyBqcy5sZW5ndGggLSAxICsgb2Zmc2V0OyB9XG5cdH0gZWxzZSB7XG5cdFx0aWYoX1IgPT0gLTEpIHsgX1IgPSAwOyByYW5nZS5lLnIgPSBqcy5sZW5ndGggLSAxICsgb2Zmc2V0OyB9XG5cdH1cblx0dmFyIGhkci8qOkFycmF5PHN0cmluZz4qLyA9IG8uaGVhZGVyIHx8IFtdLCBDID0gMDtcblxuXHRqcy5mb3JFYWNoKGZ1bmN0aW9uIChKUywgUi8qOm51bWJlciovKSB7XG5cdFx0a2V5cyhKUykuZm9yRWFjaChmdW5jdGlvbihrKSB7XG5cdFx0XHRpZigoQz1oZHIuaW5kZXhPZihrKSkgPT0gLTEpIGhkcltDPWhkci5sZW5ndGhdID0gaztcblx0XHRcdHZhciB2ID0gSlNba107XG5cdFx0XHR2YXIgdCA9ICd6Jztcblx0XHRcdHZhciB6ID0gXCJcIjtcblx0XHRcdHZhciByZWYgPSBlbmNvZGVfY2VsbCh7YzpfQyArIEMscjpfUiArIFIgKyBvZmZzZXR9KTtcblx0XHRcdGNlbGwgPSB3c19nZXRfY2VsbF9zdHViKHdzLCByZWYpO1xuXHRcdFx0aWYodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgISh2IGluc3RhbmNlb2YgRGF0ZSkpe1xuXHRcdFx0XHR3c1tyZWZdID0gdjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKHR5cGVvZiB2ID09ICdudW1iZXInKSB0ID0gJ24nO1xuXHRcdFx0XHRlbHNlIGlmKHR5cGVvZiB2ID09ICdib29sZWFuJykgdCA9ICdiJztcblx0XHRcdFx0ZWxzZSBpZih0eXBlb2YgdiA9PSAnc3RyaW5nJykgdCA9ICdzJztcblx0XHRcdFx0ZWxzZSBpZih2IGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0XHRcdHQgPSAnZCc7XG5cdFx0XHRcdFx0aWYoIW8uY2VsbERhdGVzKSB7IHQgPSAnbic7IHYgPSBkYXRlbnVtKHYpOyB9XG5cdFx0XHRcdFx0eiA9IChvLmRhdGVORiB8fCB0YWJsZV9mbXRbMTRdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmKHYgPT09IG51bGwgJiYgby5udWxsRXJyb3IpIHsgdCA9ICdlJzsgdiA9IDA7IH1cblx0XHRcdFx0aWYoIWNlbGwpIHdzW3JlZl0gPSBjZWxsID0gKHt0OnQsIHY6dn0vKjphbnkqLyk7XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGNlbGwudCA9IHQ7IGNlbGwudiA9IHY7XG5cdFx0XHRcdFx0ZGVsZXRlIGNlbGwudzsgZGVsZXRlIGNlbGwuUjtcblx0XHRcdFx0XHRpZih6KSBjZWxsLnogPSB6O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHopIGNlbGwueiA9IHo7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXHRyYW5nZS5lLmMgPSBNYXRoLm1heChyYW5nZS5lLmMsIF9DICsgaGRyLmxlbmd0aCAtIDEpO1xuXHR2YXIgX19SID0gZW5jb2RlX3JvdyhfUik7XG5cdGlmKG9mZnNldCkgZm9yKEMgPSAwOyBDIDwgaGRyLmxlbmd0aDsgKytDKSB3c1tlbmNvZGVfY29sKEMgKyBfQykgKyBfX1JdID0ge3Q6J3MnLCB2OmhkcltDXX07XG5cdHdzWychcmVmJ10gPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRyZXR1cm4gd3M7XG59XG5mdW5jdGlvbiBqc29uX3RvX3NoZWV0KGpzLyo6QXJyYXk8YW55PiovLCBvcHRzKS8qOldvcmtzaGVldCovIHsgcmV0dXJuIHNoZWV0X2FkZF9qc29uKG51bGwsIGpzLCBvcHRzKTsgfVxuXG4vKiBnZXQgY2VsbCwgY3JlYXRpbmcgYSBzdHViIGlmIG5lY2Vzc2FyeSAqL1xuZnVuY3Rpb24gd3NfZ2V0X2NlbGxfc3R1Yih3cy8qOldvcmtzaGVldCovLCBSLCBDLyo6P251bWJlciovKS8qOkNlbGwqLyB7XG5cdC8qIEExIGNlbGwgYWRkcmVzcyAqL1xuXHRpZih0eXBlb2YgUiA9PSBcInN0cmluZ1wiKSB7XG5cdFx0LyogZGVuc2UgKi9cblx0XHRpZihBcnJheS5pc0FycmF5KHdzKSkge1xuXHRcdFx0dmFyIFJDID0gZGVjb2RlX2NlbGwoUik7XG5cdFx0XHRpZighd3NbUkMucl0pIHdzW1JDLnJdID0gW107XG5cdFx0XHRyZXR1cm4gd3NbUkMucl1bUkMuY10gfHwgKHdzW1JDLnJdW1JDLmNdID0ge3Q6J3onfSk7XG5cdFx0fVxuXHRcdHJldHVybiB3c1tSXSB8fCAod3NbUl0gPSB7dDoneid9KTtcblx0fVxuXHQvKiBjZWxsIGFkZHJlc3Mgb2JqZWN0ICovXG5cdGlmKHR5cGVvZiBSICE9IFwibnVtYmVyXCIpIHJldHVybiB3c19nZXRfY2VsbF9zdHViKHdzLCBlbmNvZGVfY2VsbChSKSk7XG5cdC8qIFIgYW5kIEMgYXJlIDAtYmFzZWQgaW5kaWNlcyAqL1xuXHRyZXR1cm4gd3NfZ2V0X2NlbGxfc3R1Yih3cywgZW5jb2RlX2NlbGwoe3I6UixjOkN8fDB9KSk7XG59XG5cbi8qIGZpbmQgc2hlZXQgaW5kZXggZm9yIGdpdmVuIG5hbWUgLyB2YWxpZGF0ZSBpbmRleCAqL1xuZnVuY3Rpb24gd2Jfc2hlZXRfaWR4KHdiLyo6V29ya2Jvb2sqLywgc2gvKjpudW1iZXJ8c3RyaW5nKi8pIHtcblx0aWYodHlwZW9mIHNoID09IFwibnVtYmVyXCIpIHtcblx0XHRpZihzaCA+PSAwICYmIHdiLlNoZWV0TmFtZXMubGVuZ3RoID4gc2gpIHJldHVybiBzaDtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBzaGVldCAjIFwiICsgc2gpO1xuXHR9IGVsc2UgaWYodHlwZW9mIHNoID09IFwic3RyaW5nXCIpIHtcblx0XHR2YXIgaWR4ID0gd2IuU2hlZXROYW1lcy5pbmRleE9mKHNoKTtcblx0XHRpZihpZHggPiAtMSkgcmV0dXJuIGlkeDtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBzaGVldCBuYW1lIHxcIiArIHNoICsgXCJ8XCIpO1xuXHR9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc2hlZXQgfFwiICsgc2ggKyBcInxcIik7XG59XG5cbi8qIHNpbXBsZSBibGFuayB3b3JrYm9vayBvYmplY3QgKi9cbmZ1bmN0aW9uIGJvb2tfbmV3KCkvKjpXb3JrYm9vayovIHtcblx0cmV0dXJuIHsgU2hlZXROYW1lczogW10sIFNoZWV0czoge30gfTtcbn1cblxuLyogYWRkIGEgd29ya3NoZWV0IHRvIHRoZSBlbmQgb2YgYSBnaXZlbiB3b3JrYm9vayAqL1xuZnVuY3Rpb24gYm9va19hcHBlbmRfc2hlZXQod2IvKjpXb3JrYm9vayovLCB3cy8qOldvcmtzaGVldCovLCBuYW1lLyo6P3N0cmluZyovLCByb2xsLyo6P2Jvb2xlYW4qLykvKjpzdHJpbmcqLyB7XG5cdHZhciBpID0gMTtcblx0aWYoIW5hbWUpIGZvcig7IGkgPD0gMHhGRkZGOyArK2ksIG5hbWUgPSB1bmRlZmluZWQpIGlmKHdiLlNoZWV0TmFtZXMuaW5kZXhPZihuYW1lID0gXCJTaGVldFwiICsgaSkgPT0gLTEpIGJyZWFrO1xuXHRpZighbmFtZSB8fCB3Yi5TaGVldE5hbWVzLmxlbmd0aCA+PSAweEZGRkYpIHRocm93IG5ldyBFcnJvcihcIlRvbyBtYW55IHdvcmtzaGVldHNcIik7XG5cdGlmKHJvbGwgJiYgd2IuU2hlZXROYW1lcy5pbmRleE9mKG5hbWUpID49IDApIHtcblx0XHR2YXIgbSA9IG5hbWUubWF0Y2goLyheLio/KShcXGQrKSQvKTtcblx0XHRpID0gbSAmJiArbVsyXSB8fCAwO1xuXHRcdHZhciByb290ID0gbSAmJiBtWzFdIHx8IG5hbWU7XG5cdFx0Zm9yKCsraTsgaSA8PSAweEZGRkY7ICsraSkgaWYod2IuU2hlZXROYW1lcy5pbmRleE9mKG5hbWUgPSByb290ICsgaSkgPT0gLTEpIGJyZWFrO1xuXHR9XG5cdGNoZWNrX3dzX25hbWUobmFtZSk7XG5cdGlmKHdiLlNoZWV0TmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJXb3Jrc2hlZXQgd2l0aCBuYW1lIHxcIiArIG5hbWUgKyBcInwgYWxyZWFkeSBleGlzdHMhXCIpO1xuXG5cdHdiLlNoZWV0TmFtZXMucHVzaChuYW1lKTtcblx0d2IuU2hlZXRzW25hbWVdID0gd3M7XG5cdHJldHVybiBuYW1lO1xufVxuXG4vKiBzZXQgc2hlZXQgdmlzaWJpbGl0eSAodmlzaWJsZS9oaWRkZW4vdmVyeSBoaWRkZW4pICovXG5mdW5jdGlvbiBib29rX3NldF9zaGVldF92aXNpYmlsaXR5KHdiLyo6V29ya2Jvb2sqLywgc2gvKjpudW1iZXJ8c3RyaW5nKi8sIHZpcy8qOm51bWJlciovKSB7XG5cdGlmKCF3Yi5Xb3JrYm9vaykgd2IuV29ya2Jvb2sgPSB7fTtcblx0aWYoIXdiLldvcmtib29rLlNoZWV0cykgd2IuV29ya2Jvb2suU2hlZXRzID0gW107XG5cblx0dmFyIGlkeCA9IHdiX3NoZWV0X2lkeCh3Yiwgc2gpO1xuXHQvLyAkRmxvd0lnbm9yZVxuXHRpZighd2IuV29ya2Jvb2suU2hlZXRzW2lkeF0pIHdiLldvcmtib29rLlNoZWV0c1tpZHhdID0ge307XG5cblx0c3dpdGNoKHZpcykge1xuXHRcdGNhc2UgMDogY2FzZSAxOiBjYXNlIDI6IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIkJhZCBzaGVldCB2aXNpYmlsaXR5IHNldHRpbmcgXCIgKyB2aXMpO1xuXHR9XG5cdC8vICRGbG93SWdub3JlXG5cdHdiLldvcmtib29rLlNoZWV0c1tpZHhdLkhpZGRlbiA9IHZpcztcbn1cblxuLyogc2V0IG51bWJlciBmb3JtYXQgKi9cbmZ1bmN0aW9uIGNlbGxfc2V0X251bWJlcl9mb3JtYXQoY2VsbC8qOkNlbGwqLywgZm10Lyo6c3RyaW5nfG51bWJlciovKSB7XG5cdGNlbGwueiA9IGZtdDtcblx0cmV0dXJuIGNlbGw7XG59XG5cbi8qIHNldCBjZWxsIGh5cGVybGluayAqL1xuZnVuY3Rpb24gY2VsbF9zZXRfaHlwZXJsaW5rKGNlbGwvKjpDZWxsKi8sIHRhcmdldC8qOnN0cmluZyovLCB0b29sdGlwLyo6P3N0cmluZyovKSB7XG5cdGlmKCF0YXJnZXQpIHtcblx0XHRkZWxldGUgY2VsbC5sO1xuXHR9IGVsc2Uge1xuXHRcdGNlbGwubCA9ICh7IFRhcmdldDogdGFyZ2V0IH0vKjpIeXBlcmxpbmsqLyk7XG5cdFx0aWYodG9vbHRpcCkgY2VsbC5sLlRvb2x0aXAgPSB0b29sdGlwO1xuXHR9XG5cdHJldHVybiBjZWxsO1xufVxuZnVuY3Rpb24gY2VsbF9zZXRfaW50ZXJuYWxfbGluayhjZWxsLyo6Q2VsbCovLCByYW5nZS8qOnN0cmluZyovLCB0b29sdGlwLyo6P3N0cmluZyovKSB7IHJldHVybiBjZWxsX3NldF9oeXBlcmxpbmsoY2VsbCwgXCIjXCIgKyByYW5nZSwgdG9vbHRpcCk7IH1cblxuLyogYWRkIHRvIGNlbGwgY29tbWVudHMgKi9cbmZ1bmN0aW9uIGNlbGxfYWRkX2NvbW1lbnQoY2VsbC8qOkNlbGwqLywgdGV4dC8qOnN0cmluZyovLCBhdXRob3IvKjo/c3RyaW5nKi8pIHtcblx0aWYoIWNlbGwuYykgY2VsbC5jID0gW107XG5cdGNlbGwuYy5wdXNoKHt0OnRleHQsIGE6YXV0aG9yfHxcIlNoZWV0SlNcIn0pO1xufVxuXG4vKiBzZXQgYXJyYXkgZm9ybXVsYSBhbmQgZmx1c2ggcmVsYXRlZCBjZWxscyAqL1xuZnVuY3Rpb24gc2hlZXRfc2V0X2FycmF5X2Zvcm11bGEod3MvKjpXb3Jrc2hlZXQqLywgcmFuZ2UsIGZvcm11bGEvKjpzdHJpbmcqLywgZHluYW1pYy8qOmJvb2xlYW4qLykge1xuXHR2YXIgcm5nID0gdHlwZW9mIHJhbmdlICE9IFwic3RyaW5nXCIgPyByYW5nZSA6IHNhZmVfZGVjb2RlX3JhbmdlKHJhbmdlKTtcblx0dmFyIHJuZ3N0ciA9IHR5cGVvZiByYW5nZSA9PSBcInN0cmluZ1wiID8gcmFuZ2UgOiBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRmb3IodmFyIFIgPSBybmcucy5yOyBSIDw9IHJuZy5lLnI7ICsrUikgZm9yKHZhciBDID0gcm5nLnMuYzsgQyA8PSBybmcuZS5jOyArK0MpIHtcblx0XHR2YXIgY2VsbCA9IHdzX2dldF9jZWxsX3N0dWIod3MsIFIsIEMpO1xuXHRcdGNlbGwudCA9ICduJztcblx0XHRjZWxsLkYgPSBybmdzdHI7XG5cdFx0ZGVsZXRlIGNlbGwudjtcblx0XHRpZihSID09IHJuZy5zLnIgJiYgQyA9PSBybmcucy5jKSB7XG5cdFx0XHRjZWxsLmYgPSBmb3JtdWxhO1xuXHRcdFx0aWYoZHluYW1pYykgY2VsbC5EID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHdzO1xufVxuXG52YXIgdXRpbHMvKjphbnkqLyA9IHtcblx0ZW5jb2RlX2NvbDogZW5jb2RlX2NvbCxcblx0ZW5jb2RlX3JvdzogZW5jb2RlX3Jvdyxcblx0ZW5jb2RlX2NlbGw6IGVuY29kZV9jZWxsLFxuXHRlbmNvZGVfcmFuZ2U6IGVuY29kZV9yYW5nZSxcblx0ZGVjb2RlX2NvbDogZGVjb2RlX2NvbCxcblx0ZGVjb2RlX3JvdzogZGVjb2RlX3Jvdyxcblx0c3BsaXRfY2VsbDogc3BsaXRfY2VsbCxcblx0ZGVjb2RlX2NlbGw6IGRlY29kZV9jZWxsLFxuXHRkZWNvZGVfcmFuZ2U6IGRlY29kZV9yYW5nZSxcblx0Zm9ybWF0X2NlbGw6IGZvcm1hdF9jZWxsLFxuXHRzaGVldF9hZGRfYW9hOiBzaGVldF9hZGRfYW9hLFxuXHRzaGVldF9hZGRfanNvbjogc2hlZXRfYWRkX2pzb24sXG5cdHNoZWV0X2FkZF9kb206IHNoZWV0X2FkZF9kb20sXG5cdGFvYV90b19zaGVldDogYW9hX3RvX3NoZWV0LFxuXHRqc29uX3RvX3NoZWV0OiBqc29uX3RvX3NoZWV0LFxuXHR0YWJsZV90b19zaGVldDogcGFyc2VfZG9tX3RhYmxlLFxuXHR0YWJsZV90b19ib29rOiB0YWJsZV90b19ib29rLFxuXHRzaGVldF90b19jc3Y6IHNoZWV0X3RvX2Nzdixcblx0c2hlZXRfdG9fdHh0OiBzaGVldF90b190eHQsXG5cdHNoZWV0X3RvX2pzb246IHNoZWV0X3RvX2pzb24sXG5cdHNoZWV0X3RvX2h0bWw6IHNoZWV0X3RvX2h0bWwsXG5cdHNoZWV0X3RvX2Zvcm11bGFlOiBzaGVldF90b19mb3JtdWxhZSxcblx0c2hlZXRfdG9fcm93X29iamVjdF9hcnJheTogc2hlZXRfdG9fanNvbixcblx0c2hlZXRfZ2V0X2NlbGw6IHdzX2dldF9jZWxsX3N0dWIsXG5cdGJvb2tfbmV3OiBib29rX25ldyxcblx0Ym9va19hcHBlbmRfc2hlZXQ6IGJvb2tfYXBwZW5kX3NoZWV0LFxuXHRib29rX3NldF9zaGVldF92aXNpYmlsaXR5OiBib29rX3NldF9zaGVldF92aXNpYmlsaXR5LFxuXHRjZWxsX3NldF9udW1iZXJfZm9ybWF0OiBjZWxsX3NldF9udW1iZXJfZm9ybWF0LFxuXHRjZWxsX3NldF9oeXBlcmxpbms6IGNlbGxfc2V0X2h5cGVybGluayxcblx0Y2VsbF9zZXRfaW50ZXJuYWxfbGluazogY2VsbF9zZXRfaW50ZXJuYWxfbGluayxcblx0Y2VsbF9hZGRfY29tbWVudDogY2VsbF9hZGRfY29tbWVudCxcblx0c2hlZXRfc2V0X2FycmF5X2Zvcm11bGE6IHNoZWV0X3NldF9hcnJheV9mb3JtdWxhLFxuXHRjb25zdHM6IHtcblx0XHRTSEVFVF9WSVNJQkxFOiAwLFxuXHRcdFNIRUVUX0hJRERFTjogMSxcblx0XHRTSEVFVF9WRVJZX0hJRERFTjogMlxuXHR9XG59O1xuXG52YXIgX1JlYWRhYmxlO1xuZnVuY3Rpb24gc2V0X3JlYWRhYmxlKFIpIHsgX1JlYWRhYmxlID0gUjsgfVxuXG5mdW5jdGlvbiB3cml0ZV9jc3Zfc3RyZWFtKHNoZWV0Lyo6V29ya3NoZWV0Ki8sIG9wdHMvKjo/U2hlZXQyQ1NWT3B0cyovKSB7XG5cdHZhciBzdHJlYW0gPSBfUmVhZGFibGUoKTtcblx0dmFyIG8gPSBvcHRzID09IG51bGwgPyB7fSA6IG9wdHM7XG5cdGlmKHNoZWV0ID09IG51bGwgfHwgc2hlZXRbXCIhcmVmXCJdID09IG51bGwpIHsgc3RyZWFtLnB1c2gobnVsbCk7IHJldHVybiBzdHJlYW07IH1cblx0dmFyIHIgPSBzYWZlX2RlY29kZV9yYW5nZShzaGVldFtcIiFyZWZcIl0pO1xuXHR2YXIgRlMgPSBvLkZTICE9PSB1bmRlZmluZWQgPyBvLkZTIDogXCIsXCIsIGZzID0gRlMuY2hhckNvZGVBdCgwKTtcblx0dmFyIFJTID0gby5SUyAhPT0gdW5kZWZpbmVkID8gby5SUyA6IFwiXFxuXCIsIHJzID0gUlMuY2hhckNvZGVBdCgwKTtcblx0dmFyIGVuZHJlZ2V4ID0gbmV3IFJlZ0V4cCgoRlM9PVwifFwiID8gXCJcXFxcfFwiIDogRlMpK1wiKyRcIik7XG5cdHZhciByb3cvKjo/c3RyaW5nKi8gPSBcIlwiLCBjb2xzLyo6QXJyYXk8c3RyaW5nPiovID0gW107XG5cdG8uZGVuc2UgPSBBcnJheS5pc0FycmF5KHNoZWV0KTtcblx0dmFyIGNvbGluZm8vKjpBcnJheTxDb2xJbmZvPiovID0gby5za2lwSGlkZGVuICYmIHNoZWV0W1wiIWNvbHNcIl0gfHwgW107XG5cdHZhciByb3dpbmZvLyo6QXJyYXk8Um93SW5mbz4qLyA9IG8uc2tpcEhpZGRlbiAmJiBzaGVldFtcIiFyb3dzXCJdIHx8IFtdO1xuXHRmb3IodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSBpZiAoISgoY29saW5mb1tDXXx8e30pLmhpZGRlbikpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHR2YXIgUiA9IHIucy5yO1xuXHR2YXIgQk9NID0gZmFsc2UsIHcgPSAwO1xuXHRzdHJlYW0uX3JlYWQgPSBmdW5jdGlvbigpIHtcblx0XHRpZighQk9NKSB7IEJPTSA9IHRydWU7IHJldHVybiBzdHJlYW0ucHVzaChcIlxcdUZFRkZcIik7IH1cblx0XHR3aGlsZShSIDw9IHIuZS5yKSB7XG5cdFx0XHQrK1I7XG5cdFx0XHRpZiAoKHJvd2luZm9bUi0xXXx8e30pLmhpZGRlbikgY29udGludWU7XG5cdFx0XHRyb3cgPSBtYWtlX2Nzdl9yb3coc2hlZXQsIHIsIFItMSwgY29scywgZnMsIHJzLCBGUywgbyk7XG5cdFx0XHRpZihyb3cgIT0gbnVsbCkge1xuXHRcdFx0XHRpZihvLnN0cmlwKSByb3cgPSByb3cucmVwbGFjZShlbmRyZWdleCxcIlwiKTtcblx0XHRcdFx0aWYocm93IHx8IChvLmJsYW5rcm93cyAhPT0gZmFsc2UpKSByZXR1cm4gc3RyZWFtLnB1c2goKHcrKyA/IFJTIDogXCJcIikgKyByb3cpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG5cdH07XG5cdHJldHVybiBzdHJlYW07XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2h0bWxfc3RyZWFtKHdzLyo6V29ya3NoZWV0Ki8sIG9wdHMvKjo/U2hlZXQySFRNTE9wdHMqLykge1xuXHR2YXIgc3RyZWFtID0gX1JlYWRhYmxlKCk7XG5cblx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHR2YXIgaGVhZGVyID0gby5oZWFkZXIgIT0gbnVsbCA/IG8uaGVhZGVyIDogSFRNTF9CRUdJTjtcblx0dmFyIGZvb3RlciA9IG8uZm9vdGVyICE9IG51bGwgPyBvLmZvb3RlciA6IEhUTUxfRU5EO1xuXHRzdHJlYW0ucHVzaChoZWFkZXIpO1xuXHR2YXIgciA9IGRlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0by5kZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHRzdHJlYW0ucHVzaChtYWtlX2h0bWxfcHJlYW1ibGUod3MsIHIsIG8pKTtcblx0dmFyIFIgPSByLnMucjtcblx0dmFyIGVuZCA9IGZhbHNlO1xuXHRzdHJlYW0uX3JlYWQgPSBmdW5jdGlvbigpIHtcblx0XHRpZihSID4gci5lLnIpIHtcblx0XHRcdGlmKCFlbmQpIHsgZW5kID0gdHJ1ZTsgc3RyZWFtLnB1c2goXCI8L3RhYmxlPlwiICsgZm9vdGVyKTsgfVxuXHRcdFx0cmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xuXHRcdH1cblx0XHR3aGlsZShSIDw9IHIuZS5yKSB7XG5cdFx0XHRzdHJlYW0ucHVzaChtYWtlX2h0bWxfcm93KHdzLCByLCBSLCBvKSk7XG5cdFx0XHQrK1I7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH07XG5cdHJldHVybiBzdHJlYW07XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2pzb25fc3RyZWFtKHNoZWV0Lyo6V29ya3NoZWV0Ki8sIG9wdHMvKjo/U2hlZXQyQ1NWT3B0cyovKSB7XG5cdHZhciBzdHJlYW0gPSBfUmVhZGFibGUoe29iamVjdE1vZGU6dHJ1ZX0pO1xuXG5cdGlmKHNoZWV0ID09IG51bGwgfHwgc2hlZXRbXCIhcmVmXCJdID09IG51bGwpIHsgc3RyZWFtLnB1c2gobnVsbCk7IHJldHVybiBzdHJlYW07IH1cblx0dmFyIHZhbCA9IHt0OiduJyx2OjB9LCBoZWFkZXIgPSAwLCBvZmZzZXQgPSAxLCBoZHIvKjpBcnJheTxhbnk+Ki8gPSBbXSwgdj0wLCB2dj1cIlwiO1xuXHR2YXIgciA9IHtzOntyOjAsYzowfSxlOntyOjAsYzowfX07XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0dmFyIHJhbmdlID0gby5yYW5nZSAhPSBudWxsID8gby5yYW5nZSA6IHNoZWV0W1wiIXJlZlwiXTtcblx0aWYoby5oZWFkZXIgPT09IDEpIGhlYWRlciA9IDE7XG5cdGVsc2UgaWYoby5oZWFkZXIgPT09IFwiQVwiKSBoZWFkZXIgPSAyO1xuXHRlbHNlIGlmKEFycmF5LmlzQXJyYXkoby5oZWFkZXIpKSBoZWFkZXIgPSAzO1xuXHRzd2l0Y2godHlwZW9mIHJhbmdlKSB7XG5cdFx0Y2FzZSAnc3RyaW5nJzogciA9IHNhZmVfZGVjb2RlX3JhbmdlKHJhbmdlKTsgYnJlYWs7XG5cdFx0Y2FzZSAnbnVtYmVyJzogciA9IHNhZmVfZGVjb2RlX3JhbmdlKHNoZWV0W1wiIXJlZlwiXSk7IHIucy5yID0gcmFuZ2U7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHIgPSByYW5nZTtcblx0fVxuXHRpZihoZWFkZXIgPiAwKSBvZmZzZXQgPSAwO1xuXHR2YXIgcnIgPSBlbmNvZGVfcm93KHIucy5yKTtcblx0dmFyIGNvbHMvKjpBcnJheTxzdHJpbmc+Ki8gPSBbXTtcblx0dmFyIGNvdW50ZXIgPSAwO1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHNoZWV0KTtcblx0dmFyIFIgPSByLnMuciwgQyA9IDA7XG5cdHZhciBoZWFkZXJfY250ID0ge307XG5cdGlmKGRlbnNlICYmICFzaGVldFtSXSkgc2hlZXRbUl0gPSBbXTtcblx0dmFyIGNvbGluZm8vKjpBcnJheTxDb2xJbmZvPiovID0gby5za2lwSGlkZGVuICYmIHNoZWV0W1wiIWNvbHNcIl0gfHwgW107XG5cdHZhciByb3dpbmZvLyo6QXJyYXk8Um93SW5mbz4qLyA9IG8uc2tpcEhpZGRlbiAmJiBzaGVldFtcIiFyb3dzXCJdIHx8IFtdO1xuXHRmb3IoQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRpZigoKGNvbGluZm9bQ118fHt9KS5oaWRkZW4pKSBjb250aW51ZTtcblx0XHRjb2xzW0NdID0gZW5jb2RlX2NvbChDKTtcblx0XHR2YWwgPSBkZW5zZSA/IHNoZWV0W1JdW0NdIDogc2hlZXRbY29sc1tDXSArIHJyXTtcblx0XHRzd2l0Y2goaGVhZGVyKSB7XG5cdFx0XHRjYXNlIDE6IGhkcltDXSA9IEMgLSByLnMuYzsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IGhkcltDXSA9IGNvbHNbQ107IGJyZWFrO1xuXHRcdFx0Y2FzZSAzOiBoZHJbQ10gPSBvLmhlYWRlcltDIC0gci5zLmNdOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKHZhbCA9PSBudWxsKSB2YWwgPSB7dzogXCJfX0VNUFRZXCIsIHQ6IFwic1wifTtcblx0XHRcdFx0dnYgPSB2ID0gZm9ybWF0X2NlbGwodmFsLCBudWxsLCBvKTtcblx0XHRcdFx0Y291bnRlciA9IGhlYWRlcl9jbnRbdl0gfHwgMDtcblx0XHRcdFx0aWYoIWNvdW50ZXIpIGhlYWRlcl9jbnRbdl0gPSAxO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRkbyB7IHZ2ID0gdiArIFwiX1wiICsgKGNvdW50ZXIrKyk7IH0gd2hpbGUoaGVhZGVyX2NudFt2dl0pOyBoZWFkZXJfY250W3ZdID0gY291bnRlcjtcblx0XHRcdFx0XHRoZWFkZXJfY250W3Z2XSA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGRyW0NdID0gdnY7XG5cdFx0fVxuXHR9XG5cdFIgPSByLnMuciArIG9mZnNldDtcblx0c3RyZWFtLl9yZWFkID0gZnVuY3Rpb24oKSB7XG5cdFx0d2hpbGUoUiA8PSByLmUucikge1xuXHRcdFx0aWYgKChyb3dpbmZvW1ItMV18fHt9KS5oaWRkZW4pIGNvbnRpbnVlO1xuXHRcdFx0dmFyIHJvdyA9IG1ha2VfanNvbl9yb3coc2hlZXQsIHIsIFIsIGNvbHMsIGhlYWRlciwgaGRyLCBkZW5zZSwgbyk7XG5cdFx0XHQrK1I7XG5cdFx0XHRpZigocm93LmlzZW1wdHkgPT09IGZhbHNlKSB8fCAoaGVhZGVyID09PSAxID8gby5ibGFua3Jvd3MgIT09IGZhbHNlIDogISFvLmJsYW5rcm93cykpIHtcblx0XHRcdFx0c3RyZWFtLnB1c2gocm93LnJvdyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xuXHR9O1xuXHRyZXR1cm4gc3RyZWFtO1xufVxuXG52YXIgX19zdHJlYW0gPSB7XG5cdHRvX2pzb246IHdyaXRlX2pzb25fc3RyZWFtLFxuXHR0b19odG1sOiB3cml0ZV9odG1sX3N0cmVhbSxcblx0dG9fY3N2OiB3cml0ZV9jc3Zfc3RyZWFtLFxuICBzZXRfcmVhZGFibGU6IHNldF9yZWFkYWJsZVxufTtcbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gWExTWC52ZXJzaW9uO1xuZXhwb3J0IHtcblx0cGFyc2VfeGxzY2ZiLFxuXHRwYXJzZV96aXAsXG5cdHJlYWRTeW5jIGFzIHJlYWQsXG5cdHJlYWRGaWxlU3luYyBhcyByZWFkRmlsZSxcblx0cmVhZEZpbGVTeW5jLFxuXHR3cml0ZVN5bmMgYXMgd3JpdGUsXG5cdHdyaXRlRmlsZVN5bmMgYXMgd3JpdGVGaWxlLFxuXHR3cml0ZUZpbGVTeW5jLFxuXHR3cml0ZUZpbGVBc3luYyxcblx0d3JpdGVTeW5jWExTWCBhcyB3cml0ZVhMU1gsXG5cdHdyaXRlRmlsZVN5bmNYTFNYIGFzIHdyaXRlRmlsZVhMU1gsXG5cdHV0aWxzLFxuXHRfX3N0cmVhbSBhcyBzdHJlYW0sXG5cdFNTRixcblx0Q0ZCXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9