UNPKG

wisp

Version:

Homoiconic JS with clojure syntax, s-expressions & macros

159 lines (158 loc) 29.7 kB
{ var _ns_ = { id: 'wisp.ast', doc: void 0 }; var wisp_sequence = require('./sequence'); var isList = wisp_sequence.isList; var isSequential = wisp_sequence.isSequential; var first = wisp_sequence.first; var second = wisp_sequence.second; var count = wisp_sequence.count; var isIdentitySet = wisp_sequence.isIdentitySet; var last = wisp_sequence.last; var map = wisp_sequence.map; var vec = wisp_sequence.vec; var repeat = wisp_sequence.repeat; var wisp_string = require('./string'); var split = wisp_string.split; var join = wisp_string.join; var wisp_runtime = require('./runtime'); var isNil = wisp_runtime.isNil; var isVector = wisp_runtime.isVector; var isNumber = wisp_runtime.isNumber; var isString = wisp_runtime.isString; var isBoolean = wisp_runtime.isBoolean; var isObject = wisp_runtime.isObject; var isDate = wisp_runtime.isDate; var isRePattern = wisp_runtime.isRePattern; var isDictionary = wisp_runtime.isDictionary; var str = wisp_runtime.str; var inc = wisp_runtime.inc; var subs = wisp_runtime.subs; var isEqual = wisp_runtime.isEqual; } var withMeta = exports.withMeta = function withMeta(value, metadata) { Object.defineProperty(value, 'metadata', { 'value': metadata, 'configurable': true }); return value; }; var meta = exports.meta = function meta(value) { return isNil(value) ? void 0 : value.metadata; }; var __nsSeparator__ = exports.__nsSeparator__ = '\u2044'; var Symbol = function Symbol(namespace, name) { this.namespace = namespace; this.name = name; return this; }; Symbol.type = 'wisp.symbol'; Symbol.prototype.type = Symbol.type; Symbol.prototype.toString = function () { return function () { var prefixø1 = '' + '\uFEFF' + '\''; var nsø1 = namespace(this); return nsø1 ? '' + prefixø1 + nsø1 + '/' + name(this) : '' + prefixø1 + name(this); }.call(this); }; var symbol = exports.symbol = function symbol(ns, id) { return isSymbol(ns) ? ns : isKeyword(ns) ? new Symbol(namespace(ns), name(ns)) : isNil(id) ? new Symbol(void 0, ns) : 'else' ? new Symbol(ns, id) : void 0; }; var isSymbol = exports.isSymbol = function isSymbol(x) { return isString(x) && '\uFEFF' === x[0] && '\'' === x[1] || x && Symbol.type === x.type; }; var isKeyword = exports.isKeyword = function isKeyword(x) { return isString(x) && count(x) > 1 && first(x) === '\uA789'; }; var keyword = exports.keyword = function keyword(ns, id) { return isKeyword(ns) ? ns : isSymbol(ns) ? '' + '\uA789' + name(ns) : isNil(id) ? '' + '\uA789' + ns : isNil(ns) ? '' + '\uA789' + id : 'else' ? '' + '\uA789' + ns + __nsSeparator__ + id : void 0; }; var keywordName = function keywordName(value) { return last(split(subs(value, 1), __nsSeparator__)); }; var symbolName = function symbolName(value) { return value.name || last(split(subs(value, 2), __nsSeparator__)); }; var name = exports.name = function name(value) { return isSymbol(value) ? symbolName(value) : isKeyword(value) ? keywordName(value) : isString(value) ? value : 'else' ? (function () { throw new TypeError('' + 'Doesn\'t support name: ' + value); })() : void 0; }; var keywordNamespace = function keywordNamespace(x) { return function () { var partsø1 = split(subs(x, 1), __nsSeparator__); return count(partsø1) > 1 ? partsø1[0] : void 0; }.call(this); }; var symbolNamespace = function symbolNamespace(x) { return function () { var partsø1 = isString(x) ? split(subs(x, 1), __nsSeparator__) : [ x.namespace, x.name ]; return count(partsø1) > 1 ? partsø1[0] : void 0; }.call(this); }; var namespace = exports.namespace = function namespace(x) { return isSymbol(x) ? symbolNamespace(x) : isKeyword(x) ? keywordNamespace(x) : 'else' ? (function () { throw new TypeError('' + 'Doesn\'t supports namespace: ' + x); })() : void 0; }; var gensym = exports.gensym = function gensym(prefix) { return symbol('' + (isNil(prefix) ? 'G__' : prefix) + (gensym.base = gensym.base + 1)); }; gensym.base = 0; var isUnquote = exports.isUnquote = function isUnquote(form) { return isList(form) && isEqual(first(form), symbol(void 0, 'unquote')); }; var isUnquoteSplicing = exports.isUnquoteSplicing = function isUnquoteSplicing(form) { return isList(form) && isEqual(first(form), symbol(void 0, 'unquote-splicing')); }; var isQuote = exports.isQuote = function isQuote(form) { return isList(form) && isEqual(first(form), symbol(void 0, 'quote')); }; var isSyntaxQuote = exports.isSyntaxQuote = function isSyntaxQuote(form) { return isList(form) && isEqual(first(form), symbol(void 0, 'syntax-quote')); }; var normalize = function normalize(n, len) { return function loop() { var recur = loop; var nsø1 = '' + n; do { recur = count(nsø1) < len ? (loop[0] = '' + '0' + nsø1, loop) : nsø1; } while (nsø1 = loop[0], recur === loop); return recur; }.call(this); }; var quoteString = exports.quoteString = function quoteString(s) { s = join('\\"', split(s, '"')); s = join('\\\\', split(s, '\\')); s = join('\\b', split(s, '\b')); s = join('\\f', split(s, '\f')); s = join('\\n', split(s, '\n')); s = join('\\r', split(s, '\r')); s = join('\\t', split(s, '\t')); return '' + '"' + s + '"'; }; var prStr = exports.prStr = function prStr(x, offset) { return function () { var offsetø2 = offset || 0; return isNil(x) ? 'nil' : isKeyword(x) ? namespace(x) ? '' + ':' + namespace(x) + '/' + name(x) : '' + ':' + name(x) : isSymbol(x) ? namespace(x) ? '' + namespace(x) + '/' + name(x) : name(x) : isString(x) ? quoteString(x) : isDate(x) ? '' + '#inst "' + x.getUTCFullYear() + '-' + normalize(inc(x.getUTCMonth()), 2) + '-' + normalize(x.getUTCDate(), 2) + 'T' + normalize(x.getUTCHours(), 2) + ':' + normalize(x.getUTCMinutes(), 2) + ':' + normalize(x.getUTCSeconds(), 2) + '.' + normalize(x.getUTCMilliseconds(), 3) + '-' + '00:00"' : isVector(x) ? '' + '[' + join('' + '\n ' + join(repeat(inc(offsetø2), ' ')), map(function ($1) { return prStr($1, inc(offsetø2)); }, vec(x))) + ']' : isDictionary(x) ? '' + '{' + join('' + ',\n' + join(repeat(inc(offsetø2), ' ')), map(function (pair) { return function () { var indentø1 = join(repeat(offsetø2, ' ')); var keyø1 = prStr(first(pair), inc(offsetø2)); var valueø1 = prStr(second(pair), 2 + offsetø2 + count(keyø1)); return '' + keyø1 + ' ' + valueø1; }.call(this); }, x)) + '}' : isIdentitySet(x) ? '' + '#{' + join(' ', map(function ($1) { return prStr($1, inc(offsetø2)); }, vec(x))) + '}' : isSequential(x) ? '' + '(' + join(' ', map(function ($1) { return prStr($1, inc(offsetø2)); }, vec(x))) + ')' : isRePattern(x) ? '' + '#"' + join('\\/', split(x.source, '/')) + '"' : 'else' ? '' + x : void 0; }.call(this); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsImlzTGlzdCIsImlzU2VxdWVudGlhbCIsImZpcnN0Iiwic2Vjb25kIiwiY291bnQiLCJpc0lkZW50aXR5U2V0IiwibGFzdCIsIm1hcCIsInZlYyIsInJlcGVhdCIsInNwbGl0Iiwiam9pbiIsImlzTmlsIiwiaXNWZWN0b3IiLCJpc051bWJlciIsImlzU3RyaW5nIiwiaXNCb29sZWFuIiwiaXNPYmplY3QiLCJpc0RhdGUiLCJpc1JlUGF0dGVybiIsImlzRGljdGlvbmFyeSIsInN0ciIsImluYyIsInN1YnMiLCJpc0VxdWFsIiwid2l0aE1ldGEiLCJleHBvcnRzIiwidmFsdWUiLCJtZXRhZGF0YSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwibWV0YSIsIl9fbnNTZXBhcmF0b3JfXyIsIlN5bWJvbCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJ0aGlzIiwidHlwZSIsInByb3RvdHlwZS50eXBlIiwicHJvdG90eXBlLnRvU3RyaW5nIiwicHJlZml4w7gxIiwibnPDuDEiLCJzeW1ib2wiLCJucyIsImlzU3ltYm9sIiwiaXNLZXl3b3JkIiwieCIsImtleXdvcmQiLCJrZXl3b3JkTmFtZSIsInN5bWJvbE5hbWUiLCJrZXl3b3JkTmFtZXNwYWNlIiwicGFydHPDuDEiLCJzeW1ib2xOYW1lc3BhY2UiLCJnZW5zeW0iLCJwcmVmaXgiLCJiYXNlIiwiaXNVbnF1b3RlIiwiZm9ybSIsImlzVW5xdW90ZVNwbGljaW5nIiwiaXNRdW90ZSIsImlzU3ludGF4UXVvdGUiLCJub3JtYWxpemUiLCJuIiwibGVuIiwicXVvdGVTdHJpbmciLCJzIiwicHJTdHIiLCJvZmZzZXQiLCJvZmZzZXTDuDIiLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCIkMSIs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QUFBQSxhQURQLEVBT0tsQyxDQVBMLENBRE4sQ0FETCxHQVVLLEcsR0FDcEJ6QyxhQUFELENBQWV5QyxDQUFmLEMsUUFBdUIsSSxHQUFNbkMsSUFBRCxDQUFNLEdBQU4sRUFBV0osR0FBRCxDQUFLLFVBQVNxRSxFQUFULEU7dUJBQUVWLEssQ0FBT1UsRSxFQUFHdEQsR0FBRCxDQUFLOEMsUUFBTCxDO2FBQWhCLEVBQStCNUQsR0FBRCxDQUFLc0MsQ0FBTCxDQUE5QixDQUFWLENBQVYsR0FBNEQsRyxHQUM3RTdDLFlBQUQsQ0FBYTZDLENBQWIsQyxRQUFxQixHLEdBQUtuQyxJQUFELENBQU0sR0FBTixFQUFXSixHQUFELENBQUssVUFBU3FFLEVBQVQsRTt1QkFBRVYsSyxDQUFPVSxFLEVBQUd0RCxHQUFELENBQUs4QyxRQUFMLEM7YUFBaEIsRUFDTTVELEdBQUQsQ0FBS3NDLENBQUwsQ0FETCxDQUFWLENBQVQsR0FDa0MsRyxHQUNqRDNCLFdBQUQsQ0FBYTJCLENBQWIsQyxRQUFxQixJLEdBQU9uQyxJQUFELENBQU0sS0FBTixFQUFhRCxLQUFELENBQWlCb0MsQ0FBVixDQUFHbUMsTUFBVixFQUFvQixHQUFwQixDQUFaLENBQVgsR0FBaUQsRyxjQUMzRCxHQUFLbkMsQyxTQXBDakIsQ0FESTtBQUFBLFMsS0FBTixDLElBQUE7QUFBQSxLQUZGIiwic291cmNlc0NvbnRlbnQiOlsiKG5zIHdpc3AuYXN0XG4gICg6cmVxdWlyZSBbd2lzcC5zZXF1ZW5jZSA6cmVmZXIgW2xpc3Q/IHNlcXVlbnRpYWw/IGZpcnN0IHNlY29uZCBjb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eS1zZXQ/IGxhc3QgbWFwIHZlYyByZXBlYXRdXVxuICAgICAgICAgICAgW3dpc3Auc3RyaW5nIDpyZWZlciBbc3BsaXQgam9pbl1dXG4gICAgICAgICAgICBbd2lzcC5ydW50aW1lIDpyZWZlciBbbmlsPyB2ZWN0b3I/IG51bWJlcj8gc3RyaW5nPyBib29sZWFuP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdD8gZGF0ZT8gcmUtcGF0dGVybj8gZGljdGlvbmFyeT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgaW5jIHN1YnMgPV1dKSlcblxuKGRlZm4gd2l0aC1tZXRhXG4gIFwiUmV0dXJucyBpZGVudGljYWwgdmFsdWUgd2l0aCBnaXZlbiBtZXRhZGF0YSBhc3NvY2lhdGVkIHRvIGl0LlwiXG4gIFt2YWx1ZSBtZXRhZGF0YV1cbiAgKC5kZWZpbmVQcm9wZXJ0eSBPYmplY3QgdmFsdWUgXCJtZXRhZGF0YVwiIHs6dmFsdWUgbWV0YWRhdGEgOmNvbmZpZ3VyYWJsZSB0cnVlfSlcbiAgdmFsdWUpXG5cbihkZWZuIG1ldGFcbiAgXCJSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiB0aGUgZ2l2ZW4gdmFsdWUgb3IgbmlsIGlmIHRoZXJlIGlzIG5vIG1ldGFkYXRhLlwiXG4gIFt2YWx1ZV1cbiAgKGlmIChuaWw/IHZhbHVlKSBuaWwgKC4tbWV0YWRhdGEgdmFsdWUpKSlcblxuKGRlZiAqKm5zLXNlcGFyYXRvcioqIFwiXFx1MjA0NFwiKVxuXG4oZGVmbi0gU3ltYm9sXG4gIFwiVHlwZSBmb3IgdGhlIHN5bWJvbHNcIlxuICBbbmFtZXNwYWNlIG5hbWVdXG4gIChzZXQhICguLW5hbWVzcGFjZSB0aGlzKSBuYW1lc3BhY2UpXG4gIChzZXQhICguLW5hbWUgdGhpcykgbmFtZSlcbiAgdGhpcylcbihzZXQhIFN5bWJvbC50eXBlIFwid2lzcC5zeW1ib2xcIilcbihzZXQhIFN5bWJvbC5wcm90b3R5cGUudHlwZSBTeW1ib2wudHlwZSlcbihzZXQhIFN5bWJvbC5wcm90b3R5cGUudG8tc3RyaW5nXG4gICAgICAoZm4gW11cbiAgICAgICAgKGxldCBbcHJlZml4IChzdHIgXCJcXHVGRUZGXCIgXCInXCIpXG4gICAgICAgICAgICAgIG5zIChuYW1lc3BhY2UgdGhpcyldXG4gICAgICAgICAgKGlmIG5zXG4gICAgICAgICAgICAoc3RyIHByZWZpeCBucyBcIi9cIiAobmFtZSB0aGlzKSlcbiAgICAgICAgICAgIChzdHIgcHJlZml4IChuYW1lIHRoaXMpKSkpKSlcblxuKGRlZm4gc3ltYm9sXG4gIFwiUmV0dXJucyBhIFN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UgYW5kIG5hbWUuXCJcbiAgW25zIGlkXVxuICAoY29uZFxuICAgKHN5bWJvbD8gbnMpIG5zXG4gICAoa2V5d29yZD8gbnMpIChTeW1ib2wuIChuYW1lc3BhY2UgbnMpIChuYW1lIG5zKSlcbiAgIChuaWw/IGlkKSAoU3ltYm9sLiBuaWwgbnMpXG4gICA6ZWxzZSAoU3ltYm9sLiBucyBpZCkpKVxuXG4oZGVmbiBeYm9vbGVhbiBzeW1ib2w/IFt4XVxuICAob3IgKGFuZCAoc3RyaW5nPyB4KVxuICAgICAgICAgICAoaWRlbnRpY2FsPyBcIlxcdUZFRkZcIiAoYWdldCB4IDApKVxuICAgICAgICAgICAoaWRlbnRpY2FsPyBcIidcIiAoYWdldCB4IDEpKSlcbiAgICAgIChhbmQgeFxuICAgICAgICAgICAoaWRlbnRpY2FsPyBTeW1ib2wudHlwZSB4LnR5cGUpKSkpXG5cbihkZWZuIF5ib29sZWFuIGtleXdvcmQ/IFt4XVxuICAoYW5kIChzdHJpbmc/IHgpXG4gICAgICAgKD4gKGNvdW50IHgpIDEpXG4gICAgICAgKGlkZW50aWNhbD8gKGZpcnN0IHgpIFwiXFx1QTc4OVwiKSkpXG5cbihkZWZuIGtleXdvcmRcbiAgXCJSZXR1cm5zIGEgS2V5d29yZCB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UgYW5kIG5hbWUuIERvIG5vdCB1c2UgOlxuICBpbiB0aGUga2V5d29yZCBzdHJpbmdzLCBpdCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXCJcbiAgW25zIGlkXVxuICAoY29uZCAoa2V5d29yZD8gbnMpIG5zXG4gICAgICAgIChzeW1ib2w/IG5zKSAoc3RyIFwiXFx1QTc4OVwiIChuYW1lIG5zKSlcbiAgICAgICAgKG5pbD8gaWQpIChzdHIgXCJcXHVBNzg5XCIgbnMpXG4gICAgICAgIChuaWw/IG5zKSAoc3RyIFwiXFx1QTc4OVwiIGlkKVxuICAgICAgICA6ZWxzZSAoc3RyIFwiXFx1QTc4OVwiIG5zICoqbnMtc2VwYXJhdG9yKiogaWQpKSlcblxuKGRlZm4tIGtleXdvcmQtbmFtZVxuICBbdmFsdWVdXG4gIChsYXN0IChzcGxpdCAoc3VicyB2YWx1ZSAxKSAqKm5zLXNlcGFyYXRvcioqKSkpXG5cbihkZWZuLSBzeW1ib2wtbmFtZVxuICBbdmFsdWVdXG4gIChvciAoLi1uYW1lIHZhbHVlKVxuICAgICAgKGxhc3QgKHNwbGl0IChzdWJzIHZhbHVlIDIpICoqbnMtc2VwYXJhdG9yKiopKSkpXG5cbihkZWZuIG5hbWVcbiAgXCJSZXR1cm5zIHRoZSBuYW1lIFN0cmluZyBvZiBhIHN0cmluZywgc3ltYm9sIG9yIGtleXdvcmQuXCJcbiAgW3ZhbHVlXVxuICAoY29uZCAoc3ltYm9sPyB2YWx1ZSkgKHN5bWJvbC1uYW1lIHZhbHVlKVxuICAgICAgICAoa2V5d29yZD8gdmFsdWUpIChrZXl3b3JkLW5hbWUgdmFsdWUpXG4gICAgICAgIChzdHJpbmc/IHZhbHVlKSB2YWx1ZVxuICAgICAgICA6ZWxzZSAodGhyb3cgKFR5cGVFcnJvci4gKHN0ciBcIkRvZXNuJ3Qgc3VwcG9ydCBuYW1lOiBcIiB2YWx1ZSkpKSkpXG5cbihkZWZuLSBrZXl3b3JkLW5hbWVzcGFjZVxuICBbeF1cbiAgKGxldCBbcGFydHMgKHNwbGl0IChzdWJzIHggMSkgKipucy1zZXBhcmF0b3IqKildXG4gICAgKGlmICg+IChjb3VudCBwYXJ0cykgMSkgKGFnZXQgcGFydHMgMCkpKSlcblxuKGRlZm4tIHN5bWJvbC1uYW1lc3BhY2VcbiAgW3hdXG4gIChsZXQgW3BhcnRzIChpZiAoc3RyaW5nPyB4KVxuICAgICAgICAgICAgICAgIChzcGxpdCAoc3VicyB4IDEpICoqbnMtc2VwYXJhdG9yKiopXG4gICAgICAgICAgICAgICAgWyguLW5hbWVzcGFjZSB4KSAoLi1uYW1lIHgpXSldXG4gICAgKGlmICg+IChjb3VudCBwYXJ0cykgMSkgKGFnZXQgcGFydHMgMCkpKSlcblxuKGRlZm4gbmFtZXNwYWNlXG4gIFwiUmV0dXJucyB0aGUgbmFtZXNwYWNlIFN0cmluZyBvZiBhIHN5bWJvbCBvciBrZXl3b3JkLCBvciBuaWwgaWYgbm90IHByZXNlbnQuXCJcbiAgW3hdXG4gIChjb25kIChzeW1ib2w/IHgpIChzeW1ib2wtbmFtZXNwYWNlIHgpXG4gICAgICAgIChrZXl3b3JkPyB4KSAoa2V5d29yZC1uYW1lc3BhY2UgeClcbiAgICAgICAgOmVsc2UgKHRocm93IChUeXBlRXJyb3IuIChzdHIgXCJEb2Vzbid0IHN1cHBvcnRzIG5hbWVzcGFjZTogXCIgeCkpKSkpXG5cbihkZWZuIGdlbnN5bVxuICBcIlJldHVybnMgYSBuZXcgc3ltYm9sIHdpdGggYSB1bmlxdWUgbmFtZS4gSWYgYSBwcmVmaXggc3RyaW5nIGlzXG4gIHN1cHBsaWVkLCB0aGUgbmFtZSBpcyBwcmVmaXgjIHdoZXJlICMgaXMgc29tZSB1bmlxdWUgbnVtYmVyLiBJZlxuICBwcmVmaXggaXMgbm90IHN1cHBsaWVkLCB0aGUgcHJlZml4IGlzICdHX18nLlwiXG4gIFtwcmVmaXhdXG4gIChzeW1ib2wgKHN0ciAoaWYgKG5pbD8gcHJlZml4KSBcIkdfX1wiIHByZWZpeClcbiAgICAgICAgICAgICAgIChzZXQhIGdlbnN5bS5iYXNlICgrIGdlbnN5bS5iYXNlIDEpKSkpKVxuKHNldCEgZ2Vuc3ltLmJhc2UgMClcblxuXG4oZGVmbiBeYm9vbGVhbiB1bnF1b3RlP1xuICBcIlJldHVybnMgdHJ1ZSBpZiBpdCdzIHVucXVvdGUgZm9ybTogfmZvb1wiXG4gIFtmb3JtXVxuICAoYW5kIChsaXN0PyBmb3JtKSAoPSAoZmlyc3QgZm9ybSkgJ3VucXVvdGUpKSlcblxuKGRlZm4gXmJvb2xlYW4gdW5xdW90ZS1zcGxpY2luZz9cbiAgXCJSZXR1cm5zIHRydWUgaWYgaXQncyB1bnF1b3RlLXNwbGljaW5nIGZvcm06IH5AZm9vXCJcbiAgW2Zvcm1dXG4gIChhbmQgKGxpc3Q/IGZvcm0pICg9IChmaXJzdCBmb3JtKSAndW5xdW90ZS1zcGxpY2luZykpKVxuXG4oZGVmbiBeYm9vbGVhbiBxdW90ZT9cbiAgXCJSZXR1cm5zIHRydWUgaWYgaXQncyBxdW90ZSBmb3JtOiAnZm9vICcoZm9vKVwiXG4gIFtmb3JtXVxuICAoYW5kIChsaXN0PyBmb3JtKSAoPSAoZmlyc3QgZm9ybSkgJ3F1b3RlKSkpXG5cbihkZWZuIF5ib29sZWFuIHN5bnRheC1xdW90ZT9cbiAgXCJSZXR1cm5zIHRydWUgaWYgaXQncyBzeW50YXggcXVvdGUgZm9ybTogYGZvbyBgKGZvbylcIlxuICBbZm9ybV1cbiAgKGFuZCAobGlzdD8gZm9ybSkgKD0gKGZpcnN0IGZvcm0pICdzeW50YXgtcXVvdGUpKSlcblxuKGRlZm4tIG5vcm1hbGl6ZSBbbiBsZW5dXG4gIChsb29wIFtucyAoc3RyIG4pXVxuICAgIChpZiAoPCAoY291bnQgbnMpIGxlbilcbiAgICAgIChyZWN1ciAoc3RyIFwiMFwiIG5zKSlcbiAgICAgIG5zKSkpXG5cbihkZWZuIHF1b3RlLXN0cmluZ1xuICBbc11cbiAgKHNldCEgcyAoam9pbiBcIlxcXFxcXFwiXCIgKHNwbGl0IHMgXCJcXFwiXCIpKSlcbiAgKHNldCEgcyAoam9pbiBcIlxcXFxcXFxcXCIgKHNwbGl0IHMgXCJcXFxcXCIpKSlcbiAgKHNldCEgcyAoam9pbiBcIlxcXFxiXCIgKHNwbGl0IHMgXCJcXGJcIikpKVxuICAoc2V0ISBzIChqb2luIFwiXFxcXGZcIiAoc3BsaXQgcyBcIlxcZlwiKSkpXG4gIChzZXQhIHMgKGpvaW4gXCJcXFxcblwiIChzcGxpdCBzIFwiXFxuXCIpKSlcbiAgKHNldCEgcyAoam9pbiBcIlxcXFxyXCIgKHNwbGl0IHMgXCJcXHJcIikpKVxuICAoc2V0ISBzIChqb2luIFwiXFxcXHRcIiAoc3BsaXQgcyBcIlxcdFwiKSkpXG4gIChzdHIgXCJcXFwiXCIgcyBcIlxcXCJcIikpXG5cbihkZWZuIF5zdHJpbmcgcHItc3RyXG4gIFt4IG9mZnNldF1cbiAgKGxldCBbb2Zmc2V0IChvciBvZmZzZXQgMCldXG4gICAgKGNvbmQgKG5pbD8geCkgXCJuaWxcIlxuICAgICAgICAgIChrZXl3b3JkPyB4KSAoaWYgKG5hbWVzcGFjZSB4KVxuICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgXCI6XCIgKG5hbWVzcGFjZSB4KSBcIi9cIiAobmFtZSB4KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyIFwiOlwiIChuYW1lIHgpKSlcbiAgICAgICAgICAoc3ltYm9sPyB4KSAoaWYgKG5hbWVzcGFjZSB4KVxuICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAobmFtZXNwYWNlIHgpIFwiL1wiIChuYW1lIHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgeCkpXG4gICAgICAgICAgKHN0cmluZz8geCkgKHF1b3RlLXN0cmluZyB4KVxuICAgICAgICAgIChkYXRlPyB4KSAoc3RyIFwiI2luc3QgXFxcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRVVENGdWxsWWVhciB4KSBcIi1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChub3JtYWxpemUgKGluYyAoLmdldFVUQ01vbnRoIHgpKSAyKSBcIi1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChub3JtYWxpemUgKC5nZXRVVENEYXRlIHgpIDIpIFwiVFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG5vcm1hbGl6ZSAoLmdldFVUQ0hvdXJzIHgpIDIpIFwiOlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG5vcm1hbGl6ZSAoLmdldFVUQ01pbnV0ZXMgeCkgMikgXCI6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAobm9ybWFsaXplICguZ2V0VVRDU2Vjb25kcyB4KSAyKSBcIi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChub3JtYWxpemUgKC5nZXRVVENNaWxsaXNlY29uZHMgeCkgMykgXCItXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBcIjAwOjAwXFxcIlwiKVxuICAgICAgICAgICh2ZWN0b3I/IHgpIChzdHIgXCJbXCIgKGpvaW4gKHN0ciBcIlxcbiBcIiAoam9pbiAocmVwZWF0IChpbmMgb2Zmc2V0KSBcIiBcIikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgIyhwci1zdHIgJSAoaW5jIG9mZnNldCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjIHgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXVwiKVxuICAgICAgICAgIChkaWN0aW9uYXJ5PyB4KSAoc3RyIFwie1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4gKHN0ciBcIixcXG5cIiAoam9pbiAocmVwZWF0IChpbmMgb2Zmc2V0KSBcIiBcIikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgKGZuIFtwYWlyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtpbmRlbnQgKGpvaW4gKHJlcGVhdCBvZmZzZXQgXCIgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgKHByLXN0ciAoZmlyc3QgcGFpcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluYyBvZmZzZXQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAocHItc3RyIChzZWNvbmQgcGFpcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyAyIG9mZnNldCAoY291bnQga2V5KSkpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIga2V5IFwiIFwiIHZhbHVlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIn1cIilcbiAgICAgICAgICAoaWRlbnRpdHktc2V0PyB4KSAoc3RyIFwiI3tcIiAoam9pbiBcIiBcIiAobWFwICMocHItc3RyICUgKGluYyBvZmZzZXQpKSAodmVjIHgpKSkgXCJ9XCIpXG4gICAgICAgICAgKHNlcXVlbnRpYWw/IHgpIChzdHIgXCIoXCIgKGpvaW4gXCIgXCIgKG1hcCAjKHByLXN0ciAlIChpbmMgb2Zmc2V0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlYyB4KSkpIFwiKVwiKVxuICAgICAgICAgIChyZS1wYXR0ZXJuPyB4KSAoc3RyIFwiI1xcXCJcIiAoam9pbiBcIlxcXFwvXCIgKHNwbGl0ICguLXNvdXJjZSB4KSBcIi9cIikpIFwiXFxcIlwiKVxuICAgICAgICAgIDplbHNlIChzdHIgeCkpKSlcbiJdfQ==