UNPKG

@senx/warpview-editor

Version:

WarpView Editor Elements

232 lines 33.1 kB
/* * Copyright 2020-2023 SenX S.A.S. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Little class to store statement and its offset in the text */ export class wsStatement { constructor(statement, offset) { this.statement = statement; this.offset = offset; } } export class WarpScriptParser { /** * Look for a statement position in the recursive tree of macros markers. * * @param macroPositions the table of macro positions (output of parseWarpScriptMacros) * @param offset the absolute position of the start of statement you are looking for * @param numberOfMacros the expected number of macros */ static findMacrosBeforePosition(macroPositions, offset, numberOfMacros) { for (let idx = 0; idx < macroPositions.length; idx++) { if (macroPositions[idx] instanceof wsStatement && macroPositions[idx].offset == offset) { //found the statement. need to return previous macros as ranges let pidx = idx - 1; let c = 0; let startEndList = []; while (pidx >= 0 && c < numberOfMacros) { if (macroPositions[pidx] instanceof wsStatement) { break; } else { if (typeof (macroPositions[pidx]) !== 'number') { startEndList.push([macroPositions[pidx][0], macroPositions[pidx][macroPositions[pidx].length - 1]]); c++; } } pidx--; } return startEndList; } else if (typeof (macroPositions[idx]) === 'number') { // console.log("not in this block") } else { let r = this.findMacrosBeforePosition(macroPositions[idx], offset, numberOfMacros); if (null !== r) { return r; } } } return null; } /** * Unlike parseWarpScriptMacros, this function return a very simple list of statements (as strings), ignoring comments. * [ '"HELLO"' '"WORLD"' '+' '2' '2' '*' ] * * When called with withPosition true, it returns a list of list than include start and end position of the statement: * [ [ '"HELLO"' 4 11 ] [ '"WORLD"' 22 29 ] ] */ static parseWarpScriptStatements(ws, withPosition = false) { let i = 0; let result = []; while (i < ws.length - 1) { //often test 2 characters if (ws.charAt(i) == '<' && ws.charAt(i + 1) == '\'') { //start of a multiline, look for end // console.log(i, 'start of multiline'); let lines = ws.substring(i, ws.length).split('\n'); let lc = 0; while (lc < lines.length && lines[lc].trim() != '\'>') { i += lines[lc].length + 1; lc++; } i += lines[lc].length + 1; // console.log(i, 'end of multiline'); } if (ws.charAt(i) == '/' && ws.charAt(i + 1) == '*') { //start one multiline comment, seek for end of comment // console.log(i, 'start of multiline comment'); i++; while (i < ws.length - 1 && !(ws.charAt(i) == '*' && ws.charAt(i + 1) == '/')) { i++; } i += 2; // console.log(i, 'end of multiline comment'); } if (ws.charAt(i) == '/' && ws.charAt(i + 1) == '/') { //start single line comment, seek for end of line // console.log(i, 'start of a comment'); i++; while (i < ws.length - 1 && (ws.charAt(i) != '\n')) { i++; } // console.log(i, 'end of a comment'); } if (ws.charAt(i) == '\'') { //start of string, seek for end // console.log(i, 'start of string'); let start = i; i++; while (i < ws.length && ws.charAt(i) != '\'' && ws.charAt(i) != '\n') { i++; } i++; result.push(ws.substring(start, i).replace('\r', '')); // console.log(i, 'end of string'); } if (ws.charAt(i) == '"') { //start of string, seek for end // console.log(i, 'start of string'); let start = i; i++; while (i < ws.length && ws.charAt(i) != '"' && ws.charAt(i) != '\n') { i++; } // console.log(i, 'end of string'); i++; result.push(ws.substring(start, i).replace('\r', '')); } if (ws.charAt(i) == '<' && ws.charAt(i + 1) == '%') { //start of a macro. // console.log(i, 'start of macro'); result.push('<%'); i += 2; } if (ws.charAt(i) == '%' && ws.charAt(i + 1) == '>') { //end of a macro. // console.log(i, 'end of macro'); result.push('%>'); i += 2; } if (ws.charAt(i) != ' ' && ws.charAt(i) != '\n') { let start = i; while (i < ws.length && ws.charAt(i) != ' ' && ws.charAt(i) != '\n') { i++; } if (withPosition) { result.push([ws.substring(start, i).replace('\r', ''), start, i]); } else { result.push(ws.substring(start, i).replace('\r', '')); } } i++; } return result; } static extractSpecialComments(executedWarpScript) { let result = {}; let warpscriptlines = executedWarpScript.split('\n'); result.listOfMacroInclusion = []; result.listOfMacroInclusionRange = []; for (let l = 0; l < warpscriptlines.length; l++) { let currentline = warpscriptlines[l]; if (currentline.startsWith('//')) { //find and extract // @paramname parameters let extraparamsPattern = /\/\/\s*@(\w*)\s*(.*)$/g; let lineonMatch; let re = RegExp(extraparamsPattern); while (lineonMatch = re.exec(currentline.replace('\r', ''))) { //think about windows... \r\n in mc2 files ! let parametername = lineonMatch[1]; let parametervalue = lineonMatch[2]; switch (parametername) { case 'endpoint': // // @endpoint http://mywarp10server/api/v0/exec result.endpoint = parametervalue; // overrides the Warp10URL configuration break; case 'localmacrosubstitution': result.localmacrosubstitution = ('true' === parametervalue.trim().toLowerCase()); // overrides the substitutionWithLocalMacros break; case 'timeunit': if (['us', 'ms', 'ns'].indexOf(parametervalue.trim()) > -1) { result.timeunit = parametervalue.trim(); } break; case 'preview': switch (parametervalue.toLowerCase().substring(0, 4)) { case 'none': result.displayPreviewOpt = 'X'; break; case 'gts': result.displayPreviewOpt = 'G'; break; case 'imag': result.displayPreviewOpt = 'I'; break; case 'json': result.displayPreviewOpt = 'J'; break; case 'disc': result.displayPreviewOpt = 'D'; break; default: result.displayPreviewOpt = ''; break; } break; case 'include': let p = parametervalue.trim(); if (p.startsWith('macro:')) { p = p.substring(6).trim(); result.listOfMacroInclusion.push(p); let r = { startLineNumber: l, startColumn: 3, endLineNumber: l, endColumn: currentline.trim().length }; result.listOfMacroInclusionRange.push(r); } break; case 'theme': result.theme = parametervalue.trim().toLowerCase(); break; default: break; } } } else { if (currentline.trim().length > 0) { break; //no more comments at the beginning of the file } } } return result; } static IsWsLitteralString(s) { // up to MemoryWarpScriptStack, a valid string is: return (s.length >= 2 && ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith('\'') && s.endsWith('\'')))); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FycFNjcmlwdFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dhcnB2aWV3LWVkaXRvci1uZy9zcmMvbGliL21vZGVsL3dhcnBTY3JpcHRQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFlSDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksU0FBaUIsRUFBRSxNQUFjO1FBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFFM0I7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLHdCQUF3QixDQUFDLGNBQW1CLEVBQUUsTUFBYyxFQUFFLGNBQXNCO1FBRWhHLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BELElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxZQUFZLFdBQVcsSUFBSyxjQUFjLENBQUMsR0FBRyxDQUFpQixDQUFDLE1BQU0sSUFBSSxNQUFNLEVBQUU7Z0JBQ3ZHLCtEQUErRDtnQkFDL0QsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLElBQUksWUFBWSxHQUFVLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLEVBQUU7b0JBQ3RDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLFdBQVcsRUFBRTt3QkFDL0MsTUFBTTtxQkFDUDt5QkFBTTt3QkFDTCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsS0FB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LENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IDIwMjAtMjAyMyBTZW5YIFMuQS5TLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBQYXJzaW5nIHJlc3VsdCBvZiAvLyBAY29tbWFuZCBwYXJhbWV0ZXIgIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFdhcnBTY3JpcHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBzcGVjaWFsQ29tbWVudENvbW1hbmRzIHtcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHRpbWV1bml0Pzogc3RyaW5nO1xuICBsb2NhbG1hY3Jvc3Vic3RpdHV0aW9uPzogYm9vbGVhbjtcbiAgZGlzcGxheVByZXZpZXdPcHQ/OiBzdHJpbmc7XG4gIGxpc3RPZk1hY3JvSW5jbHVzaW9uPzogc3RyaW5nW107XG4gIGxpc3RPZk1hY3JvSW5jbHVzaW9uUmFuZ2U/OiBhbnlbXTtcbiAgdGhlbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGl0dGxlIGNsYXNzIHRvIHN0b3JlIHN0YXRlbWVudCBhbmQgaXRzIG9mZnNldCBpbiB0aGUgdGV4dFxuICovXG5leHBvcnQgY2xhc3Mgd3NTdGF0ZW1lbnQge1xuICBwdWJsaWMgc3RhdGVtZW50OiBzdHJpbmc7XG4gIHB1YmxpYyBvZmZzZXQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzdGF0ZW1lbnQ6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDtcbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2FycFNjcmlwdFBhcnNlciB7XG5cbiAgLyoqXG4gICAqIExvb2sgZm9yIGEgc3RhdGVtZW50IHBvc2l0aW9uIGluIHRoZSByZWN1cnNpdmUgdHJlZSBvZiBtYWNyb3MgbWFya2Vycy5cbiAgICpcbiAgICogQHBhcmFtIG1hY3JvUG9zaXRpb25zIHRoZSB0YWJsZSBvZiBtYWNybyBwb3NpdGlvbnMgKG91dHB1dCBvZiBwYXJzZVdhcnBTY3JpcHRNYWNyb3MpXG4gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiBzdGF0ZW1lbnQgeW91IGFyZSBsb29raW5nIGZvclxuICAgKiBAcGFyYW0gbnVtYmVyT2ZNYWNyb3MgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBtYWNyb3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmluZE1hY3Jvc0JlZm9yZVBvc2l0aW9uKG1hY3JvUG9zaXRpb25zOiBhbnksIG9mZnNldDogbnVtYmVyLCBudW1iZXJPZk1hY3JvczogbnVtYmVyKTogYW55W10ge1xuXG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbWFjcm9Qb3NpdGlvbnMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKG1hY3JvUG9zaXRpb25zW2lkeF0gaW5zdGFuY2VvZiB3c1N0YXRlbWVudCAmJiAobWFjcm9Qb3NpdGlvbnNbaWR4XSBhcyB3c1N0YXRlbWVudCkub2Zmc2V0ID09IG9mZnNldCkge1xuICAgICAgICAvL2ZvdW5kIHRoZSBzdGF0ZW1lbnQuIG5lZWQgdG8gcmV0dXJuIHByZXZpb3VzIG1hY3JvcyBhcyByYW5nZXNcbiAgICAgICAgbGV0IHBpZHggPSBpZHggLSAxO1xuICAgICAgICBsZXQgYyA9IDA7XG4gICAgICAgIGxldCBzdGFydEVuZExpc3Q6IGFueVtdID0gW107XG4gICAgICAgIHdoaWxlIChwaWR4ID49IDAgJiYgYyA8IG51bWJlck9mTWFjcm9zKSB7XG4gICAgICAgICAgaWYgKG1hY3JvUG9zaXRpb25zW3BpZHhdIGluc3RhbmNlb2Ygd3NTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChtYWNyb1Bvc2l0aW9uc1twaWR4XSkgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHN0YXJ0RW5kTGlzdC5wdXNoKFttYWNyb1Bvc2l0aW9uc1twaWR4XVswXSwgbWFjcm9Qb3NpdGlvbnNbcGlkeF1bbWFjcm9Qb3NpdGlvbnNbcGlkeF0ubGVuZ3RoIC0gMV1dKTtcbiAgICAgICAgICAgICAgYysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwaWR4LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0RW5kTGlzdDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIChtYWNyb1Bvc2l0aW9uc1tpZHhdKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJub3QgaW4gdGhpcyBibG9ja1wiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHIgPSB0aGlzLmZpbmRNYWNyb3NCZWZvcmVQb3NpdGlvbihtYWNyb1Bvc2l0aW9uc1tpZHhdLCBvZmZzZXQsIG51bWJlck9mTWFjcm9zKTtcbiAgICAgICAgaWYgKG51bGwgIT09IHIpIHtcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubGlrZSBwYXJzZVdhcnBTY3JpcHRNYWNyb3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJuIGEgdmVyeSBzaW1wbGUgbGlzdCBvZiBzdGF0ZW1lbnRzIChhcyBzdHJpbmdzKSwgaWdub3JpbmcgY29tbWVudHMuXG4gICAqIFsgJ1wiSEVMTE9cIicgJ1wiV09STERcIicgJysnICcyJyAnMicgJyonIF1cbiAgICpcbiAgICogV2hlbiBjYWxsZWQgd2l0aCB3aXRoUG9zaXRpb24gdHJ1ZSwgaXQgcmV0dXJucyBhIGxpc3Qgb2YgbGlzdCB0aGFuIGluY2x1ZGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbiBvZiB0aGUgc3RhdGVtZW50OlxuICAgKiBbIFsgJ1wiSEVMTE9cIicgNCAxMSBdIFsgJ1wiV09STERcIicgMjIgMjkgXSAgXVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwYXJzZVdhcnBTY3JpcHRTdGF0ZW1lbnRzKHdzOiBTdHJpbmcsIHdpdGhQb3NpdGlvbiA9IGZhbHNlKTogYW55W10ge1xuXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcblxuICAgIHdoaWxlIChpIDwgd3MubGVuZ3RoIC0gMSkgeyAvL29mdGVuIHRlc3QgMiBjaGFyYWN0ZXJzXG4gICAgICBpZiAod3MuY2hhckF0KGkpID09ICc8JyAmJiB3cy5jaGFyQXQoaSArIDEpID09ICdcXCcnKSB7IC8vc3RhcnQgb2YgYSBtdWx0aWxpbmUsIGxvb2sgZm9yIGVuZFxuICAgICAgICAvLyBjb25zb2xlLmxvZyhpLCAnc3RhcnQgb2YgbXVsdGlsaW5lJyk7XG4gICAgICAgIGxldCBsaW5lczogc3RyaW5nW10gPSB3cy5zdWJzdHJpbmcoaSwgd3MubGVuZ3RoKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGxldCBsYyA9IDA7XG4gICAgICAgIHdoaWxlIChsYyA8IGxpbmVzLmxlbmd0aCAmJiBsaW5lc1tsY10udHJpbSgpICE9ICdcXCc+Jykge1xuICAgICAgICAgIGkgKz0gbGluZXNbbGNdLmxlbmd0aCArIDE7XG4gICAgICAgICAgbGMrKztcbiAgICAgICAgfVxuICAgICAgICBpICs9IGxpbmVzW2xjXS5sZW5ndGggKyAxO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhpLCAnZW5kIG9mIG11bHRpbGluZScpO1xuICAgICAgfVxuICAgICAgaWYgKHdzLmNoYXJBdChpKSA9PSAnLycgJiYgd3MuY2hhckF0KGkgKyAxKSA9PSAnKicpIHsgLy9zdGFydCBvbmUgbXVsdGlsaW5lIGNvbW1lbnQsIHNlZWsgZm9yIGVuZCBvZiBjb21tZW50XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGksICdzdGFydCBvZiBtdWx0aWxpbmUgY29tbWVudCcpO1xuICAgICAgICBpKys7XG4gICAgICAgIHdoaWxlIChpIDwgd3MubGVuZ3RoIC0gMSAmJiAhKHdzLmNoYXJBdChpKSA9PSAnKicgJiYgd3MuY2hhckF0KGkgKyAxKSA9PSAnLycpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaSwgJ2VuZCBvZiBtdWx0aWxpbmUgY29tbWVudCcpO1xuICAgICAgfVxuICAgICAgaWYgKHdzLmNoYXJBdChpKSA9PSAnLycgJiYgd3MuY2hhckF0KGkgKyAxKSA9PSAnLycpIHsgLy9zdGFydCBzaW5nbGUgbGluZSBjb21tZW50LCBzZWVrIGZvciBlbmQgb2YgbGluZVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhpLCAnc3RhcnQgb2YgYSBjb21tZW50Jyk7XG4gICAgICAgIGkrKztcbiAgICAgICAgd2hpbGUgKGkgPCB3cy5sZW5ndGggLSAxICYmICh3cy5jaGFyQXQoaSkgIT0gJ1xcbicpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGksICdlbmQgb2YgYSBjb21tZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3cy5jaGFyQXQoaSkgPT0gJ1xcJycpIHsgLy9zdGFydCBvZiBzdHJpbmcsIHNlZWsgZm9yIGVuZFxuICAgICAgICAvLyBjb25zb2xlLmxvZyhpLCAnc3RhcnQgb2Ygc3RyaW5nJyk7XG4gICAgICAgIGxldCBzdGFydCA9IGk7XG4gICAgICAgIGkrKztcbiAgICAgICAgd2hpbGUgKGkgPCB3cy5sZW5ndGggJiYgd3MuY2hhckF0KGkpICE9ICdcXCcnICYmIHdzLmNoYXJBdChpKSAhPSAnXFxuJykge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICAgIHJlc3VsdC5wdXNoKHdzLnN1YnN0cmluZyhzdGFydCwgaSkucmVwbGFjZSgnXFxyJywgJycpKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaSwgJ2VuZCBvZiBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh3cy5jaGFyQXQoaSkgPT0gJ1wiJykgeyAvL3N0YXJ0IG9mIHN0cmluZywgc2VlayBmb3IgZW5kXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGksICdzdGFydCBvZiBzdHJpbmcnKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gaTtcbiAgICAgICAgaSsrO1xuICAgICAgICB3aGlsZSAoaSA8IHdzLmxlbmd0aCAmJiB3cy5jaGFyQXQoaSkgIT0gJ1wiJyAmJiB3cy5jaGFyQXQoaSkgIT0gJ1xcbicpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coaSwgJ2VuZCBvZiBzdHJpbmcnKTtcbiAgICAgICAgaSsrO1xuICAgICAgICByZXN1bHQucHVzaCh3cy5zdWJzdHJpbmcoc3RhcnQsIGkpLnJlcGxhY2UoJ1xccicsICcnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3cy5jaGFyQXQoaSkgPT0gJzwnICYmIHdzLmNoYXJBdChpICsgMSkgPT0gJyUnKSB7IC8vc3RhcnQgb2YgYSBtYWNyby5cbiAgICAgICAgLy8gY29uc29sZS5sb2coaSwgJ3N0YXJ0IG9mIG1hY3JvJyk7XG4gICAgICAgIHJlc3VsdC5wdXNoKCc8JScpO1xuICAgICAgICBpICs9IDI7XG4gICAgICB9XG5cbiAgICAgIGlmICh3cy5jaGFyQXQoaSkgPT0gJyUnICYmIHdzLmNoYXJBdChpICsgMSkgPT0gJz4nKSB7IC8vZW5kIG9mIGEgbWFjcm8uXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGksICdlbmQgb2YgbWFjcm8nKTtcbiAgICAgICAgcmVzdWx0LnB1c2goJyU+Jyk7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgIH1cblxuICAgICAgaWYgKHdzLmNoYXJBdChpKSAhPSAnICcgJiYgd3MuY2hhckF0KGkpICE9ICdcXG4nKSB7XG4gICAgICAgIGxldCBzdGFydCA9IGk7XG4gICAgICAgIHdoaWxlIChpIDwgd3MubGVuZ3RoICYmIHdzLmNoYXJBdChpKSAhPSAnICcgJiYgd3MuY2hhckF0KGkpICE9ICdcXG4nKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aXRoUG9zaXRpb24pIHtcbiAgICAgICAgICByZXN1bHQucHVzaChbd3Muc3Vic3RyaW5nKHN0YXJ0LCBpKS5yZXBsYWNlKCdcXHInLCAnJyksIHN0YXJ0LCBpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2god3Muc3Vic3RyaW5nKHN0YXJ0LCBpKS5yZXBsYWNlKCdcXHInLCAnJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdFNwZWNpYWxDb21tZW50cyhleGVjdXRlZFdhcnBTY3JpcHQ6IHN0cmluZyk6IHNwZWNpYWxDb21tZW50Q29tbWFuZHMge1xuICAgIGxldCByZXN1bHQ6IHNwZWNpYWxDb21tZW50Q29tbWFuZHMgPSB7fTtcbiAgICBsZXQgd2FycHNjcmlwdGxpbmVzID0gZXhlY3V0ZWRXYXJwU2NyaXB0LnNwbGl0KCdcXG4nKTtcbiAgICByZXN1bHQubGlzdE9mTWFjcm9JbmNsdXNpb24gPSBbXTtcbiAgICByZXN1bHQubGlzdE9mTWFjcm9JbmNsdXNpb25SYW5nZSA9IFtdO1xuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgd2FycHNjcmlwdGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICBsZXQgY3VycmVudGxpbmUgPSB3YXJwc2NyaXB0bGluZXNbbF07XG4gICAgICBpZiAoY3VycmVudGxpbmUuc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgICAvL2ZpbmQgYW5kIGV4dHJhY3QgLy8gQHBhcmFtbmFtZSBwYXJhbWV0ZXJzXG4gICAgICAgIGxldCBleHRyYXBhcmFtc1BhdHRlcm4gPSAvXFwvXFwvXFxzKkAoXFx3KilcXHMqKC4qKSQvZztcbiAgICAgICAgbGV0IGxpbmVvbk1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbDtcbiAgICAgICAgbGV0IHJlID0gUmVnRXhwKGV4dHJhcGFyYW1zUGF0dGVybik7XG4gICAgICAgIHdoaWxlIChsaW5lb25NYXRjaCA9IHJlLmV4ZWMoY3VycmVudGxpbmUucmVwbGFjZSgnXFxyJywgJycpKSkgeyAgLy90aGluayBhYm91dCB3aW5kb3dzLi4uIFxcclxcbiBpbiBtYzIgZmlsZXMgIVxuICAgICAgICAgIGxldCBwYXJhbWV0ZXJuYW1lID0gbGluZW9uTWF0Y2hbMV07XG4gICAgICAgICAgbGV0IHBhcmFtZXRlcnZhbHVlID0gbGluZW9uTWF0Y2hbMl07XG4gICAgICAgICAgc3dpdGNoIChwYXJhbWV0ZXJuYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdlbmRwb2ludCc6ICAgICAgICAvLyAgICAgICAgLy8gQGVuZHBvaW50IGh0dHA6Ly9teXdhcnAxMHNlcnZlci9hcGkvdjAvZXhlY1xuICAgICAgICAgICAgICByZXN1bHQuZW5kcG9pbnQgPSBwYXJhbWV0ZXJ2YWx1ZTsgICAvLyBvdmVycmlkZXMgdGhlIFdhcnAxMFVSTCBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9jYWxtYWNyb3N1YnN0aXR1dGlvbic6XG4gICAgICAgICAgICAgIHJlc3VsdC5sb2NhbG1hY3Jvc3Vic3RpdHV0aW9uID0gKCd0cnVlJyA9PT0gcGFyYW1ldGVydmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpOyAgIC8vIG92ZXJyaWRlcyB0aGUgc3Vic3RpdHV0aW9uV2l0aExvY2FsTWFjcm9zXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGltZXVuaXQnOlxuICAgICAgICAgICAgICBpZiAoWyd1cycsICdtcycsICducyddLmluZGV4T2YocGFyYW1ldGVydmFsdWUudHJpbSgpKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRpbWV1bml0ID0gcGFyYW1ldGVydmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHJldmlldyc6XG4gICAgICAgICAgICAgIHN3aXRjaCAocGFyYW1ldGVydmFsdWUudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMCwgNCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwbGF5UHJldmlld09wdCA9ICdYJztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2d0cyc6XG4gICAgICAgICAgICAgICAgICByZXN1bHQuZGlzcGxheVByZXZpZXdPcHQgPSAnRyc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdpbWFnJzpcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwbGF5UHJldmlld09wdCA9ICdJJztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgICAgICAgICAgcmVzdWx0LmRpc3BsYXlQcmV2aWV3T3B0ID0gJ0onO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzYyc6XG4gICAgICAgICAgICAgICAgICByZXN1bHQuZGlzcGxheVByZXZpZXdPcHQgPSAnRCc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgcmVzdWx0LmRpc3BsYXlQcmV2aWV3T3B0ID0gJyc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2luY2x1ZGUnOlxuICAgICAgICAgICAgICBsZXQgcCA9IHBhcmFtZXRlcnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgaWYgKHAuc3RhcnRzV2l0aCgnbWFjcm86JykpIHtcbiAgICAgICAgICAgICAgICBwID0gcC5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5saXN0T2ZNYWNyb0luY2x1c2lvbi5wdXNoKHApO1xuICAgICAgICAgICAgICAgIGxldCByID0ge3N0YXJ0TGluZU51bWJlcjogbCwgc3RhcnRDb2x1bW46IDMsIGVuZExpbmVOdW1iZXI6IGwsIGVuZENvbHVtbjogY3VycmVudGxpbmUudHJpbSgpLmxlbmd0aH07XG4gICAgICAgICAgICAgICAgcmVzdWx0Lmxpc3RPZk1hY3JvSW5jbHVzaW9uUmFuZ2UucHVzaChyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RoZW1lJzpcbiAgICAgICAgICAgICAgcmVzdWx0LnRoZW1lID0gcGFyYW1ldGVydmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY3VycmVudGxpbmUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhazsgLy9ubyBtb3JlIGNvbW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBJc1dzTGl0dGVyYWxTdHJpbmcoczogU3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gdXAgdG8gTWVtb3J5V2FycFNjcmlwdFN0YWNrLCBhIHZhbGlkIHN0cmluZyBpczpcbiAgICByZXR1cm4gKHMubGVuZ3RoID49IDIgJiYgKChzLnN0YXJ0c1dpdGgoJ1wiJykgJiYgcy5lbmRzV2l0aCgnXCInKSkgfHwgKHMuc3RhcnRzV2l0aCgnXFwnJykgJiYgcy5lbmRzV2l0aCgnXFwnJykpKSk7XG4gIH1cblxufVxuIl19