403Webshell
Server IP : 46.62.235.243  /  Your IP : 216.73.216.163
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux Linkabili3Dicembre 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User : www-data ( 33)
PHP Version : 8.1.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /usr/share/node_modules/handlebars/dist/cjs/handlebars/compiler/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/share/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js
/*istanbul ignore next*/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Compiler = Compiler;
exports.precompile = precompile;
exports.compile = compile;

var
/*istanbul ignore next*/
_exception = _interopRequireDefault(require("../exception"));

var
/*istanbul ignore next*/
_utils = require("../utils");

var
/*istanbul ignore next*/
_ast = _interopRequireDefault(require("./ast"));

/*istanbul ignore next*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* eslint-disable new-cap */
var slice = [].slice;

function Compiler() {} // the foundHelper register will disambiguate helper lookup from finding a
// function in a context. This is necessary for mustache compatibility, which
// requires that context functions in blocks are evaluated by blockHelperMissing,
// and then proceed as if the resulting value was provided to blockHelperMissing.


Compiler.prototype = {
  compiler: Compiler,
  equals: function
  /*istanbul ignore next*/
  equals(other) {
    var len = this.opcodes.length;

    if (other.opcodes.length !== len) {
      return false;
    }

    for (var i = 0; i < len; i++) {
      var opcode = this.opcodes[i],
          otherOpcode = other.opcodes[i];

      if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {
        return false;
      }
    } // We know that length is the same between the two arrays because they are directly tied
    // to the opcode behavior above.


    len = this.children.length;

    for (var _i = 0; _i < len; _i++) {
      if (!this.children[_i].equals(other.children[_i])) {
        return false;
      }
    }

    return true;
  },
  guid: 0,
  compile: function
  /*istanbul ignore next*/
  compile(program, options) {
    this.sourceNode = [];
    this.opcodes = [];
    this.children = [];
    this.options = options;
    this.stringParams = options.stringParams;
    this.trackIds = options.trackIds;
    options.blockParams = options.blockParams || [];
    options.knownHelpers =
    /*istanbul ignore next*/
    (0,
    /*istanbul ignore next*/
    _utils.
    /*istanbul ignore next*/
    extend)(Object.create(null), {
      helperMissing: true,
      blockHelperMissing: true,
      each: true,

      /*istanbul ignore next*/
      "if": true,
      unless: true,

      /*istanbul ignore next*/
      "with": true,
      log: true,
      lookup: true
    }, options.knownHelpers);
    return this.accept(program);
  },
  compileProgram: function
  /*istanbul ignore next*/
  compileProgram(program) {
    var childCompiler = new this.compiler(),
        // eslint-disable-line new-cap
    result = childCompiler.compile(program, this.options),
        guid = this.guid++;
    this.usePartial = this.usePartial || result.usePartial;
    this.children[guid] = result;
    this.useDepths = this.useDepths || result.useDepths;
    return guid;
  },
  accept: function
  /*istanbul ignore next*/
  accept(node) {
    /* istanbul ignore next: Sanity code */
    if (!this[node.type]) {
      throw new
      /*istanbul ignore next*/
      _exception[
      /*istanbul ignore next*/
      "default"]('Unknown type: ' + node.type, node);
    }

    this.sourceNode.unshift(node);
    var ret = this[node.type](node);
    this.sourceNode.shift();
    return ret;
  },
  Program: function
  /*istanbul ignore next*/
  Program(program) {
    this.options.blockParams.unshift(program.blockParams);
    var body = program.body,
        bodyLength = body.length;

    for (var i = 0; i < bodyLength; i++) {
      this.accept(body[i]);
    }

    this.options.blockParams.shift();
    this.isSimple = bodyLength === 1;
    this.blockParams = program.blockParams ? program.blockParams.length : 0;
    return this;
  },
  BlockStatement: function
  /*istanbul ignore next*/
  BlockStatement(block) {
    transformLiteralToPath(block);
    var program = block.program,
        inverse = block.inverse;
    program = program && this.compileProgram(program);
    inverse = inverse && this.compileProgram(inverse);
    var type = this.classifySexpr(block);

    if (type === 'helper') {
      this.helperSexpr(block, program, inverse);
    } else if (type === 'simple') {
      this.simpleSexpr(block); // now that the simple mustache is resolved, we need to
      // evaluate it by executing `blockHelperMissing`

      this.opcode('pushProgram', program);
      this.opcode('pushProgram', inverse);
      this.opcode('emptyHash');
      this.opcode('blockValue', block.path.original);
    } else {
      this.ambiguousSexpr(block, program, inverse); // now that the simple mustache is resolved, we need to
      // evaluate it by executing `blockHelperMissing`

      this.opcode('pushProgram', program);
      this.opcode('pushProgram', inverse);
      this.opcode('emptyHash');
      this.opcode('ambiguousBlockValue');
    }

    this.opcode('append');
  },

  /*istanbul ignore next*/
  DecoratorBlock: function DecoratorBlock(decorator) {
    var program = decorator.program && this.compileProgram(decorator.program);
    var params = this.setupFullMustacheParams(decorator, program, undefined),
        path = decorator.path;
    this.useDecorators = true;
    this.opcode('registerDecorator', params.length, path.original);
  },
  PartialStatement: function
  /*istanbul ignore next*/
  PartialStatement(partial) {
    this.usePartial = true;
    var program = partial.program;

    if (program) {
      program = this.compileProgram(partial.program);
    }

    var params = partial.params;

    if (params.length > 1) {
      throw new
      /*istanbul ignore next*/
      _exception[
      /*istanbul ignore next*/
      "default"]('Unsupported number of partial arguments: ' + params.length, partial);
    } else if (!params.length) {
      if (this.options.explicitPartialContext) {
        this.opcode('pushLiteral', 'undefined');
      } else {
        params.push({
          type: 'PathExpression',
          parts: [],
          depth: 0
        });
      }
    }

    var partialName = partial.name.original,
        isDynamic = partial.name.type === 'SubExpression';

    if (isDynamic) {
      this.accept(partial.name);
    }

    this.setupFullMustacheParams(partial, program, undefined, true);
    var indent = partial.indent || '';

    if (this.options.preventIndent && indent) {
      this.opcode('appendContent', indent);
      indent = '';
    }

    this.opcode('invokePartial', isDynamic, partialName, indent);
    this.opcode('append');
  },
  PartialBlockStatement: function
  /*istanbul ignore next*/
  PartialBlockStatement(partialBlock) {
    this.PartialStatement(partialBlock);
  },
  MustacheStatement: function
  /*istanbul ignore next*/
  MustacheStatement(mustache) {
    this.SubExpression(mustache);

    if (mustache.escaped && !this.options.noEscape) {
      this.opcode('appendEscaped');
    } else {
      this.opcode('append');
    }
  },

  /*istanbul ignore next*/
  Decorator: function Decorator(decorator) {
    this.DecoratorBlock(decorator);
  },
  ContentStatement: function
  /*istanbul ignore next*/
  ContentStatement(content) {
    if (content.value) {
      this.opcode('appendContent', content.value);
    }
  },
  CommentStatement: function
  /*istanbul ignore next*/
  CommentStatement() {},
  SubExpression: function
  /*istanbul ignore next*/
  SubExpression(sexpr) {
    transformLiteralToPath(sexpr);
    var type = this.classifySexpr(sexpr);

    if (type === 'simple') {
      this.simpleSexpr(sexpr);
    } else if (type === 'helper') {
      this.helperSexpr(sexpr);
    } else {
      this.ambiguousSexpr(sexpr);
    }
  },
  ambiguousSexpr: function
  /*istanbul ignore next*/
  ambiguousSexpr(sexpr, program, inverse) {
    var path = sexpr.path,
        name = path.parts[0],
        isBlock = program != null || inverse != null;
    this.opcode('getContext', path.depth);
    this.opcode('pushProgram', program);
    this.opcode('pushProgram', inverse);
    path.strict = true;
    this.accept(path);
    this.opcode('invokeAmbiguous', name, isBlock);
  },
  simpleSexpr: function
  /*istanbul ignore next*/
  simpleSexpr(sexpr) {
    var path = sexpr.path;
    path.strict = true;
    this.accept(path);
    this.opcode('resolvePossibleLambda');
  },
  helperSexpr: function
  /*istanbul ignore next*/
  helperSexpr(sexpr, program, inverse) {
    var params = this.setupFullMustacheParams(sexpr, program, inverse),
        path = sexpr.path,
        name = path.parts[0];

    if (this.options.knownHelpers[name]) {
      this.opcode('invokeKnownHelper', params.length, name);
    } else if (this.options.knownHelpersOnly) {
      throw new
      /*istanbul ignore next*/
      _exception[
      /*istanbul ignore next*/
      "default"]('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr);
    } else {
      path.strict = true;
      path.falsy = true;
      this.accept(path);
      this.opcode('invokeHelper', params.length, path.original,
      /*istanbul ignore next*/
      _ast[
      /*istanbul ignore next*/
      "default"].helpers.simpleId(path));
    }
  },
  PathExpression: function
  /*istanbul ignore next*/
  PathExpression(path) {
    this.addDepth(path.depth);
    this.opcode('getContext', path.depth);

    var name = path.parts[0],
        scoped =
    /*istanbul ignore next*/
    _ast[
    /*istanbul ignore next*/
    "default"].helpers.scopedId(path),
        blockParamId = !path.depth && !scoped && this.blockParamIndex(name);

    if (blockParamId) {
      this.opcode('lookupBlockParam', blockParamId, path.parts);
    } else if (!name) {
      // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`
      this.opcode('pushContext');
    } else if (path.data) {
      this.options.data = true;
      this.opcode('lookupData', path.depth, path.parts, path.strict);
    } else {
      this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped);
    }
  },
  StringLiteral: function
  /*istanbul ignore next*/
  StringLiteral(string) {
    this.opcode('pushString', string.value);
  },
  NumberLiteral: function
  /*istanbul ignore next*/
  NumberLiteral(number) {
    this.opcode('pushLiteral', number.value);
  },
  BooleanLiteral: function
  /*istanbul ignore next*/
  BooleanLiteral(bool) {
    this.opcode('pushLiteral', bool.value);
  },
  UndefinedLiteral: function
  /*istanbul ignore next*/
  UndefinedLiteral() {
    this.opcode('pushLiteral', 'undefined');
  },
  NullLiteral: function
  /*istanbul ignore next*/
  NullLiteral() {
    this.opcode('pushLiteral', 'null');
  },
  Hash: function
  /*istanbul ignore next*/
  Hash(hash) {
    var pairs = hash.pairs,
        i = 0,
        l = pairs.length;
    this.opcode('pushHash');

    for (; i < l; i++) {
      this.pushParam(pairs[i].value);
    }

    while (i--) {
      this.opcode('assignToHash', pairs[i].key);
    }

    this.opcode('popHash');
  },
  // HELPERS
  opcode: function
  /*istanbul ignore next*/
  opcode(name) {
    this.opcodes.push({
      opcode: name,
      args: slice.call(arguments, 1),
      loc: this.sourceNode[0].loc
    });
  },
  addDepth: function
  /*istanbul ignore next*/
  addDepth(depth) {
    if (!depth) {
      return;
    }

    this.useDepths = true;
  },
  classifySexpr: function
  /*istanbul ignore next*/
  classifySexpr(sexpr) {
    var isSimple =
    /*istanbul ignore next*/
    _ast[
    /*istanbul ignore next*/
    "default"].helpers.simpleId(sexpr.path);

    var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); // a mustache is an eligible helper if:
    // * its id is simple (a single part, not `this` or `..`)

    var isHelper = !isBlockParam &&
    /*istanbul ignore next*/
    _ast[
    /*istanbul ignore next*/
    "default"].helpers.helperExpression(sexpr); // if a mustache is an eligible helper but not a definite
    // helper, it is ambiguous, and will be resolved in a later
    // pass or at runtime.


    var isEligible = !isBlockParam && (isHelper || isSimple); // if ambiguous, we can possibly resolve the ambiguity now
    // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.

    if (isEligible && !isHelper) {
      var name = sexpr.path.parts[0],
          options = this.options;

      if (options.knownHelpers[name]) {
        isHelper = true;
      } else if (options.knownHelpersOnly) {
        isEligible = false;
      }
    }

    if (isHelper) {
      return 'helper';
    } else if (isEligible) {
      return 'ambiguous';
    } else {
      return 'simple';
    }
  },
  pushParams: function
  /*istanbul ignore next*/
  pushParams(params) {
    for (var i = 0, l = params.length; i < l; i++) {
      this.pushParam(params[i]);
    }
  },
  pushParam: function
  /*istanbul ignore next*/
  pushParam(val) {
    var value = val.value != null ? val.value : val.original || '';

    if (this.stringParams) {
      if (value.replace) {
        value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.');
      }

      if (val.depth) {
        this.addDepth(val.depth);
      }

      this.opcode('getContext', val.depth || 0);
      this.opcode('pushStringParam', value, val.type);

      if (val.type === 'SubExpression') {
        // SubExpressions get evaluated and passed in
        // in string params mode.
        this.accept(val);
      }
    } else {
      if (this.trackIds) {
        var blockParamIndex;

        if (val.parts && !
        /*istanbul ignore next*/
        _ast[
        /*istanbul ignore next*/
        "default"].helpers.scopedId(val) && !val.depth) {
          blockParamIndex = this.blockParamIndex(val.parts[0]);
        }

        if (blockParamIndex) {
          var blockParamChild = val.parts.slice(1).join('.');
          this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild);
        } else {
          value = val.original || value;

          if (value.replace) {
            value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, '');
          }

          this.opcode('pushId', val.type, value);
        }
      }

      this.accept(val);
    }
  },
  setupFullMustacheParams: function
  /*istanbul ignore next*/
  setupFullMustacheParams(sexpr, program, inverse, omitEmpty) {
    var params = sexpr.params;
    this.pushParams(params);
    this.opcode('pushProgram', program);
    this.opcode('pushProgram', inverse);

    if (sexpr.hash) {
      this.accept(sexpr.hash);
    } else {
      this.opcode('emptyHash', omitEmpty);
    }

    return params;
  },
  blockParamIndex: function
  /*istanbul ignore next*/
  blockParamIndex(name) {
    for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) {
      var blockParams = this.options.blockParams[depth],
          param = blockParams &&
      /*istanbul ignore next*/
      (0,
      /*istanbul ignore next*/
      _utils.
      /*istanbul ignore next*/
      indexOf)(blockParams, name);

      if (blockParams && param >= 0) {
        return [depth, param];
      }
    }
  }
};

function precompile(input, options, env) {
  if (input == null || typeof input !== 'string' && input.type !== 'Program') {
    throw new
    /*istanbul ignore next*/
    _exception[
    /*istanbul ignore next*/
    "default"]('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input);
  }

  options = options || {};

  if (!('data' in options)) {
    options.data = true;
  }

  if (options.compat) {
    options.useDepths = true;
  }

  var ast = env.parse(input, options),
      environment = new env.Compiler().compile(ast, options);
  return new env.JavaScriptCompiler().compile(environment, options);
}

function compile(input) {
  /*istanbul ignore next*/
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

  /*istanbul ignore next*/
  var env = arguments.length > 2 ? arguments[2] : undefined;

  if (input == null || typeof input !== 'string' && input.type !== 'Program') {
    throw new
    /*istanbul ignore next*/
    _exception[
    /*istanbul ignore next*/
    "default"]('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);
  }

  options =
  /*istanbul ignore next*/
  (0,
  /*istanbul ignore next*/
  _utils.
  /*istanbul ignore next*/
  extend)({}, options);

  if (!('data' in options)) {
    options.data = true;
  }

  if (options.compat) {
    options.useDepths = true;
  }

  var compiled;

  function compileInput() {
    var ast = env.parse(input, options),
        environment = new env.Compiler().compile(ast, options),
        templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);
    return env.template(templateSpec);
  } // Template is only compiled on first use and cached after that point.


  function ret(context, execOptions) {
    if (!compiled) {
      compiled = compileInput();
    }

    return compiled.call(this, context, execOptions);
  }

  ret._setup = function (setupOptions) {
    if (!compiled) {
      compiled = compileInput();
    }

    return compiled._setup(setupOptions);
  };

  ret._child = function (i, data, blockParams, depths) {
    if (!compiled) {
      compiled = compileInput();
    }

    return compiled._child(i, data, blockParams, depths);
  };

  return ret;
}

function argEquals(a, b) {
  if (a === b) {
    return true;
  }

  if (
  /*istanbul ignore next*/
  (0,
  /*istanbul ignore next*/
  _utils.
  /*istanbul ignore next*/
  isArray)(a) &&
  /*istanbul ignore next*/
  (0,
  /*istanbul ignore next*/
  _utils.
  /*istanbul ignore next*/
  isArray)(b) && a.length === b.length) {
    for (var i = 0; i < a.length; i++) {
      if (!argEquals(a[i], b[i])) {
        return false;
      }
    }

    return true;
  }
}

function transformLiteralToPath(sexpr) {
  if (!sexpr.path.parts) {
    var literal = sexpr.path; // Casting to string here to make false and 0 literal values play nicely with the rest
    // of the system.

    sexpr.path = {
      type: 'PathExpression',
      data: false,
      depth: 0,
      parts: [literal.original + ''],
      original: literal.original + '',
      loc: literal.loc
    };
  }
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2NvbXBpbGVyL2NvbXBpbGVyLmpzIl0sIm5hbWVzIjpbInNsaWNlIiwiQ29tcGlsZXIiLCJwcm90b3R5cGUiLCJjb21waWxlciIsImVxdWFscyIsIm90aGVyIiwibGVuIiwib3Bjb2RlcyIsImxlbmd0aCIsImkiLCJvcGNvZGUiLCJvdGhlck9wY29kZSIsImFyZ0VxdWFscyIsImFyZ3MiLCJjaGlsZHJlbiIsImd1aWQiLCJjb21waWxlIiwicHJvZ3JhbSIsIm9wdGlvbnMiLCJzb3VyY2VOb2RlIiwic3RyaW5nUGFyYW1zIiwidHJhY2tJZHMiLCJibG9ja1BhcmFtcyIsImtub3duSGVscGVycyIsImV4dGVuZCIsIk9iamVjdCIsImNyZWF0ZSIsImhlbHBlck1pc3NpbmciLCJibG9ja0hlbHBlck1pc3NpbmciLCJlYWNoIiwidW5sZXNzIiwibG9nIiwibG9va3VwIiwiYWNjZXB0IiwiY29tcGlsZVByb2dyYW0iLCJjaGlsZENvbXBpbGVyIiwicmVzdWx0IiwidXNlUGFydGlhbCIsInVzZURlcHRocyIsIm5vZGUiLCJ0eXBlIiwiRXhjZXB0aW9uIiwidW5zaGlmdCIsInJldCIsInNoaWZ0IiwiUHJvZ3JhbSIsImJvZHkiLCJib2R5TGVuZ3RoIiwiaXNTaW1wbGUiLCJCbG9ja1N0YXRlbWVudCIsImJsb2NrIiwidHJhbnNmb3JtTGl0ZXJhbFRvUGF0aCIsImludmVyc2UiLCJjbGFzc2lmeVNleHByIiwiaGVscGVyU2V4cHIiLCJzaW1wbGVTZXhwciIsInBhdGgiLCJvcmlnaW5hbCIsImFtYmlndW91c1NleHByIiwiRGVjb3JhdG9yQmxvY2siLCJkZWNvcmF0b3IiLCJwYXJhbXMiLCJzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyIsInVuZGVmaW5lZCIsInVzZURlY29yYXRvcnMiLCJQYXJ0aWFsU3RhdGVtZW50IiwicGFydGlhbCIsImV4cGxpY2l0UGFydGlhbENvbnRleHQiLCJwdXNoIiwicGFydHMiLCJkZXB0aCIsInBhcnRpYWxOYW1lIiwibmFtZSIsImlzRHluYW1pYyIsImluZGVudCIsInByZXZlbnRJbmRlbnQiLCJQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQiLCJwYXJ0aWFsQmxvY2siLCJNdXN0YWNoZVN0YXRlbWVudCIsIm11c3RhY2hlIiwiU3ViRXhwcmVzc2lvbiIsImVzY2FwZWQiLCJub0VzY2FwZSIsIkRlY29yYXRvciIsIkNvbnRlbnRTdGF0ZW1lbnQiLCJjb250ZW50IiwidmFsdWUiLCJDb21tZW50U3RhdGVtZW50Iiwic2V4cHIiLCJpc0Jsb2NrIiwic3RyaWN0Iiwia25vd25IZWxwZXJzT25seSIsImZhbHN5IiwiQVNUIiwiaGVscGVycyIsInNpbXBsZUlkIiwiUGF0aEV4cHJlc3Npb24iLCJhZGREZXB0aCIsInNjb3BlZCIsInNjb3BlZElkIiwiYmxvY2tQYXJhbUlkIiwiYmxvY2tQYXJhbUluZGV4IiwiZGF0YSIsIlN0cmluZ0xpdGVyYWwiLCJzdHJpbmciLCJOdW1iZXJMaXRlcmFsIiwibnVtYmVyIiwiQm9vbGVhbkxpdGVyYWwiLCJib29sIiwiVW5kZWZpbmVkTGl0ZXJhbCIsIk51bGxMaXRlcmFsIiwiSGFzaCIsImhhc2giLCJwYWlycyIsImwiLCJwdXNoUGFyYW0iLCJrZXkiLCJjYWxsIiwiYXJndW1lbnRzIiwibG9jIiwiaXNCbG9ja1BhcmFtIiwiaXNIZWxwZXIiLCJoZWxwZXJFeHByZXNzaW9uIiwiaXNFbGlnaWJsZSIsInB1c2hQYXJhbXMiLCJ2YWwiLCJyZXBsYWNlIiwiYmxvY2tQYXJhbUNoaWxkIiwiam9pbiIsIm9taXRFbXB0eSIsInBhcmFtIiwiaW5kZXhPZiIsInByZWNvbXBpbGUiLCJpbnB1dCIsImVudiIsImNvbXBhdCIsImFzdCIsInBhcnNlIiwiZW52aXJvbm1lbnQiLCJKYXZhU2NyaXB0Q29tcGlsZXIiLCJjb21waWxlZCIsImNvbXBpbGVJbnB1dCIsInRlbXBsYXRlU3BlYyIsInRlbXBsYXRlIiwiY29udGV4dCIsImV4ZWNPcHRpb25zIiwiX3NldHVwIiwic2V0dXBPcHRp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RCxNQUFBQSxHQUFHLEVBQUVrQyxPQUFPLENBQUNsQztBQU5GLEtBQWI7QUFRRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuXG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbic7XG5pbXBvcnQgeyBpc0FycmF5LCBpbmRleE9mLCBleHRlbmQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgQVNUIGZyb20gJy4vYXN0JztcblxuY29uc3Qgc2xpY2UgPSBbXS5zbGljZTtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbXBpbGVyKCkge31cblxuLy8gdGhlIGZvdW5kSGVscGVyIHJlZ2lzdGVyIHdpbGwgZGlzYW1iaWd1YXRlIGhlbHBlciBsb29rdXAgZnJvbSBmaW5kaW5nIGFcbi8vIGZ1bmN0aW9uIGluIGEgY29udGV4dC4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIG11c3RhY2hlIGNvbXBhdGliaWxpdHksIHdoaWNoXG4vLyByZXF1aXJlcyB0aGF0IGNvbnRleHQgZnVuY3Rpb25zIGluIGJsb2NrcyBhcmUgZXZhbHVhdGVkIGJ5IGJsb2NrSGVscGVyTWlzc2luZyxcbi8vIGFuZCB0aGVuIHByb2NlZWQgYXMgaWYgdGhlIHJlc3VsdGluZyB2YWx1ZSB3YXMgcHJvdmlkZWQgdG8gYmxvY2tIZWxwZXJNaXNzaW5nLlxuXG5Db21waWxlci5wcm90b3R5cGUgPSB7XG4gIGNvbXBpbGVyOiBDb21waWxlcixcblxuICBlcXVhbHM6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgbGV0IGxlbiA9IHRoaXMub3Bjb2Rlcy5sZW5ndGg7XG4gICAgaWYgKG90aGVyLm9wY29kZXMubGVuZ3RoICE9PSBsZW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBsZXQgb3Bjb2RlID0gdGhpcy5vcGNvZGVzW2ldLFxuICAgICAgICBvdGhlck9wY29kZSA9IG90aGVyLm9wY29kZXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgIG9wY29kZS5vcGNvZGUgIT09IG90aGVyT3Bjb2RlLm9wY29kZSB8fFxuICAgICAgICAhYXJnRXF1YWxzKG9wY29kZS5hcmdzLCBvdGhlck9wY29kZS5hcmdzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBrbm93IHRoYXQgbGVuZ3RoIGlzIHRoZSBzYW1lIGJldHdlZW4gdGhlIHR3byBhcnJheXMgYmVjYXVzZSB0aGV5IGFyZSBkaXJlY3RseSB0aWVkXG4gICAgLy8gdG8gdGhlIG9wY29kZSBiZWhhdmlvciBhYm92ZS5cbiAgICBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuY2hpbGRyZW5baV0uZXF1YWxzKG90aGVyLmNoaWxkcmVuW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgZ3VpZDogMCxcblxuICBjb21waWxlOiBmdW5jdGlvbihwcm9ncmFtLCBvcHRpb25zKSB7XG4gICAgdGhpcy5zb3VyY2VOb2RlID0gW107XG4gICAgdGhpcy5vcGNvZGVzID0gW107XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtcztcbiAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkcztcblxuICAgIG9wdGlvbnMuYmxvY2tQYXJhbXMgPSBvcHRpb25zLmJsb2NrUGFyYW1zIHx8IFtdO1xuXG4gICAgb3B0aW9ucy5rbm93bkhlbHBlcnMgPSBleHRlbmQoXG4gICAgICBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAge1xuICAgICAgICBoZWxwZXJNaXNzaW5nOiB0cnVlLFxuICAgICAgICBibG9ja0hlbHBlck1pc3Npbmc6IHRydWUsXG4gICAgICAgIGVhY2g6IHRydWUsXG4gICAgICAgIGlmOiB0cnVlLFxuICAgICAgICB1bmxlc3M6IHRydWUsXG4gICAgICAgIHdpdGg6IHRydWUsXG4gICAgICAgIGxvZzogdHJ1ZSxcbiAgICAgICAgbG9va3VwOiB0cnVlXG4gICAgICB9LFxuICAgICAgb3B0aW9ucy5rbm93bkhlbHBlcnNcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pO1xuICB9LFxuXG4gIGNvbXBpbGVQcm9ncmFtOiBmdW5jdGlvbihwcm9ncmFtKSB7XG4gICAgbGV0IGNoaWxkQ29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbiAgICAgIHJlc3VsdCA9IGNoaWxkQ29tcGlsZXIuY29tcGlsZShwcm9ncmFtLCB0aGlzLm9wdGlvbnMpLFxuICAgICAgZ3VpZCA9IHRoaXMuZ3VpZCsrO1xuXG4gICAgdGhpcy51c2VQYXJ0aWFsID0gdGhpcy51c2VQYXJ0aWFsIHx8IHJlc3VsdC51c2VQYXJ0aWFsO1xuXG4gICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDtcbiAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7XG5cbiAgICByZXR1cm4gZ3VpZDtcbiAgfSxcblxuICBhY2NlcHQ6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogU2FuaXR5IGNvZGUgKi9cbiAgICBpZiAoIXRoaXNbbm9kZS50eXBlXSkge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlLCBub2RlKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvdXJjZU5vZGUudW5zaGlmdChub2RlKTtcbiAgICBsZXQgcmV0ID0gdGhpc1tub2RlLnR5cGVdKG5vZGUpO1xuICAgIHRoaXMuc291cmNlTm9kZS5zaGlmdCgpO1xuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgUHJvZ3JhbTogZnVuY3Rpb24ocHJvZ3JhbSkge1xuICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpO1xuXG4gICAgbGV0IGJvZHkgPSBwcm9ncmFtLmJvZHksXG4gICAgICBib2R5TGVuZ3RoID0gYm9keS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib2R5TGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWNjZXB0KGJvZHlbaV0pO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5zaGlmdCgpO1xuXG4gICAgdGhpcy5pc1NpbXBsZSA9IGJvZHlMZW5ndGggPT09IDE7XG4gICAgdGhpcy5ibG9ja1BhcmFtcyA9IHByb2dyYW0uYmxvY2tQYXJhbXMgPyBwcm9ncmFtLmJsb2NrUGFyYW1zLmxlbmd0aCA6IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24oYmxvY2spIHtcbiAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKGJsb2NrKTtcblxuICAgIGxldCBwcm9ncmFtID0gYmxvY2sucHJvZ3JhbSxcbiAgICAgIGludmVyc2UgPSBibG9jay5pbnZlcnNlO1xuXG4gICAgcHJvZ3JhbSA9IHByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShwcm9ncmFtKTtcbiAgICBpbnZlcnNlID0gaW52ZXJzZSAmJiB0aGlzLmNvbXBpbGVQcm9ncmFtKGludmVyc2UpO1xuXG4gICAgbGV0IHR5cGUgPSB0aGlzLmNsYXNzaWZ5U2V4cHIoYmxvY2spO1xuXG4gICAgaWYgKHR5cGUgPT09ICdoZWxwZXInKSB7XG4gICAgICB0aGlzLmhlbHBlclNleHByKGJsb2NrLCBwcm9ncmFtLCBpbnZlcnNlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICB0aGlzLnNpbXBsZVNleHByKGJsb2NrKTtcblxuICAgICAgLy8gbm93IHRoYXQgdGhlIHNpbXBsZSBtdXN0YWNoZSBpcyByZXNvbHZlZCwgd2UgbmVlZCB0b1xuICAgICAgLy8gZXZhbHVhdGUgaXQgYnkgZXhlY3V0aW5nIGBibG9ja0hlbHBlck1pc3NpbmdgXG4gICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpO1xuICAgICAgdGhpcy5vcGNvZGUoJ2VtcHR5SGFzaCcpO1xuICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrVmFsdWUnLCBibG9jay5wYXRoLm9yaWdpbmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbWJpZ3VvdXNTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7XG5cbiAgICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVzdGFjaGUgaXMgcmVzb2x2ZWQsIHdlIG5lZWQgdG9cbiAgICAgIC8vIGV2YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYFxuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7XG4gICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdhbWJpZ3VvdXNCbG9ja1ZhbHVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpO1xuICB9LFxuXG4gIERlY29yYXRvckJsb2NrKGRlY29yYXRvcikge1xuICAgIGxldCBwcm9ncmFtID0gZGVjb3JhdG9yLnByb2dyYW0gJiYgdGhpcy5jb21waWxlUHJvZ3JhbShkZWNvcmF0b3IucHJvZ3JhbSk7XG4gICAgbGV0IHBhcmFtcyA9IHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoZGVjb3JhdG9yLCBwcm9ncmFtLCB1bmRlZmluZWQpLFxuICAgICAgcGF0aCA9IGRlY29yYXRvci5wYXRoO1xuXG4gICAgdGhpcy51c2VEZWNvcmF0b3JzID0gdHJ1ZTtcbiAgICB0aGlzLm9wY29kZSgncmVnaXN0ZXJEZWNvcmF0b3InLCBwYXJhbXMubGVuZ3RoLCBwYXRoLm9yaWdpbmFsKTtcbiAgfSxcblxuICBQYXJ0aWFsU3RhdGVtZW50OiBmdW5jdGlvbihwYXJ0aWFsKSB7XG4gICAgdGhpcy51c2VQYXJ0aWFsID0gdHJ1ZTtcblxuICAgIGxldCBwcm9ncmFtID0gcGFydGlhbC5wcm9ncmFtO1xuICAgIGlmIChwcm9ncmFtKSB7XG4gICAgICBwcm9ncmFtID0gdGhpcy5jb21waWxlUHJvZ3JhbShwYXJ0aWFsLnByb2dyYW0pO1xuICAgIH1cblxuICAgIGxldCBwYXJhbXMgPSBwYXJ0aWFsLnBhcmFtcztcbiAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oXG4gICAgICAgICdVbnN1cHBvcnRlZCBudW1iZXIgb2YgcGFydGlhbCBhcmd1bWVudHM6ICcgKyBwYXJhbXMubGVuZ3RoLFxuICAgICAgICBwYXJ0aWFsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIXBhcmFtcy5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwbGljaXRQYXJ0aWFsQ29udGV4dCkge1xuICAgICAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCAndW5kZWZpbmVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMucHVzaCh7IHR5cGU6ICdQYXRoRXhwcmVzc2lvbicsIHBhcnRzOiBbXSwgZGVwdGg6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHBhcnRpYWxOYW1lID0gcGFydGlhbC5uYW1lLm9yaWdpbmFsLFxuICAgICAgaXNEeW5hbWljID0gcGFydGlhbC5uYW1lLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJztcbiAgICBpZiAoaXNEeW5hbWljKSB7XG4gICAgICB0aGlzLmFjY2VwdChwYXJ0aWFsLm5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMocGFydGlhbCwgcHJvZ3JhbSwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIGxldCBpbmRlbnQgPSBwYXJ0aWFsLmluZGVudCB8fCAnJztcbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXZlbnRJbmRlbnQgJiYgaW5kZW50KSB7XG4gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGluZGVudCk7XG4gICAgICBpbmRlbnQgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7XG4gICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpO1xuICB9LFxuICBQYXJ0aWFsQmxvY2tTdGF0ZW1lbnQ6IGZ1bmN0aW9uKHBhcnRpYWxCbG9jaykge1xuICAgIHRoaXMuUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsQmxvY2spO1xuICB9LFxuXG4gIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbihtdXN0YWNoZSkge1xuICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7XG5cbiAgICBpZiAobXVzdGFjaGUuZXNjYXBlZCAmJiAhdGhpcy5vcHRpb25zLm5vRXNjYXBlKSB7XG4gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kRXNjYXBlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJyk7XG4gICAgfVxuICB9LFxuICBEZWNvcmF0b3IoZGVjb3JhdG9yKSB7XG4gICAgdGhpcy5EZWNvcmF0b3JCbG9jayhkZWNvcmF0b3IpO1xuICB9LFxuXG4gIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudC52YWx1ZSkge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBjb250ZW50LnZhbHVlKTtcbiAgICB9XG4gIH0sXG5cbiAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24oKSB7fSxcblxuICBTdWJFeHByZXNzaW9uOiBmdW5jdGlvbihzZXhwcikge1xuICAgIHRyYW5zZm9ybUxpdGVyYWxUb1BhdGgoc2V4cHIpO1xuICAgIGxldCB0eXBlID0gdGhpcy5jbGFzc2lmeVNleHByKHNleHByKTtcblxuICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykge1xuICAgICAgdGhpcy5zaW1wbGVTZXhwcihzZXhwcik7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaGVscGVyJykge1xuICAgICAgdGhpcy5oZWxwZXJTZXhwcihzZXhwcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoc2V4cHIpO1xuICAgIH1cbiAgfSxcbiAgYW1iaWd1b3VzU2V4cHI6IGZ1bmN0aW9uKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSB7XG4gICAgbGV0IHBhdGggPSBzZXhwci5wYXRoLFxuICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF0sXG4gICAgICBpc0Jsb2NrID0gcHJvZ3JhbSAhPSBudWxsIHx8IGludmVyc2UgIT0gbnVsbDtcblxuICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7XG5cbiAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBwcm9ncmFtKTtcbiAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTtcblxuICAgIHBhdGguc3RyaWN0ID0gdHJ1ZTtcbiAgICB0aGlzLmFjY2VwdChwYXRoKTtcblxuICAgIHRoaXMub3Bjb2RlKCdpbnZva2VBbWJpZ3VvdXMnLCBuYW1lLCBpc0Jsb2NrKTtcbiAgfSxcblxuICBzaW1wbGVTZXhwcjogZnVuY3Rpb24oc2V4cHIpIHtcbiAgICBsZXQgcGF0aCA9IHNleHByLnBhdGg7XG4gICAgcGF0aC5zdHJpY3QgPSB0cnVlO1xuICAgIHRoaXMuYWNjZXB0KHBhdGgpO1xuICAgIHRoaXMub3Bjb2RlKCdyZXNvbHZlUG9zc2libGVMYW1iZGEnKTtcbiAgfSxcblxuICBoZWxwZXJTZXhwcjogZnVuY3Rpb24oc2V4cHIsIHByb2dyYW0sIGludmVyc2UpIHtcbiAgICBsZXQgcGFyYW1zID0gdGhpcy5zZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSksXG4gICAgICBwYXRoID0gc2V4cHIucGF0aCxcbiAgICAgIG5hbWUgPSBwYXRoLnBhcnRzWzBdO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0pIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VLbm93bkhlbHBlcicsIHBhcmFtcy5sZW5ndGgsIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmtub3duSGVscGVyc09ubHkpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oXG4gICAgICAgICdZb3Ugc3BlY2lmaWVkIGtub3duSGVscGVyc09ubHksIGJ1dCB1c2VkIHRoZSB1bmtub3duIGhlbHBlciAnICsgbmFtZSxcbiAgICAgICAgc2V4cHJcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGguc3RyaWN0ID0gdHJ1ZTtcbiAgICAgIHBhdGguZmFsc3kgPSB0cnVlO1xuXG4gICAgICB0aGlzLmFjY2VwdChwYXRoKTtcbiAgICAgIHRoaXMub3Bjb2RlKFxuICAgICAgICAnaW52b2tlSGVscGVyJyxcbiAgICAgICAgcGFyYW1zLmxlbmd0aCxcbiAgICAgICAgcGF0aC5vcmlnaW5hbCxcbiAgICAgICAgQVNULmhlbHBlcnMuc2ltcGxlSWQocGF0aClcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbihwYXRoKSB7XG4gICAgdGhpcy5hZGREZXB0aChwYXRoLmRlcHRoKTtcbiAgICB0aGlzLm9wY29kZSgnZ2V0Q29udGV4dCcsIHBhdGguZGVwdGgpO1xuXG4gICAgbGV0IG5hbWUgPSBwYXRoLnBhcnRzWzBdLFxuICAgICAgc2NvcGVkID0gQVNULmhlbHBlcnMuc2NvcGVkSWQocGF0aCksXG4gICAgICBibG9ja1BhcmFtSWQgPSAhcGF0aC5kZXB0aCAmJiAhc2NvcGVkICYmIHRoaXMuYmxvY2tQYXJhbUluZGV4KG5hbWUpO1xuXG4gICAgaWYgKGJsb2NrUGFyYW1JZCkge1xuICAgICAgdGhpcy5vcGNvZGUoJ2xvb2t1cEJsb2NrUGFyYW0nLCBibG9ja1BhcmFtSWQsIHBhdGgucGFydHMpO1xuICAgIH0gZWxzZSBpZiAoIW5hbWUpIHtcbiAgICAgIC8vIENvbnRleHQgcmVmZXJlbmNlLCBpLmUuIGB7e2ZvbyAufX1gIG9yIGB7e2ZvbyAuLn19YFxuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hDb250ZXh0Jyk7XG4gICAgfSBlbHNlIGlmIChwYXRoLmRhdGEpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5kYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBEYXRhJywgcGF0aC5kZXB0aCwgcGF0aC5wYXJ0cywgcGF0aC5zdHJpY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wY29kZShcbiAgICAgICAgJ2xvb2t1cE9uQ29udGV4dCcsXG4gICAgICAgIHBhdGgucGFydHMsXG4gICAgICAgIHBhdGguZmFsc3ksXG4gICAgICAgIHBhdGguc3RyaWN0LFxuICAgICAgICBzY29wZWRcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoU3RyaW5nJywgc3RyaW5nLnZhbHVlKTtcbiAgfSxcblxuICBOdW1iZXJMaXRlcmFsOiBmdW5jdGlvbihudW1iZXIpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpO1xuICB9LFxuXG4gIEJvb2xlYW5MaXRlcmFsOiBmdW5jdGlvbihib29sKSB7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgYm9vbC52YWx1ZSk7XG4gIH0sXG5cbiAgVW5kZWZpbmVkTGl0ZXJhbDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgJ3VuZGVmaW5lZCcpO1xuICB9LFxuXG4gIE51bGxMaXRlcmFsOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCAnbnVsbCcpO1xuICB9LFxuXG4gIEhhc2g6IGZ1bmN0aW9uKGhhc2gpIHtcbiAgICBsZXQgcGFpcnMgPSBoYXNoLnBhaXJzLFxuICAgICAgaSA9IDAsXG4gICAgICBsID0gcGFpcnMubGVuZ3RoO1xuXG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hIYXNoJyk7XG5cbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgdGhpcy5wdXNoUGFyYW0ocGFpcnNbaV0udmFsdWUpO1xuICAgIH1cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLm9wY29kZSgnYXNzaWduVG9IYXNoJywgcGFpcnNbaV0ua2V5KTtcbiAgICB9XG4gICAgdGhpcy5vcGNvZGUoJ3BvcEhhc2gnKTtcbiAgfSxcblxuICAvLyBIRUxQRVJTXG4gIG9wY29kZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHRoaXMub3Bjb2Rlcy5wdXNoKHtcbiAgICAgIG9wY29kZTogbmFtZSxcbiAgICAgIGFyZ3M6IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgIGxvYzogdGhpcy5zb3VyY2VOb2RlWzBdLmxvY1xuICAgIH0pO1xuICB9LFxuXG4gIGFkZERlcHRoOiBmdW5jdGlvbihkZXB0aCkge1xuICAgIGlmICghZGVwdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVzZURlcHRocyA9IHRydWU7XG4gIH0sXG5cbiAgY2xhc3NpZnlTZXhwcjogZnVuY3Rpb24oc2V4cHIpIHtcbiAgICBsZXQgaXNTaW1wbGUgPSBBU1QuaGVscGVycy5zaW1wbGVJZChzZXhwci5wYXRoKTtcblxuICAgIGxldCBpc0Jsb2NrUGFyYW0gPSBpc1NpbXBsZSAmJiAhIXRoaXMuYmxvY2tQYXJhbUluZGV4KHNleHByLnBhdGgucGFydHNbMF0pO1xuXG4gICAgLy8gYSBtdXN0YWNoZSBpcyBhbiBlbGlnaWJsZSBoZWxwZXIgaWY6XG4gICAgLy8gKiBpdHMgaWQgaXMgc2ltcGxlIChhIHNpbmdsZSBwYXJ0LCBub3QgYHRoaXNgIG9yIGAuLmApXG4gICAgbGV0IGlzSGVscGVyID0gIWlzQmxvY2tQYXJhbSAmJiBBU1QuaGVscGVycy5oZWxwZXJFeHByZXNzaW9uKHNleHByKTtcblxuICAgIC8vIGlmIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGJ1dCBub3QgYSBkZWZpbml0ZVxuICAgIC8vIGhlbHBlciwgaXQgaXMgYW1iaWd1b3VzLCBhbmQgd2lsbCBiZSByZXNvbHZlZCBpbiBhIGxhdGVyXG4gICAgLy8gcGFzcyBvciBhdCBydW50aW1lLlxuICAgIGxldCBpc0VsaWdpYmxlID0gIWlzQmxvY2tQYXJhbSAmJiAoaXNIZWxwZXIgfHwgaXNTaW1wbGUpO1xuXG4gICAgLy8gaWYgYW1iaWd1b3VzLCB3ZSBjYW4gcG9zc2libHkgcmVzb2x2ZSB0aGUgYW1iaWd1aXR5IG5vd1xuICAgIC8vIEFuIGVsaWdpYmxlIGhlbHBlciBpcyBvbmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29tcGxleCBwYXRoLCBpLmUuIGB0aGlzLmZvb2AsIGAuLi9mb29gIGV0Yy5cbiAgICBpZiAoaXNFbGlnaWJsZSAmJiAhaXNIZWxwZXIpIHtcbiAgICAgIGxldCBuYW1lID0gc2V4cHIucGF0aC5wYXJ0c1swXSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zLmtub3duSGVscGVyc1tuYW1lXSkge1xuICAgICAgICBpc0hlbHBlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzT25seSkge1xuICAgICAgICBpc0VsaWdpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzSGVscGVyKSB7XG4gICAgICByZXR1cm4gJ2hlbHBlcic7XG4gICAgfSBlbHNlIGlmIChpc0VsaWdpYmxlKSB7XG4gICAgICByZXR1cm4gJ2FtYmlndW91cyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnc2ltcGxlJztcbiAgICB9XG4gIH0sXG5cbiAgcHVzaFBhcmFtczogZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYXJhbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLnB1c2hQYXJhbShwYXJhbXNbaV0pO1xuICAgIH1cbiAgfSxcblxuICBwdXNoUGFyYW06IGZ1bmN0aW9uKHZhbCkge1xuICAgIGxldCB2YWx1ZSA9IHZhbC52YWx1ZSAhPSBudWxsID8gdmFsLnZhbHVlIDogdmFsLm9yaWdpbmFsIHx8ICcnO1xuXG4gICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICBpZiAodmFsdWUucmVwbGFjZSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL14oXFwuP1xcLlxcLykqL2csICcnKS5yZXBsYWNlKC9cXC8vZywgJy4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbC5kZXB0aCkge1xuICAgICAgICB0aGlzLmFkZERlcHRoKHZhbC5kZXB0aCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9wY29kZSgnZ2V0Q29udGV4dCcsIHZhbC5kZXB0aCB8fCAwKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoU3RyaW5nUGFyYW0nLCB2YWx1ZSwgdmFsLnR5cGUpO1xuXG4gICAgICBpZiAodmFsLnR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykge1xuICAgICAgICAvLyBTdWJFeHByZXNzaW9ucyBnZXQgZXZhbHVhdGVkIGFuZCBwYXNzZWQgaW5cbiAgICAgICAgLy8gaW4gc3RyaW5nIHBhcmFtcyBtb2RlLlxuICAgICAgICB0aGlzLmFjY2VwdCh2YWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy50cmFja0lkcykge1xuICAgICAgICBsZXQgYmxvY2tQYXJhbUluZGV4O1xuICAgICAgICBpZiAodmFsLnBhcnRzICYmICFBU1QuaGVscGVycy5zY29wZWRJZCh2YWwpICYmICF2YWwuZGVwdGgpIHtcbiAgICAgICAgICBibG9ja1BhcmFtSW5kZXggPSB0aGlzLmJsb2NrUGFyYW1JbmRleCh2YWwucGFydHNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChibG9ja1BhcmFtSW5kZXgpIHtcbiAgICAgICAgICBsZXQgYmxvY2tQYXJhbUNoaWxkID0gdmFsLnBhcnRzLnNsaWNlKDEpLmpvaW4oJy4nKTtcbiAgICAgICAgICB0aGlzLm9wY29kZSgncHVzaElkJywgJ0Jsb2NrUGFyYW0nLCBibG9ja1BhcmFtSW5kZXgsIGJsb2NrUGFyYW1DaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWwub3JpZ2luYWwgfHwgdmFsdWU7XG4gICAgICAgICAgaWYgKHZhbHVlLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL150aGlzKD86XFwufCQpLywgJycpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgJycpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwuJC8sICcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9wY29kZSgncHVzaElkJywgdmFsLnR5cGUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5hY2NlcHQodmFsKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXM6IGZ1bmN0aW9uKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlLCBvbWl0RW1wdHkpIHtcbiAgICBsZXQgcGFyYW1zID0gc2V4cHIucGFyYW1zO1xuICAgIHRoaXMucHVzaFBhcmFtcyhwYXJhbXMpO1xuXG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7XG5cbiAgICBpZiAoc2V4cHIuaGFzaCkge1xuICAgICAgdGhpcy5hY2NlcHQoc2V4cHIuaGFzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnLCBvbWl0RW1wdHkpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH0sXG5cbiAgYmxvY2tQYXJhbUluZGV4OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZm9yIChcbiAgICAgIGxldCBkZXB0aCA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5sZW5ndGg7XG4gICAgICBkZXB0aCA8IGxlbjtcbiAgICAgIGRlcHRoKytcbiAgICApIHtcbiAgICAgIGxldCBibG9ja1BhcmFtcyA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtc1tkZXB0aF0sXG4gICAgICAgIHBhcmFtID0gYmxvY2tQYXJhbXMgJiYgaW5kZXhPZihibG9ja1BhcmFtcywgbmFtZSk7XG4gICAgICBpZiAoYmxvY2tQYXJhbXMgJiYgcGFyYW0gPj0gMCkge1xuICAgICAgICByZXR1cm4gW2RlcHRoLCBwYXJhbV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlY29tcGlsZShpbnB1dCwgb3B0aW9ucywgZW52KSB7XG4gIGlmIChcbiAgICBpbnB1dCA9PSBudWxsIHx8XG4gICAgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycgJiYgaW5wdXQudHlwZSAhPT0gJ1Byb2dyYW0nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKFxuICAgICAgJ1lvdSBtdXN0IHBhc3MgYSBzdHJpbmcgb3IgSGFuZGxlYmFycyBBU1QgdG8gSGFuZGxlYmFycy5wcmVjb21waWxlLiBZb3UgcGFzc2VkICcgK1xuICAgICAgICBpbnB1dFxuICAgICk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5jb21wYXQpIHtcbiAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7XG4gIH1cblxuICBsZXQgYXN0ID0gZW52LnBhcnNlKGlucHV0LCBvcHRpb25zKSxcbiAgICBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZShpbnB1dCwgb3B0aW9ucyA9IHt9LCBlbnYpIHtcbiAgaWYgKFxuICAgIGlucHV0ID09IG51bGwgfHxcbiAgICAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlICE9PSAnUHJvZ3JhbScpXG4gICkge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oXG4gICAgICAnWW91IG11c3QgcGFzcyBhIHN0cmluZyBvciBIYW5kbGViYXJzIEFTVCB0byBIYW5kbGViYXJzLmNvbXBpbGUuIFlvdSBwYXNzZWQgJyArXG4gICAgICAgIGlucHV0XG4gICAgKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMpO1xuICBpZiAoISgnZGF0YScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmRhdGEgPSB0cnVlO1xuICB9XG4gIGlmIChvcHRpb25zLmNvbXBhdCkge1xuICAgIG9wdGlvbnMudXNlRGVwdGhzID0gdHJ1ZTtcbiAgfVxuXG4gIGxldCBjb21waWxlZDtcblxuICBmdW5jdGlvbiBjb21waWxlSW5wdXQoKSB7XG4gICAgbGV0IGFzdCA9IGVudi5wYXJzZShpbnB1dCwgb3B0aW9ucyksXG4gICAgICBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyksXG4gICAgICB0ZW1wbGF0ZVNwZWMgPSBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoXG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgcmV0dXJuIGVudi50ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgLy8gVGVtcGxhdGUgaXMgb25seSBjb21waWxlZCBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlZCBhZnRlciB0aGF0IHBvaW50LlxuICBmdW5jdGlvbiByZXQoY29udGV4dCwgZXhlY09wdGlvbnMpIHtcbiAgICBpZiAoIWNvbXBpbGVkKSB7XG4gICAgICBjb21waWxlZCA9IGNvbXBpbGVJbnB1dCgpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGlsZWQuY2FsbCh0aGlzLCBjb250ZXh0LCBleGVjT3B0aW9ucyk7XG4gIH1cbiAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uKHNldHVwT3B0aW9ucykge1xuICAgIGlmICghY29tcGlsZWQpIHtcbiAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7XG4gICAgfVxuICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTtcbiAgfTtcbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICBpZiAoIWNvbXBpbGVkKSB7XG4gICAgICBjb21waWxlZCA9IGNvbXBpbGVJbnB1dCgpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGlsZWQuX2NoaWxkKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBhcmdFcXVhbHMoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSAmJiBhLmxlbmd0aCA9PT0gYi5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghYXJnRXF1YWxzKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtTGl0ZXJhbFRvUGF0aChzZXhwcikge1xuICBpZiAoIXNleHByLnBhdGgucGFydHMpIHtcbiAgICBsZXQgbGl0ZXJhbCA9IHNleHByLnBhdGg7XG4gICAgLy8gQ2FzdGluZyB0byBzdHJpbmcgaGVyZSB0byBtYWtlIGZhbHNlIGFuZCAwIGxpdGVyYWwgdmFsdWVzIHBsYXkgbmljZWx5IHdpdGggdGhlIHJlc3RcbiAgICAvLyBvZiB0aGUgc3lzdGVtLlxuICAgIHNleHByLnBhdGggPSB7XG4gICAgICB0eXBlOiAnUGF0aEV4cHJlc3Npb24nLFxuICAgICAgZGF0YTogZmFsc2UsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHBhcnRzOiBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSxcbiAgICAgIG9yaWdpbmFsOiBsaXRlcmFsLm9yaWdpbmFsICsgJycsXG4gICAgICBsb2M6IGxpdGVyYWwubG9jXG4gICAgfTtcbiAgfVxufVxuIl19

Youez - 2016 - github.com/yon3zu
LinuXploit